前一章我们看到了X系统只提供基本的视窗功能,但是实际上系统应该需要更多更方便及容易使用的功能,在X中,这些由视窗管理器 Window manager)提供,本章告诉你什麽是视窗管理器,以及如何使用MIT core版所提供的唯一的视窗管理器 -- uwm 。
6.1 什麽是视窗管理器
我们很快的摘要说明以便让你了解视窗管理器的功能。系统最基本的部份
-- 也就是server,它只提供最基本的视窗功能,如建立视窗、在视窗中写入
文字或画图形、控制键盘和滑鼠的输入和去掉视窗等,Server它不提供使用者
介面,它只提供建立介面的基本结构。
我们把使用者介面分为两个部份 -- 管理介面和应用介面,本章讨论管理
介面,管理介面由视窗管理器控制,提供管理 "案头" 的功能,例如建立应用
视窗,在萤幕上移动它们,重定大小等等。
你也需要能够:
. 使一个原来被遮住的视窗重新显现
. 方便地启动或中止应用程式
. 更新 (refresh)萤幕
. 表徵图化 (iconify)和解除表徵图化 (de-iconify)
6.2 启动 uwm
当X被启动後,你可以在萤幕上的任何shell 视窗启动uwm ,因为视窗管
理器也只是一个普通程式而已,你可以在执行X的任何期间内启动uwm ,但通
常是在一开始时。
现在你可以先启动X,接著在xterm 视窗内输入下列命令:
uwm &
uwm 执行後会让终端机的喇叭发出哔声表示它已初始化且准备为你工作,但你
在萤幕上看不到有任何改变,执行一个ps a,你可以看到现在有一个uwm 程式
如下:
PID TT STAT TIME COMMAND
1900 co S 0:00 xinit
1901 co S 0:01 x:0
1902 co S 0:01 xterm -geometry +1+1 -n login -display unix:0 -c
1903 p1 S 0:00 -sh (csh)
1904 p1 I 0:00 uwm
1905 p1 R 0:00 ps
现在我们有一个视窗管理器了,接下来我们将利用它完成一些基本的操作。
6.3 基本视窗操作 -- uwm 的选单
uwm 有一个选单的功能,可用来管理选单,其存取的方法如下:
1. 将指标移到灰色萤幕背景的任何地方。
2. 按住滑鼠的中按钮且保持按住,一个标头为 "WindowOps" 的下拉式
选单将会出现,如图 6 - 1
┌————————————————┐
│ │
│ p59 fig 6.1 │
│ ( 合并 p60 fig 6.2) │
│ │
│ │
│ │
│图 6 - 1 uwm 的 WindowOps 选单 │
└————————————————┘
3. 继续按住按钮,上下移动指标,被指标指到的选项会以高亮度或反白
表示,当你放松按钮,表示此高亮度的选项被选择。
如果你不想选择,那就按一下滑鼠其它的钮,或者将指标移到选单的边框
外面,则选单将会消失。
现在□试选择Refresh Screen (更新萤幕) ,并且放松按钮,则萤幕闪动
一下并完全重画 (re-drawn) 。
本章剩馀的部份,将让我们了解如何利用其它的选项,满足在上一章总结
中所述我们所需的功能。
6.4 移动视窗
在萤幕上移动一个视窗步骤如下:
1. 将指标移至背景,按住滑鼠中按钮,叫出uwm 的下拉式选单。
2. 选择 "Move" 选项并松开按钮,此时游标改变成 "手指" (pointing hand)
形,见图 6 - 2
┌——————————————┐
│ │
│ p60 fig 6.3 │
│ │
│ │
│ │
│图 6 - 2 手指形游标 │
└——————————————┘
3. 将 "手指" 移动到你打算移动的视窗中,按下任何按钮,保持按住的
状态,视窗上出现了九宫格,且游标变成十字箭头 (arrow cross)形,
见图 6 - 3
┌——————————————┐
│ │
│ p60 fig 6.4 │
│ │
│ │
│ │
│图 6 - 3 十字箭头形游标 │
└——————————————┘
4. 继续保持按住按钮,移动游标,将九宫格拖拽至你想摆放视窗的新位
置。
5. 松开按钮,视窗会跳到新的位置,同时九宫格消失。
以上步骤的示意图见图6 - 4 ,现在你可以自己□试将视窗移至萤幕右下角。
┌——————————————┐
│ │
│ p61 fig 6.5 (???) │
│ │
│ │
│ │
│图 6 - 4 移动视窗示意图 │
└——————————————┘
注意:你可以移动视窗使其部份因超过萤幕边框而消失,如果纯属意外的
话,再作一次 "Move" 动作即可。
6.5 重定视窗大小
你可以在一度空间 (one dimension)或两度空间重定视窗大小,例如:你
可以只把视窗加宽,或同时将视窗变高及变窄。重定视窗大小步骤如下:
1. 叫出uwm 的下拉式选单,选择 "Resize" 选项,如同移动视窗,你的
游标变成 "手指" 形。
2. 移动游标到欲重定大小之视窗的右下角。
3. 按住滑鼠按钮,保持按住状态,有三种变化发生。
. 游标变成 "十字箭头" 形
. 九宫格出现,但不像前节和视窗一样大,它比较小。
. 出现一个长方盒,显示目前视窗的大小 (见图6 - 5)
┌——————————————┐
│ │
│ p62 fig 6.6 │
│ │
│ │
│ │
│图 6 - 5 重定视窗大小操作时,│
│ 显示视窗大小的长方盒 │
└——————————————┘
4. 移动游标,延展或挤压九宫格直到大小合乎需求。
5. 放松滑鼠按钮,视窗改变大小将和九宫格一致,同时九宫格消失。
以上步骤的示意图见图 6 - 6,你亦可用xterm 视窗练习重定大小。
┌——————————————┐
│ │
│ p63 fig 6.7 (???) │
│ │
│ │
│ │
│图 6 - 6 重定视窗大小示意图 │
└——————————————┘
6.5.1 九宫格的目的
在重定大小的操作中,九宫格具有让你预先看到重定视窗的大小,而当你
在步骤 3按下按钮时,当时游标在九宫格的位置决定了你的动作:
. 当你在九宫格的四个角的格子或最中间那一格按下按钮,你可以任意水
平或垂直改变视窗的大小。
. 当你在九宫格四边中间那一格按下按钮,你就只能在一度空间改变大小,
你只能移动视窗最接近你按下按钮的格子的那一边。
6.5.2 大小限制
那个显示目前视窗大小的长方盒,其大小的单位视情况有所不同,文字视
窗,其意义为若干行乘若干列字元 (例如xterm 通常为80x24 字元大小) ,图
形视窗,其单位则为像素 (例如xclock预设的大小为150x150 像素) 。
有些视窗会被限制外形或大小,例如xcalc 有最小尺寸的限制:它不允许
你把视窗缩小到连计算器上按钮都无法显示的地步,xterm 虽然可以任意重定
大小,但它以字元为单位,它不会允许视窗最下一行字元只出现一半的情况发
生,相对的;xclock几乎对任意大小或外形均不受限制。
6.6 建立新视窗
利用视窗管理器uwm 的 "NewWindow"选项,我们可以很容易的建立一个新
视窗,我们在本节内描述如何启动一个新的xterm ,uwm 如何帮助你启动其它
的应用程式,以及你如何控制应用视窗的起始位置和大小。
6.6.1 建立一个新的xterm 视窗
建立一个新的xterm 视窗步骤如下:
1. 移动游标到背景视窗,叫出uwm 的下拉式选单,选择 "New Window"
选项,在松开按钮的一瞬间,有三种变化发生:(不需按住滑鼠按钮)
. 游标改变成 "左上角" 形 (见图6 - 7)。
. 一个闪动的新视窗边框出现了,游标在左上角。
. 一个类似我们前节看过表示视窗大小的长方盒出现,和以前不同的
是,它比以前多了视窗的名称 (见图6 - 8)。
┌——————————————┐
│ │
│ p64 fig 6.8 │
│ │
│ │
│ │
│图6 - 7 "左上角" 形游标 │
└——————————————┘
┌———————————————┐
│ │
│ p65 fig 6.9 │
│ │
│ │
│ │
│图6 - 8 当建立新视窗时, 出现 │
│ 显示视窗名称和大小的长方盒 │
└———————————————┘
2. 移动游标使得新视窗的左上角移到你所需要的位置。
3. 碰触一下左按钮,一个新的视窗便产生了,显示视窗大小的长方盒和
闪动的边框同时消失。
你可以像使用原始xterm 视窗一样地使用这个新视窗来执行普通或X的应
用程式。
注意 1:如果你在步骤 3碰触的不是左按钮,则视窗的大小会有所不同,
特别是你碰触的如果是中按钮,则你的新视窗会小到几乎看不到
的地步,如果发生这种情况,你可以用前节重定视窗大小的方法
改善 (细节部份稍後会提及) 。
注意 2:如果你把视窗的一部份移到萤幕之外,将会使得视窗的一部份无
法看见,若你并不是故意如此,可以用选项 "Move" 改善。
6.6.2 建一个供任何应用程式使用的视窗
我们仍然可用以前的方法 -- 在xterm 视窗的shell 中输入一行命令来启
动应用程式,但是现在你有视窗管理器程式在执行,所以你可以用交谈的方式
来控制视窗的起始位置,而不需在命令列中设定geometry参数。 (事实上,uwm
也可控制视窗起始的大小,我们会在下节描述。)
举一个例子,假设我们要在萤幕的右上角启动xclock:
1. 在xterm 视窗中,输入命令列:
xclock &
就如同 "NewWindow"选项一般,你可以看到一个描述视窗大小的长
方盒,一个 "左上角" 形游标,一个和时钟同样大小的闪动边框。
2. 不要按任何钮,只要把边框拖拽到任何你想要摆放的位置。
3. 碰触左按钮,一个时钟取代了闪动边框出现。
注意:如果在步骤 3你碰触的不是左按钮,则时钟的大小会不同,但不致
於像xterm 那麽夸张。
6.6.3 指定新视窗的大小
前面提到当你建立新视窗时,若你碰触的不是左按钮,会有一些奇怪的情
况发生,事实上三个按钮各有不同的意义,你可以依需要做适当的选择:
1. 左按钮:碰触左按钮会使得:
位置:将视窗左上角的位置依目前游标的位置决定。
大小:应用程式本身原先预设的大小。
2. 中按钮:你不应该碰触中按钮,但如果你压住不放的话,你可以藉著
改变视窗的右下角来改变视窗的大小,然後松开按钮:
位置:视窗左上角的位置依你压下中按钮时游标的位置决定,右下
角则根据你放松按钮时决定,压住按钮的期间,视窗的边框
就像橡皮筋般可延展或压缩。
大小:根据松开按钮时的右下角决定。
如果应用程式指定了视窗最小的尺寸限制,则橡皮筋边框被压缩到比
最小视窗还小时会自动消失,确保你无法建立一个比最小视窗限制还
小的视窗。
注意:如果你让视窗的面积为零,会有一些奇怪的情况发生,例如你在启
动xclock时,碰触中按钮,则xclock视窗会跑到萤幕左上角,大小
为预设的大小。
3. 右按钮:碰触右按钮会使得:
位置:视窗左上角依目前游标的位置决定。
大小:视窗的宽度为预设的宽度,视窗的高度由游标的位置直到萤
幕的底边,如果大小低於应用程式预设之最小视窗限制的话,
则用预设的高度来代替。当然,这也意味著会有一部份的视
窗超出萤幕,所以无法看到。
6.6.4 更多的有关於geometry参数的设定
关於geometry参数的设定,过去我们都是用视窗左上角的位置相对於萤幕
左上角位置的方式设定,其实,我们可以用视窗的任何一个角来决定视窗位置
,先复习一下geometry的设定方式:
width x height <xpos> <ypos>
宽度 x 高度 <x位置><y位置>
<xpos> 决定了视窗水平的座标,可用下列方式表示:
+offset :表示视窗的左边位於距离萤幕左边offset个像素的位置。
-offset :表示视窗的右边位於距离萤幕右边offset个像素的位置。
<ypos> 决定了视窗垂直的座标,同样地也可用下列方式表示:
+offset :表示视窗的上边位於距离萤幕上边offset个像素的位置。
-offset :表示视窗的下边位於距离萤幕下边offset个像素的位置。
以下有几个□例:
100x100+50+60 :这是我们过去用的方式,视窗的左上角位於距离萤幕
左边50个像素,上边60个像素。
100x100-0-0 :视窗的右下角位於萤幕的右下角。
100x100-80+160 :视窗的右上角位於距离萤幕右边80个像素,萤幕上边
160 个像素。
100x100+20-40 :视窗的左下角位於距离萤幕左边20个像素,萤幕下边
40个像素。
上述例子的正负号代表了视窗的边和萤幕的边的关系,而不是偏移量的正
负号,事实上偏移量有它自己的正负号,例如:
100x100+600+-50 :视窗位於萤幕的中上方,且视窗的上半部超出萤幕。
100x100--50-+20 :视窗位於萤幕的右下角,且视窗的下边距萤幕20个像
素,视窗的右半部超出萤幕。
6.7 管理你的萤幕空间
现在你可以启动许多的应用程式,建立许多的视窗,这些视窗很可能会互
相重叠,但是你有三种方法可以用来管理你的视窗,使你更方便地存取它们:
. 把视窗缩小,利用前述的 "Resize" 选项。
. 把视窗 "堆叠(stack)"起来,你现在需要的视窗摆到堆叠最上层,其它
的放在比较下层,你可以用选单上的 "Raise" "Lower" "CircUp" 和
"CircDown"来改变堆叠次序。
. 把视窗换成非常小的视窗,称为 "表徵图(icons)",因此所占的萤幕空
间极小,但只要需要你随时可还原它们,你可以利用选单上的"NewIconify"
和"AutoIconify" 选项来办到。
6.7.1 变动堆叠中视窗的次序
视窗在萤幕上,就如同文件在你桌面上,可以互相重叠,( 如图6 - 9)
┌——————————————┐
│ │
│ p69 fig 6.10 │
│ │
│ │
│ │
│图6 - 9 相互重叠的视窗 │
└——————————————┘
为了让你容易获得你想要的视窗,uwm 允许你:
. 将一个视窗移到堆叠最上层,不管它现在在堆叠的哪个位置。
. 将一个视窗移到堆叠最下层,不管它现在在堆叠的哪个位置。
. 循环堆叠,将所有在堆叠中的视窗移动一层,将最後一层的视窗移到
堆叠另一端开头,你可以向上或向下循环。
1. 将一个视窗移到堆叠最上层 -- Raise
Raise 选项将一个视窗移到堆叠最上层,所以这个视窗应该变成全部
可见,你可以Raise 任何视窗而不管它目前在堆叠何处。Raise 一个
视窗的步骤:
1). 从选单中选取 "Raise"选项,游标变成手指状。
2). 将游标移到你想要Raise 的视窗上。
3). 碰触任意一个滑鼠按钮,视窗保持在原来的位置,但那些原来被
其它的视窗遮住的部份均会重现,其它的视窗则被盖在下面。
2. 将一个视窗移到堆叠最下层 -- Lower.
Lower 选项可将一个视窗移到堆叠的最下层,你可以Lower 任何视窗
而不管它目前在堆叠何处。Lower 一个视窗的步骤:
1). 从选单中选取 "Lower"选项,游标变成手指状。
2). 将游标移到你想要Lower 的视窗上。
3). 碰触任意一个滑鼠按钮,视窗保持在原来的位置,其它原来被它
遮住的视窗会显现出来,而它本身的部份则被这些视窗遮住。
3. 循环堆叠 -- CircUp和CircDown
CircUp和CircDown选项用来旋转堆叠内的视窗,所差别的只是它的
"方向" 而已。循环向下(circulate down)的步骤为:
从选单中选取"CircDown"选项,所有在萤幕上的视窗位置均不变,
但原来在最上层的视窗被移至最下层,所有原来被它遮住的视窗
现在变成遮住它。
CircUp和上述成对比,它把原来最下层的视窗移至最上层,遮住那些
原来遮住它的视窗。
6.7.2 表徵图化一个视窗
虽然你可以靠著Raise 或Lower 变动视窗的顺序,但有时视窗实在太多了,
为了给你自己更多的萤幕空间,你可以将那些目前不需要的视窗 "表徵图化"
(iconify) 。 "表徵图化" 的意义是把应用视窗换成一个非常小的视窗後摆在
一边,直到再度需要用它们为止。有些应用程式拥有它们特别的 "表徵图" ,
但是大部份都是让视窗管理器去建一个,uwm 的预设表徵图是一个把应用程式
名称摆在中间的灰色长方形。正常的xterm 的表徵图见图6 - 10
┌———————————————┐
│ │
│ p71 fig 6.14 │
│ │
│ │
│ │
│图6 - 10 正常的xterm 的表徵图 │
└———————————————┘
共有两种方法可以表徵图化一个视窗,第一种特别适合尚未表徵图化的视
窗,第二种适合曾经表徵图化的视窗。
1. 表徵图化一个新视窗 -- NewIconify
1). 从选单上选取"NewIconify"选项,出现 "手指状"游标。
2). 将游标移到需要表徵图化的视窗。
3). 按下滑鼠任意钮,保持按住状态,游标变成 "十字箭头" 形,且
出现一个小九宫格,这个九宫格代表未来的表徵图。
4). 保持按住按钮,将九宫格拖拽至你想要的位置。
5). 松开按钮,九宫格会被表徵图取代,原来的视窗消失。
因为NewIconify让你选择表徵图的位置,所以它适合新的视窗;当然对任
何应用视窗均可使用,特别是你想改变表徵图位置的时候。
2. 表徵图化一个 "旧" 的视窗 -- AutoIconify
AutoIconify 会将表徵图放在上一次出现的位置,如果这个视窗未曾表
徵图化过,则放在游标所在的位置。
1). 从选单上选取"AutoIconify"选项,出现 "手指状"游标。
2). 将游标移到需要表徵图化的视窗。
3). 碰触任何按钮,原来的视窗消失,表徵图出现在上一次出现的位
置,若这个视窗是第一次表徵图化,则表徵图出现在目前游标所
在的位置。
移动一个表徵图
一个表徵图就像一个视窗,因此你可以利用"Move"选项,像移动视窗一样
移动表徵图。
6.7.3 解除表徵图化 -- 将表徵图还原成一个视窗
将表徵图还原成一个正常的视窗,它的步骤和表徵图化类似,甚至在选单
上,使用相同的选项,换句话说,"AutoIconify" 和"NewIconify"这两个选项,
如果是在视窗的状况下选择,会变成表徵图,反之如果是表徵图,则会变成视
窗。
对於位置的处理也是同理可推,使用 "AutoIconify"时,当你在表徵图上
碰触按钮,原来的视窗会在原来的位置出现。如果用"NewIconify"选项,按住
按钮则会出现和原视窗大小相同的九宫格,你可以拖拽九宫格至你要摆放视窗
的位置,松开按钮则在选定的位置上出现原来的视窗。
6.8 中止应用程式视窗
uwm 选单有一个选项让你杀掉一个应用程式视窗,当你决定不再需要或是
想要去掉一个视窗时,杀掉的步骤如下:
1. 从选单上选取"KillWindow"选项,游标变成 "手指状" 。
2. 将游标移到你想要去除的视窗上。
3. 碰触一下滑鼠任何按钮,视窗消失,内含的应用程式随之中止执
行。
当视窗消失後,你可以在原来下命令的xterm 视窗看到和前一章使用xkill
後类似的讯息。
注意 1:如果你杀掉最原始的xterm 视窗,xinit 会查觉到并关闭server( 与
前一章相同)。
注意 2:如果你杀掉一个表徵图视窗,这样做会中止视窗管理器,所有的小图
形都会还原成视窗,这是合理的行为,因为只有视窗管理器才能拥有
表徵图视窗。
6.9 叫用uwm 选单的其它方式
截至目前为止,我们叫用uwm 选单唯一的方法就是将游标移到萤幕的背景
上且按住滑鼠的中按钮,但是如果一个应用视窗占用了整个萤幕,那该怎麽办?
你会因为找不到萤幕背景而无法叫用选单,以致什麽事都不能做吗?
答案很简单,有另外的办法叫用选单:
1. 同时按下META和SHIFT 键,保持按住。
2. 按住滑鼠的中按钮,uwm 选单即可出现 (你可以现在或稍後放开META
和SHIFT键)。
3. 像前几节的方法一样选择选项。
选单的操作方法和以前一样,只有一点不同:如果你把游标移出选单的边
,选单不仅是消失而已,一个标头为Preferences(喜好) 的选单出现了,你可
以利用这个选单来设定一些参数。例如键盘被按时会不会有声音(keyclick),
喇叭的音量等等。如果你并不需要设定,将游标移出选单,或者碰触滑鼠的任
一按钮即可离开选单。
6.10 摘要
在本章,你学会如何启动和使用uwm 视窗管理器:利用uwm 的选单,你可
以新建一个应用视窗、移动视窗和重定一个视窗的大小、将视窗转成表徵图或
还原、杀掉一个client应用视窗,这些功能已涵盖了大部份的应用需求。
uwm 只是许多视窗管理器中的一个而已,你可以换一个别的来使用。MIT
core 版没有提供其它的视窗管理器,但是contrib 版则包含了好几个由第三
集团所提供的视窗管理器,几乎使得MIT 版的视窗管理器成为半荒废的状态,
所以你可以选择各种不同形式的介面程式,甚至对我们前数章所提的介面程式,
一个也不用。
有二个视窗管理器特别值得一提:
twn 是一个在应用视窗上方有标题棒(title bar) 的视窗管理器,藉著碰
触或拖拽标题棒的一部份来管理视窗,介面的方式非常类似Apple 公司Macintoch
电脑,一个twn 的控制棒如图6 - 11。
┌———————————————┐
│ │
│ p74 fig 6.15 │
│ │
│ │
│ │
│图6 - 11 一个由twn 视窗管理器 │
│所建立含有控制棒的视窗 │
└———————————————┘
rtl 是一个绝不让视窗彼此重叠的视窗管理器,它会让一个视窗尽量占住
最多的萤幕空间;稍後,如果你扩张一个视窗,它会压缩邻近的视窗以挪出空
间。典型的rtl 画面如图6 - 12。
┌——————————————┐
│ │
│ p75 fig 6.16 │
│ │
│ │
│图6 - 12 由 rtl视窗管理器 │
│ 控制的萤幕 │
└——————————————┘
如果有需要,你可以使用时将视窗管理器半途切换到另一个视窗管理器,
也就是杀掉一个,启动另一个,以下的步骤可当作一个练习:建立数个视窗,
将它们表徵图化,利用前章所述PS和kill命令杀掉uwm ,或者利用uwm 选单中
的"Exit"选项也可以,你会发现所有的表徵图都消失且还原成应用视窗,但你
目前全然无法控制;如果你再启动uwm ,你又可以管理它们了,但是你必须将
那些应用视窗重新表徵图化才会变成表徵图。如果你想要换用其它的视窗管理
器程式,同样地,你可以在杀掉前一个视窗管理器後启动它。
在以後的章节,我们会更深入的讨论uwm ,告诉你那些在本章中未曾讨论
的选项功用,我们也会告诉你如何利用uwm 而不叫用它的选单,更快更方便地
直接管理视窗。
视窗管理器只决定管理介面,另一半的使用者介面为应用介面 -- 如何和
应用程式交谈和利用滑鼠或键盘控制它们。在第8章我们会以xterm 为例,看
到许多它的应用介面的面貌。但在这之前,我们先岔开来讨论X的网路能力,
以便你能尽快用到大部份的系统功能。