到目前为止,我找到了两种方法:
对于每个根窗口(默认屏幕、特定屏幕、所有屏幕等),列出每个直接子窗口。递归地搜索每个直接子节点以查找具有该
WM_STATE
属性的窗口;该窗口成为直接子级的顶级应用程序窗口,并且所有递归都可以停止。如果直接子级的层次结构中没有窗口具有该WM_STATE
属性,则假定直接子级本身就是顶级应用程序窗口。使用
xcb_get_property
, andxcb_query_tree
(尽管名称仅列出直系子级)。这就是xlsclients通过 XCB 使用的(与上面相同的算法,或多或少)。
要求:需要 ICCCM(窗口管理器)支持
WM_STATE
。
对于每个根窗口(默认屏幕、特定屏幕、所有屏幕等),获取“_NET_CLIENT_LIST”属性,该属性列出了由窗口管理器管理的所有顶级应用程序窗口。
使用
xcb_get_property
.这就是wmctrl通过 Xlib 使用的。
需要窗口管理器来维护列表。一些窗口似乎逃脱了列表。
要求:EWMH(窗口管理器)支持
_NET_CLIENT_LIST
或_WIN_CLIENT_LIST
(我不知道第二个是什么;我找不到任何文档)。
问题:
还有其他方法吗?是否有任何不依赖于外部机制(如 ICCCM 或 EWMH)的方法?
哪种方法最有弹性?
- EWMH。我发现了一些报告(上面链接),某些应用程序没有在
_NET_CLIENT_LIST
. 为什么是这样? - 国际商会。
WM_STATE
这种方法似乎更灵活,但是如果假设缺少的层次结构的直接子级是顶级应用程序窗口,则不会匹配其他无窗口应用程序吗?更糟糕的是,它不会在虚拟根窗口下严重崩溃吗?例如,虚拟根窗口成为唯一的直接子窗口,递归将在第一个应用程序窗口上停止,使用WM_STATE
; 只会匹配一个窗口。针对这种可能性,xlsclients
不包括对虚拟根窗口的任何检查......那么为什么它与 GNOME(使用虚拟根窗口)一起工作?
- EWMH。我发现了一些报告(上面链接),某些应用程序没有在