X Window 系統的視窗顯示原理 ibm

2021-06-07 05:54:54 字數 2658 閱讀 5802

徐 星, 高階軟體工程師, 上海某手機設計公司

簡介:本文介紹 x window 系統的視窗顯示原理。從乙個簡單的 x 客戶端程式入手,介紹了視窗的建立介面 xcreatewindow 和顯示介面 xmapwindow 的實現,並結合視窗管理器介紹了 x server、x client 和視窗管理器三部分互動的原理。

標記本文!

x window 系統介紹

x window 系統是乙個基於網路的圖形介面系統,它於 1984 年在麻省理工學院開發,有將近 20 年的應用歷史。x window 系統廣泛的應用於桌面 linux(如 fedora、debian、ubuntu 等),嵌入式 linux(如 nokia 的 maemo、intel 的 moblin 等)。隨著 nokia 和 intel 高調的將 maemo 和 moblin 合併為 meego,x window 系統的應用將被推向乙個新的高潮。

x window 是 c/s 架構,涵蓋 x server、x 協議、x client 三部分內容。其 x client 有三種開發模式:基於 xlib、基於 gtk、基於 qt。

本文將以乙個基於 xlib 的應用來介紹 x window 的視窗顯示原理。

回頁首

示例及執行結果

示例**將顯示乙個 200x200 的白色背景視窗,並在視窗的中間繪製乙個 100 個點,連線成一條橫線。按任意按鍵可以退出該程式。

清單 1. hello.c

#include #include #include #define window_size 200 

int main (int argc, char *argv)

在 gtk 中,呼叫 gdk_window_new 會建立乙個 x 視窗。gtk 提供了三種型別的頂層視窗:gdk_window_toplevel、gdk_window_dialog、gdk_window_temp。這些頂層視窗的父親是 gdk_screen_xrootwin,即根視窗。而 gdk_window_child 型別的視窗其父親由使用者建立視窗時指定。gdk_window_child 型別的視窗對應的是 gtk 的控制項,如 gtkbutton、gtkentry 等。

如前述,所有的視窗都是父視窗的一部分。所有視窗的根是根視窗。根視窗由 x server 在啟動時建立,對應整個螢幕區域。

以 gtk 為例子,gtk 視窗層級檢視是下圖 3 的樣子:

圖 3. gtk 視窗層級檢視

對單個應用而言,部分視窗管理器如 matchbox window manager 只支援乙個應用級頂層視窗,譬如 maemo fremantle 使用的就是該型別的視窗管理器。這就是為什麼 maemo fremantle 模擬器執行 hello.c 的顯示結果 ( 圖 2) 不是設定的尺寸 200x200,而是延伸到整個螢幕寬度。在 maemo fremantle 模擬器頂部顯示的狀態條其實是主介面顯示的,該部分是 dock 型別的視窗,和 hello.c 無關。

createwindow 呼叫結束的時候給客戶端傳送 createnotify 事件。但是 gtk 沒有處理該事件。

回頁首

對映視窗:xmapwindow

xmapwindow 對應的 x server 實現是 mapwindow 函式。該**較長,而且涉及到 x client、x server、視窗管理器的多次互動。

mapwindow 的工作原理是:

客戶端呼叫 mapwindow 請求對映 client 視窗。如果該視窗的 overrideredirect 為假,表示該 mapwindow 呼叫為普通客戶端發起。則傳送 maprequest 到視窗管理器。請求視窗管理器進一步處理。

視窗管理器收到 maprequest,建立乙個 frame 視窗,並通過 xreparentwindow 呼叫,將客戶端的視窗設定為 frame 視窗的子視窗。frame 視窗的 overrideredirect 為真。

視窗管理器呼叫 xmapsubwindows,第二個引數為 frame 視窗。由於 frame 視窗的 overrideredirect 為真,mapsubwindows 會對該 frame 視窗的子視窗做對映。並傳送 mapnotify 事件、expose 事件給客戶端。客戶端在 expose 事件中繪製客戶端視窗內容。

視窗管理器呼叫 xmapwindow,第二個引數為 frame 視窗。同樣由於 frame 視窗的 overrideredirect 為真,這次 mapwindow 也不發射 maprequest 事件了,從而映** frame 視窗。

x server 在對映 frame 視窗之後,傳送 expose 事件給視窗管理器,以通知視窗管理器繪製視窗的邊框等。

至此,客戶端視窗的內容,視窗的邊框都被顯示在螢幕上了。

下圖 4 是 x client、x server、視窗管理器的互動序列圖:

圖 4. x client、x server、視窗管理器互動序列圖

回頁首

結束語x window 是乙個功能非常強大的 c/s 圖形顯示系統,具有很好的跨網路效能,也易於進行擴充套件。了解其視窗顯示原理對程式設計師進行 gtk/qt 程式設計是有幫助的。

參考資料

關於作者

徐星,武漢大學電子系碩士。畢業後一直從事手機 gui 研發 , 對 qt、gtk、x window 系統有較深入的理解。在國內外期刊發表**三篇,有發明專利兩項。主要研究方向是 x window 系統、opengl 等。

為本文評分

X Window 系統的視窗顯示原理

x window 系統的視窗顯示原理 摘自 ibm developerworks china 被閱讀次數 1000 由 yangyi 於 2010 07 06 22 48 12 提供 x window 系統介紹 x window 系統是乙個基於網路的圖形介面系統,它於 1984 年在麻省理工學院開發...

X Window 系統的視窗顯示原理

簡介 本文介紹 x window 系統的視窗顯示原理。從乙個簡單的 x 客戶端程式入手,介紹了視窗的建立介面 xcreatewindow 和顯示介面 xmapwindow 的實現,並結合視窗管理器介紹了 x server x client 和視窗管理器三部分互動的原理。x window 系統介紹 x...

X Window 系統的視窗顯示原理

x window 系統是乙個基於網路的圖形介面系統,它於 1984 年在麻省理工學院開發,有將近 20 年的應用歷史。x window 系統廣泛的應用於桌面 linux 如 fedora debian ubuntu 等 嵌入式 linux 如 nokia 的 maemo intel 的 moblin...