web-dev-qa-db-ja.com

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

マンページには

--classウィンドウクラスと一致します。

--classnameウィンドウのクラス名と一致します。

「クラス」と「クラス名」とは何ですか?

どのような価値がありますか?

ウィンドウのクラスとクラス名を調べるにはどうすればよいですか?

ありがとう。

7
Tim

X11では、ウィンドウには XWindowdAttributes構造体 および XClassHint構造体 プロパティがあり、そこからアプリケーションはウィンドウに関する情報を取得します。具体的には、最後の1つはWM_CLASSプロパティである2つのコンマ区切りの文字列を担当し、xpropコマンドで簡単に確認できます。たとえば、Chromeは

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

これら2つは ドキュメント化された として:

  • このウィンドウを所有するクライアントが属するアプリケーションの特定のインスタンスを指定する文字列。 ...
  • このウィンドウを所有するクライアントが属するアプリケーションの一般クラスを指定する文字列。クラスによって指定されるリソースは、同じクラス名を持つすべてのアプリケーションに適用されます。..

したがって、たとえば、Chrome用のハングアウト拡張機能は同じクラス名ですが、インスタンス名は異なります。

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

これにより、xdotoolなどのツールを使用して、特定のアプリケーションタイプまたは特定のウィンドウインスタンスのすべてのウィンドウを検索できます。たとえば、これは、アプリケーションの同じアイコンの下にウィンドウをグループ化するドックなどの便利なプロパティにもなります。

特にxdotoolの場合、classnameは最初の文字列に対応し、classは2番目の文字列に対応します。 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.c で定義されたxdo_search_windows関数に渡されます。この関数は check_window_match を呼び出し、それが _ xdo_match_window_classname になり、最終的に終了します 両方の構造の取得 この回答の冒頭で標準 Xlib 関数で言及 XGetWindowAttributes および XGetClassHint .


サイドノート:Gtkアプリはどうやら 常に子ウィンドウを持つ小さな親ウィンドウを作成する です。これは、特定のウィンドウを検索するときに混乱を招く結果になる可能性があることを意味します。

7

classは、実際にurxvturxvt(Unicode rxvt端末)の両方を含む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

その後、urxvtターミナルを起動したとき、これが得られました。

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

xpropアプリケーションを使用して、ウィンドウをクリックすると、WM_CLASS(STRING)が表示されます。最初はclassnameで、2番目は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"

xfce4-terminalウィンドウをクリックする:

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

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"

これが違いにいくつかの光を広めるのに役立つことを願っています。

4
Terrance