X11:列出顶级窗口

时间:2016-05-21 04:58:02

标签: window x11 ewmh icccm

到目前为止,我发现了两种方法:

  1. 对于每个根窗口(默认屏幕,特定屏幕,所有屏幕等),列出每个直接子项。以递归方式搜索每个直接子项以获得具有WM_STATE属性的窗口;该窗口成为直接子项的顶级应用程序窗口,所有递归都可以停止。如果直接子级的层次结构中没有窗口具有WM_STATE属性,则假定直接子级本身是顶级应用程序窗口。

    • 使用xcb_get_propertyxcb_query_tree(尽管名称仅列出直系儿童)。

    • 这是 xlsclients 使用的,通过XCB(与上面相同的算法,或多或少)。

    • 要求:要求ICCCM(窗口管理员)支持WM_STATE

  2. 对于每个根窗口(默认屏幕,特定屏幕,所有屏幕等),获取“_NET_CLIENT_LIST”属性,该属性列出了窗口管理器管理的所有顶级应用程序窗口。

    • 使用xcb_get_property

    • 这是 wmctrl 通过Xlib使用的内容。

    • 需要窗口管理器维护列表。 Some windows seem to escape the list

    • 要求:EWMH(窗口管理器)支持_NET_CLIENT_LIST_WIN_CLIENT_LIST(我不知道第二个是什么;我找不到任何内容文档)。

  3. 问题:

    1. 还有其他方法吗?是否有任何方法不依赖于ICCCM或EWMH等外部机制?

    2. 哪种方法最具弹性?

      1. EWMH。我发现了一些报告(如上所述),某些应用程序未在_NET_CLIENT_LIST中列出。这是为什么?
      2. ICCCM。这种方法似乎更灵活,但假设缺少WM_STATE的层次结构的直接子项是顶级应用程序窗口,则无法与无窗口应用程序匹配?更糟糕的是,它不会在virtual root windows下突然崩溃吗?例如,虚拟根窗口成为唯一的直接子节点,递归将在WM_STATE的第一个应用程序窗口上停止;只匹配一个窗口。针对这种可能性,xlsclients不包括对虚拟根窗口的任何检查......那么为什么它与GNOME(使用虚拟根窗口)一起工作?

0 个答案:

没有答案