溫故知新,那就從用戶界面開始吧!
從人機(jī)交互到用戶界面,從GUI到窗口系統(tǒng),進(jìn)而到X 系統(tǒng)。從X 系統(tǒng)的設(shè)計(jì)思想,到Xserver和Xclient以及X11協(xié)議,一直到窗口管理器乃至wayland。溫故知新,那就從用戶界面開始吧!

1. 從用戶界面開始
用戶界面(User Interface)是進(jìn)行人機(jī)交互活動(dòng)的系統(tǒng)部件,是人與計(jì)算機(jī)通訊與對(duì)話的接口。早期的計(jì)算機(jī)是通過面板上的指示燈來顯示二進(jìn)制數(shù)據(jù)和指令,人們則通過面板上的開關(guān)、扳鍵及穿孔紙帶送入各種數(shù)據(jù)和命令。50年代中后期,由于采用了控制臺(tái)及打字機(jī)等設(shè)備,使計(jì)算機(jī)可以批處理多個(gè)計(jì)算任務(wù),從而代替了原來笨拙的手工扳鍵方式,提高了計(jì)算機(jī)的使用效率。
1963年,美國麻省理工學(xué)院在 709/7090計(jì)算機(jī)上成功地開發(fā)出第一個(gè)分時(shí)系統(tǒng),該系統(tǒng)連接了多個(gè)分時(shí)終端,并最早使用了文本編輯程序。從此,以命令行形式的多用戶分時(shí)終端成為70乃至80年代用戶界面的主流。
20世紀(jì)80年代初,由美國施樂公司在Alto計(jì)算機(jī)首先使用Smarttalk-80程序設(shè)計(jì)了開發(fā)環(huán)境,以及后來的Mactosh等計(jì)算機(jī),將用戶界面推向圖形用戶界面的新階段。隨之而來的用戶界面管理系統(tǒng)和智能界面的研究均推動(dòng)了用戶界面的發(fā)展。

GUI的核心特征是WIMP:
- W(window)指窗口,是用戶或系統(tǒng)的一個(gè)工作區(qū)域,一個(gè)屏幕可以有多個(gè)窗口。
- I(icons)指圖標(biāo),是形象化的圖形標(biāo)志,易于人們隱喻和理解。
- M(menu)指菜單,可供用戶選擇的功能提示。
- P(pointer)指鼠標(biāo)器等,便于用戶直接對(duì)屏幕對(duì)象進(jìn)行操作。
GUI采用了不少桌面辦公的隱喻,應(yīng)用者共享一個(gè)直觀的界面框架。人們熟悉辦公桌的情況,因而對(duì)計(jì)算機(jī)顯示的圖標(biāo)含義容易理解,諸如 文件夾、收件箱、畫筆、工作簿、鑰匙及時(shí)鐘等。采用GUI后,用戶可直接對(duì)屏幕上的對(duì)象進(jìn)行操作,如拖動(dòng)、刪除、插入以至放大和旋轉(zhuǎn)等。執(zhí)行操作后,屏幕能立即給出反饋信息或結(jié)果,實(shí)現(xiàn)了所見即所得。
2. 關(guān)于GUI的點(diǎn)滴
一個(gè)GUI系統(tǒng)通常由三個(gè)基本層次組成。它們是顯示模型,窗口模型和用戶模型。用戶模型包含了顯示和交互的主要特征,因此,圖形用戶界面這一術(shù)語有時(shí)也僅指用戶模型,這也是一個(gè)令人誤解的地方。

最底層是計(jì)算機(jī)硬件平臺(tái),如Intel,PowerPC等,硬件平臺(tái)的上面是計(jì)算機(jī)的操作系統(tǒng)。大多數(shù)圖形用戶界面系統(tǒng)都只能在一兩種操作系統(tǒng)上運(yùn)行,只有少數(shù)的產(chǎn)品例外。操作系統(tǒng)之上是圖形用戶界面的顯示模型,它決定了圖形在屏幕上的基本顯示方式。不同的GUI系統(tǒng)所采用的顯示模型各不相同,例如,大多數(shù)在Unix/Linux 之上運(yùn)行的圖形用戶界面系統(tǒng)都采用 X窗口作顯示模型 ,MS windows 則采用公司自己設(shè)計(jì)的GDI作為顯示模型。
顯示模型之上是GUI系統(tǒng)的窗口模型。窗口模型確定窗口如何在屏幕上顯示,如何改變大小,如何移動(dòng),及窗口的層次關(guān)系等。它通常包括兩個(gè)部分,一個(gè)是編程工具 ,另一個(gè)是對(duì)如何移動(dòng),輸出和讀取屏幕顯示信息的說明。因?yàn)閄窗口不但規(guī)定了如何顯示基本圖形對(duì)象也規(guī)定了如何顯示窗口,所以它不但可以充當(dāng)圖形用戶界面的顯示模型,也可以充當(dāng)它的窗口模型。
窗口模型之上是用戶模型,圖形用戶界面的用戶模型又稱為GUI的視覺感受。它也包括兩個(gè)部分 :構(gòu)造用戶界面的工具和對(duì)于如何在屏幕上組織各種圖形對(duì)象,以及這些對(duì)象之間如何交互的說明。例如,每個(gè)GUI模型都會(huì)說明它支持什么樣的菜單和什么樣的顯示方式。
GUI系統(tǒng)的應(yīng)用程序接口由其顯示模型,窗口模型和用戶模型的應(yīng)用程序接口共同組成。
GUI 系統(tǒng)一般分為三類:
- 基于操作系統(tǒng)內(nèi)核的GUI:這類GUI的絕大多數(shù)功能都與操作系統(tǒng)的內(nèi)核融合在一起,圖形用戶界面與操作系統(tǒng)密切配合,協(xié)調(diào)工作,來實(shí)現(xiàn)系統(tǒng)管理,應(yīng)用程序采用系統(tǒng)調(diào)用的方式來完成對(duì)窗口的各類操作。這類圖形用戶界面主要實(shí)現(xiàn)于個(gè)人機(jī)環(huán)境,如蘋果的Mac 。雖然圖形用戶接口與操作系統(tǒng)的緊密結(jié)合給GUI的開發(fā)帶來了方便,但是這類圖形用戶界面依附于特定的操作系統(tǒng)與硬件支撐環(huán)境,使得GUI變得不易修改、難擴(kuò)展、可移植性差。
- 基于CS模型型的GUI:這類GUI由與硬件直接相關(guān)的服務(wù)器部分和與硬件無關(guān)的客戶部分共同組成,實(shí)現(xiàn)了GUI的設(shè)備獨(dú)立性。當(dāng)面對(duì)不同的硬件環(huán)境時(shí),僅僅需要修改直接操作硬件的服務(wù)器部分,因而具有較好的可移植性。這一類圖形用戶界面的代表是 X window。
- 基于庫函數(shù)的GUI:這類GUI實(shí)現(xiàn)于操作系統(tǒng)的上層,可視為操作系統(tǒng)的擴(kuò)展,它以庫函數(shù)的形式提供給對(duì)窗口進(jìn)行操作的應(yīng)用程序進(jìn)行調(diào)用。這種圖形用戶界面比較容易修改、擴(kuò)充和移植。但在其基礎(chǔ)上編制的應(yīng)用程序還是與操作系統(tǒng)強(qiáng)相關(guān),并對(duì)它的移植帶來了一些障礙。這類GUI的典型產(chǎn)品是 MS windows 。
3. 窗口系統(tǒng)
窗口系統(tǒng)是在屏幕某限定區(qū)域管理程序輸入和輸出的一組工具。它與操作系統(tǒng)類似,操作系統(tǒng)管理的是存儲(chǔ)空間和I/O設(shè)備,而窗口系統(tǒng)管理的是窗口、事件、文本的輸入、文本和圖形的輸出以及各種對(duì)象屬性;操作系統(tǒng)用調(diào)度算法和I/O封鎖來調(diào)度,窗口系統(tǒng)使用用戶生成的事件來調(diào)度。
所謂窗口,是指屏幕上的一塊矩形區(qū)域,用戶通過窗口可以顯示、觀察其區(qū)域內(nèi)的全部或部分內(nèi)容,并可以對(duì)所顯示的內(nèi)容進(jìn)行各種系統(tǒng)預(yù)先規(guī)定好的正文或圖形操作。一般把窗口稱為虛擬屏幕,把顯示器稱為物理屏幕?,F(xiàn)代窗口系統(tǒng)支持多窗口重疊顯示,這必然涉及到各個(gè)窗口在屏幕上的疊放順序,一般采用一種稱為窗口“Z序”的機(jī)制來進(jìn)行管理?!癦序”實(shí)際是相對(duì)屏幕坐標(biāo)而言的,假設(shè)一根過屏幕原點(diǎn)垂直于屏幕的Z軸,它由外指向屏幕內(nèi),窗口在這個(gè)Z軸上的值就確定了它的Z序, Z序值大的窗口覆蓋了Z序值小的窗口,因此, Z序?qū)嶋H定義了各個(gè)窗口在屏幕上的層疊順序。
窗口管理技術(shù)是屏幕管理技術(shù)的核心,在實(shí)現(xiàn)時(shí)首先要定義一個(gè)窗口的數(shù)據(jù)結(jié)構(gòu)。各類窗口風(fēng)格迥異,但它們的基本信息都可以歸納為下面幾類:
- 標(biāo)志信息,作為一個(gè)窗口的標(biāo)志,以正整數(shù)表示,不同的窗口,標(biāo)志不同。
- 風(fēng)格信息,表示窗口的顯示風(fēng)格。
- 位置信息,描述窗口及其各個(gè)組成部分在屏幕上的位置。
- 內(nèi)容信息,包括窗口內(nèi)各組成部分相關(guān)的數(shù)據(jù),如菜單等。
- 圖像信息,存放與窗口相關(guān)的屏幕圖像,如窗口的圖標(biāo)。
- 父子信息,指一個(gè)窗口的父窗口和其子窗口的信息。
- 消息過程,指窗口對(duì)各種消息的處理函數(shù)。
窗口管理提供了一組工具函數(shù),實(shí)現(xiàn)對(duì)窗口的創(chuàng)建、關(guān)閉、刪除等基本操作功能,此外還實(shí)現(xiàn)設(shè)置、獲取窗口屬性、移動(dòng)等控制窗口的功能。這里要注意的是,對(duì)窗口進(jìn)行創(chuàng)建、關(guān)閉、等操作時(shí),要相應(yīng)修改系統(tǒng)的窗口Z序鏈表以及各個(gè)有關(guān)窗口的信息。
4. X window
X window是由麻省理工學(xué)院推出的窗口系統(tǒng),1984年發(fā)行了其最早版本,簡稱X,旨在建立不依賴于特定硬件系統(tǒng)的圖形和文字顯示窗口系統(tǒng)的標(biāo)準(zhǔn)。X window是一個(gè)圖形顯示、服務(wù)和管理系統(tǒng),包含了光柵圖形技術(shù)、用戶界面技術(shù)、操作系統(tǒng)技術(shù)和計(jì)算機(jī)網(wǎng)絡(luò)技術(shù),為用戶提供了一個(gè)靈活多樣的交互式圖形界面。X window完善的管理功能和高效的程序開發(fā)環(huán)境也成為一個(gè)事實(shí)上的工業(yè)標(biāo)準(zhǔn)。

從一般用戶的視角看, 窗口系統(tǒng)具有下述特征:
- 支持實(shí)現(xiàn)不同風(fēng)格的用戶界面
- 具有網(wǎng)絡(luò)透明性
- 本身獨(dú)立于顯示設(shè)備和輸入設(shè)備
- 支持并行顯示和多程序并行運(yùn)行
- 支持重疊型和瓦片型窗口
- 提供了多種窗口管理器,但系統(tǒng)中只能有一個(gè)活動(dòng)的窗口管理器
- 具有很好的可擴(kuò)展性
從軟件開發(fā)者的視角看,窗口具有下述特征:
- 提供了多種資源及其管理機(jī)制。
- 窗口系統(tǒng)的資源包括屏幕、窗口、象素映象、調(diào)色板、字體、光標(biāo)、設(shè)備及繪圖屬性集。
- 提供了基于網(wǎng)絡(luò)的窗口協(xié)議提供了各類庫函數(shù)、工具箱和對(duì)象類等編程機(jī)制,將窗口環(huán)境下的各種動(dòng)作或行為抽象為請(qǐng)求和事件,并提供了相應(yīng)的數(shù)據(jù)流和管理機(jī)制,大大簡化了程序設(shè)計(jì)工作。
5. X 系統(tǒng)的設(shè)計(jì)思想
X窗口系統(tǒng)設(shè)計(jì)思想是創(chuàng)立一個(gè)與系統(tǒng)硬件無關(guān)的圖形界面接口(簡稱GUI)?并且能夠通過網(wǎng)絡(luò)進(jìn)行完全擴(kuò)展的系統(tǒng)。因此?X窗口系統(tǒng)設(shè)計(jì)上遵循Client/server模式?該模式滿足了X窗口系統(tǒng)的完全可擴(kuò)展性,?在網(wǎng)絡(luò)上采用了X協(xié)議封裝實(shí)現(xiàn)了網(wǎng)絡(luò)的透明性。
X窗口系統(tǒng)的Server負(fù)責(zé)管理所有與顯示有關(guān)的資源,不同的硬件平臺(tái)往往對(duì)應(yīng)不同的Server,因此,X Server是與硬件相關(guān)的,往往由硬件廠商提供其驅(qū)動(dòng)。另一方面,由于X窗口系統(tǒng)是基于事件驅(qū)動(dòng)的,因此X Server會(huì)將諸如鼠標(biāo)移動(dòng)等驅(qū)動(dòng)事件傳送給客戶機(jī)。Client根據(jù)程序需要負(fù)責(zé)向Server提出服務(wù)請(qǐng)求,Server根據(jù)Client的請(qǐng)求將涉及圖形部分顯示在顯示設(shè)備上,并將服務(wù)請(qǐng)求結(jié)果回送給客戶機(jī)?整個(gè)流程。因此,X Server的設(shè)計(jì)是由廠商完成,而Client是由用戶設(shè)計(jì),并通過X Server完全將顯示設(shè)備和客戶機(jī)隔離開來,使Client具有可移植性。

X Client的設(shè)計(jì)是通過調(diào)用Xlib庫來實(shí)現(xiàn)對(duì)服務(wù)器的服務(wù)請(qǐng)求,從Xlib中調(diào)用函數(shù),并將請(qǐng)求采用X協(xié)議封裝通過網(wǎng)絡(luò)傳遞給X Server,X Server負(fù)責(zé)依次將請(qǐng)求傳遞給指定設(shè)備,由設(shè)備負(fù)責(zé)處理。Xlib開發(fā)X Client的工作量非常大,在X窗口系統(tǒng)的設(shè)計(jì)中經(jīng)常使用Xt庫和窗口組件集。Xt庫提供了多種用于容納數(shù)據(jù)和提供用戶界面的對(duì)象,稱作組件或Widget,并管理Widget的幾何特性和事件處理。在Xt庫提供的Widget基礎(chǔ)上,窗口組件集是建立了一些基本的Widget類和專門化的Widget子類,用以完成用戶界面的各種功能,常見的窗口組件集有Motif、Athena、Qt和Gnome等庫。
6. X server
X Server 是一個(gè)跟蹤所有輸入信息的程序,這些輸入信息來自鍵盤和鼠標(biāo)器等輸入設(shè)備及任何正在運(yùn)行的其他客戶程序。服務(wù)器起到客戶應(yīng)用程序和本地工作站硬件之間的媒介的作用執(zhí)行下列任務(wù):
- 允許多個(gè)客戶程序訪問多屏工作站
- ·解釋理解從客戶程序來的網(wǎng)絡(luò)消息
- 通過發(fā)送網(wǎng)絡(luò)消息把用戶的輸入傳送給客戶程序
- 繪制二維圖形,這些圖形是由多屏工作站服務(wù)器而不是由客戶程序完成的
- 把復(fù)雜的數(shù)據(jù)結(jié)構(gòu) ,包括窗口 、光標(biāo) 、字體和圖形信息作為資源來維護(hù),由服務(wù)器維護(hù)資源就減少了由每個(gè)客戶程序維護(hù)的數(shù)據(jù)量 , 也減少了必須在網(wǎng)絡(luò)上傳送的數(shù)據(jù)量
從結(jié)構(gòu)的觀點(diǎn)看,X Server可分為三個(gè)層次:頂層是與設(shè)備無關(guān)部分,負(fù)責(zé)接收和解釋符合協(xié)議格式的客戶請(qǐng)求消息,中間層是與操作系統(tǒng)相關(guān)部分,這部分使能接口到特定的操作系統(tǒng);低層是與設(shè)備相關(guān)部分,這是特定支持硬件的設(shè)備驅(qū)動(dòng)程序集。

X Server 通過X協(xié)議與客戶程序的X協(xié)議 xlib接口通信,有四類通過協(xié)議傳遞的信息:請(qǐng)求、響應(yīng)、事件和錯(cuò)誤。協(xié)議請(qǐng)求由xlib產(chǎn)生并送到服務(wù)器,請(qǐng)求可以攜帶各種各樣的信息,如一個(gè)畫線說明,對(duì)當(dāng)前某個(gè)窗口尺寸的詢問等。服務(wù)器把協(xié)議對(duì)某些請(qǐng)求的響應(yīng)送給xlib,不是所有的請(qǐng)求都能通過響應(yīng)得到答復(fù),如畫圖請(qǐng)求就不產(chǎn)生答復(fù)。事件是服務(wù)器傳給xlib的,它含有關(guān)于某個(gè)設(shè)備動(dòng)作的信息,事件是客戶程序用以獲取信息的主要手段。錯(cuò)誤有兩種,一種是可恢復(fù)性錯(cuò)誤,另一種是致命性錯(cuò)誤,由服務(wù)器發(fā)送到xlib的某一個(gè)錯(cuò)誤管理庫程序。
在這四種信息包中,請(qǐng)求和事件是主要的,Xlib先將請(qǐng)求存儲(chǔ)起來,不是立即送給服務(wù)器,在適當(dāng)?shù)那闆r下再送到請(qǐng)求緩沖區(qū)的內(nèi)容到服務(wù)器中。一旦用戶引發(fā)了事件,而且網(wǎng)絡(luò)允許,服務(wù)器就把事件送往xlib,xlib為每個(gè)服務(wù)器管理一個(gè)事件隊(duì)列,每當(dāng)來自服務(wù)器的事件到達(dá),就被排隊(duì),等待客戶程序讀取。
7. X client
Xlib是X窗口系統(tǒng)的C語言編程接口,是向應(yīng)用程序提供底層的編程接口。Xlib把參數(shù)封裝為協(xié)議請(qǐng)求,通過IPC機(jī)制發(fā)送給服務(wù)器進(jìn)程。Xlib共有320多個(gè)函數(shù),可分為系統(tǒng)功能(連接的建立和拆除等)、窗口功能(窗口屬性與操作)、圖形功能(圖元、圖形屬性、正文字體、區(qū)域、圖像等)、色彩功能(顏色表操作等)、時(shí)間功能(輸入時(shí)間及窗口事件)及其它功能(使用函數(shù)等)。
X Client不用標(biāo)準(zhǔn)的 C 函數(shù)來獲取輸入,而是接收事件,然后根據(jù)事件類型發(fā)生分支,執(zhí)行適當(dāng)?shù)捻憫?yīng)。傳統(tǒng)程序是由程序控制,在確定的時(shí)間查詢確定類型的輸入。X 程序絕大多數(shù)情況是由 用戶控制,在任何時(shí)間為任何類型事件的發(fā)生做好準(zhǔn)備。
事件在 X 應(yīng)用程序編程中處于中心地位。X Client使用事件與服務(wù)器或其他客戶端進(jìn)行通信。從程序員的角度看,一個(gè)事件可以包含很多信息:
應(yīng)用程序想獲取的信息,比如用戶輸入、其他客戶端傳來的有用信息。
其他客戶端想知道你的應(yīng)用程序正在做的一些事情,比如將可用文本傳輸給第三方客戶端。
窗口管理器想知道的一些信息,比如在映射視窗時(shí),應(yīng)用程序發(fā)送的一個(gè)想改變屏幕布局的請(qǐng)求報(bào)文。
X Client對(duì)事件的處理過程分為三步:首先,選擇每個(gè)視窗都需要的事件。然后,將視窗映射到屏幕上。最后,當(dāng)事件產(chǎn)生后,應(yīng)用程序提供一個(gè)事件循環(huán)(Event Loop)來從事件隊(duì)列中一一讀取事件并處理之。這個(gè)過程非常簡單,唯一復(fù)雜的因素是各種事件可能同時(shí)發(fā)生,而且同一事件在不同的視窗發(fā)生可能具有不同的意義。所以,必須要了解每個(gè)事件產(chǎn)生的特定環(huán)境來確保應(yīng)用程序會(huì)采取正確的行為來處理它。

8. X 協(xié)議
X Window系統(tǒng)網(wǎng)絡(luò)協(xié)議即X11協(xié)議定義了在客戶和服務(wù)器之間傳送信息所使用的數(shù)據(jù)結(jié)構(gòu)即信息格式定義。它是一個(gè)基于流處理通信而不是基于過程或核心調(diào)用的異步接口。X11的實(shí)現(xiàn)有許多種,其中用C語言實(shí)現(xiàn)的函數(shù)庫Xlib提供了直接訪問協(xié)議的原語,提供了信息交換的能力。
X.11.3共有120多個(gè)請(qǐng)求,且具有可擴(kuò)充性,描述了客戶與服務(wù)器進(jìn)程通信的結(jié)構(gòu)、語法及語義。X 協(xié)議的主要特點(diǎn)如下:
協(xié)議將用戶接口事件和核心窗口系統(tǒng)本身分開,就是窗口管理器與圖形用戶接口的模式,這一特點(diǎn)表現(xiàn)在協(xié)議本身與用戶接口的策略無關(guān)。簡而言之,接口策略即為各個(gè)窗口在顯示終端的布局,窗口大小、位置的控制,這些策略在一個(gè)高級(jí)程序中由應(yīng)用程序本身去完成。窗口的動(dòng)態(tài)布局管理是由窗口管理器來完成的,這一特點(diǎn)有利于實(shí)現(xiàn)與操作系統(tǒng)和顯示沒備無關(guān)。
協(xié)議提供了網(wǎng)絡(luò)透明性,開發(fā)者使用協(xié)議函數(shù)而不需了解下層的網(wǎng)絡(luò)如何完成各種數(shù)據(jù)和管理信息傳輸。
為了減小網(wǎng)絡(luò)開銷,提高網(wǎng)絡(luò)性能,客戶和服務(wù)器之間的通信是異步的。也就是說,在客戶和服務(wù)器之間傳送的大多數(shù)報(bào)文不必直接由對(duì)等實(shí)體給出應(yīng)答。當(dāng)一個(gè)報(bào)文被客戶或服務(wù)器發(fā)送后,接收和處理都被默認(rèn)為正確地進(jìn)行。這個(gè)假定加快了X11的操作,因?yàn)樵诩俣ňW(wǎng)絡(luò)傳輸是可靠的情況下,客戶或服務(wù)器不必等待X11應(yīng)答。實(shí)際執(zhí)行所帶來的遲延如果超過一定限度,則協(xié)議規(guī)定重發(fā)請(qǐng)求。
提高網(wǎng)絡(luò)性能的另一種方法是將許多相關(guān)的請(qǐng)求或應(yīng)答合成一組用一個(gè)數(shù)據(jù)包分組發(fā)送,這大大縮小了在網(wǎng)絡(luò)中傳輸?shù)姆纸M個(gè)數(shù)?;谶@一特點(diǎn),X11協(xié)議有時(shí)也被稱為面向塊的協(xié)議,不同的實(shí)現(xiàn)解決服務(wù)數(shù)據(jù)包的分解和重組的方法有所不同。
用OSI的觀點(diǎn)來看,X11被認(rèn)為是一個(gè)支持分布式應(yīng)用的協(xié)議,但該協(xié)議并不提供太多的諸如中的第一層到第六層所提供的服務(wù),因此被認(rèn)為最接近應(yīng)用層。但由于X11在中存在著表示層數(shù)據(jù)表示,會(huì)話層維護(hù)一次會(huì)話,確定異步請(qǐng)求和應(yīng)答的特點(diǎn),很多人認(rèn)為相當(dāng)于參考模型中的上三層,而其本身應(yīng)作為運(yùn)輸層上的一個(gè)模塊。另一種觀點(diǎn)是從嚴(yán)格的OSI七層結(jié)構(gòu)出發(fā),認(rèn)為X11僅僅能作為一個(gè)應(yīng)用層中的應(yīng)用服務(wù)元素,并將它的服務(wù)原語映射到聯(lián)系控制服務(wù)元素以及表示層服務(wù)上。應(yīng)用層映射觀點(diǎn)則代表了將 X系統(tǒng)映射到 OSI模型的戰(zhàn)略方向。
9. 窗口管理器
在Xwindow系統(tǒng)中,窗口管理器是一種特殊的客戶端程序,其功能是將服務(wù)器和客戶端之間的交互數(shù)據(jù)重定向到窗口管理器中,所以,窗口管理在GUI體系結(jié)構(gòu)中處于中間角色。
窗口管理器是決定X外觀風(fēng)格的重要程序,能夠改變窗口的大小或位置、將窗口在堆疊中重新安排位置、或?qū)⒋翱诟淖兂蓤D標(biāo)等等。在X中,窗口管理器類似于Linux系統(tǒng)中的shell命令行解釋器:shell只是一個(gè)用戶進(jìn)程,如果改變它也就改變了系統(tǒng)的用戶界面。
但是,窗口管理器和X的關(guān)系與shell和命令行的關(guān)系還是有本質(zhì)上的不同。簡單一點(diǎn),沒有窗口管理器也可以使用X,只不過界面簡陋一點(diǎn),使用不太方便;但沒有了shell就沒有了命令行。窗口管理器除了具有管理窗口的基本功能外,還改進(jìn)了界面的品質(zhì)。原來的目的是為了降低鍵盤輸入的需要,而改成盡量多地使用鼠標(biāo)。一個(gè)常見的功能是提供一個(gè)自己可以建構(gòu)的一般性菜單,只要選取一個(gè)菜單選項(xiàng)便可啟動(dòng)窗口應(yīng)用程序。這個(gè)啟動(dòng)的命令通常包含了指示應(yīng)用窗口在何處出現(xiàn)、大小多少、文本用什么顏色等等,使用者不需要輸入很多的信息便能啟動(dòng)應(yīng)用程序。
窗口管理器和客戶端之間遵循ICCCM協(xié)議,大多數(shù)通信建立在父窗口的屬性之上,也可以通過窗口管理器產(chǎn)生的事件進(jìn)行通信。Shell處理客戶端和窗口管理器之間的通信,客戶端不需要直接處理屬性或事件,通過設(shè)定Shell的資源來指定窗口的屬性。
X Client 應(yīng)用程序可以最小化成圖標(biāo)。圖標(biāo)的結(jié)構(gòu)常簡單,只是窗口的代表圖案,當(dāng)系統(tǒng)圖標(biāo)化一個(gè)應(yīng)用窗口時(shí),窗口管理器告訴 Server 不再顯示這個(gè)窗口到屏幕 上。窗口管理器通常提供預(yù)設(shè)的圖標(biāo),但是 Client 應(yīng)用程序可以提供它自己的圖標(biāo)并建議使用,有些窗口管理器接受這個(gè)要求,有些則不接受仍采用自己的圖標(biāo),只把這個(gè)需求當(dāng)作給窗口管理器的提示。
就如同要求顯示一個(gè)特定的圖標(biāo)一樣,應(yīng)用程序也能傳遞其他的提示或信息給窗口管理器,這包括:
- 應(yīng)用程序和圖標(biāo)窗口的名稱
- 當(dāng)應(yīng)用程序和圖標(biāo)窗口被建立時(shí)?它們?cè)谄聊簧系奈恢眯畔?/li>
- 對(duì)窗口大小的限制(例如x?Client可以要求“所占用的窗口長度/寬度不得少于多少”)
- 對(duì)窗口重定大小的特別要求
這種將信息傳遞給窗口管理器的機(jī)制稱之為屬性機(jī)制。大部分重定大小或圖標(biāo)化的工作是通過窗口管理器實(shí)現(xiàn)的,這是因?yàn)樗且粋€(gè)公有的 Client。從理論上來說,任何Client均可隨意重定自己的大小,但如果所有Client都這樣做,便會(huì)造成不必要的混亂。因此,要這些應(yīng)用程序和平共存的原則是:不要自行重定大小,把它交給窗口管理器也就是讓用戶去決定。
窗口管理器負(fù)責(zé)以下3個(gè)核心任務(wù):
- 接受窗口進(jìn)入的消息,并使消息正確路由至目的窗口并觸發(fā)窗口過程;
- 更新活動(dòng)窗口和焦點(diǎn)窗口控件;
- 維護(hù)窗口的序列和各個(gè)窗口的剪切矩形鏈,正確進(jìn)行窗口重繪,執(zhí)行窗口過程。
當(dāng)使用窗口管理器時(shí),服務(wù)器并不直接和其他客戶端通信,而是通過窗口管理器中轉(zhuǎn),當(dāng)一些消息被定義為WM指令時(shí),它們會(huì)被攔截。
X Window努力做到和桌面(Desktop Enviroment)分離, 但還是出現(xiàn)了很多功能上的重合,很多桌面提供者都開始自己制作窗口管理器,并與桌面直接捆綁在一起,例如GNOME 和KDE。

KDE的價(jià)值不僅在于它包含了窗口管理器、文件管理器、工具面板、控制中心以及其他用戶想得到的現(xiàn)代桌面系統(tǒng)應(yīng)包含的組件,其真正的力量體現(xiàn)在內(nèi)部各組成部分之間的互操作能力。KDE試圖建立一個(gè)桌面環(huán)境,而不只是一個(gè)窗口管理器。KDE達(dá)到了令人驚訝的成熟程度,但由于KDE基于的QT庫的許可證問題,有些人拒絕使用它。所幸的是QT庫已開放源代碼,但好像還是沒有變成是基于GPL的方式。
GNOME是GNU網(wǎng)絡(luò)對(duì)象模型環(huán)境的縮寫,項(xiàng)目的目標(biāo)是在完全基于免費(fèi)軟件的基礎(chǔ)上建立一個(gè)完整的、用戶友好的桌面環(huán)境。GNOME是GNU項(xiàng)目的一部分,同時(shí)也是開放源碼運(yùn)動(dòng)的一部分,包含一組有一致外觀的小工具和大的應(yīng)用,所有應(yīng)用程序都使用GTK+作為其GUI工具箱。GNOME并不與某個(gè)窗口管理器綁定,它的組件之間的互操作性不限于應(yīng)用,而是可以跨越計(jì)算機(jī)和系統(tǒng)平臺(tái),因?yàn)樗捎昧斯矊?duì)象請(qǐng)求代理結(jié)構(gòu)(CORBA)。同時(shí),它基于的GTK+庫是完全免費(fèi)且開放源碼的,這和Linux的哲學(xué)一致。
10. 從X 到 Wayland
X11已經(jīng)很古老了,X server協(xié)議提供的大部分功能不再使用,X11所做的幾乎所有工作都重新分配給了各個(gè)應(yīng)用程序和窗口管理器。
Wayland 由X Org開發(fā)人員Kristian Hogsberg于2008年作為個(gè)人項(xiàng)目開始。它是一種通信協(xié)議 ,用于指定顯示服務(wù)器與其客戶端之間的通信。Wayland最初是作為一個(gè)免費(fèi)的開源項(xiàng)目開發(fā)的,目的是用現(xiàn)代、安全和簡單的窗口系統(tǒng)代替X11。

在Wayland中,Compositor是一個(gè)窗口管理器,它為應(yīng)用程序提供每個(gè)窗口的屏幕外緩沖區(qū)。窗口管理器將窗口緩沖區(qū)合成為代表屏幕的圖像,并將結(jié)果寫入顯示內(nèi)存。Wayland協(xié)議允許合成器將輸入事件直接發(fā)送到客戶端,并讓客戶端將事件直接發(fā)送到合成器。與X情況一樣,客戶端在接收到事件時(shí)會(huì)作為響應(yīng)更新用戶界面。但是,在Wayland中,渲染發(fā)生客戶端,并且客戶端只是向合成器發(fā)送請(qǐng)求以指示已更新的區(qū)域。Wayland的”直接渲染架構(gòu)”徹底結(jié)束了傳統(tǒng)X 系統(tǒng)在渲染圖形時(shí)需要不停的向Server請(qǐng)求、確認(rèn)再繪制這個(gè)繁瑣的過程,理論上響應(yīng)速度有了本質(zhì)的增長。

也就是說,Wayland從根本上消除了”Server+Compositor”的重復(fù)勞動(dòng),僅有且只需要有一個(gè)”Compositor”合成器而已。Wayland Compositor的角色,就像是”X Server”+”Window Manager”,但它只做自己分內(nèi)之事而已。Wayland構(gòu)架簡單高效,試圖解決”X Window”發(fā)展這么多年來積累的、通過“擴(kuò)展”去解決的那些問題。
但是,到目前為止,現(xiàn)有的絕大多數(shù)應(yīng)用程序都是為X編寫的。在移植所有這些應(yīng)用程序之前,需要維護(hù)Xorg,與Xorg相比,Wayland還不是很穩(wěn)定。
?【參考資料】
https://www.x.org/wiki/
https://wayland.freedesktop.org/
https://en.wikipedia.org/wiki/Wayland_(display_server_protocol)
http://www.gnome.org
http://www.kde.org
https://blog.csdn.net/a8039974/article/details/122867167






























