确定xlib中的GTK窗口是子窗口还是顶级窗口

时间:2016-04-27 00:04:55

标签: gtk x11 xlib

有谁知道如何确定GTK应用程序中的哪些窗口是“顶级窗口”。我的意思是在任何常见的窗口管理器中通常带有边框(包括标题和最小化/最大化按钮以及红色'x'/关闭按钮)的窗口,例如文本工具提示不会是一个顶级窗口,因为那些永远不会获得边框,从来没有它们仍然被认为是x11中的窗口(或至少在GTK中)。我有一个运行在xvfb之上的GTK应用程序,没有任何窗口管理器,我注意到每个窗口都是根窗口的直接子窗口,因为某些原因使得找到“顶级窗口”很难找到。

非常感谢!

1 个答案:

答案 0 :(得分:1)

你所描述的弹出窗口是一个顶级窗口,因为它漂浮在生成弹出窗口的窗口上方。它不会是一个孩子,因为它会被剪裁。

您应该检查的是给窗口管理器的提示,更具体地说是_NET_WM_WINDOW_TYPE原子。 (请参阅this link at freedesktop.orgthis one at gnome.org)。现在每个应用程序做了什么(或应该做什么)都告诉窗口管理员"嘿,我是一个X型窗口,请确保我得到正确的装饰。" A'正常'应用程序的窗口应该将属性设置为_NET_WM_WINDOW_TYPE_NORMAL,而菜单将具有_NET_WM_TYPE_POPUP_MENU,工具提示_NET_WM_TYPE_TOOLTIP等等。

即使您没有运行窗口管理器,应用程序仍会设置该属性,您仍然可以查询它。

请注意,窗口可以有多种类型,但实际上很少这样做;如果窗口管理器不支持您的窗口类型,则意图是具有首选窗口类型,后跟回退类型。因此,如果您获得类型列表,则必须全部检查。我不确定是否有办法确定窗口管理器最终使用的类型。至少你的正常'窗口应该有一个支持的类型。