790 likes | 1.13k Views
理解 X-window 与 VNC. 清华大学高性能所 刘立坤. 第一部分 : 常见问题问题. 我该装哪个 X-window? Gnome 和 KDE 哪个更好些 ? XFree86 是什么 ? 我的 GUI 起不来了怎么办 ?. What this lecture covers?. X-window 的基本概念和架构 Xwin 的启动过程 Xwin 的配置 ( 刷新频率和显示模式的配置 ) Xwin 的基本工具 (xwin 自带 ) Xwin 的字体系统的简介 (xwin 的美化 ). Xwindow 的基本概念和架构. What is Xwindow
E N D
理解X-window与VNC 清华大学高性能所 刘立坤
第一部分:常见问题问题 • 我该装哪个X-window? • Gnome和KDE哪个更好些? • XFree86是什么? • 我的GUI起不来了怎么办?
What this lecture covers? • X-window的基本概念和架构 • Xwin的启动过程 • Xwin的配置(刷新频率和显示模式的配置) • Xwin的基本工具 (xwin自带) • Xwin的字体系统的简介(xwin的美化)
Xwindow的基本概念和架构 • What is Xwindow • 一个非常出色的窗口图形系统 • 是很多其他图形系统的概念基础 • 多年以来的工业标准 • 历史就说了
架构 • X-Windows被设计成为一种客户端--服务器(client-server)的系统。这样做的优点是你可以把服务器运行于和你的显示器所在的机器不同的另一台机器上 • X Window System的组成可以分为X server,X client,X protocol三部分
Xserver • 就是X的服务器端,负责所有有关图形显示的操作,包括所有你可以见到的图形元素的绘制。 • XServer负责和设备打交道,负责具体的管理的显卡,显示器的显示模式和参数设置(这也是整个x系统中最复杂的部分) • Xsever还包括最低层的与设备相关的图形库,目前主要是xlib • 目前的Xserver主要有XFree86和Xorg两个
XClient • 任何一个X应用程序,包括WM在内都是XClient • XClient不负责任何图形相关的具体操作,只和xserver交互,由xserver负责完成其图形显示任务,这种交互一般来说是通过在底层调用xlib实现的 • Xclient的核心任务是计算和数据处理。更确切的说是消息处理
X protocol • X protocol是Xserver与XCleint之间的通信协议。 • 从本质上来说,它是一种远程显示协议。该显示协议与后面的vnc不同是基于胖客户端的。
X-window的工作过程 • (1) 用户通过鼠标键盘对X server下达操作命令 • (2) X server利用Event传递用户操作信息给X client • (3) X client进行程序运算 • (4) X client利用Request传回所要显示的结果 • (5) X server将结果显示在屏幕上
X-window的网络透明性 • 在一个xserer上面你可以显示多个机器上的x应用程序,而不必关心这些应用程序具体属于哪个机器 • Ex:使用鼠标选择一段字符,然后就可以在另外的程序里按鼠标中间,把字符粘贴过去。不论这个程序运行在哪里。 • 不同机器上的xclient只要显示在当前的xserver上,他们就具有相似的行为,就服从当前xserver的统一的风格和工作方式。 • Xclient可以向xserer暗示它要如何如何,但xserver可以采纳也可以不采纳
实验一 • 看看Xserver的模样? • 在 Linux 下,你可以直接输入 “X&”,这样,一个占据整个屏幕的布满斜纹的窗口(根窗口)就出现了 ,这就是X Server. • #X :1 • 看看一个XClient到底是个什么样子 • Xterm :1
X-window的组件 • 显然X-window的核心原理是相当简单的 • 但在x下面还有一大堆令人迷惑的概念
Window Manager • 一个运行于 X Window 之上的application,主要功能是:移动窗口,改变窗口大小,图标化(最小化)窗口,改变窗口层叠顺序 • 窗口上的标题,按钮,漂亮的边框,全都是窗口管理器提供的 • 不同的机器在本机显示的窗口,由窗口管理器统一装饰和指挥 • 你可以有多个不同的WM,但一次只能启动一个 • GNOME和KDE不是窗口管理器
一些常见的WM • TWM • 最早的WM,一切WM的原型 • FVWM (一个可扩展,完全自定义的WM) • Freedom • KWin • KDE的WM • englightenment, sawmill, iceWM ,metacity • GNOME常用的WM • Sawfish • 类似与FVWM,但可以用LISP语言编程控制
实验三 • # Twm :1 • # Fvwm :10 • 看看原始的WM是个什么样子
问题? • KDE和GNOME到底是什么? • 他们和WM又有什么关系? • 两个误区: • Gnome和KDE 是窗口管理器 • Gnome和KDE是 Xwindow • 经常看到有人问:“装哪种 Xwindow 好啊?Gnome 还是 KDE?”
Widget • 小器件,装饰品 • 常规的工具库 • 用于构造象按钮和菜单这样的标准控件( • 一个应用程序使用的wedget集是由程序员来选择的,而不是用户。 • 可以同时运行使用不同widget set写的程序 • 实际上是一种图形组件集 EX:GTK、QT等
Widget • GTK和Qt(Qt是KDE使用的Troll Tech的产品)都是widget集。也就是说,它们提供了按钮,菜单,滚动条和各种各样 的对象给程序开发人员使用。注意,非基于GNOME或KDE的应用程序能够使用GTK+或Qt,但是所有的GNOME程序都使用GTK+, 所有的KDE应用程序都使用Qt。
Desktop • Gnome 和 KDE 是“桌面环境”,或者也可以叫做桌面系统. • 一种很多程序和函数库的集合。它们的设计目的是提供一致的方便的操作方式来满足普通用户的需要。它们不但包含窗口管理器,还有很多实用程序和应用程序
,桌面环境。这是一个最新的也最模糊的X术语。 它基本的意思是指“ Mac OS 和 Windows的图形界面有,而X没有却应该有的东西”。 通常是一组有着共同外观和操作感的应用程序,和程序库,以及创建新的应用程序的方法。 你同时可以安装多个桌面环境,而且你可以在一个桌面环境中运行另一个不同的桌面环境的应用程序, 而不用切换到过去(当然你要安装那个桌面才行)。就是说,如果你使用GNOME,但是你喜欢KDE的字处理器KLyX, 那么你可以运行KLyX,而不运行任何其他的KDE程序,但是它就不能和你那些GNOME的程序互相交互了。 你甚至可以同时运行GNOME和KDE的核心程序,事实上这没有什么意义,你会同时有两个文件管理器,两个面板,等等
1)程序可能不是同时基于GNOME和KDE的, • 2) 你不得不安装GNOME的库来运行基于KDE的软件, • 3) 你可以并行的运行GNOME的应用程序和KDE的应用程序, • 4) 如果你使用任何一个环境,你总是可以运行非基于该环境的应用程序。
X-window vs windows • 1.你不得不在你想看到这个程序的同一台机器上运行它。 • 2.如果你不喜欢windows的工作方式,你不能选择另外一个窗口管理器。 • 3.不论怎样设置windows,如果仅有一个你需要的东西没有被做进去,那也是没有办 法。而使用X,你可以使用不同的窗口管理器,桌面,widget集,无论什么。
X-window vs windows • 当一个程序挂起的时候,它会占居你的屏幕,直到你关掉它。这时你通常没有办法移动它或最小化它。这是windows 设计上的第二个缺陷。每个MS Windows的程序都有一些代码来处理标题条、关闭、最大化、最小化按钮。 这些代码在一个共享库里,因此你不是必须自己写。
X-window vs windows • 。每个 X应用程序(任何窗口……xterm netscape xclock)查看"DISPLAY"这个环境变量来找出它应该让谁画出它自己。 如果你的DISPLAY被设置成 computer1:0.0 而你在computer2上,当你键入xterm是它将会在computer1的屏幕上弹出来。
X window VS windows • 由于在Xserver和Xclient多了网络层和WM,Xwindow的效率不及windows • 这是非常致命的 • Confusion comes with Freedom 。没有一个统一的标准,许多的软件直接存在着不兼容性。 • 这是最致命的 • Unstable come Confusion。外围的应用程序不稳定 • 这也是比较致命的
X-window的启动过程 • Startx方式 • 文本方式,在控制台下敲入startx • 也可以直接采用xinit或X启动,但这样得到界面一般来说非常的朴素 • Display Mannager方式 • 图形方式,也就是每次开机的时候就进入的那个login界面
两个重要文件 • xinitrc --X视窗启动文件 • Xdefaults -- X视窗资源文件.
xinitrc • 倘若我们以startx或xinit启动X,这指令会启动X server并且会执行$HOME/.xinitrc文件内的所设置的指令。倘若 $HOME没有这个文件,则系统会使用内定的的配置文件/usr/XR116/lib/X11/xinit/xinitrc。 • xinitrc文件一般只包含有启动X时所要执行clients的shell script, 启动必要的应用程序
Xinitrc example • LANG=zh_CN.GB2312 • LC_ALL=zh_CN.GB2312 • LC_CTYPE=zh_CN.GB2312 • KDE_LANG=zh_CN.GB2312 • export LANG LC_ALL LC_CTYPE KDE_LANG • export XMODIFIERS=@im=Chinput • /usr/bin/chinput & • exec kde3 • killall chinput
Xdefault • 主要是设置合适自己喜欢的应用程序的操作操控环境或界面。一般会执行X后,会自动读取$HOME/.Xdefaults. • 一些应用程序会自己产生的的资源文件,一般放在/usr/XR116/lib/X11/app-defaults • Linux的一个普遍原则就是所有的局部设置都高于全局设置,你永远可以用你的局部配置覆盖掉全局的配置
Startx的启动过程 • Startx • startx就是xinit的前端界面[front-end] • startx主要是设置X client和X server所在的位置,并处理相关参数,最后交给xinit处理 • Xinit • xinit,则根据startx传过来的参数启动X server,成功后根据xinitrc启动X client。
Startx的启动过程 • 1)xinit启动X server程序; • 2)X server会寻找$HOME/.xinintrc文件,有就执行它,没有就会转到/etc/X11/xinit/xinitrc读取系统内定的启动文件。 • 3)接着就会读取$HOME/.Xdefaults,倘若没有,就会转到/usr/X11/xinit/Xcilents。从文件名Xclients看来,这个是用来设置时执行哪些X应用的程序的文件。性质和xinitrc类似,同样是个shell script。但要注意的是:.Xdefaults是的权限具有755,即可执行。
Startx的启动过程 • 4)在正常的情况下,$HOME/.xinintrc是用来指派可以让X Window System正常运行的应用程序了。而.Xdefaults则被建议用来载入X资源设置和应用应用,以适合每个用户本身的喜爱程度而已。 • 5)X server建立一个属于它自己的根视窗(Root windows),并设置视窗的背景与执行所指定的应用程序,显示一个大的"X"光标,便完成启动了。 • 6)在X server执行的期间,它一直控制着你的鼠标的键盘
Startx的启动过程 • 7)接下来,xinitrc脚本的执行会启动xterm程序。它对X server而言是一个X Clietn程序而已。
DM方式 • 1)执行/etc/X11/xdm/Xserver启动X出现console登录的界面(是执行/etc/X11/xdm/ GiveConsole&TakeConsole所产生的) • 2)执行/etc/X11/xdm/Xsessions来启动xdm或者是gdm。如果启动的是xdm,则装入用户家目录上的配置文件,.xsession和.Xclients。如果是gdm,则装载入/etc/X11/gdm/Sesseion与.Xclients。到此为止,就会出现X视窗的登录的界面选项。
DM方式 • 3)gdm则会检查/etc/X11/gdm/Session目录的Session操作。比如Fvwm,Wmaker,Default,Failsafe,Gnome,Kde与Default等。并将显示给用户选择进入那个那个X Window Manager。其实这些Sessions都是Shell Script file。如果你选择Kde,就进入KDE DeskTop environment,选择Gnome就会进入GNOME DeskTop environment了。
DM方式 • 4)用户如果选择是的Gnome,在输入用户名和password后,gdm就会找gnomerc script,$HOME/.gnomerc,如果没有这个文件,就会读会系统文件内定的GNOME resource file:/etc/X11/gdm/gnomerc,并且启动/usr/bin/gnome-session. • 5)对于使用何种X Window Manager与载入方式,并不属于Display Manager的范围。Display Manager只要负责启动各种Sessions即可。
X-window的设置 • Xwindow最关键的设置就是刷新频率和显示模式的设置 • 这两个都在XF86Config-4文件中进行设置 • 归根结底就是两点: • 1)配置合适的显卡驱动 • 2)设置正确的modeline
XFree86的显卡驱动 • 对于显卡驱动你首先要知道自己用的是什么显卡? • 一般来说linux的显卡驱动已经足够的全了在 • /usr/X11R6/lib/drivers目录下有各种显卡驱动。找一个适合你的就可以了 • 如果实在找不到,就用vesa通用显卡驱动
XFree86的Modeline • XFree86自带了一个gtf用于生成XFree86需要的modeline。如下所示 • #gtf 1024 768 85 • 将上面命令的输出写入XF86config-4的monitor 一节,然后将Hsync和Vsync写上一个合适的范围 • 就可以得到你想要的刷新频率了。 • 前提是你的显卡驱动可以支持这样的刷新频率
我得GUI起不来了? • 通过上面的讨论,很显然是Xserver出了问题. • 根据经验不外乎两个主要问题: • 刷新率设置太高了 • 显示卡驱动不正确
X-window的美化 • X-window的美化归根揭底: • XTheme • 这个无需多谈,你可以根据你用的窗口管理器和桌面系统到网上下载相关的主题,其中有些主题相当的pp,在某些方面甚至可以超过windows • XFont • Linux的图形界面的字体历来是linux让人头疼的地方
XFont System简介 • another problem comes from History & Freedom。 • It’s another weakness of linux
Two Types font subsystem • 传统的基于字体服务器的字体子系统 • xtt(传统 X 字体服务器,XFree86 带了模块) + defoma dfontmgr psfontmgr • 新兴的fontconfig字体子系统 • xft2 + fontconfig libpango • 一种新兴的允许应用程序自己绘制和渲染的字体 • 当然还有一些不在这两个之列的: • 比如:ArcoRead, openoffices, Mozlia • Mozlia尽管是基于第二种字体,但其有自己单独的配置文件font.conf
传统的基于字体服务器的字体子系统 • 原始的(已有 15 年以上历史)子系统被称为“核心 X 字体子系统”。由这个子系统绘制的字体不是平滑字体,它们由 X 服务器处理,名称类似: • -misc-fixed-medium-r-normal--10-100-75-75-c-60-iso8859-1 • Xmms ,gimp
新兴的fontconfig字体子系统 • 新的字体子系统被称为“fontconfig”。它允许应用程序直接使用字体文件。fontconfig 经常与“Xft”库一起使用,这会允许应用程序在屏幕上绘制平滑字体。fontconfig 显示的字体更有“人情味儿”。 • 随着时间的推移,fontconfig/Xft 将会取代核心 X 字体子系统。 • Gtk和QT
如何使用windows下的字体 • 1. 找一个windows下的simsun字体,例如simsun.ttc • 2.Xserver需要两个文件来认识响应的字体 • Fonts.scale 和fonts.dir,下面生成这两个文件 • 建目录/usr/share/fonts/zh_CN/MoreTrueType,把simsun.ttc放进去,然后在那个目录里执行:ttmkfdir > fonts.scale • 然后执行:cp fonts.scale fonts.dir
如何使用windows下的字体 • 3.告诉Xserver让它可以找到新加的字体 • 编辑/etc/X11/XF86Config,把设置字体路径的部分改为: • Section "Files" • RgbPath "/usr/X11R6/lib/X11/rgb" • # FontPath "unix/:7100" • FontPath "/usr/share/fonts/zh_CN/MoreTrueType" • FontPath "/usr/share/fonts/zh_CN/TrueType" • FontPath "/usr/share/fonts/zh_TW/TrueType" • EndSection
如何使用windows下的字体 • 4.告诉Xserver用xtt方式渲染字体取代freeType方式 • 并且把调入模块部分下面两行改为如下所示: • Section "Module" • # Load "freetype" • Load "xtt" • EndSection • 5. 现在启动X
如何使用windows下的字体 • 将新字体添加到fontconfig的系统中比较简单 • 1)将新字体复知道一个目录下。然后在该目录下运行: • #Fc-cache -v -f即可