linux图形编程,linux图形界面编程基本知识
以前看過(guò)這篇文章,不過(guò)當(dāng)時(shí)沒(méi)有博客,現(xiàn)在又一次看到了,記下來(lái):
http://hi.baidu.com/skychen1900/blog/item/9c7b94350a5fae1290ef39fb.html
很多LINUX初學(xué)者分不清楚linux和X之間,X和Xfree86之間,X和KDE,GNOME等之間是什么關(guān)系.常?;煜拍?我想以比較易于理 解的方式說(shuō)明一下X,X11,XFREE,WM,KDE,GNOME等之間的關(guān)系.由于本人水平有限可能存在錯(cuò)誤,請(qǐng)高手指正.
一,linux本身沒(méi)有圖形界面,linux現(xiàn)在的圖形界面的實(shí)現(xiàn)只是linux下的應(yīng)用程序?qū)崿F(xiàn)的.
圖 形界面并不是linux的一部分,linux只是一個(gè)基于命令行的操作系統(tǒng),linux和Xfree的關(guān)系就相當(dāng)于當(dāng)年的DOS和 WINDOWS3.0一樣,windows3.0不是獨(dú)立的操作系統(tǒng),它只是DOS的擴(kuò)充,是DOS下的應(yīng)用程序級(jí)別的系統(tǒng),不是獨(dú)立的操作系統(tǒng),同樣 XFree只是linux下的一個(gè)應(yīng)用程序而已.不是系統(tǒng)的一部分,但是X的存在可以方便用戶使用電腦.WINDOWS95及以后的版本就不一樣了,他們 的圖形界面是操作系統(tǒng)的一部分,圖形界面在系統(tǒng)內(nèi)核中就實(shí)現(xiàn)了,沒(méi)有了圖形界面windows就不成為windows了,但linux卻不一樣,沒(méi)有圖形 界面linux還是linux,很多裝linux的WEB服務(wù)器就根本不裝X服務(wù)器.這也WINDOWS和linux的重要區(qū)別之一.
二,X是協(xié)議,不是具體的某個(gè)軟件:
X 是協(xié)議,就像HTTP協(xié)議,IP協(xié)議一樣.這個(gè)概念很多初學(xué)者甚至學(xué)習(xí)LINUX有一定時(shí)間的人都混淆,一個(gè)基于X的應(yīng)用程序需要運(yùn)行并顯示內(nèi)容時(shí)他就聯(lián) 接到X服務(wù)器,開始用X協(xié)議和服務(wù)器交談.比如一個(gè)X應(yīng)用程序要在屏幕上輸出一個(gè)圓那么他就用X協(xié)議對(duì)X服務(wù)器說(shuō):喂!我需要在屏幕上畫一個(gè)圓.X應(yīng)用程 序只負(fù)責(zé)告訴X服務(wù)器在屏幕的什么地方用什么顏色畫一個(gè)多大的圓,而具體的"畫"的動(dòng)作,比如這個(gè)圓如何生成,用什么顯卡的驅(qū)動(dòng)程序去指揮顯卡完成等等工 作是由X服務(wù)器來(lái)完成的.X服務(wù)器還負(fù)責(zé)捕捉鍵盤和鼠標(biāo)的動(dòng)作,假設(shè)X服務(wù)器捕捉到鼠標(biāo)的左鍵被按下了,他就告訴X應(yīng)用程序:親愛(ài)的應(yīng)用程序先生,我發(fā)現(xiàn) 鼠標(biāo)被按下了,您有什么指示嗎?如果X應(yīng)用程序被設(shè)計(jì)成當(dāng)按下鼠標(biāo)左健后再在屏幕上畫一個(gè)正方形的話,X應(yīng)用程序就對(duì)X服務(wù)器說(shuō):請(qǐng)?jiān)佼嬕粋€(gè)正方形,當(dāng)然 他會(huì)告訴服務(wù)器在什么地方用什么顏色畫多大的正方形,但不關(guān)心具體怎么畫–那是服務(wù)器的事情.
那么協(xié)議是需要具體的軟件來(lái)實(shí)現(xiàn)的,這就是下面我要講的:
三,X和XFree86的關(guān)系.
有 了協(xié)議就需要具體的軟件來(lái)實(shí)現(xiàn)這個(gè)協(xié)議.就好比我們有了交通法規(guī)就需要交警去根據(jù)法規(guī)維護(hù)交通秩序一樣.Xfree86就是這樣一個(gè)去根據(jù)法規(guī)實(shí)現(xiàn)協(xié)議的 "交警".他按照X協(xié)議的規(guī)定來(lái)完成X應(yīng)用程序提交的在屏幕上顯示的任務(wù).當(dāng)然不僅僅是某個(gè)特定的交警才可以去維護(hù)和實(shí)現(xiàn)這個(gè)法規(guī),比如還可以由交通協(xié)管 員來(lái)實(shí)現(xiàn)交通法規(guī),必要的時(shí)候警察也可以介入,當(dāng)然前提是他們都要懂得交通法規(guī),也就是要懂得協(xié)議.所以實(shí)現(xiàn)X協(xié)議的軟件也并不只有 XFree86,XFree86只是實(shí)現(xiàn)X協(xié)議的一個(gè)免費(fèi)X服務(wù)器軟件.商業(yè)上常用MOTIF,現(xiàn)在還有XORG,還有很多很小的由愛(ài)好者寫的小的X服務(wù) 器軟件.甚至可以在WINDOWS上有X服務(wù)器運(yùn)行,這樣你可以在linux系統(tǒng)上運(yùn)行一個(gè)X應(yīng)用程序然后在另一臺(tái)windows系統(tǒng)上顯示.多么神奇. 你可以用google找到這樣的X服務(wù)器軟件.只不過(guò)在LINUX上最常用的是XFree86.(現(xiàn)在的linux發(fā)行版都用Xorg了)順便說(shuō)一句,蘋 果電腦的圖形界面用的也是X協(xié)議,而且被認(rèn)為是做的最好的X協(xié)議圖形界面,并且他對(duì)X協(xié)議的實(shí)施是做在系統(tǒng)內(nèi)核里的,所以性能明顯好很多,這就是為什么很 多大型三維圖形設(shè)計(jì)軟件都是在蘋果平臺(tái)上的原因.
為了便于理解拿HTTP協(xié)議來(lái)比較:
協(xié)議是HTTP (hyper text transmission protocol)
實(shí)現(xiàn)這個(gè)協(xié)議的常用服務(wù)器有:apache IIS 等
請(qǐng)求這些服務(wù)器傳輸文件的客戶有:IE ,MOZILLA ,NETSCAPE等.
協(xié)議是X
實(shí)現(xiàn)這個(gè)協(xié)議的常用服務(wù)器有Xfree86 ,Xorg ,Xnest等
請(qǐng)求這些服務(wù)器來(lái)完成顯示任務(wù)的客戶:所有的X應(yīng)用程序.
只 不過(guò)HTTP協(xié)議的服務(wù)器和客戶端通常都在兩臺(tái)不同的電腦(服務(wù)器和客戶機(jī))之間來(lái)實(shí)現(xiàn),所以一般人對(duì)這個(gè)比較容易理解.而X協(xié)議的服務(wù)器和客戶端程序通 常在同一臺(tái)電腦上,因此很多用戶都感到對(duì)此很難理解.既然是協(xié)議,那么肯定和平臺(tái)無(wú)關(guān)的,因此可以讓X應(yīng)用程序顯示在任何裝有X服務(wù)器的遠(yuǎn)程計(jì)算機(jī)上.甚 至顯示在裝有Xnest服務(wù)器的windows系統(tǒng)上.只不過(guò)在大多數(shù)情況下,X應(yīng)用程序都用本機(jī)的X服務(wù)器,然后X服務(wù)器將顯示結(jié)果輸出到本機(jī)的顯示 器.這也是很多人不理解X是一種協(xié)議的原因.
四,X和X11R6又是什么關(guān)系?
不知道初學(xué)者有沒(méi)有注意到/usr/X11R6這個(gè)目錄,這是XFree的默認(rèn)安裝目錄
X11R6 實(shí)際上是 X Protocol version 11 Release 6
(X協(xié)議第11版第六次發(fā)行)的意思,就是說(shuō)目前用的X協(xié)議是第11版的,然后經(jīng)過(guò)了6次小的修正.不同版本的X協(xié)議是不能通信的.就象我們現(xiàn)在IPV4和IPV6不能通信一樣,不過(guò)不用擔(dān)心,現(xiàn)在的X服務(wù)器軟件和X應(yīng)用程序都遵循X11R6.
另外XFree86 3.3.6 XFree86 4.3.6 等這些版本是實(shí)現(xiàn)X協(xié)議的軟件XFree86的版本號(hào).這是初學(xué)者經(jīng)常高混淆的概念.
協(xié)議版本和實(shí)現(xiàn)協(xié)議的軟件的版本–這兩個(gè)概念的區(qū)別你分清楚了嗎?
五,X服務(wù)器和WM(window manager 窗口管理器)之間是什么關(guān)系.
平時(shí)大家起動(dòng)圖形界面是怎么啟動(dòng)的呢?
如果你是一開己就進(jìn)入圖形界面那就太遺憾了.應(yīng)為你錯(cuò)過(guò)了了解X服務(wù)器起動(dòng)過(guò)程的好時(shí)機(jī).不過(guò)沒(méi)關(guān)系.你打開一個(gè)XTERM輸入:
init 3
就可以安全的回到字符界面.
好了,等做完以下實(shí)驗(yàn)?zāi)憔屯耆靼譞和WM(window manager 窗口管理器)之間是什么關(guān)系了.
先輸入以下命令:
#startx
起動(dòng)圖形界面,你看到的是一個(gè)和平時(shí)使用一樣的完整的圖形界面操作環(huán)境.
你可以最大化,最小化,移動(dòng),關(guān)閉窗口等.
按ctrl+alt+backspace反回字符界面.
輸入:
#xinit
再次啟動(dòng)圖形界面,你看到了什么,你看到一個(gè)XTERM.而且不能移動(dòng).但是你可以在這個(gè)XTERM中輸入命令打開X應(yīng)用程序,如果我輸入:
#mozilla
打開瀏覽器,你看到的瀏覽器和平時(shí)有什么不同嗎?他在屏幕中間,不能移動(dòng),不能最小化,不能最大化,沒(méi)有邊框.
為什么同樣一個(gè)X應(yīng)用程序會(huì)有這樣的不同呢?因?yàn)槲覀冇胹tartx起動(dòng)圖形界面的時(shí)候同時(shí)也啟動(dòng)了一個(gè)WM(即窗口管理器),如果你用KDE就起動(dòng)了KDE,如果你用GNOME就起動(dòng)了GNOME.但是你用xinit起動(dòng)圖形界面的時(shí)候卻沒(méi)有起動(dòng)WM.
現(xiàn)在你明白窗口管理器的作用了嗎?他的作用就是最大化,最小化,移動(dòng),關(guān)閉窗口等.而這些不是X服務(wù)器來(lái)負(fù)責(zé)完成的.
如果你用xinit起動(dòng)圖形界面并在xterm中輸入twm,看看會(huì)有什么?
xterm被加上了一個(gè)邊框,你可以通過(guò)這個(gè)邊框移動(dòng),最大化,最小化這個(gè)xterm,twm就是XFree86中自帶的窗口管理器,是一個(gè)比較簡(jiǎn)陋的最簡(jiǎn)單的窗口管理器,但是他具有窗口管理器的全部特征.
如果你不輸入twm而輸入gnome-session就可以起動(dòng)GNOME
或者輸入startkde起動(dòng)KDE.
通過(guò)以上的實(shí)驗(yàn)?zāi)憔涂梢郧宄拿靼姿麄冎g的關(guān)系.
六,關(guān)于KDE和GNOME
KDE 和GNOME是LINUX里最常用的圖形界面操作環(huán)境,他們不僅僅是一個(gè)窗口管理器那么簡(jiǎn)單, KDE是K Desktop Environment 的縮寫.他不僅是一個(gè)窗口管理器,還有很多配套的應(yīng)用軟件和方便使用的桌面環(huán)境,比如任務(wù)欄,開始菜單,桌面圖標(biāo)等等.
GNOME是GNU Network Object Model Environment 的縮寫.和KDE一樣,也是一個(gè)功能強(qiáng)大的綜合環(huán)境.
另外在其它UNIX系統(tǒng)中,常常使用CDE作為這樣一個(gè)環(huán)境.
其它的小型窗口管理器有:
window maker,after step,blackbox,fvwm,fvwm2,等等都是常用的優(yōu)秀窗口管理器.REDHAT9中有 window maker 但是默認(rèn)不安裝,大家可以裝來(lái)試試.只要xinit再wmaker&就可以用windowmaker了.
七,linux圖形界面層次關(guān)系總結(jié)
linux本身–>X服務(wù)器窗口管理器(綜合桌面環(huán)境)–>X應(yīng)用程序.
Xfree86服務(wù)器的實(shí)現(xiàn)包括兩個(gè)部分,一部分是和顯卡直接打交道的低層,一部分是和X應(yīng)用程序打交道的上層.上層負(fù)責(zé)接收應(yīng)用程序的請(qǐng)求和鼠標(biāo)鍵盤 的動(dòng)作.而和顯卡直接打交道的底層負(fù)責(zé)指揮顯卡生成圖形,其實(shí)就是顯卡驅(qū)動(dòng).上層接收到應(yīng)用程序的請(qǐng)求后,將請(qǐng)求內(nèi)容做適當(dāng)處理,然后交給顯卡驅(qū)動(dòng)來(lái)指揮 顯卡完成畫圖的動(dòng)作.另外,上層的捕捉鍵盤和鼠標(biāo)動(dòng)作的部分會(huì)向應(yīng)用程序提供鼠標(biāo)和鍵盤的狀態(tài)信息,應(yīng)用程序接收到這些信息后決定是否再有相應(yīng)的動(dòng)作.
平時(shí)說(shuō)的VESA,VGA ,fbdev等其實(shí)就是針對(duì)不同模式顯卡的驅(qū)動(dòng)程序.
VESA(Video Electronics Standards Association)
VGA (Video Graphics Array)
fbdev (FrameBuffer Device)
等
都是不同的顯卡標(biāo)準(zhǔn),不過(guò)這些標(biāo)準(zhǔn)都已經(jīng)很老了.現(xiàn)在的顯卡都兼容這幾種模式.
framebuffer模式的顯卡本身不具有任何運(yùn)算數(shù)據(jù)的能力,他好比是一個(gè)暫時(shí)存放水的水池.CPU將運(yùn)算后的結(jié)果放到這個(gè)水池,水池再將結(jié)果流到顯示器.中間不會(huì)對(duì)數(shù)據(jù)做處理.在這中情況下,所有顯示任務(wù)都有CPU完成,CPU負(fù)擔(dān)很重.
從frambuffer這個(gè)名字我們就能猜測(cè)到他的功能了(數(shù)據(jù)偵緩沖).
在linux內(nèi)核中有有framebuffer機(jī)制,摹仿framebuffer顯卡的這種功能.他的好處是把顯卡的硬件結(jié)構(gòu)抽象掉,把所有的顯卡都當(dāng)做一個(gè)"水池"來(lái)用.應(yīng)用程序也可以直接讀取這個(gè)水池的內(nèi)容.framebuffer的設(shè)備名是 /dev/fb
可以用命令:
#dd if=/dev/zero of=/dev/fb
清空屏幕.如果你的X用的是framebuffer的驅(qū)動(dòng),屏幕將全變黑.通過(guò)移動(dòng)鼠標(biāo),切換窗口等動(dòng)作可以讓原先的內(nèi)容重新顯示.
如果你不用framebuffer驅(qū)動(dòng),可以在字符模式下做這個(gè)試驗(yàn).屏幕將全部被清空.
以下的命令:
#dd if=/dev/fb of=fbfile
可以將fb中的內(nèi)容保存下來(lái),以后可以重新寫回屏幕:
#dd if=fbfile of=/dev/fb
作用類似于屏幕截圖,但是截下的圖不能用普通圖片瀏覽器看.
現(xiàn)在知道linux中framebuffer設(shè)備的神奇了吧.
linux字符界面在高分辨率下,啟動(dòng)時(shí)會(huì)有一個(gè)小企鵝logo,這個(gè)logo就是用framebuffer功能寫上屏幕的.
VESA和VGA比FB要好很多,但是他的顯示能力也很有限.CPU仍舊要處理大部分的顯示任務(wù).
現(xiàn) 在的顯卡就不一樣了,CPU幾乎不參數(shù)顯示任務(wù),而專注于運(yùn)算工作.我們平時(shí)在linux下裝顯卡驅(qū)動(dòng),其實(shí)就是替換掉XFree86中底層的那一部分. 使他有更強(qiáng)的顯示能力.比如你的顯卡是nvidia的,XFree默認(rèn)的驅(qū)動(dòng)是"nv",他是一個(gè)nvidia顯卡的通用驅(qū)動(dòng),但是他不能發(fā)揮 nvidia顯卡的性能.這個(gè)"nv"驅(qū)動(dòng)模塊可以在:
/usr/X11R6/lib/modules/drivers
目錄下找到,文件名是:nv_drv.o
這個(gè)目錄下還有很多顯卡驅(qū)動(dòng)模塊.
apm_drv.o dummy_drv.o nsc_drv.o sis_drv.o
ark_drv.o fbdev_drv.o nv_drv.o tdfx_drv.o
ati_drv.o glint_drv.o r128_drv.o tga_drv.o
atimisc_drv.o i128_drv.o radeon_drv.o trident_drv.o
chips_drv.o i740_drv.o rendition_drv.o tseng_drv.o
cirrus_alpine.o i810_drv.o s3_drv.o vesa_drv.o
cirrus_drv.o linux s3virge_drv.o vga_drv.o
cirrus_laguna.o mga_drv.o savage_drv.o
cyrix_drv.o neomagic_drv.o siliconmotion_drv.o
fbdev vga evsa 等都在其中.
只要在XF86Conf文件中的Section module段中指定了什么驅(qū)動(dòng),X就用哪個(gè)驅(qū)動(dòng).
代碼:
Section "Module"
Load "dbe"
Load "extmod"
Load "fbdevhw" #這里用的是fbdev
Load "glx"
Load "record"
Load "freetype"
Load "type1"
Load "dri"
EndSection
這是XFree86 4.0以上版本的方法.即X主程序和驅(qū)動(dòng)模塊是分開的.
主程序是/usr/X11R6/bin/XFree86 (即上層部分)
然后主程序啟動(dòng)的時(shí)候根據(jù)配置文件決定用哪一個(gè)驅(qū)動(dòng).
但是,在XFree86以前的版本(3.3.6)中, X主程序和驅(qū)動(dòng)模塊是合在一起的,因此,以前的Xfree86 3.3.6 有很多針對(duì)不同顯卡的版本.
另外其他的X服務(wù)器如KDrive 也是驅(qū)動(dòng)也主程序整合的,因此同樣是KDrive X服務(wù)器會(huì)有 VESA ,SVGA ,和 fbdev的版本之分.因?yàn)檫@些都是輕量級(jí)的X服務(wù)器,為了簡(jiǎn)化結(jié)構(gòu)他做成這樣.
Xfree86 4 做成驅(qū)動(dòng)和主程序分離的好處是用戶可以自己添加升級(jí)驅(qū)動(dòng).
總結(jié)
以上是生活随笔為你收集整理的linux图形编程,linux图形界面编程基本知识的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: QTextStream格式带中文对齐输出
- 下一篇: CSS:font-family常用字体中