Можно ли получить активный процесс окна / заголовок в Gnome?

28

Мне нужно решение для получения информации о текущем активном (сфокусированном) окне на рабочем столе Gnome 2. В основном меня интересует процесс запуска этого окна и заголовка окна.

Является ли это возможным?

РЕШЕНИЕ:

Получение заголовка окна:

xwininfo -root -children | grep $(printf '%x\n' $(xdotool getwindowfocus)) | grep -oEi '"[^"]+"' | head -1

Получение названия процесса:

ps -e | grep $(xdotool getwindowpid $(xdotool getwindowfocus)) | grep -v grep | awk '{print $4}'

или:

cat /proc/$(xdotool getwindowpid $(xdotool getwindowfocus))/comm
Рогач
источник

Ответы:

17

Вы можете использовать xdotool , универсальный инструмент автоматизации X Window.

focused_window_id=$(xdotool getwindowfocus)
active_window_id=$(xdotool getactivewindow)
active_window_pid=$(xdotool getwindowpid "$active_window_id")

(Я не знаю, в чем разница между сосредоточенным и активным.)

(Я думал, что wmctrl может сделать это, но, видимо, нет.)

Жиль "ТАК - перестань быть злым"
источник
26

Это так просто, как это:

xdotool getactivewindow getwindowname

Удачи, надеюсь, это работает для вас!

Эрик
источник
Это работает, кто-нибудь может объяснить, почему это было понижено?
lfzawacki
8

Проще (IMO), чем решение OP (т.е. без ps, grepи awk), чтобы получить имя процесса:

cat /proc/$(xdotool getwindowpid $(xdotool getwindowfocus))/comm

Или, если вы хотите конец строки:

echo $(cat /proc/$(xdotool getwindowpid $(xdotool getwindowfocus))/comm)
Скиппи ле Гран Гуру
источник
Да, cat /proc/это хорошо (и, возможно, быстрее, так как это не включает в себя весь psвывод). Я добавил его к решению в теле вопроса, чтобы будущие пользователи могли его найти.
Рогач
4

Попробуйте команду xwininfo, http://www.xfree86.org/4.2.0/xwininfo.1.html , она определенно возвращает заголовок окна и, насколько процесс идет, хорошо ...

X назначил ему идентификатор и стал родительским PID окна, а также скрыл бы его по умолчанию, поэтому, предполагая, что Gnome поддерживает NET_WM_PID, как указывает этот патч 2001 года, http://mail.gnome.org/ архивы / gtk-devel-list / 2001-октябрь / msg00238.html , тогда мы можем просмотреть этот пост, http://www.mail-archive.com/devel@xfree86.org/msg05809.html , где автор пишет короткая программа на C для преобразования идентификатора окна в PID, вуаля.

rhoyerboat
источник
Но, похоже, xwininfoот меня требуется вручную выбрать нужное окно. Я надеялся на способ получить сфокусированное окно из bash.
Рогач
Примерно так: `xwininfo -root -children | grep -oEi 'Идентификатор окна: (? [0-9a-zA-Z] +) | grep -oEi '(? 0-9a-zA-Z)' - редактировать: мой палец поскользнулся, мое выражение для идентификатора окна было неверным. проверьте этот другой сайт для различных ссылок: davygoat.com/software/rizzle/How_it_works.html
rhoyerboat
Эта команда дает только идентификатор «корневого» окна, а не активный :(
Rogach
1

Я знаю, что вопрос старый, но я чувствую, что xpropследует упомянуть здесь. Он легко доступен под X. Он может быть использован в интерактивном режиме:

  1. введите xpropи выберите нужное окно, используя курсор мыши, затем
  2. WM_NAMEдает вам заголовок окна, _NET_WM_PIDдает пид

Или вы можете напрямую сказать, xpropкакое окно вам нужно, передав -idили -nameопцию. Используя его, awkвы можете получить идентификатор активного окна и передать его обратно xpropвот так (взято отсюда ):

xprop -id $(xprop -root -f _NET_ACTIVE_WINDOW 0x " \$0\\n" _NET_ACTIVE_WINDOW | awk "{print \$2}")

Наконец, используя Your Favorite Tool ™ (например, grepили sed), вы можете выделить нужные значения. Например, для pidвывода вышеприведенной команды может быть передано sed:sed -nE 's/^_NET_WM_PID.*= ([0-9]+)/\1/p'

JJJ
источник