![xorg 如何绘制堆叠窗口?](https://linux22.com/image/145300/xorg%20%E5%A6%82%E4%BD%95%E7%BB%98%E5%88%B6%E5%A0%86%E5%8F%A0%E7%AA%97%E5%8F%A3%EF%BC%9F.png)
我正在读一本Low Level X Window Programming
罗斯·马洛尼写的书。他正在谈论堆叠窗口系统的关键方面之一,即当您“删除”窗口时恢复“隐藏”内容。
通常您会期望“后面”的内容立即可见。然而,显然,这不是x
实现必须提供的东西,尽管有些实现确实如此。
这保存在和后备存储服务略有不同。在保存中,窗口映射到的屏幕内容由服务器在窗口映射之前的实例中使用服务器的内存来保存。
- 如果这不是
x
服务器提供的,是否应该在客户端实现? - 一些典型的窗口管理器是如何实现堆叠的?
- 如果
xorg
确实提供此功能,是否有任何特定算法可以专门用于“保存”?我不明白如何保存重叠区域的副本以便以后使用,尤其是当您有多个重叠时=)我的想法已经很令人兴奋了!这样的增量可以用来重建堆栈吗?
如果不是,那么在随机删除窗口的情况下,它是否会一一重新绘制每个堆叠窗口?维基百科的说法如下:
堆叠是一个相对缓慢的过程,需要从最后面和最外面到最前面和最里面,逐个重绘每个窗口。许多堆叠窗口管理器并不总是重绘背景窗口。其他程序可以检测何时需要重绘所有窗口,因为某些应用程序在其输出发生更改时请求堆栈。重新堆栈通常是通过对窗口管理器的函数调用来完成的,窗口管理器根据需要有选择地重绘窗口。例如,如果将背景窗口置于前面,则只需重绘该窗口。
PS:我知道这是一个大问题,但获得一些指示会很有帮助。
答案1
两个都后备存储和保存在是使用 . 创建窗口时可以设置的属性/标志XCreateWindow()
。然而,它们只是对 X11 服务器的提示,默认情况下不会打开,而且对于现代硬件来说并不值得麻烦。
通常,当(部分)背景窗口变得可见时,X11 服务器将向Expose
X11 客户端发送一个事件,这将导致它重绘它。由于这些只是提示,Expose
即使客户端已.backing_store = Always
在窗口及其CWSaveUnder
在其顶部打开的弹出窗口上进行了设置,X11 服务器仍可能会发送 。
还有一些接口允许客户端查询服务器是否实现后备存储并保存在:XDoesBackingStore()
和下XDoesSaveUnders()
。
窗口管理器与这一切无关;它不会重绘任何窗口(除了它自己的窗口:标题栏、关闭按钮)。
答案2
如果不是,那么在随机删除窗口的情况下,它是否会一一重新绘制每个堆叠窗口?
大多数流行的桌面都使用更新的 XCOMPOSITE 扩展。整个窗口内容被渲染到离屏缓冲区,因此合成管理器都可以使用它们,而无需请求应用程序重绘它们。
这是摘录自官方网站:
此扩展导致窗口层次结构的整个子树被渲染到屏幕外缓冲区。然后应用程序可以获取该缓冲区的内容并执行它们喜欢的操作。离屏缓冲区可以自动合并到父窗口中,也可以由称为合成管理器的外部程序合并。合成管理器可以实现许多有趣的效果。