2010年8月29日 星期日

親手打造 Window Manager - Transient 和 OverrideRedirect

Standard
若嘗試去讀各個 Window Manager 的程式碼,最大的挫折就是會遭遇其中了龐大數量的專有名詞和屬性,假設沒有對 XWindow 和 Window Manager 整體架構有清楚概念,必定會花不少時間在查詢 X11/Xlib 的官方文件和映證,不過,查證過程雖繁瑣,對瞭解整個實作很有幫助。筆者將在本文記錄幾個比較特別的視窗(window)屬性,以便讀者懂得如何處理一些特殊的 window。

WM_TRANSIENT_FOR

此 Hint 屬性記載著短暫視窗的父視窗的 Window ID,若不是短暫視窗,將回傳沒有父視窗。短暫視窗有與一般視窗不同之特性,其將不會在工作列上被顯示,只是用來做短時間顯示使用,如對話視窗(Dialog Window) 就屬此類。想取得該屬性的設定值,可以藉由此 XGetTransientForHint() 得到:

XGetTransientForHint(Display *, Window, Window*)

OverrideRedirect

此 Window Attributes 參數表明忽略重新定向,若此參數為真(True),視窗管理員(Window Manager) 將不會為該視窗畫上標題框和邊框,如選單視窗(Menu Window)就屬此種會忽略重新定向的視窗。我們可以透過 XGetWindowAttributes() 去取得該屬性,簡單的範例如下:

XWindowAttributes attr;
XGetWindowAttributes(display, win, &attr);
if (attr.overrideRedirect)
    ....
else
    ....

暫且撇開一般 X Application 開發者熟知的視窗形態(Type),如:Dock 、Desktop、Toolbar 等等,Window Manager 在畫視窗時,首先要處理的是 WM_TRANSIENT_FOR 和 overrideRedirect 這類的屬性,而視窗形態應該是考量於 Window Manager 自身的應用後,才有不同的設計和呈現。