它的window-id,然後将此window-id 做为xwd 的id选项之引数。
阶层的资讯:你可以看到这个视窗的父视窗的id,几个子视窗的id,以及
根视窗的id,在xlswins 中可得到相同的资讯,但在这里只能得到最
近一层子视窗的id,并非整个子树。
几何细节:视窗的大小和位置,以及它的四个角的位置。
和server有关的重建构参数:像”gravity ”和”backing store ”这
些状态(state) ,当视窗改变大小或从被遮盖的状态下重新显
露出来时,server需要用到这些参数,这些参数你自己不会用到,
但可藉它了解系统如何运作。
事件参数:这些参数也是给server而非给使用者用的。
视窗管理器资讯:在系统概观中,我们曾经提过应用程式藉著给视窗管理
器一些提示”hints ”来达成通讯(这些提示包括应用程式所希望视
窗的大小,以及重定大小时的限制等。),xwininfo在这个部份的输
出便是告诉你这些”提示”的资料。Program supplied location 为
应用程式建议它自己应该摆哪里。如果你曾给过位置,不论是在命令
列或resource file ,都会在 User supplied location 出现,在视
窗大小方面同理可推,resize increments 解释了为什麽有些视窗(
例如xterm 和xfd )不能把大小定为任意数目的像素,因为应用程式
已经告诉了视窗管理器在重定大小时按多少个像素的倍数放大或缩小
(xterm 和xfd 它们的大小和所使用的字型有关),你也可以由这个
参数知道目前视窗的位置,所以稍後你可以在同一位置上重建它。
12.2.3 列出视窗的性质 -- xprop
如同我们在系统概观所提及的,一个”性质”(property)是指一小段有关
视窗的资料,xprop 让你列出一个特定视窗的所有”性质”,你也可以列印
一个字型的性质。
你可以经由常用的方式来选择视窗(碰触滑鼠按钮或使用-root 或-id 选项)
,如果是指定字型,则用选项-font fontname。
显示出来的格式为:对每一个性质,均有一个性质名称,在其後用小括弧
括住的为性质的型态或格式,最後则为性质的值。大部份你所看到的性质型态
为STRING,性质的值用”
”括起来,其它的性质型态的格式是专属的,从
性质的值很容易了解它的意义,对字型显示的格式稍有不同,它没有性质型态,
但性质的值意义也很明显。
注意:xprop 的输出相当的复杂,我们并不需要了解其所有的内容,端视需要而
定。
以下让我们看看从应用视窗、根视窗、字型所获得不同的输出:
应用视窗的性质
图12-4为xprop 对一个应用视窗的输出,有些资讯你已经在xwininfo中看
到过,在此处你可以在名为WM_NORMAL_HINTS 和WM_HINTS的性质中看到。
┌——————————————————┐
│ p140 fig 12.4 │
│ │
│ 图12-4 一个应用视窗的性质表列 │
└——————————————————┘
其它的性质如下:
WM_COMMAND:执行启动这个应用程式的命令列,被切成一个个用双引号括起来的
单字。
WM_CLIENT_MACHINE :执行这个client应用程式的机器名称(这个例子应用程
式和server在同一部机器上执行,所以机器名称为venus 。)。
WM_CLASS:显示应用程式的instant name和class name,instant name是命令
列中-name 选项的值。
WM_ICON_NAME:应用程式的表徵图所要显示出来的名称(你的视窗管理器必须
能够支援方可)。
WM_NAME :很奇怪的,这不是应用程式的名称,而是由-title选项指定的视窗
标题名称,有些视窗管理器会把标题名称显示在应用视窗的标题
棒上。
注意:上述命令列中-name 和-title两个选项使用得很广,但它并非通用
(universal) 的选项,应用程式在撰写时必需要使用到X Toolkit(工
具箱)才能把这两个选项当成标准选项来用。(参见第15章)
根视窗的性质
图12-5是xprop 对根视窗的输出,显而易见的是,它不会含有任何视窗管
理器的性质,因为视窗管理器绝不可能重新建构根视窗。
┌——————————————————┐
│ p141 fig 12.5 │
│ │
│ 图12-5 根视窗的性质表列 │
└——————————————————┘
有趣的选项如下:
RESOURCE_MANAGER:这个根视窗性质是resource结构的输入源之一,我们将在
第11章详细地讨论它。
几个CUT_BUFFER:当你切取一段本文(做剪贴动作常用),这段被切取的本文
被放在一个切取缓冲器(cut buffer)中,这些缓冲器被当作是根
视窗的性质来储存,对於切取,缓冲器是循环使用的,例如上次
用5 号缓冲器,则下次用6 号,接下来7 号、0 号、1 号等等,
但是黏贴则一定使用上次切取动作所用的缓冲器。
字型性质
图12-6列出当我们指定*times*bold*-i-*-180-*的字型性质,大部份的资
讯我们都不需关心,你可能只对FULL_NAME 和POINT_SIZE有兴趣。
┌——————————————————┐
│ p142 fig 12.6 │
│ │
│ 图12-6 字型的性质表列 │
└——————————————————┘
12.3 观察X的事件 -- xev
”事件”或多或少驱动著整个视窗系统,所有的输入,不论是滑鼠或键盘,
均由”事件”来掌握,”事件”也被用来驱动视窗的重新建构和展现。xev 程
式让你看到当不同的动作发生时,会产生什麽”事件”,以及和”事件”有关
的资讯。
当xev 启动,它会建一个类似图12-7的视窗,而在这视窗中,会开始列出
类似图12-8的有关事件的细节部份。
┌——————————————————┐
│ p143 fig 12.7 │
│ │
│ 图12-7 xev 视窗 │
└——————————————————┘
┌——————————————————┐
│ p143 fig 12.8 │
│ │
│ 图12-8 xev 的输出 │
└——————————————————┘
由於 xev提供大量的系统内部操作细节,你如果想要”实验”系统,这是一个
很有用的程式,有两个说明手册上未提到的选项可以影响到xev 的行为:
-bs option:此选项改变xev 对server是否使用backing store (见第2章),
使用backing store 将减少曝光”事件”的次数(也就是减少应
用程式重新更新它自己视窗的次数),正确的选项内容为always,
whenmapped和notuseful 。
-s:使用save-unders (见第2章),也就是说,要求server保存那些被xev
的视窗遮盖之视窗的内容。
12.3.1 xev 和键盘
如果你将指标移入xev 视窗且按下你的键盘上的某一个键,则一个(或多
个)键盘”事件”会发生,”事件”的资讯包含了keycode 和keysym,这是最
容易观察你的机器上某一个键是什麽键码(keycode) 的方法:执行xev ,按一
个键,xev 便会给你资讯,这对定制你的键盘非常有用,见18章。
12.4 结论
本章所述的这些程式,让你观察系统的内部;获得它的操作细节;和它的
视窗及其它成员特定的资讯.对这些程式本身而言,它们能帮助你了解系统,
但它们最大的用途可能是用来连接那些定制系统的程式。以下的几章在说明如
何定制和设定你的系统,好让系统更适合你工作的习惯。
下一章讨论处理字型和颜色,及如何使用它们。
=====
第13章 使用X的字型和色彩
X支援多种的字型及几乎无限多种变化的色彩,大多数的应用程式允许你指
定应用视窗中各个不同部份的颜色,而几乎所有的X程式均允许你指定你想要使
用的字型。
在X中的字型(fonts):
.有固定的宽度(像哑终端机的字元)或成比例的间隙。
.由本文字元(text characters) 或符号组成,或以上两者均有。
.具有多种的点尺寸(point size)。
.可以修改以适应特定的萤幕解析度(例如对於同一点尺寸的某一种字型,
你可能对75 dpi (dots-per-inch 每寸若干点) 的萤幕有一种版本,对
100 dpi 的萤幕有另一种版本)。
.有一种标准命名的传统。
.可以以全名存取,也可以用通用字元(wildcard)。
.储存在特定建构的目录树中,只要server在执行时,字型便可以加入或
移出。
在系统间进行字型的交换有一套标准的格式,并且有工具程式可以将这个
格式转换成你的server能了解的格式,工具程式也包含了列出可用字型的目录
、观察某一特定字型内容等功能。
本章先对字型作一简短的介绍,让你能尽快的使用它们,然後才转而详细
地解释字型的结构、格式、工具程式等,最後一节讨论色彩:如何设定和使用
它们。
13.1 字型初步
本节的目的是让你尽快地能使用字型,我们将告诉你如何找出有哪些字型
可用、指定你欲使用的字型名称、看字型的外观、如何在X应用程式中使用字型。
13.1.1 列出可用的字型
xlsfonts程式一行行的列出server上可用的字型,图13-1显示部份的
xlsfonts的输出,内容为MIT 版标准的字型。
┌——————————————————┐
│ p146 fig 13.1 │
│ │
│ 图13-1 典型的字型目录列表 │
└——————————————————┘
13.1.2 字型命名
有些字型的名称太长以致使用不便,但很幸运的,它们也不常被使用,并
且,X支援字型名称可使用通字元(wildcard):
? 对应任何一个字元
* 对应从(字元)长度为零至长度若干的字串
这和Unix shell传统的通用字元档案名称相同,使用通用字元可使你更容
易指定字型名称。
注意:如果你在shell 的命令列指定一个通用字元的字型名称,需要在名称前
後加上双引号 。
13.1.3 观察一个特定的字型
xfd (X font displayer 的缩写) 程式由引数(argument)得到字型的名
称之後,建立一个视窗并且在视窗中显示此名称之字元字型,例如:
xfd -fn "*symbol*-180-*"
将显示如图13-2的视窗。
┌——————————————————┐
│ p147 fig 13.2 │
│ │
│ 图13-2 字型的展示 │
└——————————————————┘
13.1.4 以X程式使用字型
大多数的X程式使用文字,并且允许你指定使用的字型,如何使用的详细
细节可能因不同的程式而异,如果有问题的话可以看指南页。但是几乎都是以
命令列中选项 -fn fontname 或 -font fontname 来指定字型名称,bitmap、
xclock、xterm、xload、xmb 和 xedit都是这样操作的。例如假设你是为了展
示的缘故,以很大的字型执行xterm ,你可以用下列命令列:
xterm -fn "*courier-bold-r-*-240-*"
注意:如果你给程式的指定对应到一种以上的字型,则server会随便在其中选
取一个,例如:如果你省略了上例中的 -r 的指定,则你会使用到意大
利斜体(italic)字型或反斜体(reverse oblique) 字型,和原来所指定
的罗马(roman) 字型的机会是一样的。
现在你应该有一些概念了,我们将从不同的观点详细地讨论。
13.2 字型如何命名
在X中,字型可以取成任何名称,但几乎所有的字型均依照它们的本质来
命名,这样的命名方式,名字是由几个不相关的部份组合而成,而我们在使用
应用程式时,光凭著字型名称便可以大略了解字型的内涵。
我们以一个字型名称为范例,逐一解释它的组件,组件之间是由短横线(-)
所分开的,而且可以包含空白,字型名称对字元大小写并不会区别,范例如下:
-adobe-times-bold-normal--12-120-75-75-p-67-iso8859-1
adobe :字型的制造厂商。
times :型态家族(type family) ,其它尚包含courier ,helvetica 和
new century schoolbook。
bold :粗体字,其它包含light (细)和medium(中等)。
r :字体倾斜的型态,r 是roman (罗马体),其它是 i(italic意
大利体),o (oblique 倾斜体)。
12 :字元的高度,单位为像素。
120 :字型的点尺寸(point-size),为点的10倍(120 意为12点,一点
约为1/72英□宽)。
75-75 :字型被设计在显示装置上的水平和垂直的解析度(每□若干点)。
p :字和字之间的间隙,p 是proportional(成比例的),相对的是
m (monospaced固定宽度)。
如果你对某一栏有特别的兴趣,在本版的说明文件档
$TOP/doc/fontnames/fname.txt
中,有对每一个组件完整的说明。
你通常比较有兴趣的项目为家族型态、字体粗细、何种斜体字以及字型大
小,除了指定这几项的值外,其它的项目不妨藉著通用字元的方式去指定。
13.2.1 通用字元和字型名称
在第13.1节中,我们曾经解释过通用字元的规则:星号(*)表示对应到
零或多个字元,问号(?)对应到一个任意的单一字元。
你可以随意的使用通用字元,当你的设定对应到一种以上的可用字型时,
server会随便挑一种字型来用,如果你的设定什麽字型也没对应到,通常你会
获得一行讯息,而server将会使用预设字型。
你可以对字型的点尺寸使用通用字元,而不是像素尺寸,因为在显示器上
一个给定点尺寸的字型对不同的解析度有不同的像素尺寸,所以用通用字元指
定点尺寸可以造成与装备无关的效果,上述的范例你可以如此设定:
*-times-bold-r-*-120-*
也就是说以-120-取代-12-
13.2.2 列出可用的字型 -- xlsfonts
xlsfonts列出在你server上可用的字型(如果你使用用命令列中-display
选项,便可列出其它server上可用的字型)。预设是列出所有的字型,但是就
如同Unix的ls命令一样,如果你加上限制,便只会列出合乎限制的项目,例如:
xlsfonts "*-times-*-180-*"
列出所有18点Times的字型。
原则上,xlsfonts试图在每行列印出尽量多的字型名称,但实际上,大部
份的字型名称都很长以致一次只能印一个名称,但是要小心,当字型名称含有
空白时,一行有数个字型名称常常容易混淆。
注意:许多的字型名称开头为一短横线(-) ,所以xlsfonts会误把此种状况当
成命令列的选项来解释以致发生错误,例如:
xlsfonts "-adobe-*"
会失败,你可以用选项-fn 加以区分,或者只要在设定之前加一个星号(*)
即可:
xlsfonts "*-adobe-*"
xlsfonts -fn "-adobe-*"
13.3 观察特定字型的内容 -- xfd
xfd 是一个”字型显示”的程式,它建立一个视窗,而後在视窗中将字型
的元素显示在长方格子中。视窗可能没有大到一次将字型中所有的字元显示出
来(尤其是你可能对它重定过大小),但你仍然可以存取它们:
向前移动:在xfd 视窗中碰触滑鼠右按钮,视窗的下一页将会出现。
向後移动:碰触滑鼠左按钮。
获取字元的资讯:在字元上碰触滑鼠中按钮,xfd 会给你字元号码,如果
你在程式一开始设定命令列选项-verbose,你将获得一些更多的资讯,例
如字元的大小以及它在字元”cell”中的位置。
13.4 如何储存字型及存在何处
在本节中,我们描述字型不同的格式,以及转换两种不同格式的工具,然
後讨论server是如何存取字型和你如何更改对字型的选择。最後,我们会给一
个完整的范例来说明如何加入一种新的字型到你的系统。
13.4.1 字型的格式 -- Server Natural Format (SNF)
字型在server上是以Server Natural Format (SNF) 方式储存,这种格式
并不是一种标准,而且为server所专用,所以你不能将字型移到不同型态的
server。
showsnf 程式印出储存在SNF 档中字型的资讯,对字型本身执行xprop 可
获得更多类似的资讯。(showsnf的引数为档案名称,xprop 则为字型的名称,
字型名称和档案名称并不相关。)
Bitmap Distribution Format(位元映像分布格式)-- BDF
为了克服字型流传的问题,X协会对字型交换指定了一种格式,就是Bitmap
Distribution Format (BDF) ,BDF 以ASCII 的方式表示字元的位元映像,并
且只包含可印出的字元,所以它具有完整的可携性(portable)。
在”Bitmap Distribution Format”文件中包含了对BDF 完整的描述。
从BDF 转换成SNF - bdftosnf
为了让BDF 能够有用,你必需能将BDF 字型档转换成SNF 档,目前X协会
放弃让这个需求成为X的成品。
在MIT 版,你可以用bdftosnf来完成转换。
由其它的格式转换
许多的绘图机器拥有它们制造商自己发展的字型,通常特别适合它们的显
示器。如果这些字型能在X使用那是再好也不过了,但是因为格式的问题,你
不能使用它们。
MIT core版并不管这个问题,但是core版则有许多的工具程式将制造商特
制的字型转换成BDF 格式,从BDF 你又可以用bdftosnf转换成你自己的SNF ,
本章稍後我们会有一个这样的范例。
13.4.2 字型储存在何处 -- 字型目录
字型被储存在server上某一个或多个字型目录(font directory)中,字型
目录由三个部份组成:
1. 一个普通的目录,为包含著字型的SNF 档案之所在。
2. 一个被X使用,将SNF 档案名称对应到字型名称的资料库。
3. 一个可选择性的别名档(aliase file) ,可以让你用一个以上的名称
参考到同一字型(不论你使用了多少个目录,你只需要一个别名档)。
维护字型目录 -- mkfontdir
mkfontdir 设定新的字型目录并且可以修改它:
1. 在档案目录中搜集了所有你要使用字型的档案,档案可以是BDF 档(通
常档名结尾为.bdf),SNF 档案(.snf)或被压缩的SNF 档(.snf.Z),mkfontdir
会自动将非SNF 档案转换为SNF 档案。(被压缩的档案是被BSD 压缩程式执行
过用以节省档案空间。)
2. 如果你要使用别名,需要在字型目录中建立(或编辑)一个名为
fonts.aliase的档案。有关此档案格式的细节部份在指南页中有说明,简单地
说,它的格式为每行以空白间隔出两个栏位,第一栏是别名的名称,第二栏则
是字型的名称(可包含通用字元),例如:
tbi12 *-times-bold-i*-120*
注意:你对字型定义的第一个别名将造成该字型真正的名称无法使用,以上例
而言,你只能以tbi12 来存取字型,这种情形也许下一版会改进,但目
前你可以在第二行将第一行反过来即可(但不可使用通用字元)。
tbi12 *-times-bold-i*-120*
-adobe-times-bold-i-normal--12-120-75-755-p-68-iso8859-1 tbi12
3. 执行mkfontdir ,需把档案名称当成引数输入,以你使用预设的X建构
为例 :
mkfontdir /usr/lib/x11/fonts/misc/usr/lib/x11/fonts/75dpi/usr/lib/x11/fonts/100dpi
(如果档案目录中没有包含字型资料库,mkfontdir 会忽略它。)
注意:建立一个字型目录并不会导致server”注意”它,你必需重新启动server
或重设字型搜寻路径(search path) (下面描述):
字型搜寻路径 -- xset
你可以使用任何数目的字型目录,但如果它们有任何和预设建构不同的地
方,你需明确的告诉server,这些字型目录的列表称之为字型搜寻路径(font
search path)或字型路径(font path) ,你可以设定这个一连串以逗点为区隔
的档案目录。
查看你目前的字型路径:使用命令xset q,如此会印出一大堆资讯,其中有
一行包含著你的字型路径类似下面:
Font Path : /usr/lib/x11/fonts/misc/,(cond.)
/usr/lib/x11/fonts/75dpi/,/usr/lib/x11/fonts/100dpi/
设定不同的字型路径:使用命令xset fp new-path,例如,如果你有大量
的本地字型且不欲使用多数的标准字型:
xset fp /usr/local/xfonts, /usr/lib/x11/fonts/75dpi
注意:fp之前并无一短横线(-) ,是fp而非 -fp(-fp 的意义不同,见下述)。
当你想重新设定server对字型路径的预设值时,使用命令:
xset fp default
告诉server重新读入字型的目录,使用命令:
xset fp rehash
它告诉server你可能已经改变了字型目录的内容而和它必须重读字型资料
库,现在新加入的字型可以开始存取了。
在现存的路径加入新的字型目录,使用命令:
xset +fp dirlist
加入一列由逗号分隔的目录列(dirlist) 在现存路径之左,而
xset fp+ dirlist
则将目录列加到路径之右。
将字型目录自路径移去:下两个命令列
xset -fp dirlist
xset fp- dirlist
均可将在dirlist 中的目录自现有路径移去。
注意:字型路径由server所掌握,而被所有使用该server的client所应用。
字型路径的次序是重要的,我们曾经提过字型设定可以对应至一或多个字型,
server会自行选择,但如果对应的字型是在不同的目录中,则server会选择在
路径中较早出现者。
你可以利用这个原则来安排最适合你的显示器解析度的字型。假设你的显
示器解析度为100dpi,则将100dpi字型设在75dpi 之前,例如:
xset fp /usr/lib/x11/fonts/100dpi/,/usr/lib/x11/fonts/75dpi/
如果你指定字型为:
* -times-bold-r-*-120-*
虽然字型有75dpi 和100dpi两种版本,但你会用到100dpi的字型,这正是你所
需要的。
13.5 范例:增加新字型至你的server
现在我们将说明如何增加一个新的字型到你的server的完整范例,为了
真实起见,我们以Sun所提供的字型为例,将它转换至BDF ,然後装设(install)
它,字型开始时在:
/usr/lib/fonts/fixedwidthfonts/screen.r.7
欲将Sun 的字型转换成BDF ,我们需使用contrib 版的软体程式vtobdf(
其它系统也有类似的工具)。vtobdf有两个引数,分别是输入档档名和欲建立
之BDF 档档名,我们可以事先自contrib 磁带取得此程式,编译它,而後加入
我们可执行的目录中,我们就可以使用它了,我们将或多或少依据X的标准来
命名这个新的字型,我们喜欢把输出档的档尾名用.bdf,但由於vtobdf会在字
型名称後自动产生.bdf,所以可以省略它,但在稍後之重定名称则不可省略。
venus% cd/tmp
venus% vtobdf /usr/lib/fonts/fixedwidthfonts/screen.r.7-sun-screen--r-normal---70-75-75-m---
现在重新命名档案,并将其搬入字型目录:
venus% mv- -sun-screen--r-normal---70-75-75-m---/usr/lib/x11/fonts/misc/-sun-screen--r-normal---70-75-75-m---.bdf
最後,执行mkfontdir 和告诉server重新读入字型目录以便能使用此字型:
venus% mkfontdir
venus% xset fp rehash
检查一下此字型是否真的可用:
venus% xlsfonts "*-sun_screen*"-sun-screen--r-normal---70-75-75-m---
注意:你的字型可能可以取代其它的预设字型,但这些字型档案可能因有保护
而无法更改,必须问一下你的系统管理者。
13.6 使用X的色彩
我们已经用过一些色彩,但并未细述它们,原因是X允许你用日常常用的
彩色名,在本节我们描述一些其它指定颜色的方法,解释命令结构如何工作和
你如何设定一些你自己拥有的色彩名称。
13.6.1 RGB 色彩设定
换一种指定色彩的方式,你可以用RGB (Red (红)、Green (绿)、Blue (蓝))
三元素来指定,设定之形式为:
#<r><g><b>
必须合乎以下的原则:
.设定必需以井字号(#) 开头。
.元素需依照红、绿、蓝的次序依序设定。
.三元素均必须指定。
.每一个元素为十六进位,共占一到四个位数,因此ffff代表色彩的最大
强度,0000代表没有该色彩,例如:
#0000ffff0000
是最亮的绿色,红色和蓝色一点都没有,同样的:
#000000000000 黑色(什麽色彩都没有)
#ffff0000ffff 紫色(全部的红色加蓝色)
#ffffffffffff 白色(全部的色彩)
注意#rgb和#rrrgggbbb代表的色彩强度是相同的,但後者较亮一些。
.每一个元素可由一到四个位数代表,但每个元素的位数则相同(例如你
不可以用#rrbbbbgg )。
你可以在设定色彩时直接使用色彩名称,例如:
xclock -fg #3d7585 -background pink
色彩设定的形式往往和你的显示器非常相关,通常没有什麽可携性。
13.6.2 X色彩资料库
为了克服#rgb色彩设定不可携的缺点,而且使系统更易於使用,X使用一
个储存色彩名称及其相关之rgb 值的资料库。
除非你的系统在装设之後作了明显地改变,应该会有一个/usr/lib/x11/rgb.txt
的文字档说明资料库的内容。这个档的前数行类似於:
112 219 147 aquamarine (绿玉色、碧绿色)
50 204 153 medium aquamarine (中度碧绿色)
50 204 153 Medium Aquamarine (中度碧绿色)
0 0 0 black (黑色)
0 0 255 blue (蓝色)
95 159 159 cadet blue (学生蓝)
每一行前三个数字表示rgb 的元素值,但在此数值是10进位的,且只从0
到255 ,255 代表色彩最大强度,第四个部份为色彩名称,允许名称中间有空
格。
你可以用程式$TOP/rgb/rgb将此文字档转换为内部的形式,(当你的X系
统建立时,它并不会被装设)。所以,要在你的资料库中加入一个新的色彩,
先用文字编辑器将色彩输入rgb.txt 档,然後:
venus% cd usr/lib/x11
venus% $TOP/rgb/rgb < rgb.txt
事实上,rgb 并不需要每次均重建内部资料库,只需加入新增(或修改)的项
目即可,所以你可以用标准输入来输入色彩:
venus% $TOP/rgb/rgb
255 50 50 mypink
…
因为没有任何标准的工具程式可以查询内部资料库的内容,因此上面的作法会
造成rgb.txt 和内部的资料库不一致,所以还是以修改rgb.txt 的方式为佳。
13.7 结论
本章你已经看到如何命名和储存字型,你如何找到可用的字型及字型的内
容,在X应用程式中如何使用字型,和如何在你的系统中加入新的字型。
最後一节则描述了X的色彩命名原则,色彩资料库和如何加入你自己的色
彩。
这里所描述的公用程式只包含core版,contrib 版包含更多的软体,例如
有一个叫做xcolors 的程式,它可以建立一个视窗,并在其中显示在你系统上
已命名的色彩。
多种的字型和色彩在你的萤幕上出现是一种冲击,接下来你会看到更多的
视窗系统的功能,并□试调整使其适合你工作的习惯及品味。
下一章我们将继续定制这个系统,告诉你如何利用X的位元映像公用程式
来建立、编辑和使用影像。
=====
第14章 定义和使用位元映像
一个位元映像是一个小图,说得更清楚一点,一个图的显现是由像素组成,
而像素又是由一个位元来对应,当位元为”1 ”时,像素为”黑色”,而当位
元为”0 ”时,像素为”白色”。X有许多的公用程式来管理位元映像,你可
以用不同的方法来建立、编辑和储存它们。有一些使用者程式允许你直接使用
它们。(其它大部份的程式则以内部的形式使用它们,这些公用程式大都放在
X程式库中,使得使用者撰写程式时很容易便可加以运用。)
本章开始先描述位元映像的工具,接下来实际使用xsetroot程式,它可以
让你定制你的萤幕,设定一个位元映像的背景,选择你的色彩和指定一个位元
映像当作游标来使用。
14.1 系统位元映像程式馆
位元映像档案的程式馆被当作系统的一部份提供给你,预设储存在这个目
录:
/usr/include/x11/bitmaps
但在你的工作站上或许不同,问一下你的系统的装置者,我们将以此目录为准,
并用其中的一些档案作为本章的范例。
14.2 交谈式地编辑一个位元映像 -- bitmap
bitmap程式是一个让你以交谈式建立或编辑位元映像的工具,它将位元映
像以方格子来表示,每一个格子代表一个像素,你可以用滑鼠设定或清除像素。
14.2.1 启动bitmap
透过bitmap你可以编辑一个包含有一个位元映像的档案,或从头开始建立
一个位元映像并将它储存为档案。不论是何者,当你启动bitmap时,你需要给
一个档案名称,不论是现存的档案或是新建的档案。
当建立一个新的位元映像时,你可以选择性地指定大小(宽度X 长度个像
素),如果你未指定,预设大小为16X16 。举例来说,假如我们想要建立一个
比较大一点的十字型数位映像,我们可以用下面的命令列:
bitmap big-cross 40X50 &
14.2.2 使用bitmap
假如我们要编辑一个现存的档案,可以用下面的命令列启动程式:
bitmap /usr/include/x11/bitmaps/cntr-ptr
则一个像图14-1的视窗出现在萤幕上,右下角以实际大小显示出目前位元映像
的状态,另一个则为反相(reverse) 的位元映像,其它在右边的”盒”你可以
用碰触滑鼠按钮的方式来操作它们。
用三钮滑鼠编辑图形最简单的方法:
设定像素:在一个像素上碰触滑鼠左按钮,或者是按住左按钮并拖拽它,
每一个经过的像素方格均会被设定,直到松开按钮为止。
清除像素:和上述相同的方法,但是以滑鼠右按钮代替。
反转(invert)像素:在一个像素上碰触滑鼠中按钮(也就是黑的像素被清
除而白的像素被设定),当你按住中按钮并拖拽,所经过的像
素格均会反转。
┌————————————————————┐
│ p160 fig 14.1 │
│ │
│ 图14-1 位元映像编辑器 │
└————————————————————┘
bitmap还有其它的面貌:如果你观察接近箭头的上端部份(见图14-2的
放大图),你可以在其中的一个方格中看到有一个小菱形,这代表了热点(hotspot)
,当bitmap被用来建造一个游标时会应用到:热点是游标真正动作的点。指向
型的游标,热点通常在顶端,而圆形或方形的游标,热点则在中心。(你可以
用Set Hot Spot和Clear Hot Spot两个命令来更改热点的位置或消去它)
当你结束了你的更改动作,可以用碰触Write Output将位元映像储存至档
案,但不会离开bitmap程式。
┌————————————————————┐
│ p161 fig 14.2 │
│ │
│ 图14-2 一个游标的”热点” │
└————————————————————┘
离开程式,碰触Quit,如果你编辑了位元映像却试图在未储存前离开程式,
你将会得到提示以确定你是否真要如此做。
14.2.3 画形状(shapes)
bitmap有数个功能使得画图更容易:
画一条线:碰触Line,游标会变成一个大黑点,在所欲画的线的一端碰触
一下按钮,而後在另一端也碰触一下,bitmap会画出这条线。
画一个中空的圆:碰触Circle,同样地,游标变成一个大黑点,在你所欲
画圆的圆心碰触一下,而後在所欲画圆之圆周上的任一点碰触
一下,bitmap将画出这个圆的圆周。
画一个填满的圆:碰触Filled Circle ,其馀同上。
14.2.4 在长方形的区域内工作
命令Clear Area、Set Area和Invert Area 必须在长方形区域下操作,长
方形区域的决定方式是你在它的左上角以按住滑鼠任意按钮的方式指定,然後
拖拽到右下角,当你拖拽时,目前被指定的区域会以高亮度显示。
你可以拷贝、移动或重叠(overlay) 一个区域,你以拖拽的方式指定原始
区域,而後在目标区域上的左上角碰触按钮,各种命令的动作如下:
拷贝(Copy):目标区域会被消除,而所有对应於原始区域为黑像素的
均会被设定。
移动(Move):原始区域和目标区域均被清除,目标区域对应於原始区
域为黑像素的均会被设定。
重叠(Overlay) :在目标区域中对应於原始区域被设定的像素均会被
设定,其它没有改变。
14.2.5 一个位元映像的档案格式
一个位元映像会如同ASCII 文字一样储存到档案中,其格式类似C 语言程
式片段。
例如:档案 /usr/include/X11/bitmaps/cntr_ptr 的内容:
#define cntr_ptr_width 16
#define cntr_ptr_height 16
#define cntr_ptr_x_hot 7
#define cntr_ptr_y_hot 1
static char cntr_ptr_bits[]=
0x00, 0x00, 0x80, 0x01, 0x80, 0x01,0xc0, 0x03, 0xc0, 0x03, 0xe0, 0x07,
0xe0, 0x07, 0xf0, 0x0f, 0xf0, 0x0f,0x98, 0x19, 0x88, 0x11, 0x80, 0x01,
0x80, 0x01, 0x80, 0x01, 0x80, 0x01,0x00, 0x00;
带有_x_hot和_y_hot的变数仅在热点被指定後才会包含进来。
更多的细节包含在bitmap(1) 的指南页中,不过无论如何,你毋需直接以
此种格式处理位元映像,任何你想要做的事均有工具程式来处理。
14.3 编辑位元映像其它的方法
bitmap程式对於一个小的图形工作起来算是相当方便,但它有一些缺点:
.它不接受较简单格式的输入档,例如像一些由扫描现存图形所产生的档案。
.它必需以交谈式执行,对一些程序性的编辑动作并不方便。
.你可能希望用它产生一些位元映像来显示,但它无法在非X系统上执行。
要克服上述的问题,需要以字元图(character picture) 的形式来建立位
元映像,并提供这个格式和bitmap的格式相互转换的程式。字元图格式是非常
明显的:每一行的像素用一行的字元来表示,黑的像素用一个指定的字元(预
设为# )而白的像素用另一个字元(预设为 -)表示,以cntr_ptr为例,字元
图的格式如图14-3
┌————————————————————┐
│ p164 fig 14.3 │
│ │
│ 图14-3 字元图格式的位元映像 │
└————————————————————┘
你能以本文编辑器或其它任何系统上任何其它合适的程式编辑这些图形,
也可以由扫描器(scanner) 或其它影像设备产生。
14.3.1 字元图和X位元映像间的转换
X提供了两个程式作字元图格式和位元映像格式间的转换:
atobm : 转换一个字元图为标准的位元映像。
bmtoa : 转换一个标准的位元映像为字元图。
两个程式均允许你指定以何字元来代表黑和白像素。
14.4 定制你的根视窗 -- xsetroot
xsetroot 让你设定你的根视窗的特徵,你可以改变视窗背景的颜色和图样(
pattern) ,以及视窗所使用的游标。
14.4.1 设定一个背景的位元图样
你可以指定任何位元映像来当作你萤幕的背景(只要它是X的标准格式)
, 在 xsetroot 的命令列上,-bitmap 选项跟随著位元映像的档案名称。例如:
xsetroot -bitmap /usr/include/X11/bitmaps/mensetmanus
会出现一个精致的背景(见图14-4)(拉丁语 Mens et Manus (mensetmanus)
是 MIT的箴言,两个人物的图形简单表现出 MIT的精神。)
┌————————————————┐
│ │
│ P165 Fig 14.4 │
│ │
│图14 - 4 设定 mensetmanus位元 │
│ 映像为背景图样的根视窗 │
└————————————————┘
14.4.2 设定一个背景游标
如果你不要使用预设的 "大的 X "游标,你可以用选项 -CURSOR 加上
cursorbitmap 和 maskbitmap两个引数来改变它,两个引数均为位元映像
档案的名称。例如:设定游标为前节所示的位元映像,使用命令:
xsetroot -cursor /usr/include/X11/bitmaps/cntr_ptr/usr/include/X11/bitmaps/cntr_ptrmsk
位元映像的对照图见图14-5.
┌————————————————┐
│ │
│ P166 Fig 14.5 │
│ │
│图14 - 5 游标及其遮罩的位元映像 │
└————————————————┘
maskbitmap决定了cursorbitmap的哪些像素真正被显示出来:游标像素
中只有对应到遮罩像素(mask)为黑的部份才会用到,游标其它的像素不会
被显示出来。总结来说,遮罩决定了游标的外形,反之,游标位元映像则
决定了外形的颜色。遮罩和游标的位元映像必须大小相同。
这种遮罩结构在两种情况下非常有用:
1. 它允许 "乾净地" 显示出非长方形游标,而不需显示出多馀的空白。例如
如果没有遮罩,cntr_ptr会显示成一个 16 x 16白方形中有一个箭头,当你用
它指物件时,物件的一部份会被矩形外框遮盖住。
2. 适当地设定遮罩,你可以保证不论背景的颜色为何均能看得到游标。例如
cntr_ptrmsk 比 cntr_ptr 的边均大一个元素,所以游标周围围绕著一圈白边
。如果遮罩和游标大小相同的话,当游标在黑色的区域将会消失不见。
你可以让遮罩和游标使用相同的位元映像:游标的外形会如你所期望(因
为遮罩决定外形,而这外形正是你想要的),它们可以工作,但是当游标进入
和它相同颜色的区域时,你就很难看到游标了。实际上,并非所有在
/usr/include/X11/bitmaps中的位元映像均有相对应的遮罩,如果你使用它们
当作游标,你必须使用游标位元映像当作遮罩。
有兴趣的话,试一试把mensetmanus 当作游标和遮罩(热点是在左上角)。
14.4.3 其它的背景设定选项
你可以用命令列选项 -solid colour设定背景为单一颜色(在单色显示
器上只有黑色和白色)。你可以用 -grey或 -gray设定颜色的灰度,你也可以
用 -mod x y 设定格子图样,x 和 y为 1到16的整数。
14.4.4 重定预设的背景和游标
如果你不喜欢你既有的设定,你可以用下列两者之一恢复预设的游标和背
景:
xsetroot -def
xsetroot
14.5 总结
本章中,我们看到如何以交谈的方式编辑位元映像,如何储存它们,和如
何把它们与其它格式之间作转换以使它们能被那些非视窗系统程式处理。你可
以把位元映像和xsetroot连接在一起,以定制适合你自己口味的系统:用不同
的方法设定你根视窗的背景和变更游标。
下一章,我们继续来定制系统,并且来看一下你用以设定X程式预设选项
的结构。
=====
第15章 定义应用程式的预设选项 -- Resources
大多数的X程式接受命令列选项,以便让你指定前景和背景的颜色、字型
、起始位置等等。这种需求是有必要的,因为如果你在程式内硬性规定使用某
种字型,而在执行此程式的机器上并没有这种字型,则将使得程式无法执行,
所以你不应硬性规定某些参数。
当你每次执行程式时不太可能在命令列中指定所有需要的选项,因为有太多种
可能的组合了,所以X提供了一个叫做resources 的一般性结构,用来传递预
设的设定给应用程式。当你阅读指南页时,你可能已经注意到要你参照resources
,但却不知道什麽是resources ,我们将在此解释。
你在系统中几乎所有的定制动作都将运用到resources ,事实上你为一
个应用程式所选择的每一个选项的设定都要用到resources ,从简单的项目例
如色彩或字型,到定制你的键盘或管理你的显示器如何工作,它非常的方便,
而且在系统中到处都用得到。
本章我们描述什麽是resources ,及关於它们是如何发展的资讯,接下来
我们描述X Toolkit(工具),它完全地使用到了resources 的结构;然後
告诉你一些resources 工作的细节,你该如何设定它们,及你能用它们设定哪些
型态。
这是相当长的一章,有几个新的观念被加进来,一开始会有些困难,但不
需太担心,原则上resources 结构非常地简单,只是第一眼看起来好像有许多
"魔术符号" 而已,也许你应该先很快地浏览一遍,然後再详细地重读一遍。
15.1 什麽是resources ?
在X的文献中,”resources ”有两种意义。第一种是相当低阶的,意指
被server管理或建立而被应用程式使用的东西。视窗、游标、字型等均属於这
种意义。
另一种意义也就是通常你在指南页中常看到”resources ”的意义:它是
一种传递预设设定、参数和其它值给应用程式的方法。在本章中我们局限於
讨论此种意义之resources 。在解释现行系统如何工作前,先回顾一下X的早
期版本是如何掌握这些功能的,因为现行的结构由此产生。
15.1.1 ”预设”的背景
在X较早的版本,对於像视窗背景颜色、视窗边界的颜色、应用程式所使
用的字型这类项目你可以轻易地设定其预设值。
预设值的设定方式很直接,你只需指定一个视窗的属性和它的预设值。例如:
.Border : red
意即所有的视窗均为红色的边(除非你在命令列中重新设定边的颜色),你也
可以把程式的名称放在属性之前,则只有被指名的程式才会改变,所以把以下
这个规格
xclock.Border:blue
和先前的规格结合在一起的意义为:预设所有视窗均为红色的边,只有xclock
的视窗为蓝色的边。
每当你设定预设值,程式会自动取用该值,所以你□需每次均指定你的选
择,它让你依照适合你的工作习惯来使用字型,不论是你要用较小的字型以获
得更多的资讯显示,或是用较大的字型以便阅读,它让你为特定的应用程式选
择颜色,你可以定义应用程式的起始位置,所以你可以自行设计一些启始萤
幕的布置,因为许多的预设值(字型、色彩等)实际上精确的意义为”resources”
,所以”resources ”的意义逐渐扩增为”预设值设定(default setting) ”
或”设定预设选项(setting default options) ”。
15.1.2 Resources 传递资讯到应用程式
随著X的发展,应用程式也随之扩增,需要有一个设施传递大量的资讯到应
用程式以定制或指定它们的行为,而不再只是有关色彩和字型的资讯而已,
例如你可以告诉 xbiff检查信件的频率,或定义 xterm的功能键(function-key)
12为插入某一特定的字串,或在 xedit中连续碰触两次滑鼠中按钮代表选择目
前这段本文等等。
所以逐渐地,resource及预设设施已遂一被发展出来,直到目前对於传递
任何资讯到一个应用程式已是一个一般性的结构。你可以像文字串一样地指定
资讯,应用程式会在内部解释它:例如把这字串当作一个滑鼠按钮的名称,或一种颜
色,或由应用程式所发出的一个功能和 "resources"是如何指定的。
这个结构也逐渐地复杂起来以便让你能正确地指定在何处应用预设值。在
以前,你只能指定所有的程式或某一个特定的程式。现在的系统你可以设定的
预设值如:”终端机视窗的选单选项”或”在所有视窗的标签”或甚至”除了
xterm以外的所有编辑器视窗按钮盒中的功能按钮”。
X Toolkit, 使得resources在使用上有很大的包容性并且增进了应用的
精确度。你需要先了解 Toolkit是什麽,才能适当地使用resource 结构,我
们将在下一节讨论。
15.2 X Toolkit
我们先前曾提过,X并不决定使用者介面,它只是提供一些结构,让应用
程式设计者能组合成任何形式的介面。理论上这是非常合乎需求的 -- 它使得
系统拥有一个一般性目的的工具且没有使用上的限制,但从另外的角度来看,
它有很大的缺点:
.对一个使用者而言,不同的应用程式有不同的介面,不只是难学难记,
且应用程式无法平顺地 (smoothly) 相互协调工作(例如无法在视窗之间
做剪贴),你得到的是一群个别的、独立的程式,而不是一个一致的、
合作无间的系统。
.从程式设计师的立场,意味著基本视窗系统上的每一件事均需从头做起,
选单、卷动棒、时钟、功能钮等等都必须一一生产。甚至在单一的产品,
不同的程式师做了一点稍有不同的事,便会导致许多不相容的情况。
为了克服上述的问题,Toolkit(工具)的方式应运而生。
在某些范围,Toolkit 会决定使用者介面的形式,但是无论如何,它会尽
量减少这种影响,并让使用者介面发展者有更多选择的可能性,Toolkit 被分
为两个部份:
1. 一组基本的结构和函数用以建构使用者介面的元素,被称为Toolkit
Intrinsics(内部的工具)。不论是什麽样的介面,任何工具均需使
用到它,所以我们可以把Toolkit Intrinsics视为”固定的”,也就
是无可替代的。
2. 一组提供特定的使用者介面(或介面的形式)的元素,这些元素被称
为 widgets (小工具),而Toolkit 的第二部份称为 widget set (小
工具组),我们认为这是可以替换的,不同的介面提供不同的Widget
Sets ,甚至它们都使用Intrinsics。
下面两个小节更详细地说明这两个部份。
15.2.1 Toolkit 的第一个部份 -- Intrinsics
Intrinsics定义的实体称为widgets,并提供了所有建立、管理和毁坏widget
所需的设施。理论上,一个widget是一个处理特定动作的使用者介面的元素,实际
上一个widget是X视窗加上规则和功能以决定它的输入和输出的动作,也就是
说,它如何对使用者有所反应。
为了帮助解释widget的观念,我们将给一点范例,但是请注意!它们并不
是Intrinsics的一部份,而是我们将於下一小节讨论的一个特定的widget组的
一部份,在此提出目的只是为了方便。
Command Widget(命令widget):这是一个在萤幕上含有一些文字的长方
形”按钮”(也就是一个小视窗)。当指标在这个按钮之上时,它的边会呈现
高亮度,当一个滑鼠按钮在这个widget被碰触时,一个被程式师指定的软体常
式(routine) 便会被执行。
你已经使用过command widget好几次了:在xedit 的命令选单和在xman的
主选项视窗。
Scrollbar Widget(卷动棒widget):同样的,你也已经使用过了好几次,
在xterm 和xedit 中卷动本文,在xman中卷动本文和目录列。
Intrinsic 提供了基本的结构,任何一个提供介面的较高阶软体均需要使
用到它,它提供了以下的功能:
.建立和毁坏widget。
.把一群widget当成一个单元(unit)来管理。
.掌握geometry,也就是说位置,包括从最高阶(也就是应用程式的 -geometry
选项)到最低阶(管理应用程式用到的sub-widget的位置(例如选单按钮
的位置))。
.掌握”事件”,例如在一个widget中, 当滑鼠按钮被碰触时呼叫适当的程
序、管理视窗的曝光 (exposure)和掌握键盘的输入。
.管理给resources 和预设的每一个widget。
15.2.2 Toolkit 的第二部份 -- Widget Sets
广义来说,Intrinsics只提供你建造一个使用者介面的骨架,Widget Set则
实际地提供了一个既定的介面,且不同的widget组提供不同形式的介面,虽然
对任何范围的需求并无法预防混用widget,但一般仍希望一个系统固定在
一致性的widget set上。
在X core 版上只有一个widget set提供,我们描述於下:
Athena Widget Set (雅典娜widget set)
大部份的MIT core版的应用程式使用Toolkit 和Athena Widget Set.(名
称的来源是X由MIT 的Athena计画产生出来)。这些widget的定义你已在许多
的应用程式用过。
我们在前节提过了Command Widget和Scrollbar Widget,至於Athena Widget
Set 的其它部份包含:
Label Widget:这个你可以想像 -- 在视窗中显示的一个字串或图。(例
如在xman主选项选单中的”Manual Browser”的标题)
Text Widget :我们在第10章描述xedit 时提过的”building block”。
它提供我们所使用的编辑功能。
Viewport Widget :一个具有卷动棒的视窗,让你可以卷动视埠(viewport)
的内容,xman使用其中之一用以显示指南页之目录。
Box Widget:它以一个指定大小的盒管理sub-widget的布置,且试著将 sub-
widget尽量集中在一起,例如xmh 的Reply 、Forward 等命
令钮即是由Box Widget布置。
VPaned Widget :它管理sub-widget,将它们保存在垂直堆叠中,且显示了
在两个sub-widget之间的分隔线上的”把手”(grip),把手
可以选择性的让你改变一个widget的大小,而且另一个相
关的widget大小亦伴随变化,例如我们在图10-12 看到的
xman的视窗的主要的元素是被VPaned Widget 管理的。
Form Widget :另一种管理一组sub-widget的方法,但对位置的选择有更多
的弹性。
List Widget :它管理一群字串,将它们安排在行列中,任何的字串藉
著於其上碰触的动作而被选择:字串会转为高亮度,且呼叫
一个指定的函数以完成特定的动作。xman使用一个List
Widget来掌握在一个指南章节中指南页的表列。
我们现在来看一下如何组合widget以获得所需要功能,我们仍然以xman为
例。xman的指南页之目录在它的低阶是list widget ,管理目录页名称的表列
以及它本身的内容是用viewport widget (让使用者卷动至表列中所需的位置
),将指南页的widget聚集在一起,它们是包含在一个VPaned Widget 中,所
以事实上这是一个阶层状(hierarchy) 的widget,每一个可以完成它的专门
功能,而所有的应用程式所使用的Toolkit 均含有这三个widget结构。
15.2.3 widget:名称和类别 (Names and Classes)
resource和预设结构是在widget名称的基础下工作,所以我们将以对名称
的处理做一个概观方式来结束对Toolkit 的观察,并回到先前讨论的resource。
Toolkit 提供一个物件导向程式系统(object-oriented programming system)
给程式设计师。它定义物件的类别(class) ,也就是指定何时物件被建立或如
何操作等等的物件性质。这些物件即是widget,系统将确保它们和其它的widget
以及其它部份的应用软体以定义明确的方式交谈。
当一个程式设计师建立一个特定类别的widget,它被称为该类别的成员
(instance)(概括的说,一个类别是一个抽象的定义,而一个成员在某些地方
实际地符合这些定义。)建立widget有必须一个名称,由程式设计师指定,(
例如:程式码的实际型式为”Creat a widget, of the class Box Widget,
and call it topBox ”)在某些环境下widget的类别名称也会被参考到。总
结来说,一个widget有一个成员名称和类别名称;更简单的说,一个名称和一
个类别。
15.3 Resources 如何被管理 -- Resource管理器
让我们提醒自己一下我们试图用resource来做什麽?我们要能传递资讯给
一个应用程式,告诉它以某些方式改变它的一般性动作,例如,将视窗的边
以粉红色取代原来的黑色,或使用一些特别的字型。
X用下述的方式掌握这些需求。你设定一个包含许多项resource规格的资
料库,每一个resource规格以一个应用程式的某些特徵命名,且设定一个值给
这个特徵当预设值,也就是说,一个规格 (spec) 的形式为:
characteristic : value (特徵:值)
当应用程式开始执行时,它会先询问资料库是否有任何特徵符合自己所要
的设定,或使用相关的值,例如:
xclock*foreground:blue
意为将值blue设定给特徵xclock*foreground 。用以决定一个程式的需求
是否符合在资料库中之规格的系统部份,被称作Resource管理器。
Resource预设值能被应用到一个应用程式中的物件(通常是widget),就
如同设计整个程式一般,(例如你可以对一个特定的子视窗在某一个命令按钮
的背景色设定预设值,而不是只能针对所有应用程式的视窗背景)。为了能达
到这一点,我们需要一些严谨的命名方法,以设定物件应用预设值。
15.3.1 指定一个Resource预定应用到何处
Resource管理器根据特徵值(characteristic)决定一个预设规格是否能应
用在特别的情况,我们可将特徵值分为三个部份。
1. 你用以设定预设值的程式属性,例如:背景色、字型等。
你必需指定属性 (attribute) -- 意即你设定什麽值给它。给定一个
resource的规格 而不说明它的值是无意义的。
注意:在X的文献和手册中,属性通常被称为”resource”或
”resource name”,”Resource”也通常被用来当作我们称为特徵值。
特徵值的其它两个部份指定预设值在何处使用。例如只在特定的程式
使用或在特定型态的物件,或两者均是。
2. 应用到这个规格的应用程式的名称,如果你省略它,规格将应用到
所有的应用程式。
3. 一连串的限定(restrictions)条件:当物件符合限定条件时,才会产
生指定的应用。限定通常为widget的名称,你可以指定从零开始任何
数目的限定。例如:
xclock*foreground:blue
xedit*row1*Command*Cursor:Cntr_ptr
第一个例子没有任何限定,第二个例子有两个限定(row1 和Command)
三个部份依序排列
[<program name>] [<restrictions>] <attribute>
并以特殊的分隔符号分开,我们将於稍後说明分隔符号的细节,但我
们先看一些特徵值的范例(为了简单起见,我们在范例中只用到颜色
属性)。
一些说明Resource规格的范例
.指定在任何地方中的前景色预设值为黄色。
*foreground:yellow
我们未指定任何应用程式的名称,所以此规格可应用到所有的应用程式;
我们也未指定任何限制,所以对一个应用程式在任何地方都适用。("*" 这个
符号就是我们方才提及的特殊分隔号的一种)
.指定只有在xclock应用程式中的前景色预设值为粉红色。
xclock*foregroundink
这个规格仅能在xclock适用,但是只要项目中的属性叫做
”foreground”的均适用。
.现在,针对一个特定应用程式的特定地方:
xman*topBox*foreground:blue
这个规格仅能在xman适用,而且只能在xman主选项选单中名为topBox的
物件适用。(应该适用於xman中所有叫topBox的物件,但实际上只有一个
topBox物件)
.在第二个范例(粉红色)中我们包含了应用程式名称,但忽略了任何限
制,现在我们反过来:
*command*foreground:green
也就是说,我们指定在任何应用程式中物件名称为command 的前景色预
设值为绿色。
15.3.2 用类别名称一般化规格说明
前述的例子说明了我们对预设值结构所需的大部份功能,但它们有一个限
制:你必须知道应用程式设计师设计在每一个应用程式中的widget名称,这
些资讯有时包含在程式的指南页中的一部份,但通常被省略。
无论如何,Resource管理器有一个尽量减低这个问题的方式:当你在特徵
中不论何处用到一个应用程式名称、限制或属性名称,你均可类别名称(class
name)来代替它。
应用程式类别名称(Application class name):描述程式的型态,例如
xterm 可以是Term Emul (终端机模拟器)的类别,xedit 和emacs
是Editor(编辑器)的类别。(但如果xterm 是xterm 的类别,xedit
是xedit 的类别则失去意义。)
限定类别名称 (Restriction class name):限定几乎是一定不变的widget
名称,所以在此地你可以用widget类别名称。
属性类别名称 (Attribute class name) :属性是如同widget一般的一个
型态或类别的成员(instance)。
传统上,所有的类别名称以一个大写的字母开头,其後则为小写字母,例
如属性”foreground”是属於”Foreground”类别,我们将简单的解释你如何
去发现你需要用来指定项目的类别名称。首先,我们将看一些更多的范例,这
次用到了类别或一个混合了类别和成员的范例。
含有类别名称的Resource规格说明范例
这些范例展示出你如何在Resource规格中使用类别,而较前述以更一般性
的方式设定预设值,它们也解释了你如何能使用一个类别来设定一个预设值给
较大范围的情况,和将类别与成员结合起来以拒绝预设值在某些特殊情况下设
定。
.指定在任何地方前景色的预设值为黄色
*Foreground:yellow
这个范例和先前范例的区别在於我们是对Foreground类别指定预设值。这
个区别之所以重要,是因为并非所有在类别Foreground的属性,它的成员名称
都是叫foreground。例如,xclock的指针的颜色可由类别Foreground的属性来
决定,但它的成员名称不叫foreground而叫hand。
.我们可以用这种结构来帮助我们在文件不清楚的情况下,藉著以强烈对
比的组合设定预设值来分辨物件的类别:
xmh*Command*Foreground:khaki (土黄色)
xmh*Command*Background:maroon (粟色)
如此将使所有的命令widget(command widget)呈现醒目而美丽的颜色。
.对所有的本文widget(text widget) 视窗设定一个预设值,除了xedit
视窗以外:
*Text*Backgroundink
xedit*Text*Background:navy
.和上例原理相同:
*Command*Backgrond:green
xman*Command*Backgrond:white
xman*manualBrowser*Command*Backgroundrange
如何发现成员和类别名称
这很困难,因为没有简单和一致的widget名称、类别、属性等等的文件,
我们只能列出每一个最好的来源,并且提示你如何获得更多的资讯。
应用程式成员名称(Application instance name) :这很容易--它就是你
执行的应用程式名称。如果此程式使用Toolkit ,你能在命令列以选项-name
string明确地指定一个不同的应用程式名称,为何你需如此作?因为它让你在
单一应用程式中定义超过一组的预设值,而你可以使用-name 在其间切换。例
如,你可以定义一个xterm 的正常预设值,但对名为demo的应用程式定义一个
很大的视窗尺寸和大尺寸的字型,你可以用:
xterm -name demo
给你一个用来展示或教学的xterm。
应用程式类别名称(Application class name):这没有文件说明,最简
单找寻它的方法是启动应用程式并在视窗中使用xprop ,性质 (property)当中
的WM_CLASS会给你应用程式成员及类别的名称,例如,对xterm 你会得到:
WM_CLASS(STRING) = "xterm","XTerm"
Restriction/Object/Widget 成员名称:程式的指南页会列出你最想要存
取的物件名称,例如:xman列出topBox,help,manualBrowser 等等,如果指
南页并未给你成员名称,则唯一的方法是如果可能,直接看它们的原始程式码
。(这种方法通常无法令人满意)
Restriction/Object/Widget 类别名称:这容易些,大部份的指南页会告
诉你有兴趣的物件类别,即使没有的话,大部份的物件也是标准集合中的
widget,当你从系统中使用它们时,你通常能猜出它们属於哪一个类别。(例
如:你从未被告知scrollbar 的成员名称,但它99.9% 的机会是类别Scrollbar
的widget (成员)。)
属性名称和类别:大多数的指南页会列出名称,通常也会有类别,xclock
的指南页便是非常清楚的范例。
无论如何,利用Toolkit 写的程式通常使用标准的widget,它的属性并不
会在指南页中列出,但通常由一组全部或部份的属性组成,要找到这些属性,
你必须在Toolkit 文件中寻找:
. "X Toolkit Intrinsics" 手册中的附录E 列出所有标准的"resource"
(也就是属性)名称和类别。成员名称项目看起来类似:
#define XtNborderWidth "borderWidth"
所有的名称均以XtN 开头,跟随其後的名称则以小写字母开头,而类
别的名称则以XtC 开头,类别的项目看起来像:
#define XtCBorderWidth "BorderWidth"
在双引号中的便是名称,也就是说,borderWidth 是成员名称,
BorderWidth 是类别名称。
. 查看"X Toolkit Athena Widgets"手册的2.3 节("Common Arguments
in the Widget Argument list"),可看到被所有widget使用到的
resource名单,包括名称、型态、预设值和一段文字叙述。名称的
定法如上所述,也就是以XtN 开头,XtN 之後则为属性名称。
. 查看"X Toolkit Athena Widgets"手册中对widget的描述,每一个会
列出它所使用的"resource",和上述相同。
. 如果以上均行不通时,你可以查看 widget 的原始程式 (source code),
resources 可用到的部份列在 XtResource 资料结构中。例如,Athena
Scrollbar Widget的程式内包含:
static XtResource resource[]=
{XtNwidth, XtCWidth,...},
{XtNheight, XtCHeight,...}.
附录A中”文件指引”中会告诉你如何找到类似像这个项目的原始程式。
注意:Resource Manager对设定的规格(spec)并无限制,均能接受,对於属
性、元素名称或类别并无事先定义的清单。你所给定的规格可能毫
无意义,但毋需介意,它将存在资料库中,所以事实上一个resource
规格被接受并不意味你已经得到正确的规格和正确的属性或物件或应
用程式;无论如何,它的一个重要的用途为在属性未被设定前你可先
设定其预设值。
15.3.3 Resource规格之分隔号概观
你可以用星号 (*)或点号 (.)来分隔resource规格的元素,星号比较通用
一些,它让你指定那些符合范围的案例的特徵。我们看到
xclock*foregroundink
用来指定xclock中任何东西均使用foreground属性,所以在此范例中可以看出
;星号具有通用字元的效果,甚至可以再一般化一点:
*Foreground:yellow
它将适合任何应用程式,而句点只是分隔组件,它表示每个组件都必须一一对
应,所以规格:
xman.Manual Browser.Help.background:black
并不会适用於命令按钮,或含有xman的视窗的不同widget。在我们对这两种分
隔号作更精确描述前,我们需要更详细的看一下Resource Maneger的操作。
Resource Manager如何运作
稍早,我们曾说过一个应用程式会查询resource预设规格的资料库看是否
符合,现在我们描述查询如何掌握这些规格。
Resource被应用程式中的个别物件(通常是widget)所使用,而物件则被
在应用程式上端hierarchicallyixwidget + hierarchy安排,然後可能由一个
widget管理其它的widget配置,例如本文视窗、命令选单等等。例如应用程式
xeditixwidget 在+ xprognxxedit中的阶层结构如图15-1(每一行物件名称之
後括弧内为类别名称)。
┌————————————————————┐
│ p181 fig 15.1 │
│ │
│ 图15-1 xedit中物件(widget)的阶层 │
└————————————————————┘
对每一个物件,应用程式欲查询Resource资料库时,它必须传递物件的成
员全名和类别全名给Resource Manager,和物件所用的一群属性,和类别名称
的一群属性,例如对SAVE按钮,应用程式指定:
full instance name xedit.vpaned.row1.Save
full class name Xedit.VPaned.Box.Command
attribute instance-names borderWidth,cursor,font,label,...
attribute class-names BorderWidth,Cursor,Font,Label,...
而後Resource Manager检查每一个在资料库中的规格,看它是否和应用程
式所传来的属性和物件名称相符。如果相符发生,在资料库中规格值的部份会
传回应用程式。
在这种相符的操作中,星号和句号的区别非常重要。简单来说,我们可以
想到Resource Manager只是以单字为基准来对应文字串,句号正是每一个单字
的区隔号,星号也是分隔号,但不同的是它可以通用字元的方式代表从零到任
意数目的单字,对於对应唯一的限制是在资料库中规格的属性必需对应查询应
用程式所传来的属性,你不可对属性用通用字元。
现在你可以看到不同的规格如何工作:
*foreground:yellow
可以应用於任何应用程式中的任何物件。因为星号对应到所有的应用程式和所
有的限定和物件名称。
*Command.Foreground:violet
应用於任何应用程式中任何Command 型态中Foreground类别的任何属性。
BBS水木清华站∶精华区