Виявлення поточного активного вікна


52

Інструмент командного рядка linux wmctrlдозволяє перелічити всі вікна або всі настільні комп'ютери, серед іншого. У режимі лістингу робочого столу поточний робочий стіл позначено зірочкою.

Мені потрібен інструмент, який зможе з’ясувати назву активного вікна в даний час. На жаль, у wmctrlнього немає помічника, який би це зробив - незважаючи на те, що він знає, яке вікно зараз активне (див. :ACTIVE:Маркер).

Чи є інший інструмент командного рядка, який може дати мені ідентифікатор вікна та / або назву вікна поточного вікна?

Відповіді:


56

Встановіть xdotool, а потім запустіть

xdotool getwindowfocus getwindowname

Він подасть, наприклад, для поточної веб-сторінки, відкритої у Firefox:

linux - Detecting currently active window - Super User - Mozilla Firefox

Потужний інструмент! Окрім отримання поточного активного вікна, він також має багато інших корисних функцій.
Searene

У порівнянні з відповіддю Джима Париса, цей недолік має залежність від встановлення, але, здається, працює швидше, особливо якщо xdotool вже є в кеш-диску.
mc0e

1
Якщо ви хочете маніпулювати поточним вікном wmctrl, ви можете зробити:, wmctrl -i -r `xdotool getwindowfocus` -e 0,10,10,-1,-1де -iвказує wmctrl очікувати ідентифікатора вікна, а не заголовка вікна.
fiedl

34

Це більш прямий і використовує тільки xpropі cut:

xprop -id $(xprop -root 32x '\t$0' _NET_ACTIVE_WINDOW | cut -f 2) _NET_WM_NAME

Ці команди - це лише вилучення властивостей з кореневого вікна та вікна програми, але за запитом Лоренцо фон Маттерхорна:

  • Спочатку,

    xprop -root 32x '\t$0' _NET_ACTIVE_WINDOW
    

    Витягує _NET_ACTIVE_WINDOWвластивість з кореня, що дає вам XID активного вікна. 32x '\t$0'Каже xpropформат виведення таким чином , що cutможна легко розібрати пізніше.

  • Потім витягніть лише XID з виводу за допомогою cut -f 2

  • Потім передайте XID в якості параметра

    xprop -id XID _NET_WM_NAME
    

Яке друкує назву цього вікна.


1
привіт, чи можете ви поясніть аргументи та трохи синтаксису? це може бути корисним для QA та майбутніх читачів.
Лоренцо Фон Маттерхорн

9

Є, але короткої відповіді чи рішення немає.

$ wmctrl -lp | grep $(xprop -root | grep _NET_ACTIVE_WINDOW | head -1 | \
    awk '{print $5}' | sed 's/,//' | sed 's/^0x/0x0/')

результат:

0x03800004  0 16459  xxxxxxxxxx /bin/bash

В вживанні:

$ for x in $(seq 1 10); do sleep 5; wmctrl -lp | grep $(xprop -root | \
    grep _NET_ACTIVE_WINDOW | head -1 | awk '{print $5}' | sed 's/,//' | \
    sed 's/^0x/0x0/'); done

0x03800004  0 16459  xxxxxxxxxx /bin/bash
0x020000a4  0 13524  xxxxxxxxxx linux - Detecting currently active window - Super User - Mozilla Firefox (Build 20120129142219)

1
Це виглядає як хороше рішення, не знали про утиліту xprop. Тим часом я проклеював wmctrl, щоб надати такий варіант, і надіслав його автору. На жаль, я ще не отримав відповіді.
Дейв Фогт

1
+1 за ефективність та "простоту" в коді
Лоренцо Фон Маттерхорн

5

Це те, що працювало для мене:

xprop -id $(xprop -root _NET_ACTIVE_WINDOW | cut -d ' ' -f 5) WM_NAME

Дає:

WM_NAME(STRING) = "~"

Тож, можливо, ти зробиш трохи неподобства, щоб самому назву назвати:

xprop -id $(xprop -root _NET_ACTIVE_WINDOW | cut -d ' ' -f 5) WM_NAME | sed -e 's/.*"\(.*\)".*/\1/'

Дає:

~

Яке моє ім’я зараз зосереджено, але саме по собі.

Або уникайте sed з трохи менш потворними:

xprop -id $(xprop -root _NET_ACTIVE_WINDOW | cut -d ' ' -f 5) WM_NAME | awk -F '"' '{print $2}'


1
Або оскільки скорота вже була введена, ви можете використати це ще раз:xprop -id $(xprop -root _NET_ACTIVE_WINDOW | cut -d ' ' -f 5) WM_NAME | cut -d '"' -f 2
mc0e

3

Відносно короткий і правильно обробляє назви вікон, що містять лапки:

xprop -id $(xprop -root _NET_ACTIVE_WINDOW | cut -d ' ' -f 5) WM_NAME | 
sed -nr 's/.*= "(.*)"$/\1/p'
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.