如何定义窗口堆叠顺序?

时间:2016-10-26 08:30:30

标签: x11 xorg xcb

我正在尝试编写自己的窗口管理器。我遇到的一个问题是我不明白如何定义窗口应该显示的顺序。我找到的唯一方法是使用 xcb_configure_window 。但它看起来非常局限于我:它只允许将窗口抬高到最顶层,或者将它放在最底层(没有层或其他东西的概念)。功能有限:(。

我真正想要做的是定义窗口顺序并告诉X它。或者定义多个窗口层(例如,正常,最重要的是,在所有窗口之下)。所以我可以相对于它的层升高(或降低)窗口。因此,较低层的窗户不会覆盖上层的窗户。

那么,除了xcb_configure_window之外,还有其他库函数来定义窗口的顺序吗?或者我需要忍受它?这意味着我必须在窗口管理器中跟踪窗口的顺序。

链接到相关的XCB文档:https://www.x.org/releases/X11R7.6/doc/libxcb/tutorial/index.html#winstack

2 个答案:

答案 0 :(得分:1)

X11只给你绝对最小值。没有图层或永远在窗口或总是在窗口下。你自己实现所有花哨的东西,通常在窗口管理器中,这就是你正在写的东西。

没有原始协议请求一次更改窗口的堆叠顺序。 Xlib有一个函数XRestackWindows可以做到这一点,但每个窗口使用一个配置请求。伪代码只是

 for each window in the list except the first
      change the stacking order to be under the previous window

就是这样。没有比这更奇特了。

您需要跟踪WM中的堆叠顺序以实现图层,以便在程序尝试重新打开顶级窗口时,您可以截取请求并仅在其图层中重新打包。

实现图层的另一种可能方法是将几个透明全屏窗口和重新显示用户的顶级窗口,而不是根窗口。我并不完全确定它会一直有效,你需要以某种方式处理透明度,这需要透明度支持硬件或复合扩展,或者可能两者兼而有之。

答案 1 :(得分:1)

订购窗口是窗口管理器的责任。窗口提供有关它的类型(弹出对话框,菜单窗口,启动画面,工具箱等)的提示,窗口管理器然后决定如何在屏幕上显示它。这包括跟踪订单并决定哪个优先。

有一个X11调用来改变顺序(XRestackWindows),但我不知道Xcb的等价物。