如何定义 window 堆叠顺序?

how to define window stacking order?

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

我真正想做的是定义 window 顺序并告诉 X。或者定义多层 windows(例如,正常、最重要、最下面)。所以我可以提高(或降低)关于其层的 window 。因此,下层的 windows 永远不会覆盖上层的 windows。

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

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

X11 只为您提供绝对最小值。没有层或总是在上面或总是在下面 windows。您自己实现所有花哨的东西,通常是在 window 管理器中,这就是您正在编写的内容。

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

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

就是这样。没有比这更花哨的了。

您确实需要跟踪 WM 中的堆叠顺序以实现层,以便当程序尝试重新堆叠顶层时 window,您拦截请求并仅在其层内重新堆叠它.

另一种实现图层的可能方法是让多个 透明 全屏 windows 并将用户的顶级 windows 重新设置为那些,而不是到根 window。我不完全确定它是否会始终有效,并且您需要以一种或另一种方式处理透明度,这需要透明度支持硬件或复合扩展或可能两者。

window 经理有责任 订购 windows。 window 给出有关它是哪种类型的提示(弹出对话框、菜单 window、闪屏、工具箱等),然后 window 管理器决定如何在屏幕上显示它。这包括跟踪订单并决定哪个优先。

有一个 X11 调用来更改顺序 (XRestackWindows),但我不知道 Xcb 等效项。