X Window 系統使用指南--視窗管理器基礎
前一章我們看到了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的網路能力, 以便你能盡快用到大部份的系統功能。
