web-dev-qa-db-fra.com

xdotool: que sont "classe" et "nom de classe" pour une fenêtre?

À la lumière de https://unix.stackexchange.com/a/254854/674 et https://unix.stackexchange.com/questions/458895/how-can-i- apportez-un-fond-gui-job-au-devant-de-mon-burea , il y a un exemple tiré de la page de manuel de 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

La page de manuel dit

--class Correspond à la classe de fenêtre.

--classname Apparie le nom de classe de la fenêtre.

Que sont "classe" et "nom de classe"?

Quelles valeurs possibles ont-ils?

Comment puis-je connaître la classe et le nom de classe d'une fenêtre?

Merci.

7
Tim

Sous X11, les fenêtres ont structure XWindowdAttributes et structures XClassHint à partir desquelles les applications obtiennent des informations sur les fenêtres. Plus précisément, le dernier est responsable de la propriété WM_CLASS, deux chaînes séparées par des virgules, qui peuvent être facilement visualisées via la commande xpropname__. Par exemple, Chrome a

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

Ces deux sont documentés comme:

  • Une chaîne qui nomme l'instance particulière de l'application à laquelle appartient le client propriétaire de cette fenêtre. ...
  • Une chaîne qui nomme la classe générale des applications à laquelle appartient le client propriétaire de cette fenêtre. Les ressources spécifiées par classe s'appliquent à toutes les applications ayant le même nom de classe ....

Ainsi, par exemple, l'extension Hangouts pour Chrome a le même nom de classe, mais un nom d'instance différent:

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

Cela permet à des outils tels que xdotoolde rechercher toutes les fenêtres d’un type d’application particulier ou une instance de fenêtre spécifique. Par exemple, cela peut également être une propriété utile pour quelque chose comme les docks qui regroupent les fenêtres sous la même icône d’une application.

En particulier pour xdotoolname__, classnamecorrespond à la première chaîne et classcorrespond à la deuxième chaîne. Dans mon exemple avec Chrome et les applications Hangouts:

$ xdotool search -classname crx_nckgahadagoaajjgafhacjanaoiihapd
96469129

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

Cela peut aussi être évident en regardant le code source. Concentrons-nous sur classname par exemple. Dans le cmd_search.c , nous avons construit une structure de recherche qui possède une propriété de masque de recherche (lignes 171 à 173).

Ceci est passé à la fonction xdo_search_windows définie dans xdo_search.c , qui appelle à son tour check_window_match , qui passe à son tour à _ xdo_match_window_classname , qui finit par arriver récupération des deux structures mentionné au début de cette réponse avec les fonctions standard XlibXGetWindowAttributes et XGetClassHint .


Note latérale: Les applications Gtk apparemment créez toujours une petite fenêtre parent avec une fenêtre enfant , ce qui signifie que vous obtiendrez peut-être des résultats confus lors de la recherche d'une fenêtre spécifique.

7
Sergiy Kolodyazhnyy

classserait comme urxvtqui contient à la fois urxvtet rxvtqui est le terminal unicode rxvt. classnamedivise ces noms en noms réels. Je vais montrer un exemple ci-dessous.

J'ai 4 fenêtres de terminal rxvt ouvertes.

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

Puis, lorsque j'ai lancé un terminal urxvtname__, voici ce que j'ai obtenu.

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

En utilisant l'application xpropname__, nous pouvons cliquer sur les fenêtres pour nous indiquer la WM_CLASS(STRING). Le premier est le classnameet le second le classname__.

Exemple:

Lancer la commande et cliquer sur une fenêtre de terminal RXVT:

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

Même commande en cliquant sur une fenêtre URXVT:

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

Même commande en cliquant à nouveau sur un navigateur Google Chrome:

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

En cliquant sur une fenêtre xfce4-terminal:

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

En cliquant sur une fenêtre gnome-terminal:

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

En cliquant sur une fenêtre Firefox (différente):

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

J'espère que cela aidera à faire la lumière sur les différences.

4
Terrance