xorg 如何繪製堆疊的窗戶?
我正在讀一本
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()
.視窗管理器與這一切無關;它不會重繪任何視窗(除了它自己的:標題欄、關閉按鈕)。