我想在屏幕上打印有关Linux下顶级窗口的信息。我使用xlib函数。我成功地从根窗口递归,打印出所有显示元素的所有信息。但我只需要顶级窗口。我找不到任何好的过滤方法。根据维基百科的定义,顶级窗口正是根窗口的直接子窗口。根据这个定义,我的列表中有一些窗口,如gnome-session、seahorse-daemon、notify-osd或图标,我不想要它们。我还发现了一个函数:XmuClientWindow,但我不理解它的目的。
让我们看看我是否正确地理解了您的要求。顶级窗口是根窗口的直接子窗口,或者在某些窗口管理器中是虚拟根窗口的子窗口 - 请参见根窗口(维基百科),您似乎已经找到了它。该文章还告诉您如何找到虚拟根窗口的列表。您可以在根或虚拟根上使用XQueryTree来查找子窗口的列表。
一旦你获得了那个列表,你可能需要应用许多令人不快的启发式算法来查找你感兴趣的窗口。XmuClientWindow会告诉你和你的顶层窗口(如果有)关联的应用程序窗口。应用程序创建窗口,然后窗口管理器重新定位它们作为自己创建的顶层窗口的子窗口,以容纳窗口装饰和其他内容(最大化按钮、关闭按钮、调整大小句柄)。从客户端/应用程序窗口中读取扩展窗口管理器提示可以告诉你一些信息,例如你是否正在处理特殊窗口(如停靠、面板等)。您还可以查看应用程序窗口上的窗口管理器提示(XGetWMHints(3),XGetWMNormalHints(3),XGetWMSizeHints(3)),以确定它是否对您感兴趣 - 窗口管理器会创建很多短暂的窗口,您可能不关心。
请参见VirtualBox Guest Additions中无缝代码的示例,了解查看顶层窗口的方法。
wmctrl -l