判断xlib中的GTKwindow是subwindow还是top levelwindow

Determine if GTK window in xlib is a subwindow or a top level window

有谁知道如何确定 GTK 应用程序中的 windows 是 "top level windows"。我的意思是 windows 通常会在任何常见的 window 经理文本工具提示不会是顶级 window 因为它们永远不会有边界,尽管如此它们在 x11 中仍然被认为是 windows(或者至少在 GTK 中它们是)。我在 xvfb 之上有一个 GTK 应用程序 运行,没有任何 window 管理器,我注意到每个 window 都是根 window 的直接子节点,因为某些原因使得找到"top level windows" 很难找到。

非常感谢!

像您描述的弹出窗口是 top-level window 正是因为它浮动在生成弹出窗口的 window 之上。它不能是 child,因为那样它会被剪掉。

您应该检查给 window 经理的提示,更具体地说是 _NET_WM_WINDOW_TYPE 原子。 (参见 this link at freedesktop.org or this one at gnome.org)。这些天每个应用程序所做的(或应该做的)是告诉 window 经理 "Hey, I'm a window of type X, please make sure I get decorated properly." 应用程序的 'normal' window 应该将 属性 设置为 _NET_WM_WINDOW_TYPE_NORMAL,而菜单会有 _NET_WM_TYPE_POPUP_MENU、工具提示 _NET_WM_TYPE_TOOLTIP 等。

即使您不是 运行 window 经理,应用程序仍会设置 属性,您仍然可以查询它。

请注意,window 可以有多种类型,但实际上很少这样做;目的是在 window 管理器不支持您的 window 类型的情况下,使用首选 window 类型后跟后备类型。因此,如果您获得类型列表,则必须检查所有类型。我不确定是否有办法确定 window 经理最终使用哪种类型。至少你的 'normal' window 应该有一个支持的类型。