【问题标题】:how to define window stacking order?如何定义窗口堆叠顺序?
【发布时间】:2016-10-26 08:30:29
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: x11 xorg xcb


    【解决方案1】:

    X11 只为您提供绝对最小值。没有层或总是在或总是在窗口。你自己实现所有花哨的东西,通常是在你正在编写的窗口管理器中。

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

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

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

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

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

    【讨论】:

      【解决方案2】:

      对窗口进行排序是窗口管理器的职责。窗口会提示它是哪种类型(弹出对话框、菜单窗口、闪屏、工具箱等),然后窗口管理器决定如何在屏幕上显示它。这包括跟踪订单并决定哪个优先。

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

      【讨论】:

      • XRestackWindows 是一个 Xlib 便利函数。没有对应的 X11 协议请求,所以没有 XCB API。
      猜你喜欢
      • 2017-05-16
      • 2019-05-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多