xdotool: что такое “класс” и “имя класса” для окна?

В свете https://unix.stackexchange.com/a/254854/674 и https://unix.stackexchange.com/questions/458895/how-can-i-bring-a-background-gui-job-to-the-front-of-my-desktop, существует пример из страницы справочника xdotool

# Activate google-chrome when you move the mouse to the bottom-left corner: 
xdotool behave_screen_edge bottom-left search --class google-chrome windowactivate

В странице справочника говорится

- класс Соответствие против класса окна.

- Соответствие имени класса против имени класса окна.

Что такое "класс" и "имя класса"?

Какие возможные значения они имеют?

Как я могу узнать класс и имя класса окна?

Спасибо.

8
задан 27 July 2018 в 15:44

2 ответа

Под X11 окна имеют структуру XWindowdAttributes и свойства структур XClassHint, от которых приложения получают информацию об окнах. Конкретно последний ответственен за WM_CLASS свойство, две разделенных от запятой строки, которые видны легко через xprop команда. Например, Chrome имеет

WM_CLASS(STRING) = "google-chrome", "Google-chrome"

Эти два документируются как:

  • Строка, которая называет конкретный экземпляр приложения, которому принадлежит клиент, который владеет этим окном...
  • Строка, которая называет общий класс приложений, которым принадлежит клиент, который владеет этим окном. Ресурсы, которые указаны классом, относятся ко всем приложениям, которые имеют то же имя класса....

Таким образом, например, расширение Диалогов для Chrome, имеет то же имя класса, но другое имя экземпляра:

$ xprop | grep 'CLASS'
WM_CLASS(STRING) = "crx_nckgahadagoaajjgafhacjanaoiihapd", "Google-chrome"

Это позволяет инструменты такой как xdotool ищите все окна конкретного типа приложения или определенный экземпляр окна. Например, это также может быть полезным свойством для чего-то, любят прикрепления что окна группы под тем же значком приложения.

В особенности для xdotool, classname соответствует первой строке, и class соответствует вторая строка. В моем примере с Chrome и приложениями Диалогов:

$ xdotool search -classname crx_nckgahadagoaajjgafhacjanaoiihapd
96469129

$ xdotool search -class Google-chrome
96469069
109051905
109051907
96468993
96469129
109051912
109051924

Это также может быть очевидно из рассмотрения исходного кода. Давайте сфокусируемся на имени класса, например. В cmd_search.c нам создали поисковую структуру, которая имеет поисковое свойство маски (строки 171 - 173).

Это передается xdo_search_windows функция, определяемая в xdo_search.c, который в свою очередь звонит check_window_match, это в свою очередь переходит к _xdo_match_window_classname, который наконец заканчивает тем, что получил обе структуры, упомянутые в начале этого ответа со стандартными функциями Xlib XGetWindowAttributes и XGetClassHint.


Примечание стороны: приложения Gtk, по-видимому, всегда создают маленькое родительское окно с дочерним окном, что означает, что можно получить запутывающие результаты при поиске определенного окна.

7
ответ дан 23 November 2019 в 05:33

A class было бы это как urxvt который на самом деле содержит обоих urxvt и rxvt который является unicode rxvt терминал. classname разбивает тех, которые на подлинные имена. Я покажу пример ниже.

У меня есть 4 rxvt открытые окна терминала.

terrance-Linux:~$ xdotool search -class rxvt
130023435
127926283
125829131
132120587

terrance-Linux:~$ xdotool search -class urxvt
130023435
127926283
125829131
132120587

terrance-Linux:~$ xdotool search -classname urxvt

terrance-Linux:~$ xdotool search -classname rxvt
130023435
127926283
125829131
132120587

Затем, когда я запустил a urxvt терминал это - то, что я получил.

terrance-Linux:~$ xdotool search -classname urxvt
140509193

Используя xprop приложение мы можем нажать на окна и это скажет нам WM_CLASS(STRING). Первое classname и второе class.

Пример:

Выполнение команды и нажатие на окно терминала RXVT:

terrance-Linux:~$ xprop | grep WM_CLASS
WM_CLASS(STRING) = "rxvt", "URxvt"

Та же команда, нажимающая на окно URXVT:

terrance-Linux:~$ xprop | grep WM_CLASS
WM_CLASS(STRING) = "urxvt", "URxvt"

Та же команда, снова нажимающая на браузер Google Chrome:

terrance-Linux:~$ xprop | grep WM_CLASS
WM_CLASS(STRING) = "google-chrome", "Google-chrome"

Нажатие a xfce4-terminal окно:

terrance-Linux:~$ xprop | grep WM_CLASS
WM_CLASS(STRING) = "xfce4-terminal", "Xfce4-terminal"

Нажатие a gnome-terminal окно:

terrance-Linux:~$ xprop | grep WM_CLASS
WM_CLASS(STRING) = "gnome-terminal-server", "Gnome-terminal"

Нажатие на окно Firefox (который отличается):

terrance-Linux:~$ xprop | grep WM_CLASS
WM_CLASS(STRING) = "Navigator", "Firefox"

Надежда это помогает распространить некоторый свет на различиях.

5
ответ дан 23 November 2019 в 05:33

Другие вопросы по тегам:

Похожие вопросы: