我正在尝试使用 XQuerytree 获取 Xlib 中顶级窗口(即根窗口的子窗口)的数量。 当仅尝试基本的 X 实用程序(例如 Xterm 或 Xeyes)时,它工作得很好,但是对于使用 GTK 或 QT 框架的应用程序,
num_top_level_windows
包含完全错误的数字(例如,仅打开 KeepassXC,我显然有 5 个顶级窗口)。
这是相关的代码片段
Window returned_root, returned_parent;
Window* top_level_windows;
unsigned int num_top_level_windows;
XQueryTree(
display_,
root_,
&returned_root,
&returned_parent,
&top_level_windows,
&num_top_level_windows);
printf("\n\n N: %d\n", num_top_level_windows);
root_
和 display_
是对根窗口和显示的引用(通过 XOpenDisplay 和 DefaultRootWindow(display_) 获得,应该可以正常工作。
我在 gentoo linux 上使用嵌套的 Xephyr X 服务器会话。我真的想知道为什么会发生这个“错误”以及如何获得子窗口的真实数量。
预先感谢您!
XQueryTree() 从指定的“w”字段返回任何子窗口,这包括 override-redirect 窗口和 Unmapped/Unviewable 窗口。
要过滤掉这些窗口,您需要使用XGetWindowAttributes()查询其属性,检查窗口是否override_redirect或者map_state是否not设置为IsViewable。
这应该足够了,但您可能还需要查询窗口的 WM_STATE 以检查其是否为 IconicState 或 WithdrawnState,具体取决于您的环境设置方式。
您可以参考 dwm 源代码,特别是“dwm.c, scan()”来查看他们如何实现管理窗口的方式,或者在本例中查看哪些是“顶级”。