第5章 X Window系统
5.1概要
FreeBSD使用XFree86来为用户提供一个功能强大的图形用户接口。XFree86是一个开放源代码的X视窗系统。下面的这章将介绍在FreeBSD上安装和配置XFree86。有关你的显示卡是否被X11所支持,请查看XFree86的网站(www.xfree86.org)。
读完这章,你将了解到:
如何安装和配置XFree86。
X视窗系统的不同组件,它们是如何协同工作的。
如何安装和使用不同的视窗管理系统。
如何在XFree86中使用Truetype字体。
如何为你的系统安装图形登陆口(XDM)。
在阅读这章之前,你应当了解:
如何安装额外的第三方应用程序(第4章)。
5.2 理解X
第1次使用X,你可能觉得很惊讶,它跟Windows或Macos这样的窗口系统非常相象。你不需要了解各种X组件的所有细节和它们是如何互相影响的,然而,了解一些基本的知识可以让你很好地利用X的强大功能。
5.2.1 为什么要用X?
X并不是针对UNIX的第一个视窗系统,但它是最流行的。X的最初开发团队在开发X之前,就已经在为另一个视窗系统工作了。那个系统的名字是“W”(很明显,就是“Window”)。X只是在罗马字母中W后面的一个。
X可以被叫做“X”,“X Window System”,“X11”和其他的一些。“X Windows”会尽可能地避免使用;可以看看X的联机手册了解更多信息。
5.2.2 X客户机/服务器模型
X从一开始就是针对网络设计的,所以采用了“client-server”模型。在X模型中,“X server”运行在有键盘,显示器,鼠标的计算机上。Server用来管理显示信息,和处理来自键盘和鼠标的输入等。每个X应用(如xterm或Netscape)就是一个“client”。一个client发送信息(如:Please draw a window at these coordinates)给服务器,然后服务器就返回处理信息(如:The user just clicked on your OK
button)。
如果你在只有一台计算机的家里或小型办公环境中使用FreeBSD,你就需要在同一台计算机上运行X server和X client。然而,如果你有很多运行FreeBSD的机器,你可以在你的桌面计算机上运行X server,而在比较高档的服务器上运行X应用程序。在这样的环境中,X server和 X client之间的通信就可以通过网络来进行。
这可能会使一些人搞糊涂,因为X术语与他们所想象的有所不同。他们以为“X server”是运行在大型机器上的,而“X client”是运行在桌面机器上的。
正如你所记得的,X server是用来处理显示器和键盘输入信息的,而X client是用来显示视窗程序的,这一点不应当搞糊涂。
并不需要client和server都运行在同一种操作系统上,或甚至运行在同一种类型的计算机上。把它运行在Microsoft Windows或Apple MacOS上也是可以的,在它上面也有很多免费的和商业化的应用程序。
在FreeBSD上使用的X
server叫做XFree86,在大家很熟悉的FreeBSD许可协议下可以免费使用。针对FreeBSD的商业化X
server也可以使用。
5.2.3视窗管理器
X的设计哲学有点像UNIX的设计哲学,“tools,not policy”。这些意味着不需要命令最终用户应当如何来完成他们的工作。而是,只给用户提供一些完成工作的工具,至于如何使用这些工具那是用户自己的事情。
这种哲学大大地扩展了X,它不一定要规定这些视窗在屏幕上看起来像什么,你要如何移动鼠标,需要使用什么键来切换窗体,每个窗体的工具条应当看起来像什么,是否应该放关闭按钮等等。
实际上,X只代表了叫做“Window Manager”的应用程序。有很多这样的应用程序:AfterStep,Blackbox,Enlightenment,ctwm,ftwm,sawfish,twm,WindowMaker等。这些管理器中的每一个都提供了一个不同的界面;其中一些支持“虚拟桌面”,有一些允许你可以定制一些键来管理你的桌面,一些有“start”按钮,一些有“themeable”,允许你启用一个新桌面来改变你的桌面显示。这些视窗管理器都可以在Ports Collection的x11-wm中找到。
另外,KDE和GNOME桌面环境都有它们自己的视窗管理器与桌面集成。每一个视窗管理器也有一个不同的配置机制。针对绝大多数的配置任务,有些GUI工具需要你手工来写配置文件,至少如sawfish需要一个用lisp语言来写的配置文件。
焦点策略:视窗管理器的另一个特性是鼠标的“焦点策略”。每个视窗系统都需要有一个选择窗口的方法来接受键盘的输入信息,以及当前哪个窗口处于可用状态。
你通常比较熟悉的是一个叫做“click-to-focus”的焦点策略。这是Microsoft Windows使用的典型焦点策略,也就是你在一个窗口上点击一下鼠标,这个窗口就处于当前可用的状态。
X不支持一些特殊的焦点规则。而是,窗口管理器控制着在什么时候哪个窗口拥有焦点。不同的窗口管理器支持不同的焦点方案。它们都支持点击即获得焦点,而且它们中的大多数都支持好几种方案。
最普通的焦点策略:
focus-follows-mouse
鼠标指示器下面的窗口就是获得焦点的窗口。这可以不是位于其他所有窗口顶部的窗口。你可以通过将鼠标移到另一个窗口就可以来改变焦点,你不需要在它上面点击。
sloppy-focus
这种方式是对focus-follows-mouse策略的一个小小扩展。对于focus-follows-mouse,如果你在根窗口(或桌面背景)上移动鼠标,键盘的输入也会丢失。对于sloppy-focus,只有当指针在键入一个新窗口时,窗口焦点才会发生变化,当退出当前窗口时是不会变化的。
Click-to-focus
活动窗口由鼠标点击来选择。窗口可以被往前移动,出现在所有其他窗口的前面。即使指针被移向了另一个窗口,所有的键盘输入仍会被这个窗口接收。
许多窗口管理器支持其他的策略,与这些相比又有些变化。你可以看具体窗口管理器的文档。
5.2.4窗口部件(Widgets)
提供工具而非策略的X方法使得在每个应用程序屏幕上看到的窗口部件得到了大大的扩展。
“widget”只是针对用户接口中所有列举项目的一个术语,它可以用某种方法来点击或操作;如按钮(button),复选框(check box),单选按钮(radio button),图标(icon),列表框(list)。Microsoft Windows把这些叫做“控件”。
Microsoft Windows和Apple MacOS都有一个快速的窗口方案。应用程序开发员被建议确保他们的应用程序共享一个普通的所见即所得的用户界面。对于X,它并不要求一个特殊的图形风格或一套相结合的窗口部件集。
这样的结果是你不能期望X应用程序只拥有一个普通的所见即所得的界面。有很多的流行的窗口部件集设置,包括Athena(MIT开发),Motif(模仿微软的窗口风格),openlook和其他一些窗口部件集。
今天,绝大多数比较新的X应用程序将使用一个现代风格的窗口设计,像Qt,用来设计KDE,或GTK,用来设计GNOME。在这样一种窗口系统下,UNIX桌面的一些所见即所得特性作了一些收敛,以使初学者感到更容易一些。
5.3安装XFree86
在安装XFree86之前,你只需要决定安装哪个版本。XFree86 3.X是XFree86开发的一个分支。它非常稳定,而且支持很多的图形卡。然而,现在已经不对它进行更新了。XFree86 4.X是一个完全重新设计的分支,有很多新特性,如更好地支持字体和anti-aliasing。不幸的是,这个新的结构要求重新开发显示卡驱动程序,所以有些3.X支持的比较老的显示卡4.X无法支持。
在安装过程中,FreeBSD安装程序会提供给用户安装和配置XFree86 3.3.6的机会(请看第2.9.11节)。要运行XFree86
4.X,你需要在FreeBSD系统安装完成以后,再安装XFree86。例如,要从ports collection建立和安装XFree86 4.X:
# cd /usr/ports/x11/XFree86-4
# make all install clean
另外,XFree86
4.X也可以用pkg_add命令从一个二进制的软件包来安装,或者直接从XFree86的网站提供的FreeBSD程序来安装。
这章的其余部分将解释如何配置XFree86,和如何设置一个高效的桌面环境。
5.4 XFree86的配置
5.4.1开始之前
在用户开始配置XFree86 4.X之前,你必须知道目标系统的下面一些信息:
显示器的规格
显示卡的芯片
显存
显示器规格可以被XFree86用来决定显示器的刷新率。这些规格通常可以从显示器所带的文档中找到,也可以从生产商的网站找到。需要知道两个数字范围:垂直刷新率和水平刷新率。
显示卡的芯片组定义了XFree86要使用什么驱动模块来驱动硬件。对于绝大多数的芯片,它都能自动选择,但有时也可能检测错误。显示卡的显存大小决定了目标系统的刷新率和颜色深度。这非常重要,所以用户需要知道目标系统的详细情况。
5.4.2配置XFree86 4.X
配置XFree86 4.X有几步。第一步是用XFree86的-configure选项建一个初始化的配置文件。作为超级用户,可以这样做:
# XFree86 -configure
这会在一个叫做XF86Config.new的当前工作目录中产生一个skeleton XFree86配置文件。XFree86将试图探测到系统中的显示设备,然后在目标系统上,写入一个配置文件以便探测硬件时能够加载正确的驱动程序。
下一步将测试当前的配置以检验XFree86是否能在当前系统的显示设备上正常工作。要完成这个任务,只需要这样做:
# XFree86 -xf86config
XF86Config.new
如果用户看到一个黑灰的格子和一个X形的鼠标指针,那么配置就是成功的。要退出测试,只要同时键入ctrl+alt+backspace。
接下来,用户需要调整XF86Config.new配置文件以适应个人的口味。用emacs或ee这样的编辑器打开文件。要做的第一件事是为当前系统的显示器添加频率。这些包括垂直和水平的刷新率。这些值可以被添加到XF86Config.new文件的“Monitor”部分:
Section “Monitor”
Identifier “Monitor0”
VendorName “Monitor
Vendor”
ModelName
“Monitor Model”
Horizsync 30-107
VertRefresh 48-120
EndSection
Horizsync和VertRefresh关键字通常不存在用户的配置文件中。如果它们不存在,就需要添加它们。正确的水平同步刷新率添加在Horizsync关键字后面,垂直的同步刷新率添加在VertRefresh关键字后面。在上面的例子中已经添加了。
当XF86Config.new配置文件被编辑器打开时,需要选择默认的分辨率和颜色深度,这是通过Screen来定义的:
Section “Screen”
Identifier
“Screen0”
Device
“Card0”
Monitor
“Monitor0”
DefaultColorDepth 24
SubSection “Display”
Depth 24
Modes
“1024x768”
EndSubSection
EndSection
DefaultColorDepth关键字描述了要运行的默认颜色深度。Modes关键字描述了给定颜色深度下屏幕的分辨率。在上面的例子中,默认的颜色深度是24位色。在这个颜色深度下,可以接受的分辨率是1024x768。
要在24 位色下运行1024x768的分辨率,需要在DefaultColorDepth关键字后添加24这个数字,再添加“Display”子项,加入想要运行的颜色深度和分辨率参数。注意只有VESA标准的模式才能被定义的目标系统的显示硬件所支持。
最后,用户可以写入配置文件,然后使用这个配置文件测试一下。如果一切正常,那配置文件需要被安装在XFree86能找得到的地方,如/etc/X11/XF86Config或 /usr/X11R6/etc/X11/XF86Config.
# cp XF86Config.new
/etc/X11/XF86Config
一旦配置文件被放在一个普通的位置,配置就完成了。XFree86就能通过xdm来使用。为了用startx启动XFree86 4.X,用户将必须安装X11/wrapper port。XFree86 4.X也可以用XDM来启动。
5.4.3高级配置主题
配置Intel i810显示芯片组
配置Intel i810芯片组的显示卡需要有针对XFree86的能够用来驱动显示卡的AGP程序接口。要启用这个程序接口,agp.ko的内核加载模块需要用kldload命令来加载到内核。这可以在启动时由loader自动加载。只要在/boot/loader.conf中加入下面这一行:
agp_load=“YES”
接下来,需要为编程接口创建一个设备节点。要创建AGP设备节点,可以在/dev目录下运行MAKEDEV:
# cd /dev
# sh MAKEDEV agpgart
5.5 在XFree86中使用字体
5.5.1 Type1字体
XFree86使用的默认字体不是很理想。大型的字体显得参差不齐,看起来很不专业,在netscape中,小字体也显得莫名其妙。然而,有几个自由的,高质量的字体可以在XFree86中使用,version 3.X 或
version 4.X都可以。例如,URW字体(x11-fonts/urwfonts)的集合就包括了标准的type1字体(Times
Roman,Helvetica,Palatino和其他一些)。在freefont(x11-fonts/freefonts)的集合中也包括更多的字体,但它们中的绝大部分使用在图形软件中,如Gimp,在屏幕字体中使用并不完美。另外,只要花很少的工夫,可以将XFree86配置成能使用Truetype字体。
要安装上面的Type1字体,你只需要运行下面的命令。
# cd
/usr/ports/x11-fonts/urwfonts
# make install clean
Freefont或其他的集合都是一样的。要告诉X服务器这些字体的存在,你需要在XF86Config文件中添加一行(XFree86版本3在/etc/中,版本4在/etc/X11/中):
FontPath
“/usr/X11R6/lib/X11/fonts/URW/”
另外,在命令行,你可以运行:
% xset fp+
/usr/X11R6/lib/X11/fonts/URW
% xset fp rehash
5.5.2 Truetype字体
XFree86 4.x已经内建支持了Truetype字体。有两个不同的模块能够启用这个功能。在这个例子中使用“freetype”这个模块,因为它与其他的字体是兼容的。要启用freetype模块,只需要在你的/etc/X11/XF86Config文件中加入下面这行。
Load
“freetype”
对于XFree86 3.3.x,你需要运行额外的Truetype字体服务器。Xfstt通常被用作这个目的。要安装xfstt,只要简单地安装port x11-servers/Xfstt。
现在,为Truetype字体创建一个目录,然后把所有的Truetype字体拷贝到这个目录。记住你不能直接从Macintosh计算机上提取字体;它们必须是UNIX/DOS/Windows格式的。一旦你已经拷贝了这些文件到这个目录,你需要使用ttmkfdir命令来创建一个fonts.dir的字体文件,以便让X字体引擎知道你已经安装了这些新文件。ttmkfdir可以在/usr/ports/x11-fonts/ttmkfdir中找到。
# cd /usr/X11R6/lib/X11/fonts/Truetype
# ttmkfdir > fonts.dir
现在需要把你的Truetype目录添加到字体路径中。这样做最简单的方法是应用跟上面使用Type1字体一样的方法:
% xset fp+ /usr/X11R6/lib/X11/fonts/Truetype
% xset fp rehash
或者把FontPath行添加到XF86Config文件中。
就是这样。现在Netscape,Gimp,StarOffice和其他的X应用程序已经记住了你安装的Truetype字体。一些很小的字体(如在Web页面上高分辨率显示的文本)和一些很大的字体(在Staroffice下)现在看起来已经很好了。
5.5.3 Anti-Aliased字体
一启动XFree86 4.0.2版,XFree86就支持anti-aliased字体。当前,绝大多数软件还没有升级到支持这个新的功能。然而,QT(用于开发KDE桌面的工具)已经能够支持了;所以如果你运行XFree86 4.0.2(或更高版本),Qt2.3(或更高版本)和KDE,所有你的KDE/Qt应用程序都能使用anti-aliased字体。
要配置anti-aliasing,你需要创建一个文件/usr/X11R6/lib/X11/XftConfig。需要对这个文件作几个比较高深的配置,这节只描述最简单的情况。
第一,需要告诉Xserver你要的anti-aliased字体。只需要在每个字体目录中添加这一行:
dir
“/usr/X11R6/lib/X11/Type1”
同样的在其他字体的目录(如URW,Truetype等)中也包含anti-aliased字体。Anti-aliasing可以理解为可升级的字体(基本上,Type1和Truetype),所以不包括bitmap字体目录。你要包含的目录可以在你的XF86Config文件中注释掉。
Antialiasing会使字体边缘有些模糊,这样增加了非常小的文本的可读性,然后从大文本字体中删除“staircases”,但如果使用普通的文本,可能会引起眼疲劳。要将字体范围控制在9到13号之间,包括这些行:
match
any size > 8
any size <
14
edit
antialias =
false;
用anti-aliasing来间隔一些等宽字体也是不适当的。这似乎是KDE的一个问题。要修复这个问题需要确保每个字体之间的间距保持在100。加入下面这些行:
match any family ==
“fixed”
edit family =+ “mono”;
match any family ==
“console” edit family
=+ “mono”;
(这里把其他普通的修复的字体作为“mono”),然后加入:
match any family == “mono”
edit spacing = 100;
假定你想要使用Lucidux字体,无论什么时候要求等宽字体(这些看起来很好,但会引起一些间距问题),你都可以将最后面的行用下面这些替换:
match any family ==
“mono” edit family += “LuciduxMono”;
match any family ==
“Lucidux Mono”
edit family += “LuciduxMono”;
match any family ==
“LuciduxMono” edit family =+ “Lucidux Mono”;
(最后几行的family名称的别名有些不一样)。
最后,你需要允许用户通过他们每个人的.xftconfig文件把命令添加到这个文件。加入下面一行:
includeif “~/.xftconfig”
最后一点:对于LCD屏幕,需要有子像素的取样。这个基本上由(水平分割的)红,绿,蓝三色组成,用来提高水平刷新率,结果可能很有趣。要启用这个,需要在xftconfig文件的某个地方加入下面这行:
match edit
rgba=rgb;
(依赖于显示的种类,最后的可以被改为“bgr”, “vrgb”或“vbgr”:你实验一下,看看哪个会更好)。
anti-aliasing在你下次启动系统时就能用了。然而,注意你的程序必须知道如何使用它。现在,toolkit Qt已经可以做到了,所以整个KDE环境能够使用anti-aliased字体了。对于gtk+需要加一些补丁,所以如果用加过补丁的gtk+