【zz】Linux的X窗口系统结构说明

http://blog.chinaunix.net/u/30686/showart.php?id=1946051

一、说明
以X Server为中心,简要地分为四层,如图所示


二、X方式与Framebuffer方式的差异

1.         X方式

1)        什么是X
我们常说的X Window,X,X11(指X协议的11版本)一般指X协议,或指是基于X协议的X服务端程序(X Server)

2)        X Server与X Client

a)         X协议指X Server及X Client组成的c/s架构,及其通讯协议的实现

b)        X Server有主事件循环,由它来处理用户输入、显示及与X Client通讯

c)        X Client即X桌面上运行的普通应用程序
应用程序如果想显示数据,需要利用X Lib库建立X窗口(X Client),它通过X协议与X Server通讯,让X Server完成显示;X Server会把接到键盘鼠标事件,传给焦点所在的X Client处理

2.         Framebuffer方式
Framebuffer方式相对简单,它由内核直接支持,通常用于嵌入式系统。应用程序可以得到屏幕显示区域的指针,然后对其写数据来进行显示,其中窗口的概念不强,它自身不带窗口管理,需要应用软件自己管理窗口。比如qtopia基本于framebuffer显示时,qtopia自身实现了窗口管理功能

3.         应用程序的显示方式
很多应用程序同时支持X和Framebuffer两种模式显示,如gtk,qt等,以下我们只讨论它基本于X实现的部分

三、分层

1.         应用层(Application)
指X Window上运行所有带图形界面的应用程序,每个窗口都是一个X Client

1)        X Lib app
直接使用X函数的应用程序,这种程序一般界面简单,比较底层,比如很多窗口管理器直接写在这层

2)        Gtk app
gtk又分为gtk和gdk两层,
gtk为控件及主循环的实现
gdk相对底层,控制底层绘图部分,它支持framebuffer、X11、DirectFb等
应用程序可调用gtk函数,也可直接调用gdk函数
gtk常和cairo一起实现二维特效

3)        Qt app
Qt也通过调用X Lib实现图形界面
Qt的优势在于它是C++实现的,使用起来程序结构更好,也有较成熟的嵌入式版本

4)        SDL app
SDL也通过调用X Lib实现图形界面
SDL更底层,代码少,没有控件,但做特殊效果很好用

2.         窗口管理器层(Window manager简称wm)
Window manager是特殊的X Client,也通过X Lib库与X Server交互,与一般应用不同的是:它负责控制各个窗口的动作,及操作主窗口
WM的功能分为管理(manager)和工具(tools),

1)        Manager
负责各个窗口的建立销毁/显示隐藏/最大最小化/移动缩放,管理窗口队列,设置焦点窗口,窗口切换效果等

2)        Tools
实现桌面工具条,桌面菜单等基本界面及小工具

3)        具体实现
实现通常有两种方式:一种是manager和tools在一个程序中实现,一种是分开两个程序实现,使用时可以随意组合

a)         qvwm, blackbox等较早期的wm,都是manager和tools在一个程序中实现的

b)        xfce、metacity等是分开的,例如:xfce包含tools和manager,但不在一个程序中实现,它的manager是xfwm,我们可在使用xfce时把xfwm替成metacity(metacity是一个manager,不带tools)

3.         X服务器层(X Server)
主循环控制显示,读取设备数据,与X Client通讯,事件循环,并把事件送给焦点窗口

1)        普通X Server
功能完整的X Server,代码量大,支持全,常见的如XFree86,Xorg等

2)        Tiny X Server
一般用于嵌入式系统,资源占用小,代码少,功能及逻辑相对简单,如KDrive(Xvesa/Xchips/Xfbdev/Xi810……)

4.         系统底层(System)

1)        Kernel
与硬件交互,获得输入设备的数据,向显示设备输出

2)        Dev
文件系统中的设备文件,程序通过对它的读写和操作与kernel交互,控制硬件

3)        中间层
在程序和Dev层之间,有时还需要库或程序处理设备数据,比如触摸屏就使用libts去除噪点,过滤出更有效的数据