XQuerytree 返回错误数量的子窗口

问题描述 投票:0回答:1

我正在尝试使用 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 服务器会话。我真的想知道为什么会发生这个“错误”以及如何获得子窗口的真实数量。 预先感谢您!

c++ linux x11 xlib xorg
1个回答
0
投票

XQueryTree() 从指定的“w”字段返回任何子窗口,这包括 override-redirect 窗口和 Unmapped/Unviewable 窗口。

过滤掉这些窗口,您需要使用XGetWindowAttributes()查询其属性,检查窗口是否override_redirect或者map_state是否not设置为IsViewable

这应该足够了,但您可能还需要查询窗口的 WM_STATE 以检查其是否为 IconicStateWithdrawnState,具体取决于您的环境设置方式。

您可以参考 dwm 源代码,特别是“dwm.c, scan()”来查看他们如何实现管理窗口的方式,或者在本例中查看哪些是“顶级”。

© www.soinside.com 2019 - 2024. All rights reserved.