[原创]Xwindow简介

新手涉及到的教学或入门贴,推荐新手必看,版主维护
kardinal
帖子: 750
注册时间: 2006-03-19 11:39

[原创]Xwindow简介

#1

帖子 kardinal » 2006-08-03 1:11

………………本来是 viewtopic.php?t=18740 这个教程的一部分……不过最终还没有搞定,因此惭愧的把已经得出的结论拿出来,请各位高手指点迷津……

代码: 全选

    Xwindow是工作站图形系统的工业标准,它有多种不同的实现,Ubuntu系统中使用的为Xorg。

    (比较前卫的图形界面系统XGL,实际代替X服务器的作用,另外还有与之配套的窗口管理器)

历史

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

        * Xwindow 和 Xbox 中的“X”本意是不同的, X 只是 W 后的一个字母,差不多应该这样理解,Xwindow 是 Window 的接班人 (注意,Window不是Windows)
        * 同样,也不要把 Xwindow 说成是 Xwindows,那是一种亵渎!一切伟大的创造,都应得到应有的理解和尊重。

架构及原理

    Xwindow使用服务器-客户端架构。无论本地图形界面,还是远程图形界面,都以同样的流程工作。这样便不需要分别进行设计和维护,极大的提高了网络透明性。

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

Xserver

    Xwindow系统服务器端,通过驱动程序(硬件规范)来管理硬件资源。

    例如:当我们移动鼠标时,通过驱动程序 [5] ,向 Xserver 发送信息:

    “向右移动200点,向上移动100点”(向右上移动);“按下左键”……

    Xserver作出如下响应:
        1、上一次鼠标停止的坐标为600,500
        2、向右200,向上100。现在鼠标位于坐标800,600
        3、坐标800,600处,为窗口Firefox的“关闭”按钮
        4、根据预设动作,将 “点击Firefox窗口的关闭按钮” 翻译为 “关闭窗口Firefox”
        5、向X客户端Firefox发送一个“退出”消息
        6、Xserver通过显示子系统(显卡、显示器),全程显示鼠标的位置和移动

        * 事实上,向程序发送“退出”信号,通常窗口管理器完成……为了描述方便,这里暂不区分。稍后,我们将向您介绍 窗口管理器 的其它一些细节。

[5]	大多数的鼠标不需要专门的驱动程序,因为它们符合某一硬件规范,例如:有四个移动方向和三个键
Xclient

    Xwindow系统客户端,通过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

    Xwindow系统协议,Xserver和Xclient之间进行通信的规则

窗口管理器

    Window Manager,一种特殊的Xclient。

    使用窗口管理器时,Xserver并不直接与其它Xclient通信,而是通过WM中转,当一些消息被定义为WM指令时,它们会被拦截。例如Alt+F4关闭窗口、拖动标题栏……

    消息“打开链接 ubuntu.org.cn”,具体内容如下:

    输入焦点在地址栏的范围内,“ubuntu.org.cn”,回车

    Xserver并不能直接判断焦点,而是这样:
        1、Xserver向WM发送位置和点击的信息,WM根据当前的“焦点策略”确定激活(最上层)的窗口为Firefox
        2、Xserver将Firefox显示在最上层,高亮显示它的标题栏
        3、在窗口Firefox内点击地址栏,或者 Ctrl+L,Xserver将位置信息发送给WM,WM再发送给Firefox
        4、Firefox判断当前焦点后,显示一个闪动的文字输入光标
        5、Firefox将输入光标通过WM发送给Xserver,Xserver在屏幕相应位置进行显示

    那么,“窗口管理器”到底能作些什么呢?其实它所作的一切都是管理窗口。例如:

       1. 最上层的窗口会把其它窗口挡住

       2. 它通常是一个“已激活窗口”,根据不同的“焦点策略”,窗口管理器确定被激活的窗口。
          激活窗口标题栏高亮显示,接收大部分的键盘消息和窗口内的鼠标点击消息。

       3. 为了美观和容易分辨,大多数窗口都要有标题栏和边框。
          为了方便,标题栏上还要有一些按钮,比如:最小化,最大化,关闭(这些按钮是窗口管理器请求的小窗口)

       4. 一个窗口可以在另一个窗口旁边显示,而不一定完全被遮挡。为了实现这一点,就要控制窗口显示的位置

       5. 为了控制窗口的显示位置,需要将整个屏幕用座标描述,最好的办法是绘制一个填充整个屏幕的窗口,也就是根窗口。

       6. 因为根窗口是最大的,所以它可以严严实实的遮挡任何窗口,为了避免这一点,根窗口永远在最底层。
          这很形象的说明了为什么它叫作“根窗口” ……root

       7. 根窗口不一定只有一个,大多数的窗口管理器可以使用 “工作区” ,来切换显示多个根窗口

       8. 根窗口固定位置上通常放置一些其它Xclient的窗口,例如底部面板,顶部面板,侧面板,程序启动图标

       9. 面板上又可以放一些其它的Xclient窗口,如任务条,启动栏,菜单……
          任务条可以以图标显示正在运行的任务,还可以作其它的杂活,像自动挂载USB设备……

启动流程

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

    Startx

        startx 命令可以在命令行下启动图形界面。执行startx 命令时,实际执行这一命令:

        xinit /etc/X11/xinit/xinitrc -- /etc/X11/xinit/xserverrc

        根据脚本 /etc/X11/xinit/xserverrc 启动Xserver,同时根据脚本 /etc/X11/xinit/xinitrc 启动指定Xclient进程,例如窗口管理器


        脚本 /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

    GDM会话

        Ubuntu系统启动时自动进入图形界面,不需要运行 startx 命令

        在某些启动级别中,包含了gdm的启动脚本,例如 : /etc/rc2.d/S13gdm

               1. 指向 /etc/gdm/gdm-cdd.conf 文件,加载预设视觉主题,启动 /usr/lib/gdm/gdmgreeter(登录屏幕)
               2. 用户身份认证完成后,启动 /etc/X11/default-display-manager 这个文件中设定的默认窗口管理器 /usr/sbin/gdm

        gdm在启动时,会要求用户名和密码,也就是我们看到的登录屏幕(gdmgreeter)

            * /usr/share/xsessions 目录下为所有可用登录会话的脚本

上次由 kardinal 在 2006-08-09 1:04,总共编辑 10 次。
kardinal
帖子: 750
注册时间: 2006-03-19 11:39

#2

帖子 kardinal » 2006-08-03 1:13

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进程,可以设置一些启动时自动运行的程序,也可以用来设定自己的窗口管理器(窗口管理器和桌面环境或者登录管理器是无关的)
上次由 kardinal 在 2006-08-06 3:55,总共编辑 1 次。
kardinal
帖子: 750
注册时间: 2006-03-19 11:39

#3

帖子 kardinal » 2006-08-03 17:10

字体
====

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字体的支持:lol:






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

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

/usr/share/X11/fonts
/usr/share/fonts
/usr/local/share/fonts
~/.fonts
(/etc/fonts/fonts.conf "<dir>"字段)


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

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

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

字体的选择及显示风格,可以修改GTK2或者Qt的配置文件,建议使用图形界面配置(通常桌面环境中附带了相关程序,例如gnome-font-properties)
上次由 kardinal 在 2006-08-08 4:52,总共编辑 20 次。
telnetor
帖子: 48
注册时间: 2006-08-03 0:17

#4

帖子 telnetor » 2006-08-04 22:05

支持楼主大哥 ~~
kardinal
帖子: 750
注册时间: 2006-03-19 11:39

#5

帖子 kardinal » 2006-08-06 1:11

感谢支持!

新增了关于字体的介绍,因为Linux有N种字体配置的方法,所以很多兄弟感到无所适从,并不清楚为什么要那样作……

网上的相关的资料确实比较多,不过混乱程度也差不到哪里去……总结出这点结论,我参考了起码几十份文档,推翻了无数条混乱的逻辑……为了表示鼓励,版主兄弟能不能考虑下,给加个精啊 :oops: :lol:


当然了,这部分内容我也是一知半解,有什么不准确或者不正确的地方,请各位高手千万要指出
头像
zhuqin_83
帖子: 10606
注册时间: 2006-05-13 4:02
联系:

#6

帖子 zhuqin_83 » 2006-08-06 5:57

继续加油!
头像
林文清
帖子: 50
注册时间: 2006-07-17 8:38

#7

帖子 林文清 » 2006-08-07 11:04

写得不错,对于Xwindow崩溃之后的修复比较有用,

加油:)
Linux恒久远,Fedora(?)永流传?
头像
xiehuoli
帖子: 5941
注册时间: 2006-06-10 8:43
来自: 中国 CS

#8

帖子 xiehuoli » 2006-08-07 15:45

谢谢楼主,不愧是精华。
以前的很多问题现在终于明白了。多谢。
让我对LINUX又多了一层认识。 :em50 :em52 :em38
年轻没有失败! ! ! ! ! !
噢!有怪兽,有怪兽!
kardinal
帖子: 750
注册时间: 2006-03-19 11:39

#9

帖子 kardinal » 2006-08-08 5:06

to: 林文清
--------------------------
这部分内容比较偏重于原理的描述。而Xwindow崩溃后的修复,情况极其复杂……可以说,配置Linux系统,最难的就是配置Xwindow,尤其涉及到比较特殊的硬件时,更是如此

所以,如果Xwindow真的出了什么问题,最好的方法还是查阅wiki,或者到Google上寻找答案

这个教程没有提供任何现实的解决方案……

通过参考wiki或者Google,兄弟们多半可以解决一些具体的问题……同样的,问题即便解决了,兄弟们多半还是不了解为什么要这么解决,到底是怎么解决的……

这个教程针对这一环节,就是要让兄弟们明白一些原理,并且真正的理解解决问题的方法,在遇到其它问题的时候,也有能力自行思考和摸索,尝试解决问题 :lol:

to: xiehuoli
--------------------
感谢支持 :lol:
能够提供一点微不足道的帮助,使在兄弟的Linux道路上有所进展,是我最大的荣幸……
zhuzhzh
帖子: 265
注册时间: 2005-07-28 15:08

#10

帖子 zhuzhzh » 2006-08-08 14:03

晕,楼主真是无私!

赞楼主的毅力。我也看过很多这方面的东西,就是没搞清这前前后后的关系,你这一讲,许多东西清楚多了
无声胜有声
kardinal
帖子: 750
注册时间: 2006-03-19 11:39

#11

帖子 kardinal » 2006-08-09 1:02

多谢支持
----------------------

第一贴:

架构及原理部分
调整了一些表述方法(用尽量少的文字尽量多地描述,用尽量简单的逻辑构建尽量复杂的体系,才是表达艺术的极致。以无法为有法的说 8) )
……为了实现这一目标,示例也作了一些调整

启动流程部分
GDM会话作了重大调整。比较认真的浏览了一些启动脚本……现在比较有把握了 :lol:
不过GDM会话中,如何启动Xserver还没有搞清楚……望高手们不吝赐教 :oops:

为了方便,直接将教程中的内容粘贴上来了,与原版排版上稍有不同,见谅……

后两贴:
一些细节上的调整,见教程……
头像
boyzhigang
帖子: 258
注册时间: 2006-07-02 22:13
来自: 山东

#12

帖子 boyzhigang » 2006-08-26 22:36

菜鸟学习中 :roll:
路漫漫其修远兮
吾将上下而求索

我是新手 老鸟多照顾 我要学习学习!!!
solo_lxy
帖子: 14
注册时间: 2006-04-30 11:07

#13

帖子 solo_lxy » 2006-09-18 18:29

看了这以后对X有了很深刻的认识,望继续努力!
加油!
zhengw
帖子: 62
注册时间: 2006-09-21 9:42

支持

#14

帖子 zhengw » 2006-09-21 10:01

网上很多关于X-WINDOW的文章都看得一头雾水,这篇就对人友善多了,支持!
flyinflash
帖子: 2376
注册时间: 2006-09-21 14:28

#15

帖子 flyinflash » 2006-09-25 21:43

回复