荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: spectre (Heal the world), 信区: Linux
标  题: X Windows使用指南(1)
发信站: BBS 荔园晨风站 (Fri Jul 28 17:10:33 2000), 转信

【 以下文字转载自 spectre 的信箱 】
【 原文由 suplaozi.bbs@smth.org 所发表 】
寄信人: <bbs@captain.net.tsinghua.edu.cn>
标  题: X Windows使用指南(1)
发信站: 华南理工大学 BBS木棉站
日  期: Tue Aug 20 08:31:52 1996

X  WINDOWS  系统使用指南

前言

目录

本书导读

第壹部  系统概观

第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.2  X Toolkit
15.3  Resources 如何被管理 -- Resource管理器
15.4  Resources 的型态----如何指定值
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

附录F  X网路与电子邮件服务

F.1 xpert 邮件竞技场
F.2 xstuff Server
F.3 FTP 与其他网路 Server

附录G  需要从你的系统管理者得到的资讯



图的目录

图 1 - 1  重叠的视窗
图 2 - 1  X的基础成员
图 2 - 2  xlib函数馆的功能
图 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 - 2  xterm 的本文游标
图 5 - 3  系统启动的画面
图 5 - 4  xclock 启动後的画面
图 5 - 5  xkill的覆盖性的方形游标
图 5 - 6  xcalc 桌上型计算器
图 6 - 1  uwm 的 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 迷宫程式
图 11 - 2 xeyes 程式
图 11 - 3 智慧盘游戏
图 11 - 4 xlogo 程式
图 11 - 5 ico 程式
图 11 - 6 muncher 与 plaid 程式
图 12 - 1 典型的xdpyinfo工具程式的输出
图 12 - 2 三个xlswins 的输出
图 12 - 3 典型的xwininfo输出
图 12 - 4 一个应用视窗的性质表列
图 12 - 5 根视窗的性质表列
图 12 - 6 字型的性质表列
图 12 - 7 xev 视窗
图 12 - 8 xev 的输出
图 13 - 1 典型的字型目录列表
图 13 - 2 字型的展示
图 14 - 1 位元映像编辑器
图 14 - 2 一个游标的”热点”
图 14 - 3 字元图格式的位元映像
图 14 - 4 设定 mensetmanus 位元映像为背景图样的根视窗
图 14 - 5 游标及其遮罩的位元映像
图 15 - 1 xedit中物件(widget)的阶层
图 16 - 1 利用前处理器命令的Resource档案
图 17 - 1 xev 显示键名称的输出
图 18 - 1 列出键盘对应的范例
图 18 - 1 列出修饰键对应的范例
图 18 - 1 列出指标对应的范例
图 19 - 1 预设的 .uwmrc 建构档
图 20 - 1 xdm 的 authentication widget
图 20 - 2 程式/usr/lib/X11/xdm/our-session
图 20 - 3 $HOME/.Xsession 程式
图 20 - 4 我们初始化後的萤幕
图 20 - 5 在$HOME/.uwmrc的主机选单
图 20 - 6 在$HOME/.uwmrc中其它的选单
图 20 - 7 在$HOME/.uwmrc中系结和参数的设定

======

X  WINDOWS  系统使用指南

第壹部  系统概观


第1章  使用者对X WINDOWS系统的概观


    X  Window System 是一套在各种位元映像显示器 (bitmapped
dispalys) 上具有极大可携性 (portable) 的视窗系统 (window system),
它是由麻省理工学院 (MIT)所发展出来. X Windows System ( 本书以後部
份简称为X) 可在许多系统上执行. 由於它和生产者无关、具可携性、对彩
色掌握的多样性及对网路之间的操作透通性 (operate transparently), 使
得X成为一个工业的标准. 由於原始程式可自由使用, 所以它也是一个优良
的研究媒介.

    X视窗系统是一个让程式设计师发展可携性图形使用者介面的工业软体
标准, X最重要的特徵之一是它独特的与设备无关结构.任何硬体只要提供
X协定 (Protocol),便可以执行应用程式显示一群包含图文的视窗,而毋需
重新编译和连结.这种与设备无关的特性,使得只要是根据X标准所发展的
应用程式,均可在不同的环境下如大型电脑,工作站,个人电脑上执行,因
而奠定了X成为工业标准的地位.

    X可以在一些 UNIX 系统的电脑上执行, 如 Alliant, Apollo, DEC, IBM,
Hewlett-Packard, Sun等, 也可在 DEC的 VAX/VMS, MS-DOS及一些其它的系
统上执行. 其它的一些厂商如 AT&T, Adobe, Control Data, Data General
, Fujitsu, Prime, Siemens, Silicon Graphics, Sony, Texas Instruments,
Wang, Xerox 均曾表示支援X.



1.1 X有什麽特点?

  以下四个特徵说明了X大部分的能力及其受大众欢迎的原因:

  .X具有网路透通性(Network Transparent): 透过网路,应用程式在
      其他机器输出显示就和在自己机器上一样容易.此种通讯架构和网路
      上另一端的它种机器完全语言无关和机器无关,甚至不需相同的作业
      系统.总结一句,程式可以在另一种不同的显示器型态下执行而毋需
      重新编译(re-compilation)和重新连结(re-linking).

  .可支援许多不同风格的使用者介面,管理视窗的功能例如视窗的摆放
      ,大小及显示顺序等等并不包含於系统中,而是由应用程式来控制,
      因此可轻易的更换.不同风格的介面关系於不同的应用程式,利如卷
      动视窗中的文字和选择视窗中的一个物体,彼此间不会互相限制.

  .X不是电脑作业系统的一部分:对作业系统而言,X只是一个应用程
   式而已,因此,X很容易在不同的系统上装设.

  .视窗是阶层性的 (hierarchical): 应用程式可以直接利用视窗系统
      已有的设施 (facilities) 便可满足大部分的需求,而毋需藉助其他
   的输入或控制结构 (mechanisms). (例如:选单(menu)可利用一个分
      支的子视窗来产生.)

所有的特徵均会在以下的章节中作进一步详述.



1.2 什麽是视窗系统?

    本节讨论一般视窗系统的一些基本概念, X视为其中一个特例, 如果你
已熟悉其它的视窗系统, 本节内容仅需快速浏览即可.

    X是一个在位元映像显示萤幕上建立和管理视窗的系统, 它可以在拥有
位元映像显示器、键盘和一些可以指示萤幕上特定位置或物件的装置的工作
站或他种型式拥有位元映像显示器的终端机上执行. X把指示位置的装置叫
做指标 (pointer), 通常为滑鼠(mouse),X支援现今电脑上常见的视窗使用
者介面.

    使用视窗系统常常拿来和在普通办公桌上的工作比较, 你的桌面上通常
放了一些纸, 信件和手边相关的工作, 一些有用的工具 (如时钟, 日历, 计
算器等),当进行到工作的另一个部份, 你会从新安排桌面上的纸, 你可能把
工具集中放在一起, 也可能不时参考桌上仍然看得到的纸的内容, 过了一阵
子, 你可能把其中的一些资料暂时摆到一边, 或者通通从桌面上移走.

    上述是一个人的工作模式, 把它搬到电脑, 如果能提供相同的功能是很
理想的, 很不幸地, 老式的终端机或 CRT限制了你一次只能在萤幕上做一件
工作, 而且只能看见一小部份的文字资料 (通常为24行),图形的工作就更别
提了, 现在视窗系统试图克服这点, 通常它提供你一个较大的萤幕, 允许你
同时看到几件工作项目, 可以显示图形, 甚至有彩色.

    X便是依照上述视窗的工作模式发展出来的, 在X的环境下、一个视窗
是萤幕上的一块长方形区域, 且平行於萤幕的边, 通常, 每一个视窗 (注1)
被一个独立的应用程式所专用, 数个应用程式可以" 同时" 在它自己所拥有
的视窗上显示输出结果,X允许视窗重叠. 见图 1 - 1

注 1: 严格地说, 应该说成" 一个最高层 (top level)的视窗",因为X允许
      视窗有阶层, 所以, 一个典型的应用视窗可以包含许多子视窗
      (sub-window)分别用来做控制、输入及显示等功能.

               ┌——————————————┐
               │   page 6.  Fig 1.2         │
               │                            │
               │                            │
               │                            │
               │                            │
               │ 图 1 - 1  重叠的视窗       │
               └——————————————┘

    但即使视窗的部份或全部被其它视窗遮盖, 应用程式仍然可以对它自己
所拥有的视窗做输出. 设备程式 (facilities) 提供在萤幕上移动视窗、改
变视窗大小、把视窗放在最上一层或最下一层等功能。即便是视窗可以重叠
, 为了方便而在同一萤幕开了许多视窗仍然非常费时, 因此, 就如同其它的
视窗系统一般,X提供表徵图 (icon), 我们在萤幕上用一个表徵图代表一个
应用视窗, 当我们对应用视窗表徵图化 (iconify)後, 视窗被从视窗上移走
, 代之以表徵图, 而空出了较多的萤幕空间, 相反的动作为解除表徵图化 (
de-iconify),也就是以原先的视窗取代表徵图。

    一些便利的功能, 例如时钟或日历, 并非内建於系统, 而是由许多小的
应用程式所提供.

    对於输出, X提供了许多写文字和画图形到视窗上的功能选择, 许多种
的字型 (FONTS)可以非常容易并且做一致性的处理, 有许多图形的结构和绘
图的基本方法, 例如点, 线, 弧线, 区域 (areas)被提供, 色彩的掌握更是
丰富, 这些复杂的部份对使用者而言是隐藏起来的, 使用者可以简单和方便
的使用它们,例如, 在应用上, 你可以用 "*times-bold-i*"表示要使用加倍
粗的斜体字型 (italic),你需要使用彩色时, 你只要用日常的名称, 例如
 "yellow(黄色)" 或 "navy blue (天蓝色)".

    对於输入功能的提供, X也是多样化的, X可以连结不同形式的键盘,
如传统的QWERTY键盘或Dvorak Style键盘, 或者是不同国家的特殊规定. 处
理使用者介面是输入功能很重要的一个部份, 键盘和滑鼠的指令告诉系统如
何架构一个视窗和处理视窗的内容.

    由於X的视窗处理功能并非内建於系统, 而是建在使用者层次, 因此容
易於修改或更换, 所以X能提供不同形态的使用者介面。换个角度来说,使
用者介面所必需具有的弹性几乎完全可由X独立提供.



1.3 X简史

    X於1984年在麻省理工学院 (MIT)电脑科学研究室开始发展, 当时 Bob
Scheifler 正在发展分散式系统 (distributed system),同一时间 DEC公司
的 Jim Gettys 正在麻省理工学院做 Athena 计画的一部份, 两个计画都需
要一个相同的东西 ------ 一套在 UNIX 机器上优良的视窗系统. 因此合作
关系开始展开, 他们从史丹佛 (Stanford) 大学得到了一套叫做W的实验性
视窗系统, 因为是根据W视窗系统的基础开始发展,当发展到了足以和原先
系统有明显区别时,他们把这个新系统叫做X.

    工作持续地进行, 新的版本 (version)不断地产生 (当软体和前一版不
相容时, 新的版本便产生了),在1985年中期, 任何人只要付版权费便可使用
X的基本政策被决定. 以下为一些最近的记事:

    第10版: 1985年底. 直到此时, 在 MIT以外的人和组织, 才开始对X有
        实质的贡献.

    第一套商业化的X产品: DEC 於 1986 年 1月推出 VAXstation-II/GPX.

    第10版第 3次发行: 1986年 2月. 从此时起, X开始流传於世, 人们把
        它移植到许多新的系统上.

    第10版第 4次发行: 1986年11月.

    第一次X技术会议: 1987年 1月於 MIT.

在1986年间, 第10版X无法满足所有的需求已非常明显, MIT 和 DEC便从事於
完整协定 (protocal) 的重新设计, 这就是X第11版.

    第11版第 1次发行: 1987年 9月.

    X协会成立: MIT X协会成立, 目的是为了研究发展及控制标准, 目前有
        30个以上的机构加入.

    第二次X技术会议: 1988年 1月.

    第11版第 2次发行: 1988年 3月.

    第11版第 3次发行: 1988年10月.



1.4 X的成品

    严格地说, X视窗系统并不是一个软体, 而是一个协定 (protocal),这
个协定定义一个系统成品所必需具备的功能 (就如同 TCP/IP, DECnet 或
IBM的 SNA,这些也都是协定, 定义软体所应具备的功能).任何系统能满足此
协定及符合X协会其他的规范, 便可称为X.

    简单地说, 从现在起本书不再区分协定和成品的分别, 我们提到X, 意
指一个完整且适当的系统成品.



1.5 MIT 发行的X

    MIT 所发行的X可以提供许多厂牌的电脑, 目前的版本 (第11版第 3次
发行) 支援以下的系统:

    . Apple A/UX
    . Apollo Domain/IX
    . 4.3 + tahoe
    . Digital Equipment Coporation Ultrix
    . Hewlett Packard HP-UX
    . IBM AOS
    . Sun Mircosystems SunOS

此外尚有更多的商业化产品.

    当系统一直在发展, 而且有更多的人使用它, 由第三集团(third party)
发展的软体逐渐增加, 而使得系统版本一分为二:

    . core版 -- 软体由MIT X协会提供.

    . corelib 版 -- 软体由使用者或第三集团提供.

为了方便, core和corelib 软体储存在不同的磁带上发行.

    本书说明几乎以core版为主, 偶而因core版没有提供的功能或大家较有
兴趣的部份, 会参考到corelib 版本.


1.5.1 MIT 版包含了什麽

    这个版本包含了文件说明, 原始码, 建构档 (configuration file) 和
公用程式 (utilities)和其它一些建立完整工作系统所必需的东面,(没有任
何目的档或二进位档提供, 系统必需由原始码建立),在此我们只讨论从使用
者观点看这个系统, 所以只描述那些视窗系统程式本身或一些使用者所需的
工具程式, 省略装设公用程式、建构工具程式、本版需知等, 这些东西可参
考附录.

    core版的程式可分为以下几类:

    1.  X视窗系统本身的程式.

    2.  使用视窗系统必备的工具和设备程式:

        . 日常的视窗相关功能的工具程式 (例如将视窗内容倾印至列表机)。

        . 一些你常常保持在 "案头" (desktop) 的便利程式 (例如时钟,
          日历).
    3.  从视窗环境获得效益的一般应用程式.

    4.  展示(Demo)程式和游戏程式.

    5.  资讯和状态报告程式.

    6.  定制 (customise)你自己的环境的工具程式.

    我们将在以下的章节讨论它们.


1.5.2 系统程式

    以下的程式包含了所有基本系统的相关程式.

    X -  显示server -- 这个软体控制了你的工作站的键盘、滑鼠和萤幕.
这是X的心脏, 此程式可以建立、去掉视窗, 实际的应其它 client 程式的
Request (需求)做写 (write)和画(draw)的动作.

    这个server程式在各种硬体上有不同的程式提供, 例如:

        Xapollo - 针对Apollo显示器.

        Xhp - 针对Hp 9000/300 的Topcat显示器.

        Xibm -  针对IBM 的APA16 和Megapel 显示器.

        Xmacll -  针对Apple 的Macintosh II.

        Xplx -  针对Parallax图形控制器.

        Xqdss - 针对DEC 的GPX 显示器 (VAXstation II/GPX).

        Xqvss - 针对DEC 的QVSS显示器.

        Xsun -  针对Sun/2, Sun/3, Sun/4 和Sun/386i工作站.


    Xinit - 初始(initialization)程式, 启动系统和设定Server执行.

    Xdm - X显示管理器(display manager),一个提供便利和弹性地启动系统
          , 使系统启动成个别需求的程式, 可以和 Xinit两者择一.

    Uwm - X视窗管理器(Window Manager), 此程式决定如何管理你的 "案头"、
          移动视窗、重定视窗大小等等, 你可以利用选单结合滑鼠的按钮
          或键盘完成视窗操作.

    只有Server程式是绝对必需的, 不需其它的程式, 你就可以在X系统上
跑其它的应用程式 (虽然笨了一点). (Xinit 等程式可由其它相同功能程式
替代.)

    以上程式包含了视窗系统, 但除了在视窗上移动游标外, 什麽事也不能
做. 因此实际上, 你需要更多的公用程式和应用程式.


1.5.3 视窗系统公用程式

    以下的工具程式并不是视窗系统的一部份, 但它们是你要更方便的使用
系统或利用系统做更多的事所不可或缺的, 它们分为以下两个部份:

    1.  视窗系统操作常用工具程式

        只要你用视窗系统代替一般的电脑终端机, 这些程式几乎是天天需
        要的:

        xterm - X终端机模拟器 (terminal emulator), 你的系统内大多
                数的程式并非特别为使用视窗系统设计. 举例来说, 一些
                最普通的系统程式 -- 列出档案目录, 编辑器, 编译器等,
                它们在普通的终端机可以正常的执行, 可是它们如何在连
                视窗系统是什麽都不知道的情况下, 在X下操作? Xterm
                就是建立一个X的视窗, 且允许这些普通的 "笨哑终端机
                (dumb terminal)"程式能够在这个视窗中执行的工具程式.
                这些普通程式会认为它们是在 "真的" 终端机上执行. 当
                然, 你也可以用xterm 去启动其它的X程式而并非一定是
                那些普通程式.

        xhost - 让你控制网路上那些被允许存取你的显示萤幕的其他主机。

        xkill - 一个可杀掉不想要之应用程式的工具程式。

        xwd - 将你视窗内目前的影像倾印 (dump) 到一个档案中,使得你可
              以在稍後重建这个视窗、列印它或做一些你想做的事。

        xpr - 将先前 xwd所抓取 (capture)的视窗影像转换成适合硬拷贝
              (hardcopy)印出的格式.

        xdpr - 结合了 xwd和 xpr,允许你在一个步骤就印出视窗的内容.

        xmag - 将萤幕上被选取的一部份影像加以放大。

        xwud - 将先前 xwd所抓取的视窗影像重新显示於萤幕上。

        x10tox11 - 将能在第10版X执行的程式转换成可在第11版执行。

        xrefresh - 更新 (refresh)显示, 将某些或全部的视窗全部重画
               一遍。

    2.  便利的程式

        xclock - 一个指针或数字型的时钟。

        xclac - 一个计算器,可模拟科学工程型的计算器。

        xload - 用累计图 (histogram)来显示目前机器的负载分布。

        xbiff - X版的 biff,信件到达告知 (barfs if mail arrives) 程
            式,xbiff 会显示一个信箱的表徵图,当信箱上的旗子升起时,
            表示有你的信。


1.5.4 一般应用和工具程式

    这些程式不是直接和视窗系统相关,但视窗系统环境使它们更有效益。

    xedit - 一个文字编辑器,你可以用选单或键盘下命令,也可以用指标指
            定位置或一段文字。

    xman - 一个说明书或系统文件的浏览器。

    xmh - 一个信件管理程式。


1.5.5 示范和游戏程式

    这些程式展示了X图形和彩色的能力, 在你开始使用系统时, 它们是一
个进入状况良好的起点.

    ico - 显示一个二十面体 (或其它多面体) 在视窗内进行弹性碰撞运动.

    maze -  以乱数建立一个迷宫并找出它的解法.

    muncher - 在视窗上描绘大量动态的图样 (patterns).

    plaid - 在视窗上画一些持续变化的花格子图形.

    xlogo - 在视窗上印一个X的字形.

    puzzle -  智慧盘, 在一 4x4方块盘上, 移动编号 1 - 15 的小方块,
              以排成特定型态的游戏.


1.5.6 资讯和状态程式

    以下的程式提供你有关於你的视窗系统的资讯和状态, 你将会常利用它
和你自己的工具程式连结在一起.

    xfd - 在视窗内显示一个被X指定的字型,且可选择性地提供更多有关
          此字型的资讯.

    xlsfonts -  X字型的目录程式, 告诉你一个显示器上有那些字型可供
          使用.

    showsnf - 显示上server上SNF(Server Natural Format,你Server上原
          有的格式) 格式对某一种字型的细节.

    xwininf - 显示某个特定视窗的资讯, 如大小, 位置及其它特徵.

    xlswins - 列出系统内所有的视窗, 并可选择性地列出每个视窗的一些
          细节.

    xprop - 显示视窗的性质 (properties) 和字型.

    xdpyinfo - 提供你的显示器及控制它的 server之细节.

    xev - 印出和视窗相关所有X "事件(event)"的细节, 用来侦错(diagnostic)
          或给有经验的人使用的工具程式.


1.5.7 定制适合你的系统之工具程式

    一开始你可能不会用这些程式, 但过了一段时间, 你可能发现你必需修
改一下系统, 例如想使用较大的预设字型, 视窗边框换成自己喜欢的颜色等,
用以下的程式, 可以使你的工作环境更加适合你.

    xset -- 允许依照你的喜好设定显示特性, 你可以设定一个键使它有效或
            无效, 调整警告铃的音量, 指定字型从何处取得等.

    xsetroot -  你可以选择你显示萤幕背景的外观, 当你滑鼠的指标不在任
            何应用视窗内时, 你可以改变使用的颜色或图样或游标.

    xmodmap - 显示键盘的对应 (mapping), 也就是按什麽键对到什麽字元,
            可以允许你修改成适合你的对应, 通常用来设定一些特殊键 (如
            META, SHIFT-LOCK等) 和函数键, 但你可以视需要设定任何键.

    bitmap -  让你建立和编辑位元映像的程式, 例如用来改变cursor的式样,
            编辑表徵图, 视窗的背景图样等等.

    xrdb -  让你在资料库中显示或改变你喜爱的色彩或字型等等, 稍後可被
            应用程式使用到. 也就是说, 你可以设定一些预设的特性, 让这
            些特性被所有或只有特定的应用程式用来当作预设特性.

    bdftosnf -  将一种字型从BDF("bitmap distribution format"一种可携
            的格式)格式转成你Server 原有的SNF 格式.

=====

第2章  从基本系统模式概观X

    在本章和下一章我们将描述X的基本架构,并介绍许多基础的观念,其目
的在於对你稍後使用系统时能有一个了解,你将会洞悉系统程式做些什麽和如
何做,如此你将更快和更有效率的使用系统,我们也会指出系统外在的利益,
以及使用系统对你的影响。

    本章描述系统的基本元素,以及它们彼此之间如何交谈(interact),下一
章描述系统其它的面貌,特别是使用者介面。此章包含了许多新观念,你不妨
先很快的浏览这两章後,开始实际地使用它,当你对系统比较有感觉之後,再
回头来复习,这样比较容易了解。



2.1 X的基本元素

    X不像早期的视窗系统,把一堆同类软体集中在一起,而是由三个相关的
部份组合起来。

    1.  一个"server"(供应者):是控制实际显示器和输入装置的程式。

    2.  "Client" (顾客) 程式:需藉著server在指定的视窗中完成特定的
        操作。

    3.  一个 "通讯通道(communication channel)":client和server用来作
        为彼此交谈之用。

    基本的"server","client"和 "通讯通道" 的关系图如图2-1 。

            ┌—————————————┐
            │   p16       fig 2.1      │
            │                          │
            │  图 2-1  X的基础成员    │
            └—————————————┘

底下我们描述一下这三个部份。

2.1.1 Server

    Server是控制实际显示器和它的输入装置 (键盘和滑鼠或其它指示装置)
的软体,server可以建立视窗、在视窗中画图形影像和文字、回应client程式
的 "需求" (requests),它不会自己动作,只有在client程式提出需求後才完
成动作。

    每一个显示器只有一个唯一的server。server一般由系统的供应厂商提供
,通常无法被使用者修改。针对作业系统而言,server只是一个普通的使用者
程式而已,因此很容易换一个新的版本,或许甚至是由第三集团提供的原始程
式 (注1) 。

注1:这是Unix系统上的情况,有些供应厂商会选择将server的部份或全部放
      在作业系统核心(kernel)。


2.1.2 Client

    Client是使用系统视窗功能的一些应用程式。把X下的应用程式称作
"client",原因是因为它是server的 "顾客" :它要求server应它的需求
完成特定的动作。

Client无法直接影响视窗或显示,它们只能送一个 "需求" (request) 给
server,让server来完成它们的需求。典型的 "需求" 通常是: "在 XYZ视窗
中写一列 'Hello, world' 的字串" ,或 "在 CDE视窗中用这种颜色从 A点到
 B点画一条直线" 。

    当然,对视窗操作提 "需求" 只是client程式的一部份,其它的部份是那
些让使用者执行的程式部份。例如:编辑文字、画一个系统的工程图、执行计
算表的计算等等。一般来说,client程式的这个部份和视窗是独立的,对於视
窗几乎不需要知道什麽,通常 (特别是指大型的标准绘图套装软体,统计套装
软体等) 应用程式对许多的输出装置具有输出的能力。在X视窗上的显示只是
client程式许多输出格式中的一种,所以,client程式中和X相关的部份在整
个程式中,只占了非常小的一部份。

    使用者可由不同的来源来使用client程式:一些是由系统提供的 (例如时
钟) ,一些来自於第三集团,一些是使用者为了特殊应用而撰写他自己的client
程式。


2.1.3 通讯通道

    X的第三个元素为通讯通道,client藉著它送 "需求" 给server,而server
藉著它回送状态 (status) 及一些其它的资讯 (information)。

    只要 client 和 server 都知道如何使用通道,通道的本身并不是很重要
,在系统或网路上支援通讯型态的需求是内建於系统基本的X视窗函数馆(library)
,所有和通讯型态有关的事都从函数馆独立出来,client和server之间的通讯
只要藉著使用这函数馆(在标准X版为xlib)即可,如图2-2 。

            ┌—————————————┐
            │   p17       fig 2.2      │
            │                          │
            │  图 2-2  xlib函数馆的功能│
            └—————————————┘

    总结来说,只要client程式利用函数馆,自然有能力用到所有可用的通讯
方法。

    Client和Server通讯大略分为两类,相对应於二种基本X系统的操作模式:

    1.  server和client在同一部电脑执行,则它们彼此均可使用机器上任何
        可用的方法做交互处理通讯(inter-process communication
(简称IPC)),             见图2-3
,在这种模式下,X可以像许多传统的视窗系统一样有效率
        的操作。

            ┌—————————————┐
            │   p18       fig 2.3      │
            │                          │
            │  图 2-3  在相同机器上的  │
            │          client和server  │
            └—————————————┘

    2.  client在一部机器上执行,显示器和server则在另一部机器上,则
        client和server的通讯必需透过网路利用彼此同意的协定(protocol)
        方可。目前,最常见的协定为TCP/IP和DECnet,但其它任何被提供的
        可信赖地协定亦可使用。图2-4 显示一个典型的Ethernet网路的通讯。

            ┌—————————————┐
            │   p18       fig 2.4      │
            │                          │
            │  图 2-4  在不同机器上的  │
            │          client和server  │
            └—————————————┘

        这种透过网路,使得应用程式的操作,如同在本地机器一样的能力称
        为网路透通性(network transparence),几乎是X独一无二的特性
        (注1)。这种特性使得它非常适合建立在有弹性地多目标混合机器
        网路上。

注1:有几种例如Sun Microsystems  的NEWS的视窗系统有使用到网路结构,
但没有一种被广泛地使用,而有超过一家以上的制造厂商使用它们。

    因为client和server完全独立,一种名之为X-terminal 的新型态显示器
被发展出来。简单的说,X-terminal 是一种除了能直接在上面执行X server
程式外,什麽也没有的工作站,它有键盘,滑鼠和萤幕,以及一些和网路互相
通讯的方法(所以在其它主机上的client可在它上面显示),但并没有档案系
统,也不提供一般目的 (general purpose)的程式,一般目的的程式需要在网
路上执行。


2.2 Server和Client如何交谈

    本节描述client和server互相通讯时,双方各传输些什麽。基本上,一个
client要求server去执行输出,输入则藉著 "事件" (event) 的通知由server
来掌握( "事件" :如按下键盘的键或滑鼠的按钮等等)。


2.2.1 Client送达server的东西;Output Handing (输出交予)

    当一个client要求server做一个动作,例如在一个指定的萤幕上建立一个特
殊特徵的视窗,或者在一个视窗中写一列文字串。这时client是藉著送 "需求"
(requests)到server上来达成。一个 "需求" 是一个被封装(package) 的简单
区块(block) ,区块包含一个 "操作码"(opcode) 来指示要执行何种操作,伴
随著一些引数(arguments) 提供更多的需求细节。例如:清除一个视窗内的一
个长方形区域,client会送一个16位元组(byte)的需求区块,来指定是哪一个
视窗,欲清除区域的左上角座标及区域的高和宽。

    这个格式有几个重要的特徵:

    . 需求区块的内容,和client与server在何种型态上的机器上执行完全无
关。一个client可以输出需求给在任何型式显示器上的任何X视窗server。需
求和语言、机器及作业系统均无关。

    . 每一个需求包含了视窗的细节和其它被使用的资源,对一个client送至
特定server的需求超过一种以上的连接方法,所以在网路架构上提供的视窗数
目没有限制。

    . 需求区块通常大小为20位元组左右,算是相当的小,因为需求是设定为
相当高阶的,(例如画一条线是指定两个端点而非记录一串萤幕上的点)通常
萤幕上被影响到的像素的数目往往是区块本身大小的十到一百倍,如此不会使
网路的负荷太重,网路的使用效率会非常的好(一般认为X的server和client
之间的传输是位元影像 (bitmaps)的观念是错误的)。


2.2.2 Server送达Client的东西;Input Handling (输入交予)

    Server也会利用通讯通道送资讯回client,这些资讯包括回应client需求
是否成功和告诉client有兴趣的特殊 "事件" ,这些 "事件" 包含的讯息类似
”视窗XYZ 的滑鼠左按钮被碰触”或”视窗ABC 已被重定大小等”。

    就像从client来的需求一般,server的回应也是一些和语言、机器、作业
系统无关的简单区块。

     "事件" 是X的基本功能,所有的键盘输入,滑鼠按钮输入和滑鼠移动都
是由 "事件" 来控制,尤有进者,client完全依赖 "事件" 才能获得那些一定
在系统发生的而它必需知道的资讯。我们将从一些普通的输入和移动功能著手
,实际了解 "事件" 是如何工作的:

键盘输入

    当你从键盘按下一个键,这个动作会被server查觉到,Server便送出一个
<Key Press> 的 "事件" 通知那些登记对这种情况有兴趣的应用程式。这种通
知有一些限制:不是通知目前被滑鼠指标指到的视窗,便是通知目前被指定接
受所有键盘输入的视窗。这种限制称之为设定键盘焦点(focus) 。

    当键被松开时(通常几乎是立刻),另外一个<Key Release> 的 "事件"
产生了,一般除了那些修饰键(例如SHIFT 或 CONTROL),很少的应用程式会
对松开键这个 "事件" 有兴趣。

    送到client的讯息区块告诉client它们是键盘 "事件" 内容的只是”编号
第几的键已被按下(或松开)”,不包含是不是ASCII 或EBCDIC字元及如何解
释等内容,而把这些留给client程式去处理,这种做法使得client程式看起来
似乎复杂,但是标准的xlib函数馆,有非常简单的副程式可供控制解释键盘 "
事件",而且通常预设成你所希望的键盘型式,换个角度来看,这种”软体”
的键盘字元相关方式允许了很大的弹性:在server这方面,对不同型式的键盘
均可以完全重新对应,在client这方面,每一个单独的键都”可程式化”,例
如按一个键即可以输入一串使用者特定的字串,或者完成一个特殊的功能等。

    稍後我们会再详细讨论,不过直到目前,这些将不会影响你使用系统,事
实上,对於X系统如何处理你按下一个”A ”键,并将它转换成一个ASCII 的
”A ”字元送到你的应用程式的这类事情,你不需要太关心。

关於指标位置的 "事件"

    client可以要求当萤幕上的指标进入或离开它所控制的视窗时被通知,这
种 "事件" ("<EnterWindow>" 和"<LeaveWindow>") 告诉client程式是进入或
离开视窗以及是哪一个视窗。

    当指标进入视窗时通常用类似”高亮度”视窗这一类的方式表式,有些应
用程式是改变视窗的边框(例如从灰到黑),有些则会改变颜色,用以强调你目
前正在处理这个应用程式(视窗)。

当一个视窗未被覆盖时 -- Exposure (曝光 "事件")

    X和大多数其它的视窗系统有一个很大的不同点,那就是client必需负责
保持它的视窗最近的内容,server只是维持视窗在任何时刻均在萤幕上显示,
但它不负责保持视窗的内容。

    当原先被其它的视窗遮住的视窗(或视窗的一部份)变成可见时,server
并不知道应该显示这个视窗的哪个部份。server送一个exposure(曝光)"事件"
给拥有这个视窗的client,告诉它视窗的哪一个部份刚刚已变成可见,client便
会决定该怎麽作,在大多数的情况(一般为简单的应用程式或小视窗),client
只是重画整个视窗,因为只画视窗未被遮盖的部份往往要多花额外计算,并不
值得,在更复杂的应用程式,client才会只重画视窗必需要出现的部份,这是
由应用程式的撰写者决定,他必需在效率(视窗更新的速度)和只重画部份视
窗程式码的复杂程度间作取舍。

    依赖client来重画视窗内容的方式对效率特别重视,尤其是下拉式选单,
你总不希望选下选单之後,选单过了老半天才消失而让下面的视窗显示出来吧
,为了克服这点,有些X的产品包含了被称为save-under(存下层)的便利程
式:

你可以告诉server如果可能的话,尽量在一个视窗被遮盖前将其被遮盖的内容
存下,当遮盖的视窗被移走时便可立即重现而不需要送曝光 "事件" 给client。

    一个类似而更常用,被称为backing store 的方式也被发展出来,你可以
告诉server尽可能在一个视窗被遮盖前将其全部内容存下,同样的,这种方式
可以改进client重画视窗的效率,backing store 和save-under两者的不同处
是前者储存整个视窗的内容,而後者只存被遮盖的部份。

    虽然有了save-under和back store这两种产品,但此种结构不被担保,
client仍然随时保持准备接受曝光 "事件" ,即使server真的维护(maintain)
了一段时间的视窗内容,也可能因为记忆体不足而被迫停止,转而开始重新送
出曝光 "事件"。


2.3 X的网路风貌

    我们曾经提过,client和server只需透过网路便可在不同的机器上执行,
下面几节我们将看看如何利用这种便利、为什麽有用、和它如何因整合了计
算资源而增进了网路的成长。


2.3.1 你如何实际使用X网路

    当server在一个连接了显示器的机器上执行,而client在另一部机器上执
行时,滑鼠和键盘的输入由server所在的机器搜集,可是client却可以在别的
地方使用到这些输入,这是如何办到的?我们以下面的例子解释。

    你在使用一个由Xserver控制显示器的工作站,如果它是独立的,很明显
地,client也在此工作站上执行,即使连接了网路,大部份的时候你还是在你
自己的工作站执行client,可是因为有一些特殊的便利程式,你的机器上并没
有,而你却希望在你的机器上显示程式的输出,这时你便需要网路上的机器了
。利用你的作业系统提供的一些普通的网路设备程式,你便可以让client程式
在远方的机器上执行,而指定输出显示在你自己工作站的显示器上,如图2-5.

            ┌—————————————┐
            │   p23  fig 2.5 (???)     │
            │                          │
            │  图 2-5  使用X网路典型  │
            │          的面貌          │
            └—————————————┘

就如同图上显示的机器名称,假设client程式的名称为xgraph,在Unix系统上
,你所下的命令类似下面:

        rsh neptune xgraph -display venus:0

则xgraph程式在远方名为neptune 的机器上执行,且xgraph的输出会送到你自
己名为venus 的机器上的 0号显示器上,从现在起,我们将参照这种远方显示
(remote display)的模式操作,当client在一部机器上执行时,server在另一
部机器上执行。

    现在总结一下:你使用远方显示的设备程式使得client程式在远方的机器
上被执行,而且告诉它将输出显示在执行Xserver的本地机器上。


2.3.2 X的网路设备有何用途?

    在一部机器上执行client而把输出显示到另一部机器有何用途?这些用途
和便利是极常见的,以下是一小部份的用途:

    . 远方的机器速度比你的快很多(可能是因为加了浮点运算器或它根本就
      是一部超级电脑。)。

    . 在你的区域网路上,远方的机器是一部档案服务器(file server) 提供
      了大量磁碟资源,为了降低网路的负担,你可以把一些类似大量的搜寻
      操作,需要用到大量磁碟动作的程式放在远方机器上执行,如此一来,
      只有执行结果而不是大量操作磁碟的动作会透过网路传送。

    . 远方机器有特殊的结构适合特别的工作,可能是专门的资料库机器,或
      者是为一个单独的应用特别设计的特殊目的机器。

    . 远方的机器有只能在其上执行的特殊软体,在现代的工作站,在网路上
      有些软体执照只有少数的机器拥有已是愈来愈多的趋势,因为软体执照
      只发给那些有付费的工作站CPU 。在这种情况下,可以实际地在远方的
      机器上执行这些有执照的软体,而将显示传回你自己机器上,是相当地
      便利。

    . 你需要同时存取好几部机器,通常系统的管理者有此需求。

    . 你需要同时输出到数部显示器。(下面有一个范例)


一个特别的范例 -- 一个应用程式使用数个显示器

    大部份的情况,数个client应用程式共享一个显示器是常见的,例如一个
萤幕上同时有时钟client和编辑器client,但是一个client也可以连接到数个
server,而且同时输出到server所在的萤幕上。

    这种情形用於教学特别有效率,如果一个班上的学生们有X视窗工作站连
接在网路上,则老师就可以把萤幕当成动态的黑板,同时输出给学生,再发展
下去,学生也可以有一个client程式把显示输出给老师,达成双向的沟通,只
要网路许可,所有的工作站并不需要在同一个房间,因此老师和学生可以分散
在各处。


2.3.3 X网路结构产生的简易性

    就像前面所提过的,所有从client对server发出的 "需求" ,由於它们的
格式和内容是和设备无关的(device-independent),而所有和设备相关的事完
全集中在server,对於任何显示器的硬体,只有对应於此种显示器的server才
需要去关心,只要针对一个显示器的server一旦被提供,所有可执行X client
程式的其它机器立即可使用这个显示器,不需要重新编译或重新连结,甚至连
显示器是什麽型式都不需知道。

    这种把设备的相关性独立出来给server的方式,对许多工作站网路的贩卖
商变得可行且轻松,这种弹性在两方面特别有用:

    . 当一部执行X client 的新机器加入网路,它立即可以使用任何执行X
      的显示器。图2-6 是一个强力的CPU 如何在网路上被当成一个计算服务
      器(compute server)的示意图.

            ┌—————————————┐
            │   p25  fig 2.6 (???)     │
            │                          │
            │  图 2-6  已存在的显示器  │
            │          可使用在新的CPU │
            │          上的client      │
            └—————————————┘

    . 相反的,当一个新的显示器加入,它立即可被任何机器上现存的所有
      X client 应用程式使用,见图2-7 ,这里有两个极端的例子:

       -- 增加一个高效率的显示器:它的高品值和(或)速度可被用来加强
          任何现存的X应用程式。

       -- 增加一个非常低等(low end) 的显示器(例如X显示器),至少这
          是一个使用现在所有软体,并提供图形和视窗的最便宜的方法。

            ┌—————————————┐
            │   p26  fig 2.7 (???)     │
            │                          │
            │  图 2-7  被已存在的client│
            │          程式使用的新显  │
            │          示器            │
            └—————————————┘


2.3.4 在网路上使用非X的应用程式 -- 终端机模拟器

    如果在远方机器上的程式并不是X client 或甚至连X是什麽都不知道,
你仍然可以像远方的机器一样使用它们,这就需要用到X视窗”终端机模拟器”
(terminal emulator) ,一个假装它是终端机的程式。如此一来,你便可以让
任何程式在这个假的终端机执行。这个终端机模拟器利用X显示输出(和得到
键盘输入),当然输出也可以送到本地或远方的显示器。一个这种型式的范例:
利用xterm 终端机显示器去执行信件程式,见图2-8 ,(xterm是MIT 标准版X
的所提供的一部份) ,这种方式对扩展网路的用途是可想像的,但是注意到一
点,它并非万灵丹,一个不是X的应用程式当然还是无法用到X的特性,终端
机显示器并没有什麽魔法让假的终端机可以使用滑鼠输入或图形操作等。

            ┌—————————————┐
            │   p27  fig 2.8 (???)     │
            │                          │
            │  图 2-8  执行远方的一个  │
            │          非X的信件程式  │
            └—————————————┘


2.4 摘要

    本章你可以看到包含在X中的基本构成要素:控制显示器的server,要求
server帮它完成输入输出的client应用程式和介於两者之间的通讯通道,你可
以看到它们彼此间如何交谈,如何实地应用,以及它们对你的好处(不管你是
使用者或系统建立者)。

    下一章,我们继续概观系统,但是在稍高一点的层次,焦点集中在使用者
介面上。

=====

第3章  从使用者介面的面貌概观X

    在本章,我们将观察重点摆到系统控制的使用者介面,例如,系统如何显
示有人使用它,以及包含那些结构等。

    X设计的目标之一就是能支援许多不同型式的使用者介面,一般其它的视
窗系统提供特殊的交谈方法,而X则提供一般性的架构,让系统建立者
(system builder)据以建造所需的交谈的风格。例如,在一个X系统中你可藉
从选单中选一个动作来构建视窗,但其他对视窗的操作则全靠滑鼠来做,这种
弹性允许系统开发者(developers)完全在X的基础上产生全新的介面,也因为
介面并未内建於视窗系统,因此使用者在任何时刻根据他们特别的需求可选用
适当的介面。例如,对於完成一些相同的工作 -- 建立、移动、重定大小萤幕
上的视窗,初学者较老手喜欢简单的系统,而X可分别提供最适合他们的使用
者介面。

    使用者介面分为两个部份:

    管理介面:命令最高层的视窗如何在萤幕上建构或重建构(re-configured),
              也就是说,如何管理你的案头。

    应用介面:决定你和应用程式间交谈的”风格”(style): 你如何利
              用视窗系统的设备程式来控制应用程式及输入资料给它。


3.1 管理介面:视窗管理器

    管理介面(management interface)是系统的一部份,用以控制你萤幕上最
上层的视窗(换句话说:如何重新建构你的案头),这个部份在系统中称之为
视窗管理器(window manager),它的功能有改变视窗的大小或位置、将视窗在
堆叠 (stack)中重新安排位置、或将视窗改变成表徵图 (icon) 等等。

    在X中,视窗管理器只是另一个client程式而已,它以及系统介面的发展,
和server是完全分开的,因此你可以更换它们,这类似於Unix系统中的shell
命令列直译器(interpreter) :shell 只是一个使用者处理程式(process) ,
如果你改变它,你也改变了系统的使用者介面。


3.1.1 手动的和自动的视窗管理器

    有两类的视窗管理器:手动的和自动的。手动的视窗管理器,视窗在萤幕
上的位置和大小完全由使用者控制,手动的视窗管理器只是使用者用来完成工
作的工具,大部份的手动视窗管理器允许应用视窗重叠。

    相对的,自动的视窗管理器尽可能的由它自己来控制案头,对於萤幕的布
置尽可能让使用者少插手。它在新建立一个视窗时自动决定视窗的大小和位置
,和当视窗移动时如何重新安排其馀的视窗,通常自动的视窗管理器将萤幕分
成一块块像磁砖一样(tile)的区域,也就是说安排应用视窗彼此不会重叠,而
且尽量占用最多的萤幕空间。

手动的视窗管理器如何工作 -- 攫取(Grabbing)

    通常当你告诉手动的视窗管理器你要完成什麽动作时,是藉著使用选单或
者结合了按滑鼠的按钮和移动指标,例如,重新摆放一个视窗的位置,你可以
移动指标进入视窗,按住左边的按钮,移动指标然後在新位置松开按钮,视窗
管理器是如何知道这些滑鼠 "事件" 的意图的?或是换个角度,server是如何
知道 "事件" 是来自应用视窗或视窗管理器?

    答案是由视窗管理器告知server有哪些特定的 "事件" (碰触按钮等等)
需要被送达,这和哪一个视窗发生的无关,这种处理称之为攫取(Grabbing),视
窗管理器可以指定哪一个滑鼠按钮希望被攫取,而这攫取发生在滑鼠的按钮被
按下且键盘上一些特定的键(一般称为修饰键(modifer) )也被按住(例如当
CONTROL 和SHIFT 两个键被按住时且滑鼠中间的按钮被按下),当按钮被按下
时,攫取开始动作,server送出所有滑鼠的事件(包括滑鼠的移动事件)到视
窗管理器直到按钮再度松开,视窗管理器把这些 "事件" 的资料解释成来自使
用者的指令来工作。以移动视窗为例,视窗管理器在按钮按下时被告知指标的
位置,而当按钮松开时再度被告知,对指标的位移做一些简单计算便可据以移
动视窗。

    有一件事需要使用者配合,那就是滑鼠和修饰键组合而成的攫取不应该为
应用程式所知道,所以必需确定视窗管理器这种攫取键的组合不会和应用程式
冲突,大多数的视窗管理器可以很容易的定义这些攫取的组合键,而保留给它
自己使用。


3.1.2 视窗管理器额外提供的功能

    视窗管理器除了具有重新建构视窗的基本功能外,也提供额外的功能改进
介面的品质,通常,加入额外功能的目的是为了降低键盘输入的需要,而改成
尽量多用指标。

    一个常见的功能是提供一个你自己可以建构的一般性选单,这样你只要选
取一个选单选项便可启动视窗应用程式。这个启动的命令通常包含了指示应用
视窗在何处出现,大小多少,本文用什麽颜色等等。所以应用程式不需要太多
的使用者输入便能启动。一个常见的选单用法为当你在网路上工作时,你可以
定义一个选单列出所有你在网路上可用的主机,如此你便可藉著在选单上选择
主机名称便能和任一主机建立连接。


3.1.3 视窗管理器和表徵图

    当一个视窗转换成一个表徵图时,表徵图是如何来的?视窗又发生了哪些
事?

    表徵图的结构非常的简单,它只是视窗的代表图案,当系统表徵图化(iconify)
 一个应用视窗,视窗管理器只是不对应出(unmap) 这视窗(也就是说,告诉
server不再显示这个视窗到萤幕上)而把表徵图视窗对应出来。解除表徵图化
(deiconify)则把上述的处理反过来。视窗管理器可以办得到的原因是它没有”
存取控制”(access control)或许可限制来防止一个client(例如视窗管理器)
不对应出其它的client的视窗,所有在同一个server上的client都可以对任意
视窗或多或少做一些动作。

    视窗管理器通常提供预设的表徵图,但是client可以提供它自己的表徵图
并建议使用它,有些视窗管理器接受这个要求,有些则忽略不接受仍用自己的
表徵图,只把这个需求当作给视窗管理器的暗示(hint)。

    当应用程式被表徵图化,它的主视窗便不再被对应出来,如果视窗管理器
因任何理由中断了,则这个视窗永远也无法再对应出来了。要避免这点,当视
窗管理器表徵图化一个视窗时,它把这个视窗加入一个名为save set的名单□
,这个名单由server负责维护,如此当视窗管理器被中断时便可重新对应出来。


3.1.4 应用程式传递建构资讯给视窗管理器

    就如同要求显示一个特定的表徵图一般,应用程式也能传递其它的暗示或建
构资讯给视窗管理器,这包括:

    . 应用程式和表徵图视窗的名称。

    . 当应用程式和表徵图视窗被建立时,它们在萤幕上位置的资讯。

    . 对视窗大小的限制(例如,client可以宣告”我所占用的视窗大小绝不
      可小於宽度若干x 长度若干”)。

    . 对视窗重定大小的特别要求(例如,一个显示本文的视窗,可以要求在
      重定大小时按特定的间隔放大或缩小,以使得视窗内的字元永远是完整
      的一个,不致视窗边框的那一行 (列) 有半个字的情况出现。)。

    这种将讯息传递给视窗管理器的结构称之为性质结构(property mechanism),
下一节我们会讨论它。

    我们可以注意到大部份重定大小或表徵图化的事是由视窗管理器做的,这
是因为它是一个公有的client,任何client均可随意重定大小,但如果所有client
都这样做,便会造成混乱,因此要这些应用程式和平共存的原则是:不要自行
重定大小,把它交给视窗管理器,也就是让使用者去决定。

    在第6章中我们会看到一个视窗管理器uwm 如何使用。



3.2 应用程式介面和工具箱

    应用程式介面决定了使用者和应用程式间交谈的风格,举例来说,如何用
指标选一个选项等,X不提供标准的应用程式介面,只提供基本的结构以便建
造它们。

    当那些具有一贯性的应用程式介面被放在一起,便叫做工具箱(toolkit),
它是基础视窗系统软体中最高最有效率的层次,较低层次的细节,被隐藏起来,
因此简化程式和维持介面的一贯风格变得容易执行,当使用者控制应用程式时
好像有一套”虚拟文法(virtul grammer)”一般,需要注意很重要的一点是,
工具箱在编译程式的时候被指定,所以一个client的应用程式介面在编译的时
候就被决定了,如果不重新编译便无法改变。

    MIT 版的X大多数的应用程式均使用标准的工具箱和一套来自MIT 的工具
箱软体构成要素,这造成你可以得到一致性的介面。除此之外,有些结构更提
供了定制的应用程式操作方法和设定它们的预设值。


3.3 其它的系统面貌

    在本节中,我们讨论将应用程式之间传递资讯所用的性质结构(property
mechanism),视窗的树状阶层组织,和X不包含在作业系统中的优点。


3.3.1 client之间的通讯 -- ”性质”

    client和server之间的通讯是藉著送出 "需求" 和接收 "事件" ,但有时
client需要和其它的client传递资讯,例如,正常的应用程式需要告诉视窗管
理器它的位置和大小,这就需要X的性质结构了。

    ”性质”是一小段资料的名称,这一小段资料存在server中且关联到一个
特定的视窗,任何client均可向server查询某一特定视窗”性质”的值。

    让我们看一个client如何把它所喜欢的表徵图名称传递给视窗管理器的范
例:client把表徵图名称存到这个视窗的WIM_ICON_NAME ”性质”去,当视窗
管理器执行表徵图化这个应用视窗时,它会去找这个应用视窗的WIM_ICON_NAME
的”性质”,而後显示”性质”中的表徵图名称。

    应用程式也可以和不是视窗管理器的其它的应用程式通讯,一个常见的例
子是在分属不同应用程式的视窗之间做剪贴(cut-and-paste) 操作,一段本文
从一个应用程式中”切下”(cut) 稍後再”贴”到另一个应用视窗,”性质”
在此被用到,”性质”依序编成”CUT_BUFFER0”,”CUT_BUFFER1”…等等,
所有的应用视窗便可藉此交换资料。

    最後一个例子是称为resources 的”性质”,它被用来定义应用程式的预
设值设定,在根视窗(root window) 中有一个名为RESOURSE_MANAGER的性质存
放著所有设定的名单,它会被所有的应用程式存取,用来做是否要执行任何设
定的依据。


3.3.2 在X中视窗的阶层性

    本节描述视窗在系统中的组织及如何建立,和对应用程式的影响。

    所有在X中的视窗都可视为一个树状结构阶层 (hierarchy)的一部份,树
的根部便是根视窗,涵盖了整个萤幕,应用视窗都是根视窗的子代(children),
上层的视窗可以拥有它自己的子视窗,图3-1 有两个应用视窗。

             ┌———————————————┐
             │   p34  fig 3.1   (???)       │
             │                              │
             │   图3-1 在萤幕上重叠的视窗   │
             └———————————————┘

    ”paint ”程式包含了一个被当做选单用的子视窗,对每一个选择又有一
个子视窗对应,相关的视窗树见图3-2 。

             ┌———————————————┐
             │   p35  fig 3.2               │
             │                              │
             │   图3-2 视窗的树状结构阶层   │
             └———————————————┘

    在X的设计理念下,制造一个视窗非常容易,你可以利用视窗来控制选项
,像选单、卷动棒(scrollbars)、控制钮(control button)等等,即使是大量
也无妨,例如像试算表中的一个cell等。这种观点从程式设计师的角度大於使
用者,但的确对使用者当他”定制”(customising) 特定的程式时有影响,在
本章以後的章节会再度提到。

    为了允许应用程式有子视窗,X提供了大量的设备程式供client程式使用,
如此不但能达成一致性,也避免了相同的需求造成了重复的工作,例如像图3-1
的下拉式选单,可以在应用程式中以一致子视窗完成,这个子视窗有它们自己
的选单选择方框(pane),和用以侦测使用者碰触滑鼠按钮的标准结构,如果没
有子视窗,复杂的程式和输入处理将无可避免。

    子视窗的位置和大小并不受父视窗的限制,子视窗可大可小,可以大过父
视窗或只占父视窗的一部份,但是它会被父视窗剪裁(clipped) ,也就是说,
子视窗所有超出父视窗的部份将会消失不见。见图3-3

             ┌———————————————┐
             │   p36  fig 3.3   (???)       │
             │                              │
             │   图3-3 受父视窗限制的子视窗 │
             └———————————————┘

    在实际的应用上,你可以将上层的视窗定义成几乎占住整个萤幕,就不必
担心子视窗有些部份会看不到了。

    另外一种方式就是把下拉式选单定义成为根视窗的子视窗,如此选单便可
以比应用视窗还大,如图3-4

             ┌————————————————┐
             │   p36  fig 3.4   (???)         │
             │                                │
             │ 图3-4 选单比用它的应用视窗还大 │
             └————————————————┘


3.3.3 X不是深植於作业系统

    不像其它大多数的系统,X并非深植(embedded)於作业系统中,而只是比
使用者层次稍高而已。更精确地说,X不需要深植於系统,虽然有些制造厂商
可能是为了效率(performance) 的理由将server和作业系统结合在一起,但不
深植於作业系统的结构有下列利益:

    .易於安装和改版,或甚至去除。这种工作不需要重新启始系统,也不会
      对其它应用程式造成干扰。

    .第三集团很容易支援加强它的功能。例如你的制造厂商提供的系统不够
      好,你可以向别人买更好或更快的版本。

    .X不会指定作业系统,因此成为一种标准,这也是第三集团发展软体的
      原动力。

    .为了发展者利益。在server上发展工作时,当程式当掉只会当掉视窗系
      统,不会造成机器的损坏或作业系统核心的破坏,没有作业系统核心码
      的程式也较易除错。


3.4 结论

    在本章中我们描述了许多X提供的使用者介面,我们介绍了你用以管理
案头的程式 -- 视窗管理器的概念,也描述了被用来做使用者和client应用程
式间交互作用的设备程式。我们介绍了用来做client间通讯的性质结构,X视
窗的阶层结构对系统的影响,最後对视窗系统不深植於作业系统的好处做一摘
要。

    本章所强调的著眼点,在於针对你每天都用到的视窗系统的部份作一整体
性的概观,了解这些将帮助你学习得更快,更能好好地运用系统。

    本书第一部份 -- 系统概观就此结束,下一个部份将告诉你如何实际使用
系统。

=====

第4章 术语和符号

    本书大部分使用的术语是在第一次碰到时再作解释,但有些术语我们认
为应该先在本章作一个介绍,此外在本章中我们介绍了一些本书使用符号的
习惯,以及本书中所有范例所使用的机器场景 (scenario).



4.1 术语

    在X中,一个视窗 (WINDOW) 是指萤幕上的一块长方形区域,它的边平
行於萤幕的边,大多数的视窗以一种颜色作为背景色 (background),而以另
一种颜色作为前景色 (foreground),例如一个典型的文字视窗,背景色为白
色,前景色 (也就是文字本身) 则为黑色.视窗可以有一个边框 (border),
通常边框的颜色和背景色不同. 有些视窗在视窗上方可能有一个标题棒
(title bar) 或控制棒 (control bar), 在某些情况下用以显示有关这个视
窗的资讯, 你可以对控制棒作某些固定的动作来管理视窗. 系统会显示一个
指标 (pointer,有时也称为游标 (cursor))在萤幕上, 当你移动滑鼠, 整个
萤幕只有一个指标在对应移动. 相对的, 萤幕上许多文字视窗拥有自己专属
的文字游标, 这些游标通常指示你输入文字的位置. 以上的术语可由图 4-1
来解释.

       ┌——————————————————————┐
       │  p. 42  图 4-1   (???)                │
       │                                            │
       │                                            │
       │                                            │
       │ 图 4 - 1 视窗的元素                        │
       └——————————————————————┘


geometry -- 位置和大小

    X用到一些几何学的术语来说明一个视窗的位置和大小, 大部份的X程
式接受一个含有geometry的命令列 (command line) 来启动 (stratup)它们
, 这个命令列说明了这个程式的视窗有多大, 以及在萤幕的哪一个位置显示
. 通常geometry的格式如下:

    宽度 x 高度 + X偏移量 + Y偏移量

    宽度和高度的单位为像素 (pixel,萤幕上的一点) 或字元 (character)
, 视应用的状况而定, 程式的说明通常会告诉你用什麽单位. 上述的式子是
说明建立一个大小为宽 x 高 的视窗, 视窗的位置为左边框距萤幕左边界 X
偏移量个像素, 上边框距萤幕上边界 Y偏移量个像素. 例如假设一个程式以
字元为视窗大小单位, 则格式

    80 x 24 + 600 + 400

的意义为: 建立一个 80 字元宽 24 字元高的视窗, 并且视窗的左边框距萤
幕左边界 600个像素, 上边框距萤幕上边界 400个像素.

    如果需要的话, 也可以只指定大小或只指定位置, 程式对未指定的部份
会使用预设值 (default value), 或给你一些提示, 视实际在系统中执行的
状况而定.


滑鼠和指标的术语:

    有一些输入装置会在执行X时在显示器上指出萤幕上你有兴趣的项目或
区域,通常为一个有数个按钮 (button) 的滑鼠 (一般为三个按钮,分别称为
左按钮, 中按钮, 右按钮).当你移动滑鼠, 系统会对应地移动萤幕上的指标.
接下来, 我们对滑鼠上的三种操作术语作一严谨的定义:

    碰触按钮 (clicking a button): 按下滑鼠的按钮随即松开, 按钮被按
        下的时间, 仅有一瞬间而已.

    按住按钮 (pressing a button): 将滑鼠的按钮按下, 且一直保持按住
        按钮的状态.

    松开按钮 (releasing a button):  将先前按住的按钮松开.

通常碰触按钮被用来指定萤幕上的一个物件, 按住按钮再松开按钮 (一般在
这期间会移动滑鼠) 往往用来移动或描绘一块区域.

    拖拽 (dragging) 一个物件: 利用指标指定一个物件, 按住按钮, 保持
    按住状态移动指标直到某处再松开按钮。做这种操作时, 系统通常有一些
    方式来表示物件被移动, 例如在拖拽一个物件的期间, 系统会将物件周
    围加上一个细线的方框.

    我们常常利用拖拽方式来改变一个物件的大小, 通常系统显示方框, 根
据你的拖拽动作改变大小, 此种方法叫作橡皮筋法 (rubber-banding). (因
为方框好像用橡皮筋做的一样.)

    在本书的图形表示法中, 我们用一个下箭头表示按钮被压住, 虚线表示
滑鼠 (指标) 的移动, 上箭头表示松开按钮, 见图 4 - 2

--
※ 转载:·BBS 荔园晨风站 bbs.szu.edu.cn·[FROM: 192.168.0.120]


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店