x11 - 如何定义窗口堆叠顺序?

标签 x11 xorg xcb

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

我真正想做的是定义窗口顺序并告诉 X。或者定义多层窗口(例如,正常、高于所有、低于所有)。所以我可以相对于它的层升高(或降低)窗口。因此来自下层的窗口永远不会覆盖来自上层的窗口。

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

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

最佳答案

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

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

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

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

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

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

关于x11 - 如何定义窗口堆叠顺序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40257320/

相关文章:

text - X11剪贴板如何处理多种数据格式?

resize - XCB - 如何设置 WM_SIZE_HINTS?

c - Xlib:如何检查特定窗口是否最小化?

c++ - 我的 Xlib 包装器类 (C++) 中的段错误

linux - 在 QT 应用程序中嵌入应用程序(在本例中为终端)

linux - 如果键盘上没有这样的键,如何键入 Numpad Enter?

c++ - XCB 错误 : 148 - Qt application display issues

python - 使用 X11 转发时的 pyplot

r - 开罗的 R-3.3.2 问题中的半透明

c - 如何在使用 XCB 启动新应用程序时获取事件