Обнаружение текущего активного окна

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 ожидать идентификатор окна, а не заголовок окна.
Фидль
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
Или, поскольку cut был введен недавно, вы можете использовать это снова: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'
Тон ван ден Хеувел
источник