鉴于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 与窗口类名匹配。
什么是“class”和“classname”?
它们有哪些可能的价值?
如何找出窗口的类别和类名?
谢谢。
答案1
在X11 Windows下有 XWindowdAttributes 结构和XClassHint 结构 应用程序从中获取有关窗口的信息的属性。具体来说,最后一个属性负责属性WM_CLASS
,两个逗号分隔的字符串,可以通过xprop
命令轻松查看。例如,Chrome 有
WM_CLASS(STRING) = "google-chrome", "Google-chrome"
这两个记录作为:
- 用于命名拥有此窗口的客户端所属的应用程序的特定实例的字符串。 ...
- 一个字符串,用于命名拥有此窗口的客户端所属的应用程序的一般类别。由类别指定的资源适用于所有具有相同类别名称的应用程序....
因此,例如 Chrome 的 Hangouts 扩展程序具有相同的类名,但具有不同的实例名:
$ xprop | grep 'CLASS'
WM_CLASS(STRING) = "crx_nckgahadagoaajjgafhacjanaoiihapd", "Google-chrome"
这允许搜索特定应用程序类型的所有窗口或特定窗口实例等工具xdotool
。例如,这对于将窗口分组到同一应用程序图标下的停靠栏等工具来说也是很有用的属性。
具体来说xdotool
,classname
对应于第一个字符串,class
对应于第二个字符串。在我使用 Chrome 和 Hangouts 应用的示例中:
$ xdotool search -classname crx_nckgahadagoaajjgafhacjanaoiihapd
96469129
$ xdotool search -class Google-chrome
96469069
109051905
109051907
96468993
96469129
109051912
109051924
从源代码中也可以看出这一点。我们以 classname 为例。在搜索.c我们建立了一个搜索结构,它具有搜索掩码属性(第 171 至 173 行)。
这将传递给xdo_search_windows
定义在搜索.c,进而调用check_window_match
,进而 _xdo_match_window_classname,最终检索两个结构本答案开头提到的标准库功能获取窗口属性和获取类提示。
附注:显然是 Gtk 应用程序总是创建一个带有子窗口的小父窗口,这意味着您在搜索特定窗口时可能会得到令人困惑的结果。