Узнайте приложение под мышкой

11

Со мной часто случается, что приложение вызывает вопрос, и мне интересно, к какому именно приложению относится это окно, потому что, если я смотрю в Launcher, нет приложения, которое в данный момент имеет фокус (нет белого треугольника с правой стороны значка когда я фокусирую окно сообщения)

Есть ли способ узнать принадлежность открытого окна?

rubo77
источник

Ответы:

11

Использование xdotool

Сначала убедитесь, что xdotoolв вашей системе есть:

sudo apt-get install xdotool

Следующая команда выведет имя процесса окна, которое в данный момент находится в фокусе:

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

Чтобы дать себе больше времени, чтобы сфокусировать окно / щелкнуть по нему, вы можете добавить небольшую продолжительность сна:

sleep 5 && cat "/proc/$(xdotool getwindowpid "$(xdotool getwindowfocus)")/comm"

Имя процесса должно отображаться через короткое время.


Использование wininfo

Wininfo - графическая утилита, которая отображает различную информацию об окнах и их свойствах, включая PID (идентификатор процесса), связанный с окном:

изображение PID в wininfo

wininfo должны быть доступны в официальных репозиториях:

sudo apt-get install wininfo

Определив PID окна, вы можете найти имя процесса, связанного с ним. Есть несколько способов сделать это, например, посмотрев на /proc:

$ cat /proc/17002/comm
gnome-terminal

Это будет имя процесса, связанного с PID 17002.

Более элегантный способ, который позволяет проверять контекст дерева процессов, как предлагает @Rmano :

$ pstree -a -s -l -p -u 17002
init,1
  └─lightdm,1900
      └─lightdm,3202 --session-child 12 19
          └─lxsession,3307,glutanimate -s LXDE -e LXDE
              └─openbox,3362 --config-file /home/glutanimate/.config/openbox/lxde-rc.xml
                  └─gnome-terminal,17002
                      ├─bash,1841
                      ├─bash,2332
                      ├─bash,2424
                      │   └─pstree,2484 -a -s -l -p -u 17002
                      ├─gnome-pty-helpe,1840
                      ├─{gnome-terminal},1835
                      ├─{gnome-terminal},1836
                      ├─{gnome-terminal},1842
                      └─{gnome-terminal},2269

Конечно, вы также можете комбинировать pstreeс xdotoolопцией выше (спасибо @ rubo77 за указание на это!):

sleep 2; pstree -spaul $(xdotool getwindowpid "$(xdotool getwindowfocus)")

Источники:

/unix//q/38867/29245

http://www.linuxquestions.org/questions/debian-26/how-to-find-the-process-associated-with-a-top-level-x-window-907125/

/superuser//q/632979/170160

Glutanimate
источник
1
+1 за хороший ответ. Если PID является дочерним по отношению к основному приложению, вы можете предложить использовать его, pstree -a -s -l -p -u $PIDчто очень приятно ...
Rmano
@Rmano: О, это здорово! Я добавил это к ответу.
Glutanimate
В echo $()ваших командах нет необходимости.
Приостановлено до дальнейшего уведомления.
@DennisWilliamson Спасибо за указатель. Ред.
Glutanimate
1
xdotool getwindowpid "$(xdotool getwindowfocus)"xdotool getwindowfocus getwindowpid
Veedrac
2

Вы можете создать сочетание клавиш с помощью этой команды:

zenity --info --text $(xprop $win_id WM_CLASS | cut -d" " -f4-)
TuKsn
источник
1
Это очень хорошее решение, +1. Однако есть одна небольшая проблема: если приложение не назначает правильный WMCLASS (что часто бывает с загадочными диалогами), xprop не поможет.
Glutanimate
У вас есть пример приложения (всплывающего окна), которое не работает, спасибо.
TuKsn
1
У меня нет ничего конкретного под рукой, но я помню, что у меня были проблемы с несколькими Java-приложениями и другими непонятными программами, у которых не было установлено WMCLASS (или установлено что-то общее java-window). Я столкнулся с такого рода проблемами некоторое время назад, когда пытался реализовать правила для конкретного приложения в конфигурации моего оконного менеджера.
Glutanimate
1
Вы правы есть аналогичная проблема с приложениями , созданными с QML / кварты -> bugreports.qt-project.org/browse/QTBUG-29396
TuKsn
Как создать комбинацию клавиш для этого? Я пытался, как показано ниже, но zenity не появляется
rubo77
2

Вы можете использовать xpropдля получения идентификатора процесса щелкнувшего окна:

xprop $win_id _NET_WM_PID

затем проанализируйте это с помощью pstree:

pstree -spaul $(xprop $win_id _NET_WM_PID | cut -d" " -f3-)

Это вы можете перенаправить в окно текстовой информации с

pstree -spaul $(xprop $win_id _NET_WM_PID | cut -d" " -f3-)|zenity --text-info --title "pstree of clicked Window"

Я пытался создать сочетание клавиш для этой последней команды (если вам это нужно регулярно), но по какой-то причине это не работает.

rubo77
источник
0

С установленными xdtool и yad вы можете получить хорошее приложение с графическим интерфейсом.

#!/bin/bash
while true; do cat "/proc/$(xdotool getwindowpid "$(xdotool 
getwindowfocus)")/comm"; sleep 1; echo -e '\f'; done | yad --no- 
buttons --no-focus --geometry 250x10 --fixed --text-info -- 
title="Active window" --listen
Питер Бауэр
источник