47

Средство командной строки linux wmctrl позволяет перечислять все окна или все рабочие столы, среди прочего. В режиме списка рабочих столов текущий рабочий стол отмечен звездочкой.

Мне нужен инструмент, который может выяснить заголовок текущего активного окна. К сожалению, wmctrl не имеет помощника, который делает это - несмотря на то, что он знает, какое окно активно в данный момент (см . :ACTIVE: marker).

Есть ли другой инструмент командной строки, который может дать мне идентификатор окна и / или заголовок окна текущего окна?

5 ответов5

52

Установите xdotool , затем запустите

xdotool getwindowfocus getwindowname

Это даст, например, для текущей веб-страницы, открытой в Firefox:

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

Это более прямое и использует только 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
    

Который печатает название этого окна.

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)
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}'

3

Относительно короткие, и правильно обрабатывает имена окон, содержащие кавычки:

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .