xdotool: Was sind "Klasse" und "Klassenname" für ein Fenster?

11

In Anbetracht von https://unix.stackexchange.com/a/254854/674 und /unix/458895/how-can-i-bring-a-background-gui-job-to -die-Vorderseite-meines-Desktops , es gibt ein Beispiel aus der Manpage von 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

Die Manpage sagt

--class Match gegen die Fensterklasse.

--classname Entspricht dem Fensterklassennamen.

Was sind "Klasse" und "Klassenname"?

Welche möglichen Werte haben sie?

Wie kann ich die Klasse und den Klassennamen eines Fensters herausfinden?

Vielen Dank.

Tim
quelle

Antworten:

10

Unter X11 verfügen Fenster über XWindowdAttributes-Struktur- und XClassHint-Struktureigenschaften, von denen Anwendungen Informationen zu Fenstern abrufen . Insbesondere ist der letzte für die WM_CLASSEigenschaft verantwortlich, zwei durch Kommas getrennte Zeichenfolgen, die über einen xpropBefehl leicht angezeigt werden können. Zum Beispiel hat Chrome

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

Diese beiden sind dokumentiert als:

  • Eine Zeichenfolge, die die bestimmte Instanz der Anwendung benennt, zu der der Client gehört, dem dieses Fenster gehört. ...
  • Eine Zeichenfolge, die die allgemeine Klasse von Anwendungen benennt, zu denen der Client gehört, dem dieses Fenster gehört. Von der Klasse angegebene Ressourcen gelten für alle Anwendungen mit demselben Klassennamen ....

So hat beispielsweise die Hangouts-Erweiterung für Chrome denselben Klassennamen, aber einen anderen Instanznamen:

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

Dies ermöglicht Tools wie das xdotoolDurchsuchen aller Fenster eines bestimmten Anwendungstyps oder einer bestimmten Fensterinstanz. Dies kann beispielsweise auch eine nützliche Eigenschaft für Docks sein, die Fenster unter demselben Symbol einer Anwendung gruppieren.

Insbesondere xdotool, classnamekorrespondiert mit der ersten Zeichenfolge und classentspricht die zweite Saite. In meinem Beispiel mit Chrome- und Hangouts-Apps:

$ xdotool search -classname crx_nckgahadagoaajjgafhacjanaoiihapd
96469129

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

Dies kann auch aus dem Quellcode ersichtlich werden. Konzentrieren wir uns zum Beispiel auf den Klassennamen. In cmd_search.c haben wir eine Suchstruktur aufgebaut, die eine Suchmaskeneigenschaft hat (Zeilen 171 bis 173).

Dies wird an xdo_search_windowsdie in xdo_search.c definierte Funktion übergeben , die wiederum aufruft check_window_match, die wiederum an _xdo_match_window_classname geht , wodurch schließlich beide am Anfang dieser Antwort erwähnten Strukturen mit den Standard- Xlib- Funktionen XGetWindowAttributes und XGetClassHint abgerufen werden .


Randnotiz: Gtk-Apps erstellen anscheinend immer ein kleines übergeordnetes Fenster mit einem untergeordneten Fenster , was bedeutet, dass Sie bei der Suche nach einem bestimmten Fenster verwirrende Ergebnisse erhalten können.

Sergiy Kolodyazhnyy
quelle
Vielen Dank. Werden "Klassenname" und " xpropInstanzname " angegeben, indem sie "Klasse", "Klassenname" oder "Name" entsprechen xdotool search?
Tim
@ Tim Ja, das sind sie. Ich habe meine Antwort leicht aktualisiert. Siehe das Update.
Sergiy Kolodyazhnyy
@Michael Es kann sein, dass Ubuntu Wayland anstelle von X11 in neueren Versionen verwendet. Im Idealfall sollte es warten, bis Sie mit der Maus ein Fenster ausgewählt haben - dann wird die Ausgabe angezeigt. Wenn Sie das tun, aber es gibt immer noch keine Ausgabe - wahrscheinlich, weil Ihr System Wayland verwendet
Sergiy Kolodyazhnyy
5

A classwäre das, urxvtwas tatsächlich beides enthält urxvtund rxvtwelches das Unicode-RXVT-Terminal ist. Das classnamezerlegt diese in die tatsächlichen Namen. Ich werde unten ein Beispiel zeigen.

Ich habe 4 rxvt Terminalfenster geöffnet.

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

Als ich dann ein urxvtTerminal startete, bekam ich Folgendes.

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

Mit der xpropAnwendung können wir auf die Fenster klicken und es wird uns das mitteilen WM_CLASS(STRING). Der erste ist der classnameund der zweite ist der class.

Beispiel:

Ausführen des Befehls und Klicken auf ein RXVT-Terminalfenster:

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

Gleicher Befehl durch Klicken auf ein URXVT-Fenster:

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

Gleicher Befehl erneut durch Klicken auf einen Google Chrome-Browser:

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

Klicken Sie auf ein xfce4-terminalFenster:

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

Klicken Sie auf ein gnome-terminalFenster:

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

Klicken Sie auf ein Firefox-Fenster (das anders ist):

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

Ich hoffe, dies hilft dabei, die Unterschiede zu beleuchten.

Terrance
quelle
Vielen Dank. Ich würde gerne eine allgemeine Definition der Konzepte "Klasse" und "Klassenname" sehen. Ich kann Ihr Beispiel nicht auf andere Beispiele verallgemeinern.
Tim
@Tim Die Antwort wurde aktualisiert, um zu zeigen, wie der Klassenname und die Klasse eines Fensters abgerufen werden. Nicht zu viel Unterschied zwischen den beiden, aber es sollte zumindest einige Unterschiede zeigen.
Terrance