Chinaunix
标题:
linux图形界面——Xwindow
[打印本页]
作者:
szufhc2006
时间:
2010-01-04 13:51
标题:
linux图形界面——Xwindow
摘自《开源世界旅行手册》 作者:Kardinal
参考引用
理解 Xwindow
作者:王垠
Xwindow是一个十分复杂的系统,下面所要描述的只是关于Xwindow的一些基础
简介Xwindow 是工作站图形系统的工业标准,它有多种不同的实现,多数 Linux 系统中使用 Xorg。
Xwindow 有悠久的历史和传统,要注意的有两点:
* Xwindow 和 Xbox 中的“X”意义是不同的, X 只是 W 之后的一个字母,差不多应该这样理解,Xwindow 是 Window 的接班人 (注意,Window 不是 Windows)
* 同样,也不要把 Xwindow 说成是 Xwindows,那是一种亵渎!一切伟大的创造,都应得到应有的理解和尊重
架构及原理Xwindow 使用服务器-客户端架构。无论本地图形界面,还是远程图形界面,都以同样的流程工作。这样便不需要分别进行设计和维护。
本地X客户端 ┐ ┌ 键盘
远程X客户端 ┼ X协议 ─ X服务器 ─ 驱动程序┼ 鼠标
远程X客户端 ┘ └ 显示器
XserverXwindow 系统服务器端,通过驱动程序(硬件规范)来管理硬件资源。
例如:当我们移动鼠标时,通过驱动程序(大多数的鼠标不需要专门的驱动程序,因为它们符合某一硬件规范,例如:有四个移动方向和三个键),向 Xserver 发送信息:
“向右移动200点,向上移动100点”(向右上移动);“按下左键”……
Xserver 作出如下响应:
1. 上一次鼠标停止的坐标为 600,500
2. 向右 200,向上 100。现在鼠标位于坐标 800,600
3. 坐标 800,600 处,为窗口 Firefox 的“关闭”按钮
4. 根据预设动作,将 “点击 Firefox 窗口的关闭按钮” 翻译为 “关闭窗口 Firefox”
5. 向X客户端 Firefox 发送一个“退出”消息
6. Xserver 通过显示子系统(显卡、显示器),全程显示鼠标的位置和移动
* 事实上,向程序发送“退出”信号,通常窗口管理器完成。为了描述方便,这里暂不区分。稍后,我们将向您介绍 窗口管理器 的其它一些细节。
XclientXwindow 系统客户端,通过 X协议,实现与 Xserver 的交互。例如:
1. Xclient (假设 Firefox) 接收 Xserver 的消息: 输入焦点在地址栏的范围内,“linuxtoy.org”,回车
2. Firefox 根据预设动作,将这些消息识别为 “打开链接 linuxtoy.org”
3. Firefox 向域名服务器请求 链接 “linuxtoy.org”。域名服务器将这个请求转换为 “http://linuxtoy.org/” 和 IP地址211.148.131.7,发送回 Firefox
4. Firefox 将 “http://linuxtoy.org/”显示在地址栏(向 Xserver 发送请求,在地址栏位置显示这个地址)
5. Firefox 向地址 211.148.131.7 请示显示页面
6. Firefox 将服务器发送回的页面显示在主窗口中
分辨 X server 和 X client引自王垠的
理解 Xwindow
这是我被别人问了好多次的问题,我实在不想再对人说一遍了,所以写在这里偷个懒,嘿嘿。
很多熟悉 Internet 原理的人首次遇到 Xwindow 的这两个概念都会搞错。如果他从一台 Windows 机器上使用 Exceed(注:Exceed是windows上实现X server功能的软件) 通过 XDMCP 登录到一台 Sun 服务器,他就说 Exceed 是客户端(client),而 Sun 机器是服务器(server)。这就完全搞错了。
理解了 Xwindow 的工作原理,这个区别就会很明显。X server 不是指你登录的那台机器,而是指一个程序,它负责在某台机器上接受客户的要求,在屏幕上显示客户请求的图形,并且把消息(键盘,鼠标,窗口消息)通知客户程序。
比如上面例子里的 Exceed 就是一个 X server,它负责控制那台 Windows 机器上的显示(display),Sun 机器上的程序,xterm, xxgdb, dtwm(CDE的窗口管理器),……是客户程序。它们通常会使用 TCP 6000 号端口连接 Windows 机器,而Windows机器的 6000 号端口是由 Exceed bind 和 listen 的,怎么样,我们的 Internet 专家,Exceed 看起来是一个 server 吧
比如,当你通过 telnet 启动 Sun 机器上的 xterm,就会在 Exceed 的屏幕上显示一个窗口。实际发生的事情是: xterm 请求连接 Windows 机器的 6000 号端口,与Exceed 跟 Exceed 连接,然后xterm请求得到资源,然后 xterm 请求在屏幕上显示一个窗口。
你在 xterm 的窗口里按下”A”键时,Exceed 会把这个事件通知 xterm 进程,然后 xterm 会发送数据报,请求 Exceed, “请在坐标(100,30)处显示一个字母A,然后在后面显示一个矩形作为光标。”,这样你的 xterm 窗口里就会多显示一个字母。
这下你理解了吗?不?那还是自己多用用,体会体会吧。
XprotocolXwindow 系统协议,Xserver 和 Xclient 之间进行通信的规则
服务器和客户端之间的通讯,是由网络通道上的交换封包所完成。由客户端建立连线,并发送第一个封包。服务器以回传封包来答复,封包中陈述接受或拒绝连线,或要求进一步的验证。如果接受连线,接受封包内会包含客户端接下来和服务器互动所需的资料。
建立连线之后,在客户端和服务器的通道上,会有四种交换封包的类型:
1. 请求:客户端请求服务器的资讯,或者请求服务器进行一个动作。
2. 回应:服务器回应请求。并非所有的请求都会产生回复。
3. 事件:服务器传送事件给客户端,例如,键盘或鼠标的输入,或移动、调整、显示视窗。
4. 错误:如果请求无效时,服务器会传送一个错误封包。因为请求是以排队方式处理,所以经由请求所产生的错误封包,并不会立即传送。
X 服务器提供一系统基本的服务。客户端程式可以和服务器互动,以实现更复杂的功能。
更多请参考维基百科
X Window系统的协议和架构
Xwindow 的网络透明性引自王垠的
理解 Xwindow
刚才那个 Exceed 用户,他的客户程序不仅可以运行在那台 Sun 机器上,而且可以运行在网络里其它的机器上,或者在本机上。比如他有可能同时通过 telnet 登录到几台 Sun 工作站,几台 Linux PC,他可以在那些机器上都起动 xterm,在这台 Windows 机器上的 Exceed 上显示。如果它安装了 cygwin,他还可以启动本机上的 cygwin里 的 xterm,用同样的方式显示。
如果他使用 xrdb 在本机的 Exceed 设置了 xterm 的样式,比如背景 midnightblue, 前景白色,字体 -*-adobe-courier-*,……,那么,Sun, Linux, cygwin 里的 xterm,虽然没有经过配置,但是它们知道:“这个 X server 要求我用这个背景色,这个前景色,这个字体……”,它们会在你的屏幕上显示同样风格的窗口。
使用鼠标选择一段字符,然后就可以在另外的程序里按鼠标中间,把字符粘贴过去。不论这个程序运行在哪里。
看看更大的一个图景:你的屏幕上有三台机器上的 xterm, 两台机器上的 gvim,两台机器上的 mozilla 在显示,而它们都受本机的 FVWM 操纵,它们之间可以随意进行拷贝粘贴…… 从这里你可以初步体会到 Xwindow 的网络透明性,它使你方便的操作很多机器。
窗口管理器Window Manager 是一种特殊的 Xclient。
使用窗口管理器时,Xserver 并不直接与其它 Xclient 通信,而是通过 WM 中转,当一些消息被定义为 WM 指令时,它们会被拦截。例如 Alt+F4 关闭窗口、拖动标题栏……
消息“打开链接 linuxtoy.org”,具体内容如下:
输入焦点在地址栏的范围内,“linuxtoy.org”,回车
Xserver 并不能直接判断焦点,而是这样:
1. Xserver 向 WM 发送位置和点击的信息,WM 根据当前的“焦点策略”确定激活(最上层)的窗口为 Firefox
2. Xserver 将 Firefox 显示在最上层,高亮显示它的标题栏
3. 在窗口 Firefox 内点击地址栏,或者 Ctrl+L,Xserver 将位置信息发送给 WM,WM 再发送给 Firefox
4. Firefox 判断当前焦点后,显示一个闪动的文字输入光标
5. Firefox 将输入光标通过 WM 发送给 Xserver,Xserver 在屏幕相应位置进行显示
那么,“窗口管理器”到底能作些什么呢?其实它所作的只有一件事──管理窗口。例如:
* 最上层的窗口会把其它窗口挡住
*它通常是一个“已激活窗口”,根据不同的“焦点策略”,窗口管理器确定被激活的窗口。
激活窗口标题栏高亮显示,接收大部分的键盘消息和窗口内的鼠标点击消息。
*为了美观和容易分辨,大多数窗口都要有标题栏和边框。
为了方便,标题栏上还要有一些按钮,比如:最小化,最大化,关闭(这些按钮是窗口管理器请求的小窗口)
*一个窗口可以在另一个窗口旁边显示,而不一定完全被遮挡。为了实现这一点,就要控制窗口显示的位置
*为了控制窗口的显示位置,需要将整个屏幕用座标描述,最好的办法是绘制一个填充整个屏幕的窗口,也就是根窗口。
*因为根窗口是最大的,所以它可以严严实实的遮挡任何窗口,为了避免这一点,根窗口永远在最底层。这很形象的说明了为什么它叫作“根窗口” ……root
*根窗口不一定只有一个,大多数的窗口管理器可以使用 “工作区” ,来切换显示多个根窗口
*根窗口固定位置上通常放置一些其它 Xclient 的窗口,例如底部面板,顶部面板,侧面板,程序启动图标
*面板上又可以放一些其它的 Xclient 窗口,如任务条,启动栏,菜单……
任务条可以以图标显示正在运行的任务,还可以作其它的杂活,像自动挂载 USB设备……
什么是窗口管理器?引自王垠的
理解 Xwindow
很多人不知道窗口管理器是怎么回事。他们认为 Gnome 和 KDE 是窗口管理器,认为窗口管理器就是能够提供一个工具条,能够配置桌面背景,能够设置很多菜单的东西。而其实,窗口管理器只是 Gnome 和 KDE 的一部分,它的主要功能是你平时根本没有注意,但是却非常重要的操作。窗口管理器的主要功能是:移动窗口,改变窗口大小,图标化(最小化)窗口,改变窗口层叠顺序……
通常的X客户程序不需要知道有人想移动它,它只知道乖乖听窗口管理器的话。如果没有窗口管理器运行,你的程序会一个堆一个,你没有办法操纵被盖在下面的程序,你只能使用最上面一个程序,而且你不能移动它,你不能改变它的大小。这样的系统根本不能用!
其实你的窗口上的标题,按钮,漂亮的边框,全都是窗口管理器提供的,而不是程序自己的,这样你用窗口管理器就能改变任何窗口的样式了。当你点击关闭窗口的那个按钮,你其实点击的是窗口管理器放在你的程序窗口上面的一个小窗口,发现它受到点击后,窗口管理器就会通知那个程序:“喂!有人想关掉你,你自己准备准备后事,然后退出吧。”
不同的机器在本机显示的窗口,由窗口管理器统一装饰和指挥。比如,窗口管理器决定: xterm 窗口上面都应该有四个按钮,一个在左边,点击它会显示窗口操作菜单,另外三个在右边,分别是最大化,最小化和关闭。窗口都使用 7pixel 厚的边框,窗口首次出现的时候首先在桌面上找一个空位置,如果找不到,就找一个能够最少的遮盖其它窗口的位置……
这些都是窗口管理器的职责。
Gnome 和 KDE 是什么?引自王垠的
理解 Xwindow
有人把 Gnome 和 KDE 叫做窗口管理器,甚至还有人把它们叫做 Xwindow。经常看到有人问:“装哪种 Xwindow 好啊?Gnome 还是 KDE?” 其实你不安装 Gnome 和 KDE 也可以使用 Xwindow.
Gnome 和 KDE 是“(集成)桌面系统”,一种很多程序和函数库的集合。它们的设计目的是提供一致的方便的操作方式来满足普通用户的需要。它们不但包含窗口管理器,还有很多实用程序和应用程序,比如配置程序,工具条,编辑器,绘图工具…… 其实 Gnome 可以和很多窗口管理器合作,在历史上,Gnome 使用过的窗口管理器包括 englightenment, sawmill, sawfish, metacity。KDE 的窗口管理器叫做 kwin。
你也知道,设计整整一套应用程序:编辑器,绘图程序,浏览器,…… 是非常不容易的。所以它们肯定是不如专用的编辑器,绘图程序,浏览器的。不过要求不太高的用户也可以用它们。
启动流程我们知道 init 是 linux 的根进程,是所有进程的父进程。同样, xinit 是所有 Xwindow 进程的根进程
Startxstartx 可以在命令行下启动图形界面。执行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,它的优先级高于全局配置文件(对于 GDM会话 不起作用)startx 启动时,并不会再进行身份认证。因为它启动的是 /etc/X11/Xsession.d/gnome-session ,而不是 GDM会话GDM会话许多 Linux 系统启动时自动进入图形界面,不需要运行 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 目录下为所有可用登录会话的脚本
配置文件X服务器X服务器的主要配置文件为 /etc/X11/xorg.conf
Section "ServerLayout" #布局
Identifier "Xorg Configured" #布局标识
Screen 0 "Default Screen" 0 0 #屏幕标识
InputDevice "Generic Keyboard" #键盘标识
InputDevice "Configured Mouse" #鼠标标识
EndSection
Section "Module" #模块
Load "ddc"
Load "dbe"
Load "dri"
Load "extmod"
Load "glx"
Load "bitmap"
Load "type1"
Load "freetype"
Load "record"
EndSection
Section "Files" #X核心字体路径
FontPath "/usr/share/X11/fonts/75dpi"
FontPath "/usr/share/X11/fonts/100dpi"
FontPath "/usr/share/X11/fonts/misc"
FontPath "/usr/share/X11/fonts/cyrillic"
FontPath "/usr/share/X11/fonts/100dpi/:unscaled"
FontPath "/usr/share/X11/fonts/75dpi/:unscaled"
FontPath "/usr/share/X11/fonts/Type1"
FontPath "/usr/share/fonts/Chinese/wqy-bitmapfont"
EndSection
Section "Screen" #屏幕
Identifier "Default Screen"
Device "Card0" #指定显卡
Monitor "Monitor0" #指定显示器
DefaultDepth 24 #默认色深为24
SubSection "Display" #可用分辨率
Depth 24 #24位色深下可用分辨率
Modes "1280x1024" "1152x864" "1024x768" "800x600" "720x400" "640x480" #默认分辨率为默认色深下的第一个分辨率
………………
EndSubSection
EndSection
Section "Device" #显卡
Identifier "Card0"
Driver "vesa" #驱动
VendorName "All"
BoardName "All"
EndSection配置文件内部结构/
├/ "ServerLayout" 布局
│├ "InputDevice" keyboard 键盘
│├ "InputDevice" mouse 鼠标
││
│└/ "Screen" 显示子系统
│ ├ "Monitor" 显示器
│ ├ "Device" videocard 显卡
│
│
├ "Files" 字体
└ "Module" 模块
X客户端在 /etc/X11/Xsession 文件中可以发现下列内容
OPTIONFILE=/etc/X11/Xsession.options #设定X进程的启动参数。例如允许用户进程 allow-user-xsession
#X资源文件。许多程序保留了X接口,允许X服务器管理一些视觉选项,例如窗口内的字体,配色等
SYSRESOURCES=/etc/X11/Xresources
USRRESOURCES=$HOME/.Xresources
#X进程。可以设置一些启动时自动运行的程序,也可以用来设定自己的窗口管理器(窗口管理器和桌面环境或者登录管理器是无关的)
SYSSESSIONDIR=/etc/X11/Xsession.d
USERXSESSION=$HOME/.xsession
ALTUSERXSESSION=$HOME/.Xsession
ERRFILE=$HOME/.xsession-errors
本文来自ChinaUnix博客,如果查看原文请点:
http://blog.chinaunix.net/u3/109488/showart_2138881.html
欢迎光临 Chinaunix (http://bbs.chinaunix.net/)
Powered by Discuz! X3.2