我正在读一本Low Level X Window Programming
罗斯·马洛尼 (Ross Maloney) 的书。他正在谈论堆叠窗口系统的关键方面之一,即当您“移除”窗口时恢复“隐藏”内容。
通常,您会期望“后面”的内容立即可见。然而,显然,这不是x
实现必须提供的东西,尽管有些实现。
save under和backing store服务略有不同。在 save under 中,窗口映射到的屏幕内容由服务器保存在窗口映射之前的实例中,使用服务器的内存。
- 如果这不是
x
服务器提供的东西,是否应该在客户端实现? - 一些典型的窗口管理器是如何实现堆叠的?
- 如果
xorg
确实提供此功能,是否有任何特定的算法可以特别用于“保存”?我不明白如何保存重叠区域的副本以后可以使用,尤其是当您有多个重叠时=)我的想法已经在吹了!这样的增量可以用来重建堆栈吗?
如果不是,在随机移除窗口的情况下,它是否会一一重绘每个堆叠的窗口?维基百科说:
堆叠是一个相对缓慢的过程,需要从最后面和最外面到最前面和最里面的每个窗口一个接一个地重绘。许多堆叠窗口管理器并不总是重绘背景窗口。其他人可以检测到何时需要重绘所有窗口,因为某些应用程序在其输出发生更改时请求堆叠。重新堆叠通常是通过对窗口管理器的函数调用来完成的,它可以根据需要选择性地重绘窗口。例如,如果将背景窗口置于最前面,则只需要重绘该窗口。
PS:我知道这是一个大问题,但获得一些指示会有所帮助。
backing store和save under都是可以在创建窗口时设置的属性/标志
XCreateWindow()
。但是,它们只是对 X11 服务器的提示,默认情况下不启用,并且不值得为现代硬件带来麻烦。通常,当(部分)背景窗口变得可见时,X11 服务器将向
Expose
X11 客户端发送一个事件,这将导致它重新绘制它。由于这些只是提示,Expose
即使客户端.backing_store = Always
在窗口和CWSaveUnder
在它上面打开的弹出窗口上都设置了,X11 服务器仍可能发送一个。还有一些接口允许客户端查询服务器是否实现了后备存储并保存在:
XDoesBackingStore()
和XDoesSaveUnders()
.窗口管理器与这一切无关;它不会重绘任何窗口(除了它自己的:标题栏、关闭按钮)。
大多数流行的桌面使用更新的 XCOMPOSITE 扩展。整个窗口内容被渲染到屏幕外缓冲区,因此它们都可供合成管理器使用,而无需请求应用程序重绘它们。
这是官方网站的摘录: