X WINDOWS 系统使用指南
BBS水木清华站∶精华区XWINDOWS系统使用指南
前言
目录
本书导读
第壹部系统概观
第1章使用者对X WINDOWS系统的概观
1.1 X有什麽特点?
1.2 什麽是视窗系统?
1.3 X简史
1.4 X的成品
1.5 MIT 发行的X
第2章从基本系统模式概观X
2.1 X的基本元素
2.2 Server和Client如何交谈
2.3 X的网路风貌
2.4 摘要
第3章从使用者介面的面貌概观X
3.1 管理介面:视窗管理器
3.2 应用程式介面和工具箱
3.3 其它的系统面貌
3.4 结论
第贰部 使用X系统
第4章 术语和符号
4.1 术语
4.2 符号
4.3 本书范例的场景
4.4 本书使用的工作站架构
第5章 启动和关闭退出X
5.1 启动X
5.2 如何执行一些X程式
5.3 关闭X
5.4 总结
第6章视窗管理器基础-- uwm
6.1 什麽是视窗管理器
6.2 启动 uwm
6.3 基本视窗操作 -- uwm 的选单
6.4 移动视窗
6.5 重定视窗大小
6.6 建立新视窗
6.7 管理你的萤幕空间
6.8 中止应用程式视窗
6.9 叫用 uwm选单的其它方式
6.10摘要
第7章使用X的网路设备
7.1 指定一个远方终端机 -- -display选项
7.2 实际使用远方的显示器
7.3 控制存取你的显示器 -- xhost
7.4 总结
第8章 终端机模拟器 - 细说 xterm
8.1 选择 xterm 功能 - 选单与命令列选项
8.2 卷动 xterm 的萤幕
8.3 记录你与终端机的交谈过程 - 写记录 (logging)
8.4 剪与贴本文
8.5 使用 Tektronix 模拟功能
8.6 使用不同字型
8.7 使用色彩 (colour)
8.8 其他 xterm 选项
8.9 设定终端机键盘
8.10 结论
第9章 方便的程式和视窗相关的工具
9.1 方便的程式
9.2 储存, 显示与列印萤幕影像
9.3 结论/摘要
第10章 使用X的应用程式
10.1 文字编辑器 - Xedit
10.2 读取指南页 (Manual Pages) - xman
10.3 邮件/讯息处理系统 - xmh
10.4 结论/摘要
第11章 示范与游戏程式
11.1 找出通过随机迷宫的路径 - maze
11.2 担任指标的大眼睛 - xeyes
11.3 智慧盘游戏 - puzzle
11.4 列印一个大X语标 - xlogo
11.5 跳动的多面体 - ico
11.6 动态几何图样 - muncher 与 plaid
11.7 结论
第参部 定制系统
第12章资讯与状态程式
12.1列出你的Xserver的特徵 -- xdpyinfo
12.2获取有关视窗的资讯
12.3观察X的事件 -- xev
12.4结论
第13章使用X的字型和色彩
13.1字型初步
13.2字型如何命名
13.3观察特定字型的内容 -- xfd
13.4如何储存字型及存在何处
13.5范例:增加新字型至你的server
13.6使用X的色彩
13.7结论
第14章定义和使用位元映像
14.1系统位元映像程式馆
14.2交谈式地编辑一个位元映像 -- bitmap
14.3编辑位元映像其它的方法
14.4定制你的根视窗 -- xsetroot
14.5总结
第15章定义应用程式的预设选项 -- Resources
15.1什麽是resources ?
15.2X Toolkit
15.3Resources 如何被管理 -- Resource管理器
15.4Resources 的型态----如何指定值
15.5结论
第16章实际的使用Resource
16.1在何处储存resource的预设值
16.2在Server上储存预设值 -- xrdb
16.3一些常见的错误和如何修正它们
16.4结论
第17章定制你的键盘和滑鼠 -- 转译
17.1 实际使用转译
17.2 转译 -- 格式和规则
17.3 在转译规格中常见的问题
17.4 结论
第18章键盘和滑鼠 -- 对应和参数
18.1 键盘和滑鼠对应 -- xmodmap
18.2 键盘和滑鼠参数设定 -- xset
18.3 结论
第19章进一步介绍 uwm 和如何定制它
19.1 uwm 的新特色
19.2 定制uwm
19.3 结论
第20章全部放在一起 -- xdm
20.1 我们需要做些什麽
20.2 xdm -- X显示管理器(X Display Manager)的概观
20.3 有关xdm 的更多
20.4我们自己的uwm 建构
20.5结论
第肆部 附录
附录A 文件指引
A.1 本发行版所提供手册
A.2 包括在本发行版本内的其它文件
A.3 包括在本发行版本内的其他资讯来源
附录B 安装X
B.1 安装X的提示
B.2 建立本发行版
附录C本发行版的内容 -- MIT Core Distribution
C.1 核心版
附录D本发行版的内容 -- 使用者贡献的软体
D.1 使用者贡献的版本
附录E如何取得X
E.1 在美国
E.2 在欧洲
E.3 如何取得 GNU Emacs
附录FX网路与电子邮件服务
F.1 xpert 邮件竞技场
F.2 xstuff Server
F.3 FTP 与其他网路 Server
附录G需要从你的系统管理者得到的资讯
图的目录
图 1 - 1重叠的视窗
图 2 - 1X的基础成员
图 2 - 2xlib函数馆的功能
图 2 - 3在相同机器上的client和server
图 2 - 4在不同机器上的client和server
图 2 - 5使用X网路典型的面貌
图 2 - 6已存在的显示器可使用在新的 CPU上的client
图 2 - 7被已存在的client程式使用的新显示器
图 2 - 8执行远方的一个非X的信件程式
图 3 - 1在萤幕上重叠的视窗
图 3 - 2视窗的树状结构阶层
图 3 - 3受父视窗限制的子视窗
图 3 - 4选单比用它的应用视窗还大
图 4 - 1视窗的元素
图 4 - 2滑鼠拖拽的图形表示法
图 5 - 1大的 "X" 游标
图 5 - 2xterm 的本文游标
图 5 - 3系统启动的画面
图 5 - 4xclock 启动後的画面
图 5 - 5xkill的覆盖性的方形游标
图 5 - 6xcalc 桌上型计算器
图 6 - 1uwm 的 WindowOps 选单
图 6 - 2手指形游标
图 6 - 3十字箭头形游标
图 6 - 4移动视窗示意图
图 6 - 5重定视窗大小操作时, 显示视窗大小的长方盒
图 6 - 6重定视窗大小示意图
图 6 - 7"左上角" 形游标
图 6 - 8当建立新视窗时, 出现视窗名称和大小的长方盒
图 6 - 9相互重叠的视窗
图 6 - 10 正常的xterm 的表徵图
图 6 - 11 一个由twn 视窗管理器所建立含有控制棒的视窗
图 6 - 12 由rtl 视窗管理器控制的萤幕
图 7 - 1远方的 client 显示器对本地 server 架构图
图 8 - 1 xterm 的三个选单
图 8 - 2 具有卷动棒的 xterm 视窗
图 8 - 3 游标在卷动区的不同形状
图 8 - 4 在一个视窗内卷动本文
图 8 - 5 "剪" 操作中被选择的文字列
图 8 - 6 以字元, 字与列 "剪" 文字
图 8 - 7 xterm 的正常视窗与 Tektronix 视窗
图 8 - 8 被用於 xterm 的 Tektronix 视窗内的闹钟形指标
图 8 - 9 具有粗体与正常字型的xterm 视窗
图 9 - 1 数字型时钟
图 9 - 2 具有钻石形秒针的指针型时钟
图 9 - 3 类比的 xcalc 是一个计算尺
图 9 - 4 反波兰记数法 xcalc 计算器
图 9 - 5 xcalc 表徵图
图 9 - 6 xload 的正常视窗与表徵图视窗
图 9 - 7 xbiff 邮件监视视窗的两种状态
图 9 - 8 十字线形游标
图 9 - 9 一个被重叠视窗的倾印结果
图 10 - 1 xedit 文字编辑器
图 10 - 2 xedit 的插入档案选择视窗
图 10 - 3 xman 的主选择项视窗
图 10 - 4 xman 求助视窗
图 10 - 5 xman 求助与指南页视窗选单
图 10 - 6 xman 的指南书章节选单
图 10 - 7 xman 的指南页进入点目录
图 10 - 8 显示一个指南页的 xman 视窗
图 10 - 9 xman 搜寻视窗
图 10 - 10 xman 的三个不同表徵图
图 10 - 11 同时显示目录与指南页的 xman 视窗
图 10 - 12 xmh 邮件处理视窗
图 11 - 1 迷宫� BBS水木清华站∶精华区
┌———————————————————┐
│ 43 页 , 图 4 - 2 │
│ │
│ │
│ │
│图 4 - 2滑鼠拖拽的图形表示法 │
└———————————————————┘
键盘的术语:
标准的终端机键: SHIFT, DELETE, BACKSPACE, ESC 或 ESCAPE, RETURN,
CAPSLOCK.
游标控制键: 采有上下左右箭头的键, 如 UP, DOWN, LEFT, RIGHT.
特殊键: 压住CTRL或CONTROL 键, 再按其它的键 (例如 A键),用CTRL-A
表示, 有些终端机有META键, 也同样的用META-A表示.
4.2 符号
连续数列
在一些情况下, 你输入的命令列或系统输出的文字, 因为太长而无法在
同一列而必需分为数列, 如果它是shell 命令, 或是一段 C语言程式码, 我
们在第一列的最後加上一个倒斜线(backslash"\")後, 在下一列继续, 例如:
mkfontdir/usr/lib/X11/fonts/misc\
/usr/lib/X11/fonts/15dpi\
/usr/lib/X11/fonts/100dpi
然而极少数的情况下, 我们用符号 "(contd.)" 表示本列因排版限制的缘故
在下列继续,如:
PID TT STATTIME COMMAD
1901 c0 S 0:01 x :0
1902 c0 S 0:01 xterm -geometry +1+1 (contd.)
-n login -display unix:0 -c
1903 p1 S 0:00 -sh (csh)
当X装设时, 需要定一些目录树 (directory tree). 我们把目录树的
顶端定为$TOP, 在我们的系统中, $TOP对应的目录为 /usr/local/src/X11
,相同地,家目录 (home directory) 参考自 $HOME。
4.3 本书范例的场景
本书使用大量的范例来说明,这些范例是假设我们在一个拥有下列机器
的网路下工作:
venus 彩色萤幕,普通解析度
saturn 单色萤幕,普通解析度,档案工作站(file server)
mars 彩色萤幕,高解析度
neptune 非图形萤幕,拥有磁碟储存装置,电脑工作站(computer server)
我们所拥有的工作站是 venus,大部分的时间我们使用它,当我们需要更高
的解析度或在单色萤幕检查某些情况时,我们会使用 mars 或 saturn,当然
,我们会在我们自己的工作站,以远端(remote)的方式使用所有的机器.
saturn是 venus和 mars 的档案工作站, 三者之间共享相同的档案系统
,( 例如,它们存取档案 $HOME/.login 时,实际上是同一个档案) .neptune
拥有它自己的档案系统,不和其他的工作站共享.
4.4 本书使用的工作站架构
在本书中,所讨论的一些范例、程式名称、程式码的片段可能和你系统
的有些差异,那是因为系统不同的关系,本书假设使用的系统为:
.硬体:SUN 3/50工作站,三个按钮的滑鼠,萤幕大小为 1152x900个
像素,单色萤幕。
.作业系统:SunOS 3.4, 以 BSD 4.2 Unix 为基础。
.视窗软体:X的 MIT标准版,第11版第3 次发行。
=====
第5章 启动和关闭退出X
在本章, 我们将学到:
.如何在自己的机器上启动X.
.如何在视窗上做一些基本操作.
.如何关闭退出X.
我们在此假设你的系统管理者已经在你的系统上装设好了X, 事实上即
使不曾用过或不熟悉X, 装设X也不会很困难. 因此如果你有必要自己装设
X, 本书的附录将给你一些提示.
在还未开始前, 我们需要先知道已装设好的X, 它的执行程式在那里,
MIT 版预设的目录为 /usr/bin/X11,但很多地方是用 /usr/local/bin 或
/usr/local/bin/X11, 当你知道了之後, 把它加到你的搜寻路径 (search
path) 里, 如果你使用 C-Shell, 可以在你的.login档 (或者可能是.cshrc
档) 设定路径, 如果你使用Bourne Shell, 则在.profile档中设定. 例如,
在.login档中使用C-Shell 的命令列设定路径:
set path = (. /usr/local/bin/X11 /usr/ucb /usr/bin /bin)
如果你不设定路径, X将无法正常启动, 当你设好之後, 为了确定起见,
先logout再login 一次, 检查路径是否设定正确 (用 echo $PATH 指令).
5.1 启动X
在你的显示器启动X,键入命令:
xinit
则会依序发生:
1.你的整个萤幕会被设定成灰色。
2.一个巨大的 "X" 游标出现(见图 5 - 1 )
┌————————————————┐
│ p48 fig 5.1 │
│ │
│ │
│ │
│图 5 - 1 大的 "X" 游标 │
└————————————————┘
你可以用滑鼠将它在萤幕上移动,但按滑鼠按钮或键盘都对它无影响。
3.一个xterm 终端机模拟器的视窗出现在萤幕左上角,当游标移到这个
视窗时,会改变成本文游标,(见图 5 - 2),xterm 准备接受你的
命令。
┌————————————————┐
│ │
│ p48 fig 5.2 │
│ │
│ │
│ │
│图 5 - 2 xterm 的本文游标 │
└————————————————┘
系统启动的画面见图 5 - 3。X现在已被启动,你可以把xterm 这个视
窗当成一个普通的终端机来使用,执行一些普通的指令,不过它最大的价值
在让你可以开始执行其它的X程式,我们将於稍後告诉你,现在先来让你了
解一下X的启始动作做了些什麽。
┌————————————————┐
│ │
│ p49 fig 5.3 │
│ │
│ │
│ │
│图 5 - 3 系统启动的画面 │
└————————————————┘ BBS水木清华站∶精华区
因而显现或隐藏其他视窗.
注意 : 隐藏不是将它送到堆叠的底部, 或表徵图化. 假如你使用选单 "隐藏"一
个视窗, 当下次你要求再出现时你必须像开启一个新的应用视窗一样地安
置 (position) 它.
┌—————————————————————┐
│ p93. fig 8 - 7 │
│ │
│ │
│ │
│ │
│ 图 8 - 7 xterm 的正常视窗与Tektronix视窗 │
└—————————————————————┘
8.5.1 Tektronix 的特殊功能
Tektronix 选单 (同时按下 CONTROL 与滑鼠中间按钮可得到) 提供你一些类
似 Modes控制 xterm 视窗的功能. 但它仅提供用於 Tektronix 视窗的(功能)项目.
改变字元的大小 : 你可以从四个不同的大小选择, 范围从 Large Characters
(预设值) 到 Small Characters. 你可以在任何时刻改变它, 甚至在一
列中间. 在改变之前已出现在萤幕上的字元不受影响.
清除萤幕 : Tektronix 的一个特性是它的萤幕不卷动. 在萤幕上有两行
(column) (左与右) 为本文, 当其中之一已写满, 输出切换到另一端, 然
而, 已显示的字元不清除 (erased), 因此萤幕不久会变混乱, 除非你下
命令清除它. 想这样做的话需於 Tektronix 选单选择 PAGE : 萤幕会被
清除, 且游标被移至左上角.
重置 "终端机" : 於 Tektronix 选单选择 RESET. 字元的大小与线的型式 (
可能因一个程式输出至视窗而改变) 被设回预设值, 且 PAGE 的萤幕清除
功能会被执行.
拷贝视窗内容至一个档案 : 於 Tektronix选单选择 COPY, 自从最近一次的
PAGE功能後任何写到萤幕的内容都会被拷贝到名为 COPYyy-mm-dd-hh.mm.ss 的
档案. yy-mm...... 为当时时刻. 该档被建於启动 xterm 时的目录下.
重绘 Tek 视窗会花一些时间 : 当它发生时, Tek 视窗内的游标变成一个闹钟
(见图 8 - 8)
┌——————————————————┐
│ p94. fig 8 - 8 │
│ │
│ │
│ │
│ 图 8 - 8 被用於 xterm 的 Tektronix │
│ 视窗内的闹钟形指标 │
└——————————————————┘
8.6 使用不同字型
xterm 可以让你从正常的文字与粗体文字选择不同的字型, 字型选择必须有固
定的宽度且彼此大小相同. 你目前尚不知道如何找到可以利用的字型, 但它的应用
范围很广, 下面的例子我们将只用两种, 这两种是 core 版本提供字型的一部分:
8x13 (一个字元大小为 8 像素宽, 13 像素高) 与 8x13b (一个粗体变体)
欲指定特殊字型必须使用命令列选项 :
-fn font : 使用 font 的正常字型, 取代预设的 "fixed" 字型.
-fb font : 使用 font 的粗体字型, 取代预设的 "fixed" 字型; 预设状态下
xterm 不区分粗体字的本文.
图 8 - 9 所显示的是执行下列命令
xterm -fn 8x13 -fb 8x13b
明确地指定正常与粗体字型的结果. 我们将在 "使用X的字型与色彩" 一章
中 (第13章) 进一步说明视窗字型与颜色.
┌—————————————————┐
│ p94. fig 8 - 9 │
│ │
│ │
│ │
│ 图 8 - 9 具有粗体与正常字型的 │
│ xterm 视窗 │
└—————————————————┘
8.7 使用色彩 (colour)
假如你有彩色显示器, 你可以用命令列选项设定一组 (些) 视窗元素去指定
色彩:
-fg colour : 以 colour 颜色印出前景, 亦即文字.
-bg colour : 以 colour 颜色作视窗背景.
-bd colour : 以 colour 颜色画视窗边界.
-ms colour : 以 colour 颜色为滑鼠指标颜色.
-cr colour : 以 colour 颜色为游标颜色.
参照连接在网路上的机器对视窗设定的色彩码, 你可以发现非常有用. 设定滑
鼠与游标为显眼的颜色也是有帮助的, 使你在纷杂的视窗中较容易看得到它们.
8.8 其他 xterm 选项
有许多其他的选项可以被 xterm 接受. 有些是设定终端机的特性, 例如 :
-display与 -geometry 前面已经讨论过. 所� BBS水木清华站∶精华区
它的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结构的输入源之一� BBS水木清华站∶精华区
xedit.vpaned.row1.Help.background:navy
是一个完整的规格但是将只影响到命名当中的物件名称的属性。(本例中,
尽管事实上是大写的,"Help"是一个成员名称,它的类别是"Command" 。)
除非你有一些非常特别的需求,最好不要用句点当分隔号,尽量以星号代
替,如此可减少错误发生的可能,而且在重写应用程式时,比较不会受到阶层
结构改变的影响。
上述的对应结构解释了为什麽你可以输入奇怪的规格,或者resource
和属性尚未定义:意即一个规格只有当应用程式查询资料库才会附著,甚至范
围的意义也是不足道的 -- 规格对应或不对应到查询。
15.3.4当多种Resorce规格对应的居先(precedence) 规则
我们现在有一个非常弹性的方法来指定应用程式的resource,但正因它太
笼统,以致当一个应用程式查询resources 资料库时常常有数种规格与之对应,
如何解决呢?
简单地说,如果同时有超过一个规格对应,则最具体的(specific)一个会
被使用,Resource Manager有一组的居先规则用来决定是否一个规格较另一个
具体。
.使用句号为分隔号较使用星号为具体,例如:*Command.Foreground 较
*Command*Foreground 为具体。
.成员名称较类别名称具体,例如:*foreground 较*Foreground 具体。
.指定一个元素较省略它具体,例如:xmh*command*foreground较
xmh*foreground具体。
.元素靠近规格左边的星号较靠近右边的具体,例如:xmh*foreground较
*command*foreground具体。
这些规则相当直接,它们大部份可用另一种方法来说明:”如果一个规格
对应到另一个规格而为其子集合者,则前者较後者具体。”
15.3.5在Toolkit 程式中应用程式Resource
通常一个应用程式使用Resource Manager来定义程式阶层中widget的属性
预设值,但有时需要有和widget不直接相关的设定预设值(或传值)的能力。
为了达到这点,Toolkit 提供了一个叫做Application Resource的设施,
它和非Toolkit 预设的外表原则相同 -- 应用程式定义了它本身选择的属性。
类别名称也相同,所以事实上这些属性和一般常见的阶层没有什麽不同。
xman使用到一点这个设施,它让你能在求助视窗(help window) 指定不同
的本文档案,是否在主选择视窗中指定一个你要的视窗,或当程式启动时直接
进入一个指南页等。(查看指南页,在X Default那一节,它会明确地列出它
的”应用程式特定的resources ”)。
15.3.6Resource和non-toolkit 应用程式
并非所有的程式均使用Toolkit ,但Toolkit 几乎掌握了所有对一个应用
程式的resource管理,特别是应用程式的widget结构定义了物件和子物件的阶
层,并能适当地查询Resource Manager。但是non-Toolkit 应用程式要如何使
用Resource Manager?
答案是应用程式只需明确地查询每一个它有兴趣的属性。稍早我们曾说过
Resource Manager对resource无限制,因此应用程式能使用任何它想要的属性
名称,只要程式的文件告诉使用者它们在何处,它们就如同其它的应用程式一
样。
xcalc 应用程式是一个不使用Toolkit 的程式范例,它也利用上述方式掌
握resource规格。
有几点需要注意:
.此种型态的预设值没有类别。
.程式以类似类别名称(也就是说,第一个字母大写)来定义属性,例如
xcalc 使用Background, Foreground, BorderWidth 等等。
.如果大小写错误,你的规格不会工作,例如:规格
xcalc.foreground:green
会被xcalc 忽略。
.即使这个程式定义的属性并非阶层的一部份,你仍能使用星号当分隔号,
例如:
xcalc*Foreground:orange
15.4Resources 的型态----如何指定值
直到现在我们仍然只看resource规格的”左半边”,而忽略了值(value)
的部份,或只是用色彩名称。现在,我们来看一看”右半边”(值的部份)。
简单地说,值只是一个传递到应用程式的本文字串,和Resource Manager
完全相关,之後,应用程式以此值做它所要做的事。当然,在实际的操作上,
应用程式必须明确地做某些事,而Toolkit 的确也掌握了大多数这一部份的工
作,所以你可获得一致地介面。
所以当我们以一个Resource值传递我们所需时,实际上我们使用少数的型
态,你已看过它们的大部份,你在任何地方均可以resource规格来使用它们:
Colours (色彩):我们已广泛的使用过它们----毋需多做解释。
Fonts (字型):在一般的方法我们已描述过,在resource规格,你也
可使用通用字元或全名。例如:
*Font: *-courier-medium-r-*-140-*
xterm*Font: 8*13
xterm*boldFont: 8*13
demo*font: *-courier-medium-r-*-240-*
demo*boldFont: *-courier-bold-r-*-240-*
设定一个整体性的预设字型,但使用一个正常的xterm 指定一个明确的一对字
型,和一对被demo应用程式使用的较大的字型。(可用xterm -name demo)
Numeric quantities:在不同的情形,例如:
xclock*update:30
xclock*update:60
BorderWidth:10
xlogo*Width:120
xterm*saveLines:200
Boolean values:指定"yes" 或"no",你可以使用"yes" 、"on"、"true"
和"no"、"off" 、"false" ,例如:
xterm*scrollBar:false
xman*bothShown:true
Cursor names:指定在/usr/include/X11/bitmaps中包含你所要的游标的
档案名称,例如:
xterm*pointer Shape:cntr_ptr
注意:如果被指定的游标不包含 "热点" (hot spot),你可能得到错误讯
息。
Geometry spec :全部或部份。
xcalc*Geometry: 180*240-0-0
xcolock*Geometry: -0+0
设定一个计算器的预设尺寸及其启始位置在右下角,时钟的启始位置在右上角。
键盘转换(keyboard translations) :安排特定的字串给一个键,或安排
特殊(非印出)动作给键或按钮,这相当的复杂,第17章会全面专门讨论它。
Pixmaps :Pixmaps 是像位元映像纹理(texture) 一般的图样,像位元映
像或游标一样的指定它们。当你在单色萤幕上工作时非常方便,一旦为不同类
别的widget设定背景,你便能看到应用程式在何处使用到它们。例如:以下的
resource规格:
*Pixmap: mensetmanu;
List*backgroundPixmap: scales
Box*backgroundPixmap: cntr_ptr
Command*backgroundPixmap: sipb
导致你的应用程式看起来很讨厌----你得到杂乱的视窗,每一个空间以某
种图样填满----但它们的确在作用,有时这样做可能会有用,backgroundPixmap
是类别Pixmap的属性。
15.5结论
在这复杂的一章中,你看到了什麽是”resource”,和你如何使用它们指
定预设值或其它的值给应用程式,我们勾绘出Toolkit 大致轮廓,和widget的
阶层观念,并说明如何利用widget结构或应用程式的其它物件来设定较大范围
的预设值。从这里我们介绍类别的概念,它可以让你指定物件而无� BBS水木清华站∶精华区
...
<Btn5Motion> Button5 <Motion>
<BtnMotion> 任何按钮的 <Motion>
作用的格式和作用的表列
每一个转译在一或多个作用之上系结一个序列的一或多个事件。在表列中的个
别作用是以空白分开的。 (不可用逗点分开,那将会导致错误)。
个别的作用格式如下:
action-name(parameters)
即使没有参数被指定,在作用名称 (action-name)後的括弧,仍然不可省略。
例如:
start-selection()
如果在作用名称和左括弧中间留有空白,你将会得到一个错误。
作用名称只包含了字母、数字、钱号($)、底线(_)四种字元。每一个widget
提供它自己的作用集合 (如果有的话) ,且自我包含这些作用名称的硬码
(hard-coded)表列。
参数(parameters)是一个零到多个字元字串的表列,中间以逗点分开。参
数的意义为对特定的作用作指定 (事实上大多数的作用并没有任何参数) 。参
数字串可以不加引号,例如:
insert-selection(PRIMARY)
或者前後加上双引号,这种情形通常为参数字串内包含了空白或一个逗点,例
如:
string("plot<x,y>")
没有一个一般性的方法,让你在参数字串中的任何位置包含一个双引号,虽然
像这样 string(ab"cd)'将双引号放在字串中间是可被处理的。也没有一般性的
方法在同一个参数字串中同时包含字串和双引号。因为如此,有些widget在解
释它们自己的参数时,可以自行加入它们自己的语法规则。例如:对xterm 的
VT100 widget的 string()作用,如果一个不带双引号且开头为 "0x"的字串,
此字串被解释为代表一个ASCII 字元的十六进位数。
在此结束我们对转译规格及格式的描述。由此,你应有能力了解在不同X
手册列出的转译,且可写你自己的转译。为了帮助你,下节列出你常见的问题
,以及如何克服它们。
17.3 在转译规格中常见的问题
转译在观念上简单,但实际上很混乱。即使你常常使用,语法仍然复杂而难解。
无论如何,如果你是初学者,最好的方式是你以别人的转译当作自己的转译的
基础。在指南页中有几个对xbiff、xdm(目前尚未介绍过,将於第20章介绍
)、xterm 的转译范例,将对你有所帮助。
如果你发现你的转译有错误的话,有几点值得去检查:
.转译只能应用在使用Toolkit的程式上。如果你试图对非Toolkit应用程
式定义转译,看起来不会有任何问题,只是转译不会作用而已。
让我们来看一下为什麽,以对xcalc (这是一个非Toolkit程式)使用转译
为例。你对一个resource名称像 *xcalc*translations定义一个转译表,
且用xrdb载入至你的资料库。xrdb并不会抱怨,因为它不知道是那一个
应用程式使用到resource,它只会设定资料库,稍後供Resource Manager
查询。现在你执行xcalc ,它对转译是一无所知,所以不会向资料库查
询转译,当然也绝不会编译它们了。
.不要省略 #override,除非你确实知道你要做什麽。如果你因错误省略
它,例如在xedit 中,你将发现没有任何的键可输入任何的东西 (因为
预设的转译 "<Key>:insert-char()"被去掉了)。
.检查你对每一列均有终结。如果你在转译表中的一列忽略了"\n\"或"\n"
,在其後所有的转译都会被忽略。如果你在最後一列的末端加上一个倒
斜线(\) ,或是省略了档案中最後一个新列字元(newline),整个转译表
都会被忽略。(不过这是xrdb的问题,而非转译管理器的问题)。
这种错误在你编辑一个现存的转译表时特别容易发生。
.当你定义的转译和预设有冲突时,可能会导致奇怪的行为,特别是对滑
鼠按钮事件,每一次按下或"Down"事件,会相关到一个松开或"Up"事件
,当你对此部份没有明确定义时,可能会有一个预设的系结仍然存在,
(键盘的按下和松开也是成对的事件) .所以:
1.检查预设系结的文件。
2.如果你只对按下/松开配对的一半指定一个转译,确定另一半并非预设
转译的一部份,如果是的话,需对它明确地指定一个转译。
3.如果你仍然不能解决,暂时由表中移去#override,这将去掉所有的预
设转译,让你了解问题是由於和预设转译冲突所造成,还是因为你的
转译表有错误。
.转译管理器对语法不正确的问题,无法很好的告诉你原因何在。例如如
果你有一个转译像:
<Key>F6: string("abc""def")
参数的语法并不正确,F6键将没有作用,但你也看不到错误讯息。
.如果你转译一序列的事件,且需要对每一个均指定修饰键,你必需明确
地对每一个都指定。例如如果你需要一个转译使用ctl-X ctl-K:
Ctrl <Key>X, Ctrl <Key>K: ...
而如果你使用:
Ctrl <Key>X, <Key>K: ...
你的指定为 ctl-X K
.检查你所需的widget是否有你指定的名称和类别。例如对xterm ,你可
以在一个表的开头指定:
xterm*Text*translations:
这将什麽事也没作,xterm 正规视窗widget的类别VT100。通常,不论
xrdb或转译管理器均不会有反应,因为看起来没错。
.转译可能指定正确,也可以工作,但它的作用和你预期的不符。例如对
xterm 的转译:
Meta Ctrl <Key>m: mode-menu()
是正确的,且会工作。但mode-menu()实际上检查滑鼠左或中按钮是否有
招唤它,其它方面不做任何事。
.在一个转译中不指定修饰键,并不意味著当修饰键按下时转译会无效。
它真正的意义为: "我并不在乎有没有修饰键" 。如果需要的话,使用
"None",""或!符号。使用时要小心预设的转译是否会妨碍到你。
.转译是针对widget而指定的,所有在转译中的作用必需由widget提供。
在你指定转译resource名称的地方很容易忘掉这一点。例如:
xman*translations: \
<EnterWindow>: reset()\n\
<LeaveWindow>: set()
将导致许多错误:set()和reset()作用只有被Command widget定义,但
xman有数种其它型态的widget可接受转译,且转译管理器会抱怨这些
widget并未提供set()和reset()。解决之道为更完整些的指定resource
名称,例如在本例为 xman*Command*translations 。
.对任何给定的resource,当resource资料库被询问时,Resource Manager
会传回一个值给widget,这个传回的值的 "特徵值" (characteristic)
(resource名称)大多与widget的和属性的完整类别/成员名称相符。所
以你对所有的Text widget指定一个一般性的转译後,又对xedit指定一
个转译,希望它们并存是不可能的,只有一个转译表会传给widget。例
如:
*Text*Translation: #override\
(对Text一般性的转译)
...
xedit*Text*Translation: #override\
(对xedit 的Text特定的转译)
...
你只能得到在xedit 中特定的转译,或是在别处得到一般性的转译。
#override 会有所混淆,它的意义为 "把转译加入现存的之中" 。但这
完全由转译管理器处理,当时候到时,转译管理器会决定传递哪个值给
由Resource Manager所造的widget。对Resource Manager而言,#override
只是传递给widget值的部份中的一个文字字串而已。
因为你使用resource来指定转译,所以错误可能在两个领域均会发生。为
了减少错误的范围,当你对转译颇有经验时,在你已载入转译resource之後,
最好能明确地列印出你的resource资料库。例如:如果你对xprog 写入转译,
且转译在档案mytran BBS水木清华站∶精华区
附录A 文件指引
A.1 本发行版所提供手册
下面所列有关X的手册被以硬拷贝形式提供, 视为完整 MIT 发行版的一
部分.
这些手册的文件来源包含於软体磁带中, 且所对应的档案名称注明於括弧
内. 想列印硬拷贝版本, 可以使用 nroff 或 troff, 加上选项 -man表示指南
页 (manpage), -ms选项代表教学 (tutorial) 或其它手册.对於某些较长的
手册, 被转换成 PostScript 型式的格式化的档案 也包含在其中; 因为它们
长度较长, 所以被压缩, 必须使用 uncompress 解压缩. (假如你尚未解压缩
, 它们应包含在发行版磁带的 $TOP/util/compress, 可按照指示去使用它).
1. 发行版注意事项, 包括安装指示与本发行版内容的描述. 几乎这里所有的
内容均被再制作成本书附录B,C与D. ($TOP/doc/releasenotes/*;
PostScript 在 $TOP/hardcopy/releasenotes.PS).
2. 程式指南页, 或 "指南页(1)". 来源不只储存在一个地方, 但有其代表
的程式来源. 在预设安装程序, 它们被安装於系统指南页目录内, 所以
它们可以用 man 去读取. ($TOP/.../*.man; PostScript 在
$TOP/hardcopy/man/*.PS.Z)
3. Xlib 功能的指南页; "指南页(3X11). ($TOP/doc/Xlib/Xman/*).
4. Toolkit Intrinsics 功能的指南页; "指南页(3Xt). ($TOP/doc/Xt/Xman/*;
PostScript 在 $TOP/hardcopy/Xt/man.PS.Z).
5. 由 Scheifler, Getty 与 Newman 所写的一本书 "X WINDOW SYSTEM, C
Library and Protocol Reference" (Digital Press, 1988), 内容包括 :
. "Xlib - C language Interface" 手册. ($TOP/doc/Xlib/*; PostScript
在 $TOP/hardcopy/Xlib).
. "X Window System Protocol, X Version 11, Release 3" 手册.
($TOP/doc/Protocol/).
6. "X Toolkit Intrinsics" 手册. ($TOP/doc/Xt/*; PostScript 在
$TOP/hardcopy/Xt/intrin.PS.Z).
7. "X Toolkit Athena Widgets" 手册. ($TOP/doc/Xaw/; PostScript 在
$TOP/hardcopy/Xaw/widget.PS.Z).
8. "Bitmap Distribution Format" 手册. (文件来源是 Scribe 格式, 但
具有 PostScript 说明, 在 $TOP/doc/bdf/; 完整的 PostScript 在
$TOP/hardcopy/bdf/bdf.PS.Z).
A.2 包括在本发行版本内的其它文件
1. 字型命名惯例的描述. ($TOP/doc/fontnames/fnames.txt).
2. 对不同X功能的小教学程式 :
. 在你撰写的X程式里使用颜色. ($TOP/doc/tutorials/color.tbl.ms).
. 转换 X11 第 2 次发行版的widget 为第 3 次发行版.
($TOP/doc/tutorials/x10equiv.txt).
. 使用资源. ($TOP/doc/tutorials/resources.ms).
. Xlib 函数的 X 版本 10 与版本 11 之对照.
($TOP/doc/tutorials/x10equiv.txt).
3. 安装 MIT server 至不同系统的注意事项.
. 安装 X V11 Sample Server 的 godzilla 指南 ($top/doc/server/ddx.tbl.ms).
. X V11 Sample Server 的安装层(Porting Layer)定义
($top/doc/server/ddx.tbl.ms).
. X V11 Sample Server 的安装策略 ($top/doc/server/start.ms).
. X V11 Server 扩充 ($top/doc/server/ext.doc).
4. "client 间的通讯惯例手册" (Inter-Client Communication Conventions
Manual)" 通常以缩写为 ICCCM 来参用. 它应该包含在发行版中的
$top/doc/conventions/, 但在发行版中有被修订时才会存在否则常被
省略, 所以你可以透过电子邮件取得一个拷贝 -- 见附录F "X 网路与
电子邮件服务" 的 xstuff 一节.
5. 撰写X程式的教学程式, 先教你使用基本的 Xlib 函数, 然後使用 Toolkit.
($top/doc/helloworld).
A.3 包括在本发行版本内的其他资讯来源
对某些项目, 像 widget 的名称, resources 与动作 (action), 你必须
看原始码 :
. Widget提供给Intrinsics 的部分. ($TOP/lib/Xt/).
. 在 Athena Set 里的 Widget ($TOP/lib/Xaw/).
. client 程式的原始程式. 每个 client 的原始程式储存於不同的目录,
$Top/Clients/Program-name/ 或 $Top/Demos/Program-name/.
=====
附录B 安装X
B.1 安装X的提示
.尽快地获得所有文件的拷贝,理想的状况是在开始安装系统之前(你可
以自行将磁带上所包含的档案列印出来,或是由附录E所列的供应商订
购一份。)
.首先,对已有的建构档案
页:
[1]