第6章 视窗管理器基础 -- uwm
前一章我们看到了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
宽度 x 高度
决定了视窗水平的座标,可用下列方式表示:
+offset :表示视窗的左边位於距离萤幕左边offset个像素的位置。
-offset :表示视窗的右边位於距离萤幕右边offset个像素的位置。
决定了视窗垂直的座标,同样地也可用下列方式表示:
+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 选单唯一的方法就是将游标移到萤幕的背景上且按住滑鼠的中按钮,但是如果一个应用视窗占用了整个萤幕,那该怎麽办?你会因为找不到萤幕背景而无法叫用选单,以致什麽事都不能做吗?
答案很简单,有另外的办法叫用选单: