设置和修改 X Window 的显示模式
本文档的主要目的在于介绍手动配置Linux下XF86的配置方法,主要是关于如何通过修改XF86Config文件调整显示器在图形模式下的显示分辨率和颜色深度,以及如何通过建立符号连接修改XServer.另外提到一些跟图形界面有关的网友常问问题.文中对于如何使用软件工具做相应的没有过多提及,希望会在以后的版本中加入和软件修改方法之间的联系和差别.
一.XWindow工作方式略谈
(如果你只关心如何对XWidow进行设置,可以跳过这一节.只是理解这一节所讲的知识对于理解下面的各设置步骤有一定帮助)
XWindow的工作方式跟MicrosoftWindows有着本质的不同.MSWindows的图形用户界面(GUI)是跟系统紧密相联的.而XWindow则不是,它实际上是在系统核心(kernel)的上面运行的一个应用程序.
XWindow的运行分为四层.最底层的是XServer(服务器),提供图形界面的驱动,为XWindow提供服务.上面的一层是用于网上通信的网络协议--X网络协议,这部分使远程运行XWindow成为可能.只需要在服务器上运行一个XServer,而客户机(Client)上运行更上一层的程序,则可以实现XWidow的远程运行.再往上的一层是称作Xlib的低层函数接口,介于网络和和基础系统于较高层的程序之间.应用程序的实现是通过调用这一层的函数实现的.最顶层就是管理窗口的窗口管理器了,也就是一般所说的WM(WindowManager).在这一层的软件是用户都比较常接触的,比如fvwm,AfterStep,Enlightment以及WindowMaker等等.
从上面的介绍来看,XWindow的运行是一种客户机/服务器(Client/Server)的模式,服务器用于显示客运的应用程序,又被称为显示服务器(DisplayServer).显示服务器位于硬件和客户机之间,它跟踪所有来自输入设备比如键盘、鼠标的输入动作,经过处理后将其送回客户机.这样,使用户甚至可以在MSWindows的机器上运行XClient,截取并传送用户的输入,只是将XWindow的屏幕输出显示在用户的屏幕上.客户机的输入和输出系统跟X服务器之间的通信都是遵守X协议的.
由于本文档的主要目的在于介绍如何设置,因此对XWindow不再作进一步的介绍.更详细的资料可以参考有关的HOWTO,man页等等.
二.关于XWindow的设置
1.XServer
在Linux下,这些服务器的程序是存放在/usr/X11R6/bin/下面,并且都由XF86_打头,一般来说,会提供单显Mono,标准VGA和SVGA的驱动,分别命名为:XF86_Mono,XF86_VGA16和XF86_SVGA,另外可能还会有S3和其他一些带有图形加速功能的显卡的驱动.下面是作者本人机器上运行的RedHatLinux6.1中所带有的XServer驱动:
XF86_3DLabsXF86_MonoXF86_I128XF86_VGA16
XF86_P9000XF86_8514XF86_Mach32XF86_S3
XF86_W32XF86_AGXXF86_Mach64XF86_S3VXF86_
FBDevXF86_Mach8XF86_SVGA
如果你的/usr/X11R6/bin下面没有上面某个文件或者多了某个文件,不必在意,这主要决定于你的机器的硬件.其实一般只需要跟自己硬件相配套的驱动即可,比如作者正在使用的机器上使用的是3DLabPermediaII的芯片的显示卡,因此只有XF86_3DLabs是有作用的.
如此之多种类的显示适配器驱动程序,系统当然需要一个固定和统一的方法去访问它,一般说来,系统是使用一个名为X的符号连接去访问具体的XServer的.这个X也同样是存在于/usr/X11R6/bin/目录中,可以使用如下命令打印他的具体指向:
ls-l/usr/X11R6/bin/X
得到的结果如:
lrwxrwxrwx1rootroot8Dec1403:40/usr/X11R6/bin/X->XF86_3DLab
前面的属性"lrwxrwxrwx"中第一个字母l表示它是一个连接,在最后由箭头指出它所指向的具体目标.
明白了这个,在以后需要更换XServer的时候就可以通过改变这个联系来实现了,具体命令如下:
ln-sf/usr/X11R6/bin/X???????/usr/X11R6/bin/X
其中问号代表的字母根据具体情况决定.有些时候,由于这个连接不正确,导致无法运行XWindow,这时可以使它指向XF86_VGA16,使用16色的VGA模式进入XWindow,注意如果需要运行XF86Setup程序(是个图形界面的XWindow配置工具程序),那么这个XF86_VGA16驱动一定要存在,这是由于该驱动所提供的显示模式是一般显示卡和显示器都支持的,故该配置程序使用此XServer为驱动.当用户的显卡是比较特殊的型号时,需要装特定的驱动程序,也需要作此工作.
驱动程序的获得有多种途径,一般的Linux发行版本都提供了丰富的驱动程序,可以满足大部分要求,比较特殊的驱动程序,可以在网上获得.当然现在Linux对硬件的支持还不是很完善,但这已经超出了本文档的访问,不在作更多的表述.
2.显示模式
显示模式包括分辨率,扫描频率,色深等等.这也是网友在显示方面提问最多的一个问题.对于现在的显示卡和显示器,一般都可以使用1024x768x16bit色的显示模式.当然保险起见,在使用下面所叙述的方法设置您所使用的显示模式的时候,请确定您的显示卡和显示器能够达到该模式的要求,否则可能会有损坏硬件的危险.
在各发行版本中,都会提供一些设置XWindow的工具软件,如Xconfigurator,XF86Setup,XF86Config等等,这些程序无一例外的是提供了一个修改XWindow的配置文件XF86Config的简便方法.当然使用起来比较方便,但是对于一些需要灵活调整的场合就不是非常适合,需要手动调整配置文件中的参数达到最好效果.您不必一定这样做,这里只是介绍这样一种方法,使您可以在有疑问的时候方便地解决.
一般这个文件是存在于/usr/X11R6/lib/X11/目录下,在/etc或者/etc/X11目录中有它的一个符号连接.它是一个文本文件,可以使用vi对它进行修改.下面对该文件中各部分的作用做个详细的介绍.(如有遗漏,欢迎提出)
在这个文件中有这样几个概念:段(Section)和子段(Subsection).每个段或子段分别给出了不同的参数,格式分别为:
Section
......
Endsection
SectionSubsection
......
Endsubsection
Endsection
一个完整的配置文件中包含九个段,分别是File(文件),Modules(动态链接库)SeverFlag(服务器特殊标志),Keyboard(键盘),Pointer(指示设备,一般是鼠标),Monitor(监视器),Device(显示适配器,即显卡),Screen(屏幕设置信息),XInput(X输入).
File段:这一段指示出一些运行XWindow所需要的文件的位置,比如颜色的别名文件rgb.txt(注意这里是不需要写出该文件的扩展名),比如:
RgbPath"/usr/X11R6/lib/X11/rgb"
如果您看过/usr/X11R6/lib/X11/rgb.txt的内容,你会很容易的知道它是干什么用的.有了它,你可以使用red1代表RGB颜色值25500等等.
接下来是字体文件的路径,这里的设置将影响到中文字体的输出.这里对路径的设置可以是多个,例如下面的这样:
FontPath"unix/:-1"
FontPath"/usr/share/zhfont/X11:unscaled"
FontPath"/usr/share/zhfont/TTF"
FontPath"/usr/X11R6/lib/X11/fonts/local"
FontPath"/usr/X11R6/lib/X11/fonts/chinese"
FontPath"/usr/X11R6/lib/X11/fonts/TTF"
FontPath"/usr/X11R6/lib/X11/fonts/Type1"
FontPath"/usr/X11R6/lib/X11/fonts/Speedo"
FontPath"/usr/X11R6/lib/X11/fonts/misc"
FontPath"/usr/X11R6/lib/X11/fonts/75dpi"
FontPath"/usr/X11R6/lib/X11/fonts/100dpi"
在使用一个字体目录之前,需要使用mkfontdir命令把一条路径中的字体作个列表,在该目录中生成font.dir作为对字体的索引,如:
mkfontdir/usr/X11Ry/lib/X11/fonts/100dpi
具体该命令的用法,请使用man命令查看其manpage(手册页),或者会在本文档的后续版本中提供详细的说明.
既然Unix的服务中有一项XFontServer,当然X11R6也允许X从字体服务器(FontServer)下设定字形,例如FontPath"/usr/X11R6/lib/X11/fonts/misc/,tcp/DarkEagle:7100"就是用来告知Xserver在本端的/usr/X11R6/lib/X11/fonts/misc路径中,tcp/zok这个主机,port为7100的地方找字形.
还有的一个路径是模块文件路径.模块路径用于指定所需要的动态链接库的路径,可以是用逗号分开的多个路径,也可以是多个以ModulePath开头的行.一般这个设置不是必须的,很多时候可能并不能找到这个设置.
需要说明的是,这里对各个路径的设置对顺序是无关的.
Modules段:这个段指明的是需要加载的动态模块文件.当然当前的动态模块只是说明了需要加载的XInput设备,并且只在少数其个系统(现在是LinuxElf,FreeBSD2.x和NetBSD1.x,本资料摘自RedHat6.1中XF86Config的man文档)中被支持.下面是在本段中可用的设置项:
Load"模块名"
这条指令指示服务器加载由模块名指定的模块.如果该模块没有使用完整路径名,服务器将在上面文件段中由ModulePath指定的路径中进行搜索.下面是一些可用的模块:
xf86Elo.so
xf86MuTouch.so
xf86Jstk.so
xf86Wacom.so
xf86Summa.so
xf86AceCad.so
xf86Calcomp.so
xf86Dial.so
在一些系统中还可以把PEX和XIE的扩展作为模块使用,如下:
pex5.so
xie.so
ServerFlag段:这个段指明了一些具体的参数,如下:
NoTrapSignals这个标志将使调试信号对XServer不起作用.调试信号会使XServer"转储核心",把内存中有关的XServer的信息存储到硬盘上,即所谓的"Coredump".这样的目的是便于对XServer进行调试.一般来说,除非是X的除错人员,否则我们是用不到这个选项的.
DontZap这个标志将使XServer收到"Ctrl+Alt+BackSpace"键组合发出的信号时*不*停止工作.当然一般是不建议使用的.
DontZoom这个标志使XWindow不能在各种图形模式之间进行切换.XWindow的缺省状态是在用户设定了多组分辨率,刷新频率和颜色的组合的情况下,运行XWindow的过程中可以通过Ctrl+'+'和Ctrl+'-'两组键的组合在多个图形模式之间进行动态切换.
Keyboard段:这个段指明了XWindow环境中所使用的键盘映射以及其他一些参数.如下是作者的键盘配置:
Section"Keyboard"
Protocol"Standard"
#这里的取值的可能值是"Standard"和"Xqueue"
AutoRepeat5005
#指定延迟(delay)和速率(rate),这里的设定分别为500和0.
#注意:这个设置并非对所有的平台都适用
LeftAltMeta
RightAltMeta
#使用左右Alt键作Meta键.
#这里的可能值为"Meta","Compose","ModeShift","ModeLock",
#"ScrollLock","Ctrl"
ScrollLockCompose
RightCtrlControl
#这两行的可能值同上面所述
XkbKeycodes"xfree86"
XkbTypes"default"
XkbCompat"default"
XkbSymbols"us(pc101)"
XkbGeometry"pc"
XkbRules"xfree86"
XkbModel"pc101"
XkbLayout"us"
EndSection
这段设置出了XkbLayout会影响键盘各按键的表现以外,其他都只是一些功能上的设置,没有太大影响.在控制台模式下,可以通过Alt+F?在各虚拟终端间进行切换,在XWidow环境下,必须使用Ctrl+Alt+F?才能够达到这一效果.
对于本段以及下面的Pointer段,由于本人经验和所知的限制不能完整地讲述,会在不久以后作进一步补充.并在此向各位表示歉意.
Pointer段:如前所述,这个段是设置鼠标等设备的.如下举例是作者的鼠标设置:
Section"Pointer"
Protocol"PS/2"
Device"/dev/mouse"
#下面这两个参数是一些采用磁技术的鼠标所需要的,一般注释掉或者删除
#BaudRate9600
#SampleRate150
#下面的两个参数是为方便使用双键鼠标的用户使用三键鼠标而设置的
#当选择了虚拟三键的时候,可以通过同时点击鼠标左右键完成中键的功能
Emulate3Buttons
Emulate3Timeout50
#下面这个参数也是为磁金属鼠标所设定的
#ChordMiddleEndSection
Mornitor段:这个段的设置需要参考显示器的用户手册,以便获得相关的数据,防止损坏显示器.这个段是我改动最多的,现举例描述如下:
Section"Monitor"
Identifier"SamsungSyncMaster500s/500Ms"
#监视器标示符,在下面Screen段用作标示
#这个参数的设置对显示器的模式没有直接影响,只要保证跟后面
#Screen段的引用保持一致VendorName"Unknown"
#生产厂家的名称ModelName"Unknown"
#制造和型号的标示,并不重要#在使用Xconfigurator的时候,如果不提供上述值,则填写
#"Unknown"
#下面这两个参数在设置显示模式上来书哦是比较重要的.
#HorizSync是水平扫描频率,kHz为单位.
HorizSync50-60
#VertRefresh是垂直扫描频率,Hz为单位
VertRefresh80-100
#上面这两个参数可以是列举的形式,也可以是范围的形式.
#比如:列举:7585100
#范围:如上所述
#接下来是模式的描述了,如果您使用的是TurboLinux或者是
#RedHatLinux,下面的模式列表将会非常的完整.但Slackware
#没有提供完整的列表,这些数据可以在显示器的说明书上见到.
#为节省空间,这里仅列举一条
#800x600@85Hz,55.84kHzhsync
Modeline"800x600"60.758008649281088600616621657-HSync-VSync
#或者写成以下形式,为Slackware采用
#Mode"800x600"
#DotClock45
#HTimings1024104812081264
#VTimings768776784817
#Flags"Interlace"
#EndMode
Endsection
这里来讲讲上面的ModeLine的涵义.就象第二种形式所描述的那样,这些参数是使用"800x600x85Hz"模式所需要的.要设置显示为这种模式,首先要保证水平扫描频率和垂直扫描频率要配合好,即VertRefresh的范围或列举值中要包括85Hz,而HorizSync的值需要包括55.84kHz.这些都可以通过手工调整.然后需要看看打点频率.有些显示器有这个参数提供,而另外一些可能检测不到,这时需要查看手册.打点频率的值可以不提供,这点在下面会有讲述.
注意,这里的"800x600"就是这种模式的标示.等到下面谈到模式的设置顺序就会清楚XWindow是如何设置的了.
Device段:这里主要记录了显卡的数据,如下可以看到,很简单,只有显存的大小和显卡的时钟频率.这个时钟频率是用来产生视频信号,而显示器的扫描频率也是根据这个信号产生的.所以不要为了追求高分辨率和高刷新频率把它调得太高,否则可能会损伤显示器.一般在显示器的说明书上会有这个值,如果没有,建议不要超过50.
Section"Device"
Identifier"GenericVGA"
VendorName"Unknown"
BoardName"Unknown"
Chipset"generic"
#VideoRam256
#Clocks25.228.3
EndSection
注意:上面所说的两个段都可以对多个设备进行描述,系统会用Identifier的值区分不同的设备.
Screen段:XWindow的显示模式的选择就是记录在这个段中的.如果是RedHat则会有所有四种(Mono,VGA16,SVGA,Accelerate)XServer的段,如果是Slackware,则可能会只有一个段,就是对应安装系统的时候指定的显示设备的.下面以我使用的accelXServer说说各字段的涵义.
Section"Screen"
Driver"accel"
#这个不用解释了吧,是PermediaII显卡,所以使用加速的驱动
#这里的可能值是"vga2","vga16","svga","accel",根据自己
#的实际情况设定.这里跟前面讲XServer时所说的X的连接
#目标有关系,我想这不难连接吧.
Device"3DLabs|PermediaII2D+3D"
#上面制定的显卡配制,用"3DLabs|PermediaII2D+3D"作为
#Identifier的.当然我可以使用自己喜欢的名字,实际这里只是
#个标记的作用
Monitor"SamsungSyncMaster500s/500Ms"
#这里的解释同Device,也是使用上面的Identifier的设定值
Subsection"Display"
#显示子段,可以有多个,分别对应不同的色深,即下面的Depth
Depth16
Modes"800x600"
#所取的显示模式这个值就是根据前面的ModeLine上面
#的注释写的,可以有多个,用空格分开
#这里需要说明的是,XServer先检查这里的分辨率设置,
#然后根据这个设置和上面标示的垂直和水平刷新频率决
#定使用哪个ModeLine,如果在刷新频率的范围内有多种
#Mode可以选择,那么可以通过使用Ctrl+'+'/'-'进
#行动态切换.ViewPort00#这个是视图的左上角坐标
#如果想用虚拟大小的屏幕,可以在这里加上一句
#Virtual1024768
#这样的话,就可以使用大于当前实际屏幕的虚拟屏幕了,
#屏幕会随这鼠标的移动而转换.当然,要保证有足够的
#显存才行,虚拟的屏幕大小要比实际的设定大..EndSubsection
#在这下面可以再加上Depth分别为8和24的子段,格式和上
#面一样.
EndSection
当然,如果发现所选的设备驱动根实际的硬件设备不相符,还可以重新安装驱动程序.如何在Linux下面安装软件,我想就不再详细介绍了.介绍这方面知识的资料很多.
参考
XF86Configman手册页