2007年5月19日星期六

历史

历史
==
当然,Xwindow有悠久的历史和传统,不过那不在我们讨论的范围。您要注意的有两点:

Xwindow 和 Xbox 中的“X”本意是不同的, X 只是 W 后的一个字母,差不多应该这样理解,Xwindow 是 Window 的接班人 (注意,Window不是Windows)

同理,不要把 Xwindow 说成是 Xwindows ,这明显是一个态度或者阶级感情问题……!

架构及原理
=====

众所周知,Xwindow是服务器-客户端架构。这样可以很好的解决远程图形界面的问题。稳妥起见,我给不太了解的弟兄复述一遍:
代码:

X客户端 ┐ ┌ 键盘
X客户端 ┼ X协议 ─ X服务器 ─ 硬件规范 ┼ 鼠标
X客户端 ┘ └ 显示器


Xwindow 由三部分构成:
----------------------------------

Xserver 服务器端:通过驱动程序(硬件规范)来管理硬件资源。
例如,移动鼠标:鼠标移动时,通过驱动程序(大多数的鼠标不需要专门的驱动程序,因为它们符合某一硬件规范,例如:有四个移动方向和三个键),向 Xserver 发送信息:
“向右移动200点,向上移动100点”(其实是向右上移动),“按下左键”……

Xserver 将这些鼠标移动的相关信息发送到“窗口管理器”,窗口管理器作出判断:
1. 上一次鼠标停止在根窗口内的点600,500
2. 向右200,向上100,现在鼠标位于窗口内的点800,600。
3. 窗口Firefox目前位于所有窗口的最上层, 800,600 这个点正是窗口Firefox的“关闭”按钮
4. 窗口管理器根据预设动作,将 “点击Firefox窗口的关闭按钮” 翻译为 “关闭窗口Firefox”
5. 窗口管理器向 Firefox 发送一个“退出”消息

这个过程中,Xserver控制显示子系统,在屏幕上显示鼠标的移动和点击



Xclient 客户端: 通过X协议,实现与Xserver 的交互。
例如 :
1. Xclient (假设Firefox) 接收Xserver的消息: 输入焦点在地址栏的范围内,“ubuntu.org.cn”,回车
2. Firefox根据预设动作,将这些消息识别为 “打开链接 ubuntu.org.cn”
3. Firefox向域名服务器请求 链接 “ubuntu.org.cn”。域名服务器将这个请求转换为 “http://ubuntu.org.cn/” 和 IP地址211.148.131.7,发送回 Firefox
4. Firefox将 “http://ubuntu.org.cn/”显示在地址栏(向Xserver发送请求,在地址栏位置显示这个地址)
5. Firefox向地址 211.148.131.7 请示显示页面。
6. Firefox 将服务器发送回的页面显示在主窗口中


Xprotocol 协议: Xserver和Xclient通信的规则



WM 窗口管理器:
------------------------------------------

一种特殊的Xclient。使用窗口管理器时,Xserver并不直接与其它Xclient通信,而是通过WM这个Xclient中转,一些消息会被拦截,因为它们被定义为WM的消息,例如拖动标题栏……

来具体了解下,“打开链接 ubuntu.org.cn”的消息:
输入焦点在地址栏的范围内,“ubuntu.org.cn”,回车
Xserver并不能直接判断焦点,而是这样:
Xserver 向WM发送位置和点击的信息,WM根据当前的“焦点策略”确定激活(最上层)的窗口Firefox ,Xserver将Firefox显示在最上层,高亮显示它的标题栏
在窗口Firefox内点击地址栏,或者 Ctrl+L,Xserver将位置信息发送给WM,WM再发送给Firefox
Firefox 判断当前焦点后,显示一个闪动的文字输入光标,将它通过WM发送给Xserver,Xserver在屏幕相应位置进行显示

那么“窗口管理器”到底能作些什么呢?其实它所作的一切都是管理窗口。例如:
1. 最上层的窗口会把其它窗口挡住
2. 它通常是一个“已激活窗口”,根据不同的“焦点策略”,窗口管理器确定被激活的窗口。激活窗口标题栏高亮显示,接收大部分的键盘消息和窗口内的鼠标点击消息。
3. 为了美观和容易分辨,大多数窗口都要有标题栏和边框。为了方便,标题栏上还要有一些按钮,比如:最小化,最大化,关闭(这些按钮是窗口管理器请求的小窗口)
4. 一个窗口可以在另一个窗口旁边显示,而不一定完全被遮挡。为了实现这一点,就要控制窗口显示的位置
5. 为了控制窗口的显示位置,需要将整个屏幕用座标描述,最好的办法是绘制一个填充整个屏幕的窗口,也就是根窗口。
6. 因为根窗口是最大的,所以它可以严严实实的遮挡任何窗口,为了避免这一点,根窗口永远在最底层。这很形象的说明了为什么它叫作“根窗口” ……root
7. 根窗口不一定只有一个,大多数的窗口管理器可以使用 “工作区” ,来切换显示多个根窗口
8. 根窗口固定位置上通常放置一些其它Xclient的窗口,例如底部面板,顶部面板,侧面板,程序启动图标
9. 面板上又可以放一些其它的Xclient窗口,如任务条,启动栏,菜单……任务条可以以图标显示正在运行的任务,还可以作其它的杂活,像自动挂载USB设备……







启动流程
====
我们知道 init 是linux的根进程,是所有进程的父进程。同样, xinit是所以Xwindow进程的根进程


--------------------------

startx 命令可以在命令行下启动图形界面。实际上,执行startx 命令时,通常是执行这一个命令
xinit /etc/X11/xinit/xinitrc -- /etc/X11/xinit/xserverrc
根据脚本 /etc/X11/xinit/xserverrc启动Xserver,并且根据脚本 /etc/X11/xinit/xinitrc 启动X进程,例如窗口管理器

事实上,startx启动时,脚本/etc/X11/xinit/xserverrc 以预设的参数运行程序 /usr/bin/X11/X
/etc/X11/xinit/xinitrc脚本则指向 /etc/X11/Xsession,然后依次启动/etc/X11/Xsession.d目录中的脚本,(您可以在用户配置文件 ~/.Xsession 中定义使用的WM,它的优先级高于全局配置文件)

startx 启动时,并没有一个要求填写用户名和密码的界面,这是因为启动的是/etc/X11/Xsession.d/gnome-session ,而不是GDM


---------------------------

Ubuntu系统可以自动进入图形界面,而不需要运行 startx 命令
在某些启动级别中,有 gdm的启动脚本,例如 : /etc/rc2.d/S13gdm
它能够启动 /etc/X11/default-display-manager 这个文件中的窗口管理器 /usr/sbin/gdm
gdm在启动时,会要求用户名和密码,也就是我们看到的登录界面




Xwindow的主要配置文件
==================

X服务器
---------------------------

X服务器的主要配置文件为 /etc/X11/xorg.conf

代码:

Section "ServerLayout"
Identifier "Default Layout"
Screen "Default Screen" 0 0
InputDevice "Generic Keyboard"
InputDevice "Configured Mouse"
EndSection

服务器布局:已激活输入、显示设备的名称

Section "Module"
加载的模块

Section "Files"
X核心字体路径

代码:

Section "Screen"
Identifier "Default Screen"
Device "ATI Technologies, Inc. RV370 5B62 [Radeon X600 (PCIE)]"
Monitor "DELL E176FP"
DefaultDepth 24
SubSection "Display"
Depth 1
Modes "1280x1024" "1152x864" "1024x768" "800x600" "720x400" "640x480"
EndSubSection

服务器布局中定义的显示设备。 包括 显卡、显示器、默认色深、可用分辨率

代码:

Section "Device"
Identifier "ATI Technologies, Inc. RV370 5B62 [Radeon X600 (PCIE)]"
Driver "fglrx"
Option "KernelModuleParm" "agplock=0"
VideoRam 131072
EndSection

名为 "ATI Technologies, Inc. RV370 5B62 [Radeon X600 (PCIE)]" 的 "Device"
Driver 为驱动。如果不能正常启用图形界面,首先尝试 “vesa”

…………

整个配置文件的结构是这样的:
代码:


├/Section "ServerLayout" 布局
│ ├Section "InputDevice" keyboard 键盘
│ ├Section "InputDevice" mouse 鼠标
│ │
│ └ /Section "Screen" 显示
│ ├Section "Monitor" 显示器
│ ├Section "Device" graphcard 显卡


├Section "Files" 字体
└Section "Module" 模块









X客户端
----------------------------

在/etc/X11/Xsession文件中可以发现下列内容
代码:

OPTIONFILE=/etc/X11/Xsession.options

SYSRESOURCES=/etc/X11/Xresources
USRRESOURCES=$HOME/.Xresources

SYSSESSIONDIR=/etc/X11/Xsession.d
USERXSESSION=$HOME/.xsession
ALTUSERXSESSION=$HOME/.Xsession
ERRFILE=$HOME/.xsession-errors

OPTIONFILE=/etc/X11/Xsession.options 设定X进程的启动参数 例如允许用户进程allow-user-xsession
Xresources 为X资源文件。许多程序保留了X接口,允许X服务器管理一些视觉选项,例如窗口内的字体,配色等
xsession为X进程,可以设置一些启动时自动运行的程序,也可以用来设定自己的窗口管理器(窗口管理器和桌面环境或者登录管理器是无关的)




字体
====

freetype渲染引擎
--------------------------
作为Xorg服务器的一个模块,freetype的功能包括读取Truetype字体信息,如大小、分辨率、编码等,并以之为依据渲染字体
freetype2.x相对于freetype1.x 增加了抗锯齿等功能
(/etc/X11/xorg/conf 的 Module 字段中,可以选择使用的字体渲染模块,建议使用默认的freetype )

freetype只负责渲染字体。而查找字体,则可以由X服务器、X客户端或者字体服务器来完成。
找到字体后,使用freetype引擎就地渲染


X服务器根据X客户端的请求(字符编码),查找字体并进行渲染,然后显示,我们称之为X核心字体

X客户端自行查找字体并进行渲染,X服务器只负责显示,我们称之为Xft字体
由于Xft字体的渲染在客户端完成,所以它可以动态的加载,而不需要随同X服务器一同启动

另外还有一种字体服务器模式,例如Xfs字体:当客户端请求字体时,X服务器将请求转发到字体服务器,由字体服务器查找字体,并使用freetype引擎渲染,将结果传回X服务器,X服务器进行显示……


X核心字体
---------------------
/etc/X11/xorg.conf 中可以配置X核心字体的搜索路径。

代码:

Section "Files"
FontPath "/usr/X11R6/lib/X11/fonts/misc/"
FontPath "/usr/X11R6/lib/X11/fonts/Type1/"
FontPath "/usr/X11R6/lib/X11/fonts/Speedo/"
FontPath "/usr/X11R6/lib/X11/fonts/100dpi/"
FontPath "/usr/X11R6/lib/X11/fonts/75dpi/"
EndSection


当X客户端向X服务器请求显示文字的时候,X服务器会按上面列表的先后顺序查找字体
例如:显示中文时,如果第一个路径中的字体不包含中文,则查找下面的路径,直到发现中文字体
请把您偏好的字体放在最上的位置

要使安装的字体能够作为X核心字体使用,将字体的安装路径添加到上面的列表中,使用 mkfontscale、mkfontdir扫瞄文件夹中的字体,并生成索引,就可以了(建议使用 ttmkfdir 生成fonts.scale ,将其复制为fonts.dir)

字体的选择及显示风格,可以修改GTK1的配置文件,或者在Xresources文件中对程序单独进行定义

事实上,在我们的日常应用中,X核心字体环境并不常见,使用GTK1图形库的程序、某些类型的终端……Emacs也是这样一个老派的程序……不过Emacs23中刚刚加入了xft字体的支持Laughing






Xft字体
--------------------------
Xft字体相关选项在 /etc/fonts/fonts.conf 文件中配置

Xft字体可以使用命令 fc-cache 安装, 递归扫瞄以下目录中的字体(包括子文件夹中的字体),并建立字体缓存

/usr/share/X11/fonts
/usr/share/fonts
/usr/local/share/fonts
~/.fonts
(/etc/fonts/fonts.fonf ""字段)


多数支持GTK2或者Qt图形库的X客户端能够使用Xft字体渲染技术 (GTK2为Gnome使用的图形库,Qt为KDE使用的图形库。相对来说,GTK2图形库在程序的GUI设计中更加通用)

如果需要安装字体,只要把字体拷贝到以上任何一个目录, fc-cache -fv 刷新字体缓存即可 (参数 -f 为强制刷新,-v 显示过程)

fc-list 能够列出所有可用字体

字体的选择及显示风格,可以修改GTK2或者Qt的配置文件,建议使用图形界面配置(通常桌面环境中附带了相关程序,例如gnome-font-properties)

没有评论: