/ / / / / /

上一篇 下一篇 回到卷宗

作者  tonyyu.bbs@sparc20.ee.cycu.edu.tw (不花心之雙子男), 信區: Linux
標題  [轉錄]最後幾篇
時間  中原電機站 (Thu Apr 30 17:42:12 1998)
轉信站: cmc!ccnews.thu!ctu-peer!news.nctu!news.nctu!news.csie.ncu!sunss105.cc.c
出  處: sparc20.ee.cycu.edu.tw

※ [本文轉錄自 tonyyu 信箱]

作者: g8578024@sunss106.cc.cycu.edu.tw (g8578024)
標題: 最後幾篇
時間: Thu Apr 30 17:41:16 1998


       Linux與X視窗系統

    介紹X的文章, 讀者們幾乎在大多數UNIX的雜誌可以常常看到, 本
系列專欄終於也要用一期的篇幅, 來湊一個熱鬧。雖然本文的介紹範圍
將局限在Linux作業系統下的X, 筆者仍期望讀者們能透過本文的內容,
獲得相當多X的基本觀念, 尤其是在應用層面上的相關知識。這些可能
是其他太熱衷介紹X的技術面的文章所忘了告訴您的。對於在臺灣商業
環境下的讀者們, 我尤其想介紹您一些對您有助益的應用軟體, 這些軟
體在Linux的X視窗下親切好用, 有很多並不輸給商業發行的應用軟體,
本文的後半便都是用來介紹這一些應用軟體中的一小部份。

    在筆者由網路上獲悉其他在美國的公司行號的使用經驗, 有不少就
直接拿執行Linux的PC來取代真正的X終端機, 更且假如您有適當的硬體
配備的話, 您的Linux PC 也可以是一部強力的網路或圖形計算工作站,
筆者不知道這樣可以省下您多少鈔票, 但假如您公司原本就配置有很多
各廠牌的X終端機或UNIX工作站的話, 則必省下不少預算。更具體來說,
您除了一部386或486電腦硬體及相關設備的支出外, 您可能就沒有其他
開銷了。在往下所介紹的的應用軟體(含Linux作業系統及X本身)您都可
以不花一毛錢就取得, 不要驚訝, 這百分之一百是真實的, 請聽筆者細
細道來。

    在我們啟動Linux主機後, 眼前所看到的使用環境正是傳統UNIX的文
字終端機環境, 這環境的操作方式是在命令行下用鍵盤下達指令。本文所
要介紹的, 是另外一種屬於現代人的操作方式--視窗界面操作方式。在
Linux上的X視窗界面與普遍使用於各廠牌UNIX工作站的X視窗操作環境
是一致的。在SLS Linux系統編號 ”x”系列十張磁片就是X視窗系統
以及其所附眾多應用軟體, 假如您公司有連上Internet網路(資策會有提
供這一服務, 其服務電話是02-7377151~2), 您就可以用ftp在NCTUCCCA.edu.tw
檔案庫的/Operating-System/Linux/SLS目錄下取得。

    在進入主題之前, 筆者先敬告讀者, 本文真正只介紹到一小層面,
為了輔助您更完整閱讀本文, 我建議您在SLS Linux環境下查看相關線上
手冊, 您可以鍵入下列指令: 〞man X〞、〞 man X386〞、〞man Xservier
〞、〞man twm〞〞man xinit〞以及〞man xview〞等等, 這些線上手冊
會提供您更完整的背景訊息, 甚至裝置X視窗時必要的指引。另外可能的
話, 有幾篇與X有關的常見問與答(FAQ)也對您有幫助, 這些FAQ可以在Usenet
news.answers及comp.answers等newsgroup找到, 或者在NCTUCCCA.edu.tw
檔案庫/USENET/FAQ/comp/windows/x目錄下也可以找到。

□ 三言兩語話X視窗
    X視窗系統(X Window System)於1984年誕生於麻省理工學院(MIT)
, 在UNIX世界裡, 常見的X、X Window或者X11R5等字眼通常都是指X視窗
而言, 對X的專家們來說, 這三個字眼尤其是指X 核心服務程式(X
Server) 而已, 而不涵括視窗管理器(Window Manager)、檔案管理器(File
Manager)、X終端機模擬器(Xterm)以及其他各式各樣X視窗應用軟體。但
是對我們來說, 我們使用者所看到的X視窗系統可以是廣泛的指以上這些
東西集合體。由於X已經被移植到各樣不同硬體、不同作業系統之下, 所
以我們實際在不同機器下可能會使用到不同品牌的X視窗系統。

    通常不同品牌的X系統, 其長相會有不同, 不過要注意的是, 這些都
是同樣是X, 起彼此間都是相容相通的, 因為X本身是一個協定, 這些不
同的X Server便是架構在共同規格之下。至於目前最新的協定是X11R5,
我們在Linux上所使用的XFree86便是X11R5視窗系統之一。 這情況與UNIX
很不一樣, 我們在市面上可以看到數十種不同版本、不同品牌的UNIX(有
些名字沒有掛上UNIX), 這些UNIX並沒有遵循單一的標準, 所以嚴格說不
同UNIX間不絕對有「相容」(這裡筆者指的是Binary相容)。

    X就好像一個保護網, 她幫我們過濾調電腦硬體以及作業系統的差異
。所有只要是X的應用軟體, 您就可以由任何同樣支援X的UNIX (包括任
意類型的超級電腦、迷你主機、工作站以及Intel PC等等機器下的UNIX)
或DOS、或其他作業系統來啟動使用。所以假如X能更快速普及開來, 那
些專門以單一的、專屬規格的產品來綁住您的電腦供應商, 再也無法重施
故技了。

□ SLS 的X視窗系統
    至於我們在SLS Linux下使用的X系統可以說是一個大拼盤, XFree86
是這拼盤的主菜, 其他還包括了Xview、InterView以及眾多的獨立應用程
式等等。XFree86乃是一套專為Intel硬體架構、加上Unix(或相容)作業系
統所構成的環境而設計的一套 X11R5視窗系統, 這系統的著名之處, 是她
的主要發展者散落在全世界各地, 這發展模式就如同Linux作業系統一樣,
都是透過Intenet而超越了時空的障礙得以統籌規劃與發展。XFree86除了有
〞免費〞的特性之外, 其所支援作業系統種類與數量之多( 如<表一>) 也
是不可思議, 也就是說, 下面所列這些作業環境下的使用者正使用著與我
們相同的X視窗系統。。

─── (表一) ────────────────────────
   UNIX作業系統:
        SVR3.2: ISC, AT&T, SCO
        SVR4.0: ESIX, Microport, Dell, UHC, Consensys, MST,
                 ISC, AT&T, NCR
        SVR4.2:  Consensys, Unixware

   相容或相似於Unix的作業系統:
        Linux
        386BSD/NetBSD/FreeBSD、
        Mach、
        Minix
───────────────────────────────

    XFree86目前(1993年九月)的版本是(XFree86 Version 1.3), 其包含
有兩套核心服務程式(X Server), 分別是支援Monochrome顯示卡的的
XF86_Mono以及SVGA的XF86_SVGA, 這兩個Server支援相當多廠牌規格的
顯示卡如<表二>所示。本文所介紹的X Window嚴格來說就是指這兩個
X Server。X Server以外的東西其實都是選擇性的, SLS Linux提供
您兩種選擇, 第一個是包括在XFree86傳統的MIT Athena的視窗界面以
及發展工具, 另一個是出自Sun公司的XView。想知道更多XFree86 X
視窗系統細節的讀者, 請用〞man XFree86〞指令來閱讀線上說明,
〞man xview〞指令則可以查看XView的細節。

   至於XView則是一套包含有支援OPEN LOOK規格使用界面以及其他
相關發展工具的軟體, 其中主要著成份乃出自美商Sun公司的OpenWindows。
OPEN LOOK是最廣為使用的兩個視窗界面的其中之一(另一個是OSF Motif),
大不同於OSF Motif的是, Sun公司將其OPEN LOOK規格以及OpenWindows
產品本身的一部份都免費貢獻出來, 這是為什麼我們在Linux上可以選擇
搭配XFree86與XView使用, 不知道這一典故的讀者就會驚訝發現在SLS
Linux主機上的X視窗系統竟然與Sun公司生產的SPARC工作站(及Solaris
PC UNIX)有相同的〞長相〞以及幾乎一模一樣的操作方式。

   額外一提, 有追隨標準或潮流習慣的讀者也可以選用OSF Motif。
Motif可能是未來X系統之使用者界面的標準的原型, 因為〞傳說〞連
Sun公司也已經放棄其OPEN LOOK而走向Motif。OSF Motif純粹是商業軟體,
以Linux的廣大名氣, 自然的也早已有Linux版本的Motif。有興趣的讀者
可以接洽Metro Link公司, 其產品其涵括Motif 視窗管理器、相關發展工
具以及使用手冊的售價是美金$199元。該公司聯絡方式如下:

        Metro Link, Inc.
        電話 (305) 970-7353
        傳真 (305) 970-7351
        電子信件 sales@metrolink.com


□ 要哪些硬體才能跑X

    要讓X視窗在您Linux主機上展現其三頭六臂的功力的話, 您得先提
供她一個舒適的環境。基本上, X視窗對硬體的要求是很敏感且嚴格的,
其中尤其以電腦的螢幕顯示卡(Video Card)為最, 您的顯示卡若不是下
列其中之一, 您多半就與X視窗無緣。您若不知道您的電腦究竟是什麼
顯示卡, 可查看該電腦的硬體參考手冊, 或者, 直接把卡拆下來看也行,
再不行的話, 您可以執行〞/usr/X386/bin/SuperProbe〞指令, 該指令
會自動偵測出您的顯示卡類別。<表二> 就是目前XFree86 所支援的螢幕
顯示卡。

─── 表二 ─────────────────────────
 Tseng ET3000, ET4000
 Western Digital/Paradise PVGA1
 Western Digital WD90C00, WD90C10, WD90C11, WD90C30, WD90C31
 Genoa GVGA
 Trident TVGA8800CS, TVGA8900B, TVGA8900C, TVGA8900CL, TVGA9000
 ATI 28800-4, 28800-5, 28800-a
 NCR 77C22, 77C22E
 Cirrus Logic CLGD5420, CLGD5422, CLGD5424, CLGD5426
 Compaq AVGA
───────────────────────────────

    以上是目前為止(XFree86 1.3)所支援的, 假如您的顯示卡不在此列,
您不妨查看其他特別為某些顯示卡所獨立發展的X Server, 在
sunsite.unc.edu檔案庫/pub/Linux/X11/X-servers目錄下就有X8514 及
S3 等Server存在, 您有需要的話不妨參考。

    重要性僅次於螢幕顯示卡的, 就是足夠的記憶空間。要擁有一個真正具
有實用價值的X系統(也就是能以夠快的速度執行應用軟體), 記憶體最好
不要少於8MB, 並且另外設定6-10MB的虛擬記憶體(大小請自行斟酌), 實
際記憶體連4MB也沒有的話, 您大概無法一親X芳澤。我建議您, 假如您記
憶體不多於8MB的話, 請詳細看下面筆者為您精心構思的〞記憶體節省
法〞一節。

    再其次您最好能知道螢幕(在工業界稱為〞電腦監視器〞)的種類, 可能
的話最好您手上有該螢幕的規格資料。至於滑鼠(Mouse), 您則必須知道
該滑鼠的種類, 最起碼您能夠知道是Serial或Bus滑鼠, 最好的話是Logitech、
Mocrosoft或PS/2等等不同品牌也要能夠分辨。


□ X Window簡易裝置指南

    我們所談的裝置, 並不是指去拿X的原始程式碼回來, 從頭進行編
譯工作。不是的, Linux環境下的X早已有人幫我們規劃的非常好, 所有
的東西多半已經是可執行碼。SLS Linux X系統的裝置程序也是非常簡
單, 我們只需下〞sysinstall -X11〞指令, 系統就會全自動幫我們裝置
完成, 我們只需要依照電腦螢幕指示, 一一的插入從編號x1到x10的磁片
即可(細節請參考前幾期有關SLS Linux系統裝置的說明)。

□ X視窗的啟動

    X視窗的啟動方法很多, 對生手來說, 兩種標準啟動法會在這裡介
紹。

    我們假設我們事先沒有做任何的X啟動檔案設定, 也就是說完全根
據SLS Linux的內定值。這時, 在Shell提示號之後鍵入〞startx〞指令會
自動啟動X系統並且進入twm視窗管理器所提供的環境, 在這時, 一個
時鐘視窗會在螢幕出現, 接著xterm終端機模擬器的視窗會跟著顯現。

    在同樣的假設下, 另外一種方法是鍵入〞openwin〞指令, 這時X
系統會被啟動, 接著一個符合於OPEN LOOK規格的視窗環境會被啟動。

    成功啟動X系統後, 接下來主要就靠滑鼠(Mouse)來使喚X系統。值
得注意的是, X Window不像MS Windows把全部選單全部佔滿螢幕呈現
您面前, 而是您點一下滑鼠, 一個選單視窗才會冒出來。例外的情況是,
假如您喜歡的話, 也可以裝置檔案處理器, 把X環境弄的與MS Windows
類似, 非常有彈性。

    但是假如不成功的話, 這就表示SLS Linux版的X內定值與您硬體
的規格不符合, 這時您就有必要進行調整的工作。細節請往下看
〞Xconfig設備檔案的調整〞一節。

    對習慣以〞startx〞啟動X系統的使用者來說, 假如您不喜歡每次
啟動X都看到一個時鐘, 或者您想換一個視窗管理器的種類的話, 您
可以動手修改/usr/X386/lib/X11/xinit/xinitrc檔案。修改該檔案時
記住一些原則, 首先, 您想一啟動X系統時就被執行的軟體一定要指定
在背景執行, 也就是指令後加一個〞&〞 符號。此外視窗管理器通常是
掛在這檔案的最後一行, 這是內定值, 這好處是離開視窗管理器時就一
併卸下整個X系統, 您不喜歡這情況的話請自行修改。另外, 一個更好
的方法是建立一個~/.xinitrc檔案(參考/usr/X386/lib/X11/xinit/
xinitrc檔案內容來設計), 之後以〞xinit〞指令啟動X, 這一個方法
也用來取代〞openwin〞與〞startx〞兩者。

    除了上面介紹的三種方法之外, 您也可以考慮用xdm (X Display
Manager)來啟動, 甚至在機器一啟動的時候就進入xdm, 這可能有幫助
系統管理, 至於細節請用〞man xdm〞參考xdm的線上手冊的說明。


□ Xconfig設備檔案的調整。

    當您依照上一段的說明操作卻無法啟動X, 您首先要檢查並修改的,
就是Xconfig這個設備初始檔案。或者您回頭查看一下您的顯示卡是否
不在名單中, 假如不是的話, 最壞的打算是換一塊卡片, 不然就放棄
跑X的念頭。

    Xconfig檔案是啟動X最重要的一個檔案, 這檔案定義了X Server
的硬體配備、字型所在路徑以及您所希望的螢幕解析度等等。所以當任
何狀況發生時, 您首先就要來查看這檔案。Xconfig檔案所在位置可以是
~/Xconfig或者是/usr/X386/lib/X11/Xconfig, 後者是內定值, 所以
您可以用〞vi /usr/X386/bin/X11/Xconfig〞指令(或者任何您最熟悉
的文字編輯器都行)來修改該檔案。

    調整Xconfig時您會遇到的問題可能很多, 在您真正動手之前, 筆者
建議您多讀幾遍Linux FAQ (〞常見問與答〞)檔案, 該FAQ的最後面有很
多裝置X時常碰到的疑難及解答。您鍵入〞menu〞指令就可以閱讀線上
Linux FAQ。另外特別要一提的是, XFree86本身附有相當多的說明文件,
比方在/usr/X386/lib/X11/doc目錄下有一個vga.dbase檔案, 該檔案是
一個Xconfig資料庫記錄著各類型顯示卡以及螢幕的Xconfig範本, 同目
錄下一個video.tutorial則解釋了螢幕以及顯示卡的一些技術細節, 還
有/usr/X386/lib/X11/etc目錄下也有很多說明文件, 這些都可以幫助您
設定一個正確的Xconfig檔案。假如這些還不夠的話, Linux的線上使用
手冊則您不可以錯過, 請用〞man Xserver〞、〞man X〞、〞man
X386keybd〞等等指令查看。

    底下就是筆者的設定, 這設定外加了中文字型路徑, 指定滑鼠種類
為Microsoft, 滑鼠裝置在/dev/mouse埠, /dev/mouse連到/dev/ttyS0。
vga256指定使用VGA彩色Server, 其下的Modes 欄指定螢幕解析度為
640x480, Chipset指定我的顯示卡為ET4000, 這之後最重要的一欄是
ModeDB, 這一定要與先前的Modes吻合(筆者這設定基本上就是SLS Linux
X系統的內定值)。

─── 表三: /usr/X386/lib/X11/Xconfig檔案 ─────────
 RGBPath         "/usr/X386/lib/X11/rgb"
 FontPath        "/usr/X386/lib/X11/fonts/chinese/"
 FontPath        "/usr/X386/lib/X11/fonts/misc/"
 FontPath        "/usr/X386/lib/X11/fonts/Type1/"
 FontPath        "/usr/X386/lib/X11/fonts/Speedo/"
 FontPath        "/usr/X386/lib/X11/fonts/75dpi/"

#〞#〞符號起頭者表示為註解行, X Server會忽略這一行
# 上面幾行為相關字型, 您可以不修改

 Keyboard
   AutoRepeat 500 5
   ServerNumLock

# 下面指定滑鼠的種類, 較常見的滑鼠有Microsoft、MouseSystems
# 、MMSeries、Logitech、MouseMan、Busmouse及PS/2等等。
# 另外您還需注意 /dev/mouse有否正確的link到您的滑鼠埠。

 Microsoft       "/dev/mouse"
   SampleRate    150
   Emulate3Buttons

# 底下是最重要的部份
 vga256                     # vga256是指定彩色vga Server
     Virtual       1024 1024
     ViewPort      0 0
     Modes  "640x480"       # 指定螢幕解析度640x480
     Chipset "et4000"       # 指定顯示卡種類
     Displaysize     1024 768
     screenno        0
     Videoram        1024
     Clocks 25 28 32 36 40 48 50 65
     ModeDB
       "640x480"    32    640  664  704  832    480  489  492  520
# 最後一行把之前的〞640x480〞 進行正式的定義

───────────────────────────────





□ 前景、背景、多工

   在多工的環境下, 前景與背景是我們使用者有必要熟知的觀念, 因為
這會具體的影響我們是否能流暢的用滑鼠來指揮X系統。

    所謂的前景, 在傳統文字終端機模式下全螢幕操作時, 能接受我們從
鍵盤輸入指令的那一個畫面, 就可以說是前景, 此外其他的工作(job)便
都算是背景工作。Linux以及UNIX都允許我們一次進行多種工作, 但無論
如何在前景的工作就只能有一個。 我們可以隨時使用 Ctrl-Z 鍵, 把在
前景的工作調到背景去, 或者把背景工作的其中之一調到前景來, fg/bg
指令便是用來執行前後景工作的切換。

    這道理用在X視窗這樣的圖形視窗環境也有些類似, 前景工作同樣都
只能有一個, 因為我們只希望螢幕上的眾多框框(也就是視窗)中, 只有一
個立正垂聽我們透過滑鼠的指揮, 這一個接受指揮的視窗就是前景工作。
更具體的說, 您滑鼠所停住的所在視窗就是前景。有這觀念後, 即使您螢
幕上堆疊的或並陳著任意數量的工作視窗, 您也能輕易駕馭。

    至於要新開工作室窗時, 您把滑鼠指標移往螢幕上沒被任何框框佔住
的的區域, 按一下滑鼠的左(或右)鍵, 螢幕就會冒出一個選單, 您可以在
這選單上選擇您新的工作。至於如何調用在背景的工作呢? 由於這些在背
景的工作有些可能已經完全被覆蓋住了, 這時您就比較不方便調到前景來,
至於那些沒有完全被蓋住的框框, 您只要移動滑鼠的箭頭到某一個框框的
框緣, 輕輕在滑鼠左鍵按一下, 這一個新的框框就會全部呈現出來且蓋住
其他的框框, 這便是X視窗環境下把背景的工作調到前景來的操作。

   上面的敘述只是一個大體狀況, 實際情況會因您所使用不同視窗管理
器而略有不同, 您大抵多操作一會就能熟悉了。其他更具體的細節您可以
在線上手冊找到, 請參考〞man olwm〞、〞man twm〞或〞man fvwm〞等等
指令。


□ 視窗管理程式的選用

    對一般使用者來說, 我們所看到的X系統其實只是X視窗管理器, 而
不是X核心服務系統(X Server)本身, 這是因為我們實際上是透過視窗
管理器來取得取得X的服務。換個說法, 是視窗管理器提供我們一個圖形
操作環境, 所以說, X系統是否親切好用, 主要就取決於視窗管理器。

    對於不熟悉X系統操作的朋友來說, 選用olwm(或者說openwin)是
很恰當的, 照筆者感覺, openwin的佈局及操作方式對新手較有幫助,
可是它記憶體的消耗量大於twm很多。假如您的記憶體很緊的話, 不
妨選用傳統X11 twm。

   另外筆者更推薦您使用fvwm視窗管理器, fvwm最大的好處是比twm
節省1/3到 1/2的記憶體, 她也提供隨時切換到任何其他視窗管理器
的功能, 而無須離開X。fvwm不屬於SLS Linux的一部份, 您可以在
sunsite.unc.edu檔案庫/pub/Linux/X11/window-managers下取得。


□ 記憶體節省法
    Linux PC如果想要有和工作站電腦相當的生產力, 除了一個強悍的
心臟(最好是486DX以上之CPU)之外, 記憶體的多寡可能是另一個主要取
決因素。這是因為在圖形的世界裡, 應用軟體對記憶體的需求尤其強勁
。

    您想讓您的X系統飛起來的話, 16MB的記憶體跑不掉, 並且要設定
幾個MB的虛擬記憶體。萬一您的實際記憶空間少於8MB, 則您就得額外
的費些心, 設法讓每一個記憶空間都用在刀口上。

    以下一些建議不保證絕對有效, 僅供參考。

    0. 減少虛擬終端機的數量。照內定值, SLS Linux有六個虛擬終端機,
       您不妨改為兩個或一個, 照筆者的測試, 從六個減成兩個約可節省
       330K的記憶體, 這不算少。修改方式是改/etc/inittab內容的
       〞id:6:initdefault〞 一行, 將6改成2。重新開機後就生效。

    1. 不要用olvm(openwin)或twm(startx), 您可以改用fvwm, 如此有
       可能節省您200-450k的記憶體。
    2. 不要使用xterm, 改用rxvt, 這樣做可以節省您200-400之間的記憶體。
       rxvt可以在sunsite.unc.edu:/pub/Linux/X11/rxvt-1.3.tar.z取得。

    3. 使用單色X Server就好, 這至少可以節省100K。至於設定方法是
       ”ln -sf /usr/X386/bin/XF86_Mono /usr/X386/bin/X, 並在Xconfig
       配備檔案有vga2段落(內定值就有)。
    4. 重新編譯X Server。XFree86的X Server是設計理念為所有類型顯
       示卡都能通用, 可想而知, 我們是可以去掉所有無關的Driver, 只
       留下我們真正需要的部份, 再重新編譯。作法是:
       cd /usr/X386/lib/Server
       vi site.def 修改這檔案, 該檔案定義了很多的顯示卡的Driver,
                   您可以將之刪除, 只留下您實際有的一個。

       ./mkmf;make 重新編譯
       mv ./XF86* /usr/X386/bin 用新編譯出的Server取代舊了

    5. 重新編譯Linux系統核心啟動程式(將您沒用到的Drivers全部拿掉)
       請參考前一期的〞Linux簡易系統管理〞。

    6. 不要使用bash, 改內定Shell為sh。以兩個虛擬終端機來說, 至少
       可以省下100K。


    以上七個建議可以同時併用, 也可以獨立使用。假如您把系統的所有
內定值依照上面建議修改, 可能至少幫您省下1到2MB以上的記憶空間。


□ X視窗與虛擬文字終端機之間的切換

    當我們進入X的世界後, 可否有辦法同時也擁有文字終端機呢?  答案
當然是可以的。在前面一節中, 筆者已經建議您只保留兩個虛擬終端機,
這樣子設定, 您可以同時有一個X視窗圖形操作環境及一個或兩個文字終
端機。

    在這裡有一個觀念您有必要知道的是, 當您由文字終端機啟動X時,
X會佔用第一個未被使用的虛擬終端機, 以此例來說, 第一及第二終端機
都是文字終端機, 第三則為X所用。

    更具體來說, 假如您在第一終端機鍵入〞startx &〞, 則螢幕立刻
變為圖形畫面, 這畫面就自動成為第三終端機的畫面。您這時想暫時由X
(此時為第三終端機) 回到第一終端機 (文字終端機)的話, 同時按下左
邊<Ctrl>+<Alt>+<F1>三個鍵即可, 您想再跳回到X的話, 按下左邊
<Ctrl>+<Alt>+<F3>三個鍵即可。

    這個操作非常簡單, 但是與原本單純在文字終端機下的切換方法有
些不同, 文字終端機下的切換只要按<Alt>及<F?>功能鍵即可。


    往下的篇幅中, 筆者就摘要介紹一些相當值得推薦的應用軟體, 也
許透過這些軟體的介紹, 能有助於您了解X, 以及幫您判斷SLS Linux
系統下眾多的X應用程式能否成為您電腦應用的解決方案之一。


□ X檔案管理器(X File Manager)

    對Linux或UNIX老手來說, X檔案管理器也許沒有派上用場, 可是對
新手來說, X檔案管理器 卻可能是個救星。我們或許可以說, 一個給多
人使用的Linux+X系統, 必須要有一個好的X檔案管理器才有意義。

    在傳統的文字終端機上, 有關檔案系統的操作必須一一透過鍵盤來鍵入
正確指令, 在X視窗下, 我們當然也可以維持這一個習慣, 可是對一個
全然新手來說, 假如可以點兩下滑鼠鍵就自動執行cd、rm、echo、mkdir
等等就很理想。又比方說, 我們把一個檔案往一個垃圾桶狀的圖樣一拉, 就
自動刪除該檔, 這情況真的是很美好。一個好的檔案管理系統做的就是這樣
的工作。

    是的, 一個好的X檔案管理器可以真正免除您以往不熟係操作指令
的頭痛。遺憾的是, SLS Linux並沒附有X檔案管理器程式, 您必須自
行到sunsite.unc.edu:/pub/Linux/X11/xutils/下取得, 您可以在這裡
發現幾支相當好用的X檔案管理器, 像xfm、xdesktop、xfilemanager
等等。

    通常我們設定由視窗管理器下啟動X檔案管理器, 這樣子新手們可
以很方便的用滑鼠來啟動X管理器進行檔案系統的操作, 有關設定的方法
, 對twm來說, 修改/usr/bin/X386/lib/X11/twm/system.twmrc, 假如是
使用fvwm視窗管理器, 則是/usr/bin/X386/lib/X11/fvwm/system.twmrc
, 若是使用openwin (olvwm或olwm), 修改/usr/openwin/lib下的選單檔
案即可。另外一個啟動方法也很簡單, 我們直接在X終端機下鍵入該X檔
案管理器的命令名稱即可, 比方像〞xdesktop &〞或〞xfm &〞等等。

□   X終端機模擬器

    X終端機模擬器是用來連線進入遠端(Remote)或自己端(Local)的 X
Server的軟體, 其功能就如同一台真正的X圖形終端機一樣, 之後們可以
透過命令來進行操作。我們在視窗管理器下可以開任意個X終端機模擬視
窗, 每一個視窗可以連到不同的主機系統去, 這時每一個視窗就像是一個
獨立的X終端機。

    SLS Linux作業系統下有只有一個X終端機模擬器--Xterm, 而沒有
Rxvt(筆者強烈推薦使用) 以及中文X模擬終端機(CXterm), 可以上
Internet網路的讀者, 可以用ftp到sunsite.unc.edu:/pub/Linux/X11/xutils/
下取得Rxvt, CXterm則可以在位於臺灣大學的earth.csie.ntu.edu.tw:
/pub/Linux下取得, 這一個CXterm版本已經是可執行檔, 無須再從新編譯。

    這裡最值得一提的當然是CXterm, CXterm的存在, 提供了我們一個
中文的操作環境, 雖然網路上可取得的大多數軟體, 仍然無法藉由CXterm
來與中文相容, 這是可惜之處, 不過事情也漸漸的在改變, 以文字編輯器
來說, 目前vi以及emacs都有能與CXterm相匹配的中文版。在往下介紹的軟
體中, 經筆者測試結果, 絕大部分仍無法不修改的情況下與CXterm匹配使
用。


□  文字編輯器

    傳統上UNIX比較缺少親切好用、不需花很多時間學習、以及不須記憶指
令就可以流利使用的文字編輯器, 這現象對於那些能夠流利使用DOS Qedit
編輯器的朋友來說, 感受會更強烈些。在SLS Linux環境下我們有joe(操作
上類似於Wordstar), 它提供有操作選單減少您記憶指令之苦。可是joe就算
好了嗎?

    在筆者看來, 好的文字編輯器的操作方式應該要能與使用者的直覺產生
共鳴, 它讓我們能夠專注在文件的輸入本身, 而當我們要在文件中進行剪貼
、搜尋、存取等操作動作時, 也能夠直接在螢幕上一眼就看出如何來做--
這就是直覺, 用以上來當標準的話, 我知道DOS Wordperfect一定是不及格
, 但是底下幾個文字編輯器以及文書處理系統似乎滿接近的。

    SLS Linux有兩個相當好用的文字編輯器 一個是xedit, 另一個textedit
。這兩支軟體都提供有畫面選單, 基本剪貼、搜尋及存取的操作您在螢幕上
就可以一目了然, 或者這樣說, 所有輸入的動作您都使用鍵盤, 操作控制動
作則使用滑鼠。至於這兩之軟體的啟動方式有很多種, 您可以進入Xterm後
鍵入〞xedit &〞或〞textedit &〞進入這兩支軟體, 您也可以直接由視窗
管理器啟動, 作法是依照我前面的介紹在各視窗定義檔案加入這兩個軟體。
以上這兩種啟動方法同樣都適用於下面介紹的其他軟體。另外一種啟動方式
是透過檔案管理器, 您可以透過視窗管理器的設定 (通常是調整
~/.Xdefaults檔案), 之後用滑鼠點兩下就可以直接用這編輯器編輯那個被
”點”到的檔案。另外仍需要一提的是, 照筆者的測試, 這兩個軟體都無法
與CXterm配合, 所以Linux環境下中文檔案的編輯無法用這兩支軟體來進行。


□ 文書處裡系統
    Linux+X環境下的文書處裡系統是最值得一提, 您可以發現真正〞立可
見〞(What you see is what you get)的軟體(Wordpect 5.1仍不算是), 功
能上更勝過像Wordperfect這類商業性文書處裡器很多。

    首先是InterViews的doc。根據doc的線上手冊介紹(man doc), doc是一
個頗適合用於科技報告文件的一個文書工具。doc提供一個全彩色環境, 您
可以輕易編輯一個彩色版面的文件, 常用的剪貼、搜尋功能都有, 字型的大
小以及種類您從螢幕選單上就可以非常準確的選擇 (Wordperfect無此功能),
當然插入圖形以及表格的功能也都有。另外值得一提的是, doc的檔案格式
採用LaTex文書排版系統類似的格式。doc 本身除了是一個相當好的文書處
理器外, 它非常適合用來處裡包含有數學、工程、物理及化學等等領域的
文件報告, 這類報告的特色是包含有文字以及各式各樣符號, 假如您剛好
從事這一些領域, 您會訝異doc的存在。


    Andrew的ez則不光是一個文書處裡系統, 她已經是一個多媒體編輯
器, 筆者強烈推薦您使用Andrew ez。有關ez的介紹我在後面Andrew一節
還有提到一些, 等不及的讀者可以用〞/usr/andrews/bin/help ez〞指令
查閱ez線上手冊的介紹。

    以上文字編輯器與文書處理系統各介紹兩種, 其中除了Andrew ez需
要額外上Internet來拿外, 其餘都已經包含SLS Linux系統內。在筆者管
理的Linux主機系統下, 使用者只要按下滑鼠的右邊鍵不放, 就會有一個
如下的選單冒出來, 這時移動滑鼠就可以隨時選用其中之一來進行文字
編輯工作。

              ┌─────────┐
              │    Editors       │
              │__________________│
              │  InterViewx doc  │
              │    Andrew ez     │
              │    Textedit      │
              │      Xedit       │
              │                  │
              └─────────┘


□  試算表
    SLS Linux附有兩個商業財務試算表系統, 一個叫sc (Spreadsheet
calculator), 這軟體專門為一般文字終端機模態下跑, 另一個Xspread
則真正是X的應用軟體。這兩個其實都可以在X下跑, sc 的長相以及操作方
式頗類似於Lotus 1-2-3, 它的選單與命令切換鍵都同樣是〞/〞鍵。sc
在Xterm下啟動, 指令是〞sc -n〞。您要參考sc 的線上手使用手冊, 可
以隨時鍵入〞man sc〞指令, sc 還提供您簡易線上學習程式, 有興趣的
讀者可以鍵入〞sc /usr/local/lib/tutorial.sc〞指令。

   真正屬於X應用程式的Xspread其操作方式就更簡單了, 當我們進行
商業報表資料輸入時, 我們可以隨時用方向鍵或滑鼠來改變輸入格的位置,
當要變換成命令操作時, 隨時在滑鼠右側鍵點一下, 或者是按〞/〞(與
Lotus 1-2-3一樣), 這時選單就會自動出現, 在選單下的操作可以用滑
鼠也同以用方向鍵。Xspread也提供好幾種統計圖表, 方便我們將報表上
的數字轉成彩色圖表。

   另外與此相關的有一個線上機算機, 您隨時可以〞xcalc〞指令叫用。

□ 電子遊戲
   SLS Linux的X系統附有十幾個遊戲, 包括俄羅斯方塊以及中國麻將等
等。且您無須費心額外設定, 照內定值, 在您任何種類的視窗管理器下您
都可以直接啟動電子遊戲。

□ Ghostview
    目前相當多的科技報告、流通電子文件多半會有Postscript形式存在
的版本, 假如我們有支援Postscript的雷射印表機, 這時便可以把這類文
件送到Postscript印表機, 得到一份印刷精美的文件。可是假如我們沒有
這類印表機呢? 這時Ghostview便可幫我們大忙。Ghostview可以用來列印
Postscript檔案, 或者直接在螢幕上瀏覽。Ghostview可以在xterm下用
〞ghostview〞命令啟動, 或者其他上文介紹過的方法也行。

    SLS Linux系統內有GNU Ghostview/Ghostscript組合, 這是相當重要
且先進的工具, 讀者們能夠透過Linux 而學到用到這一工具可能會受用很大,
因為現今用高階電子排版系統(像TeX/LaTex/LamTeX/Lout等等)以及繪圖
設計軟體的輸出成品多半都可以轉成Postscript檔案, 之後很方便再進行其它
輾轉處裡。Postscript可以算是一項高階列印的標準, 而剛提到的這些排
版系統不久可能漸漸會普及到臺灣去。額外一提, SLS Linux附有TeX及
LeTeX兩套電子排版器。另外, 我記得一個中文LaTeX也可以在ifcss.org
/software/tex/cc2tex-1.3.tar.Z取得, 該軟體由新加坡Natural University
of Singapore大學所發展。


□  idraw 繪圖器(InterViews Drawing Editor)

    如同剛剛介紹的InterViews doc文書處裡器一樣, idraw也是史丹佛
大學InterViews軟體中的一項。依筆者的偏見, idraw是一套相當傑
出的圖文編輯系統, 螢幕上的文字、圖形、前背景的顏色都是立可見
(WYSIWYG), 當然基本的剪貼、放大縮小、圖形插入、旋轉、版面調整
(Alignment)等功能也齊全, 更重要的是, idraw的輸出檔案可以是
Postscript格式。

□  workman -- CD Player
    SLS Linux的X系統也包含有這樣一個CD-ROM應用軟體, 筆者自己沒
有CD-ROM drive, 所有無法測試這一個音樂CD的播放功能, 或許讀者們
有電腦CD-ROM drive的話, 拿一張普通音樂CD插入看看, 很可能您一邊
操作電腦, 還一邊用該部電腦演奏音樂 (讀者不要忘記Linux是一套多
工作業系統)。


□  卡內基美濃大學的Andrew計畫
    Andrew Toolkit (ATK)也是X的應用軟體, ATK 是一個物件導向式
的整體發展工具, 有幸的是, 這一個月(1993九月)終於有Michael Oreilly
(oreillym@tartarus.uwa.edu.au)把它移植到Linux。目前ATK不是SLS
的一部份, 您想要取得它的話, 可以在sunsite.unc.edu:/pub/Linux/X11
/andrew目錄下取得。

    筆者將ATK所附相關的應用軟體的一部份簡述如下:

      messages -- 多媒體電子郵件系統
      ez --       立可見(WYSIWYG)多媒體編輯器
      raster --   數位圖形編輯器
      eq --       方程式符號編輯器
      fad --      動態線條編輯器
      table --    簡易財務試算表
      bush --     目錄檔案瀏覽器
      zip --      階層式繪圖器
      chart --    圖表產生器
      ez2ascii -- ez -> ascii 檔案轉換器

    以上的應用軟體的使用說明可以在ATK的線上說明找到, 值得一提的
是ATK的線上文件獨樹一格, 而沒有用傳統UNIX的〞man〞, 有興趣的讀者
可以用/usr/andrew/bin/help指令瀏覽其線上文件。

□ 結論

    最後, 盼望讀者們因本文而獲益, 我暫時在此處停筆, 有任何疑問、建
議或經驗分享的讀者, 歡迎您寫信到下面地址。筆者無法保證能回覆所有
的信件 :-)  來信中英文皆可, 是中文的話, 請先編碼(uuencode)處裡。
我們下回見。

         Internet: t90yuan@mp.cs.niu.edu
         BITNET:   a10ryt1@niu.bitnet
         Fidonet Netmail:  Ruey Yuan Tzeng at 1:11/70


  *                                                             *
  *  謝謝您讀我, 我是我的主人曾瑞源先生吃少睡少一字一字寫出來   *
  *  的, 我的著作權也就是我的主人曾瑞源 (t90yuan@mp.cs.niu.edu, *
  *  地址: 416 College Ave, DeKalb, IL 60115, USA) 所有, 我知   *
  *  道他寫的很辛苦, 所以我在這裡告訴您, 假如您覺得讀完我後受   *
  *  益很多, 請給他一個回饋, 那就是---尊重我的著作權, 請看以下  *
  *  著作權聲明:                                               *
  *                                                             *
  *  任何個人都可未經授權自行列印閱讀, 這裡「個人」指任何人,    *
  * 「自行列印」指的是非刪改作者原作情況下, 自行由電腦印表機    *
  *  列印。本著作權規範不限制您列印數量, 但凡商業性出版使用、   *
  *  轉排版印刷都不被允許。                                     *
  *                                                             *
  *  關於本著作物(電子書)的轉發行規定, 您被鼓勵將之擺放在任何   *
  *  Internet FTP檔案庫上、或者任何聯盟的PC BBS站臺, 作者歡迎   *
  *  並感激您願意如此做, 因為這樣做受益的朋友必然會更多。最後,  *
  *  本版權聲明是本著作的一部份, 任何將本聲明與本著作分離的動   *
  *  作已經侵權並違法。其它未定事宜, 或您認為本版權聲明有不合   *
  *  時宜之處, 請聯絡作者。我再次感謝您讀我, 再見。             *
  *                                                             *

--------------586E36D9105D
Content-Type: text/plain; charset=us-ascii; name="LinuxHardware.TXT"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline; filename="LinuxHardware.TXT"


                     LINUX HARDWARE COMPATIBILITY HOWTO
                     ==================================
                                       
   Last updated: December 6, 1994
   
   Welcome to the Linux Hardware Compatibility HOWTO. This file will
   hopefully list most of the hardwares supported by Linux and help you
   locate the necessary drivers. If you know of any Linux hardware
   (in)compatibilities not listed here please let me know. Thanks.
   
   Sections marked =others= list hardwares with alpha or beta drivers in
   varying degrees of usability or other drivers that aren't included in
   standard kernels. Also note that some drivers only exist in alpha
   kernels, so if you see something listed as supported but isn't in your
   version of the Linux kernel, upgrade. For driver availability, check
   the Linux Software Map, follow the pointers in here, or check the html
   version of this file at <http://ksc.au.ac.th:8000/hardware.html>.

   [Hmm, my net provider is still having problems so the page might be
   unreachable at times. You would think anyone can get a system in working
   order in three months. And I'm stuck with them too, not much competition
   for Internet providers here. Grumble.]
   
   Well, due to all the requests I got all the locations and filenames
   are now listed out. Some of the names can get pretty long so the sites
   are coded as follows:
     * [1] - sunsite.unc.edu
     * [2] - tsx-11.mit.edu
       
   Comments, additions, changes, etc., send mail or find me on irc.
   FRiC <frac@ksc.au.ac.th>
   
     _________________________________________________________________
   
    1. Computers/Motherboards/BIOS
    2. Laptops
    3. CPU/FPU
    4. Video cards
    5. Controllers (hard drive)
    6. Controllers (SCSI)
    7. Controllers (I/O)
    8. Controllers (multiport)
    9. Network adapters
   10. Sound cards
   11. Hard drives
   12. Tape drives
   13. CD-ROM drives
   14. Optical/WORM/CD-R/Floptical/Removable drives
   15. Mice
   16. Modems
   17. Printers/Plotters
   18. Scanners
   19. Others
   20. Incompatibilities
   21. Acknowledgments
       
     _________________________________________________________________
   
1. Computers/Motherboards/BIOS

   ISA, VLB, EISA, PCI (but read the PCI HOWTO)
   
   PS/2 and Microchannel (MCA) is not supported in the standard kernel.
   ALPHA test PS/2 MCA kernels are available but not yet recommended
   for beginners or serious use.
   
     _________________________________________________________________
   
2. Laptops

   Some laptops have unusual video adapters or power management, it is
   not uncommon to be unable to use the power management. 2.88 meg floppy
   drives are supported.
   
   PCMCIA drivers currently support Databook TCIC/2, Intel 82365SL,
   Cirrus PD67xx, and Vadem VG-468 chipsets.
   
   Adrian Clark maintains a web page with detailed information on running
   Linux on IBM ThinkPads.
   
     * APM
       [2] /pub/linux/packages/laptops/apm/
     * PCMCIA
       ftp://cb-iris.stanford.edu/pub/pcmcia/
     * non-blinking cursor
       [1] /pub/Linux/Incoming/noblink-1.4.tar.gz
     * power savings (WD7600 chipset)
       [1] /pub/Linux/system/Misc/low-level/pwrm-1.0.tar.Z
       
     _________________________________________________________________
   
3. CPU/FPU

   Intel/AMD/Cyrix 386SX/DX/SL/DXL/SLC, 486SX/DX/SL/SX2/DX2/DX4, Pentium.
   Basically all 386 or better processors will work. Linux has built-in
   FPU emulation if you don't have a math coprocessor.
   
   A few very early AMD 486DX's hang in some special situations. All
   current chips should be okay and getting a chip swap for old CPU's
   should not be a problem.
   
   ULSI Math*Co series has a bug in the FSAVE and FRSTOR instructions
   that causes problems with all protected mode operating systems. Some
   older IIT and Cyrix chips may also have this problem.
   
   There is a patch to enable cache and a patch for software cache
   control for Cyrix processors.
   
     _________________________________________________________________
   
4. Video cards

   Linux will work with all video cards in text mode, VGA cards not
   listed below probably will still work with mono VGA and/or standard
   VGA drivers.
   
   If you're looking into buying a cheap video card to run X, keep in
   mind that accelerated cards (ATI, S3) are MUCH faster than
   unaccelerated or partially accelerated (Cirrus, WD) cards. S3 801
   (ISA) and 805 (VLB) based cards and ATI Graphics Wonder (Mach32) are
   good low-end accelerated cards.
   
   Historically Diamond video cards were not supported by XFree86.
   However, as of September 27, 1994, Diamond has verbally agreed to
   provide The XFree86 Project, Inc. with detailed information about
   Diamond products.
   
   32 bit color means 24 bit color aligned on 32 bit boundaries. Modes
   with 24 bit packed pixels are not supported, so cards that can display
   24 bit color in other OS's may not able to do this in X. These cards
   include Mach32, Cirrus 542x, S3 801/805, ET4000, and others.
   
  SVGALIB
     * VGA
     * EGA
     * ATI Mach32
     * Cirrus 542x
     * OAK OTI-037/67/77/87
     * Trident TVGA8900/9000
     * Tseng ET3000/ET4000/W32
       
  XFREE86 3.1
  
   Accelerated support (8 bpp unless noted)
          + S3 928, Bt485 RAMDAC, ICD2061A Clockchip
            #9 GXE Level 10/11/12
          + S3 928, Ti3020 RAMDAC, ICD2061A Clockchip
            #9 GXE Level 14/16
          + S3 864, AT&T 20C498 or STG1700 RAMDAC, ICD2061A or ICS9161
            Clockchip (16/32 bpp)
            ELSA Winner 1000 PRO VLB/PCI
          + S3 864, STG1700 RAMDAC, ICD2061A Clockchip (16/32? bpp)
            Actix GE 64 VLB
          + S3 864, 20C498 RAMDAC, ICS2595 Clockchip (16 bpp)
            SPEA Mirage P64 DRAM
          + S3 964, AT&T 20C505 RAMDAC, ICD2061A Clockchip (16/32 bpp)
            Miro Crystal 20SV PCI
          + S3 964, Bt485 RAMDAC, ICD2061A Clockchip (16/32 bpp)
            Diamond Stealth 64
          + S3 964, Ti3020 RAMDAC, ICD2061A Clockchip
            ELSA Winner 2000 PRO PCI
          + S3 964, Ti3025 RAMDAC, Ti3025 Clockchip (16/32 bpp)
            #9 GXE64 Pro VLB/PCI
     * Tseng ET4000/W32/W32i/W32p
     * Weitek P9000 (16/32 bpp)
          + Diamond Viper VLB/PCI
          + Orchid P9000
     * Western Digital WD90C31/33
       
   Unaccelerated
     * ATI VGA Wonder, 18800*, 28800*, 68800*, 88800 (Mach64)
     * Avance Logic AL2101
     * Cirrus Logic 6420
     * Compaq AVGA
     * Genoa GVGA
     * MCGA (320x200)
     * MX MX68000/MX68010
     * NCR 77C22, 77C22E, 77C22E+
     * OAK OTI-067, OTI-077
     * Trident TVGA8800, TVGA8900, TVGA9xxx (not very fast)
     * Tseng ET3000, ET4000AX
     * VGA (standard VGA, 4 bit, slow)
     * Video 7 / Headland Technologies HT216-32
     * Western Digital/Paradise PVGA1, WD90C00/10/11/24/30/31/33
       
   Monochrome
     * Hercules mono
     * Hyundai HGC-1280
     * Sigma LaserView PLUS
     * VGA mono
       
   =others=
     * Chips & Technologies
       [1] /pub/Linux/X11/X-servers/chips-3.1.tar.gz
       
   Work in progress
     * ATI Mach64 accelerated support
     * Compaq QVision
     * Number Nine Imagine 128
       
       No, I do not know when support for these cards will be finished,
       please don't ask me. If you want support for these cards now get
       Accelerated-X.
       
  OTHER X SERVERS
  
   Commercial X servers may provide support for cards not supported by
   XFree86, and might give better performances. Only cards not supported
   by XFree86 are listed here. Contact the vendors directly or check the
   Commercial HOWTO for more info.
   
   Accelerated-X ($199, X Inside, Inc., info@xinside.com)
   
     * ATI Mach64
     * Compaq QVision 2000
     * Matrox MGA-I, MGA-II
     * Number Nine I-128
       
       16 bit support for ATI Mach32, ATI Mach 64, Cirrus 542x/543x, IBM
       XGA, IIT AGX-014/015, Matrox MGA, #9 I-128, Oak OTI-077/087, S3
       cards, ET4000, ET4000/W32 series, Weitek P9000, WD90C30/31
       
       32 bit support for ATI Mach64, Cirrus 5434, Matrox MGA, #9 I-128,
       S3-928/864/964, ET4000/W32p, Weitek P9000
       
       Next version of Accel-X will support 24 bit packed pixel modes.
       
   Metro-X ($150, Metro Link, sales@metrolink.com)
   
     * Matrox MGA-I, MGA-II
     * TI 34020
       
       16 bit support for some S3 cards and Mach32
       32 bit support for some S3 cards and Matrox MGA
   
     _________________________________________________________________
   
5. Controllers (hard drive)

   Linux will work with standard IDE, MFM and RLL controllers. When using
   MFM/RLL controllers it is important to use ext2fs and the bad block
   checking options when formatting the disk.
   
   ESDI controllers that emulate the ST-506 (that is MFM/RLL/IDE)
   interface will also work. The bad block checking comment also applies
   to these controllers.
   
   Generic 8 bit XT controllers also work.
   
   There is a patch for Enhanced IDE device support.
   
     _________________________________________________________________
   
6. Controllers (SCSI)

   It is important to pick a SCSI controller carefully. Many cheap ISA
   SCSI controllers are designed to drive CD-ROM's rather than anything
   else. Such low end SCSI controllers are no better than IDE. See the
   SCSI HOWTO and look at UNIX performance figures before buying a SCSI
   card.
   
     * AMI Fast Disk VLB/EISA (works with BusLogic drivers)
     * Adaptec AVA-1505/1515 (ISA) (use 152x drivers)
     * Adaptec AHA-1510/152x (ISA)
     * Adaptec AHA-154x (ISA) (all models)
     * Adaptec AHA-174x (EISA) (in enhanced mode)
     * Adaptec AHA-274x (EISA) / 284x (VLB) (AIC-7770)
     * Always IN2000
     * BusLogic (all models)
     * DPT Smartcache (EATA) (EISA)
     * DTC 329x (EISA) (Adaptec compatibility mode)
     * Future Domain TMC-16x0, TMC-3260 (PCI)
     * Future Domain TMC-8xx, TMC-950
     * NCR 53c7x0, 53c8x0 (PCI)
     * Pro Audio Spectrum 16 SCSI (ISA)
     * Qlogic / Control Concepts SCSI/IDE (FAS408) - ISA/VLB/PCMCIA, does
       not work with PCI (different chipset). PCMCIA cards must boot DOS
       to init card
     * Seagate ST-01/ST-02 (ISA)
     * SoundBlaster 16 SCSI-2 (Adaptec 152x) (ISA)
     * Trantor T128/T128F/T228 (ISA)
     * UltraStor 14F (ISA), 24F (EISA), 34F (VLB)
     * Western Digital WD7000 SCSI
       
   =others=
     * Adaptec ACB-40xx SCSI-MFM/RLL bridgeboard
       [1] /pub/Linux/kernel/patches/scsi/adaptec-40XX.tar.gz
     * Adaptec AHA-2940 (PCI) (AIC-7870)
       ftp://ftp.cpsc.ucalgary.ca/pub/systems/linux/aha274x/prerelease/
     * Acculogic ISApport / MV Premium 3D SCSI (NCR 53c406a)
       [2] /pub/linux/ALPHA/scsi/
     * Always AL-500
       [1] /pub/Linux/kernel/patches/scsi/al500_0.1.tar.gz
     * EATA-DMA protocol compliant SCSI (DPT/NEC/AT&T) (ISA and EISA)
       ftp://ftp.uni-mainz.de/pub/Linux/Drivers/SCSI/EATA/
     * Iomega PC2/2B
       [1] /pub/Linux/kernel/patches/scsi/iomega_pc2-1.1.x.tar.gz
     * New Media Bus Toaster PCMCIA
       ftp://lamont.ldeo.columbia.edu/pub/linux/bus_toaster-1.5.tgz
     * Ricoh GSI-8
       [2] /pub/linux/ALPHA/scsi/gsi8.tar.gz
     * Trantor T130B (NCR 53c400)
       [1] /pub/Linux/kernel/patches/scsi/53c400.tar.gz
       
   AMI is writing a driver for their Fast Disk VLB Cache SCSI Controller.
   Parallel port SCSI adapters are not supported.
   Non Adaptec compatible DTC boards (327x, 328x) are not supported.

     _________________________________________________________________
   
7. Controllers (I/O)

   Any standard serial/parallel/joystick/IDE combo cards.
   Linux supports 8250, 16450, 16550, and 16550A UART's.
   
   Will Hayward says... "I work for a company that resells computers. A
   recent client of mine specified that he "must have the 16550A UART and
   not the 16550 UART". Since I had not heard of the 16550A, I proceeded
   to search for a source of one. After much searching with no luck, I
   finally went to the real source - National Semiconductor - the
   manufacturer of these UARTs. A representative there said that there is
   no difference between the 16550 and the 16550A. In fact, 16550A is an
   old part number. The current name for the chip is really PC16550D but
   can be shortened to just 16550. The "D" refers to the current
   revision."
   
     _________________________________________________________________
   
8. Controllers (multiport)

     * AST FourPort and clones
     * Accent Async-4
     * Bell Technologies HUB6
     * Boca BB-1004, 1008 (4, 8 port) - no DTR, DSR, and CD
     * Boca BB-2016 (16 port)
     * Boca IO/AT66 (6 port)
     * Boca IO 2by4 (4S/2P) - works with modems, but uses 5 IRQ's
     * PC-COMM 4-port
     * STB 4-COM
     * Twincom ACI/550
     * Usenet Serial Board II
       
   =others=
     * Cyclades Cyclom-8Y/16Y (8, 16 port)
       [1] /pub/Linux/kernel/patches/serial/cyc.1.33.tgz
     * DigiBoard COM/Xi - contact Simon Park <si@wimpol.demon.co.uk>
     * DigiBoard PC/Xe (ISA) and PC/Xi (EISA)
       ftp://ftp.skypoint.com/pub/linux/digiboard/
     * Specialix SI0/XIO (modular, 4 to 32 ports)
       [1] /pub/Linux/kernel/patches/serial/sidrv0_5.taz
     * Stallion Technologies EasyIO / EasyConnection 8/32
       [1] /pub/Linux/kernel/patches/serial/stallion-0.1.0.tar.gz
   
     _________________________________________________________________
   
9. Network adapters

   Ethernet adapters vary greatly in performance. In general the newer
   the design the better. Some very old cards like the 3C501 are only
   useful because they can be found in junk heaps for $5 a time. Be
   careful with clones, not all are good clones and bad clones often
   cause erratic lockups under Linux.
   
     * 3Com 3C501 - obsolete and not recommended
     * 3Com 3C503, 3C505, 3C507, 3C509 (ISA) / 3C579 (EISA)
     * AMD LANCE (79C960) / PCnet-ISA/PCI (AT1500, HP J2405A, NE1500/NE2100)
     * Allied Telesis AT1700
     * Cabletron E21xx
     * DEC DEPCA and EtherWORKS
     * HP PCLAN / PCLAN PLUS
     * Intel EtherExpress
     * NE2000/NE1000
     * Racal-Interlan NI5210 (i82586 Ethernet chip)
     * Racal-Interlan NI6510 (am7990 lance chip) - doesn't work with more
       than 16 megs RAM
     * PureData PDUC8028, PDI8023
     * SMC Ultra
     * Schneider & Koch G16
     * Western Digital WD80x3
       
   EISA and onboard controllers
     * Ansel Communications AC3200 EISA
     * Apricot Xen-II
     * Zenith Z-Note / IBM ThinkPad 300 built-in adapter
       
   Pocket and portable adapters
     * AT-Lan-Tec/RealTek parallel port adapter
     * D-Link DE600/DE620 parallel port adapter
       
   Slotless
     * SLIP/CSLIP/PPP (serial port)
     * PLIP (parallel port, using "LapLink cable" or bi-directional cable)
       
   =others=
   
   ISDN
     * Diehl SCOM card
       [1] /pub/Linux/kernel/patches/network/isdndrv-0.1.1.tar.gz
     * Sonix PC Volante
       only in asynchronous mode, not useful for some applications
     * Teles ISDN card
       
   Amateur radio cards
     * Ottowa PI2
     * Most generic 8530 based HDLC boards
       
       No support for the PMP/Baycom board
       
   PCMCIA cards - ftp://cb-iris.stanford.edu/pub/pcmcia/
     * 3Com 3C589
     * Accton EN2212 EtherCard
     * D-Link DE650
     * IBM Credit Card Adapter
     * IC-Card
     * Kingston KNE-PCM/M
     * LANEED Ethernet
     * Linksys EthernetCard
     * Network General "Sniffer"
     * Novell NE4100
     * Thomas-Conrad Ethernet
     * ... possibly more
       
   Token Ring - ftp://ftp.cs.kuleuven.ac.be/pub/unix/linux/
   
   Arcnet - [1] /pub/Linux/system/Network/drivers/arcnet-0.21.tar.gz
   
   Xircom adapters are not supported.
   
     _________________________________________________________________
   
10. Sound cards

     * 6850 UART MIDI
     * ATI Stereo F/X (SB compatible)
     * Adlib

     * ECHO-PSS (Orchid SW32, Cardinal DSP16, etc)
     * Ensoniq SoundScape (boot DOS to init card)
     * Gravis Ultrasound
     * Gravis Ultrasound 16-bit sampling daughterboard
     * Gravis Ultrasound MAX
     * Logitech SoundMan Games (SBPro, 44kHz stereo support)
     * Logitech SoundMan Wave (SBPro/MPU-401) (OPL4)
     * Logitech SoundMan 16 (PAS-16 compatible)
     * Microsoft Sound System (AD1848)
     * MPU-401 MIDI
     * Media Vision Premium 3D (Jazz16) (SBPro compatible)
     * Media Vision Pro Sonic 16 (Jazz)
     * Media Vision Pro Audio Spectrum-16
     * SoundBlaster
     * SoundBlaster Pro
     * SoundBlaster 16/ASP/MCD/SCSI-2
     * Sound Galaxy NX Pro
     * ThunderBoard (SB compatible)
     * WaveBlaster (and other SB16 daughterboards)
       
   =others=
     * MPU-401 MIDI (intelligent mode)
       [1] /pub/Linux/Incoming/mpu4011.0.1a.tar.gz
     * PC speaker / Parallel port DAC
       [1] /pub/Linux/kernel/patches/console/pcsndrv-0.7.tar.z
       
   The ASP chip on SoundBlaster 16 series and AWE32 is not supported.
   AWE32's special features (MIDI, effects) are not supported. They will
   probably never be supported.
   
     _________________________________________________________________
   
11. Hard drives

   All hard drives should work if the controller is supported.
   
   (From the SCSI HOWTO)
   All direct access SCSI devices with a block size of 256, 512, or 1024
   bytes should work. Other block sizes will not work (Note that this can
   often be fixed by changing the block and/or sector sizes using the
   MODE SELECT SCSI command)
   
   Large IDE (EIDE) drives work fine with newer kernels. The boot
   partition must lie in the first 1024 cylinders due to PC BIOS
   limitations.
   Some Conner CFP1060 drives may have problems with Linux and ext2fs.
   The symptoms are inode errors during e2fsck and corrupt file systems.
   Conner has released a bugfix for this problem, contact Soenke Behrens
   <Soenke.BEHRENS@conner.com> for the patch.
   
   Certain Micropolis drives have problems with BusLogic BT-946C PCI SCSI
   controllers, get upgrade ROMs from BusLogic.
   
     _________________________________________________________________
   
12. Tape drives

   SCSI tape drives (From the SCSI HOWTO)
   Drives using both fixed and variable length blocks smaller than the
   driver buffer length (set to 32k in the distribution sources) are
   supported. Virtually all drives should work. (Send mail if you know of
   any incompatible drives.)
   
     * QIC-02
       
       Linux does not work with Emerald and Tecmar QIC-02 tape controller
       cards - Chris Ulrich <insom@math.ucr.edu>
       
     * QIC-117, QIC-40/80 drives (Ftape)
          + Most tape drive using the floppy controller should work.
            Check the Ftape HOWTO for details.
          + Colorado FC-10 is supported
   
       
     * these don't work...
          + Drives that connect to the parallel port (eg: Colorado Trakker)
          + Some high speed tape controllers (Colorado TC-15 / FC-20)
          + Irwin AX250L/Accutrak 250 (not QIC-80)
          + IBM Internal Tape Backup Unit (not QIC-80)
          + COREtape Light
   
     _________________________________________________________________
   
13. CD-ROM drives

   (From the CD-ROM HOWTO)
   Any SCSI CD-ROM drive with a block size of 512 or 2048 bytes should
   work under Linux; this includes the vast majority of CD-ROM drives on
   the market.
   
     * Kotobuki/Matsushita/Panasonic
     * Mitsumi
     * Sony CDU31A/CDU33A
       
   =others=
     * Aztech CD268A
       ftp://ftp.gwdg.de/pub/linux/cdrom/drivers/aztech/
     * LMS/Philips CM 205/225/202 (does not work with CM 206)
       [1] /pub/Linux/kernel/patches/cdrom/lmscd0.3c.tar.gz
     * NEC CDR-260, Wearnes CDD-120 (EIDE CD-ROM drives)
       [1] /pub/Linux/kernel/patches/cdrom/nec260-0_3.tgz
     * NEC CDR-35D (old)
       [1] /pub/Linux/Incoming/linux-neccdr35d.patch
     * Sony CDU-535/CDU-531
       [1] /pub/Linux/kernel/patches/cdrom/sony535-0.6.tar.gz
       
   PhotoCD (XA) is supported.
   
   All CD-ROM drives should work similarly for reading data. There are
   various compatibility problems with audio CD playing utilities.
   (Especially with some NEC drives.) Some alpha drivers may not have
   audio support yet.
   
   Early (single speed) NEC CD-ROM drives may have trouble with currently
   available SCSI controllers.
   
     _________________________________________________________________
   
14. Optical/WORM/CD-R/Floptical/Removable drives

   All SCSI based drives should work if the controller is supported.
   
   Linux supports both 512 and 1024 bytes/sector optical disks.
   
   Iomega Bernoulli and LaserSafe drives attached to their proprietary
   PC2/2B SCSI adapters will work if the driver is installed.
   
     _________________________________________________________________
   
15. Mice

     * Microsoft serial mouse
     * Mouse Systems serial mouse
     * Logitech Mouseman serial mouse
     * Logitech serial mouse
       
     * ATI XL Inport busmouse
     * C&T 82C710 (QuickPort) (Toshiba, TI Travelmate)
     * Microsoft busmouse
     * Logitech busmouse
     * PS/2 (auxiliary device) mouse
       
   =others=
     * Sejin J-mouse
       [1] /pub/Linux/Incoming/jmouse.1.1.70-jmouse.tar.gz
       
   Newer Logitech mice (except the Mouseman) use the Microsoft protocol
   and all three buttons do work. Eventhough Microsoft's mice have only
   two buttons, the protocol allows three buttons. The mouse port on the
   ATI Graphics Ultra and Ultra Pro use the Logitech busmouse protocol.
   (See the Busmouse HOWTO for details.)
   
     _________________________________________________________________
   
16. Modems

   All internal modems or external modems connected to the serial port.
   
   A small number of modems come with DOS software that downloads the
   control program at runtime. These can normally be used by loading the
   program under DOS and doing a warm boot. Such modems are probably best
   avoided as you won't be able to use them with non PC hardware in the
   future.
   
   PCMCIA modems should work with the PCMCIA drivers.
   
   Fax modems need appropriated software to operate.
   
     * Digicom Connection 96+/14.4+ - DSP code downloading program
       [1] /pub/Linux/system/Serial/smdl-linux.1.02.tar.gz
     * ZyXEL U-1496 series - ZyXEL 1.4, modem/fax/voice control program
       [1] /pub/Linux/system/Serial/ZyXEL-1.4.tar.gz
   
     _________________________________________________________________
   
17. Printers/Plotters

   All printers and plotters connected to the parallel or serial port
   should work.
   
     * HP LaserJet 4 series - free-lj4, printing modes control program
       [1] /pub/Linux/system/Printing/free-lj4-1.1p1.tar.gz
     * BiTronics parallel port interface
       [1] /pub/Linux/kernel/misc/bt-ALPHA-0.0.1.tar.gz
       
   Many Linux programs output PostScript files. Non-PostScript printers
   can emulate PostScript Level 2 using Ghostscript. Ghostscript supports
   these printers (and compatibles):
     * Apple Imagewriter
     * C. Itoh M8510
     * Canon BubbleJet BJ10e, BJ200
     * Canon LBP-8II, LIPS III
     * DEC LA50/70/75/75plus
     * DEC LN03, LJ250
     * Epson 9 pin, 24 pin, LQ series, Stylus, AP3250
     * HP 2563B
     * HP DesignJet 650C
     * HP DeskJet/Plus/500
     * HP DeskJet 500C/520C/550C color
     * HP LaserJet/Plus/II/III/4
     * HP PaintJet/XL/XL300/1200C color
     * IBM Jetprinter color
     * IBM Proprinter
     * Imagen ImPress
     * Mitsubishi CP50 color
     * NEC P6/P6+/P60
     * Okidata MicroLine 182
     * Ricoh 4081
     * SPARCprinter
     * StarJet 48 inkjet printer
     * Tektronix 4693d color 2/4/8 bit
     * Tektronix 4695/4696 inkjet plotter
     * Xerox XES printers (2700, 3700, 4045, etc.)
       
   =others=
     * Canon BJC600 and Epson ESC/P color printers
       ftp://petole.imag.fr/pub/postscript/
       
     _________________________________________________________________
   
18. Scanners

     * A4 Tech AC 4096
       ftp://ftp.informatik.hu-berlin.de/pub/local/linux/ac4096.tgz
     * Fujitsu SCSI-2 scanners
       contact Dr. G.W. Wettstein <greg%wind.UUCP@plains.nodak.edu>
     * Genius GS-B105G
       [2] /pub/linux/ALPHA/scanner/gs105-0.0.1.tar.gz
     * Genius GeniScan GS4500 handheld scanner
       [2] /pub/linux/ALPHA/scanner/gs4500.tar.gz
     * Logitech Scanman 32 / 256
       [2] /pub/linux/ALPHA/scanner/logiscan-0.0.2.tar.gz
     * Mustek M105 handheld scanner with GI1904 interface
       [2] /pub/linux/ALPHA/scanner/scan-driver-0.1.8.tar.gz
       
     _________________________________________________________________
   
19. Others

     * VESA Power Savings Protocol (DPMS) monitors
       
     * Joysticks
       [1] /pub/Linux/kernel/patches/console/joystick-0.7.tgz
       
     * ProMovie Studio
       [1] /pub/Linux/Incoming/PMS-grabber.tgz
     * VideoBlaster, Rombo Media Pro+
       [1] /pub/Linux/apps/video/vid_src.gz
     * WinVision video capture card
       [1] /pub/Linux/apps/video/fgrabber-1.0.tgz
       
     * APC Back-UPS (Read the Back-UPS HOWTO)
       
     * Mattel Powerglove
       [1] /pub/Linux/apps/linux-powerglove.tgz
       
     _________________________________________________________________
   
20. Incompatibilities

   Both the Pro Audio Spectrum-16 and the Adaptec 1542 use 16-bit DMA so
   they may have trouble working together. A program called SCSISEL.EXE
   may fix this. Check the Sound HOWTO for details.
   
     _________________________________________________________________
   
21. Acknowledgments

   Thanks to all the authors and contributors of other HOWTO's, many
   things here are shamelessly stolen from their HOWTO's; to Zane Healy
   and Ed Carp, the original author and maintainer of this list; and to
   everyone else who sent in updates and feedbacks. Special thanks to
   Eric Boerner for the sanity checks.
   
     _________________________________________________________________
   --end
   
   Trademarks are owned by their owners. No warranties.

--
Send submissions for comp.os.linux.announce to: linux-announce@tc.cornell.edu
PLEASE remember Keywords: and a short description of the software.
--------------586E36D9105D
Content-Type: text/plain; charset=iso-8859-1; name="slackware96.txt"
Content-Transfer-Encoding: 8bit
Content-Disposition: inline; filename="slackware96.txt"




                         █  Slackware 96 安裝說明   █
 ──────────────────────────────────
 \LINUX\

Slackware 96安裝說明
        Slackware 96就是Linux 的一個distribution,是一套相當受人喜愛的Linux
        。雖然Linux 還有其他的distribution ,如debian,RedHat等。不過在台灣
        還是以Slackware 的使用者居多。這篇文章的的主要目地就是要教你一步一
        步的把這一期光碟中所附的Slackware 96安裝到你的硬碟裡面去。不過開始
        要安裝你的Linux之前,最好先確定你的PC硬體的規格有被Linux所支援,如
        果你的硬體都有被支援的話,那麼相信你安裝起來會很得心應手的。如果有
        些東西沒有被支援到的話,一個可能是不用該硬體設備就可以了,另一可能
        就是系統根本就不會動了。以下是安裝Linux的硬體需求:
CPU:   386 以上的80x86 系列的CPU 都可以。基本上486及Pentium也絕對沒有問題
        ,就算是Cyrix 或是AMD 的CPU 都沒有問題。至於Pentium Pro的話,筆者本
        身並沒有試過,但是網路上有網友有過安裝的經驗,基本上應該也是可以的。
RAM:   RAM 的廠牌跟規格並不重要,不管你是60ns,70ns,還是更爛的80ns的RAM都
        沒有關係。EDO RAM及非EDO RAM 也都可以執行Linux。唯一需要考量的就是
        RAM 的大小,理論上4MB的RAM就可以跑Linux 了。但是如果你要系統效能好
        的話,至少要到8MB以上,不過如果你還要跑X Window的話,最少要12MB。
        不過以現在RAM的行情而言,筆者強烈建議大家插到32MB的RAM。保證會玩的
        很開心的。
軟碟:  軟碟機的話,基本上你最少要有一個1.44MB或是1.2MB 的軟碟。
硬碟:  你最少要有一顆IDE 硬碟或者是SCSI硬碟,不過因為Linux 是一個多人多工
        的作業系統,所以如果你是要把它拿來當Server使用的話,最好是使用SCSI
        硬碟。
光碟機:本安裝說明基本上是針對要從CDROM 上面來安裝Linux 的使用者所寫的。所
        以你至少要有一台光碟機才能安裝,目前絕大部份的CD-ROM都已經有被Linux
        所支援了。
顯示卡:基本上顯示卡只要是能顯示標準VGA 的解析度的顯示卡都沒有問題。不過如
        果你還要使用X Window的話,那麼你所使用的顯示卡就必須要被X Window所
        支援才行。不然的話你使用X Window的時候就會出問題。基本上, 目前最流
        行的顯示卡S3系列的顯示卡都已經有被支援了。
滑鼠:  文字模式下的Linux ,滑鼠是非必需品。不過如果要在X-Window下的話,那
        麼滑鼠就是必要的了。基本上,一般的序列埠滑鼠都有被支援。
螢幕:  或許你會奇怪,螢幕有什麼好提的。不過如果你是舊的螢幕的話,那麼你要
        注意你的螢幕是否能夠撐的住你的顯示卡的顯示頻率。否則的話,在X Window
        中可是會什麼都看不見的喲。
        Slackware中包含了許多Linux的軟體,但是並非每一種你都需要。所以
        Slackware將它的軟體分成數種。每一種我們稱為一個磁片集(disk set)。
        之所以稱為磁片集乃是因為早期的Slackware是用磁片來散播的。同一種的軟
        體就是幾張磁片,所以就稱為磁片集了。當然現在已經很少在用磁片來安裝
        Linux了。不過這個名詞仍然沿用至今。那麼Slackware的磁片集到底有那些
        呢﹖哪些又是你一定要裝的,哪些又是你不一定要裝的呢﹖請看下面這個列
        表:

磁片集          說明
──────────────────────────────────
A       這個磁片集中包含了最基本的系統部份,你最少一定要裝這個部份,
        否則你的系統是無法正常運作的。
──────────────────────────────────
AP      這個磁片集中包含了一些比較常用的應用軟體,就大部份的情況而言,
        我們都會安裝這個磁片集。它裡面包含了:線上手冊,groff,term
        ,joe,jove,ghostscript,sc,bc等軟體。
──────────────────────────────────
D       這個磁片集中包含了許多的發展程式所會使用的到的工具,像是C/C++
        的編譯器。雖然你可能不是為了要發展程式而灌Linux的,但是你仍舊
        要安裝這個磁片集,這是因為在Linux的世界中,你常常會需要將一個
        原始程式編譯成為可執行檔,當你進行這些步驟的時候,你就會需要這
        些程式了。所以請務必安裝這個磁片集。
──────────────────────────────────
E       這個磁片集中主要包含了GNU的Emasc這套文書處理軟體,這是一套
        功能當強大的軟體。不過,如果你認為你不需要使用他的話,你可以不
        要裝這個磁片集。
──────────────────────────────────
F       在這個磁片中所含的是一些FAQ以及相關的一些文件。如果你覺得這
        些文件將對你很有幫助的話,你就安裝它。不然就不要安裝。
──────────────────────────────────
K       這個磁片集中是放Linux 2.0.0核心程式的原始碼。基本上由於我們都
        會需要重新的編譯核心程式一次,所以會需要安裝這個東西。
──────────────────────────────────
N       這個磁片集中放的是網路相關的軟體,通常很少人會安裝Linux而不上
        網路的,所以一般的情況都會安裝這個磁片集,這裡面主要有基本的
        TCP/IP軟體,信件閱讀程式,送信程式,看news的程式等等。
──────────────────────────────────
TCL     Tcl與Tk這兩個東西是一個讓使用這可以很輕易的開發X Window軟體
        的工具,很多好用的軟體都是用這兩個東西共同開發出來的,當然如果
        你不想使用這些軟體的話,你可以不用安裝這個東西。不過筆者給你
        的建議是要安裝。
──────────────────────────────────
Y       這是一些給console所玩的遊戲,也就是一些文字畫面遊戲。筆者本身
        對這種遊戲沒有什麼興趣,所以就沒有安裝了。各位讀者有興趣的話,
        請自行安裝。它們是不會佔掉太多的硬碟空間的。
──────────────────────────────────
X       基本的X視窗部份,這裡面所包含的是XFree86 3.1.2的版本,這是目 
        前正式版中最新的版本。現在除了一些架設Server的人以外,已經很少
        人裝Linux而不裝X Window了。所以如果你的硬碟空間許可的話,最
        好是安裝它。如果你的顯示卡沒有被支援的話,你可能需要去找一些測
        試版的X Window。這些測試版所支援的顯示卡比較多,但是也因此有
        些時間限制。
──────────────────────────────────
XAP     在X Window下面所使用的應用軟體。有X下面的ghostscript,
        workman,xfilemanager,xv 3.01等等。都是相當好用的軟體,
        所以果你有安裝X 磁片集的話,最好順便安裝這個磁片集。
──────────────────────────────────
XD      這個是給需要發展X Server的人所使用的一些工具及程式庫。所以如果
        你真的要發展X Server的話,你就要安裝它。不過一般的人是不會去安
        裝這個磁片集的。
──────────────────────────────────
XV      這是Xview3.2-X11R6。如果你要使用到一些Xview介面的東西的話,
        你最好安裝它。因為我們偶爾會用到這些程式,所以筆者的建議是安裝
        它。
──────────────────────────────────
T       TeX及LaTeX2e這些文字格式化系統。簡單的說就是一些排版工具。
        如果你對這個系統很熟的話,你可以安裝它。不過像筆者這種不會使用
        的人,就可以省省了。
──────────────────────────────────
現在你應該已經對Slackware有個大概的認識了。那麼我們現在就來開始進行安裝吧。
安裝的第一件事就是要做兩片磁片─開機片(boot disk)及系統片(root disk)。首先
我們先從如何挑選合適的開機片開始講起,因為大家的電腦硬體設備都不太一樣,所
以對於不同的硬體就會需要有不同的開機片。下面我們列出Slackware所提供的開機
片,以及該開機片所支援的硬體。你需要依照你的硬體資料來選擇正確的開機片以便
能夠正確的抓到你的硬體設備。這些檔案是放在\Linux\bootdsks.12或是
\Linux\bootdsks.144這兩個目錄中,其中bootdsks.12是給使用1.2MB磁片的使用者用
的,bootdsks.144則是給1.44MB磁片的使用者用的。另外,所有給IDE硬碟用的開機片
他的副檔名都是.i的。如果是給SCSI硬碟所使用的開機片則是.s的副檔名。

開機片檔名      說明
──────────────────────────────────
aztech.i        支援Aztech CDA268-01A,Orchid CD-3110,Okano/Wearnes 
                CDD110,Conrad TXC,CyCDROM CR520,CR540等CD-ROM。
──────────────────────────────────
bare.i          什麼都沒有支援,就是專給IDE硬碟用的。
──────────────────────────────────
cdu31a.i        支援Sony CDU31/33a CD-ROM。
──────────────────────────────────
cdu535.i        支援CDU531/535 CD-ROM。
──────────────────────────────────
cm206.i         支援Philips/LMS cm206這個使用cm260專屬介面卡的CD-ROM。
──────────────────────────────────
goldstar.i      支援Goldstar R420 CD-ROM。
──────────────────────────────────
mcd.i           支援非IDE介面的Mitsumi CD-ROM。
──────────────────────────────────
mcdx.i          支援增進對非IDE介面的Mitsumi CD-ROM。
──────────────────────────────────
net.i           支援Ethernet網路卡。
──────────────────────────────────
optics.i        支援Optics Storage 8000 AT CD-ROM。
──────────────────────────────────
sanyo.i         支援Sanyo CDR-H94A CD-ROM。
──────────────────────────────────
sbpcd.i         支援Matsushita,Kotobuki,Panasonic,CreativeLabs
                (Sound Blaster),Longshine及Teac NON-IDE CD-ROM。
──────────────────────────────────
xt.i            只支援舊的MFM硬碟。
──────────────────────────────────
7000fast.s      支援Western Digital 7000FASST SCSI卡。
──────────────────────────────────
advansys.s      支援AdvanSys SCSI卡。
──────────────────────────────────
aha152x.s       支援Adaptec 152x SCSI卡。
──────────────────────────────────
aha1542.s       支援Adaptec 1542 SCSI卡。
──────────────────────────────────
aha1740.s       支援Adaptec 1740 SCSI卡。
──────────────────────────────────
aha2x4x.s       支援Adaptec AIC7xxx SCSI卡(有支援的卡如下:AHA-274x,
                AHA-2842,AHA-2940,AHA-2940W,AHA-2940U,AHA-
                2940UW,AHA-2944D,AHA-2944WD,AHA-3940,AHA-
                3940W,AHA-3985,AHA-3985W) 
──────────────────────────────────
am53c974.s      支援AMD AM53/79C974 SCSI卡。
──────────────────────────────────
aztech.s        支援所有的SCSI卡,並增加對Aztech CDA268-01A,Orchid CD-
                3110, Okano/Wearnes CDD110,Conrad TXC,CyCDROM CR520,
                3111, CR540的支援。
──────────────────────────────────
buslogic.s      支援Buslogic MultiMaster SCSI卡。
──────────────────────────────────
cdu31a.s        支援所有的SCSI卡。並增加對Sony CDU31/33a的支援。
──────────────────────────────────
cdu535.s        支援所有的SCSI卡。並增加對Sony CDU531/535的支援。
──────────────────────────────────
cm206.s         支援所有的SCSI卡。並增加對使用cm260專屬介面卡的
                Philips/LMS cm206的支援。
──────────────────────────────────
dtc3280.s       支援DTC (Data Technology Corp) 3180/3280 SCSI卡。
──────────────────────────────────
eata_dma.s      支援DPT EATA-DMA SCSI卡。(諸如:PM2011,PM2021,
                PM2041,PM3021,PM2012B,PM2022,PM2122,M2322,
                PM2042,PM3122,PM3222,PM3332,PM2024,PM2124,
                PM2044,PM2144,PM3224,PM3334)
──────────────────────────────────
eata_isa.s      支援DPT EATA-ISA/EISA SCSI卡。(如:PM2011B/9X,
                PM2021A/9X,PM2012A,PM2012B,PM2022A/9X,     
                M2122A/9X,PM2322A/9)
──────────────────────────────────
eata_pio.s      DPT EATA-PIO SCSI卡。(PM2001及PM2012A)
──────────────────────────────────
fdomain.s       支援Future Domain TMC-16x0 SCSI卡。
──────────────────────────────────
goldstar.s      支援所有的SCSI卡。還增加了對Goldstar R420 CD-ROM的支援。
──────────────────────────────────
in2000.s        支援Always IN2000 SCSI卡。
──────────────────────────────────
iomega.s        支援IOMEGA PPA3 parallel port SCSI介面。

──────────────────────────────────
mcd. s          支援所有的SCSI卡。還增加了對非IDE介面的Mitsumi CD-
                ROM。
──────────────────────────────────
mcdx. s         支援所有的SCSI卡。還增強了對非IDE介面的Mitsumi CD-ROM
                的支援。
──────────────────────────────────
n53c406a.s      支援NCR 53c406a SCSI卡。
──────────────────────────────────
n_5380.s        支援NCR 5380及53c400 SCSI卡。
──────────────────────────────────
n_53c7xx.s      支援NCR 53c7xx, 53c8xx SCSI卡。
──────────────────────────────────
optics.s        支援所有的SCSI卡,還增加了對Optics Storage 8000 AT CD-ROM的支
                援。
──────────────────────────────────
pas16.s         支援Pro Audio Spectrum/Studio 16 SCSI介面。
──────────────────────────────────
qlog_fas.s      支援ISA/VLB/PCMCIA Qlogic FastSCSI!。
──────────────────────────────────
qlog_isp.s      支援所有的Qlogic PCI SCSI卡。
──────────────────────────────────
sanyo.s         支援所有的SCSI卡介面,另外還支援Sanyo CDR-H94A CD-
                ROM。
──────────────────────────────────
sbpcd.s         支援所有的SCSI卡介面,另外還支援Matsushita,Kotobuki,
                Panasonic,CreativeLabs (Sound Blaster),Longshine及
                Teac NON-IDE CD-ROM。 
──────────────────────────────────
scsinet.s       支援所有的SCSI卡介面,另外還支援完整的ethernet卡的支援。
──────────────────────────────────
seagate.s       支援Seagate ST01/ST02,Future Domain TMC-885/950 SCSI卡。
──────────────────────────────────
trantor.s       支援Trantor T128/T128F/T228 SCSI卡。
──────────────────────────────────
ultrastr.s      支援UltraStor 14F,24F及34F SCSI卡。
──────────────────────────────────
ustor14f.s      支援UltraStor 14F及34F SCSI卡。
──────────────────────────────────
基本上,所有的SCSI開機片都支援IDE介面及所有的CD-ROM。在你挑好你的開機片之
後,接下來就是要挑一片系統片(root disk)。這些系統片你可以在\linux\roodsks\
中找到。下面所列出的就是所有的系統片及對應的說明:

系統片檔名      說明
──────────────────────────────────
color.gz        這個系統片中提供了一個彩色的選單式的安裝程式。基本上大部份
                的使用者都是使用這張系統片來進行安裝。
──────────────────────────────────
umsdos.gz       如果你是要將你的Linux安裝到一個DOS的檔案系統上面去的話,你
                就應該使用這個系統片。
──────────────────────────────────
text.gz         這個系統片提供了一個文字介面的安裝程式。基本上,除非你在使
                用color.gz這個系統片來進行安裝時出了問題,你才應該使用這個
                系統片來試試看,否則的話,還是使用color.gz這張系統片。
──────────────────────────────────
pcmcia.gz       如果你是要透過PCMCIA規格的網路卡來安裝你的Linux的話,
                你就應該使用這個系統片來進行安裝。
──────────────────────────────────
當你選擇好你的開機片及系統片之後,你就可以開始進行製作這兩張磁片了。如果你
是在可以執行DOS程式的作業系統下面來製作這兩張磁片的話,你可以透過rawrite.exe
這個DOS程式做。這個程式可以在光碟片中的\linux\install的目錄下面找到。我們現
在假設你要使用sbpcd.s及color.gz來製作你的開機片及系統片。首先你應該要輸入下
面的命令:(假設光碟是在e槽)
        rawrite.exe e:\linux\bootdsks.144\sbpcd.s a:
        rawrite.exe e:\linux\rootdsks\color.gz a:
每下完一個命令後,請別忘了要換一張磁片。所以在你兩個步驟都作完之後,你應該會有兩張磁片,請分別標上"Linux開機片"及"Linux系統片"的字樣。如果你是在舊的Linux系統下面要製作這兩張開機片的話,你可以透過下面的命令來做:
        dd if=/cdrom/linux/bootdsks.144/sbpcd.s of=/dev/fd0
        dd if=/cdrom/linux/rootdsks/color.gz of=/dev/fd0
同樣的,完成之後你應該會有兩張磁片,請將他們標上"Linux開機片"及"Linux系統片"。當你完成這兩張磁片之後,接下來要做的就是將你的電腦重新啟動。然後將Linux開機片放入你的A槽中(請別忘記將你的BIOS中的啟動順序設定為A, C)。如果一切都OK的話,你應該會看到下面的T息:

        VFS: Insert root floppy disk to be loaded into ramdisk and press ENTER

當你看到這個訊息的時候,請將開機片自A磁碟中取出,然後放入Linux系統片,並按下ENTER。如果很不幸的,你沒有看到上面的訊息的話。首先請先確定你所選擇的開機片是否正確,也就是是否跟你的硬體配合。如果確定開機片沒有選錯的話,那麼接下來就是確定磁片是否是壞的。如果
.過上面這兩個檢查後,還是無法查出原因的話,那麼只好把錯誤訊息抄一抄,問問其他的Linux高手囉。
如果一切都非常的順利的話,那麼經過一些時間後,你應該會看到下面的訊息:

        slackware login:

當你看到login的字樣的時候,表示你已經完成開機的動作了,這個時候你所應該要做的是輸入root這個帳號,然後按下ENTER。這個時候你會看到你的系統會顯示一個#的系統提示符號。這個時候你就可以開始下一些命令來進行安裝了。現在你要做的就是為你的Linux準備一個分割區茖悃
.洏峞C所以我們現在要做的就是使用fdisk這個程式來分割你的硬碟空間。請在系統提示符號下面輸入fdisk及你要切割的硬碟。舉例來說,假設你要安裝Linux在第一顆IDE硬碟上面,那麼你應該輸入下面的命令:

        fdisk /dev/hda

其中/dev/hda指的就是第一顆IDE硬碟。以下我們將每個硬碟及對應的設備名稱列出來:

設備名稱        代表的硬碟
────────────────────────────
/dev/hda        第一顆IDE硬碟
────────────────────────────
/dev/hdb        第二顆IDE硬碟
────────────────────────────
/dev/hdc        E-IDE第二個Channel的第一顆硬碟。
────────────────────────────
/dev/hdd        E-IDE第二個Channel的第二顆硬碟。
────────────────────────────
/dev/sda        第一顆SCSI硬碟。
────────────────────────────
/dev/sdb        第二顆SCSI硬碟。
────────────────────────────
/dev/sdc        第三顆SCSI硬碟。
────────────────────────────
/dev/sdd        第四顆SCSI硬碟。
────────────────────────────
/dev/sde        第五顆SCSI硬碟。
────────────────────────────
/dev/sdf        第六顆SCSI硬碟。
────────────────────────────

請小心使用fdisk這個程式,因為一個不小心的話,很有可能將其他硬碟中的資料給毀掉的。另外,如果你還不確定的話,可以使用fdisk 
-l這個命令來查看所有的硬碟的分割情況。在你進入fdisk程式之後,你可以透過回答一連串的問題之後,完成整個分割的動作。首先,在你進入fdisk.式之後,你會看到下面的提示符號:

        Command (m for help):

就如括號中所說的,如果你按下m再按下ENTER後,你就可以看到類似下面的說明:

Command action
   a   toggle a bootable flag
   c   toggle the dos compatiblity flag
   d   delete a partition
   l   list known partition types
   m   print this menu
   n   add a new partition
   p   print the partition table
   q   quit without saving changes
   t   change a partition's system id
   u   change display/entry units
   v   verify the partition table
   w   write table to disk and exit
   x   extra functionality (experts only)

基本上你有13個命令可以使用,不過實際的安裝上並不會用到這麼多的命令。下面我們
對每個命令大概的說明一下:

命令代碼        說明
──────────────────────────────────
    a           設定啟動旗標。
    c           設定DOS相容的旗標。
    d           刪除一個分割區。
    l           列出已知的分割區形態。
    m           列出指令說明。
    n           建立一個新的分割區。
    p           列出分割區列表。
    q           在不儲存任何資料的情況下離開fdisk程式。
    t           更改分割區的系統代碼。
    u           變更顯示所用的單位。
    v           重新確認分割表。
    w           將分割表寫入到硬碟中,然後離開fdisk程式。
    x           額外的功能。
──────────────────────────────────
基本上最有可能用到的為:a,d,n,p,q,t,w這七個指令。基本上,要安裝Linux到
一顆全新的硬碟上的話,首先就是使用n來建立一個新的分割區。然後使用w這個命令將
資料寫入磁碟中。最後再重新開機一次就可以了。建立一個新的分割區的步驟如下:
首先在fdisk的命令提示號下面輸入n這個命令。fdisk會詢問你是要建立一個新的
primary分割區還是extended分割區。一般而言,我們多半是選擇primary分割區。因為
在一顆硬碟最多只能有四個主分割區。所以Linux規定主分割區的號碼一定是1-4。所以
在第一顆IDE硬碟上面的第一個主分割區的話,他的設備名稱應該是/dev/hda1,其他以
此類推。你可以輸入1-4的數字,來指定你的分割區的號碼。接下來fdisk會要你輸入你
的分割區的起始位置。同時它會顯示可以輸入的範圍給你。一般而言,都是輸入fdisk
所給定的範圍的第一個位置。輸入完起始位置後,fdisk會要你輸入這個分割區的結束
的位置。如果你無法確定結束的位置的話,你也可以用+nnnM的方式來指定分割區的大
小。例如,如果你想分割一個200MB的分割區的話,你可以輸入+200M來指定你要200MB
的分割區。使用n命令所建立的分割區會自動被標記成為Linux的ext2的檔案系統。下面
是一個操作的範例:

Command (m for help): n
Command action
   e   extended
   p   primary partition (1-4)
Partition number (1-4): 1
First cylinder (1-258): 1
Last cylinder or +size or +sizeM or +sizeK ([1]-258): +200M

Command (m for help): w

雖然新的分割區已經建立出來了,不過不代表我們的fdisk的工作做完了。因為我們還
需要為Linux做一個swap的分割區。這個分割區是要來給Linux當swap用,一般而言,它
的大小大約是你機器RAM的大小的兩倍。作法跟上面的建立Linux分割區是一樣的,不同
的地方在於當你建立好這個swap分割區後,請記得使用t這個命令來將該分割區的檔案
系統轉換成為swap所用的檔案系統。下面就是將硬碟的第二個主分割區轉變成為swap分
割區的過程:

Command (m for help): t
Partition number (1-4): 2
Hex code (type L to list codes): 82
Changed system type of partition 1 to 82 (Linux swap)

當你建立好你的Linux與swap分割區之後,你就可以使用w的命令來將這個新的硬碟分割
表寫入到你的硬碟中。然後請使用"shutdown -r now"或是"sync;sync;sync;reboot"的
命令來重新開機。這個時候別忘了將軟碟機中的磁片換成Linux開機片。然後再依照前
面的方式重新進入Linux。之所以這樣做的目地是為了確定你的分割表已經確實的寫入
硬碟中了。再次進入Linux的提示符號後,我們首先要做的一件事就是將CD-ROM掛上系
統的目錄中。我們要先確定我們CD-ROM的設備名稱,假設是一般的ATAPI介面的CD-ROM
的話,如果是掛在E-IDE的第二個Channel上面的Master的位置的話,那麼他的設備名稱
應該是/dev/hdc。如果是SCSI CD-ROM,假設SCSI ID為3的話,那麼設備名稱應該是
/dev/sdc。像筆者的是舊的Creative Lab的563b的CD-ROM。它使用的是Sound Blaster
 Pro的介面。所以他的設備名稱就是/dev/sbpcd。只要你有專心看你的開機訊息的話,
應該都可以看到這方面的訊息。確定你CD-ROM的設備名稱後,接下來就是使用下面的命
令來將你的CD-ROM掛到Linux中。請輸入如下的命令:

        cd /
        mkdir slack
        mount -t iso9660 -o ro /dev/sbpcd /slack

在這邊,因為我舉我的CD-ROM為例,所以設備名稱是填/dev/sbpcd。各位應該視自己的
CD-ROM來決定所要填入的設備名稱。如果成功的話,你可以到/slack的目錄下,看看是
否有看到CD-ROM中的檔案內容。接下來,請輸入setup這個命令。這時你會看到一個選
單,上面有數個選項:
一般而言,你應該要按照下面的順序來一一執行。

1.Addswap。如果你有照我前面所寫的那樣做了一個硬碟分割區給swap使用的話,那麼
  你就應該執行這個選項。當然,如果你沒有swap分割區的話,你就可以省略這一步。
  只要你的記憶體沒有少於8MB的話,應該都可以正常的完成整個的安裝過程。如果你
  選了這個選項的話,它會列出所有可以用來做swap的分割區。你選擇好你要的分割
  區之後。它會問你要不要format這個分割區。雖然會花一點點時間,不過還是選要
  format。
2.Target。這個選項是要選擇你要把Linux安裝在什麼地方。也就是將你前面分割給
   Linux 所使用的分割區指定給setup程式使用。舉例來說,我們前面分割了
   /dev/hda1給Linux 使用,所以我們在這邊就是選擇/dev/hda1來做為我們的Target。
   在選擇後,setup會問你要不要format這個分割區。因為我們前面沒有做過任何的
   format的動作。所以我們在這邊選YES。setup可能還會問你像是inode的問題。基
   本上,這些問題回答預設的值就可以了。如果你有建立其他的Linux分割區的話,
   你也可以將他們掛上來。像是你可以為你的/usr目錄下面的檔案另外劃分一塊分割
   區。
3.Source。這個選項是要選擇你的Linux檔案從何而來。基本上,Slackware提供了四
  種媒體的安裝:硬碟,網路(NFS),軟碟,CD-ROM。很明顯的,在這裡我們是要用
  CD-ROM來進行我們的安裝。不過我們在這裡並不選擇透過CD-ROM來安裝。因為我們
  前面已經將CD-ROM掛上系統了,所以我們現在要選擇使用"Install from a 
  pre-mounted directory"。接著,setup程式會問你該目錄所在的地方為何? 如果
  你前面的步驟都是按照筆者的說明一步一步的做下來的話,那麼你現在應該要輸入
  /slack/linux/slakware接下來它會問你要不要選擇disksets,也就是下面的步驟。
4.Disksets。還記得我們在前面所題到的磁片集嗎﹖這邊就是讓你選擇你所要安裝的
  磁片集。你可以使用上下鍵來移動畫面,同時使用空白鍵來選擇你要的磁片集。如
  果在該磁片集前面的中括號中有大寫X字母的話,表示這是要安裝的磁片集。
5.Install。現在就是要將你所選擇的磁片集安裝到你指定的硬碟裡面去了。這個可能
  要花掉相當長的時間(如果你什麼都裝的話)。在你開始確定要裝之前,setup會先問
  你要使用何種的提示方式。一般而言,我們都是選normal。如果你怕麻煩的話,也
  可以選擇 none這個選項。這樣就話什麼都安裝了。如果你選擇none的話,可以去
  吃個飯再回來看安裝結果。安裝好後,setup會問你要從何處載入kernel。這個步驟
  可以選擇SKIP來跳過。

如果沒有意外的話,你應該可以正常的安裝完畢。然後Linux,就會問你要不要設定你
的系統。你應該選擇要。接下來你會看到下面的設定的問題:

1.首先,setup會問你要不要做一張開機片,請準備一張已經格式化過的磁片,將它放
  入你的軟碟中,然後按下ENTER。
2.接下來是設定你的modem的設備。如果你有使用modem的話,就請依照提示來設定。
  如果沒有使用modem的話,就請選擇no。特別要注意的是modem的設備名稱分別是
  cua1,cua2  ,cua3,cua4。也就是com 1到com 4。
3.再來是設定你的mouse。請依照你的mouse的種類來選擇正確的滑鼠。然後依照你的滑
  鼠所連接的設備名稱來選擇正確的設備。
4.設定CD-ROM。同樣的,請依照你所使用的CD-ROM來設定。
5.設定螢幕字形。這個部份不是很重要,可以跳過。
6.接下來就是設定LILO了。LILO的設定成功與否關係到你的Linux系統能不能開機。所
  以請務必小心設定。基本上你應該按照下面的順序來安裝LILO:
    (1) Begin。首先setup會問你要不要幫LILO加入一些參數,通常除非要LILO指定一
       些設備的話,否則都直接按ENTER跳過。接下來會問你要將你的LILO安裝在何處
       。如果你沒有使用其他Boot manager的話,你不妨把LILO安裝在MBR上面。如果
       你有使用其他的boot manager(像OS/2的boot manager),你應該要將LILO安裝
       到Super Block上面。然後是問你要在開機的時候暫停多久,這個請依照你自己
       的喜好來決定。筆者自己是設30秒。 
    (2) Linux,OS/2或DOS。當然你一定要選擇Linux了。不過如果你有其他的像OS/2 
       或是DOS等作業系統的話,你可以在這邊將他們選入。
    (3) Install。選下這個選項後,就會開始安裝LILO了。沒有意外的話,應該可以
       很順利的安裝起來。
7.在下來是設定網路,關於這一部份如果有遇到任何的問題請向你的網路管理者詢問。
  一般只要你有設定過TCP/IP網路的話,這裡面的問題都應該沒有問題。
8.設定GPM。這個程式可以讓你在console中使用mouse來進行copy&paste的動作。如果
  你覺得有需要的話,就選yes。
9.接下來就是設定sendmail了。請依照你的機器的情況來設定。一般都是使用SMTP+
  BIND。
10.接下來是設定你的系統時區。你應該可以在裡面找到ROC這個地方。這個就是
   Republic Of China了。當然就是選它囉。
全部做完了之後,你就可以選擇EXIT,來離開setup程式。然後使用 shutdown -r now 
或 sync; sync; sync; reboot來重新開機。這個時候請別忘了將磁片取出。用硬碟來
開機。如果正常的話,你應該就可以看見Login的畫面了。當你開始用這個系統之前,
你還有兩件事要做。第一就是重新compile你的kernel。第二就是使用xf86config來設
定你的X Window。當你做完這兩件事之後,基本上你的Linux就算安裝完成了。






------------------------------------------------------------------------






                                                        
--------------586E36D9105D
Content-Type: text/plain; charset=us-ascii; name="SlackwareFAQ.TXT"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline; filename="SlackwareFAQ.TXT"

Slackware FAQ, last revised: 5 November 1994

These are questions people ask me quite often. Hopefully now that they're
answered here that won't be the case. :^)

-----

Q: When I installed Slackware, the system could see my CD-ROM just fine.  But,
   when I try to boot using LILO or the bootdisk the system doesn't find the
   CD-ROM drive anymore!  How can I fix this?

A: The problem is probably that you used a bootkernel disk with support for you

   CD-ROM drive, but didn't install a kernel with support.  If you have a 
   non-SCSI CD-ROM drive, or a SCSI CD-ROM drive on a controller with alpha
   (experimental) support, then you may need to use a kernel from the Q disk
   series that contains the proper support.

   You can use the same bootkernel disk you installed the system with to get
   into your machine.  Use a command like this on the LILO prompt, but replace
   the root device name with the one you used on your machine:
 
   mount root=/dev/hda

   Once you're logged in, you need to install a new kernel.  Use pkgtool or
   installpkg to install it:

   cd /cdrom/slakware/q4   (or possibly another directory with kernel packages)
   installpkg mitsumi.tgz  (this one has Mitsumi CD support)

   You'll need to install LILO, build a bootdisk, or have Loadlin boot the new 
   kernel before it will work.  See the question below about "I just built a 
   new kernel..." (The kernel packages install the kernel as /vmlinuz, not 
   zImage, so use /vmlinuz wherever the answer mentions zImage.)

   NOTE: for the best possible results, you need to compile a kernel that only
   contains drivers for the hardware you have.  If you're ready to tackle that
   task, zless /usr/doc/faq/howto/Kernel-HOWTO.gz on your installed system.

-----

Q: I got a PROBLEM_WITH_INEWS_DOMAIN_FILE!

A: Then set your hostname in /etc/NNTP_INEWS_DOMAIN.

-----

Q: Why do I get "network unreachable" under Slackware?

A: There are a couple of possibilities. For most users, things work right out
   of the box. However, if you're running into this problem here are two
   workarounds you can try:

   1. Reverse the broadcast and netmask arguments (and their variables)
      in the call to ifconfig in /etc/rc.d/rc.inet1. Make sure you are
      not trying to route your own IP address - you shouldn't have to.

   2. Make sure /etc/networks is properly configured.

   3. You may want to try the 'netconfig' script (in the package netcfg.tgz).
      It's not perfect, but does a pretty good job. 

   4. Make sure the kernel you're using supports your hardware.  Most of the
      kernels provided with Slackware include a /boot/config.in file where you
      can look up the compilation options.

-----

Q: Why the $%#@! isn't my UltraStor SCSI detected? It works under DOS!

A: Set the I/O address to 0x340 instead to 0x330.
 
   For any hardware that doesn't work, a good rule is to try playing around
   with the IRQ and I/O settings on it to see what happens. If your system
   is up and running and you're having problems with a CD-ROM or tape or
   something like this, you can always look around for the driver source in
   /usr/src/linux/drivers... really, it won't bite!  Often, the source 
   contains important documentation, such as the default IRQ settings for
   that type of device, and the major number for the entry in /dev. Also,
   try other bootkernels and see if that helps.

-----

Q: My large (> 1/2 gig) IDE drive reports more than 16 heads, and as a 
   result Linux won't install on it. What can I do?

A: See the file EIDE.TXT for instructions on how to make it work. (Thanks to
   Bob DiMarco for forwarding this to me, and Patrick LoPresti for compiling
   the information in the first place)

   Note that newer kernels (> 1.1.40) will do this translation for you 
   automatically, and thus make the workaround unnecessary. Once these new
   kernels make it into the Q series, you should probably use one of them if
   you have an EIDE drive and want to avoid the whole problem.

-----

Q: How do I make a Slackware bootkernel disk with this new kernel I made?

A: OK, well you grab an existing one like the "bare.gz", put it on a floppy,
   and do this:

   mount /dev/fd0 /mnt (this mounts it)
   cat zImage > /mnt/vmlinuz (put the new kernel in place)
   rdev -R /mnt/vmlinuz 0    (mount read-write)
   rdev /mnt/vmlinuz /dev/fd0H1440   (use that drive, or /dev/fd0h1200)
   rdev -r /mnt/vmlinuz 1440 (set the ramdisk size, or use 1200 with 1.2 meg)
   lilo -r /mnt  (reinstall lilo)
   umount /mnt   (that's it! you're done! :^)

   If you want it to stop and give the message to switch disks, you'll need the
   ramdisk.c patch in /pub/linux/slackware/kernels on ftp.cdrom.com. I have no
   idea if this will still patch into the newest kernels. Otherwise, you don't
   really need it if you're brave enough to just switch the new disk in as soon
   as you see the "Uncompressing Linux..." message. It's always worked for me.

-----

Q: I just built a new kernel. Now how to I go about replacing my existing
   kernel with this new zImage file?

A: First, you must prepare the new kernel. If you're using UMSDOS, you'll want 
   your system to boot read-write. Otherwise, you'll want it to boot read-only
   so your filesystems can be safely checked. So, do this:

   For UMSDOS:
      rdev -R zImage 0
   For any other filesystem type:
      rdev -R zImage 1

   Then, you'll need to set the root partition. For example, if your root 
   Linux partition is /dev/hda2, you'd do this:
 
      rdev zImage /dev/hda2

   Then, you can set a video mode if you like. As an example, this sets normal
   80x25 console mode:

      rdev -v zImage -1

   Other modes include:  -3 = Prompt, -2 = Extended VGA. You might need to 
   remove a line in your /etc/lilo.conf that forces normal video if you use
   LILO and wish to try an extended video mode.

   Next, you need to install the kernel. If you boot from a floppy disk, you
   can simply stick a formatted floppy into your drive and write the zImage
   to it like this:

   cat zImage > /dev/fd0

   If you use lilo, you should copy the zImage to where your lilo.conf expects
   it to be and then reinstall lilo. This should work if you used Slackware's
   liloconfig script to set up LILO. (this is the script setup uses)

   cp zImage /vmlinuz ; lilo
  
   You may wish to back up your existing /vmlinuz first.

   If you use Loadlin, copy the kernel to your DOS partition where Loadlin can
   see it (if you use UMSDOS, you won't need to do this).  Then, start Linux
   from DOS like this:  

     c:\loadlin\loadlin.exe c:\linux\vmlinuz root=/dev/hda2

   That should do it.
   
-----

Q: Why can't I cut and paste from elvis (vi) in an xterm?

A: Later versions of elvis use the mouse for cursor positioning instead. If
   you want to cut and paste, hold the left shift key down while you use the
   mouse.

-----

Q: Why doesn't my bus mouse work? The kernel, selection, the
   X server and test-mouse all say "no such device."

A: The kernels distributed with Slackware don't have the drivers for
   busmice compiled in. Last time I tried to include all of them there
   were horrible driver conflicts -- better to leave them out if they
   can't coexist.  Obviously, it's not feasible for me to provide 
   versions of every precompiled kernel for each type of busmouse. I 
   only have a 386. ;^)

   The solution is to get the kernel sources, configure the kernel to 
   support the your type of mouse and no other mouse devices, and rebuild
   it. Documentation on how to do this is included in the kernel
   source, i.e. the kernel.tgz package found in the D series. You will
   also need at least the gcc.tgz, include.tgz, libc.tgz, and binutils.tgz
   packages from the D series to rebuild the kernel.

-----

Q: I see my SoundBlaster/Panasonic CD-ROM detected at boot, but I can't
   install from it or mount it. What's going on?

A. Try setting to drive's ID to 0. This is expected by the install disks.
   There should be a jumper on the back of the drive that selects this --
   just move it to the leftmost position.

-----

Q: I'm using UMSDOS and would like to use the same swapspace under Windows
   and Linux. Can this be done?

A: If you want to share a Linux-UMSDOS swapfile with MS-Windows, you can
   do the following:

   1. Create PERMANENT(!) swap file in MS-Windows with size NNNN kbytes.
   2. In /etc/rc.d/rc.local add the following lines:

   rm -f /DOS/windows/spart.par  <--- Needed in order to suppress
                                      Windows complain on next start!
   mkswap /DOS/386spart.par NNNN
   sync
   swapon /DOS/386spart.par

   3.In /etc/rc.d/rc.0 add "swapoff" for this file.

-----

Q: What's the password for root on the install disk?

A: There isn't one. If you're asked for one, it usually means that you
   don't have enough memory to install.

   To help work around this, look in your CMOS settings and make sure you don't
   have any ROM shadowing enabled. ROM shadowing wastes memory and won't
   improve the performance of Linux. Also, make sure you're using the smallest
   bootkernel disk you can. For example, you don't need to use "scsinet" if
   you're not installing to a SCSI drive via NFS. Use something small -- the
   "bare" disk if you can get away with it. Some people mistakenly think they
   need to use a bootkernel disk with network drivers if they plan to use
   networking after installation. Not so! The drivers on the bootkernel disk
   have no impact on what you can use *after* installation -- in almost all
   cases you won't be running the same kernel on your installed system as
   you used to install it.

-----

Q: How can I install and remove software now that the Slackware Linux 
   distribution is installed on my machine?

A: To remove packages, type "pkgtool" and follow the prompts. Pkgtool will
   also allow you to add packages that are in the current directory.

   The preferred way to install software is with the "setup" script.
   When you do your initial installation, setup puts a copy of itself in your 
   /sbin for future use. You can also add software to your machine using the 
   boot/install disk, if you really want to. 

   When adding software to a running system via NFS, it is preferable to
   mount the partition yourself and then use the 'install from a mounted
   directory' feature of setup.

   There are also command line utilities that allow you to create, install,
   and remove packages. For these, you should refer to the manpages:
   installpkg(8), removepkg(8), makepkg(8), explodepkg(8). A simple example
   of how you would install a package with installpkg:

   installpkg package.tgz

-----

Q.  How do I know what files setup/pkgtool/installpkg is putting where ?

A.  Look around in /var/adm/packages.
    Similarly, you can find installation scripts for each package in 
    /var/adm/scripts.

-----

Q: I set my partitions to "Linux native" but Slackware still won't detect
   them! What can I do?

A: This problem is rare and I still don't know what causes it.

   [ Note that this is not the same problem that usually affects the IBM PS/1,
   Thinkpad, and similar machines that do not detect the harddrive. If you've
   got one of these machines, and fdisk is giving you problems, your answer is
   still ahead :^) ]

   Here's a workaround you can use to install anyway:

   1. Start tty12 or tty144 using one of the bootkernel disks.
   2. Make and format partitions for Linux.
   3. Mount the target partitions under /mnt.
   4. Type "setup -target_mounted"
   5. Follow the rest of the instructions to install.
   6. Type "vi /mnt/etc/fstab" and enter an appropriate fstab.
      As an example, here's what mine contains:

/dev/hdb2   swap    swap   defaults 
/dev/hda2   /       ext2   defaults
/dev/hda3   /usr    xiafs  defaults 
/dev/hda1   /dos    msdos  defaults 
/dev/hdb1   /os2    msdos  defaults 
none        /proc   proc   defaults

   To give you some more info about this file, the first field is the
   partition to be mounted, the second is where it should be mounted, the
   third is the filesystem type, and the last field is the options to use.
   Unless you're a Linux wizard, just set this to "defaults".

   Other things to remember about this file:
      - Make sure that you list the root partition before any other partitions
        that are mounted beneath it.
      - Add the /proc line, or "ps", "w", etc, won't work.
      - It's a good idea to put a blank line at the end of the file, as I've
        had reports that partitions listed on the last line might not be 
        mounted.

   7. Once you've made and saved this file you can reboot with ctrl-alt-delete.

-----

Q: I have a (PS/1 || Valuepoint || Thinkpad), and can't install because fdisk
   can't see my hard drive. How can I get around this?

A: You'll need to enter your drive parameters at the bootkernel prompt. You
   can even specify the geometry for your second IDE drive by supplying a
   second  hd= parameter right after the first one. 

   When you boot the bootkernel disk, you'll see more information about the
   format used to pass your drive parameters to the kernel at the LILO prompt
   and allow your drive to be recognized.

   You'll have to edit your lilo.conf file to add a similar hd= flag if you
   want LILO to work. Add this as the TOP line in the file:

   append="hd=cyl,hds,secs"

   Where "cyl", "hds", and "secs" are the number of cylinders, sectors,
   and heads on the drive.

   If you have two IDE drives, specify both drives (like this):

   append="hd=967,13,31 hd=944,14,40"

-----

Q: Why do my /etc/issue and /etc/motd keep resetting themselves at boot time?

A: The /etc/rc.d/rc.S resets them out every time you boot after figuring out
   which kernel you're running -- otherwise the kernel version printed at login
   might not stay current.

   If you want to write your own /etc/issue and /etc/motd, you need to comment
   out that part of /etc/rc.d/rc.S.

-----

Q: Emacs dumps core, complains of a missing library, or lacks X11 support! Why?

A: The GNU Emacs series includes your choice of a version with X11 support, or
   one without. Make sure you have the right binary for your machine. 

   The binary supporting X11 is installed as part of a package on the first 
   disk that you'll need to install whether you want X11 support or not. If
   you DO NOT want X11 support, install the package 'emac_nox.tgz' on the last
   disk of the Emacs series.

   If you just install all of the disks, you don't get X11 support. It had to
   be one way or the other, so if you're not paying attention when you install
   at least this way it will run no matter what.

-----

Q: Why do my compiles sometimes die with 'signal 11: internal compiler error'?

A: This indicates a hardware problem in about 99% of the cases. It can usually
   be fixed by increasing the number of wait states in the CMOS settings. It
   can almost always be fixed by turning off the RAM cache, but this should be
   your last resort since it will cause a noticeable slowdown.

-----

Q: How can I change (or get rid of) the color ls?

A: Read the man page, and check out the file /etc/DIR_COLORS. You can
   configure the colors any way you like, or shut them off entirely. Also, you
   can copy /etc/DIR_COLORS into your home directory as '.dir_colors' to 
   override the global defaults on a user by user basis.

-----

Q: I start X with "openwin" and it works OK, but I can't switch virtual
   consoles. Why?

A: On a Linux text screen, you switch virtual consoles with Alt-F1 through 
   Alt-F8. Under XFree-86, you must use Ctrl-Alt-F1 through Ctrl-Alt-F8. 
   Another useful 'secret' key combination is RightShift-PgUp/PgDown for
   scrollback. (a random amount ranging from none to a few pages, depending
   on the state of your video text buffer memory)

-----

Q: Why can't I use the new ghostscript with X?

A: Make sure you have gs_x11.tgz from disk XAP1 installed.

-----

Q: I can't get anything to work at all! What's the deal?

A: If you seem to suffer catastrophic failure (!), then check the file FILE_LIS

   on ftp.cdrom.com in /pub/linux/slackware against the contents of your disks
   and make sure you're not missing any files. 

   Also, I've noticed that most of the reports of kernel panics and system 
   hangs have come from people with 4MB. If you're running into these types
   of problems I'd suggest forking over the $$$ for 4 more meg. I have 8 MB of
   RAM and never have crashes. (well, only when I really push my luck)
   If you don't want to do that, then go through your /etc/rc.d/rc.* files and
   get rid of any daemons you don't use, like crond, lpd, or selection.

   If you've got 4 MB and you're getting 'virtual memory exceeded in new'
   warnings, make sure you set up and activate a swap partition before running
   setup. If you're really hard up on memory, you can boot a rootdisk using
   'editroot' instead of one of the usual boot kernels. This will mount the 
   floppy in the root drive, and you'll have to install from the other drive
   or from the hard drive. You will also not be able to create any kind of boot
   disk, so you'll have to install LILO and take your chances. I only suggest
   using this approach if a swapfile will not work.

-----

Q: How do I make a bootkernel disk that uses a custom kernel?

A: Look in the ./kernels subdirectory. You'll find complete instructions
   on how to make them in there.

-----

Also - at ftp.gwdg.de:/pub/linux/install-mount/slack-info are some more
networking hints.

In addition, the LDP people have put out an excellent set of manuals that I
may include in a future Slackware release. These are available on
sunsite.unc.edu in /pub/Linux/docs/LDP.

---
Patrick Volkerding
volkerdi@mhd1.moorhead.msus.edu
volkerdi@ftp.cdrom.com
--------------586E36D9105D
Content-Type: text/plain; charset=iso-8859-1; name="X-WINDOW使用手冊.txt"
Content-Transfer-Encoding: 8bit
Content-Disposition: inline; filename="X-WINDOW使用手冊.txt"


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

        ┌───────────────────┐
        │      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 STAT  TIME 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 系統啟動的畫面         │
         └────────────────┘


5.1.1 xinit 的內部操作:

    首先, xinit 啟動Xserver程式在你的顯示器上執行, server建立一個
它自己的根視窗, 並把視窗的背景色設定成灰色, 把游標設定成一個大 "X".

    在server執行的期間, server一直控制著鍵盤及滑鼠, 這就是你能在螢
幕上移動游標的原因, 但是因為目前沒有任何client程式要求告知鍵盤和滑
鼠 "事件",所以server只是追蹤滑鼠游標的移動, 而所有其它的鍵盤或滑鼠
輸入雖然都經過server處理但均被放棄, ( 因為沒有client程式有興趣 ),
這就是按鍵盤或滑鼠按鈕沒有反應的原因.

    接下來, xinit 啟動xterm 程式執行, xterm 對server而言是一個client
程式, xterm 要求server建立一個視窗, 而且保持告知在這個視窗中的滑鼠
和鍵盤事件, xterm 設定在視窗中執行一個shell , 當指標移至視窗之內便
準備接受輸入.

    鍵盤輸入被送至shell 就如同在一部真的終端機上輸入一般, 從shell
( 及其副程式 )的輸出藉著xterm 顯示在視窗上, xterm 也接受滑鼠輸入,
使得你能設定不同的程式操作參數和進行本文的剪貼 (cut and paste ) .

    你可以觀察到系統執行這些動作的步驟, 例如當在系統啟動後, 在xterm
視窗內執行 ps a 命令:

    PID TT STAT TIME COMMAND
    1900 C0 S 0:00 xinit
    1901 C0 S 0:01 X:0
    1902 C0 S 0:01 xterm -geometry +1+1 -n login -display unix:0 -c
    1903 p1 S 0:00 -sh (csh)
    1904 p1 R 0:00 ps

以上的顯示說明xinit 在主控台(console )顯示器上被啟動,它初始化server
,X顯示為零。接著xterm 在一個虛擬(pseudo)的終端機上執行,xterm 啟
動一個shell 執行,使得它能處理你在xterm 視窗所下的命令。最後,我們執
行ps命令產生上述的列表。

    我們將在第8章討論更多的xterm 細節, 從現在起, 我們假設xterm 被視
為一個DEC VT102 的終端機, 我們把重點轉移到系統啟動之後, 我們能做些什
麼.


5.2 如何執行一些X程式

    你目前有一個X server 控制的顯示器,一個叫xterm 的client程式,允
許你輸入命令,本節告訴你如何執行其它的X程式。

    因為X的client程式和X server 完全獨立,所以不需要特別的動作啟動
它們,你可以像執行一般的程式一樣執行它們。但是這些client程式需要確實
知道它們用的是那一個顯示器。實際上因為xterm 一開始設定了DISPLAY 環境
變數,給定了它使用的顯示器名稱,而其它的client程式用此當作預設顯示器
,因此你不需多做其它的事。


5.2.1 如何執行X的時鐘,xclock

    我們用X的時鐘當作一個簡單的範例,先確定指標停在xterm 視窗中,然
後輸入命令:

    xclock

一個小的時鐘影像出現在螢幕左上角,覆蓋了第一個視窗一部份,如圖 5 - 4

         ┌────────────────┐
         │                                │
         │        p51   fig 5.4           │
         │                                │
         │                                │
         │                                │
         │圖 5 - 4 xclock 啟動後的畫面    │
         └────────────────┘

現在有三個問題要克服:

    第一個問題:由於xterm 這個 "終端機" 已經有一個程式(xclock)在執
行,所以我們無法再輸入其它的命令,該怎麼辦?

    唯一的辦法就是停掉xclock,但當你按下ctrl-c或DEL 鍵時,xclock便會
消失,要克服這種狀況,你需要非同步(asynchronously)執行xclock,用命令:

        xclock  &

則目前xterm 至少能接受你輸入其它的命令。

    第二個問題:如何中止xclock?

    X server 本身沒有提供直接的介面中止應用程式,但是有一個叫xkill
的client程式可讓你殺掉應用程式,在xterm 視窗內輸入xkill 命令便可啟動
這個程式,xkill 會顯示一個覆蓋性的方形游標(draped box cursor ),見
圖5-5 ,移動這個游標到任何你想殺掉的應用程式的視窗中,碰觸左按鈕,應
用程式的視窗會消失且應用程式和xkill 會一起結束,你也會得到如下的訊息:

    xkill:killing creator of resource 0x40004d
    XIO:fatal IO error 32 (Broken pipe) on X server "unix:0.0"
    after 207 requests (178 known processed) with 0 events remain-
    ing.
    The connection was probably broken by a server shutdown or kill-
    client.

         ┌─────────────────┐
         │                                  │
         │        p52   fig 5.5             │
         │                                  │
         │                                  │
         │                                  │
         │圖 5 - 5 xkill的覆蓋性的方形游標  │
         └─────────────────┘

如果為了某些緣故你無法進到應用程式的視窗內用xkill 中止它,你通常可以用
UNIX的辦法:找出process 的ID,然後殺掉它,例如:

    $ps a | grep xclock
    1907 p2 I 0:00 xclock
    1909 p2 S 0:00 grep xclock
    $kill 1907
    [1] Terminated xclock
    $

    第三個問題:如何避免時鐘和xterm 視窗重疊?

    這個問題換個問法是:你如何安排應用程式視窗的位置?

    你可以用前一章說明過的 "geometry" 的參數來解決,例如輸入命令:

        xclock -geometry 200x300+400+500 &

這個命令告訴xclock建一個寬200 高300 個像素的視窗,位於螢幕左上角右邊
400 個像素,下邊500 個像素。

    以上的三個問題都解決了,下一章會介紹更巧妙的解決方法。

使用彩色

    如果你擁有彩色顯示器,那麼不妨以xclock進行你指定和使用彩色的實驗,
xclock有數種選項做彩色識別:

    -bg color   設定背景顏色

    -fg color   設定前景顏色

    -hd color   設定時鐘指針的顏色

    -hl color   設定時鐘指針邊線的顏色

輸入指令:

    xclock -bg turquoise -fg red -hd magenta

你可以看到一個彩色的鐘,稍後我們會再說明顏色的正確使用名稱。

    xclock啟動之後,便不再需要和使用者交談(interaction ),下一節我
們將介紹另一個需要從鍵盤和滑鼠輸入的小程式。


5.2.2 xcalc - 桌上型計算器

    xcalc 是一個X的計算器,移動指標到xterm 視窗,輸入命令:

      xcalc - geometry +700+500 &

一個像TI-30 型計算器的視窗出現了(如圖 5 - 6),你可以用滑鼠或鍵盤
來操作它。

         ┌────────────────┐
         │                                │
         │        p54   fig 5.7           │
         │                                │
         │                                │
         │                                │
         │圖 5 - 6 xcalc 桌上型計算器     │
         └────────────────┘

    使用滑鼠時,你可以移動指標到你需要的計算器按鈕,按滑鼠左按鈕表示
按下按鈕。如果是用鍵盤時,鍵盤上的一些鍵明顯的對應計算器按鈕,例如依
序按鍵盤鍵1 ,+ ,2 ,+ ,3 和 =鍵,代表了算1 ,2 ,3 的總和,由於至
少目前你可以用指標指到計算器的任一按鈕,因此鍵盤和計算器那些比較不明
顯的對應關係,在此不作進一步說明。

    xcalc 比 xclock 有一個優點,那就是容易中止它。在計算器AC按鈕上碰
觸滑鼠右按鈕即可中止,大部份的X應用程式均有類似的中止設備。


5.3 關閉X

    要關閉X視窗,只要移動指標到最初xterm 的視窗,輸入:

        logout

則視窗消失,server終止,X也被關閉。

    詳細點說,xterm 查覺到shell 終止時,也終止自己,而xinit 一查覺xterm
已經結束,便殺掉server後離開。


5.4 總結

    你現在已能啟動系統、執行程式和關閉系統,所以你可以自行做一些實驗
執行xclock一小段時間,給不同的geometry設定,極度放大或縮小時鐘,擺在
螢幕的任何位置(甚至螢幕之外!)

    在本章中,我們看到了如何啟動程式,如何執行一些視窗應用程式,如何
結束視窗系統。換句話說,你已經能使用系統。

    但是,有許多的功能沒有提供,例如:

    . 重定視窗大小

    . 在螢幕任意移動視窗

    . 將一個視窗從另一個視窗之下移出擺在案頭上(或者把它堆到下面)

    . 用較方便的方法啟動視窗應用程式

    這些以及其它更多的功能並非由基本的X系統提供,而是由下一章我們要
討論的視窗管理器提供。

=====

第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 <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的網路能力,
以便你能儘快用到大部份的系統功能。

=====

第7章  使用X的網路設備

    X的網路特點在於讓你可以在網路上的任何機器執行應用程式,而將其輸
出顯示在你自己機器的顯示器上,這是X最重要的功能之一,但卻很容易使用。

    以下將描述你如何指定一個遠方終端機,如何實際使用這些功能,最後,
我們再描述如何在網路上從其它的機器上控制或限制存取你的顯示器。


7.1 指定一個遠方終端機 -- -display  選項

    幾乎所有的X程式都接受以一個命令列的選項來指定使用哪一個顯示器 (
換個說法,連接到哪一個X server ),這個選項的格式為:

    -display displayname

讓我們更進一步討論顯示器名稱(displayname)的格式。

    你會告訴程式它的輸出是哪一個顯示器 (網路上任何你可以選擇的顯示器)。
明顯地,網路上指定機器的名稱一定包含在內,但不止於此,因為一些 (大型)
機器可以有好幾個I/O 工作站,每一個工作站又擁有自己的鍵盤,滑鼠等等;
尤有進者,一個工作站還可能控制了好幾部終端機。綜上所述,顯示器名稱需
要包含三個元素,hostname,display number和screen number ,我們將詳細
解釋並舉例說明。


7.1.1 Hostname

    hostname是在網路上與顯示器直接連接的機器名稱,hostname也決定了應
用程式和server是如何連接的。簡單地說:

    假使Server在你自己本地的機器上執行,你有兩種選擇:

    1.  省略掉hostname,系統會選擇最有效率的方式和server交談。

    2.  定hostname為"unix",系統將用Unix domain sockets 作通信。("Unix
        domain" 意指socket用傳統Unix檔案名稱 (例如/dev/urgent)來命名. )
        在命名之後需加一個冒號(:), 即使你省略hostname,你仍需要加冒號。

    假使Server在遠方的機器上執行,你一樣有兩種選擇,依你網路上用的通
    信系統而定:

    1. TCP/IP :大多數的Unix系統使用此種通信方式, 簡單的方法是用在你
       區域網路上已知的normal name (例如"venus" 或"saturn ")。你也可
       以用 full Internet name (例如"expo.lcs.mit.edu"或它的
       Internet address "129.89.12.73")。在 name 後,需要加一個冒號。

    2. DECnet :用你連接到的機器上的DECnet nodename,在hostname加兩個
       冒號(::).


7.1.2 display number

    顯示器是一組監視器,螢幕,連接一個鍵盤和滑鼠的邏輯螢幕的組合。換
句話說,即是使用者工作的地方,在一個給定的CPU 上,顯示器從 0開始編號,
display number即是指哪個編號的顯示器被使用,即使display number為 0,
也不可省略。


7.1.3 screen number

    對於連接到顯示器上數個螢幕也被從 0開始編號,screen number 為你使
用螢幕的編號,和display number以一個句點 (.)隔開,screen number 為 0
時可省略,若省略時,其前面的句點一併省略。


7.1.4 範例

    以下為一些顯示器格式的範例:

    . 假設為本地的機器,預設螢幕為 0,以下二者均可:

          unix:0
          :0

    . 假設你指定你自己的機器 (通常是venus),但你需要檢驗TCP/IP網路的
      操作和明顯地指定螢幕:

          venus:0.0

    . TCP/IP網路上,遠方的機器名為pluto ,僅有一個顯示器,指定screen
      number為 0:

          pluto:0.1

    . DECnet網路上,display number為 1,預設screen number 為 0:

          vomvx2::1


7.2 實際上使用遠方的顯示器

    我們已知如何指定遠方的顯示器,現在來練習一下:假設你是在venus 工
作,想要在saturn上執行一個例如是xterm 的應用程式。你必須在saturn執
行xterm 且指定venus 的顯示器,則命令如下:(為了清楚起見,本節中我們
的命令列包含了命令列前shell 對機器名稱的提示)

        venus% xterm -display venus:0.0        (注意:不完整!)

    以上的指令是在本地的機器啟動xterm ,並非在遠方的機器啟動,不符合
需求。

    如果在你的作業系統上,並未支持遠方機器的操作,你可以藉著連接到
saturn的終端機輸入下面的命令:

        saturn% xterm -display venus:0.0       (注意:不完整!)

則xterm 會在saturn啟動,在venus 上建立視窗,視窗會向venus 的滑鼠和鍵
盤取得輸入,這的確是你想要的,現在你可以回到venus 機器開始工作。

    但由於你的作業系統事實上支援遠方機器的功能,所以你毋需離開你的機
器便可完成上述的指定,命令如下:

        venus% rsh saturn xterm -display venus:0.0

以上是利用普通的遠方 shell的設備程式 -- rsh。

注意 1:命令可能因saturn不被允許存取venus 的顯示器而失敗,欲克服此種
        狀況,輸入命令:

        venus% xhost +

        後再試一次。(xhost命令下一節會解釋)

注意 2:你可能需要非同步地執行rsh ,在命令列之後加 &,以背景工作方式
        執行, 但可能因為等待永遠不會有的輸入,shell 和rsh 間的交談導
        致 rsh "block",為了克服此種情況,需修正命令為:

        venus% rsh saturn xterm\
        -display venus:0.0 < /dev/null &

        遠方的機器 (這個例子是saturn) 並不需要有X server 在執行,甚
        至不需要有位元映像顯示器,唯一的需求是能執行應用程式和支援網
        路通訊。

    現在總結你的工作模式為:在遠方的機器上執行應用程式,連接回自己機
器上的顯示器,其架構圖見圖7 - 1。

             ┌────────────────┐
             │                                │
             │  P81   FIG 7.1   (???)         │
             │                                │
             │                                │
             │                                │
             │圖7 - 1 遠方的 client顯示器對   │
             │        本地 server架構圖       │
             └────────────────┘



7.2.1 一個易發生的錯誤

    如果你搞混了而一開始下了這樣的命令:

        venus% xterm -display saturn:0.0           (不正確)

什麼事會發生?假如這命令被接受,xterm 在你本地的機器上執行,而在遠方
的機器saturn上建立視窗,你在你的螢幕上只能看到shell 讀到的命令列,其
它什麼也沒有,系統是正確的工作,但不是你想要的。

    如果你很幸運,你可能因不被允許或saturn上並沒有server在執行,以致
無法和saturn上的server連接上,xterm 會傳回一個類似下列的訊息而結束:

        X Toolkit Error: Can't open display.

如此你就知道有錯了。


7.2.2 設定預設顯示器

    如果你不明確地指定顯示器名稱,程式會以Unix環境變數DISPLAY 來決定
使用哪一個顯示器,在啟動xterm 時,系統會設定這個變數的內容,所以大部
份情況下,你什麼都不必擔心。

    如果你remote-login其它的機器,在其間你執行X的應用程式,並希望回
到你自己的機器上顯示,那你必需明確地設定DISPLAY 變數,類似下面:

        venus% rlogin saturn
        Last login: Mon Nov 28 20:01:02 on console
          ...            (在遠方機器上的login banner)
        saturn%          (遠方機器上的shell 提示)
        saturn%  setenv  DISPLAY  venus:0.0
        saturn%  xcalc  &

換句話說,如果不設定DISPLAY 變數,則在saturn上執行的每一個X程式都必
須包含 -display venus:0.0 選項。


7.3 控制存取你的顯示器 -- xhost

    我們前面提到過有時你無法連接到特定的顯示器,通常的原因是你沒有被
許可,所以X否認你的存取。

    X用很簡單的結構控制存取:你指定一份可以存取你的顯示器的主機(host)
名單,在這些主機上執行的應用程式均可存取你的顯示器,其它不在名單上的
主機則不被允許。你可以用xhost 程式來控制存取:

        允許一或多個機器存取:

            xhost + host1 [+host2...]

        去掉允許一或多個機器存取:

            xhost - host1 [-host2...]

        所有的機器均被允許存取:

            xhost +

        換言之,所有的存取控制均被解除。

        恢復存取控制:(通常因為曾經下了xhost + 的命令)

            xhost -

        再度取得對存取的控制,只有先前明確地被允許的機器可供存取。

    注意:存取控制應用於所有的處理 (process),而不只是針對其他使用者
          所啟動的處理,所以如果你透過遠方的機器執行應用程式,而將顯
          示內容傳回自己的機器,則你必需被授與存取權,否則會連接失敗。


7.4 總結

    本章中,我們討論了如何指定X程式的顯示器,如何實際在網路上應用,
如何允許或禁止網路使用你的顯示器。

    現在,你已經會使用網路,並且知道有一個視窗管理器會控制你的顯示器;
我們轉而討論xterm ,並看一看它所提供應用程式介面的細節。

=====

第8章 終端機模擬器 - 細說 xterm

    xterm 是終端機模擬器 - 它是一個可以使X應用程式視窗看起來像普通
終端機一樣的程式, 而無需知道有關視窗系統的功能. 我們已經使用過 xterm
的一小部分, 在本章中將更深入地探討它所提供的特殊額外功能. 並且說明許
多X程式共通的一些應用程式介面的面貌.

    xterm 模擬一個 "啞終端機 (dumb terminal)", 但它也提供許多一般終
端機沒有的功能 :

    . 設定終端機模式與特性的突現式 (pop-up) 選單

    . 可以上下移動螢幕影像的捲動棒 (scrollbar) - 當文字列因螢幕捲動
   而消失時, 可以將它拉回.

    . 模擬 Tektronix 4014 終端機.

    . 可選擇性地記錄螢幕列到一個使用記錄檔 (log file).

    . "剪"(cut)"貼"(paste)文字區塊.

    . 可選擇文字顏色, 視窗背景等...

    . 可選擇 VT100 與 Tek 視窗字型.

    . 可設定( 程式化(programmable))鍵盤.

    我們首先描述選擇功能的選單結構, 接著描述如何使用選擇功能.



8.1 選擇 xterm 功能 - 選單與命令列選項

    xterm 有它自己的內建選單結構, 可在使用期間改變設定. 有三個選單可
供利用, 見圖 8 - 1 :

               ┌────────────────┐
               │    p84. fig 8 - 1              │
               │                                │
               │                                │
               │                                │
               │ 圖 8 - 1 xterm 的三個選單      │
               └────────────────┘

  xterm X11 : 這裡的大多數選擇項目為程式控制功能, 例如 : continue pro-
              gram (程式繼續) 或 kill program (殺掉程式). 欲突現此選單,
              必需同時按住 CONTROL 鍵與滑鼠左按鈕.

  modes     : 設定大多數終端機的特性與選擇 Tektronix 模擬功能. 欲突現此
              選單, 須同時按住 CONTROL 鍵與滑鼠中間按鈕 (當處於VT102 視
              窗時).

  Tektronix : 控制 Tektronix 視窗的外表. 當處於 Tektronix 視窗時, 須同時
              按住CONTROL 鍵與滑鼠中間按鈕即可突現此選單.

    選單的操作類似 uwm, 藉著按滑鼠按鈕可突現選單, 不放鬆按鈕移動指標至想
選的項目上; 放鬆按鈕後即選定該項. 然而, 有一點不同的地方是, 不能被選擇的
選單項目 (因為此時選擇將無意義) 是以較淡的型式顯示. 例如: 因為尚未開啟一
個 Tektronix 視窗, 所以Hide VT Window 項目的顏色較淡.

    許多選單的功能也能以啟動 xterm 的命令列選項來設定.(事實上有某些功能僅
能以命令列選項的型式去選擇). 下面幾節我們將告訴你可以設定不同功能的選單選
擇與命令列選項的選擇方式.



8.2 捲動 xterm 的螢幕

    突現 xterm X11 選單並選擇 Scrollbar 項目, 如圖 8 - 2. 高亮度的部分告訴
你兩件事:

  1. 螢幕上的列數與儲存在捲動棒緩衝區 (scrollbar's buffer) 的列數之比率.

  2. 緩衝區的哪個部份目前顯示在螢幕上.

    例如在圖 8 - 2 中 : 約有 20 列在螢幕上; 高亮度部分約為總列數的 5 分之 1,
所以緩衝區包含有約 100 列, 且目前顯示的部分是緩衝區的最底部 (因為高亮度區
在捲動區的最底部).

               ┌─────────────────┐
               │    p85. fig 8 - 2                │
               │                                  │
               │                                  │
               │                                  │
               │ 圖 8 - 2 具有捲動棒的 xterm 視窗 │
               └─────────────────┘

    你可以利用滑鼠按鈕移動捲動區的高亮度部分, 以改變顯示在螢幕上的文字.
下面的小節將會解釋; 為簡化說明我們假設捲動緩衝區包含 100 列文字.

注意 : xterm 採用異於其他視窗系統的捲動棒用法, 特別是 Apple Macintosh.



8.2.1 移動捲動棒到指定點

    假如你想移動本文到某一指定位置, 例如 : 想看第 50 列之後的內容 :

    1. 移動指標到捲動棒. 游標變成垂直雙箭頭. (圖 8 - 3a)

    2. 按滑鼠中間按鈕 : 游標變成水平箭頭 (圖 8 - 3b), 且高亮度的頂端跳至游
       標處.(例如 : 假如你想看的部分從 50 列開始, 你應該將游標移到捲動區
       的中央)

    3. 假如視窗顯示你所要的部分, 則可以放開按鈕. 否則 ...

    4. ... 保持按住按鈕, 移動指標 : 高亮度部分跟隨著指標移動 (而視窗內的
       本文也隨著高亮度區而捲動), 直到放鬆按鈕.

               ┌────────────────┐
               │    p86. fig 8 - 3              │
               │                                │
               │                                │
               │                                │
               │ 圖 8 - 3 游標在捲動區的不同形狀│
               └────────────────┘


8.2.2 向前捲動本文

    捲動視窗內的本文使文字列往上移出螢幕頂端 : 高亮度區向捲動棒底部移動,
視窗內並顯示最近打入的本文. 上捲的步驟如下 :

    1. 移動指標到捲動棒. 和前面一樣游標變成垂直雙箭頭.

    2. 按下滑鼠左按鈕 : 游標變成向上箭頭. (圖 8 - 3c)

    3. 放開按鈕 : 與箭頭在同一列的文字移到螢幕頂端, 且高亮度區也隨著調整.
       ( 以圖形來表示,如圖 8 - 4. 注意到移動量的多少與你放開按鈕時的位置
       有關 : 若接近頂端, 你可以獲得的移動量小, 接近底部則當然可以獲得較
       大的捲動量).

               ┌────────────────┐
               │    p87. fig 8 - 4              │
               │                                │
               │                                │
               │                                │
               │                                │
               │ 圖 8 - 4 在一個視窗內捲動本文  │
               └────────────────┘


8.2.3 向後捲動本文

    向後捲動視窗本文, 文字列由螢幕底部移出, 使你得以看見先前打入的文字列
 操作程序類似向前捲動, 但方向相反, 此時使用滑鼠右按鈕, 出現向下箭頭 (圖
 8 - 3d).


8.2.4 其他捲動選項

    只要你已經啟動捲動功能, 有兩個Modes選單的選項可供利用.

    Scroll to bottom on tty output (若有 TTY 輸出將輸出自動捲到底) :
      若你目前不在捲動區的底部, 稍後某些終端機的輸出到達視窗時會自動
      地移動到捲動區的尾端. 此功能為預設的. 若此功能被關閉, 你要看最
      新的輸出必須自行捲動視窗.

    Scroll to bottom on key press (按鍵才捲到底) : 若你不在捲動區的底部,
      稍後你按一個鍵, 視窗會自動移動至捲動區的尾端. 此功能不預設, 但通常你
      的終端機設定成當你鍵入時回應一個字元 : 這些字元為TTY 輸出, 且將引起
      視窗被捲到底部.


8.2.5 以命令列選項控制捲動

    -sb : 允許使用捲動棒. (預設 : 禁能(disable))

    -sl num : 儲存被捲離螢幕的若干列本文. (預設為 64)

    -sk : 致能(enable)當按鍵才捲到底. (預設 : 禁能)

    -si : 致能當終端機輸出時捲到底. (預設 : 致能)



8.3 記錄你與終端機的交談過程 - 寫記錄 (logging)

    突現 xterm X11 選單, 並選擇 logging 選項. (假如你現在是第二次叫同樣的
選單,在 logging 選項旁邊, 你會看到一個沙漏標誌 (tick-mark) , 表示它是啟動
的) 從此以後, 所有終端機輸出除了被送到螢幕以外, 也會被送至一個檔案. 你可
以獲得一個使用過程的永久記錄. 預設的狀況是將輸出寫到 xtermlog.pid 檔案.
其中 pid 為xterm 處理識別碼. 此檔案被建於啟動 xterm 時的目錄 (你也可以利用
下面介紹的命令列選項去改變登錄檔名).

    你可以藉著 xterm X11選單停止或再度logging,反覆的停止和開始logging,你
可以作選擇性的記錄,logging 的輸出永遠附加在登錄檔案(log-file)之後,每一次
都不會覆寫(overwrite)登錄檔。


8.3.1 以命令列選項控制登錄使用過程

    -l : 致能登錄使用過程

    -lf file : 將登錄檔寫入指定檔, 以取代預設檔 (指定登錄檔僅設定登錄檔
      名而不致能登錄功能; 必需另外使用 -l 來致能登錄)

使用一個導管 (Pipeline) 作為登錄 "檔"

   -lf 選擇項有一個特殊功能 : 假如 file 引數以導管記號 (|) 開頭, 則其餘
     部分視為登錄輸出的一個管路. 例如 : 假設你的系統 (shell) 提示是 venus%,
     使用下列命令去啟動 xterm 並記錄於 cmdlog 檔, 只需鍵入

           xterm -l -lf '| grep "^venus% " > cmdlog'



8.4 剪與貼本文

    你可以從 xterm 視窗 "剪" (cutting) 部分本文, 亦即拷貝本文到一個 "剪
緩衝區" (cut buffer), 稍後可被 "貼" (pasting) 回, 亦即取回 (retrieve).
你可以將本文貼回同一個視窗, 或任何提供相同結構的視窗. 你可以現在或稍後
"貼" 回, 但你只有一個緩衝區, 後來所 "剪" 的資料將蓋掉先前的. 目前被選擇
的部分是以高亮度反白影像顯示; 一個有兩列文字被選到的xterm視窗顯示於
圖 8 - 5。

               ┌─────────────────┐
               │    p87. fig 8 - 5                │
               │                                  │
               │                                  │
               │                                  │
               │                                  │
               │圖 8 - 5 "剪" 操作中被選擇的文字列│
               └─────────────────┘


8.4.1 剪 (cutting)

"剪" 一段文字 :

    1. 移動游標至你想要 "剪" 的那一段文字的一端.

    2. 按下滑鼠左按鈕, 並保持按住.

    3. 拖拽游標至該段文字的另一端 : 在你移動的時候介於啟始位置與游標位置
       間的文字會以高亮度顯示.

    4. 放開按鈕 : 被選到的文字維持高亮度, 任何先前所選擇的高亮度本文 (甚
       至在別的視窗中) 變為非高亮度.


8.4.2 貼 (pasting)

"貼" 一段本文 :

    1. 移動游標至你想要插入一段文字的位置.

    2. 碰觸滑鼠中間按鈕 : 先前被選定的文字被插入. (目前的選擇仍保持高亮
       度)

    當你將本文 "貼" 入一個視窗, 它真的就像你用鍵盤打入的一樣 -- 你可以使
    用正常的列編輯鍵去消除字元, 單字, 或整列 (當然假如 "貼" 了許多列, 你
    只能編輯最後一列, 就像你只能編輯最後敲入的一列一樣).

注意 : 假如你試圖 "貼" 太多文字到一個 xterm 視窗, xterm 可能永遠懸(hang)
       在那裡. (我們試"貼" 過多到 4000 個字元沒有問題, 但這個值並不保證永
       遠不發生問題.)


8.4.3 剪一個字或一列

    假如你想剪一個字或一列, 你可以直接選擇它而不需拖拽過它.

    "剪" 一個字 : 指標移到一個字的任何位置, 並碰觸兩次滑鼠左按鈕 : 該字
    即被選擇.

    "剪" 一列 : 指標移到一列的任何位置, 並碰觸三次滑鼠左按鈕 : 該列即被
    選擇.

    碰觸滑鼠按鈕兩次與三次是所有以滑鼠基礎(mouse-based) 的系統之共同用法,
但在這個例子有特殊的功能: 連續而獨立的幾次碰觸與一個多次碰觸是不同的,其
差異取決於介於按下按鈕(button-down)與鬆開按鈕(button-up)的期間內有沒有其
他的事發生. 所以下列算作碰觸三次 :

    DOWN ... pause for a few seconds ... UP DOWN ... another
    pause ... UP DOWN ... pause

這是很有用的 : 因為在碰觸後只要你保持按下, 只要更進一步藉著使用 up/down,
你可以改變選擇模式 (字元, 字, 列)。


8.4.4 擴大一個選定區塊或 "剪"

    只要你有一個選定區塊, 你可以擴大它 (或縮減它), 如下 :

    1. 移動指標至你想選擇的新端點, 它可以是在已存在的一個區域堶 (當你
       想縮減它時) 或外面 (當你想擴大它時)

    2a. 碰觸滑鼠左按鈕 : 選擇區的端點調整為目前指標位置. 或 ...

    2b. ... 若以按下、拖拽和放開按鈕來取代碰觸. 在這個狀況下, 選擇區跟隨
        游標變動, 且為高亮度.

    有一個方便的技巧可以選定文字區塊, 首先標定你想選定的本文之一端, 碰觸
滑鼠左按鈕, 然後移至另一端碰觸滑鼠右按鈕 : 中間的文字即被選定. (這是擴大
選定區的變相方法. 開始時選擇區是空的 - 即你已碰觸滑鼠左按鈕, 但沒拖拽通
過任何文字 - 然後你碰觸滑鼠右按鈕來擴大這個空選定區.)


8.4.5 字或文字列邊界的選擇

    假如你想選擇一些字或文字列, 你可以藉著在碰觸按鈕之前小心地定位指標來
完成.但這裡有一個簡捷的方式 - 再次利用多次碰觸按鈕. 選擇文字或文字列 :

    1. 將游標移到你想 "剪" 的文字之一端.

    2. 按下滑鼠左按鈕, 並保持按著 ...

    3. ... 拖拽游標至你想要 "剪" 的文字之另一端 : 啟始點至游標間的本文為
       高亮度. (如圖 8 - 6 上圖)

    4. 放開並迅速連續地再按下按鈕 : 高亮度區擴展至最接近單字的邊界. (圖
       8 - 6 中圖)

    5. 放開並迅速連續地再按下按鈕 : 高亮度區擴展至已選定列的尾端. (圖
       8 - 6 下圖)

    6. 放開並迅速連續地再按下按鈕 : 高亮度區回復至原來的大小, 亦即選定區
       回到字元邊界. (圖 8 - 6 最上面)

    相同的技巧可應用於以右按鈕擴展已選擇的區塊.

               ┌─────────────────┐
               │    p92. fig 8 - 6                │
               │                                  │
               │                                  │
               │                                  │
               │                                  │
               │ 圖 8 - 6 以字元, 字與列 "剪" 文字│
               └─────────────────┘


8.5 使用 Tektronix 模擬功能

    xterm 可以模擬一個 Tektronix 4014 終端機和一個 VT102 終端機, 使你可
以用它來顯示圖形. 當你在一個遠方機器執行 非-X應用程式而想在你的顯示器
上看圖時, 特別有用.

  xterm 為每一個 "終端機" 使用一個不同的視窗, 所以你可以將所有文字顯
示於一個視窗, 而另一個視窗顯示圖形, 如圖 8 - 7. 某個時間只有一個視窗活
動(active)著, 亦即所有的鍵盤輸入或被 "貼" 入的本文 -- 被導引至活動視窗
, 甚至當指標在別的視窗時也一樣.

你可以使用終端機的逃脫序碼 (escape sequence) 或使用 modes 選單選擇你需
要的視窗.你可以使用你的視窗管理器完全分開地處理兩個視窗. 例如 : 你可以
表徵圖化 VT 視窗,然而保留一個開啟的 Tek, 等. 你也可以使用適當的 xterm
選單選項 (Tek Window Showing, Hide VT Window, 等) 去隱藏或顯現一個視窗
因而顯現或隱藏其他視窗.

注意 : 隱藏不是將它送到堆疊的底部, 或表徵圖化. 假如你使用選單 "隱藏"一
       個視窗, 當下次你要求再出現時你必須像開啟一個新的應用視窗一樣地安
       置 (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 前面已經討論過. 所有的這些都描述於 xterm 指南頁
(manpage), 中,但下面是一些有用的雜項 :

    -iconic : xterm 應該以表徵圖啟動的方式取代由正常方式 "開啟" 視窗.(當
         使用uwm 為你的視窗管理器, 表徵圖的初始位置將決定於表徵圖被產生
         當時的游標位置. 我們將在 "定義應用程式的預設選項 -- Resources"
         這章 (第15章) 裡教你如何明確地指定一個表徵圖位置)

    -title string : 使用 string 為視窗標頭 (抬頭), 這個標頭就像圖 6 - 8 在
         新開啟視窗所看到的一樣, 且某些視窗管理器可能將它包含在視窗標頭棒
         (title bar).

    -C : 這個視窗應該將接收的輸出送到系統控制台 (例如 : 磁碟已滿訊息, 裝
         置錯誤 (device error), 等) 若你沒有一個視窗具有這個選項指定, 控
         制台訊息可能直接出現在你的螢幕 (亦即不在一個固定視窗中) 並擾亂
         顯示; 若發生時, 只要使用 uwm 的選單選擇 RefreshScreen 去恢復正常
         顯示即可.

    -e prog [args] : 在視窗中執行具有選擇性引數的 prog 程式, 取代啟動一
         個 shell.(此選項必須在命令列的最後, 所有在它後面的視為 args 的
         部分). 你經常需要使用 -e 去 rlogin 到一個不支援X的遠方系統, 例
         如 :

         xterm -title saturn -e rlogin saturn -l root



8.9 設定終端機鍵盤

    X 本身可讓你改變鍵盤對照表, 所以你可以為針對不同的情況改變它以適合一
個國家的使用習慣. 但這個對照表僅決定那個 "字元碼" 聯結到一個給定的鍵.
client 程式 (像 xterm 但更進步) 則可指定任意的字串給任何鍵或鍵組 (組合
鍵). 使用這個結構你可以設定一個 xterm 特別適用於郵件程式, 或一個除錯器,
你只要指定一般命令給功能鍵, 或控制字元, 甚至單一字元。這個結構的詳細部
分相當的複雜,所以我們將延緩到 "訂製你的鍵盤和滑鼠 -- 轉譯" 一章(第18
章)中再介紹.

8.10 結論

    xterm 是一個具有許多選項與功能的複雜的程式, 幸運地是大多數的時間你不
需要使用它們, 而當你使用時通常是在你開始啟動 xterm 時將它設定成你喜歡的
架構. xterm的指南頁 (manpage) 是一個很長的程式功能參考文件. 在詳讀它之前
, 你儘可能在一般的操作時不使用它, 較專門特別的地方才查考它.

注意 : 指南頁提到文件 "Xterm Control Sequence " (控制順序)這文件目前還在
       準備中, 並不是發行版本的一部份.

    許多介面特性 (功能) 例如 : 捲動棒與如何以指標選擇本文等, 是藉由標準軟
體 widget (小工具)寫在程式裡 (在第15章的 toolkit 那節有較多的介紹). 你
將發現許多由其它X應用程式提供的介面都是相同的, 例如: 第10章的 xman 與
xedit. 在繼續探討它們之前我們先在下一章看看一些雖然小但有用的程式.

=====

第9章 方便的程式和視窗相關的工具

    到目前為止我們已經涵蓋了使用系統的基本元素, 有了 xterm功能, 你開
始從視窗系統獲得看得見的優點. 在本章我們描述一些小程式, 開始去充分使
用系統並使你的工作更方便.

    這章先提出 "案頭附屬品" (desk accessory) 的方便程式, 接著介紹捕捉
(capturing)、恢復 (restoring) 與列印螢幕影像的一組工具.



9.1 方便的程式

    本節所描述的一些程式功能雖屬次要, 但是卻可以使你工作得更方便輕鬆.
有些我們曾經提過 -- xclock 與 xcalc --  但在這裡將更有組織地描述, 我
們將看一些可以顯示目前機器負載和告訴你有郵件送達等功能的新程式.


9.1.1 一個類比或數位時鐘 - xclock

    在第5章中我們用 xclock 為範例程式, 它有下列命令列選項 :

        指定視窗初始大小與位置 : 用 -geometry geomspec.

        設定背景色 : 用 -bg colour.

        設定前景色 : 用 -fg colour.

        設定指針的顏色 : 用 -hd colour.

        指針邊緣高亮度 : 用 -hl colour, 以高亮度 colour 顏色為指針的
            邊緣.

    其他有用的選項 :

        使用數位時鐘 : -digital, 告訴 xclock 使用一個 24 小時的數字型
            時鐘, 以取代預設的類比型, 如圖 9 - 1.

        設定 "時鐘-滴答" 頻率 : -update num, 使時鐘每 num 秒更新顯示一
            次. 處於指針狀態下, 若 num 小於 30 秒則以一個鑽石形秒針每
            num 秒移動一次, 如圖 9 - 2. (預設值為 60 秒)

        設定半小時鐘聲 : -chime, 每半小時整使終端機鈴響一次, 每一個小
            時整鈴響兩次.

               ┌────────────────┐
               │    p98.  fig 9 - 1             │
               │                                │
               │                                │
               │                                │
               │                                │
               │ 圖 9 - 1 數字型時鐘            │
               └────────────────┘


               ┌────────────────┐
               │    p98.  fig 9 - 2             │
               │                                │
               │                                │
               │                                │
               │ 圖 9 - 2 具有鑽石形秒針的指針型│
               │        時鐘                    │
               └────────────────┘


9.1.2 一個桌上型計算器 - xcalc

    這是另一個我們曾經用過的程式. 我們用過的命令列選項如下 :

        指定視窗初始大小與位置 : -geometry geomspec.

        設定背景色 : -bg colour.

        設定前景色 : -fg colour.

    其他選項 :

        指定計算尺 (slide-rule) 模式 : -analog, 執行程式模擬一個計算
            尺 (圖 9 - 3) 取代電子式計算器. 這實在很稀奇, 但一些更進一
            步的指令包含於下面, 因為它不包含在指南頁內.

        指定 HP-10C 型計算器 : -rpn (代表反波蘭記數法 (Reverse Polish
            Notation)), 告訴 xcalc 模擬 HP-10C 型計算器 (如圖 9 - 4).

    各種計算器模式的更深入的指令說明包含於指南頁. (無論你處於那一個模式
, 當你將它表徵圖化時, 其表徵圖都是圖 9 - 5 的樣子.


               ┌──────────────────┐
               │    p99.  fig 9 - 3                 │
               │                                    │
               │                                    │
               │                                    │
               │                                    │
               │ 圖 9 - 3 類比的 xcalc 是一個計算尺 │
               └──────────────────┘


               ┌──────────────────┐
               │    p99.  fig 9 - 4                 │
               │                                    │
               │                                    │
               │                                    │
               │                                    │
               │ 圖 9 - 4 反波蘭記數法 xcalc 計算器 │
               └──────────────────┘
               ┌────────────────┐
               │    p99.  fig 9 - 5             │
               │                                │
               │                                │
               │                                │
               │                                │
               │ 圖 9 - 5 xcalc 表徵圖          │
               └────────────────┘


使用計算尺

    使用滑鼠按鈕操作計算尺. 當滑鼠指標進入視窗內, 指標變成手型游標.

        定位滑尺 - 左端 : 移動指標進入滑尺區, 定位至你想要的地方,碰
            觸左按鈕,滑尺左端跳至指標位置.

        定位滑尺 - 右端 : 與設定左端一樣, 但碰觸右按鈕.

        定位計算尺的游標 : 定位指標至你想要的尺體位置, 並碰觸左按鈕
            : 尺的游標跳至指標位置.

        滑動滑動棒 (slide-bar) : 定位游標至滑尺, 按下中間按鈕, 並保
            持按著 ... 拖拽滑尺到你要的位置, 然後放鬆按鈕.

        將尺的長度變為兩倍 : 在尺體上碰觸中間按鈕.

        將尺的長度變為一半 : 在尺體上碰觸右按鈕.

注意 : 假如你以左或右按鈕拖拽, 將會有奇怪的事情發生.


9.1.3 顯示機器的負載平均 - xload

    xload 顯示系統平均負載 (在執行佇列裡的平均工作數目) 的柱狀圖 ,
它會定期地更新. 典型的輸出如圖 9 - 6a, xload 的表徵圖如 9 - 6b.

               ┌───────────────────┐
               │    p100.  fig 9 - 6                  │
               │                                      │
               │                                      │
               │                                      │
               │                                      │
               │ 圖 9 - 6 xload 的正常視窗與表徵圖視窗│
               └───────────────────┘


9.1.4 郵件通知程式 - xbiff

    xbiff 是一個監視你的郵件檔與讓你知道何時有郵件到達的小程式. 它顯
示一個郵箱的圖案; 當沒有新郵件時郵箱的旗子是向下的 (圖 9 - 7a). 當有新
郵件進來時, xbiff 響鈴, 豎起旗子, 並使圖案變成反相顯示 (圖 9 - 7b).

    你可以在 xbiff 視窗上碰觸任何滑鼠按鈕, 強迫旗子放下.

    xbiff 接受一般對色彩的命令列選項 (-bg, -fg, -bd) 與對視窗特性的
命令列選項(-display, -geometry, -bw). 其他包括 :

    指定檢查郵件頻率 : -update num, 告訴 xbiff 每 num 秒檢查郵箱一次
, 看是否有新的郵件到達. (預設值為 60 秒)

    指定一個特定郵件檔 : -file filename, 使 xbiff 檢查在 filename 內
的郵件, 取代預設名稱的檔. 預設名稱為 /usr/spool/mail/username, 其中
username為你的登錄名稱 (login name)。

    xbiff 特有的 -file 選項, 對網路上的郵件被集中處理和你的郵箱由
另外的機器處理等兩方面非常有用. 下面的命令讓你執行某個郵件機器(比
如說mars) 上的 xbiff程式, 查看你的郵箱, 並將顯示送回你自己的機器venus:

    rsh mars xbiff -file /var/spool/mail/smith\
    -display venus:0 &

               ┌─────────────────┐
               │    p101.  fig 9 - 7              │
               │                                  │
               │                                  │
               │                                  │
               │ 圖 9 - 7 xbiff 郵件監視視窗的兩種│
               │        狀態                      │
               └─────────────────┘



9.2 儲存, 顯示與列印螢幕影像

    X是一個圖形系統, 而你將用它在視窗內顯示文字與圖形. 經常X視窗的使
用者會想要捕捉螢幕上的某些影像, 以便稍後你可以重新顯示它, 或送至硬拷貝
 (hard-copy)裝置列印. 下面的小節將描述這些功能.


9.2.1 儲存一個視窗的影像 - xwd

    xwd 傾印 (dump) 一個視窗的影像到一個檔案. 這個檔案稍後可以被其他
程式處理 (例如列印一個硬拷貝).

    使用 xwd 有許多種不同方法. 你可以明確地指定一個輸出檔 (使用命令列
選項-out name), 或者使用 xwd 傾印影像到標準輸出. 你也可以明確地指定想
傾印的視窗, 或可以讓 xwd "提示" 你一下.

    讓我們拿最簡單的一個例子 : 於 xterm 下以下列命令啟動程式

        xwd > outfile

只要 xwd 啟動, 游標便會變成 "十字線" (cross hairs) 狀, 見圖 9 - 8. 移
動指標進入你想要傾印的視窗, 並碰觸任何按鈕 : xwd 響一次鈴表示它已經開始
記錄視窗影像, 且在它完成時響兩次鈴. 然後游標恢復正常.

               ┌────────────────┐
               │    p102.  fig 9 - 8            │
               │                                │
               │                                │
               │                                │
               │                                │
               │ 圖 9 - 8 十字線形游標          │
               └────────────────┘

注意 1 : 假如你試圖傾印在螢幕上不完整的視窗, 程式可能失敗並在你的控
制台 xterm 視窗內顯示出一長串的錯誤訊息 (假如你有一個控制台的話).

注意 2 : 被捕捉的影像是你真正在螢幕上的視窗邊界內所看到的, 特別的是,
假如視窗的某部分被另一個視窗覆蓋, 傾印的影像將展現視窗涵蓋的可見部分
以及遮蔽視窗重疊的部分. (例如 : 圖 9 - 9 展示一個被 xman 覆蓋的一個
xterm 視窗的傾印結果) 這似乎是一個不方便的功能, 但有它的優點 :若想要
獲得整個螢幕的傾印影像, 只要對根視窗執行 xwd 即可; 就如同你在螢幕上
看到被覆蓋的根視窗一樣, 用這個方法你可以得到完整螢幕的圖片.

               ┌─────────────────┐
               │    p102.  fig 9 - 9              │
               │                                  │
               │                                  │
               │                                  │
               │                                  │
               │ 圖 9 - 9 一個被重疊視窗的傾印結果│
               └─────────────────┘

如何指定被傾印的視窗

    有兩種方法可以透過命令列選項告訴 xwd 要傾印那一個視窗.

    -root : 傾印根視窗. 例如 : 想得到螢幕的一個完整圖片, 使用命令 :

            xwd -root > screenpic

    -id win-id : 傾印視窗識別碼為 win-id 的視窗. (每個由 X server 建
            立的視窗皆有一個唯一的視窗識別碼 : 它只是一個識別視窗的
            號碼. 我們將在 "資訊與狀態程式 " (Information and status
            program)那一章 (第12章) 中告訴你如何找到一個指定視窗的
            識別碼).

    (這些選項在 xwd 指南頁內沒有描述)

    使用這些選項的好處是你不必使用滑鼠去指定你感興趣的視窗. 因為有時
候在傾印的同時,滑鼠必須出現在某個特定的地方執行某項特定的功能,例如:
呼叫一個突現式選單, 或使一個命令按鈕出現你想要的狀態. 舉例來說:欲儲存
圖 6-1的螢幕影像, 滑鼠必須被使用以突現uwn 選單,因而造成你沒有辦法同時
使用滑鼠去指定 xwd 的目標. 下面是如何捕捉一個影像的步驟 :

    1. 在一個 xterm 視窗, 鍵入命令

           sleep 10.xwd -root > uwmfile

       在捕捉影像之前, 給你自己時間使螢幕進入你要的狀態.

    2. 移動指標至背景視窗上.

    3. 按下滑鼠中間按鈕, 出現 WindoeOps 選單, 並保持按下不鬆開 ...

    4. ... 等一下, 直到 xwd 響鈴一次告訴你開始, 完成則響鈴二次. 然後
       放鬆按鈕.

    相同的方法 (技巧) 被用於捕捉第8章所述之 xterm 選單,  請注意必須
使用明確的視窗識別碼. (在 "資訊與狀態程式" 那一章 (第12章) 中將再一
次提到)


9.2.2 放大螢幕視窗影像 - Xmag

   xmag 容許你快拍 (snapshot) 任何螢幕的影像, 並以任意倍數放大他們. 最
簡單的方法為採用交談方式指定你感興趣的區域:

    1. 啟動程式 (用 xmag 命令) : xmag 顯示一個閃動的矩形外框.

    2. 將矩形框安置到你想要的地方上.

    3. 碰觸任何按鈕 : xmag 快拍矩形框內的區域, 並顯示一個清新的視窗
外框, 裡面正顯示放大的 (enlarged) 快拍影像.

    4. 仿照在第6章啟動 xclock 後所採用的方法一樣使用指標與按鈕放置
       外框. (例如 : 碰觸滑鼠左按鈕將視窗安置在指標目前所在的位置)

    5. xmag 在你剛安放的視窗內, 重繪放大的影像.

    你現在可以選擇底下任一動作:

  . 你可以按 Q 或 q 或 CTRL-C,接著指定 xmag 視窗內的選項, 跳出 xmag.

  . 你可以按滑鼠中間按鈕或左按鈕以移開目前放大的視窗, xmag 再次顯示
    出它的閃爍矩形, 所以你可以放大螢幕上另一個區域.

  . 按下滑鼠左按鈕 : xmag 顯示出在指標下的像素座標, 即像素的號碼 (它
    是一個該像素顏色的內部表示法), 以及像素的 RGB 值, 亦即像素顏色的
    紅, 綠, 藍成分. 當你移動指標, 這些顯示隨著更新, 直到你放鬆按鈕.

程式記錄快拍影像只是為了立即再顯示 -- 沒有任何方法可以取得它以便傾印
影像至一個檔案.

xmag 的命令列選項

    預設的操作方法被一些方式限制住 -- 你必須以交談方式指定被放大的區
域, 區域的形狀與大小被固定, 放大率都是 5. 但事實上你可以使用命令列選
項改變上述所有的特性 :

    指定不同的放大率 : -mag num, 放大影像 num 倍 (num 須為整數). 例
        如 : -mag 2, 將產生一個為原來兩倍寬與兩倍高的影像.

    指定大小與放大區域的位置 : 使用 -source geomspec. 例如 :

            -source 300x100 + 450 + 762

        xmag 不提示任何訊息, 但將直接跳到它顯示放大視窗外框的步驟, 假
        如 geomspec 只有位置部分, 則大小部分預設為 64x64.

    僅指定放大區域的大小 : 使用 -source geomspec, geomspec 僅由大小
        部分組成, 就像

            -source 300x100

        xmag 將顯示一個閃爍的 300x100 的矩形外框, 等你定位與碰觸按鈕.


9.2.3 儲存一部分螢幕的影像

    xwd 僅對單一, 完整視窗操作. 假如想補捉一個視窗的某部分, 或某些視
窗一起,你必須採用兩階段處理 :

    1. 使用 xmag 程式選擇你要的區域, 並在一個單一視窗 (亦即 xmag 本
身) 顯示它.

    2. 用 xwd 傾印 xmag 視窗至一個檔案. (假如你想傾印與最初一樣大小
       的影像, 別忘了指定 -mag 1 給 xmg.)


9.2.4 顯示一個先前傾印的影像 - xwud

    xwud "反傾印" (undumps)一個先前曾經被傾印至一個檔案的影像, 也就是
再次將影像顯示於螢幕上.預設的作法是它從標準輸入讀入傾印檔, 所以反傾印
一個你想要檔案類似:

        xwud < screenpic

    xwud 顯示閃爍的視窗外框, 準備讓你使用視窗管理器. 當你已安置好它
, 影像即被顯示. 當然你可以利用視窗管理器移動視窗, 重定大小, 表徵圖化
, ...等, 就如同其他任何視窗一般.

注意 : 在指南頁內提到的 -inverse 可能無法正常運作。


9.2.5 列印先前傾印的影像 - xpr

    xpr 能夠轉譯一個先前曾傾印的影像為可送至硬拷貝印表機列印的格式. 它
支援各種不同的印表機 - PostScript, DEC LN03 與 LA100, 以及 IBM PP3812.
由於預設是寫到標準輸出, 所以典型的用法應該是 :

    xpr -device ln03 < screenpic | lpr

xpr 的命令列選項

    xpr 接受數個選項, 包括控制影像在紙上的位置, 大小與配置, 和指定輸
出的印表機型式 :

    指定印表機型式 : 使用 -device type, 這裡的 type 是指 ln03, la100,
        ps (PostScript) 或 pp (指 PP3812).

    控制影像的大小 : 由於預設 xpr 以最大的尺寸列印影像, 你可以用
        -width num 或 -height num  指定最大的寬度或高度, num 的單
        位為 inch (不必是整數).

    對影像標刻度 : 你可以使用 -scale num 對影像標刻度, num 為整數.
        作法與 xmag 的 -mag 選項類似, 但大小可能扭曲, 因為印表機可
        能有不同的解析度, 亦即每個 inch 有不同的點 (像素) 數, 例如 :
        -scale 2 表示每個螢幕像素被印表機印成 2x2 點的方形, 所以假
        如你的螢幕為 75 dpi 且你的印表機為 300 dpi, 列印影像僅為螢
        幕影像大小的一半 (75x2/300 = 0.5).

    加影像標題 : 使用 -header string 或 -trailer string 分別將一文字
        字串印在影像的上面或下面.

利用單一操作命令傾印與列印一個視窗 - xdpr

xdpr 是一個使用 xwd 傾印視窗影像, 接著使用 xpr 格式化列印影像, 最後
使用 lpr 印出影像的一個程式. 它接受所有這三種程式的命令列選項 (事實
上 xdpr是一個 shell描述, 它將上述三種程式包裝在一起以便使用。它真正
的工作為檢查命令列上的各個選項且傳送它們給適當的程式)

9.3 結論/摘要

    在本章中你已見過一些可幫助你處理日常的工作小程式, 和一些特殊的工
具以記錄和重新 (建立) 產生螢幕影像. 擁有這些工具你開始得到視窗系統的
優點並開始使用它的圖形能力.

    下一章我們繼續以相同的方向看一些普通的公用程式, 看它們如何利用視
窗系統去簡化操作與增強使用介面.

=====

第10章 使用X的應用程式

    本章將介紹一些包含在 core 版本內的公用程式, 它們的主要功能和視窗
系統並無密切關係, 但使用它們卻可提供一個相當不錯的使用者介面 :

    . Xedit - 一個以視窗為基礎的 (window-based) 一般目的文字編輯器.
    . Xman  - 一個指南頁 (manpage) 或系統文件的瀏覽工具.
    . Xmh   - 一個 mh 郵件處理程式的視窗前端 (front-end) .



10.1 文字編輯器 - Xedit

    Xedit 是一個非常簡單而具有視窗介面的文字編輯器. 藉著對 Xedit 所
顯示的選擇盒碰觸按鈕, 你可以完成某些操作, 但透過使用鍵盤你可以執行的
更多, 特別是控制字元. 在這個程式內大多數以鍵盤為基礎的功能由一個標準
軟體片段提供 -- 假如你喜歡也可以視為一個建築區塊 "building block" --
叫做一個文字小工具 (text widget). (有關小工具 (Widget) 在 "資源
(Resources)" 那一章 (第15章)中我們將談得更多). 因為這是一個很普通的
結構, 且你將在其他地方遇到相同的編輯功能, 我們在隨後的幾節將詳細描述
它的功能.


10.1.1 啟動與結束程式

    假如你想編輯一個名叫 foobar的 檔案, 在 xterm 視窗鍵入命令 :

        xedit foobar &

    (假如你不想編輯已存在的檔案, 只要鍵入 "xedit &")

   xedit 啟動與顯示它的視窗, 如圖 10 - 1 :

               ┌────────────────┐
               │    p108  fig 10 - 1            │
               │                                │
               │                                │
               │                                │
               │                                │
               │ 圖 10 - 1 xedit 文字編輯器     │
               └────────────────┘

    視窗被分成三部分 :

    . 上面是命令選單, 具有標著 Quit, Save 等的命令盒.

    . 中間部分是訊息視窗, xedit 在裡面顯示錯誤訊息與狀態, 你也能把它
      當作一個抓取區 (scratch area) 來使用, 可在裡面鍵入一段你想剪貼
      到其他地方的文字.

    . 下面較大的部分是編輯視窗, 它顯示你正在編輯或建立的本文.

    當你想結束程式時, 在 Quit 盒上碰觸左按鈕, 假如你做了一些改變但未
儲存, 則 xedit會在訊息視窗內印出警告訊息 :

      Unsaved changes. Save them, or press Quit again.


10.1.2 插入文字

    首先確定指標在編輯視窗內, 然後鍵入你要的文字 (鍵盤上任意的列印字
元),在你鍵入時,被直接地插入. 當你鍵入時, 你將會注意到新插入的文字是不
斷地推送一個在它前面的一個小脫字符 (^) 游標 : 這個游標是插入點
(insertion point) 或簡稱為點 (point). 任何你鍵入的或貼入(paste-in)
的文字都將在這個點的位置被插入. 插入點總是位於兩個字元間, 而不在一個
字元上面 (就像一個正常終端機游標的狀況).

自動 "列捲繞" (Line-Wrapping) -- xedit 的 "段落" (paragraphs)

    當你在接近一列的尾端插入文字, 假如你鍵入的字太長以致無法適合目前
這一列時, xedit 將自動移至下一列. 假如接著剪短該字使得可以適合它原來
的列,它將再跳回上一列.

    這個作用與 xedit 的段落定義息息相關 : 一個段落是被新列字元
(newline character)終結的本文. (實際上它意味著連續鍵入文字而無需插入
新列字元) edit 列捲繞僅作用於一個段落內, 且能正確地處理特殊狀況, 例如 :
在移動一個單字 (word)到這列時造成這列必須捲繞到下一列的狀況等等.

注意 1 : 這個段落的定義實際上就是被各種其他 Unix 程式視為一列的定
         義, 若你使用 xedit 編輯一個正常的檔案, xedit會將讀入的每一列
         視為一個段落處理.

注意 2 : 顯示器沒有明顯的標示出螢幕上的一列在尾端有一個新列字元 (無法
         憑肉眼直接辨識) , 亦即xedit 可能視它為一個列尾或一個段落.

注意 3 : 以 xedit 產生的檔案, 若用其他程式查看內容時, 可能看到具有非
         常長的一列.

譯註:這種方式類似於 PC 上的 Wordstar 文書編輯器。


特殊插入操作

下面有一些插入新列的特殊命令, 各種命令稍為有些不同:

    插入一個新列, 且插入點移至新列 : 按 RETURN. 便可以插入一個新列, 事
        實上就像插入任何列印字元一樣. 且假如你不靠 xedit 的列捲繞,
        這是移至新列的正常方法.

    插入新列, 且對齊 : 按 LINEFEED鍵插入一新列並移動插入點到下一列,
        但任何你鍵入的列印文字將與上一列的文字對齊. (對鍵入表格等很有
        用).

    插入一新列, 但不移動插入點 : 按 ctl-O. 可以插入一個新列, 但點仍
        留在同一列. (當你想分開一列並加文字到被分成二列中的第一列尾
        端時使用)


10.1.3 剪 (cutting) 與貼 (pasting)

    就像在 xterm 中一樣的, 你可以選擇並 "剪" 出一段文字, 但是有一個
討厭的差異 : 當選擇字或列時, 你必須迅速碰觸二次或三次按鈕 - 你不能在
按鈕按下或鬆開時暫停.

    在插入點的地方貼入文字時, 你可以像以前一樣的碰觸中間按鈕, 或按
meta-Y鍵.


10.1.4 移動插入點

    移動插入點最簡單的方法是使用滑鼠 : 移動視窗文字游標 (在圖 5 - 2
所看到的垂直棒)到任何你想要的地方, 並碰觸滑鼠左按鈕. 插入點的 ^ 標誌
即跳到新位置.

    但通常使用鍵盤移動插入點也很簡單 - 當你正在編輯時, 它會打斷你的
節奏, 因為必須拿起滑鼠, 移動它, 最後再次將你的手移回鍵盤. xedit 提供
一次移動一個字元、單字、列或頁的方式移動插入點 :

一次一字元移動插入點

    這是移動點的最基本型式 :

        向前一個字元 : 按 ctl-f 或 RIGHTARROW

        向後一個字元 : 按 ctl-b 或 LEFTARROW

        向上一個字元 : 按 ctl-p 或 UPARROW

        向下一個字元 : 按 ctl-n 或 DOWNARROW

    假如你接近一列的開頭, 按幾次 ctl-b 後,你將回到前一列. 按幾次
ctl-f 後可回復至原位. 假如你是在一頁的最上面 (最下面) 一列, 類似的
效果會發生 : 移至前 (或下)一列, 將引起文字捲動使你移至的列能被看得
見.

一次移動一個單字、一列或一個段落

    這些是編輯文字時所須的自然移動功能.

        向前一個單字 : 按 meta-F 或 meta-f

        向後一個單字 : 按 meta-B 或 meta-b

        移至列尾     : 按 ctl-E

        移到列的開頭 : 按 ctl-A

        向前一個段落 : 按 meta-]

        向後一個段落 : 按 meta-[

    你可以看到一個規律開始浮現 : ctl-char 對單一字元操作. 而 meta-char
對單字作相同的事. e.g. ctl-F 向前一個字元, meta-F 向前一個字.


大量移動 - 以頁與檔案為單位

    假如你想獲得較大的跳越, 就像在 xterm 裡面一樣, 你可以使用捲動棒
 然而, 捲動文字並不會移動插入點 : 當你鍵入或清除任何內容時, 文字將
自動地捲回插入點, 讓你可以看到你作了甚麼.

    如果你想捲動顯示內容且移動插入點, 使用 :

        往前一頁 : 按 ctl-V

        往後一頁 : 按 meta-V

        到檔案的開頭 : 按 meta->

        到檔案的尾端 : 按 meta-<


10.1.5 移除不想要的文字 - 刪除 (Deleting)  或 殺掉 (Killing)

    有兩種移除文字的技巧 - 刪除只將文字移除, 殺掉則除了移除文字外,
並將文字儲存至 "剪緩衝區" (cut buffer), 以便稍後你可以取回. 殺掉命令
僅對較大單位的文字作用 (最小單位為單字) - 因為假如你刪除一個字元, 它
就像沒有殺掉它一樣很容易再打入.

    在下面的敘述, "下一個" (next) 意思是正好在插入點之後, "前一個"
 (previous) 意思是正好在插入點之前.

刪除文字

    刪除前一個字元 : 按 DELETE 或 BACKSPACE 或 CTL-H.

    刪除下一個字元 : 按 CTL-D.

    刪除下一個單字 : 按 meta-d.

    刪除前一個單字 : 按 meta-h, 或 meta-DELETE 或 meta-BACKSPACE,
        不用 SHIFT 鍵.

注意 : meta-h 與 meta-H 不同.

    假如你在一列的開頭按下 DELETE 鍵, 它將刪除前一列的尾端的新列字
元, 而將兩列合併成一列.

殺掉文字

    殺掉下一個單字 : 按 meta-D

    殺掉前一個單字 : 按 meta-H 或 shift-meta-DELETE shift-meta-BACKSPACE.

    從游標位置殺到列尾 : 按 ctl-K

    從游標位置殺到段尾 : 按 meta-k

    殺掉目前選定的文字區塊 : 按 ctl-W

救回殺掉的文字; 拷貝與移動文字

    只要你曾經 kill 某些文字, 你就能按 ctl-Y 救回它, 最近被殺掉的文
字在插入點的地方被插入. 但有幾點須注意 :

    . 只有最近被殺掉的文字可以被救回 - 你無法將一連串被殺掉的文字取
      回.

    . 救回的文字是被插入到目前插入點的位置 - 不是該段文字原先被移除
      的地方.

    . 若是需要的話你可以救回相同的文字許多次, 亦即按 ctrl-Y 並不影響
      緩衝區之內容.

基於"殺掉"動作的原理, 你可以用它來移動或拷貝文字區域.

      移動文字 : 先 kill 它, 再將點移動到你想重新放置的地方, 最後
          un-kill.

      拷貝文字 : 先 kill 它並 un-kill 它, 使拷貝的來源不變; 再將
          點移動到你想拷貝的地方, 最後 un-kill.


10.1.6 取消改變 (Undoing Changes)

    假如你作了某些改變 - 殺掉或刪除或鍵入或貼入文字 - 但稍後發現並不
是想要的, 你可以復舊 (undo) 它. 在 undo 盒裡碰觸左鍵 : 取消最近的改變
 undo本身也是一個改變, 所以假如你再次碰觸 undo, 它將取消前一個 undo
的作用; 你可以永遠地像這樣一直切換下去.

    undo 僅對最近的改變有作用. 假如你想更往回追溯, 你可以利用 more 盒
連續地 undo 更前面的改變.


10.1.7 使用檔案

    前面曾提到在啟動程式時你可以指定欲編輯的檔案,事實上當程式執行時
, 你也能抓取檔案. 為達到這個目的你將會使用介於 load  與 undo間的文字
盒,我們稱為"檔名盒".

    儲存文字到一個檔案 : 在 save 盒上碰觸左按鈕; xedit 會將編輯視窗內
        的文字存到檔名為檔名盒內檔名的檔案; 若沒有名稱, xedit會在訊息
        窗內發出

       save : no filename specified -- noting saved

        因此在你再次在 save 上碰觸左按鈕之前你必須將指標移到檔名盒並
        鍵入檔名. 當它已經儲存好檔案 xedit 會發出確認訊息.

    編輯一個不同檔案 : 在檔名盒鍵入檔名, 並在 load 上碰觸左按鈕. 若
        它無法取用檔案, xedit 會發出錯誤訊息.

    插入一個檔案到目前的本文 : 按下 meta-I : xedit 突現一個小視窗
        (圖 10 - 2). 在上端的文字盒, 鍵入你想插入的檔名, 並在 DoIt
        上碰觸左按鈕. 該檔案的內容即插入目前的插入點位置.

               ┌──────────────────┐
               │    p113  fig 10 - 2                │
               │                                    │
               │                                    │
               │                                    │
               │                                    │
               │ 圖 10 - 2 xedit 的插入檔案選擇視窗 │
               └──────────────────┘

註 : 當你在檔名盒內鍵入文字時, 且文字盒在 "插入檔案" (INSERT FILE)視
窗, 你可以使用我們曾經描述過的所有鍵盤基礎命令. 事實上, 你不僅能打字
, 也可以剪貼它們.

注意 : 當你鍵入檔名時, 不須用 RETURN 結尾 - xedit 會將 RETURN 視為檔
       名的一部分, 而造成混淆.

10.1.8 搜尋指定的文字字串

    假如你想找出一個指定字串在你編輯本文中出現的地方 :

    1. 在我們稱為搜尋字串盒 (searchstring box)的裡面, 鍵入字串於
       Search >> 的右方.

    2. 在 Search >> 上碰觸左按鈕 : 插入點便會移至本文中下一個出現該
       字串的地方.

搜尋是由插入點開始,並且 xedit 預設的搜尋方向是向前, 而不往後搜尋. 假如
你要從插入點往回搜尋, 你可以在 << 上碰觸左按鈕.

注意 : 當搜尋字串盒內沒有文字時, 假如你在 Search >> 或 << 上碰觸按鈕,
       xedit 會將最近在你機器上被任何應用程式所選擇的文字區塊的片段拷
       貝到盒內, 並搜尋它. 假如你不預期會如此, 你可能會感到非常驚訝.


10.1.9 取代一個字串為另一個

    假如你想將出現許多次的一個字串 (舊) 置換成為另一個字串 (新) :

    1. 先搜尋出本文中第一次出現欲取代字串的地方, 如前一小節所訴述.

    2. 在 all 盒右方的取代字串盒內鍵入新字串.

    3. 在 replace 上碰觸左按鈕 : 舊字串即被取代成新字串, 且插入點移
       到下一個出現舊字串的地方.

    4. 假如你也要取代它, 再次在 replace 上碰觸, 否則 ...

    5. ... 假如你不想取代這個, 但想改變它後面的, 在 search >> 上碰觸
       按鈕直到你要改變的地方, 即可以再次取代它.

    在你往回移動檔案時你無法執行取代, 換言之你無法用簡單的方法取代在
插入點之前的字串.

注意 : 假如你目前不在舊字串出現的位置而你試圖取代, xedit 會發出下列
       訊息 :

           ReplaceOne : nothing replaced

       但是 replace 本身會完成一個搜尋, 所以你可以繼續在 replace 上
       碰觸按鈕, 再次執行代換.

取代每個出現的字串

    假如你想將出現的每個舊字串取代成新字串, 在 all 上碰觸按鈕.

注意 : 使用 all 時所有出現的舊字串均會被取代, 不只是從點往前而已, 而
       是整個檔案.


10.1.10 雜項功能

    重繪本文顯示 : 使用時機例如當視窗內變得混雜扭曲, 按 ctrl-L

    向前捲動一列 : 按 ctrl-Z

    往回捲動一列 : 按 meta-Z

    跳至指定的行數 : 在訊息視窗內, 鍵入你要跳往的行數, 用滑鼠選擇你
        正在打的本文, 並在 jump 上碰觸左按鈕, 插入點便會跳至指定列
        的開頭. (假如在螢幕上有應用程式的文字片段含有你要指定的列數
        數字, 你可以利用它 - 而不必依賴 xedit 編輯訊息視窗)

    到此我們已經完成對 xedit 的描述, 下一節將轉移到另一個應用程式,
        我們將會看到類似的使用者操作介面.



10.2 讀取指南頁 (Manual Pages) - xman

    xman 讓你瀏覽系統上的 Unix 指南頁, 從一系列選單中選出你要的項目.

    欲啟動程式時,在一個 xterm 視窗中鍵入命令 "xman &" : xman 啟動並
顯示它的主功能選擇項視窗, 如圖 10 - 3. 下面的小節將詳細描述這些選擇項.

               ┌─────────────────┐
               │    p115  fig 10 - 3              │
               │                                  │
               │                                  │
               │                                  │
               │                                  │
               │ 圖 10 - 3 xman 的主選擇項視窗    │
               └─────────────────┘

10.2.1 xman 本身的線上求助 (on-line help) 功能

    xman 有它自己的內建求助選擇項. 欲使用它, 在選擇視窗內的 help 上
碰觸按鈕.xman 產生一個 "Xman Help" 視窗, 如圖 10 - 4. 你可以使用捲
動棒與滑鼠捲動求助本文. 在求助本文視窗內操作方式如下:

    向前移動本文 : 按 f, 或碰觸左按鈕, 即向前移動一頁.

    往回移動本文 : 按 b, 或碰觸右按鈕, 即往回移動一頁.

               ┌─────────────────┐
               │    p116  fig 10 - 4              │
               │                                  │
               │                                  │
               │                                  │
               │                                  │
               │ 圖 10 - 4 xman 求助視窗          │
               └─────────────────┘

注意 : 按 b, 或碰觸右按鈕, 可能無法正確地往回移動一頁.

求助視窗內的其他選擇項

    移動指標到求助視窗上端的邊緣時. 圖 10 - 5 的選單突現出來. 其中可
使用的選項有 :

    Remove Help (移開求助) : 移開這個求助視窗, 但保持其他 xman 視窗
        的原樣. (在我們的情況是仍得到主選擇視窗)

    Open New Manpage (開啟新指南頁) : 與主選擇視窗的 Manual Page 盒
        相同, 描述於後.   

    Quit : 結束整個程式 (停止).

    欲選擇某一選項須移動指標到該選單區並碰觸左按鈕; 假如你甚麼都不想選
, 只要將指標移出選單即可.

               ┌──────────────────┐
               │    p117  fig 10 - 5                │
               │                                    │
               │                                    │
               │                                    │
               │                                    │
               │ 圖 10 - 5 xman 求助與指南頁視窗選單│
               └──────────────────┘

注意 : 在任何時刻, 只要指標進入頂端邊緣區, xman 就會突現它的選單. 假如
       你不是為了這個目的而意外地橫過邊緣, 這可能會造成困擾.


10.2.2 如何閱讀一個指南頁

    在主選擇視窗的 Manual Page 碰觸按鈕 : xman 產生一個指南頁視窗,
視窗開始時會顯示與前面求助視窗相同的文字.

    由此出發, 依照下列三步驟閱讀指南頁 :

    1. 選擇你要看的指南頁的特定章節 (section). (section 是參考 unix
       指南頁的標準分法. 亦即, section no. 1 包含使用者命令,
       section no. 2 包含系統呼叫)

    2. 視窗會顯示你所選擇章節的目錄, 從目錄中選擇進入點.

    3. 閱讀顯示的指南頁.

選擇指南書 (Manual) 的章節

    當 man啟動時, 它預先設定為選擇指南書的 section 1. 假如這是你所要
的, 你可以省略下列步驟的程序. 否則需指定一個 section :

    1. 在指南頁視窗內, 移動指標到頂端邊緣. 我們將得到一個與在指南頁
       裡相同的突現選單,不過現在所有的選項都可使用.

    2. 在 Change Section 項目上碰觸按鈕 : 選單被一系列的指南書章節名
       稱的列表取代. (如圖 10 - 6)

               ┌─────────────────┐
               │    p117  fig 10 - 6              │
               │                                  │
               │                                  │
               │                                  │
               │                                  │
               │ 圖 10 - 6 xman 的指南書章節選單  │
               └─────────────────┘

    3. 在你要的章節上碰觸按鈕 : xman 在指南頁視窗內顯示進入點的目錄
       (如圖 10 - 7).

               ┌─────────────────┐
               │    p118  fig 10 - 7              │
               │                                  │
               │                                  │
               │                                  │
               │                                  │
               │ 圖 10 - 7 xman 的指南頁進入點目錄│
               └─────────────────┘

顯示目錄和選擇指南頁

    假如你依照上面的描述明白地指定一個指南頁章節, xman便會顯示一個
指南頁目錄.否則, 從頂端邊緣突現出選單, 並在 Display Directory 上碰觸
按鈕, 你會得到像上面一樣的指南頁目錄.

    從目錄中選擇一個指南頁 : 只要在你要的名稱上碰觸按鈕, xman 即在視
        窗內顯示指南頁 (圖 10 - 8). (假如目錄列表太長以致視窗無法一次
        顯示, 它旁邊會有捲動棒. 假如你要的名稱看不到, 則必須先將它捲動
        出現後才可以選擇你要的名稱)

               ┌───────────────────┐
               │    p119  fig 10 - 8                  │
               │                                      │
               │                                      │
               │                                      │
               │                                      │
               │ 圖 10 - 8 顯示一個指南頁的 xman 視窗 │
               └───────────────────┘

察看一個指南頁

    只要指南頁在視窗內, 你有許多選擇 :

      捲動指南頁本文 : 捲動指南頁本文就像捲動求助本文一樣, 亦即,
          按 f, 或碰觸左按鈕, 即可向前移動, 按 b, 或碰觸右按鈕, 則可
          往回移動.

      本文/目錄間之切換 : 在指南頁視窗碰觸中間按鈕, 本文即被切換成目
          錄列表. (在目錄內碰觸按鈕, 則回到上一個指南頁本文顯示).

      搜尋一個指定的指南頁 :

         1. 從頂端邊緣突現出選單並選擇 Search. xman 突現出一個搜尋視窗
            (圖 10 - 9).


         2. 在頂端的本文盒內, 鍵入你想要的指南頁名稱 (不用任何 section
            接尾詞, 例如你只要鍵入 diff, 不用鍵入 diff(1) 或 diff.1)

         3. 在 Manual Page 上碰觸按鈕,xman 便會顯示你所要的指南頁. (假
            如它找不到, 它會在指南頁的視窗頂端邊印出一個訊息)

注意 : 你鍵入的名稱必須完全 (di 不能代表 diff), 名稱的大小寫也必須配
       合 (xaddhost 不等於 XAddHost).

               ┌─────────────────┐
               │    p120  fig 10 - 9              │
               │                                  │
               │                                  │
               │                                  │
               │                                  │
               │ 圖 10 - 9 xman 搜尋視窗          │
               └─────────────────┘

許多項目一起顯示

    在任何時刻, 你都可以視需要開啟額外的 xman 視窗, 只需從頂端邊緣突
現出選單並選擇 Open New Manpage 開啟一個指南頁視窗, 然後選擇 Help 開
啟一個求助視窗.

    只要你喜歡你可以開啟許多不同的 xman 視窗, 且對視窗管理器來說每一
個都可以被獨立地管理, 例如 : 你可以將某些重定大小, 其它的表徵圖化等等.
為了清楚起見, 主選擇視窗、求助視窗及指南頁視窗的表徵圖均不同 (圖 10 - 10
 a, b, c). (表徵圖內的 "U.P.M." 代表 "Unix Programmer's Manual")

               ┌─────────────────┐
               │    p120  fig 10 - 10             │
               │                                  │
               │                                  │
               │                                  │
               │                                  │
               │ 圖 10 - 10 xman 的三個不同表徵圖 │
               └─────────────────┘

    在任何一個 xman 視窗, 選擇 Show Both Screen, 你可以同時顯示目錄
及指南頁,視窗分成上下兩部分, 上面顯示目錄, 下面顯示指南頁 (圖 10 - 11)
 (當你如此做時, 頂端的邊緣變薄 : Display Directory 與 Display 
Manual Page 選擇項變成灰色 -- 表示它們目前不可選用, 且選單項目
Show Both Screen 變成 Show One Screen).

               ┌──────────────────────┐
               │    p121  fig 10 - 11                       │
               │                                            │
               │                                            │
               │                                            │
               │                                            │
               │ 圖 10 - 11 同時顯示目錄與指南頁的 xman 視窗│
               └──────────────────────┘

    如有需要, 你可以改變視窗中兩個分框 (panes) 的相對大小, 注意接近分
隔框線的右手邊有一個小的黑方形叫做把手 (柄) (grip)

    1. 將指標指向把手.

    2. 按下任一滑鼠按鈕, 並保持按著.

    3. .. 拖拽分隔線至你要的地方.

    4. 放開按鈕,兩個方框即被適當地重劃.

注意 : 我們會在不同的X應用看到許多這種把手, 但大部份的情況均無法讓你
       拉動它以重調與相鄰視窗的比例. 例如 : 假如你試圖拉 xman 頂端
       邊緣與本文或目錄視窗分隔線上的把手, 它不會有任何反應.



10.3 郵件/訊息處理系統 - xmh

    xmh 是一個架在 mh 郵件/訊息處理系統之上的X介面. 當你啟動它時, xmh
會建立一個像圖 10 - 12 的視窗. 程式的視窗相關畫面如編輯本文, 與管理視
窗方框,均與 xedit 及 xman十分類似, 事實上是由相同的內部結構所提供的.
 正因為如此, 且由於大多數描述是與程式的郵件功能有關而較少與X有關, 我
們不進一步討論. 假如你想知道如何使用程式, 指南頁擁有一個簡單但內容豐
富的描述.

               ┌─────────────────┐
               │    p123  fig 10 - 12             │
               │                                  │
               │                                  │
               │                                  │
               │                                  │
               │ 圖 10 - 12 xmh 郵件處理視窗      │
               └─────────────────┘

10.4 結論/摘要

    在本章中你已經開始看到某些X應用程式在使用者介面上一致性的面貌,
例如:捲動棒的操作, 和一般的本文編輯功能. 這裡只歸結出包含在 core
發行版本中的一般使用者程式,下一章探討一些示範程式, 然後我們便進入本
書第三部分,探討如何訂製一個系統.

    但是在許多方面你現在所需的是去獲得系統的真正優點. 你目前要的是更
多的應用程式,使你在 X的工作架構下做更廣泛的應用, 這就是 MIT 發行版
contrib 部分重要的地方. 它包含了所有階層的廣泛應用程式, 從詳細的程式
函數到方便的程式, 一直到完整的應用, 像事先看排版文件的 xdvi 或繪圖程
式 xfig.

    製造商與第三集團支持X的程式及套裝軟體數量不斷地增加, 這些軟體不
是具有一個完整的X使用者介面, 就是至少可使你輸出圖形到一個X視窗. 當
然也有其他的軟體來源,舉例而言, 自由軟體基金提供高度彈性與擴展性的
GNU Emacs編輯器, 它曾經被整合到X裡面, (事實上, 許多 Xedit 訂定編輯
的功能鍵的確與 Emacs 相同) 如何得到 GNU Emacs 的細節包含在附錄E "如何
獲得X" 中.

=====

第11章 示範與游戲程式

    MIT 發行的 core 版本提供了少數的示範程式以及僅有的一個遊戲程式.
它們展現出某些視窗系統的威力, 且能給人一種強烈的美好印象 -- 特別是在
彩色螢幕上.



11.1 找出通過隨機迷宮的路徑 - maze

     maze 在視窗中產生一個隨機的迷宮 (圖 11 - 1), 它會自動找出從入口
通過迷宮到達出口的路徑. 它會追蹤它走過的軌跡, 當它從一個死巷中退出時
則將軌跡消除. 你可以用滑鼠按鈕啟動, 暫停, 繼續或停止程式, 就如同在手
冊頁中所描述的. maze不提供顏色.

注意 : 中間按鈕對暫停與重新啟動的作用並不可靠.

               ┌────────────────┐
               │    p125. fig 11 - 1            │
               │                                │
               │                                │
               │                                │
               │                                │
               │ 圖 11 - 1 迷宮程式             │
               └────────────────┘



11.2 擔任指標的大眼睛 - xeyes

    xeyes 在視窗中繪出兩個大眼睛, 且它們永遠保持看著指標 (圖 11 - 2).
當指標移動時眼睛也隨著調整 (且若你移動指標到它自己的眼睛之間, 它們會
變成鬥雞眼! (cross eyed!)

    你可以明確地給視窗的每個元素設定顏色 - 瞳孔, 背景, 外框等.

注意 :  xeyes 會使你的系統執行速度變慢.

               ┌────────────────┐
               │    p126. fig 11 - 2            │
               │                                │
               │                                │
               │                                │
               │                                │
               │ 圖 11 - 2 xeyes 程式           │
               └────────────────┘



11.3 智慧盤游戲 - puzzle

    puzzle 是一種古老的游戲, 有 15 個編號的小方塊被一個 4x4 框架圍住.
你必須移動小方塊使它們按照數字順序排列. (圖 11 - 3)

               ┌────────────────┐
               │    p127. fig 11 - 3            │
               │                                │
               │                                │
               │                                │
               │                                │
               │ 圖 11 - 3 智慧盤遊戲           │
               └────────────────┘

    你可以使用滑鼠控制游戲 :

    啟動游戲 : 藉著在控制棒的左上邊盒子內碰觸按鈕可以重新攪和小方塊.

    移動小方塊 : 將指標移到與空白位置相同的行或列的小方塊上,碰觸按
        鈕以移動該小方塊與所有它之前的所有小方塊進入空的位置. (所以
        移動後, 空位置在你碰觸按鈕的地方)

    由 puzzle 自己去解 : 在控制棒的右手邊盒子上碰觸按鈕.

    離開 (跳出) : 在控制棒的中間碰觸中間按鈕.


11.3.1 puzzle 的命令列選項

    使用一個大小不是 4x4 的框架 : 使用選項 - size width x height,
        其中尺寸是以小方塊為單位.

    改變小方塊被移動的速率 : 使用選項 -speed num. 此處 num 是每秒移動
        的數目 (預設值為 5).



11.4 列印一個大X語標 - xlogo

     xlogo 建立一個視窗並在它裡面顯示一個X語標(logo),如圖 11 - 4. 假
如你重定視窗大小,語標再次被繪出, 且儘可能地將視窗填滿.

               ┌────────────────┐
               │    p127. fig 11 - 4            │
               │                                │
               │                                │
               │                                │
               │                                │
               │ 圖 11 - 4 xlogo 程式           │
               └────────────────┘



11.5 跳動的多面體 - ico

    ico 產生一個視窗且在它裡面有一個 12 面體 - 一個具有 12 面的實心
體 - 如圖11 - 5 所示. 這個多面體是會動的, 它在視窗內不斷地碰撞跳躍.
在單色顯示器上你可能只有一個直線構成的圖 (使用選項 -i 可以反白顯示),
但是在彩色顯示螢幕上, 你可以看到實心的彩色面.

試下面的例子 :

    ico -nodeges -faces -colors red blue yellow green

    你可以設定一個跳躍的12面體在一個根視窗內 (背景視窗),而不必靠它自
己使用 -r 選項指定特定視窗. 另外, ico 可指定多面體的面數, 不是只有12
面體 : 如果你想得到一個完整的列表可以鍵入下列命令 :

    ico -objhelp

               ┌────────────────┐
               │    p128. fig 11 - 5            │
               │                                │
               │                                │
               │                                │
               │                                │
               │ 圖 11 - 5 ico 程式             │
               └────────────────┘



11.6 動態幾何圖樣 - muncher 與 plaid

    muncher 與 plaid 重覆地繪出變化多端而有趣的幾何圖樣 (圖 11 - 6a
與 b).

               ┌────────────────┐
               │    p129. fig 11 - 6            │
               │                                │
               │                                │
               │                                │
               │                                │
               │ 圖 11 - 6 muncher 與 plaid 程式│
               └────────────────┘



11.7 結論

    core版本中沒有非常廣泛的示範程式. 假如你曾讀取 contrib 的磁帶, 你
可能會發現下列有趣的程式 :

    paint : 簡單的繪圖程式. (像一個畫圖程式, 但你可以對區域塗上紋理
        或顏色, 不只是線.)

    xcolors : 一個可展示你的系統上所有顏色名稱的好程式.

    xfish : 設定魚在你的整個背景視窗內游動. 有趣的部分是你可以用滑鼠
        射擊它們.

    qix : 一個 qix 射擊遊戲的程式.

    xmille : 和你玩一個 Mille Bournes 的牌戲.

    xsol : 和你玩一個單人玩的牌戲.

    xtrek : 一個令人著迷的太空游戲.

=====

第參部  定製系統

第12章  資訊與狀態程式

    在本章,我們將討論一些提供視窗系統本身資訊和目前狀態的程式。
這包括了檢查系統上視窗各種性質 (property) 的工具,和一個觀察X
事件結構是如何工作的程式。

    這些程式有下列用途:

    •當你使用系統時,這些工具程式所提供有關系統內部組織和操作的資訊,
      可以幫助你瞭解發生了什麼事。

    •當你要做某種處理時,可以藉著所給的資訊來確認系統的組件。(例如
      你必須知道一個視窗的window-id,才可以用xwd 來傾印它。)

    •你將經常把從這些工具獲得的資訊,當成定製系統工具程式的輸入(稍
      後幾章會討論)。



12.1  列出你的Xserver的特徵 -- xdpyinfo

    xdpyinfo列出有關你的Xserver和server所控制螢幕之各種項目的資訊,
一個典型的輸出見圖12-1(一個server在Sun 3/50單色工作站上執行的結果)。

           ┌───────────────────┐
           │  p134     fig 12.1                   │
           │                                      │
           │ 圖12-1  典型的xdpyinfo工具程式的輸出 │
           └───────────────────┘



12.2  獲取有關視窗的資訊

    有三個程式可以提供目前在你顯示器上視窗的資訊。它們是從不同的角度
看系統:

    1.  列印視窗的階層 -- xlswins

    2.  對單一視窗詳細的資訊 -- xwininfo

    3.  列出視窗的性質 -- xprop



12.2.1  列印視窗的階層 -- xlswins

    在第一部曾經提過,所有在系統上的視窗被安排成樹狀的階層,根視窗
(也叫背景(background)視窗)在最上層,在其下才是應用視窗,每一個應用
視窗可以擁有它自己的子視窗階層。

    xlswins 列印出這個樹狀結構,從根視窗或所指定的視窗起至其下所有的
樹狀結構,對每一個視窗,xlswins 列出視窗的window-id 並用括弧括住它的
名稱(如果有的話),子視窗則在下面的幾行依序以縮入(indent)兩格的方式
列出。下面的圖對xman應用程式列出三個不同子樹的輸出,藉以展示xlswins
如何剖析系統的結構。

    圖12-2a 是xman主選單的樹。你可以看到在應用視窗(0X600011)中含有另一
個視窗(0X600012),而(0X600012)又包含了四個視窗,不需要知道原始程式,
你也可以猜得到是一種視窗包含著視窗,而對子視窗做某種管理的情況。

    圖12-2b 是xman手冊頁(manpage) 視窗的樹。比上一個例子複雜一些,而且
也無法在確定是否在這一頁手冊頁中總共就只有這麼多視窗和子視窗。所以 ...

    圖12-2c 這是xlswins 更詳細的輸出,比上一個例子需要在命令列中多加
一個 -l 的選項,多出來的訊息為巢狀的深度(第幾層樹)、相對於父視窗的
幾何座標和大小、和視窗左上角距離根視窗的座標(也就是螢幕上的絕對座標)
,有了這些視窗的座標,你就能瞭解它們在螢幕上的位置,如果你還是搞不太
清楚,可以執行xwd ,指定xlswins 所輸出的window-id ,在本圖,我們發覺
視窗(0X60005d)是高而窄的,所以可能是一個捲動棒。我們可以試著用命令:

        xwd -id 0x60005d | xwud

結果的確 xman 捲動棒的圖形出現了,這個命令我們在9.2.1 節有提過(只不
過這一次我們不把輸出送到檔案,而利用導管 (pipe) 的技巧直接當成另一程
式的輸入。)你可以用這種方法分析任何視窗。

           ┌──────────────────┐
           │  p136     fig 12.2                 │
           │                                    │
           │ 圖12-2  三個xlswins 的輸出         │
           └──────────────────┘

注意:並非所有的視窗都可列印出資訊,如果你碰到這種無資訊可供列印視窗
,你將獲得類似下面的訊息:

        x Protocol error: BadMatch, invalid parameter
        attributes
        Major opcode of failed request: 73 (X_GetImage)

    為了篇幅的關係,我們只列出了完整xlswins 輸出的三個小部份。如果在
你自己已經有好幾個應用程式的系統上,你將可以看到uwm 和xterm 選單所相
關的子樹,或者是與 xmh和 xedit 的命令按鈕相關的子樹。


12.2.2  關於單一視窗的詳細資訊 -- xwininfo

    xwininfo能夠針對特定的視窗給你大量的資訊,你可以藉著命令列的選項
告訴xwininfo你要哪一部份的資訊。圖12-3包含完整的列印輸出(用選項-all)

           ┌──────────────────┐
           │  p138     fig 12.3                 │
           │                                    │
           │ 圖12-3  典型的xwininfo輸出         │
           └──────────────────┘

    你可以用和xwd 相同的方法來指定你感興趣的視窗:

      •交談式(預設):開始時,xwininfo給你一個十字線游標,你可以將
        它移到你所需的視窗再碰觸滑鼠按鈕。

      •使用命令列選項:你可以用選項-root 指定根視窗,或用選項-id
        window-id 指定其它的視窗。

    你所看到的資訊可分為以下幾類:

    視窗的window-id :window-id 是視窗系統識別每一個視窗的參考,就如
        同先前所看到的,幾個程式(包含xwininfo它本身)給你一個數字代
        表window-id 。例如你要傾印一個視窗,你可以先執行xwininfo得到
        它的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結構的輸入源之一,我們將在
            第11章詳細地討論它。

幾個CUT_BUFFER:當你切取一段本文(做剪貼動作常用),這段被切取的本文
            被放在一個切取緩衝器(cut buffer)中,這些緩衝器被當作是根
            視窗的性質來儲存,對於切取,緩衝器是循環使用的,例如上次
            用5 號緩衝器,則下次用6 號,接下來7 號、0 號、1 號等等,
            但是黏貼則一定使用上次切取動作所用的緩衝器。

字型性質

    圖12-6列出當我們指定*times*bold*-i-*-180-*的字型性質,大部份的資
訊我們都不需關心,你可能只對FULL_NAME 和POINT_SIZE有興趣。

           ┌──────────────────┐
           │  p142     fig 12.6                 │
           │                                    │
           │ 圖12-6  字型的性質表列             │
           └──────────────────┘



12.3  觀察X的事件 -- xev

    ”事件”或多或少驅動著整個視窗系統,所有的輸入,不論是滑鼠或鍵盤,
均由”事件”來掌握,”事件”也被用來驅動視窗的重新建構和展現。xev 程
式讓你看到當不同的動作發生時,會產生什麼”事件”,以及和”事件”有關
的資訊。

    當xev 啟動,它會建一個類似圖12-7的視窗,而在這視窗中,會開始列出
類似圖12-8的有關事件的細節部份。

           ┌──────────────────┐
           │  p143     fig 12.7                 │
           │                                    │
           │ 圖12-7  xev 視窗                   │
           └──────────────────┘

           ┌──────────────────┐
           │  p143     fig 12.8                 │
           │                                    │
           │ 圖12-8  xev 的輸出                 │
           └──────────────────┘

    由於 xev提供大量的系統內部操作細節,你如果想要”實驗”系統,這是一個
很有用的程式,有兩個說明手冊上未提到的選項可以影響到xev 的行為:

-bs option:此選項改變xev 對server是否使用backing store (見第2章),
            使用backing store 將減少曝光”事件”的次數(也就是減少應
      用程式重新更新它自己視窗的次數),正確的選項內容為always,
      whenmapped和notuseful 。

-s:使用save-unders (見第2章),也就是說,要求server保存那些被xev
            的視窗遮蓋之視窗的內容。


12.3.1  xev 和鍵盤

    如果你將指標移入xev 視窗且按下你的鍵盤上的某一個鍵,則一個(或多
個)鍵盤”事件”會發生,”事件”的資訊包含了keycode 和keysym,這是最
容易觀察你的機器上某一個鍵是什麼鍵碼(keycode) 的方法:執行xev ,按一
個鍵,xev 便會給你資訊,這對定製你的鍵盤非常有用,見18章。



12.4  結論

    本章所述的這些程式,讓你觀察系統的內部;獲得它的操作細節;和它的
視窗及其它成員特定的資訊.對這些程式本身而言,它們能幫助你瞭解系統,
但它們最大的用途可能是用來連接那些定製系統的程式。以下的幾章在說明如
何定製和設定你的系統,好讓系統更適合你工作的習慣。

    下一章討論處理字型和顏色,及如何使用它們。

=====

第13章  使用X的字型和色彩

    X支援多種的字型及幾乎無限多種變化的色彩,大多數的應用程式允許你指
定應用視窗中各個不同部份的顏色,而幾乎所有的X程式均允許你指定你想要使
用的字型。

在X中的字型(fonts):

    •有固定的寬度(像啞終端機的字元)或成比例的間隙。

    •由本文字元(text characters) 或符號組成,或以上兩者均有。

    •具有多種的點尺寸(point size)。

    •可以修改以適應特定的螢幕解析度(例如對於同一點尺寸的某一種字型,
      你可能對75 dpi (dots-per-inch 每寸若干點) 的螢幕有一種版本,對
      100 dpi 的螢幕有另一種版本)。

    •有一種標準命名的傳統。

    •可以以全名存取,也可以用通用字元(wildcard)。

    •儲存在特定建構的目錄樹中,只要server在執行時,字型便可以加入或
      移出。

    在系統間進行字型的交換有一套標準的格式,並且有工具程式可以將這個
格式轉換成你的server能瞭解的格式,工具程式也包含了列出可用字型的目錄
、觀察某一特定字型內容等功能。

    本章先對字型作一簡短的介紹,讓你能儘快的使用它們,然後才轉而詳細
地解釋字型的結構、格式、工具程式等,最後一節討論色彩:如何設定和使用
它們。


13.1  字型初步

    本節的目的是讓你儘快地能使用字型,我們將告訴你如何找出有哪些字型
可用、指定你欲使用的字型名稱、看字型的外觀、如何在X應用程式中使用字型。


13.1.1  列出可用的字型

    xlsfonts程式一行行的列出server上可用的字型,圖13-1顯示部份的
xlsfonts的輸出,內容為MIT 版標準的字型。

         ┌──────────────────┐
         │      p146     fig  13.1            │
         │                                    │
         │     圖13-1  典型的字型目錄列表     │
         └──────────────────┘


13.1.2  字型命名

    有些字型的名稱太長以致使用不便,但很幸運的,它們也不常被使用,並
且,X支援字型名稱可使用通字元(wildcard):

    ?  對應任何一個字元
    *  對應從(字元)長度為零至長度若干的字串

    這和Unix shell傳統的通用字元檔案名稱相同,使用通用字元可使你更容
易指定字型名稱。

注意:如果你在shell 的命令列指定一個通用字元的字型名稱,需要在名稱前
      後加上雙引號 。


13.1.3  觀察一個特定的字型

    xfd (X font displayer 的縮寫) 程式由引數(argument)得到字型的名
稱之後,建立一個視窗並且在視窗中顯示此名稱之字元字型,例如:

        xfd -fn "*symbol*-180-*"

將顯示如圖13-2的視窗。

         ┌──────────────────┐
         │      p147     fig  13.2            │
         │                                    │
         │     圖13-2  字型的展示             │
         └──────────────────┘


13.1.4  以X程式使用字型

    大多數的X程式使用文字,並且允許你指定使用的字型,如何使用的詳細
細節可能因不同的程式而異,如果有問題的話可以看指南頁。但是幾乎都是以
命令列中選項 -fn fontname 或 -font fontname 來指定字型名稱,bitmap、
xclock、xterm、xload、xmb 和 xedit都是這樣操作的。例如假設你是為了展
示的緣故,以很大的字型執行xterm ,你可以用下列命令列:

        xterm -fn "*courier-bold-r-*-240-*"

注意:如果你給程式的指定對應到一種以上的字型,則server會隨便在其中選
      取一個,例如:如果你省略了上例中的 -r 的指定,則你會使用到意大
      利斜體(italic)字型或反斜體(reverse oblique) 字型,和原來所指定
      的羅馬(roman) 字型的機會是一樣的。

    現在你應該有一些概念了,我們將從不同的觀點詳細地討論。


13.2  字型如何命名

    在X中,字型可以取成任何名稱,但幾乎所有的字型均依照它們的本質來
命名,這樣的命名方式,名字是由幾個不相關的部份組合而成,而我們在使用
應用程式時,光憑著字型名稱便可以大略瞭解字型的內涵。

    我們以一個字型名稱為範例,逐一解釋它的組件,組件之間是由短橫線(-)
所分開的,而且可以包含空白,字型名稱對字元大小寫並不會區別,範例如下:

    -adobe-times-bold-normal--12-120-75-75-p-67-iso8859-1

    adobe :字型的製造廠商。

    times :型態家族(type family) ,其它尚包含courier ,helvetica 和
            new century schoolbook。

    bold  :粗體字,其它包含light (細)和medium(中等)。

    r     :字體傾斜的型態,r 是roman (羅馬體),其它是 i(italic意
            大利體),o (oblique 傾斜體)。

    12    :字元的高度,單位為像素。

    120   :字型的點尺寸(point-size),為點的10倍(120 意為12點,一點
            約為1/72英吋寬)。

    75-75 :字型被設計在顯示裝置上的水平和垂直的解析度(每吋若干點)。

    p     :字和字之間的間隙,p 是proportional(成比例的),相對的是
            m (monospaced固定寬度)。

    如果你對某一欄有特別的興趣,在本版的說明文件檔

        $TOP/doc/fontnames/fname.txt

中,有對每一個組件完整的說明。

    你通常比較有興趣的項目為家族型態、字體粗細、何種斜體字以及字型大
小,除了指定這幾項的值外,其它的項目不妨藉著通用字元的方式去指定。


13.2.1  通用字元和字型名稱

    在第13.1節中,我們曾經解釋過通用字元的規則:星號(*)表示對應到
零或多個字元,問號(?)對應到一個任意的單一字元。

    你可以隨意的使用通用字元,當你的設定對應到一種以上的可用字型時,
server會隨便挑一種字型來用,如果你的設定什麼字型也沒對應到,通常你會
獲得一行訊息,而server將會使用預設字型。

    你可以對字型的點尺寸使用通用字元,而不是像素尺寸,因為在顯示器上
一個給定點尺寸的字型對不同的解析度有不同的像素尺寸,所以用通用字元指
定點尺寸可以造成與裝備無關的效果,上述的範例你可以如此設定:

        *-times-bold-r-*-120-*

也就是說以-120-取代-12-


13.2.2  列出可用的字型 -- xlsfonts

    xlsfonts列出在你server上可用的字型(如果你使用用命令列中-display
選項,便可列出其它server上可用的字型)。預設是列出所有的字型,但是就
如同Unix的ls命令一樣,如果你加上限制,便只會列出合乎限制的項目,例如:

        xlsfonts  "*-times-*-180-*"

列出所有18點Times的字型。

    原則上,xlsfonts試圖在每行列印出儘量多的字型名稱,但實際上,大部
份的字型名稱都很長以致一次只能印一個名稱,但是要小心,當字型名稱含有
空白時,一行有數個字型名稱常常容易混淆。

注意:許多的字型名稱開頭為一短橫線(-) ,所以xlsfonts會誤把此種狀況當
      成命令列的選項來解釋以致發生錯誤,例如:

        xlsfonts  "-adobe-*"

會失敗,你可以用選項-fn 加以區分,或者只要在設定之前加一個星號(*)
即可:

        xlsfonts  "*-adobe-*"
        xlsfonts  -fn "-adobe-*"



13.3  觀察特定字型的內容 -- xfd

    xfd 是一個”字型顯示”的程式,它建立一個視窗,而後在視窗中將字型
的元素顯示在長方格子中。視窗可能沒有大到一次將字型中所有的字元顯示出
來(尤其是你可能對它重定過大小),但你仍然可以存取它們:

    向前移動:在xfd 視窗中碰觸滑鼠右按鈕,視窗的下一頁將會出現。

    向後移動:碰觸滑鼠左按鈕。

    獲取字元的資訊:在字元上碰觸滑鼠中按鈕,xfd 會給你字元號碼,如果
    你在程式一開始設定命令列選項-verbose,你將獲得一些更多的資訊,例
    如字元的大小以及它在字元”cell”中的位置。



13.4  如何儲存字型及存在何處

    在本節中,我們描述字型不同的格式,以及轉換兩種不同格式的工具,然
後討論server是如何存取字型和你如何更改對字型的選擇。最後,我們會給一
個完整的範例來說明如何加入一種新的字型到你的系統。


13.4.1  字型的格式 -- Server Natural Format (SNF)

    字型在server上是以Server Natural Format (SNF) 方式儲存,這種格式
並不是一種標準,而且為server所專用,所以你不能將字型移到不同型態的
server。

    showsnf 程式印出儲存在SNF 檔中字型的資訊,對字型本身執行xprop 可
獲得更多類似的資訊。(showsnf的引數為檔案名稱,xprop 則為字型的名稱,
字型名稱和檔案名稱並不相關。)

Bitmap Distribution Format(位元映像分佈格式)-- BDF

    為了克服字型流傳的問題,X協會對字型交換指定了一種格式,就是Bitmap
Distribution Format (BDF) ,BDF 以ASCII 的方式表示字元的位元映像,並
且只包含可印出的字元,所以它具有完整的可攜性(portable)。

    在”Bitmap Distribution Format”文件中包含了對BDF 完整的描述。

從BDF 轉換成SNF - bdftosnf

    為了讓BDF 能夠有用,你必需能將BDF 字型檔轉換成SNF 檔,目前X協會
放棄讓這個需求成為X的成品。

    在MIT 版,你可以用bdftosnf來完成轉換。

由其它的格式轉換

    許多的繪圖機器擁有它們製造商自己發展的字型,通常特別適合它們的顯
示器。如果這些字型能在X使用那是再好也不過了,但是因為格式的問題,你
不能使用它們。

    MIT core版並不管這個問題,但是core版則有許多的工具程式將製造商特
製的字型轉換成BDF 格式,從BDF 你又可以用bdftosnf轉換成你自己的SNF ,
本章稍後我們會有一個這樣的範例。


13.4.2  字型儲存在何處 -- 字型目錄

    字型被儲存在server上某一個或多個字型目錄(font directory)中,字型
目錄由三個部份組成:

    1.  一個普通的目錄,為包含著字型的SNF 檔案之所在。

    2.  一個被X使用,將SNF 檔案名稱對應到字型名稱的資料庫。

    3.  一個可選擇性的別名檔(aliase file) ,可以讓你用一個以上的名稱
        參考到同一字型(不論你使用了多少個目錄,你只需要一個別名檔)。

維護字型目錄 -- mkfontdir

    mkfontdir 設定新的字型目錄並且可以修改它:

   1. 在檔案目錄中搜集了所有你要使用字型的檔案,檔案可以是BDF 檔(通
常檔名結尾為.bdf),SNF 檔案(.snf)或被壓縮的SNF 檔(.snf.Z),mkfontdir
會自動將非SNF 檔案轉換為SNF 檔案。(被壓縮的檔案是被BSD 壓縮程式執行
過用以節省檔案空間。)

   2. 如果你要使用別名,需要在字型目錄中建立(或編輯)一個名為
fonts.aliase的檔案。有關此檔案格式的細節部份在指南頁中有說明,簡單地
說,它的格式為每行以空白間隔出兩個欄位,第一欄是別名的名稱,第二欄則
是字型的名稱(可包含通用字元),例如:

        tbi12  *-times-bold-i*-120*

注意:你對字型定義的第一個別名將造成該字型真正的名稱無法使用,以上例
      而言,你只能以tbi12 來存取字型,這種情形也許下一版會改進,但目
      前你可以在第二行將第一行反過來即可(但不可使用通用字元)。

        tbi12  *-times-bold-i*-120*
        -adobe-times-bold-i-normal--12-120-75-755-p-68-iso8859-1 tbi12

   3. 執行mkfontdir ,需把檔案名稱當成引數輸入,以你使用預設的X建構
為例 :

        mkfontdir /usr/lib/x11/fonts/misc\
                  /usr/lib/x11/fonts/75dpi\
                  /usr/lib/x11/fonts/100dpi

(如果檔案目錄中沒有包含字型資料庫,mkfontdir 會忽略它。)

注意:建立一個字型目錄並不會導致server”注意”它,你必需重新啟動server
      或重設字型搜尋路徑(search path) (下面描述):

字型搜尋路徑 -- xset

    你可以使用任何數目的字型目錄,但如果它們有任何和預設建構不同的地
方,你需明確的告訴server,這些字型目錄的列表稱之為字型搜尋路徑(font
search path)或字型路徑(font path) ,你可以設定這個一連串以逗點為區隔
的檔案目錄。

    查看你目前的字型路徑:使用命令xset q,如此會印出一大堆資訊,其中有
一行包含著你的字型路徑類似下面:

        Font Path : /usr/lib/x11/fonts/misc/,(cond.)
                    /usr/lib/x11/fonts/75dpi/,/usr/lib/x11/fonts/100dpi/

    設定不同的字型路徑:使用命令xset fp new-path,例如,如果你有大量
的本地字型且不欲使用多數的標準字型:

        xset fp /usr/local/xfonts, /usr/lib/x11/fonts/75dpi

注意:fp之前並無一短橫線(-) ,是fp而非 -fp(-fp 的意義不同,見下述)。

    當你想重新設定server對字型路徑的預設值時,使用命令:

        xset fp default

    告訴server重新讀入字型的目錄,使用命令:

        xset fp rehash

    它告訴server你可能已經改變了字型目錄的內容而和它必須重讀字型資料
庫,現在新加入的字型可以開始存取了。

    在現存的路徑加入新的字型目錄,使用命令:

        xset +fp dirlist

加入一列由逗號分隔的目錄列(dirlist) 在現存路徑之左,而

        xset fp+ dirlist

則將目錄列加到路徑之右。

    將字型目錄自路徑移去:下兩個命令列

        xset -fp dirlist
        xset fp- dirlist

均可將在dirlist 中的目錄自現有路徑移去。

注意:字型路徑由server所掌握,而被所有使用該server的client所應用。

    字型路徑的次序是重要的,我們曾經提過字型設定可以對應至一或多個字型,
server會自行選擇,但如果對應的字型是在不同的目錄中,則server會選擇在
路徑中較早出現者。

    你可以利用這個原則來安排最適合你的顯示器解析度的字型。假設你的顯
示器解析度為100dpi,則將100dpi字型設在75dpi 之前,例如:

        xset fp /usr/lib/x11/fonts/100dpi/,\
                /usr/lib/x11/fonts/75dpi/

    如果你指定字型為:

        * -times-bold-r-*-120-*

雖然字型有75dpi 和100dpi兩種版本,但你會用到100dpi的字型,這正是你所
需要的。


13.5  範例:增加新字型至你的server

    現在我們將說明如何增加一個新的字型到你的server的完整範例,為了
真實起見,我們以Sun所提供的字型為例,將它轉換至BDF ,然後裝設(install)
它,字型開始時在:

        /usr/lib/fonts/fixedwidthfonts/screen.r.7

    欲將Sun 的字型轉換成BDF ,我們需使用contrib 版的軟體程式vtobdf(
其它系統也有類似的工具)。vtobdf有兩個引數,分別是輸入檔檔名和欲建立
之BDF 檔檔名,我們可以事先自contrib 磁帶取得此程式,編譯它,而後加入
我們可執行的目錄中,我們就可以使用它了,我們將或多或少依據X的標準來
命名這個新的字型,我們喜歡把輸出檔的檔尾名用.bdf,但由於vtobdf會在字
型名稱後自動產生.bdf,所以可以省略它,但在稍後之重定名稱則不可省略。

        venus% cd/tmp
        venus% vtobdf /usr/lib/fonts/fixedwidthfonts/screen.r.7\
              -sun-screen--r-normal---70-75-75-m---

現在重新命名檔案,並將其搬入字型目錄:

        venus% mv- -sun-screen--r-normal---70-75-75-m---\
        /usr/lib/x11/fonts/misc/-sun-screen--r-normal---70-75-75-m---.bdf

最後,執行mkfontdir 和告訴server重新讀入字型目錄以便能使用此字型:

        venus% mkfontdir
        venus% xset fp rehash

檢查一下此字型是否真的可用:

        venus% xlsfonts "*-sun_screen*"\
        -sun-screen--r-normal---70-75-75-m---

注意:你的字型可能可以取代其它的預設字型,但這些字型檔案可能因有保護
而無法更改,必須問一下你的系統管理者。


13.6  使用X的色彩

    我們已經用過一些色彩,但並未細述它們,原因是X允許你用日常常用的
彩色名,在本節我們描述一些其它指定顏色的方法,解釋命令結構如何工作和
你如何設定一些你自己擁有的色彩名稱。


13.6.1  RGB 色彩設定

    換一種指定色彩的方式,你可以用RGB (Red (紅)、Green (綠)、Blue (藍))
三元素來指定,設定之形式為:

        #<r><g><b>

必須合乎以下的原則:

    .設定必需以井字號(#) 開頭。

    .元素需依照紅、綠、藍的次序依序設定。

    .三元素均必須指定。

    .每一個元素為十六進位,共佔一到四個位數,因此ffff代表色彩的最大
      強度,0000代表沒有該色彩,例如:

        #0000ffff0000

      是最亮的綠色,紅色和藍色一點都沒有,同樣的:

        #000000000000 黑色(什麼色彩都沒有)
        #ffff0000ffff 紫色(全部的紅色加藍色)
        #ffffffffffff 白色(全部的色彩)

      注意#rgb和#rrrgggbbb代表的色彩強度是相同的,但後者較亮一些。

    .每一個元素可由一到四個位數代表,但每個元素的位數則相同(例如你
      不可以用#rrbbbbgg )。

    你可以在設定色彩時直接使用色彩名稱,例如:

        xclock -fg #3d7585 -background pink

    色彩設定的形式往往和你的顯示器非常相關,通常沒有什麼可攜性。


13.6.2  X色彩資料庫

    為了克服#rgb色彩設定不可攜的缺點,而且使系統更易於使用,X使用一
個儲存色彩名稱及其相關之rgb 值的資料庫。

    除非你的系統在裝設之後作了明顯地改變,應該會有一個/usr/lib/x11/rgb.txt
的文字檔說明資料庫的內容。這個檔的前數行類似於:

        112 219 147 aquamarine            (綠玉色、碧綠色)
        50  204 153 medium aquamarine     (中度碧綠色)
        50  204 153 Medium Aquamarine     (中度碧綠色)
        0   0   0   black                 (黑色)
        0   0   255 blue                  (藍色)
        95  159 159 cadet blue            (學生藍)

    每一行前三個數字表示rgb 的元素值,但在此數值是10進位的,且只從0
到255 ,255 代表色彩最大強度,第四個部份為色彩名稱,允許名稱中間有空
格。

    你可以用程式$TOP/rgb/rgb將此文字檔轉換為內部的形式,(當你的X系
統建立時,它並不會被裝設)。所以,要在你的資料庫中加入一個新的色彩,
先用文字編輯器將色彩輸入rgb.txt 檔,然後:

        venus% cd usr/lib/x11
        venus% $TOP/rgb/rgb < rgb.txt

事實上,rgb 並不需要每次均重建內部資料庫,只需加入新增(或修改)的項
目即可,所以你可以用標準輸入來輸入色彩:

        venus% $TOP/rgb/rgb
        255  50  50  mypink
        …

因為沒有任何標準的工具程式可以查詢內部資料庫的內容,因此上面的作法會
造成rgb.txt 和內部的資料庫不一致,所以還是以修改rgb.txt 的方式為佳。


13.7  結論

    本章你已經看到如何命名和儲存字型,你如何找到可用的字型及字型的內
容,在X應用程式中如何使用字型,和如何在你的系統中加入新的字型。

    最後一節則描述了X的色彩命名原則,色彩資料庫和如何加入你自己的色
彩。

    這裡所描述的公用程式只包含core版,contrib 版包含更多的軟體,例如
有一個叫做xcolors 的程式,它可以建立一個視窗,並在其中顯示在你系統上
已命名的色彩。

    多種的字型和色彩在你的螢幕上出現是一種衝擊,接下來你會看到更多的
視窗系統的功能,並嚐試調整使其適合你工作的習慣及品味。

    下一章我們將繼續定製這個系統,告訴你如何利用X的位元映像公用程式
來建立、編輯和使用影像。

=====

第14章  定義和使用位元映像

    一個位元映像是一個小圖,說得更清楚一點,一個圖的顯現是由像素組成,
而像素又是由一個位元來對應,當位元為”1 ”時,像素為”黑色”,而當位
元為”0 ”時,像素為”白色”。X有許多的公用程式來管理位元映像,你可
以用不同的方法來建立、編輯和儲存它們。有一些使用者程式允許你直接使用
它們。(其它大部份的程式則以內部的形式使用它們,這些公用程式大都放在
X程式庫中,使得使用者撰寫程式時很容易便可加以運用。)

    本章開始先描述位元映像的工具,接下來實際使用xsetroot程式,它可以
讓你定製你的螢幕,設定一個位元映像的背景,選擇你的色彩和指定一個位元
映像當作游標來使用。


14.1  系統位元映像程式館

    位元映像檔案的程式館被當作系統的一部份提供給你,預設儲存在這個目
錄:

        /usr/include/x11/bitmaps

但在你的工作站上或許不同,問一下你的系統的裝置者,我們將以此目錄為準,
並用其中的一些檔案作為本章的範例。


14.2  交談式地編輯一個位元映像 -- bitmap

    bitmap程式是一個讓你以交談式建立或編輯位元映像的工具,它將位元映
像以方格子來表示,每一個格子代表一個像素,你可以用滑鼠設定或清除像素。


14.2.1  啟動bitmap

    透過bitmap你可以編輯一個包含有一個位元映像的檔案,或從頭開始建立
一個位元映像並將它儲存為檔案。不論是何者,當你啟動bitmap時,你需要給
一個檔案名稱,不論是現存的檔案或是新建的檔案。

    當建立一個新的位元映像時,你可以選擇性地指定大小(寬度X 長度個像
素),如果你未指定,預設大小為16X16 。舉例來說,假如我們想要建立一個
比較大一點的十字型數位映像,我們可以用下面的命令列:

        bitmap big-cross 40X50 &


14.2.2  使用bitmap

    假如我們要編輯一個現存的檔案,可以用下面的命令列啟動程式:

        bitmap /usr/include/x11/bitmaps/cntr-ptr

則一個像圖14-1的視窗出現在螢幕上,右下角以實際大小顯示出目前位元映像
的狀態,另一個則為反相(reverse) 的位元映像,其它在右邊的”盒”你可以
用碰觸滑鼠按鈕的方式來操作它們。

用三鈕滑鼠編輯圖形最簡單的方法:

    設定像素:在一個像素上碰觸滑鼠左按鈕,或者是按住左按鈕並拖拽它,
              每一個經過的像素方格均會被設定,直到鬆開按鈕為止。

    清除像素:和上述相同的方法,但是以滑鼠右按鈕代替。

  反轉(invert)像素:在一個像素上碰觸滑鼠中按鈕(也就是黑的像素被清
              除而白的像素被設定),當你按住中按鈕並拖拽,所經過的像
              素格均會反轉。


        ┌────────────────────┐
        │      p160  fig 14.1                    │
        │                                        │
        │    圖14-1  位元映像編輯器              │
        └────────────────────┘

    bitmap還有其它的面貌:如果你觀察接近箭頭的上端部份(見圖14-2的
放大圖),你可以在其中的一個方格中看到有一個小菱形,這代表了熱點(hotspot)
,當bitmap被用來建造一個游標時會應用到:熱點是游標真正動作的點。指向
型的游標,熱點通常在頂端,而圓形或方形的游標,熱點則在中心。(你可以
用Set Hot Spot和Clear Hot Spot兩個命令來更改熱點的位置或消去它)

    當你結束了你的更改動作,可以用碰觸Write Output將位元映像儲存至檔
案,但不會離開bitmap程式。

        ┌────────────────────┐
        │      p161  fig 14.2                    │
        │                                        │
        │    圖14-2  一個游標的”熱點”          │
        └────────────────────┘


    離開程式,碰觸Quit,如果你編輯了位元映像卻試圖在未儲存前離開程式,
你將會得到提示以確定你是否真要如此做。


14.2.3  畫形狀(shapes)

    bitmap有數個功能使得畫圖更容易:

    畫一條線:碰觸Line,游標會變成一個大黑點,在所欲畫的線的一端碰觸
              一下按鈕,而後在另一端也碰觸一下,bitmap會畫出這條線。

    畫一個中空的圓:碰觸Circle,同樣地,游標變成一個大黑點,在你所欲
              畫圓的圓心碰觸一下,而後在所欲畫圓之圓周上的任一點碰觸
              一下,bitmap將畫出這個圓的圓周。

    畫一個填滿的圓:碰觸Filled Circle ,其餘同上。


14.2.4  在長方形的區域內工作

    命令Clear Area、Set Area和Invert Area 必須在長方形區域下操作,長
方形區域的決定方式是你在它的左上角以按住滑鼠任意按鈕的方式指定,然後
拖拽到右下角,當你拖拽時,目前被指定的區域會以高亮度顯示。

    你可以拷貝、移動或重疊(overlay) 一個區域,你以拖拽的方式指定原始
區域,而後在目標區域上的左上角碰觸按鈕,各種命令的動作如下:

        拷貝(Copy):目標區域會被消除,而所有對應於原始區域為黑像素的
                    均會被設定。

        移動(Move):原始區域和目標區域均被清除,目標區域對應於原始區
                    域為黑像素的均會被設定。

        重疊(Overlay) :在目標區域中對應於原始區域被設定的像素均會被
                    設定,其它沒有改變。


14.2.5  一個位元映像的檔案格式

    一個位元映像會如同ASCII 文字一樣儲存到檔案中,其格式類似C 語言程
式片段。

    例如:檔案  /usr/include/X11/bitmaps/cntr_ptr   的內容:

          #define cntr_ptr_width  16
          #define cntr_ptr_height 16
          #define cntr_ptr_x_hot   7
          #define cntr_ptr_y_hot   1
          static char cntr_ptr_bits[]=
          0x00, 0x00, 0x80, 0x01, 0x80, 0x01,\
          0xc0, 0x03, 0xc0, 0x03, 0xe0, 0x07,
          0xe0, 0x07, 0xf0, 0x0f, 0xf0, 0x0f,\
          0x98, 0x19, 0x88, 0x11, 0x80, 0x01,
          0x80, 0x01, 0x80, 0x01, 0x80, 0x01,\
          0x00, 0x00;

    帶有_x_hot和_y_hot的變數僅在熱點被指定後才會包含進來。

    更多的細節包含在bitmap(1) 的指南頁中,不過無論如何,你毋需直接以
此種格式處理位元映像,任何你想要做的事均有工具程式來處理。


14.3  編輯位元映像其它的方法

    bitmap程式對於一個小的圖形工作起來算是相當方便,但它有一些缺點:

    .它不接受較簡單格式的輸入檔,例如像一些由掃描現存圖形所產生的檔案。

    .它必需以交談式執行,對一些程序性的編輯動作並不方便。

    .你可能希望用它產生一些位元映像來顯示,但它無法在非X系統上執行。

    要克服上述的問題,需要以字元圖(character picture) 的形式來建立位
元映像,並提供這個格式和bitmap的格式相互轉換的程式。字元圖格式是非常
明顯的:每一行的像素用一行的字元來表示,黑的像素用一個指定的字元(預
設為# )而白的像素用另一個字元(預設為 -)表示,以cntr_ptr為例,字元
圖的格式如圖14-3

        ┌────────────────────┐
        │      p164  fig 14.3                    │
        │                                        │
        │    圖14-3  字元圖格式的位元映像        │
        └────────────────────┘

    你能以本文編輯器或其它任何系統上任何其它合適的程式編輯這些圖形,
也可以由掃描器(scanner) 或其它影像設備產生。


14.3.1 字元圖和X位元映像間的轉換

    X提供了兩個程式作字元圖格式和位元映像格式間的轉換:

    atobm : 轉換一個字元圖為標準的位元映像。

    bmtoa : 轉換一個標準的位元映像為字元圖。

    兩個程式均允許你指定以何字元來代表黑和白像素。


14.4  定製你的根視窗 -- xsetroot

xsetroot 讓你設定你的根視窗的特徵,你可以改變視窗背景的顏色和圖樣(
pattern) ,以及視窗所使用的游標。

14.4.1 設定一個背景的位元圖樣

   你可以指定任何位元映像來當作你螢幕的背景(只要它是X的標準格式)
, 在 xsetroot 的命令列上,-bitmap 選項跟隨著位元映像的檔案名稱。例如:

    xsetroot -bitmap /usr/include/X11/bitmaps/mensetmanus

會出現一個精緻的背景(見圖14-4)(拉丁語 Mens et Manus (mensetmanus)
是 MIT的箴言,兩個人物的圖形簡單表現出 MIT的精神。)

             ┌────────────────┐
             │                                │
             │  P165   Fig 14.4               │
             │                                │
             │圖14 - 4 設定 mensetmanus位元   │
             │         映像為背景圖樣的根視窗 │
             └────────────────┘


14.4.2 設定一個背景游標

如果你不要使用預設的 "大的 X "游標,你可以用選項 -CURSOR 加上
cursorbitmap 和 maskbitmap兩個引數來改變它,兩個引數均為位元映像
檔案的名稱。例如:設定游標為前節所示的位元映像,使用命令:

    xsetroot -cursor /usr/include/X11/bitmaps/cntr_ptr\
    /usr/include/X11/bitmaps/cntr_ptrmsk

位元映像的對照圖見圖14-5.

             ┌────────────────┐
             │                                │
             │  P166   Fig 14.5               │
             │                                │
             │圖14 - 5 游標及其遮罩的位元映像 │
             └────────────────┘

maskbitmap決定了cursorbitmap的哪些像素真正被顯示出來:游標像素
中只有對應到遮罩像素(mask)為黑的部份才會用到,游標其它的像素不會
被顯示出來。總結來說,遮罩決定了游標的外形,反之,游標位元映像則
決定了外形的顏色。遮罩和游標的位元映像必須大小相同。

這種遮罩結構在兩種情況下非常有用:

1.  它允許 "乾淨地" 顯示出非長方形游標,而不需顯示出多餘的空白。例如
如果沒有遮罩,cntr_ptr會顯示成一個 16 x 16白方形中有一個箭頭,當你用
它指物件時,物件的一部份會被矩形外框遮蓋住。

2.  適當地設定遮罩,你可以保證不論背景的顏色為何均能看得到游標。例如
cntr_ptrmsk 比 cntr_ptr 的邊均大一個元素,所以游標周圍圍繞著一圈白邊
。如果遮罩和游標大小相同的話,當游標在黑色的區域將會消失不見。

    你可以讓遮罩和游標使用相同的位元映像:游標的外形會如你所期望(因
為遮罩決定外形,而這外形正是你想要的),它們可以工作,但是當游標進入
和它相同顏色的區域時,你就很難看到游標了。實際上,並非所有在
/usr/include/X11/bitmaps中的位元映像均有相對應的遮罩,如果你使用它們
當作游標,你必須使用游標位元映像當作遮罩。

    有興趣的話,試一試把mensetmanus 當作游標和遮罩(熱點是在左上角)。


14.4.3  其它的背景設定選項

    你可以用命令列選項 -solid colour設定背景為單一顏色(在單色顯示
器上只有黑色和白色)。你可以用 -grey或 -gray設定顏色的灰度,你也可以
用 -mod x y 設定格子圖樣,x 和 y為 1到16的整數。


14.4.4  重定預設的背景和游標

    如果你不喜歡你既有的設定,你可以用下列兩者之一恢復預設的游標和背
景:

        xsetroot -def
        xsetroot


14.5  總結

    本章中,我們看到如何以交談的方式編輯位元映像,如何儲存它們,和如
何把它們與其它格式之間作轉換以使它們能被那些非視窗系統程式處理。你可
以把位元映像和xsetroot連接在一起,以定製適合你自己口味的系統:用不同
的方法設定你根視窗的背景和變更游標。

    下一章,我們繼續來定製系統,並且來看一下你用以設定X程式預設選項
的結構。

=====

第15章  定義應用程式的預設選項 -- Resources

    大多數的X程式接受命令列選項,以便讓你指定前景和背景的顏色、字型
、起始位置等等。這種需求是有必要的,因為如果你在程式內硬性規定使用某
種字型,而在執行此程式的機器上並沒有這種字型,則將使得程式無法執行,
所以你不應硬性規定某些參數。

    當你每次執行程式時不太可能在命令列中指定所有需要的選項,因為有太多種
可能的組合了,所以X提供了一個叫做resources 的一般性結構,用來傳遞預
設的設定給應用程式。當你閱讀指南頁時,你可能已經注意到要你參照resources
,但卻不知道什麼是resources ,我們將在此解釋。

    你在系統中幾乎所有的定製動作都將運用到resources ,事實上你為一
個應用程式所選擇的每一個選項的設定都要用到resources ,從簡單的項目例
如色彩或字型,到定製你的鍵盤或管理你的顯示器如何工作,它非常的方便,
而且在系統中到處都用得到。

    本章我們描述什麼是resources ,及關於它們是如何發展的資訊,接下來
我們描述X Toolkit(工具),它完全地使用到了resources 的結構;然後
告訴你一些resources 工作的細節,你該如何設定它們,及你能用它們設定哪些
型態。

    這是相當長的一章,有幾個新的觀念被加進來,一開始會有些困難,但不
需太擔心,原則上resources 結構非常地簡單,只是第一眼看起來好像有許多
 "魔術符號" 而已,也許你應該先很快地瀏覽一遍,然後再詳細地重讀一遍。


15.1  什麼是resources ?

    在X的文獻中,”resources ”有兩種意義。第一種是相當低階的,意指
被server管理或建立而被應用程式使用的東西。視窗、游標、字型等均屬於這
種意義。

    另一種意義也就是通常你在指南頁中常看到”resources ”的意義:它是
一種傳遞預設設定、參數和其它值給應用程式的方法。在本章中我們侷限於
討論此種意義之resources 。在解釋現行系統如何工作前,先回顧一下X的早
期版本是如何掌握這些功能的,因為現行的結構由此產生。


15.1.1  ”預設”的背景

    在X較早的版本,對於像視窗背景顏色、視窗邊界的顏色、應用程式所使
用的字型這類項目你可以輕易地設定其預設值。

    預設值的設定方式很直接,你只需指定一個視窗的屬性和它的預設值。例如:

    .Border : red

意即所有的視窗均為紅色的邊(除非你在命令列中重新設定邊的顏色),你也
可以把程式的名稱放在屬性之前,則只有被指名的程式才會改變,所以把以下
這個規格

        xclock.Border:blue

和先前的規格結合在一起的意義為:預設所有視窗均為紅色的邊,只有xclock
的視窗為藍色的邊。

    每當你設定預設值,程式會自動取用該值,所以你毌需每次均指定你的選
擇,它讓你依照適合你的工作習慣來使用字型,不論是你要用較小的字型以獲
得更多的資訊顯示,或是用較大的字型以便閱讀,它讓你為特定的應用程式選
擇顏色,你可以定義應用程式的起始位置,所以你可以自行設計一些啟始螢
幕的佈置,因為許多的預設值(字型、色彩等)實際上精確的意義為”resources”
,所以”resources ”的意義逐漸擴增為”預設值設定(default setting) ”
或”設定預設選項(setting default options) ”。


15.1.2 Resources 傳遞資訊到應用程式

隨著X的發展,應用程式也隨之擴增,需要有一個設施傳遞大量的資訊到應
用程式以定製或指定它們的行為,而不再只是有關色彩和字型的資訊而已,
例如你可以告訴 xbiff檢查信件的頻率,或定義 xterm的功能鍵(function-key)
12為插入某一特定的字串,或在 xedit中連續碰觸兩次滑鼠中按鈕代表選擇目
前這段本文等等。

    所以逐漸地,resource及預設設施已遂一被發展出來,直到目前對於傳遞
任何資訊到一個應用程式已是一個一般性的結構。你可以像文字串一樣地指定
資訊,應用程式會在內部解釋它:例如把這字串當作一個滑鼠按鈕的名稱,或一種顏
色,或由應用程式所發出的一個功能和 "resources"是如何指定的。

    這個結構也逐漸地複雜起來以便讓你能正確地指定在何處應用預設值。在
以前,你只能指定所有的程式或某一個特定的程式。現在的系統你可以設定的
預設值如:”終端機視窗的選單選項”或”在所有視窗的標籤”或甚至”除了
xterm以外的所有編輯器視窗按鈕盒中的功能按鈕”。

    X Toolkit, 使得resources在使用上有很大的包容性並且增進了應用的
精確度。你需要先了解 Toolkit是什麼,才能適當地使用resource 結構,我
們將在下一節討論。


15.2  X Toolkit

    我們先前曾提過,X並不決定使用者介面,它只是提供一些結構,讓應用
程式設計者能組合成任何形式的介面。理論上這是非常合乎需求的 -- 它使得
系統擁有一個一般性目的的工具且沒有使用上的限制,但從另外的角度來看,
它有很大的缺點:

    .對一個使用者而言,不同的應用程式有不同的介面,不只是難學難記,
      且應用程式無法平順地 (smoothly) 相互協調工作(例如無法在視窗之間
      做剪貼),你得到的是一群個別的、獨立的程式,而不是一個一致的、
      合作無間的系統。

    .從程式設計師的立場,意味著基本視窗系統上的每一件事均需從頭做起,
      選單、捲動棒、時鐘、功能鈕等等都必須一一生產。甚至在單一的產品,
      不同的程式師做了一點稍有不同的事,便會導致許多不相容的情況。

為了克服上述的問題,Toolkit(工具)的方式應運而生。

    在某些範圍,Toolkit 會決定使用者介面的形式,但是無論如何,它會儘
量減少這種影響,並讓使用者介面發展者有更多選擇的可能性,Toolkit 被分
為兩個部份:

    1. 一組基本的結構和函數用以建構使用者介面的元素,被稱為Toolkit
        Intrinsics(內部的工具)。不論是什麼樣的介面,任何工具均需使
        用到它,所以我們可以把Toolkit Intrinsics視為”固定的”,也就
        是無可替代的。

    2. 一組提供特定的使用者介面(或介面的形式)的元素,這些元素被稱
        為 widgets (小工具),而Toolkit 的第二部份稱為 widget set (小
        工具組),我們認為這是可以替換的,不同的介面提供不同的Widget
        Sets ,甚至它們都使用Intrinsics。

下面兩個小節更詳細地說明這兩個部份。


15.2.1  Toolkit 的第一個部份 -- Intrinsics

    Intrinsics定義的實體稱為widgets,並提供了所有建立、管理和毀壞widget
所需的設施。理論上,一個widget是一個處理特定動作的使用者介面的元素,實際
上一個widget是X視窗加上規則和功能以決定它的輸入和輸出的動作,也就是
說,它如何對使用者有所反應。

    為了幫助解釋widget的觀念,我們將給一點範例,但是請注意!它們並不
是Intrinsics的一部份,而是我們將於下一小節討論的一個特定的widget組的
一部份,在此提出目的只是為了方便。

    Command Widget(命令widget):這是一個在螢幕上含有一些文字的長方
形”按鈕”(也就是一個小視窗)。當指標在這個按鈕之上時,它的邊會呈現
高亮度,當一個滑鼠按鈕在這個widget被碰觸時,一個被程式師指定的軟體常
式(routine) 便會被執行。

    你已經使用過command widget好幾次了:在xedit 的命令選單和在xman的
主選項視窗。

    Scrollbar Widget(捲動棒widget):同樣的,你也已經使用過了好幾次,
在xterm 和xedit 中捲動本文,在xman中捲動本文和目錄列。

    Intrinsic 提供了基本的結構,任何一個提供介面的較高階軟體均需要使
用到它,它提供了以下的功能:

    .建立和毀壞widget。

    .把一群widget當成一個單元(unit)來管理。

    .掌握geometry,也就是說位置,包括從最高階(也就是應用程式的 -geometry
      選項)到最低階(管理應用程式用到的sub-widget的位置(例如選單按鈕
      的位置))。

    .掌握”事件”,例如在一個widget中, 當滑鼠按鈕被碰觸時呼叫適當的程
      序、管理視窗的曝光 (exposure)和掌握鍵盤的輸入。

    .管理給resources 和預設的每一個widget。


15.2.2  Toolkit 的第二部份 -- Widget Sets

    廣義來說,Intrinsics只提供你建造一個使用者介面的骨架,Widget Set則
實際地提供了一個既定的介面,且不同的widget組提供不同形式的介面,雖然
對任何範圍的需求並無法預防混用widget,但一般仍希望一個系統固定在
一致性的widget set上。

    在X core 版上只有一個widget set提供,我們描述於下:

Athena Widget Set (雅典娜widget set)

    大部份的MIT core版的應用程式使用Toolkit 和Athena Widget Set.(名
稱的來源是X由MIT 的Athena計畫產生出來)。這些widget的定義你已在許多
的應用程式用過。

    我們在前節提過了Command Widget和Scrollbar Widget,至於Athena Widget
Set 的其它部份包含:

    Label Widget:這個你可以想像 -- 在視窗中顯示的一個字串或圖。(例
                  如在xman主選項選單中的”Manual Browser”的標題)

    Text Widget :我們在第10章描述xedit 時提過的”building block”。
                  它提供我們所使用的編輯功能。

    Viewport Widget :一個具有捲動棒的視窗,讓你可以捲動視埠(viewport)
                  的內容,xman使用其中之一用以顯示指南頁之目錄。

    Box Widget:它以一個指定大小的盒管理sub-widget的佈置,且試著將 sub-
                widget儘量集中在一起,例如xmh 的Reply 、Forward 等命
                令鈕即是由Box Widget佈置。

    VPaned Widget :它管理sub-widget,將它們保存在垂直堆疊中,且顯示了
                  在兩個sub-widget之間的分隔線上的”把手”(grip),把手
                  可以選擇性的讓你改變一個widget的大小,而且另一個相
                  關的widget大小亦伴隨變化,例如我們在圖10-12 看到的
                  xman的視窗的主要的元素是被VPaned Widget 管理的。

    Form Widget :另一種管理一組sub-widget的方法,但對位置的選擇有更多
                  的彈性。

    List Widget :它管理一群字串,將它們安排在行列中,任何的字串藉
                  著於其上碰觸的動作而被選擇:字串會轉為高亮度,且呼叫
                  一個指定的函數以完成特定的動作。xman使用一個List
                  Widget來掌握在一個指南章節中指南頁的表列。

    我們現在來看一下如何組合widget以獲得所需要功能,我們仍然以xman為
例。xman的指南頁之目錄在它的低階是list widget ,管理目錄頁名稱的表列
以及它本身的內容是用viewport widget (讓使用者捲動至表列中所需的位置
),將指南頁的widget聚集在一起,它們是包含在一個VPaned Widget 中,所
以事實上這是一個階層狀(hierarchy) 的widget,每一個可以完成它的專門
功能,而所有的應用程式所使用的Toolkit 均含有這三個widget結構。



15.2.3  widget:名稱和類別 (Names and Classes)

    resource和預設結構是在widget名稱的基礎下工作,所以我們將以對名稱
的處理做一個概觀方式來結束對Toolkit 的觀察,並回到先前討論的resource。

    Toolkit 提供一個物件導向程式系統(object-oriented programming system)
給程式設計師。它定義物件的類別(class) ,也就是指定何時物件被建立或如
何操作等等的物件性質。這些物件即是widget,系統將確保它們和其它的widget
以及其它部份的應用軟體以定義明確的方式交談。

    當一個程式設計師建立一個特定類別的widget,它被稱為該類別的成員
(instance)(概括的說,一個類別是一個抽象的定義,而一個成員在某些地方
實際地符合這些定義。)建立widget有必須一個名稱,由程式設計師指定,(
例如:程式碼的實際型式為”Creat a widget, of the class Box Widget,
and call it topBox ”)在某些環境下widget的類別名稱也會被參考到。總
結來說,一個widget有一個成員名稱和類別名稱;更簡單的說,一個名稱和一
個類別。



15.3  Resources 如何被管理 -- Resource管理器

    讓我們提醒自己一下我們試圖用resource來做什麼?我們要能傳遞資訊給
一個應用程式,告訴它以某些方式改變它的一般性動作,例如,將視窗的邊
以粉紅色取代原來的黑色,或使用一些特別的字型。

    X用下述的方式掌握這些需求。你設定一個包含許多項resource規格的資
料庫,每一個resource規格以一個應用程式的某些特徵命名,且設定一個值給
這個特徵當預設值,也就是說,一個規格 (spec) 的形式為:

        characteristic : value    (特徵:值)

    當應用程式開始執行時,它會先詢問資料庫是否有任何特徵符合自己所要
的設定,或使用相關的值,例如:

        xclock*foreground:blue

    意為將值blue設定給特徵xclock*foreground 。用以決定一個程式的需求
是否符合在資料庫中之規格的系統部份,被稱作Resource管理器。

    Resource預設值能被應用到一個應用程式中的物件(通常是widget),就
如同設計整個程式一般,(例如你可以對一個特定的子視窗在某一個命令按鈕
的背景色設定預設值,而不是只能針對所有應用程式的視窗背景)。為了能達
到這一點,我們需要一些嚴謹的命名方法,以設定物件應用預設值。


15.3.1  指定一個Resource預定應用到何處

    Resource管理器根據特徵值(characteristic)決定一個預設規格是否能應
用在特別的情況,我們可將特徵值分為三個部份。

    1.  你用以設定預設值的程式屬性,例如:背景色、字型等。

        你必需指定屬性 (attribute) -- 意即你設定什麼值給它。給定一個
        resource的規格 而不說明它的值是無意義的。

        注意:在X的文獻和手冊中,屬性通常被稱為”resource”或
        ”resource name”,”Resource”也通常被用來當作我們稱為特徵值。

        特徵值的其它兩個部份指定預設值在何處使用。例如只在特定的程式
        使用或在特定型態的物件,或兩者均是。

    2.  應用到這個規格的應用程式的名稱,如果你省略它,規格將應用到
        所有的應用程式。

    3.  一連串的限定(restrictions)條件:當物件符合限定條件時,才會產
        生指定的應用。限定通常為widget的名稱,你可以指定從零開始任何
        數目的限定。例如:

          xclock*foreground:blue
          xedit*row1*Command*Cursor:Cntr_ptr

        第一個例子沒有任何限定,第二個例子有兩個限定(row1 和Command)

        三個部份依序排列

        [<program name>] [<restrictions>] <attribute>

        並以特殊的分隔符號分開,我們將於稍後說明分隔符號的細節,但我
        們先看一些特徵值的範例(為了簡單起見,我們在範例中只用到顏色
        屬性)。


一些說明Resource規格的範例

    .指定在任何地方中的前景色預設值為黃色。

          *foreground:yellow

    我們未指定任何應用程式的名稱,所以此規格可應用到所有的應用程式;
我們也未指定任何限制,所以對一個應用程式在任何地方都適用。("*" 這個
符號就是我們方才提及的特殊分隔號的一種)

    .指定只有在xclock應用程式中的前景色預設值為粉紅色。

          xclock*foreground:pink

      這個規格僅能在xclock適用,但是只要項目中的屬性叫做
”foreground”的均適用。

    .現在,針對一個特定應用程式的特定地方:

          xman*topBox*foreground:blue

      這個規格僅能在xman適用,而且只能在xman主選項選單中名為topBox的
物件適用。(應該適用於xman中所有叫topBox的物件,但實際上只有一個
topBox物件)

    .在第二個範例(粉紅色)中我們包含了應用程式名稱,但忽略了任何限
      制,現在我們反過來:

          *command*foreground:green

      也就是說,我們指定在任何應用程式中物件名稱為command 的前景色預
設值為綠色。



15.3.2  用類別名稱一般化規格說明

    前述的例子說明了我們對預設值結構所需的大部份功能,但它們有一個限
制:你必須知道應用程式設計師設計在每一個應用程式中的widget名稱,這
些資訊有時包含在程式的指南頁中的一部份,但通常被省略。

    無論如何,Resource管理器有一個儘量減低這個問題的方式:當你在特徵
中不論何處用到一個應用程式名稱、限制或屬性名稱,你均可類別名稱(class
name)來代替它。

    應用程式類別名稱(Application class name):描述程式的型態,例如
        xterm 可以是Term Emul (終端機模擬器)的類別,xedit 和emacs
        是Editor(編輯器)的類別。(但如果xterm 是xterm 的類別,xedit
        是xedit 的類別則失去意義。)

    限定類別名稱 (Restriction class name):限定幾乎是一定不變的widget
        名稱,所以在此地你可以用widget類別名稱。

    屬性類別名稱 (Attribute class name) :屬性是如同widget一般的一個
        型態或類別的成員(instance)。

    傳統上,所有的類別名稱以一個大寫的字母開頭,其後則為小寫字母,例
如屬性”foreground”是屬於”Foreground”類別,我們將簡單的解釋你如何
去發現你需要用來指定項目的類別名稱。首先,我們將看一些更多的範例,這
次用到了類別或一個混合了類別和成員的範例。


含有類別名稱的Resource規格說明範例

    這些範例展示出你如何在Resource規格中使用類別,而較前述以更一般性
的方式設定預設值,它們也解釋了你如何能使用一個類別來設定一個預設值給
較大範圍的情況,和將類別與成員結合起來以拒絕預設值在某些特殊情況下設
定。

    .指定在任何地方前景色的預設值為黃色

          *Foreground:yellow

    這個範例和先前範例的區別在於我們是對Foreground類別指定預設值。這
個區別之所以重要,是因為並非所有在類別Foreground的屬性,它的成員名稱
都是叫foreground。例如,xclock的指針的顏色可由類別Foreground的屬性來
決定,但它的成員名稱不叫foreground而叫hand。

    .我們可以用這種結構來幫助我們在文件不清楚的情況下,藉著以強烈對
      比的組合設定預設值來分辨物件的類別:

          xmh*Command*Foreground:khaki        (土黃色)
          xmh*Command*Background:maroon       (粟色)

      如此將使所有的命令widget(command widget)呈現醒目而美麗的顏色。

    .對所有的本文widget(text widget) 視窗設定一個預設值,除了xedit
      視窗以外:

          *Text*Background:pink
          xedit*Text*Background:navy

    .和上例原理相同:

          *Command*Backgrond:green
          xman*Command*Backgrond:white
          xman*manualBrowser*Command*Background:orange


如何發現成員和類別名稱

    這很困難,因為沒有簡單和一致的widget名稱、類別、屬性等等的文件,
我們只能列出每一個最好的來源,並且提示你如何獲得更多的資訊。

    應用程式成員名稱(Application instance name) :這很容易--它就是你
執行的應用程式名稱。如果此程式使用Toolkit ,你能在命令列以選項-name
string明確地指定一個不同的應用程式名稱,為何你需如此作?因為它讓你在
單一應用程式中定義超過一組的預設值,而你可以使用-name 在其間切換。例
如,你可以定義一個xterm 的正常預設值,但對名為demo的應用程式定義一個
很大的視窗尺寸和大尺寸的字型,你可以用:

          xterm -name demo

給你一個用來展示或教學的xterm。

    應用程式類別名稱(Application class name):這沒有文件說明,最簡
單找尋它的方法是啟動應用程式並在視窗中使用xprop ,性質 (property)當中
的WM_CLASS會給你應用程式成員及類別的名稱,例如,對xterm 你會得到:

          WM_CLASS(STRING) = "xterm","XTerm"

    Restriction/Object/Widget 成員名稱:程式的指南頁會列出你最想要存
取的物件名稱,例如:xman列出topBox,help,manualBrowser 等等,如果指
南頁並未給你成員名稱,則唯一的方法是如果可能,直接看它們的原始程式碼
。(這種方法通常無法令人滿意)

    Restriction/Object/Widget 類別名稱:這容易些,大部份的指南頁會告
訴你有興趣的物件類別,即使沒有的話,大部份的物件也是標準集合中的
widget,當你從系統中使用它們時,你通常能猜出它們屬於哪一個類別。(例
如:你從未被告知scrollbar 的成員名稱,但它99.9% 的機會是類別Scrollbar
的widget (成員)。)

    屬性名稱和類別:大多數的指南頁會列出名稱,通常也會有類別,xclock
的指南頁便是非常清楚的範例。

    無論如何,利用Toolkit 寫的程式通常使用標準的widget,它的屬性並不
會在指南頁中列出,但通常由一組全部或部份的屬性組成,要找到這些屬性,
你必須在Toolkit 文件中尋找:

     . "X Toolkit Intrinsics" 手冊中的附錄E 列出所有標準的"resource"
        (也就是屬性)名稱和類別。成員名稱項目看起來類似:

          #define XtNborderWidth "borderWidth"

        所有的名稱均以XtN 開頭,跟隨其後的名稱則以小寫字母開頭,而類
        別的名稱則以XtC 開頭,類別的項目看起來像:

          #define XtCBorderWidth "BorderWidth"

        在雙引號中的便是名稱,也就是說,borderWidth 是成員名稱,
        BorderWidth 是類別名稱。

     . 查看"X Toolkit Athena Widgets"手冊的2.3 節("Common Arguments
        in the Widget Argument list"),可看到被所有widget使用到的
        resource名單,包括名稱、型態、預設值和一段文字敘述。名稱的
        定法如上所述,也就是以XtN 開頭,XtN 之後則為屬性名稱。

     . 查看"X Toolkit Athena Widgets"手冊中對widget的描述,每一個會
        列出它所使用的"resource",和上述相同。

     . 如果以上均行不通時,你可以查看 widget 的原始程式 (source code),
        resources 可用到的部份列在 XtResource 資料結構中。例如,Athena
        Scrollbar Widget的程式內包含:

          static XtResource resource[]=
          {XtNwidth, XtCWidth,...},
          {XtNheight, XtCHeight,...}.

    附錄A中”文件指引”中會告訴你如何找到類似像這個項目的原始程式。

    注意:Resource Manager對設定的規格(spec)並無限制,均能接受,對於屬
          性、元素名稱或類別並無事先定義的清單。你所給定的規格可能毫
          無意義,但毋需介意,它將存在資料庫中,所以事實上一個resource
          規格被接受並不意味你已經得到正確的規格和正確的屬性或物件或應
          用程式;無論如何,它的一個重要的用途為在屬性未被設定前你可先
          設定其預設值。


15.3.3  Resource規格之分隔號概觀

    你可以用星號 (*)或點號 (.)來分隔resource規格的元素,星號比較通用
一些,它讓你指定那些符合範圍的案例的特徵。我們看到

          xclock*foreground:pink

用來指定xclock中任何東西均使用foreground屬性,所以在此範例中可以看出
;星號具有通用字元的效果,甚至可以再一般化一點:

          *Foreground:yellow

它將適合任何應用程式,而句點只是分隔組件,它表示每個組件都必須一一對
應,所以規格:

          xman.Manual Browser.Help.background:black

並不會適用於命令按鈕,或含有xman的視窗的不同widget。在我們對這兩種分
隔號作更精確描述前,我們需要更詳細的看一下Resource Maneger的操作。


Resource Manager如何運作

    稍早,我們曾說過一個應用程式會查詢resource預設規格的資料庫看是否
符合,現在我們描述查詢如何掌握這些規格。

    Resource被應用程式中的個別物件(通常是widget)所使用,而物件則被
在應用程式上端hierarchicallyixwidget + hierarchy安排,然後可能由一個
widget管理其它的widget配置,例如本文視窗、命令選單等等。例如應用程式
xeditixwidget 在+ xprognxxedit中的階層結構如圖15-1(每一行物件名稱之
後括弧內為類別名稱)。

        ┌────────────────────┐
        │      p181  fig 15.1                    │
        │                                        │
        │    圖15-1 xedit中物件(widget)的階層    │
        └────────────────────┘


    對每一個物件,應用程式欲查詢Resource資料庫時,它必須傳遞物件的成
員全名和類別全名給Resource Manager,和物件所用的一群屬性,和類別名稱
的一群屬性,例如對SAVE按鈕,應用程式指定:

          full instance name    xedit.vpaned.row1.Save
          full class name       Xedit.VPaned.Box.Command
          attribute instance-names borderWidth,cursor,font,label,...
          attribute class-names    BorderWidth,Cursor,Font,Label,...

    而後Resource Manager檢查每一個在資料庫中的規格,看它是否和應用程
式所傳來的屬性和物件名稱相符。如果相符發生,在資料庫中規格值的部份會
傳回應用程式。

    在這種相符的操作中,星號和句號的區別非常重要。簡單來說,我們可以
想到Resource Manager只是以單字為基準來對應文字串,句號正是每一個單字
的區隔號,星號也是分隔號,但不同的是它可以通用字元的方式代表從零到任
意數目的單字,對於對應唯一的限制是在資料庫中規格的屬性必需對應查詢應
用程式所傳來的屬性,你不可對屬性用通用字元。

    現在你可以看到不同的規格如何工作:

          *foreground:yellow

可以應用於任何應用程式中的任何物件。因為星號對應到所有的應用程式和所
有的限定和物件名稱。

          *Command.Foreground:violet

應用於任何應用程式中任何Command 型態中Foreground類別的任何屬性。

          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.6  Resource和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.4  Resources 的型態----如何指定值

    直到現在我們仍然只看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結構或應用程式的其它物件來設定較大範圍
的預設值。從這裡我們介紹類別的概念,它可以讓你指定物件而無需知道它們
個別的名稱,接著談到Resource Manager和它在資料庫中對應resource規格的
規則以便程式查詢預設值,最後,我們大致說明如何指定它們的值。

    本章專注於resources 結構運作的規則,現在是告訴你如何在系統下實際
使用的時候了。在下一章,我們告訴你如何及在何處儲存預設規格,也就是說
,如何管理我們前述的”resource資料庫”。在這章之後,我們解釋如何使用
resource來定製你的鍵盤。

=====

第16章  實際的使用Resource

    前一章解釋X resources的規則----為什麼需要它們,結構如何工作和
resource規格的格式。本章中繼續討論resources ,但較強調實用性:我們告
訴你如何及何處設定resources 預設值,來影響你的系統的一部份或全部。在
本章結束前,我們將完成一些範例,點出你可能常見的錯誤,並告訴你如何克
服它們。

    在這些範例中,我們假設你自己的工作站叫做venus ,並且大部份時間你
是使用它。從venus 的顯示器,你可在遠方的機器saturn和mars上執行client
應用程式且和venus 共享檔案系統;neptune 則不可,我們曾在第4章描述過。

    當你在本章中時,記得resource結構是:傳遞資訊給應用程式,通常這些
資訊是用來傳遞一些比較感興趣的預設值(例如色彩和字型),但只要應用程
式取得協調你就能使用這種設施傳遞任何資訊。所以我們一般狀況下傾向於把
”resource規格””預設值”(defaults)”resource”這三個名詞視為同一含
意。


16.1  在何處儲存resource的預設值

    在上一章我們只告訴你輸入resource規格到”一個資料庫”,但未告訴你
如何做。事實上有幾個不同的地方可以儲存預設值:這些”地方”通常是一個
你可以用任何編輯器修改的簡單的文字檔案,但有一個特殊的位置需要特殊的
工具來設定它,我們先很快的給你一個概念,再討論細節部份。

    首先它的架構非常的複雜:包含命令列選項總共有八種設定resource方法,
但有兩個重點需要注意:

    1 .你最好只使用其中的一或二種設置,只要你做完啟始設定,你將只
        須改變預設的設定。

    2 .系統是被設計來掌握許多不同模式的工作,和滿足那些在許多顯示器
        上工作或在一台顯示器上工作而存取遠方機器的使用者的。

    總結來說,這些設置是提供來讓系統儘可能富於彈性,但任何時刻你將只
須存取其中的子集合而已。


16.1.1  設定Resource的八種方法

    總共有八種方法設定resource,但它們可分為下面幾類:

    .應用程式專屬的(Application-specific)resource:resource的表列,
      限定檔案只能被特定的應用程式讀取。

    .Server專屬的resource:應用設定,不管應用程式在那一種主機上執行。

    .主機專屬的設定(Host-specific-setting) :對應用程式在主機上執行
      有關的設定,和顯示器無關。

    .命令列選項:在執行時期做一次關閉(one-off) 設定。

應用程式專屬的resource -- 方法1 和方法2

    Toolkit 程式初始時在和應用程式直接相關的兩個檔案中尋找resource,
這些檔案只能被特定的應用程式讀取:

    1 .應用程式--類別(Application-class) resource檔案:這個檔案包含
        了機器一般性(site-wide) 對應用程式的類別之預設值,通常為系統
        管理者所設定。它的名稱就是應用程式類別的名稱,在標準安裝的系
        統中它是儲存在目錄/usr/lib/X11/app-defaults 中,例如xterm 的
        相關檔案為:

          /usr/lib/X11/app-defaults/XTerm

        在core版中,有一個相關於Xmh 的此種檔案,觀察此檔案可以看所使
        用之設定的型態。

    2 .你自己擁有的應用程式專屬的resource檔案:這個檔案的名稱和上述
        相同,但它存放在不同的地方----由shell 變數$XAPPLRESDIR所指定
        的目錄,如果未定義,則放在home目錄。例如對Xmh 類別的程式,它
        的檔案放在下列二者之一:

          $XAPPLRESDIR/Xmh
          $HOME/Xmh

        你可以使用此種檔案,處理方法1 中你不喜歡的 site-wide檔案使其無
        效。

Server專屬的Resource -- 方法3 和方法4

    這是對你目前工作的Server(顯示器)做有關的設定。鍵盤的設定通常是
server專屬的(因為不同的顯示器有不同的鍵盤)。另一個server專屬的特徵
為顯示器是彩色或單色。

    Resource和這些有關的項目會被所有與這個終端機相關的應用程式應用到,
並且不論應用程式在何主機上執行。(例如,如果你使用的顯示器為單色,則
不管你的應用程式在何處執行,你還是不會要它使用彩色。)

儲存server專屬設定的方法是:

    3 .server的RESOURCE_MANAGER性質(property):(你可在12章中xprop
        的輸出看到),使用下述的xrdb程式,你可以在server的根視窗的
        RESOURCE_MANAGER性質中儲存resource設定。它的優點如下:

        (a) 你不需編輯任何檔案即可設定預設值。(當你為了了解系統而實
            驗系統時特別有用)

        (b) resource被server掌握,所以不論應用程式在那一部主機上執行,
            均能被所有的應用程式應用。在我們的範例中,在neptune 的
            情況下特別有用,甚至在不和我們的顯示機器venus 共享檔案系
            統時,它仍然自動地選出為了使用此顯示器所必需的resource設定。

    4 .你的$HOME/.Xdefaults檔案:(只有在根視窗沒有RESOURCE_MANAGER
        性質定義的情況下使用)。如果你對xrdb尚不熟悉,你便可以此檔取
        代,但你必須在每一部你執行client應用程式的機器上均設定一個。

主機專屬設定 -- 方法5 和方法6

    主機專屬預設值和server專屬相反,不管應用程式所使用機器的終端機為
何,只要應用程式在此主機上執行,均使用主機專屬預設值,你可以用它們來:

    .讓應用程式在不同的機器上對不同的檔案系統作計算,例如:被一個應
      用程式讀取的資料檔案可能在不同的主機上保持不同的位置。

    .區分顯示在同一個螢幕上不同的主機的視窗(這些視窗可能由同一個應
      用程式執行),例如:你可以要所有在mars機器上執行的xterm 的視窗
      為紅色的邊框,而在saturn上執行的視窗為黃邊。

    .調高一個相同的應用程式在不同的client機器上版本的差異,例如:
      xterm 在venus 是標準的MIT 版,但在neptune 機器上是由第三集團修
      改過以適應機器結構的產品,這兩版的xterm 可能並不完全相容。

主機專屬Resource儲存在:

    5 .由$XENVIRONMENT 來的檔案名稱:如果shell 變數$ENVIRONMENT有被
        定義,它會被解釋為一個含有resource設定的檔案之完整的路徑名稱。

    6 .你的$HOME/.Xdefaults-thishost 檔案:(當$XENVIRONMENT 未被定
        義時使用)。注意它和我們先前的檔案有所不同,它必須附加上主機
        名稱,例如,如果你在neptune 執行應用程式而在venus 顯示(假設
        RESOURCE MANAGER性質未定義),則server專屬 resource 讀取自:

          .Xdefaults

        而主機專屬resource則是:

          .Xdefaults-neptune

        兩者均在neptune 的家目錄(home directory)中。

    注意:在不同的小節中,我們曾說過類似”server專屬resource讀取自...”
這可能造成誤導:”如果你實際需要,你可以放置任何型態的resource設定到
任何的檔案或資料庫。”我們真正的意思是你應該放置機器特性或不論甚麼的
resource到任何地方,如果你這樣做,你將獲得你需要的動作。

命令列選項 -- 方法7 和方法8

    最後,你可以藉著命令列選項設定應用程式的值。通常當你設定預設值時
,為的是你不需要使用選項為你的程式作X相關的設定。但你實際上可以用它
們來:

    .一次關閉(one-off) ,例如:你暫時性地在螢幕上需要一個極小的xedit。

    .為了區別在相同應用程式中各自的成員,你已看過一個這樣的例子,當
      我們使用命令

          xterm -name demo

      來設定應用程式的成員名稱給demo,將造成以應用程式名稱為demo的
resource取代xterm 的resource。

命令列選項分為下列兩種:

    7 .應用程式專屬選項:例如xclock的-chime的xpr 或-scale。

    8 .Toolkit 標準選項:所有用到Toolkit 的應用程式均接受一些標準的
        命令列選項,我們看過其中的大部份,包括-fg, -bg, -display,
        -geometry 等等,標準選項的清單在”X Toolkit Intrinsics ”手
        冊的2.3 節中。

    在其中有一個選項-xrm,重要的足以用一個小節來描述。

Toolkit 標準選項-xrm

    大多數一般的resource均能被命令列選項明確地設定,例如你可以用
-bg colour設定視窗背景顏色。但無論如何,有一些resource並沒有符合的選
項。為了克服這點,Toolkit 提供一個 "捕捉遺漏" (catch all) 的選項-xrm
(X Resource Manager 縮寫)。

    -xrm以一個引數當做resource規格,就如同你在預設值檔案中輸入的相同,
例如:你可以輸入:

          xclock -xrm "*update:30"

和

          xclock -update 30

是相等的。

    在同一命令列你可以使用數次-xrm,但每一次只能包含一個resource規格,
例如:

          xclock -xrm "*update:30" -xrm "*chime:on"

    -xrm的好處在於你可以用它來設定任何resource供應用程式使用,尤其是
那些和命令列選項不符合的resource。其中一些非常有用的像:

    iconX, iconY:視窗表徵圖左上角x,y 座標的位置。

    iconPixmap:被用來當作視窗表徵圖的位元映像的名稱,你可以用它
                來指定任何的位元映像當作應用程式表徵圖。(位元映像
                為已有或利用bitmap程式建立。)例如:命令

                xedit -iconic -xrm "*IconPixmap:cntr_ptr"\
                              -xrm "*iconX:500"\
                              -xrm "*iconY:400"

                的意義為將xedit 設定以表徵圖開始啟始,表徵圖的左上角
                座標為(500,400) (在大多數的顯示器會在螢幕中央),使
                用名為cntr_ptr的位元映像來當作表徵圖。

    backgroundPixmap:設定用一個位元映像當作背景。

    borderPixmap:設定以一個位元映像當作視窗的邊,例如:

                xclock -bw 20 -xrm "*backgroundPixmap: scales"\
                       -xrm "*borderPixmap: cntr_ptr"

    執行xclock,用一個寬達20個像素的邊框,視窗的背景為魚鱗
(fish-scales) 圖案,邊框則用cntr_ptr的位元映像。

    所有的這些resource當然也可用類別指定。(如IconX ,BorderPixmap等等。)

    注意:請記住,-xrm只有在程式有用到Toolkit 才可應用。


16.1.2  設定Resource不同方法的摘要

    現在我們將如何對一個指定應用程式resource設定的八種方法作一摘要:

    應用程式專屬resource:它們被兩個檔案掌握,且僅能被Toolkit 使用,
              其中一個檔案通常由系統管理者設定,另一個由你自己設定。

    server專屬的resource:不是存在根視窗的RESOURCE_MANAGER性質中,便
              是在你的$HOME/.Xdefaults檔案中。

    主機專屬resource:如果shell 變數$XENVIRONMENT 有定義的話,存在其
              所定義的檔案中,否則在你的$HOME/.Xdefaults-host 檔案。

    一次關閉設定:用應用程式的本身命令列選項來設定,和用Toolkit 標準
              命令列選項,包含”捕捉遺漏”-xrm.

    它們以下列順序處理:

        if  (程式使用Toolkit )
              讀取 /usr/lib/X11/app-defaults/class檔案  (1)
              讀取你的 $HOME/class檔案  (2)
        if  (RESOURCE_MANAGER性質被定義)
              處理內含的指定   (3)
        else
              讀取你的$HOME/.Xdefaults檔案   (4)
        if  (shell 變數XENVIRONMENT被定義)
              讀取所定義名稱的檔案   (5)
        else
              讀取你的$HOME/.Xdefaults-host 檔案   (6)
        if  (程式使用Toolkit )
              處理標準的resource選項,包含-xrm  (7)
        處理應用程式本身的選項  (8)

    現在我們將更詳細的看一個較不熟悉的方法 -- 用來儲存server本身
resource的方法。


16.2  在Server上儲存預設值 -- xrdb

    大部份預設值的結構均和檔案有關,當應用程式啟始時,不同的檔案被讀
取且其內容被處理,這種方式的缺點為你希望所有的client在一個特定的
server上使用同一組的預設值,但client所執行的機器上如果沒有一個共同的
檔案系統,你該怎麼辦?

    答案是在server本身儲存預設值。X的性質設施是一個具有一般性目的的
結構。(記住,一個”性質(property)”是一小段已知格式資料的名稱,被儲
存在server),指定由server根視窗的RESOURCE_MANAGER性質載入,且當應用
程式啟始時系統會注意此事。當視窗系統啟始時,RESOURCE_MANAGER性質未定
義:如果你要使用這個設施,你必須明確地設定它。

    並沒有一個一般性的工具來操作一個性質,所以X提供了一個特殊的程式
來處理resource性質,它就是xrdb(the X Resource DataBase 公用程式)。


16.2.1  xrdb能為你做什麼

    為了方便起見,本章剩餘的部份,我們只把RESOURCE_MANAGER性質和它的
內容當成”資料庫”。

    xrdb的功能非常簡單,它讓你能:

    .設定一個新的資料庫。

    .看目前有那些resource在資料庫中。

    .在現存的資料庫加入一個新的resource。

    .完全去除資料庫。

    這些是基本操作,且很容易完成。當然也有一些更進一步的功能可以很精
確地讓你控制resource,但我們先來討論基本操作。


16.2.2  使用xrdb的基本功能

    xrdb的操作類似大多數Unix的程式:它從一個檔案或標準輸入讀取輸入資
料,並且你可以用命令列選項來控制它的操作模式,它所讀取的輸入是我們曾經看
過的一系列resource設定,不過比較特別的是它把這些設定載入資料庫,讓我們看
一看它主要的功能:

    設定一個新的資料庫:輸入下面命令兩者之一:

          xrdb filename
          xrdb < filename

用以將一個檔案中的設定載入到一個資料庫中,如果只鍵入xrdb,表示你將由
標準輸入(通常為鍵盤)直接輸入設定,稍後我們將說明xrdb所接受的檔案格
式,但現在先把輸入resource設定當作和.Xdefaults檔案或-xrm引數相同的方
法,例如,你可以用下列的方式定義xclock設定:

          venus% xrdb
          xclocks*Background: pink
          xclock*update: 30
          xclock*backgroundPixmap: cntr_ptr
          <end-of-file>

    通常你用一個檔案當作xrdb的輸入,也就是說,xrdb從一個檔案載入預設
值作為你的視窗系統初始化的一部份。如果你很有經驗,直接輸入它的設定也
許容易些。

    查看現存資料庫中的內容,輸入命令:

          xrdb -query

則xrdb將以明白本文格式(plain text format) 印出資料庫的內容(-query可
以縮寫為 -q )。

    (你可能記得也可以在根視窗用xprop 來看資料庫的內容,但xprop 的輸
出格式不太靈巧,它給你其它一大堆你不需要的資訊。)

    如果需要,你可以抓取xrdb的輸出到一個檔案,編輯它,更改設定後可再
用它當作xrdb的輸入。(下一項功能告訴你一個更好的方法)

    注意:查看資料庫,你必須使用選項-query。如果你忽略這個選項而只輸
          入xrdb,將造成會清除資料庫,且xrdb在等待你自標準輸入鍵入你
          新的設定。

    在現存資料庫加入新的設定:加入新的設定到資料庫且不要破壞原有的設
定,使用命令:

          xrdb -merge filename

    (-merge可縮寫為-m,如果你省略檔案名稱,xrdb會自標準輸入讀取。)
xrdb自指定的檔案中讀取resource設定,並加入現存的資料庫中;對於資料庫
中已存在的resource,如果有新的設定,舊值會為新值取代,否則則不會變動。

    完全移去資料庫:如同先前所述,當系統結束時資料庫會自動消失,但如
果你在系統仍在執行時移去資料庫,使用命令:

          xrdb -remove

    本節介紹xrdb基本的功能,下一節我們介紹當你熟悉系統時,你可能需要
的更進一步的功能。

16.2.3  xrdb的檔案格式

    你已知道大多數的格式細節 -- 你可以用標準的resource規格的形式

          characteristic: value

    上述的格式你已看過多次,但xrdb有兩個額外的規則:

    1 .註解(comments):每一行的開頭如果是驚歎號(!)會被忽略,所以
        你可以此當作註解。

    2 .xrdb預設將它的輸入列傳到C 前處理器。

    讓我們進一步看一看前處理器的過程。

xrdb前處理它的輸入列

    讓我們看一看一個你可能碰到的典型問題。假設在一般的場景,你使用下
列顯示器:

        venus   彩色螢幕,正常解析度
        saturn  單色螢幕,正常解析度
        mars    彩色螢幕,高解析度

    以上三者共享一個共同網路檔案系統,當你在一個顯示器上啟動X,你需
要定義預設值來反應顯示器的特徵。例如:在高解析度螢幕你可能需要較大的
預設字型,或是你不需要在單色系統上定義彩色預設值。

    如何做呢?讓我們看一看,如果你能使用.Xdefaults-host 檔案:在
Xdefaults-venus我們包含了彩色指定,而在.Xdefaults-saturn 我們只放入
單色型態的參數。行得通嗎?當然,但是是有限度的:它只能掌握應用程式在
和server相同的機器上執行,如果應用程式在其它的機器上執行會得到它們主
機上的預設檔案。所以如果你使用venus 且在saturn啟始遠方的client,將會
用到.Xdefault-saturn而錯失所有的彩色指定。

    你能夠只使用.Xdefault 檔案來區分機器嗎?不能,因為三台主機共享相
同的檔案系統,所以$HOME/.Xdefaults會被venus 獲得也會被其它的機器獲得。

    答案是在resource處理程序的某些地方,有一個結構可以分辨出所使用
server的某些特徵。xrdb可以用相當簡單的辦法做到這點,它先定義一些說明
server特徵的C 前處理器符號,而後將它所有的輸入傳遞到前處理器,最後將
處理過的資料載入資料庫。指南頁列出所有的xrdb定義的前處理器的符號,但
在此處我們需要用到的是:

    X_RESOLUTION=n:n是每公尺長螢幕有多少像素。(根據我們的server,我
們正常解析度的螢幕為每吋90個像素,相當於每公尺3454個像素。)

    COLOR :只有螢幕支援彩色才被定義。

    WIDTH,HEIGHT:螢幕的寬度和高度,單位為像素。

    圖16-1顯示我們如何在xrdb的輸入檔案使用這些。(我們命名為
$HOME/.Xresources ,稍後我們仍將再度用到。)它可以正確地做到我們所想
要的 -- 它正確掌握了所有我們的顯示器,不論是彩色或高解析度或兩者都有。

    一些要點值得注意:

          ┌─────────────────────┐
          │    P197   FIG 16.1                       │
          │                                          │
          │  圖16-1  利用前處理器命令的Resource檔案  │
          └─────────────────────┘

    .你可以使用所有前處理器的功能。例如,我們使用它的表示掌握
      (expression-handling) 能力:

          #if X_RESOLUTION > 3600

    .你可以在檔案中任何地方使用前處理器符號,並不只是前面有# 號的列,
      例如,當

          xload*Width: WIDTH

      在venus 上xrdb執行到時,它將會讀取成:

          xload:Width: 1152

    所以由預設值可知,xload 視窗寬度將和螢幕寬度相同,高為80個像素,
且在螢幕的正上方。

    注意:大多數Unix前處理器定義了一些和它們機器結構與作業系統相關的
          符號,這些可能會干擾到你,特別是Unix通常定義的符號,現在
          xrdb定義HOST為顯示器名稱中主機名稱的部份,所以你可能認為你
          可以像這樣使用一個resource規格:

              demo*title: X demo using display HOST

          比方在venus 上,預期它相當於:

              demo*title: X demo using display venus

          事實上,在我們的機器上會得到

              demo*title: X demo using display 1

          原因為顯示器名稱是unix:0.0,所以主機名稱部份為unix,但前處
          理器已定義了unix,所以整個解釋的順序為:

              HOST -> unix -> 1

          你可以用xrdb的-u選項來解除符號的定義,用以克服這點,也就是

              xrdb -Unix < filename

          但即使如此,主機名稱仍為unix,除非你明確地指定顯示器:

              xrdb -display venus:0 < filename

          另一個會產生干擾的範例,如何你輸入規格

              xedit*Font: *-sun-screen-*

          使用xrdb,現在用一個xrdb -query ,你可以看到在資料庫中實際
          地設定:

              xedit*Font: *-1-screen-*

    在我們sun 的機器上,前處理器定義成另一個符號。如果你使用和你的機
器相關的名稱,你可能也會得到相同的效應。(如果你決定不需要前處理器的
功能,你可以用xrdb的-nocpp選項停止它的功能。)


16.2.4  如何將資料庫設定和你的xrdb輸入檔連接在一起

    藉著像前述在一個含有大量前處理器命令的檔案執行xrdb,你初始化了資
料庫,在稍後的期間,交談式的使用xrdb,你將對資料庫做大量的更動,現在
你需要記錄這些設定,且將之與原來的輸入檔連接,以備將來之用。

    如果你只使用xrdb -query ,你只能獲得目前的設定:所有在輸入檔中的
條件指令列若和現在的server不符則不會被包含。例如在saturn上執行前述的
檔案,則所有色彩和高解析度的設定,均被忽略(當然以 #開頭的也不例外),
為了克服這點,xrdb提供-edit 選項,例如命令:

          xrdb -edit myresf

連接目前在資料庫中的值到檔案myresf內存在的內容,它藉著比對resource指
定特徵值的部份做到這點:如果在檔案中某一行和資料庫中某一項特徵相同,
則檔案中值的部份會被在資料庫中的值取代,用此方法,所有的以 #開頭的列
和條件設定均會保留在檔案中。

    注意:前處理器完全不可以使用-edit 選項,那會導致問題,我們看一
          下當我們使用venus ,且以前述檔案初始化資料庫時,會發生什麼
          情況,假設我們做了更動:

              venus% xrdb -merge
              XTerm*font: *-courier-medium-r-*-140-*
              <end-of-file>

          然後用命令:

              xrdb -edit myresf

          將設定更改的部份放回檔案,我們看到兩件事:

          1 .前處理器符號在規格中值的部份會被字面(literal)值取代,
              例如:

                xload*Width: 1152 會被

                xload*Width: WIDTH  取代

          2 .在規格中只要特性符合,值均會被取代,甚至那些在條件段中
              目前尚未應用到的也不例外。例如,在前述檔案,設定
              XTerm*font的那兩行(一行在高解析度那段,一行在正常顯示
              器那段)都會被更改,即使我們只需要改變正常顯示器也不例
              外。


16.3  一些常見的錯誤和如何修正它們

    特別是當你對系統是新手的時候,resource看起來相當的複雜。當有些狀
況不能正常執行,而系統無法幫助你查覺是什麼錯誤,或你在何處犯了錯誤,
這裡列出一些常見錯誤的明細,並提出如何修正它們。

    .如果你未設定一個應用程式的名稱和類別,確定在你的resource規格之
      前加一個星號,(如果你省略這個星號,將沒有任何東西會對應這個規
      格)這個錯誤在你使用-xrm時特別常見,例如:

          xclock -xrm "update:3"  (錯誤)
          xclock -xrm "*update:3" (正確)

    .並非所有的應用程式均使用Toolkit ,非Toolkit 的程式不使用類別,
      且它們的屬性名稱也可能不同。例如,規格

          *geometry: 300*400+500+600

      對xclock,xlogo 有效,但對xcalc 無效,因它不使用Toolkit ,xcalc
      使用屬性名稱Geometry(開頭為大寫的G ),因為在這種情況,Toolkit
      類別名稱和xcalc 的屬性名稱相同,所以單獨一個規格

          *Geometry: 300*400+500+600

      可以對所有這類的應用程式有效。

    .你可能在規格中用了錯誤的屬性或Widget的名稱,特別是容易把類別名
      稱和成員名稱搞混,例如:以下兩者均錯:

          xclock*Update: 10
          xclock*interval: 10

      其它常見的錯誤如:

          xterm*Text*background:blue

      它不能執行的原因為xterm 並未使用Text widget ,xterm 正常的視窗
      和Tektronix 的視窗分別使用widget類別 VT100和Tek 。最後,當你
      知道一個widget是什麼類別,你可能對成員名稱假設錯誤,不是widget
      本身便是其中之一的屬性。試著更換類別名稱來修正這個問題。

    .即使你已設定實際的widget和屬性名稱或類別,應用程式可能以不是你
      預期的方式使用它們。例如:你可能設定如下:

          xterm*Width: 40
          xterm*Height: 10

      意圖用比平常較小的視窗啟動xterm ,但它不能執行,xterm 只能在
      Tektronix window應用這些值,無法在正常的視窗。

    .你可能所有的設定完全正確,但仍然什麼也沒發生,例如:

          xmh -xrm "*inc.Label: Include"

      是一個正確的方式,執行xmh 並指定label 為inc 盒的必須被"Include"。
      但在標準系統的發行版,是沒有任何動作發生的,原因是xmh 有一個應
      用程式設定預設值檔案/usr/lib/X11/app-defaults/Xmh ,其中有一行:

          xmh*inc.label:Incorporate New Mail

      這個規格較我們的設定有較高優先。

    .將規格

          *Width: 200

      單獨包含在資料庫將導致大多數的Toolkit 程式啟始失敗,且有一個
      訊息說它的"shell widget has zero height or width" 。如果你設定
      height和width 二者之一,你必須也設定另外一個。

    .如果你用編輯器建立一個resource檔案,你可能省略了最後一個new line
      這將導致當你試圖用xrdb載入它時整個檔案均被忽略。為了避免如此,
      當載入resource時,用一個命令列像:

          xrdb resfile; xrdb -query

      如果xrdb無法列印出resfile 中的內容,就是有問題了。

    .你可能忘了用-xrm選項的引數來獲得resource規格,有時有人會把
      resource規格放入一個檔案,而以檔案名稱為-xrm的引數,預期它自此
      檔案中讀取resources。

    .最後,一個非常人性的錯誤,當你發生問題,你通常會循環動作:編輯
      resource檔案... 儲存它... 載入resource到資料庫... 執行應用程式
      和看一看發生什麼狀況。”其中載入resource到資料庫”常常會被忽略
      以致你更為困惑。

16.4  結論

    本章中,你已看過了所有你能設定resource的地方,為何有這麼多種的方
法,如何決定設定放置在何處。你看到如何使用xrdb程式在server實際地儲存
預設值,它們在何處被server所有的client存取,甚至它們可以在遠方的機器
上執行。最後,有一些關於常見錯誤的實際提示,告訴你什麼需要注意。

    你現在處於實際使用resources ,和剪裁你的系統適合你的口味,resource
結構功能非常強大且有無限的彈性,所以它可讓你定製任何你需要的事。剛開
始不妨試一些像字型或色彩之類簡單的設定,當你熟於基本的結構時,再轉到
更高水準的例子。

    下一章將告訴你如何使用特別形式的resource規格 -- Translations(轉
譯),來剪裁你的鍵盤以適於特別的應用程式。

=====

第17章  定製你的鍵盤和滑鼠 -- 轉譯

    電腦的鍵盤通常含有一些 "特殊功能" (special function)鍵,在此有一
些方法來 "制定"(program)這些特殊功能鍵,使它們能完成特定的功能以適合
你工作的方式。例如,你可以定義一些鍵來輸入那些你常用的命令,或只需按
一個鍵便能夠輸入一些程式的片段。

    在X中,你能制定的不只是功能鍵而已,其它一般的鍵和滑鼠的按鈕也都
可制定。對每一個應用程式,你均可指定特別的功能給鍵盤和滑鼠按鈕,或兩
者之組合。 (例如在 xedit中你可以結合SHIFT 鍵和滑鼠的右按鈕來讓你向前
移動一個單字)。 所有使用X Toolkit的程式均允許使用者利用一個被稱之為
鍵盤轉譯 (translations) 的設施來執行此種定義,且此種定義藉著正規的
resources 結構傳遞給應用程式。 (那些不使用X Toolkit的應用程式,同樣
地也可以用相同的設施來制定, 但它們需個別的定義所以不能廣泛地應用,從
現在起,我們假設每當討論有關轉譯的種種,均為對那些使用X Toolkit的應
用程式而言。)

    就如同所有的 resources一樣,轉譯是當應用程式執行時才被處置。例如
你可以擁有數個具備不同轉譯設定的 xedit,在同時一起執行。( 你可以讓一
個xedit 適合編輯本文,另一個適合編輯程式碼,而另一個適合編輯文書)。

    本章討論轉譯 -- 包刮它們的定義格式,如何將它們設定到應用程式,和
它們所涵蓋功能的範圍。我們首先以實例來介紹,逐漸地導引你看到不同的角
度。而後比較正式和詳細地討論轉譯。最後,我們列出當你使用轉譯時常會碰
到的錯誤,並給你一些如何克服這些問題的提示。

17.1 實際使用轉譯

    Toolkit 轉譯結構最簡單的用途便是讓你制定你鍵盤的鍵。例如,當你使
用xterm 為一個執行一般shell 命令的視窗時,你可能希望定義一些特殊功能
鍵來輸入你常用的命令,且希望指定的關係如下:

      當我按下這個鍵時...           我希望這個字串被輸入

          F1                          rm core *.tmp <newline>

利用Toolkit 達到此目的方法為:指定一個值給使用轉譯的widget中的resources
。此值設定應用程式中所必需的定製 (customisation),且被Toolkit 的 Trans-
lation Manager (轉譯管理器) 所處理。此 resources屬於類別Translation,
且其成員名稱幾乎一定是translations。

    在下一節我們將看到設定到resources 中的值的格式。

17.1.1 如何對一個應用程式指定轉譯

    對前述xterm 的例子,我們定義 (在即將被應用程式讀入的resource資料
庫中或一些resource檔案中) 一個規格類似:

    xterm*VT100*Translations: (contd.)
    <key>F1: string("rm core *.tmp")            注意:不完整!!

    其意為在任何類別 VT100的 xterm widget 中,當鍵 F1 被按下時,插入
字串 "rm core *.tmp")。

    不幸的是,並沒有這麼簡單,轉譯管理器會把上面的規格解釋為 "去掉所
有現存的轉譯,且加入... " ,所以所有正常的像 " A鍵是插入一個 A" 這種
繫結 (binding)都會消失。為了克服這點,你必需使用一些被稱為 directive
(指引)的語法插入在 resource 值之前:

      xterm*VT100*Translations: #override(contd.)
      <key>F1: string("rm core *.tmp")

    通常你會希望保持大部份現存的繫結,而只是把你明確指定的值覆蓋上去
,所以你一般都是在你的轉譯表中,指定 #override。

    現在這個規格可以開始工作了,藉著啟始一個 xterm且把此規格 (在兩個
單引號 (')中間的部份) 當成選項 -xrm 的引數來測試它:

    xterm -xrm 'xterm*VT100*Translations: ... 等等'

    按下特殊功能鍵 F1,你將看到指定的字串成功的插入,但並未包含新列字元
(newline) ,你可以用一點語法的技巧來克服它,像:

      xterm*VT100*Translations: #override(contd.)
      <key>F1: string("rm core *.tmp")string(0xd)

這解釋了以下兩點:

  1.  string()的作用和它的引數相關。你可以直接輸入本文 (例如 string(lpq))
      ,但如果本文包含空白或非字母字元,則必需在本文前後加上雙引號。
      如果引數是以 "0X" 開頭,則將其後解釋為十六進位,並插入相對的
      ASCII 字元。(例如,0xd是RETURN)

  2.  在你指定此功能時可結合一個以上的作用,在上例,我們用到 string()
      作用兩次,如果我們知道其它的作用,我們也一樣可以繫結起來。

定義許多的轉譯在一起

你可以根據需求在一個表中定義許多的轉譯。假設,我們在前面的轉譯中增加
繫結:

      當我按下這個鍵時...           我希望這個字串被輸入

          F2                          lpq-Plpa3 <newline>

對此的轉譯為:

    <Key>F2: string("lpq-Plpa3")string(0xd)

所以可以將本列加入前面的表中。但是轉譯管理器的格式規則告訴我們必需將
兩個轉譯以 "\n" 分開且獨立成為一列:

      xterm*VT100*Translations: #override(contd.)
      <key>F1: string("rm core *.tmp")sting(0xd) \n(cond.)
      <Key>F2: string("lpq-Plpa3")string(0xd)

以上的形式將造成管理上的困難,你可以藉著包含 "隱藏的新列字元" 來使它
具可讀性一些: (新列字元以倒斜線 "\"處理)

      xterm*VT100*Translations: #override\n\
      <key>F1: string("rm core *.tmp")sting(0xd)\n\
      <Key>F2: string("lpq-Plpa3")string(0xd)

你可以放置任意多個你所需的 "隱藏的新列字元" , 且幾乎在任何地方均可,
它們只是被忽略而已。 (只要和轉譯管理器相關,甚至你每隔一個單字便使用
一個也沒關係。但千萬不要在一個規格的 resource 特徵部份使用它們,它們
無法被resource manager解釋,也沒有相同的效果。) 如果你感覺有些混淆,
不用擔心。簡單地說,resource結構需要的是要在一列中的一個resource規格
的 "值" 的部份,而轉譯管理器以分開的列來分開 (也就是以\n終結),而使用
者剛好以每一個實際分開的列代表一個意義以增加可讀性,所以規則很簡單:
在除了最後一列的每一個轉譯列均加上一個 "\n\"。

17.1.2 轉譯可繫結許多型式的作用

上述的 xterm範例,展示了如何能夠當你按下一個鍵時,插入任意的字串。但
轉譯結構的功能比這更多 -- 它可以繫結任何widget所提供的作用到按鍵,讓
我們詳細一點地看一下這些作用。

    前述的例子,我們在 xterm的 VT100 widget完成了鍵F1和F2在 string()
上的對應。我們將仍以 xterm為例,說明更多的作用。

    查閱xterm 的指南頁,在標題KEY TRANSLATIONS 和 KEY/BUTTON BINDINGS
你將發現列有數個作用。我們將定義一個轉譯對應鍵F3到insert-selection()
作用之上,所以我們可以用鍵盤來取代滑鼠,將先前 "剪"下的本文 "貼"出。
指南頁告訴我們此作用需要一個引數,從列出的預設繫結,我們可以看出預設
的 "剪貼" 結構為使用 CUT_BUFFER0, 所以我們將CUT_BUFFER0當作引數。我們
的resource規格是:

      xterm*VT100*Translations: #override\n\
      <key>F3: insert-selection(CUT_BUFFER0)

到目前為止,這只是一點小小的便利。然而,假定說你花了許多時間在本文文
件上工作,你用 tbl格式化,你用 nroff在螢幕上預視 (preview)它們,用
troff 排版,且將輸出送到你的一個用過濾器 (filter) 為tr2printer的印表
機上。設定轉譯為:

  xterm*VT100*Translations: #override\n\
  <key>F3: string("ed") insert-selection(CUT_BUFFER0)\
  string(0xd)\n\
  <key>F4: string("tbl") insert-selection(CUT_BUFFER0)\
  string("| nroff -man") string(0xd)\n\
  <key>F5: string("tbl") insert-selection(CUT_BUFFER0)\
  string("| troff -man -t | tr2printer") string(0dx)

xterm 會確定這些轉譯是以xrdb自資料庫載入或是在一個resource檔案中,並
加以處理。現在當你啟始xterm,用滑鼠 "剪"取你所需的工作的檔案名稱。接
下來,便可按F3鍵編輯它,按F4鍵預視它,和按F5鍵在硬拷貝上排版它。

更多的widget作用範例 -- xbiff

查閱xbiff 的指南頁:在ACTIONS 的標題下,你將看到Mailbox widget所支援
作用的名單。它惟一預設的轉譯為當你按下任何按鈕時降下信件 (mail)的旗幟
(flag)(作用unset())。我們將設定轉譯讓你以鍵盤來運用這些作用,將這些作
用對應到 "?" 和 "UP" "DOWN"兩個方向鍵如下:

       ?    check()    有新的信件嗎?
       UP   set()      升起信件的旗幟
       DOWN unset()    降下信件的旗幟

以下是相關的轉譯表:

    xbiff*Mailbox*Translations: #override\n\
    <Key>?: check()\n\
    <Key>Down: unset()\n\
    <Key>Up: set()

以此測試之:用xrdb從你的resource資料庫載入這些設定,然後啟動xbiff ,
將指標移到視窗內。重複地按下Up和Down游標控制鍵以升起和降下信件旗
幟。

找出有哪些作用被提供

你對widget作用將和widget名稱遭遇相同的問題:如何找出某個widget到底提
供哪些作用以及它們能做些什麼?同樣地,沒有一個完美的解答,但有一個合
理的方法來處理:

  1.  查看應用程式的指南頁。大多數的應用程式有它們自己專門的作用文件
      。例如:xbiff 有一節叫做ACTION,而xterm 有兩節關於轉譯和作用的
      文件 -- KEY TRANSLATIONS 和 KEY/BUTTON BINDING。

  2.  最初的指南頁可能給你提示,或甚至直接告訴你它用到何種widget的類
      別,所以你可以查看它的widget set文件中的特定的widget。(在 core
      版中惟一的widget set為Athena,所以你在此不易出錯)。即使指南頁未
      告訴你widget的類別,當你對系統熟悉之後,你將對一個widget是否為
      標準型態較具有概念,如果還是不行 ...

  3.  查看程式的原始碼,看看用到什麼widget的類別,以及widget提供了哪
      些作用。

17.1.3 轉譯繫結作用到一序列事件,不只是單一鍵

我們已經看到轉譯讓你設定插入,轉譯結構也能讓你繫結這些作用:它可以是
單一的鍵,或是一序列的鍵,或者是事實上一序列任何的X事件。

    讓我們繼續以xbiff 為例,看看如何轉譯一序列的鍵盤字元。例如我們定
    義字元字串的轉譯如下:

        look   check()
       raise   set()
       lower   unset()

以下為相關的轉譯表:

    xbiff*Mailbox*Translation: #override\n\
    <Key>l,<Key>o,<Key>o,<Key>k: check()\n\
    <Key>r,<Key>a,<Key>i,<Key>s,<Key>e: set()
    <Key>l,<Key>o,<Key>w,<Key>e,<Key>r: unset()

以此測試之 -- 載入設定和啟動xbiff ,將指標移到視窗內。現在你可藉
著輸入完整的字串來升起和降下旗幟。例如鍵入五個字元 r, a, i, s, e以升
起旗幟。對xbiff 的兩個表有幾點值得說明:

    . 鍵的名稱可以用不同的方式指定。正常的印出字元直接指定 (如"<Key>w")
      , 其它的字元則拼出全名(如"<Key>Down").附錄A "文件指引" 告訴你
      在何處可查到鍵的名稱,但在本節下面有更簡單的方法。

    . 對字元字串,你必需一一指定,並以逗點分開
      (如"<Key>l,<Key>o,<Key>o,<Key>k").

    . 轉譯可允許相同開頭的鍵,例如 "look" 和 "lower" 均擁有相同的開頭
      "lo",對轉譯管理器不會形成問題。

找出鍵的名稱

找出轉譯所需的鍵的名稱,最簡單的方法為執行xev ,將指標移到視窗內,按
下你所需的鍵,則鍵的名稱會出現在括弧內字串keysym和一個十六進位數之後
。例如在xev 的視窗內按下游標控制鍵DOWN,它的輸出如圖17 - 1,在其中你
會看到

    (keysym 0xff54, Down)

也就是說,鍵的名稱為Down。

               ┌────────────────┐
               │  P209.  fig 17 - 1             │
               │                                │
               │                                │
               │                                │
               │ 圖 17 - 1 xev 顯示鍵名稱的輸出 │
               └────────────────┘

你可以在轉譯中使用任何型態的事件

到目前為止,我們所寫的轉譯都是繫結作用到一個按下的鍵盤字元。但我們曾
說過,轉譯結構可繫結作用到任何事件,而不只於按下鍵盤而已。可能的事件
型態非常的多,在此我們只提及一小部份:

      型態               意義

      <Key>          按下一個鍵
      <KeyDown>      按下一個鍵 (只是另一個名稱)
      <KeyUp>        放鬆一個鍵
      <BtnDown>      按下一個滑鼠按鈕
      <BtnUp>        放鬆一個滑鼠按鈕
      <Enter>        指標進入視窗內
      <Leave>        指標移出視窗外

我們已經使用過按下一個鍵的事件,讓我們繫結xbiff 作用到滑鼠按鈕以取代之:

    xbiff*Mailbox*Translations: #override\n\
    <BtnDown>Button1: unset()\n\
    <BtnDown>Button2: check()\n\
    <BtnDown>Button3: set()

你可以看到語法和前面相似:你先給定一般性的事件型態 (例如 <Key> 或
<BtnDown>),其後跟著你所需事件的事件細節部份 (例如s 和Button3) (
Button 1, 2, 3分別對應到左、中、右按鈕)

對一序列的事件的轉譯

就如同我們定義了一序列按下鍵事件的轉譯(set,unset和check),我們當然
也可以定義一序列的滑鼠事件。事實上你轉譯的一序列的事件可以任意組合在
一起,你可以在一個轉譯的左邊隨意混合事件的型態。所以你可以定義如下的
轉譯表:

    xbiff*Mailbox*Translations: #override\n\
    <BtnDown>Button1, <Key>?, <BtnDown>Button3: check()\n\
    <BtnDown>Button1: <Key>u, <BtnDown>Button3: unset()\n\
    <BtnDown>Button1: <Key>s, <BtnDown>Button3: set()

也就是說,用到check(),你必需依序先按下按鈕1 (左按鈕),然後按下"?"
鍵 ,最後按下按鈕3 (右按鈕)。 這個範例並不是很好,但對於一些危險或不
可取消 (irreversible) 的作用 (例如刪除一個檔案,或是覆寫一個緩衝區的
內容) ,你可以依照這種方式來使用轉譯。你需要使用一個非常謹慎的命令序
列,才能用到此作用,這樣使得使用者不可能因意外而輸入此命令。

使用非鍵盤和非滑鼠事件的轉譯

通常你是對按下或放鬆滑鼠按鈕或鍵盤的鍵定義轉譯。但我們曾經說過,你可
以對任何事件設定轉譯,例如指標移入或移出一個widget的視窗。讓我們以
xman的主選項視窗 (圖10 - 3) 為範例來解釋它。這是一個相當人為的範例,
因為它沒有任何用途。但無論如何,它很容易被看出在做些什麼操作。

查看xman的指南頁,在X DEFAULTS標題下,你將看到概括的xman所用到的widget
的名稱和類別:主選擇項視窗widget的名稱叫topBox,類別名為Command。這
是一個好的猜測,因為在選單操作盒的方法。我們可用第15章所提過的技巧
來確認它,使用以下的命令:

    xman -xrm "*Command*backgroundPixmap: scales"

且所有的Command widget將會有魚鱗狀的背景)。

這和我們先前的範例有一個重要的不同:我們所用到的作用不是由特定的應用
程式指定,而是由標準的widget提供 (本例中為Command widget,在 "X
Toolkit Athena Widget"使用手冊中有描述)。

    在我們定義任何東西之前,先來看一看此widget預設的功用,以便我們能
夠了解有些什麼事發生和有哪些widget的作用會做。啟動xman,移動指標進入
 Help 盒,你會看到盒的外框變成高亮度 -- 這是highlight() 在作用。將指
標移出,盒的外框恢復正常 -- 這是unhighlight() 作用。將指標再度移入
 Help 盒,按下一個滑鼠按鈕,保持按住不放。則盒內的色彩反轉 (盒內的文
字變成預設的背景色,而原來視窗的背景變成視窗的前景色)。-- 這是set()
在作用。繼續保持按住滑鼠按鈕,將指標移出視窗外,盒內色彩恢復正常 --
這是reset() 在作用。一個正常 "碰觸一下" (clicking on) Help盒的次序為:

    1.  移動指標進入盒中:highlight()將外框變為高亮度。

    2.  按下按鈕:set() 反轉盒中的色彩。

    3.  鬆開按鈕:notify()開始作用,造成程式建立求助視窗(help window)
        。在進行中時,盒的色彩保持反相。當視窗建立完成之後,reset()反
        轉盒內的色彩為正常,但外框仍保持高亮度。

    4. 將指標移出視窗:unhighlight()將外框恢復正常。

    現在你了解了有哪些作用,我們將定義一些轉譯來改變原先進出視窗的作
用:

    *Command*translations: #override\n\
    <EnterWindow>: reset()\n\
    <LeaveWindow>: set()

用這個奇怪的轉譯表,當你一開始移動指標進入盒中,什麼事也不會發生,但
當你移出指標時,色彩會反轉。如果你再度移動指標進入盒中,色彩會變回正
常。其它的作用和前述相同。

使用修飾鍵來修飾事件規格

有時你指定的轉譯希望能同時按下一或多個修飾鍵 (modifiers) ,例如你要繫
結一個作用到和META鍵同時按下的一個鍵,或是當CTRL和SHIFT 同時按下的滑
鼠按鈕。到目前為止我們還沒有任何辦法可指定如此。我們不能用事件序列達
成這點,因為它是依序定義的,而我們需要的是指定同時,例如 "按下X 鍵且
CTRL鍵同時被按下"。

    欲在轉譯中指定修飾鍵,你只需在事件名稱之前加上你所需的修飾鍵名。
例如在xterm 中,定義meta-i為 "貼" 上一次 "剪" 的本文,使用:

    *VT100*Translations: #override\
    Meta <Key>i: insert-selection(PRIMARY, CUT_BUFFER0)

因為這種修飾鍵/事件型態的組合十分常見,轉譯管理器允許使用一種縮寫的
形式。相等於上面第二列的寫法為:

    <Meta>i: insert-selection(PRIMARY, CUT_BUFFER0)

    我們可以對滑鼠事件做同樣的處理。讓我們對xedit 定義轉譯,使得使用
滑鼠可以在本文上方便地移動,我們首先的嘗試如下:

    *Text*Translation: #override\
    Shift <Btn1Down>: forward-character()\n\
    Shift <Btn2Down>: forward-word()\n\
    Shift <Btn3Down>: next-line()\n\
    Ctrl <Btn1Down>: backward-character()\n\
    Ctrl <Btn2Down>: backward-word()\n\
    Ctrl <Btn3Down>: previous-line()

如果你測試它,奇怪的現象會發生 -- 游標好像會自行其是,而且本文的片段
會一下子被選擇,一下子又取消選擇。發生這種現象的原因是Text widget 的
預設繫結仍然會作用,它包含的轉譯像:

    <Btn1Up>: extend-end(PRIMARY, CUT_BUFFER0)

你可能認為這不會影響你,因為當你鬆開按鈕時你總是按著SHIFT 鍵或CTRL鍵
。但事實上會作用:轉譯管理器對於你未定義的修飾鍵解釋為你不在乎它們的
影響,所以鬆開Button1 時會對應到上述的規格。為了克服這點,我們對那些
可能不小心便會發生的按鈕鬆開事件定義轉譯,並繫結到一個空 (null) 作用
。這些轉譯當被對應到時會蓋掉預設的轉譯。對使用Text widget 我們需再增
加兩列,才是一個完整的轉譯表:

    *Text*Translation: #override\
    Shift <Btn1Down>: forward-character()\n\
    Shift <Btn2Down>: forward-word()\n\
    Shift <Btn3Down>: next-line()\n\
    Ctrl <Btn1Down>: backward-character()\n\
    Ctrl <Btn2Down>: backward-word()\n\
    Ctrl <Btn3Down>: previous-line()\n\
    Shift <BtnUp>: do-nothing()\n\
    Ctrl <BtnUp>: do-nothing()

這解釋了下列幾點:

    •我們對滑鼠事件使用了縮寫的語法,也就是先前的語法像<BtnDown>Button1
      以<Btn1Down>取代。轉譯管理器容許一些縮寫的語法存在。 (我們在前
      面看到的 <Meta> 也是一例)。

    •我們用 do-nothing() 當作一個啞 (dummy)作用,就好像它是列在Text
      widget的文件中一般。事實上這個作用是不存在的,因此會導致錯誤的
      訊息出現,但因為我們本來就是要用它來什麼事也不做的,所以無需介
      意。

    •對於我們方才指定的啞作用,我們用了一個事件 <BtnUp>便代表了三個
      按鈕。相同地,轉譯管理器把從缺的修飾規格的解釋為 "對任何",在一
      個事件中缺少細節部份 (例如在規格"<BtnUp>Button1"中"Button1"的部
      份) 解釋為 "對任何所有的細節部份"。

      這點在轉譯中有一個非常常用的形式為:

          <Key>: ...

      因為缺少細節部份,所以可被用於所有按下鍵 (key-press)事件,也就
      是對所有的鍵。事實上在Text widget 上有一個預設的轉譯為:

          <Key>: insert-char()

      insert-char()作用的功能為當一個鍵被按下時,插入相對應的ASCII字
      元。

17.1.4 複合的轉譯表及範例

到目前為止,我們把所有的轉譯均應用於整體的widget類別。但你能對個別的
widget指定轉譯,就如同resource一般。在此我們將對xman定義更多的轉譯。
我們將對Help盒widget (對應作用到助憶(mnemonic)字元)只用到鍵盤事件,對
Quit盒只用到視窗事件。為了達到此點,我們將對轉譯應用到的widget 給予明
確的名稱。我們的轉譯表如下:

    *Help*translations: \
    <Key>h: highlight()\n\
    <Key>u: unhighlight()\n\
    <Key>n: notify()\n\
    <Key>s: set()\n\
    <Key>r: reset()\n\
    <Key>LineFeed: set() notify()

    Quit*translations: #override\n\
    <EnterWindow>: reset()\n\
    <LeaveWindaw>: set()

有幾點特別的語法需要注意:

    •在此我們對相同類別中不同的widget指定不同的轉譯,所以我們需要知
      道成員 (instance) 名稱。不幸的是,這些成員名稱 (Help,Quit,
      Manual Page)並不明顯。如果它們在文件中找不到 (本例即找不到),那
      你只能用猜的或是去查看原始程式了。

    •對於Help,我們省略了常用的#override,因為我們對此widget不需要考
      慮任何預設的繫結。特別的是,當指標進入視窗時,我們不要此widget
      呈現高亮度,如此我們才能看出這個轉譯的效用。

    •由於省略 #override,我們將這個轉譯規格移至第一列。(如果不這麼作
      ,而且對第一列仍以\n\ 作結束,我們將得到錯誤:

          X Toolkit Warning: translation table syntax er-
          ror: Missing ':' after event sequence.
          X Toolkit Warning: ... found while parsing ''

      因為\n是用來區隔轉譯規格或類似像 #override 指令的)。而將此列和
      第一個規格以隱藏的新列字元區隔,就如同:

          *Help*translations: \
          <Key>h: highlight()\n\
          ...

    •對LineFeed那一列的轉譯,包含了複合的作用,和前面xterm 中複合的
      string()作用類似。

    我們已大致涵蓋了你所常用的轉譯。基本的概念很簡單,生成它們的結構
也不複雜,但它們非常的令人迷惑。原因是它是一個發展中的糸統,隨著發行
版本所附的文件並不是很多。下一節重複本節所述的,本節均以例子來介紹觀
念,下一節我們將對轉譯的規則,作比較正式的描述。

17.2 轉譯 -- 格式和規則

轉譯是一個由Toolkit 提供的一般性結構,它讓使用者指定當某些特定的事件
由widget接收到時,一個widget應完成何種作用。Toolkit 中處理轉譯的部份
被稱之為轉譯管理器。

    轉譯由widget指定,它的確是一個widget的每一個成員。一個轉譯的集合
稱之為一個轉譯表,而這個表藉著標準的resource結構傳遞給應用程式。widget
 (對轉譯而言意味深長) 會有一個Translation 類別的resource屬性,通常的
成員名稱為translation。這個轉譯resource期待的一個值即為一個轉譯表。就
像所有其它的resource一般,你可以在同一個應用程式對不同的widget指定不同
的resource,而且你能以類別名稱或成員名稱或二者混合來指定它們。

    每一個widget定義了它所提供的作用,不論是在數量或型態上,它們都是
極富變化的。

    轉譯可被各種不同型態的事件指定,不僅只於鍵盤和滑鼠事件而已。任何
序列的事件均能被處理,就如同單一事件一般。

    轉譯和轉譯表在 " X Toolkit Intrinsics " 使用手冊附錄B一節中,有
簡潔地描述。它不是初學者查看轉譯的好地方,但它含有完整的事件型態、修
飾名稱等等的表列,在此不再贅述。

17.2.1 轉譯表的格式

一個轉譯表大體上的格式如下:

    [optional-directive\n] list-of-translations

每一個 list-of-translations 由一或多個轉譯組成,格式如下:

    event-sequence : list-of-actions

當event-sequence發生時,規格中的list-of-actions 會由widget所完成。如
果在一個表中,有多於一個的轉譯,每一個需以 "\n" 區隔開。

    我們首先來看一下選項的指令,然後看一下list-of-translations的細節
部份。

17.2.2 轉譯指引 -- #override 等等

選項指引 (directive) 告訴轉譯管理器,它應對任何已設定之相關widget在此
轉譯集合中應如何處理。

    #replace : 清除所有現存的對應,只採用在轉譯表中所含有的。(只使用新
        的)。

    #override : 強制留下現有的對應,加入轉譯表中。如果在表中有任何項
        目設定,舊有的即被覆寫。也就是說,舊有的被新有的取代。 (結合
        舊有的和新的,但新的比較重要)。

    #augment : 強制留下現有的對應,加入轉譯表中。如果在表中有任何項
        目設定在現有的設定存在,使用舊的而忽略新的。 (結合舊有的和新的
        ,但舊的比較重要)。

如果未設定指引,預設為 #replace 。

17.2.3 個別的轉譯規格格式

每一個轉譯的格式為:

    event-sequence : list-of-actions

讓我們來看一看此規格的兩個部份。

事件和事件序列(event-sequence)的格式

一個事件序列包含一或多個事件規格(event-specs), 其格式為:

    [modifiers] <event-type> [repeat-count] [detail]

除了事件型態(event type)外,均為可選擇。(<>中為必需)。

    modifiers : 這是基本設計中比較精巧的部份,我們在下一段說明。

    event-type : 指定我們有興趣的事件的型態,例如按鍵(<KeyDown>)、
        鬆開按鈕(<BtnUp>)或指標離開視窗(<Leave>)等等。

    detail : 指定我們有興趣的特定型態。如果你省略細節欄(detail field
        ),事件規格將對應到任何detail,如此,<Key>將對應到所有的按鍵
        事件。此格式指定到每一個事件型態。對指定事件型態的細節欄為:

        •對<Key>、<KeyUp>和<KeyDown>事件,細節如果不是鍵的名稱(例如
          "<Key>s"),便是 keysym (keysym是按鍵以開頭為"0x"的十六進位
          數表示,將於下一章詳細解釋)。

        •對於按鈕事件,細節就是按鈕的名稱,也就是 Button1 ... Button5
          中的一個。例如我們先前使用過的"<BtnDown>Button1"。

    型態/細節的縮寫:常用於轉譯管理器的一些事件型態和細節的組合,允許
        你對它們使用縮寫:

          縮寫               相等的全名

          <Btn1Down>         <BtnDown>Button1
          ...
          <Btn5Down>         <BtnDown>Button5
          <Btn1Up>           <BtnUp>Button1
          ...
          <Btn5Up>           <BtnUp>Button5

    repeat-count : 這指定了事件需要的次數。如果被指定,它們被包含在
        括弧之中。例如:

        <Btn1Down>(2)

        指定需對一號按鈕(button-1)碰觸兩次。如果你在後面再加上加號(+)
        ,其意為碰觸的數目需大於或等於指定。例如:

        <Btn1Down>(3+)

        意為需碰觸三或更多次。預設的重複次數為一次。

    一個事件序列以一或多個事件規格組成,以逗點分開。當這個事件的序列
在其widget發生時,相關的作用便會運作。

    當序列發生時,轉譯管理器會根據一些規則決定它自己是否被滿足。我們
用一個例子以便仔細地觀察,假設你對兩個字元序列set 和unset定義了轉譯:

    •概略地說,如果個別的事件依序發生,轉譯管理器會被滿足,其它的事
      件 (那些你未指定的事件) 如果在指定的序列中間發生,不會妨礙序列
      被滿足。例如,set 可被sweat 和serpent 對應。

    •如果介於其間的未指定事件,啟動了轉譯表中的另一個事件序列,轉譯
      管理器會放棄原先的序列,而嘗試著去滿足新的序列。例如,set 不會
      被sauerkraut對應,因為u 會使得轉譯管理器對應到unset。

    •如果在一個事件的集合中有超過一個的事件序列發生,轉譯管理器只會
      應用到一個轉譯:

      - 如果一個序列對應到結束 (右端),較短的那個序列只有在不包含於
        較長的序列才會發生。所以如果unset 被對應到,對set 轉譯將不會
        作用。

      - 如果一個序列是在另一個序列的中間發生,例如,如果你定義序列
        at和rate,則較長的那個永遠不會被對應到。

事件修飾鍵

修飾鍵 (modifiers)是一些鍵或按鈕,係指當主要事件發生時,那些必需被按
下才會讓轉譯管理器滿足的鍵或按鈕。你可以對鍵、按鈕、移動、進出視窗等
事件指定修飾鍵。常見的修飾鍵為:

    Button1   ...        Button5
    Ctrl      Shift      Meta
    Lock

    如果你未指定任何的修飾鍵,轉譯管理器會解釋為: "當事件發生時,不
論修飾鍵是否被按下,均會被接受"。例如,<BtnDown>會被滿足,不論當時
SHIFT 或META鍵是否有被按下。

    如果你真的需要指定 "只有在沒有修飾鍵被按下時才接受此事件"。則需使
用虛擬修飾鍵 (pseudo-modifier) None。例如,None <BtnDown> 會使得當按
鈕按下時若META鍵也被按下則不會滿足。

    對一個事件指定一些修飾鍵意為 "只要符合轉譯中指定的修飾鍵,其它的
修飾鍵不需介意"。它並沒有 "一定要完全恰好符合才可以"的意思。例如,
Ctrl <Key>a 在你按下 meta-ctl-shift-a 時仍會被滿足。

    如果你真的要指定 "只有剛好符合修飾鍵的才要",在修飾鍵之前加一個驚
歎號 (!)。例如,!Ctrl <Key>a 在你按下 meta-ctl-shift-a 時不會被滿足。

    對一個修飾鍵的集合 (可能是空集合) 作限制,意為 "除了這些修飾鍵不
不接受",需要在不接受的修飾鍵之前加一個(~)號。例如,Shift~Meta <Key>t
會被ctl-shift-t滿足,不會被meta-shift-t滿足。

    鍵事件通常忽略大小寫,如果你要區分,需在之前加一個冒號(:)。例如,
不論 H或 h均可符合<Key>H,但只有H 才符合 :<Key>H。

    就如同對常用的事件型態/細節配對有縮寫一般,轉譯管理器對常用的修
飾鍵/事件型態配對同樣地提供縮寫:

          縮寫               相等的全名

          <Ctrl>             Ctrl <KeyDown>
          <Shift>            Shift <KeyDown>
          <Meta>             Meta <KeyDown>
          <Btn1Motion>       Button1 <Motion>
          ...
          <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 寫入轉譯,
且轉譯在檔案mytrans 中,以下列命令來執行程式:

      xrdb mytrans ; xrdb -q ; xprog ...

17.4 結論

    這漫長的一章涵蓋了被X Toolkit 所使用的標準轉譯結構,它讓你指定
按下一個鍵或按鈕會有什麼影響。這些轉譯指定到每一個widget,且你藉著使
用標準resource結構傳送轉譯表給widget。你看到如何對一個鍵盤的鍵、滑鼠
按鈕和其它像移動一個指標進入視窗的事件作指定轉譯。然後我們藉著指定不
同狀態的修飾鍵所造成的影響,比較嚴謹地定義我們需要轉譯的事件。

    本章的第二個部份涵蓋相同的領域,但較為正式,且詳細解釋在轉譯規格
中,可用到的語法,特別是修飾鍵。

    最後,我們簡列使用轉譯常見的問題,及一些如何解決它們的建議。

    本章包含了許多材料。它們運用了極少的觀念,但語法複雜,易生錯誤,
且不顯而易見。如果一開始覺得困難,不必擔心。從一些簡單的轉譯著手 (也
許是xterm),且以指南頁中的範例或別人的轉譯表為基礎來發展修改。當你有
經驗之後會進展快速;你將洞悉語法且能看出其後會發生什麼狀況。

=====

第18章  鍵盤和滑鼠 -- 對應和參數

在前章我們看到了Toolkit 所提供的轉譯結構,它讓你對一個應用程式的個別
成員,定製你的鍵盤和滑鼠。在本章,我們來看另一種較低層次的定製,它是
由server所管理,稱之為對應(mapping) ,你只需要告訴server你的鍵盤所需
的不同的配置,它就會被每一個連接到你server上的應用程式應用到。例如:
取代通常的QWERTY鍵盤,你可能希望重新安排鍵盤以適應那些對鍵盤並不熟悉
的使用者 (你可能把鍵盤按ABCDEF... 重新排過,當然鍵盤按鈕上所印的字也
需更改成相符)。你也能對一些Control,Shift等等的修飾鍵作指定。對滑鼠
按鈕,一樣有一個相關的對應,可將 "邏輯的" 按鈕對應到實際動作。整體而
言,你使用這些鍵盤和滑鼠的對應的頻率,將小於轉譯。

    此外,尚有非常常用的第三種型態的定製可用:你可以設定有關你鍵盤和
滑鼠各種不同的參數。例如響鈴聲音的大小,按下鍵時是否有滴答聲等等。

    在本章,我們先描述鍵盤、滑鼠和修飾鍵的對應,接下來描述你如何使用
xset程式,來定義類似像鍵盤有無滴答聲的參數設定。

18.1 鍵盤和滑鼠對應 -- xmodmap

server本身處理一個層次的定製,它對於所有使用到此server或顯示器的應用程
式均發生效用:這就是鍵盤對應 (keyboard mapping)。

    每一個鍵,有一個單獨的碼對應它,稱之為鍵碼(keycode)。鍵和鍵碼之間
的關係是絕對固定的。 (粗略來說,你可以說 "鍵碼就是鍵")。

    連接到每一個鍵碼 (或鍵)的是一個keysym的表列。一個keysym是一個代表
印在鍵盤符號上的數字常數。在預設的情況,大多數的鍵只有一個keysym 與之
對應,例如 SHIFT,A,B,Delete,Linefeed等等。keysym既非ASCII或EBCDIC
字元,也非server用以維持keysym和字元的關係。你可以對每一個鍵有兩個
keysym。在預設對應中,有很多連接到兩個keysym的鍵,例如冒號(:) 和分號(;)
,7 和 &等等。對一個鍵附屬的keysym表列中,第一個keysym是未按下修飾鍵
的狀況下的鍵。第二個keysym是指當SHIFT (或Lock)已被同時按下時的鍵,如
果在表列中只有一項,且為字母,則系統自動假設第二項為相對的大寫字母。
超過兩項的keysym並沒有特別的意義,鍵盤和keysym之間的關係被稱之為鍵盤
對應。

    盡量地以server處理一般的鍵和keysyms 。它對鍵碼沒有附屬意義,且它
自己本身不會使用對應從鍵碼對應至keysyms :它只是傳遞資訊給client應用
程式。特別的是,server對ASCII 或其它的字元集合 (character sets) 毫無
概念;它只是說明 "某鍵被按下,某修飾鍵也同時被按下,keysym表列中某
keysym和某鍵相關" 。它是client (典型的使用標準的X Library) 對keysym
和修飾鍵附屬的意義:例如,它決定如果keysym產生時ctrl也被按下,它必需
被解釋為ASCII 字元 hex 0x1,也就是說ctl-A。 特定的client可以決定特殊
的修飾鍵的意義;例如在xterm 中,當你和MTEA鍵同時按下一個鍵,程式將此
轉換為ESC 後面跟隨著被按下的字元。 (也就是說,如果你按下meta-A,實際
上會產生兩個字元 ASCII 0x1b, ASCII 0x41)。

    server在此領域內提供一個額外的設施。你可以定義讓server將鍵碼解釋
成修飾鍵,例如 "當鍵碼為若干的鍵被按下時,它相同於CONTROL修飾鍵被實際
按下"。這種定義並不互斥:如果你定義鍵F7為Shift 修飾鍵,它並不會影響任
何現存的修飾鍵。此種設施稱之為修飾鍵對應 (modifier mapping)。X提供八
個修飾鍵:Shift、Lock(caps-lock)、Control、Mod1到Mod5。習慣上,Mod1被
解釋為Meta。

    最後,對滑鼠按鈕有一個類似的指標對應 (pointer mapping)。對每一個
實際的按鈕,你可以對它們指定一個相關的邏輯按鈕數字。

    實際上,如果你改變你的鍵盤或滑鼠的對應,你相當於是說製造廠商對你
的輸入裝置配置不當,你將把它修正為適合你所需要的。當然,如果你改變了
對應,你應該把對應鍵上面所印的符號也隨之修改;不過,通常更改的都是一
些控制和修飾鍵,所以就不是那麼需要了。換句話說,如果你改變了對應,使
得鍵盤配置和一個特定國家標準 (例如:法國或德國) 相符,你必需更換實際
鍵盤上的符號。

    你可以預期得到,改變鍵盤對應是一件相當稀罕的事,你可能設定它一次
之後就不再改變它。在以下幾節,我們將很快的看一看如何使用程式xmodmap
,查看現有的對應和修改它們。

18.1.1 查看現有的對應

你使用xmodmap 來列出現有的對應,就如同改變它們一樣。你可以指定不同的
命令列選項,來選擇想要印出的不同的對應:

    列出現有鍵的對應:指定 -pk選項。

    列出現有修飾鍵的對應:指定 -pm選項 (或是什麼選項也不選,因為這是
        xmodmap的預設作用)。

    列出現有指標 (按鈕)的對應:指定 -pp選項。

例如,將所有的對應一起印出,使用命令:

    xmodmap -pm -pk -pp

列出鍵、修飾鍵、指標的對應之範例如圖18 - 1,18 - 2,18 - 3。(鍵對應只
有列出一部份,因為完整的對應實在太長了。)

        ┌────────────────────┐
        │      p228  fig 18.1                    │
        │                                        │
        │    圖18-1 列出鍵盤對應的範例           │
        └────────────────────┘

        ┌────────────────────┐
        │      p229  fig 18.2                    │
        │                                        │
        │    圖18-2 列出修飾鍵對應的範例         │
        └────────────────────┘

        ┌────────────────────┐
        │      p229  fig 18.3                    │
        │                                        │
        │    圖18-3 列出指標對應的範例           │
        └────────────────────┘

18.1.2 執行 xmodmap 改變對應 -- 一般性選項

當xmodmap 用來改變或設定對應,它可以處理一或多個表式 (expression) 的
作用。你可以把這些輸入在一個檔案中,假設此檔案名稱叫myfile,可用下列
命令兩者之一:

    xmodmap myfile
    xmodmap - <myfile

第二列的短橫線是必需的,如果少了它,程式將只完成預設的作用 (列出修飾
鍵的對應) 。除了在檔案中輸入規格之外,你也可以在命令列中用 -e 選項直
接指定它們:

    xmodmap -e expression
    xmodmap -e expression-1  -e expression-2

為了得到更多有關xmodmap 作用的資訊,可以指定冗贅 (verbose)選項,-v 或
-verbose。你可以藉著使用 -n 選項不實際的改變對應而獲得相同的列印輸出
 (printout) 。 (此功能和Unix中make命令的 -n 選項相同,其意為 "假裝執
行我要求你做的事,正確的告訴我你將如何進行,但並不實際地完成作用")。
這個選項對新手或不確定自己是否做的正確的情況非常有用。

    每一個表式的語法並不相同,但一般性的格式為:

    keyword target = value(s)

 (等號的兩邊均需為空白)。

18.1.3 改變指標對應

指標對應是一個邏輯按鈕數字的表列。 (邏輯的button-1我們稱為LEFT,邏輯
的 button-2 稱為MIDDLE等等,實際的 button-1 是滑鼠左邊的按鈕,button-2
是隔壁的按鈕等等,所以預設的邏輯的按鈕和實際的一致)。在表列中的第一個
項目是邏輯的按鈕和實際的 button-1 的關係,下一個則是對實際的 button-2
的關係,以此類推。例如,顛倒按鈕的次序,使用命令:

    xmodmap -e "pointer = 3 2 1 "

結果按下滑鼠右邊的按鈕,會被解釋成LEFT。

18.1.4 改變鍵對應

xmodmap 讓你將一個鍵 (也就是說鍵碼) 連結到一個新的keysym表列,使用表
式:

    keycode keycode = keysym-1 [keysym-2 ...]

安排keysym-1連結到鍵時沒有修飾鍵,當SHIFT 按下時keysym-2連結到鍵,如果
還有下一個keysym的話,對keycode 而言是第三順位等等。 (請記住,在前兩個
之後的keysym,系統並未附屬特別的意義,應用程式如果需要的話可以附屬意義
)。

    讓我們舉實際的例子。一些鍵盤把一些非字母數字 (alphanumeric)鍵放在
不標準的地方,所以我們假設你要將F6鍵重定義當沒有修飾鍵按下時為 "9",
當SHIFT 按下時為 "("。要寫入這個xmodmap 的表式,你需要知道三件事:F6
的鍵碼,和 "9"與 "("的keysym。我們在第12章提到過,執行xev 便可獲得
這些:分別按下"F6", "9", "("三個鍵,你便可得到它們的鍵碼和keysym。然
後將它們放入你的表式中。例如在我們的系統中我們使用命令:

    xmodmap -e "keycode 21 = 9 parenleft"

    為了容易一些,你通常不需要查問鍵碼,xmodmap 允許你使用下列格式:

    keysym target-keysym = keysym-1 [keysym-2 ...]

它的意義為 "附屬在此鍵的keysym表列現在改由target-keysym來附屬"。例如
針對我們方才的範例,我們可以用:

    xmodmap -e "keysym F6 = 9 parenleft"

如果你將相同的keysym附屬到數個鍵,xmodmap 會搞混掉,像這種情況你應堅
持使用keycode ... 這種符號表示法。

18.1.5 改變修飾鍵對應

在server中修飾鍵對應是一個表列的集合,每個修飾鍵有一個表列。對一個修
飾鍵的表列中,包含了所有當此修飾鍵被按下時會有意義的鍵 (鍵碼) 。xmodmap
允許你在一個表列中增加項目,去除項目,或完全清除一個表列。對此三個操
作的格式為:

    add modifier = list-of-keysyms
    remove modifier = list-of-keysyms
    clear modifier

不幸的是,語法有點兒混淆,因為取代你所需的鍵碼,你必需指定keysym附屬
到鍵碼。

    舉一個例子:假如你需要在你鍵盤的右邊有一個第二個的Ctrl鍵。在我們
的鍵盤上有一個Alternate 鍵沒有被用來做任何事,所以我們將修改它,命令
為:

    xmodmap -e "add Control = Alt_R"

為了多解釋一些情況,讓我們假設你沒有一個多餘的鍵,但有一個第二個的
Meta鍵在鍵盤的右手邊,而我們要用它。我們首先必需去除它的Mod1對應 (你
必須使用 "Mod1" ,"Meta"沒有用) ,而後將它加入Control 對應。 (如果有
需要的話,我們可以擁有雙重的對應,所以在Control-Meta組合鍵時才會有作
用,在一些編輯器中常會用到)。命令為:

    remove Mod1 = Meta_r
    add Control = Meta_r

將上述命令列放入一個比方說叫mymaps的檔案中,執行命令xmodmap mymaps。
它可以工作,但如果你用xmodmap -pm 去查看,你會發覺Control 和Meta混合
在一起,所以最好改變鍵上的keysym為:

    remove Mod1 = Meta_R
    add Control = Meta_R
    keysym Meta_R = Control_R

在xmodmap 的指南頁中,有幾個更多的交換修飾鍵的範例。

    注意:當增加一個鍵到修飾鍵對應,keysym只是用來指定xmodmap 中的鍵
。它完全是xmodmap 本地的,且只是一個符號而已:只有當相關的鍵碼傳遞到
server,才實際上的改變對應。同樣地,keysym 和 keycode 表式對修飾鍵對
應絕對沒有影響。一個常見的錯誤是執行下面這個命令:

    xmodmap -e "keysym F1 = Contrl_R"

期望F1鍵能像一個control 鍵般作用。它不會 -- 因為你相當於告訴系統 "我
已經把這個符號印在F1鍵上面" 而已。你應該這樣作:

    xmodmap -e "add Control = F1"

如果你合併上一列的命令會使得對應表列看起來清楚些。

我們對不同對應的處理的描述到此告一結束。



18.2 鍵盤和滑鼠參數設定 -- xset

最後我們來看一看最平常的設施,對你的鍵盤、滑鼠和螢幕設定不同的參數的
設施。這些參數使用xset程式 (我們曾經用來控制server的字型搜尋路徑) 來
設定。在以下的敘述,我們只用一組引數來展示xset,但你可以同時指定多組
你所要的不同定義的設定。

控制終端機響鈴

用xset你可以讓鈴聲響或不響,設定它的音調 (pitch),和它持續的時間 (假
設你的機器提供這些操作):

    讓鈴聲不響                    xset -b
                                  xset b off

    讓鈴聲能響                    xset b
                                  xset b on

    設定鈴聲的音量                xset b vol
     (最大音量之vol%)             例:xset b 50

    設定鈴聲的音量,和            xset b vol p
    音調(單位Hertz(赫))           例:xset b 50 300

    設定鈴聲的音量,音調,        xset b vol p d
    和持續的時間(單位百萬         例:xset b 50 300 100
    分之一秒)

控制鍵的滴答(click)

    讓鍵的滴答不作用              xset -c
                                  xset c off

    讓鍵的滴答作用                xset c
                                  xset c on

    設定滴答聲的音量              xset c vol
     (最大音量之vol%)             例:xset c 50

控制鍵的自動重複(auto-repeat)

    讓鍵的自動重複不作用          xset -r
                                  xset r off

    讓鍵的自動重複作用            xset r
                                  xset r on

滑鼠參數 -- 加速和門檻

指標在螢幕上的移動和滑鼠的移動是成比例的。加速 (multiplier) 是應用在
指標移動上的一個乘數,例如你的加速是四,當你移動滑鼠時,指標將以正常
四倍的速度移動。 (如果指標正常時移動n 個像素,現在則會移動 4 X n個像
素)。

    當你希望在螢幕上將指標移動一段長距離時,相當高的加速是很方便,但
當你要作一些細部的指引時,它看起來就很笨拙 -- 指標看起來在來回跳動。
為了克服此點,server提供了一個門檻 (threshold):如果當指標一次移動超
過門檻個像素,加速也會被帶進來執行。

    設定滑鼠的加速到a             xset m a
                                  例:xset m 5

    設定加速,設定門檻到t         xset m a t
                                  例:xset m 5 10

控制螢幕節約器結構

螢幕節約器 (screen saver)是一種設施,它意圖降低一個固定的圖樣(pattern)
老是燃燒你螢幕的螢光體的機率。它的理念為螢幕損害大都起因於讓系統閒置
(idle)一長段時間,所以螢幕節約器在一段特定的時間內如果沒有輸入動作後
,不是整體性的閃動螢幕,便是顯示一個不同的圖樣。

    如果你選擇的是顯示一個不同的圖樣,根視窗的背景涵蓋整個螢幕,一個
大X 的游標出現在螢幕上,且會週期性的移動。當大X 游標在移動時,會改變
大小,而且背景也會隨機的變動。 (在背景圖樣較小時你可能不會注意到,但
若比較大時,你可以看到它在跳動)。

    當螢幕節約器結束作用後,如果要花許多的時間才能重畫應用視窗,你可
以指定只有在重畫螢幕而不需產生任何曝光(exposure)事件 (也就是不必要求
應用程式重畫它們自己的視窗) 的情況下,螢幕節約器才會作用。 這只應用
於顯示不同的圖樣的情況,整體性的閃動螢幕純為硬體作用,不會影響到應用
程式。

    讓螢幕節約器能作用           xset s

    讓螢幕節約器不能作用         xset s off

    用螢幕閃動的方式             xset s blank

    只有在無曝光事件下才作用     xset s noexpose

    允許有曝光事件下仍然作用     xset s expose

    用不同圖樣的方式             xset s noblank

    當系統閒置t 秒後作用         xset s t
                                 例:xset s 600

    每p 秒之後改變圖樣           xset s t p
                                 例:xset s 600 10

讓我們將這些組合起來,假設我們希望螢幕節約器在系統閒置80秒後開始作用
,用不同的圖樣的方式,週期為3 秒,不介意曝光事件是否發生:

    xset s noblank s 80 3 s expose

注意:xset s 並不提供 on 這個值。



18.3 結論

本章的第一個部份,告訴你如何改變從實際的到邏輯的鍵和按鈕的對應,這些
對應可被client應用程式解釋。你看到如何使用xmodmap 來列出或改變每一個
鍵盤的鍵、修飾鍵和滑鼠按鈕的對應。這些對應由server維護,所以可以被每
一個使用到此server的應用程式應用到。這種結構讓你有改變鍵盤配置的自由
,不論是個人的喜好或是一個額外的標準。

    在本章的第二個部份,你看到如何使用xset對一些常見的特性作設定,如
鍵的滴答聲、終端機的響鈴、螢幕節約器和滑鼠的速度 ("加速")。

=====

第19章  進一步介紹 uwm 和如何定製它

在第6章,你學到如何使用uwm 來完成基礎的視窗建構工作需求,而能以一個
舒服的方式使用視窗。現在我們繼續談視窗,集中於兩個主要的範圍:

    1.此程式所提供的一些特別的特色,特別是:

      •不使用選單,直接使用滑鼠建構視窗。

      •我們尚未描述過的一些選單選擇。

      •編輯現存表徵圖的標題。

    2.如何定製uwm ,包含:

      •對任何你所需的命令定義你自己的選單。

      •將各種不同的視窗管理器功能繫結到滑鼠按鈕和修飾鍵 (SHIFT,
        CONTROL 等等)。

19.1 uwm 的新特色

現在我們來討論一些在先前介紹視窗管理器時,為了保持儘量地簡單,而省略
的標準的uwm 功能。

19.1.1 不使用uwm 的選單來管理視窗

直到目前,你仍然依賴著uwm 的選單來建構你的視窗 -- 移動它們、對它們重
定大小等等。如果所有的情況都使用選單,是相當慢的,所以uwm 提供你可直
接完成它任何命令的選項。

    你可以使用滑鼠按鈕和修飾鍵,來指定你要執行的功能,和所要操作的視
窗。你現在應該已非常熟悉各種不同的視窗管理器功能和它們如何工作,所以
我們將很快地說明如何不使用選單來選擇這些功能。

    Move:移動一個視窗

        1.按下META鍵,保持按住。
        2.指標位置所在的視窗將被移動。
        3.用右按鈕,拖拽視窗到新的位置。

    Resize:重定一個視窗的大小
        1.按下META鍵,保持按住。
        2.指標位置所在的視窗將被重定大小。
        3.用中按鈕,拖拽視窗的外框到新的大小。

    Lower:將一個視窗送到堆疊的底部
        1.按下META鍵,保持按住。
        2.將欲被送到堆疊的底部的視窗,碰觸一下左按鈕。

    Raise:將一個視窗升到堆疊的頂端。
        1.按下META鍵,保持按住。
        2.將欲被送到堆疊的頂端的視窗,碰觸一下右按鈕。

    Circulate up:將最底層被遮蔽的視窗升到最上層,你有兩種選擇:
        1.按下META鍵,保持按住。
        2.在根視窗上,碰觸一下右按鈕。
    或
        1.同時按下META和SHIFT 鍵,保持按住。
        2.在螢幕上的任何地方,碰觸一下右按鈕。

    Circulate Down:將最上層的視窗移到最底層,作法同Circulate Up,但
        改為左按鈕。

    Iconify:之前我們曾提過兩種形式的表徵圖化,一種是視窗曾經表徵圖
        化過(已定義過表徵圖的位置) ,另一種為對 "新" 的視窗表徵圖化
        。

      表徵圖化一個新的視窗:

        1.按下META鍵,保持按住。
        2.將指標位置移至欲被表徵圖化的視窗。
        3.按下LEFT按鈕,保持按住...
        4. ... 拖拽表徵圖的外框到你所需的位置。
        5.鬆開按鈕和META鍵。

      注意它和Lower 操作程序的不同點,在此你是按下... 拖拽... 鬆開滑
      鼠按鈕,而對Lower ,你只是碰觸一下按鈕。

      表徵圖化一個曾經表徵圖化過的的視窗:

        1.同時按下META和CTRL鍵,保持按住。
        2.在你欲表徵圖化的視窗上,碰觸一下左按鈕。

       (如果你對先前並未表徵圖化的視窗作這個操作,或經由resource結構
        無法取得表徵圖的位置,表徵圖將出現在指標所在的位置)。

    De-Iconify:將表徵圖還原為它的視窗 (在視窗原來的位置):

        1.按下META鍵,保持按住。
        2.在表徵圖上,碰觸一下中按鈕。

    如果你覺得這些對滑鼠按鈕功能的結合十分笨拙且不易記憶,別擔心,很
多人都是如此。有更好的法子,剛才那些只是預設的設定,你可以完全由自己
來建構。在本章的後半部,我們將告訴你如何做。現在我們先來看一看,在標
準選單的一些功能和它們能做些什麼。

19.1.2 一些更多的選單選擇

這是一些我們在第6章中沒有解釋的標準的選單選擇。

    Focus:讓你設定鍵盤的焦點(focus),也就是說,將鍵盤附屬於一個視窗
        ,所以不論螢幕上的指標在何處,鍵盤的輸入總是在同一個視窗。一
        般鍵盤的輸入總是指向目前指標所在的視窗。

        設定焦點到一個特定的視窗:選擇focus ,出現手指形游標,在你所
          欲指定的視窗碰觸一下按鈕。

        恢復正常:選擇focus ,在背景視窗上碰觸一下。

    Restart:停止uwm ,重新啟動它,重新讀入建構檔 (下節說明) 且執行它
        。在你改變建構檔且希望馬上執行新的設定時 (否則將等到你重新啟
        動一個新的週期) 使用此選擇。

    Freeze:暫停螢幕上所有的顯示,當你要對你的螢幕攝影時可以使用這個
        選擇。欲重新恢復顯示,使用 ...

    Unfreeze:重新恢復顯示,所有的視窗會立即更新。

    Exit:中止uwm 。當你要殺掉uwm 時使用,例如在啟動一個不同的視窗管
        理器之前。

Perferences 選單

    我們在第6章提過,有兩種方法叫用uwm 的WindowOps選單 -- 在背景視
窗上按下中按鈕,或在按住META和SHIFT 兩個鍵的情況下,在任何地方碰觸一
下中按鈕。用第二種方法讓你呼叫出第二個選單,只要將指標移到WindowOps
選單的外邊,標頭為Preferences 的視窗就會出現。

    在Preference中的選擇,只是一些xset程式中設定滑鼠和鍵盤的選項而已。

    注意:Lock On 和 Lock Off選擇是和記錄有關的,可能會導致一個錯誤
的訊息在你的主控台視窗印出。

19.1.3 改變現存表徵圖上的標題

uwm 的預設表徵圖 -- 灰色的盒中有一個名稱 -- 如果你對同一個應用程式執
行數次拷貝後會有缺點,例如有三個xterm 的表徵圖,你無法明確的區分它們
。為了克服這點,uwm 允許你可以編輯表徵圖中的字串為你所需的任何字串。
 (這只能在uwm 自己預設的表徵圖使用,例如你無法編輯在xclock的特定表徵
圖中的字串)。

    欲編輯在一個表徵圖中的名稱:

    1.將指標移至所欲編輯的表徵圖。
    2.鍵入你所希望的任何文字。
    3.你可以去掉文字,不論是先前存在或方才才輸入的,方法如下:

      去掉前一個字元:按DELETE。
      去掉整個名稱:按ctl-U。

19.2 定製uwm

uwm 具有高度的可建構性。你可以將整個範圍的參數和定義儲存在一個建構檔
中,當uwm 啟始時會將之讀入。我們前節曾經提過,你可以在中途改變建構檔
,藉著在WindowOps選單中Restart選項,告訴uwm 重新讀入它。

uwm 的建構檔

預設uwm 有兩個建構檔,其中之一為

    /usr/lib/X11/uwm/system.uwmrc

通常由系統管理者設定,且第一個被讀入。另一個

    $HOME/.uwmrc

是你自己的建構檔。兩個檔案均需要存在,uwm 硬性規定了預設設定。

    注意:如果你用不正確的語法設定一個建構檔,當uwm 讀入時,你會得到
一個錯誤訊息像:

    uwm: /usr/nmm/.uwmrc: 38: syntax error
    uwm: Bad .uwmrc file...aborting

uwm 將不會啟動。當在一個新的週期啟動時,這沒有什麼大問題。然而,如果
你是在中途重新設定uwm ,你可以結束但沒有視窗管理器,且沒有xterm ,沒
有編輯視窗來編輯這個錯誤的檔案,無法啟始其它的視窗。如果此種情況發生
,你必需從其它的終端機或機器關閉X,或毀壞 (crash)你的系統。

uwm 的命令列選項

如果你不需要系統建構檔案,也不需要任何預設的設定,你可以藉著uwm 的命
令列選項 -b 抑制它們。

    如果你要使用其它的檔案,就像兩個預設的建構檔一般,你可以用
-f filename 來指定它。

19.2.1 繫結功能到鍵和按鈕

uwm 讓你定義當一個特定的滑鼠按鈕按下時,有某個功能會作用,例如當你在
一個視窗中碰觸一下中按鈕,它將被升到堆疊的頂層。這種繫結結構和Toolkit
轉譯並沒有牽連,它完全由uwm 本身來完成。

為了讓這些結構更有用,你可以指定其它的條件來運用更多的功能,或許一個
修飾鍵 (像META) 需被按下,或許作用只發生在指標位於一個表徵圖上而非應
用程式視窗或背景視窗。我們已實際的看過這些例子:

  此功能發生     ... 只有在這些        ... 只有指標在      ... 當這個
  於...          修飾鍵被按下,        此種型態的視窗      滑鼠事件發
                 而且...               ,而且...           生時

  Resize         META                  一般視窗            按住中按鈕
                                                           且移動

  WindowOps      沒有                  背景視窗            按住中按鈕
  選單

  WindowOps      META 和               沒有關係            按住中按鈕
  選單           SHIFT

    你藉著你的 .uwmrc(或其它的建構檔)所包含的繫結規格來指定繫結。規格
的格式和上面的表格類似,就像:

    uwm-function = modifiers : window context : mouse events
    ( uwm 功能   =  修飾鍵   :  視窗的環境    :  滑鼠事件  )

這些元素為:

  uwm 功能:uwm 的內建功能之一的名稱。例如功能f.move即是你用以移動視
      窗的功能,f.lower 將視窗降低一層等等。這些功能將於下更完整地描
      述。

      功能名稱必需跟隨著一個等號(=)。

  修飾鍵:在運用上述功能時,當指定的滑鼠事件發生時,必需被按下的修飾鍵
      表列。正確的修飾鍵名稱為:

      ctrl(或c),對CONTROL鍵。

      meta(或m或mod1),對META鍵。

      shift(或s),對SHIFT鍵。

      lock(或l),對CAPSLOCK鍵。

    這些名稱必需正確的列出。你可以使用一或二個修飾鍵,如果你使用兩個
鍵,用一個 "|"符號來分開它們。

    你可以省略整個修飾鍵表列 (即此功能對應於滑鼠事件發生時並沒有修飾
    鍵被按下),但尾端的冒號 ":" 不可省略。

  視窗的環境:限制只有指標在螢幕上指定位置的型態符合特定條件時,功能
      才會發生。正確的環境如下:

    window(或w):指標必需位於一個應用視窗中。

    icon(或i):指標必需位於一個表徵圖中。

    root(或r):指標必需位於根視窗或背景視窗中。

    你可以指定任何數目的環境,用 "|" 來區隔它們。如果你沒有指定,則功能
    的發生與指標位置無關。

  滑鼠事件:何種滑鼠事件對應到此功能。指定的事件為一個按鈕名稱 -- 任何的

      left(或l)

      middle(或m)

      right(或r)

    跟隨著一個動作:

      down : 當按鈕被按下時會符合。
      up : 當按鈕被鬆開時會符合。
      delta : 當按鈕被按下且移動超過一定數目的像素時會符合。

  所有的這些你已實際使用過它們,在本章開頭所描述的一些作用的繫結為:

      f.resize = meta : window : middle delta
      f.iconify = meta : icon : middle up
      f.raise = meta : window|icon : right down

  uwm 的預設繫結在檔案 $TOP/clients/uwm/default.uwmrc,見圖19 - 1。

        ┌────────────────────┐
        │      p242-243  fig 19.1                │
        │                                        │
        │    圖19-1 預設的 .uwmrc 建構檔         │
        └────────────────────┘

uwm 的內建功能

uwm 的指南頁列出可應用的功能。你已經從圖19 - 1見過其中大部份,你可以
看出,功能是和WindowOps及Preferences中的選項相關。

    然而,有一個有關pushing視窗(f.pushleft, f.pushup等等)的功能集合你
從未見過。pushing的意思為:你朝一個特定的方向移動一個視窗,移動的距離
固定。這和f.move不同的是,後者以交談的方式,指定視窗移動的方向和距離。

    預設f.pushdown繫結到同時按下CONTROL和META鍵,且按住中按鈕。試它幾
次,你將發現你的視窗稍微移動了一點 -- push 功能對細部移動視窗非常有用。

    另一個功能為f.moveopaque。它也移動一個視窗,但不像f.move,它並不會
給你一個指示視窗新的位置的方格,你直接拖拽整個視窗本身。這可以讓整個螢
幕清爽些,但比較慢,且一般視窗移動時會有抖動的現像。

19.2.2 定義你自己的選單

f.menu是一個非常強大的uwm 的功能:它讓你定義你自己的選單。此選單可選
用到uwm 本身的功能,或任何的shell 命令,或一個特定的動作,像是在一個
剪緩衝區插入本文。

    在你的建構檔中定義一個選單共有兩個步驟。首先你定義選單上所需的
繫結,其次你定義選單本身的內容。繫結的部份像我們先前所用過的,但在尾
端增加了一欄選單名稱。例如WindowOps 選單 (藉著在背景視窗中按下中按鈕
來呼叫)的繫結是:

    f.menu = : root : middle down : "WindowOps"

在此,選單名稱既是用以顯示選單出現時的名稱,也連結到建構檔中的選單內
容規格。

    選單內容的格式很簡單:對每一個選擇項,包含了一列當選擇項出現在選
單的 "名稱" ,和當它被選擇到時所做的動作。讓我們觀察一個縮水的WindowOps
定義:

    menu = "WindowOps" {
    New Window : !"xterm &"
    RefreshScreen : f.refresh
    Redraw : f.redraw
    Move : f.move
    }

從這裡,我們可以看到其語法為:

    menu = "menu name" {
    ...
    selection lines
    ...
    }

選單名稱和繫結所指定的相同。選擇項列包含了選擇項名稱,分隔的冒號,和
負責的動作。這些動作為下列三者之一:

    1.一個uwm 的功能:只用到它們的名稱,在上例為move那一列。

    2.一個shell 命令:命令包含在雙引號中間 (用shell 的& 語法使其在背
      景視窗中執行) 且在前面加一個驚嘆號。在上例為xterm 那一列。 (如
      果你省& ,uwm 將被懸置 (hang) 起來,等待命令的完成,如果此程式
      為X的應用程式,它需要uwm 來安排它的視窗,這將會招致麻煩)。

    3.一個本文字串:這將插入到一個 "剪" 的緩衝區,而後你可以像平常一
      樣的 "貼" 它。

多種的選單連結到同一個鍵繫結

通常你對一個特定的鍵/按鈕的組合,只會繫結到一個選單,但你可以對同一個
繫結有多種選單:如果你在一個選單中不選擇任何項目且把指標移動到選單的
邊上,你將得到下一個選單。你已經實際地看過這種例子:在同時按下META和
SHIFT 鍵的情況下按下中按鈕,你可以得到WindowOps 選單,然後是Preferences
選單。

    繫結多種選單非常的容易,只要在定義每一個繫結時當作其它的繫結並不
存在,而在定義選單的內容時用標準的方式即可。例如uwm 的預設設定包含了
繫結:

    f.menu = meta | shift : : middle down : "WindowOps"
    f.menu = meta | shift : : middle down : "Preferences"

注意一個選單只能定義一次,但你可以用它來做任意多次的繫結。 (查看預設
設定,你將看到WindowOps 選單被定義了一次但使用到兩次)。

指定選單的顏色

你可以指定在一個選單中所用的色彩。對選單名稱標題、每一個選擇項、指標
所在的高亮度選擇項,你都可以指定一個前景和背景色彩。一個有色彩的選單
的格式如下:

    menu = "menu name" (head-fg : head-bg : hilite-bg : hilite-fg) {
    ...
    selection-name : (item-fg : item-bg) : action
    ...
    }

以下為一個混合的範例,使你的WindowOps 能擁有更多的色彩:

    menu = "WindowOps" (yellow : blue : red : green) {
    New Window : !"xterm &"
    RefreshScreen : f.refresh
    Redraw : (navy : magenta) : f.redraw
    Move : f.move
    }

此選單標題為藍底黃字,大多數的選擇項為白底黑字 (預設值),只有 "Move"
選擇項為紫紅色底海藍色字,而目前指標所在的選擇項為綠底紅字。

19.2.3 控制uwm 的參數變數

到目前為止,你可以用指定滑鼠和鍵的前後關係,來改變所指定的功能。在此
有一個另一種型態的uwm 的定製:你可以藉此改變許多內建功能操作的作法 (
mode) 和風格 (style),例如你可以指定在resize或move操作下,指示視窗新
的位置的九宮格,改變為只是一個外框而已。在指南頁中有列出所有的變數和
它的意義,在此我們只提一些特別有用的,和解釋一些比較模糊的。

    讓預設建構檔中的設定無效:uwm 並沒有結構抑制讀取系統和使用者建構
檔。(-b 不會影響 $HOME/.uwmrc)。欲取消早先檔案中的設定,可以含入uwm
的變數resetbinding、resetmenus和resetvariables,將會分別的取消早先定
義的繫結、選單和變數。 (確定你將這些變數放在檔案的頂端,否則它將取消
在檔案中所有在它之前的定義)。

    限制視窗和表徵圖在螢幕的範圍以內:X允許你指定你的視窗位於螢幕的
任何位置,甚至部份或全部在螢幕之外,這樣有時會引起麻煩。當你建立一個
視窗,uwm 並未提供任何的幫助。但當你使用f.newiconify對一個表徵圖作解
除表徵圖化,如果變數normalw 被設定,則視窗會被完整的放在螢幕中,且儘
量接近你用指標指定的位置。 (如果你包含了normali 變數,同樣可用於表徵
圖)。

    控制push作用:預設f.pushxxx 功能將一個視窗往適當的方向推動一個像
素的距離。你可以藉著指定 push=num 來推動num 個像素。你也可以完全地改
變操作的作法:取代通常的推動固定數目的像素的作法 (叫做pushabsolute)
,你可以指定pushrelative:這種情況視窗會被推動num 分之一大小的視窗。
例如如果你指定

    push=5
    pushrelative

則一個f.pushup將把視窗向上推動視窗本身高度五分之一的距離。

    防止uwm 功能鎖定應用程式:預設一些uwm 的操作,像resize和move會導
致所有其它的client應用程式被凍結,也就是說,防止它們輸出到它們的視窗
。你可以藉著指定nofreeze取消它。

    如果你需要獲得一些uwm 所屬短暫視窗的視窗傾印,則這是必需的 (如在
圖6 - 6 的resize盒)。 它的副作用為當使用resize和move時,外框格會大量
的閃動,以致難以看到。

19.3 結論


本章告訴你如何使用一些更多的uwm 的功能,現在你對系統有更多的經驗且可
以利用它們。特別是看到不用預設選單如何建構視窗,它使你工作的更迅速。

    本章的第二個部份,列出你如何能定製uwm :如何附屬uwm 的內建功能到
指定修飾鍵和滑鼠動作的組合,如何定義一般性的選單,如何使用uwm 的參數
變數修改操作的作法。

在結束之前說一點題外話,uwm 和 xterm、xclock、xedit等一樣,只是server
的一個client程式而已。所以,遠端地執行uwm 是可能的,例如在saturn執行
uwm ,但是指定 -display venus:0,所以它是venus 的視窗管理器。這解釋
了網路元素深殖於系統,在一般工作站,這只是好奇,但在X終端機 (它不提
供一般性目的的處理 (processes)) 它實際地需要。

我們現在接近尾聲:你已有所有你執行視窗系統的所需的功能。你有視窗管理
器、應用程式、便利的工具、視窗有關的公用程式、大範圍的設施所以可以修
改以適合你的顯示器、你網路上的建構和你比較喜歡的工作。下一章,我們將
會把目前所學的放在一起,告訴你如何管理你完整的工作週期,且我們將包含
定義uwm 選單和perferences的實際的範例。

=====

第20章  全部放在一起 -- xdm

    現在我們已涵蓋了你需要用到X的所有個別的項目,你知道如何啟動系統,
如何設定一個視窗管理器的執行,如何執行應用程式,如何從不同的角度定製
系統,最後,如何退出系統。

    本章中,我們把這些分開的部份放在一起,且描述一個完整的檔案設定,
用來定製涵蓋所有的範例功能系統機器環境。在本章我們將看到我們所要介紹
給你的最後一個X的工具:顯示管理器(display manager) -- xdm,它提供一
個精巧和清楚的方法在你的機器上啟動X。


20.1  我們需要做些什麼

    當我們啟動之後,我們需要安排螢幕,讓一些我們在整個執行期間中都會
使用的應用程式適得其所,讓一些偶然用到的則以表徵圖為開始時的表示方式。
我們需要執行視窗管理器,對某些種類的功能做一些設定。詳細來說,我們需
要下列的程式:

    .一個xterm 的主控台,在螢幕左上角。

    .uwm 在背景下執行。

    .一個我們的(正常)編輯器的全螢幕xterm 視窗,以表徵圖啟始。

    .在右上角一個(較一般為小)的時鐘。

    .xbiff 在時鐘之下。

    .一個計算器在右下角。

    .一個用到我們所有最小的字型的表徵圖化的xterm ,它的高度為screen高。

    .在xbiff 之下,排列我們使用遠方機器的頻率圖。

    除了程式之外的項目:

    .設定背景視窗為亮灰色。

    .啟動鍵盤滴答(key-click) 的功能。

    .從我們常用的網路主機存取到我們的server。

    .載入我們對所有client用到的server設定的resource,在16章我們定義
      的$HOME/.Xresources 檔案中,根視窗RESOURCE_MANAGER性質之上。

    .啟動一個screen saver。

    並且我們需要uwm 有選單讓我們能夠:

    .容易地存取在網路上其它的主機。

    .變更一些鍵盤和滑鼠的設定,且設定背景視窗的顏色。

    .啟動那些我們偶而會用到的應用程式。

    .啟動一些被選定的示範程式。

    對這些我們自己的設定,在我們網路上其它的使用者需要不同的初始設定,
所以我們需要安排每一個使用者依他們自己的喜好設定,理想上,使用者應能
自行設定而毋需藉系統管理者的幫助,下一節我們來看程式xdm 如何能幫助我
們達成這些目的。


20.2  xdm  -- X顯示管理器(X Display Manager)的概觀

    xdm 管理一或多個顯示器,xdm 可在同一機器或遠方的機器上執行。它可
以做到所有xinit 能做到的,而且更多。它所隱含的概念為它應控制當你在X
工作時的完整週期 (session),意即從你進入直到結束視窗系統的週期。(用
xinit ,有效週期為當你執行xinit 開始,到你結束(logout)最初的xterm
視窗和關閉server。)

    xdm 較這更進一步:你可以用它執行一個不確定的週期。當一個結束,下
一個便準備開始。實際上,如果你有需要,它讓你不變地指定一個顯示器。

    xdm 完全取代xinit 。從現在起你可忘掉xinit ,而且不再需要使用它,
我們在最初使用xinit 的原因為它較易觀察和瞭解系統的運作。

    xdm 是一個非常靈活的程式,你幾乎可用它建構任何你所需要的,在進一
步深入之前,讓我們觀察一個範例週期的預設行為,然後我們來看一看你如
何改進當一個使用者進入X系統所看到的初始介面。


20.2.1  一個用xdm 的範例週期

    我們將使用xdm 來設定在我們機器上執行的X。你的機器已經啟動,但尚
未有視窗系統在其上執行。用下列的命令啟始xdm

        xdm

    xdm 開始執行,你幾乎立刻又看到你的shell 提示。然後螢幕背景變更為
通常灰色形式,且你看到一個大的X游標,所以你知道server已經啟始。

    接下來是一長段修止狀態 -- 大約接續15秒或更久 -- 而後突然間一個帶
著歡迎標題的視窗出現了,要求你的登錄名稱(login name)和密碼(password),
如圖20-1(這是xdm 的authentication widget )。輸入你的使用者名稱和密
碼,又過了一會兒,你可以看到一個xterm 視窗在左上角出現,就如同圖5-3
一般,從現在起,你工作的方式和以前相同 -- 啟動你的視窗管理器,執行應
用程式等等。

          ┌──────────────────────┐
          │   FIG 20.1        P.251                    │
          │                                            │
          │  圖20-1  xdm 的 authentication widget      │
          └──────────────────────┘


    當你需要結束時,你也可用像以前相同的方式結束:logout最初始的xterm
視窗。但這裡xdm 和xinit 有不相同的地方,代之關掉server的是,回到非X
的環境,螢幕回到最初始灰色的背景,過一下子之後,你又再度看到X的登錄
視窗。事實上,xdm 是執行一個循環的週期。

    注意:就像許多的Unix程式,最大的登錄名稱長度為8 個字元 -- 如果超
過這個長度,login 將會失敗。(如果你的實際login 程式允許你使用較長的
名稱,這種限制也許讓你感到奇怪。)

關閉xdm

    有時你可能需要完全地關閉X。為了做到這點,你需要關閉xdm 。

    在MIT 版中的server,會依循如果收到Unix訊號SIGTERM ,便會執行中止
程序。xdm 利用到這點:如果你送給它一個SIGTERM ,它將中止所有它所控制
的server後離開。這就是你中止系統的方法。

    欲實際地中止xdm ,可以在一個xterm 視窗(在你的機器上)用ps來找出
xdm 的process-id,而後用kill送給它SIGTERM (你將看到數個xdm 處理的執
行:那個最年輕的便是你要的,也就是說,最低的process-id)。例如,在我
們的機器上執行中止的動作:

    venus% ps ax 1 grep xdm
    1997 ? IW 0:00 xdm
    1998 ? IW 0:00 xdm
    2000 ? IW 0:00 xdm
    2078 p0 S 0:00 grep xdm
    venus% kill -TERM 1997

    你所有的應用程式將被強迫中止,server也隨之關閉。

    注意:當相關於X的每一件事都結束後,你的螢幕可能只顯示通常X背景
的灰色形式,沒有任何的shell 提示或任何事。不要被愚弄了:你的shell 已
準備好接受你的命令 -- 按下RETURN鍵你將會看到。(因為在你以交談式下
xdm 命令之後,shell 已將提示號送出,所以不再重覆 -- 除非你按下RETURN)。


20.3  有關xdm 的更多

    我們在前所述為xdm 的預設模式的操作,所以看起來並沒有比xinit 提供
得更多,如果你使用一個正常的工作站或顯示器,一些外貌將不是很有趣。無
論如何,X終端機(x-terminal)是一個日漸增加的大眾化設備,而xdm 可大量
地簡化管理類似的系統。X終端機通常沒有它自己的檔案系統,且不能支援一
般目的的程式,必需在網路的某處執行包含視窗管理器和顯示管理器的控制終
端機軟體,xdm 正是符合此需要的軟體。

xdm 在下列這些場合較xinit 為優:

    .它可控制數個server,也暗示說,其中有一些為遠方的server,也許是
      在X終端機或相當小的工作站上。

    .它提供密碼來存取系統,同樣地,在X終端機上非常有用(但在一個你
      已經login 的工作站會有一點困擾。)

    .它提供無限期的X的週期。你可以建構顯示器經常性地以X操作,所以
      使用者毋需擔心如何啟始系統。

    .它具有高度的建構性,系統管理者可以設定依機器特性的啟始和結束程
      序,掌握這些項目以供記帳(accounting),授權(authorization) ,檔
      案系統等之用,且能讓每一個個別的使用者全範圍性地修定他們所需的
      自己的環境。

    .從使用者的觀點,它提供一個乾淨而簡單的方法來啟動系統。

    所以大體上,xdm 主要是一個系統管理工具,但它也提供讓一個普通使用
者定製他所希望的一致和一貫地系統架構。

    xdm 的指南頁包含了大量的有關如何使用系統的教學資訊和指引,在此我
們不再重覆,我們將在以下的章節說明如何正確地建構xdm 以提供在本章一開
頭所描述的環境。

    xdm 真的非常有彈性,且你可以用許多不同的方式選擇設定,我們將使用
    最簡單的處理,並試著大致和指南頁的描述保持一致,偶而我們在一些檔
案中使用不同的名稱,用以強調此名稱並非硬性的規定。

    在我們工作的週期中,請對我們事實上在扮演兩個不同的角色保持概念:
第一是系統管理者,對於使用系統的任何人來設定xdm ,第二是一般的使用者
,為我們自己的需求設定xdm 。


20.3.1  系統管理者對xdm 的建構

    預設xdm 先查看檔案

        /usr/lib/X11/xdm/xdm-config

如果它存在,會把它當成多設定幾個其它參數的resource檔案。我們將使用它,
因為它可簡化我們的工作。

    指南頁會列出所有你能藉xdm-config檔案設定的參數,但我們較有興趣的有:

    .包含一個server的目錄的檔案名稱。

    .當任何錯誤發生時,xdm 用來記錄的檔案名稱。

    .包含和啟始系統有關的檔案系統名稱。

    .當server啟動後執行程式的名稱,這個程式定義了你的”週期” -- 當
      這個程式中止時,xdm 視其意義為你的週期已結束,且回到它login 時
      的順序,預設這個程式為xterm ,就和使用xinit 一樣,你的週期持續
      直到你logout你初始的xterm 。

    這是我們已在系統上定義的設定:

        DisplayManager.severs:   /usr/lib/X11/xdm/our-server
        DisplayManager.errorLogFile:   /usr/lib/X11/xdm/errors
        DisplayManager*resources:   /usr/lib/X11/xdm/our-resources
        DisplayManager*session:   /usr/lib/X11/xdm/our-session

(我們已選擇保持所有xdm 相關的檔案在目錄/usr/lib/X11/xdm,這只是代表
名稱,你可以用任何你喜歡的目錄。)

    所以你可以看到我們使用xdm-config,實際上是一個兩步驟的處理方法,
首先我們定義在xdm-config中的一些檔案名稱,接著我們來設定方才命名的檔
案。現在我們來看一下我們在xdm-config中定義的每一個resource。

xdm 的server的名單

    這個被DisplayManager.servers設定的檔案的resources 包含了一個xdm
能管理的server的名單。每一列中包含了server的名稱(也就是顯示器),
server的型態(type),和型態有關的項目。

    型態指出了顯示器是本地的或遠方的。和是否為無限或單一的週期(詳見
xdm 指南頁)。我們將使用型態localTransient -- 單一週期在本地顯示器上
 -- 因為以此方式,如果發生任何錯誤,我們不致於陷入無窮迴圈中。稍後,
當我們每件事都設定好且執行無誤的話,我們會將型態改為本地而循環的週期。

    對本地的顯示器而言,和型態相關的訊息是在此顯示器上執行的server程
式的名稱及其任何所需的引數。對遠方的顯示器,此訊息可被忽略,但你仍需
輸入一個假的(dummy) 程式名稱。

    所以,在我們所建立的檔案/usr/lib/xdm/our-servers包含這一行:

        :0 localTransient   /usr/bin/X11/X  :0

(如果我們喜歡執行循環週期,此檔案便不再需要 -- 預設設定會做到我們所
需要的 -- 所以我們在建構檔中不需定義DisplayManagers.servers resource。)

xdm 的錯誤登錄檔案

    此檔案從xdm 和xdm 的週期程式接收所有錯誤的訊息,且如果你的xdm 設
定工作發生問題的話,這是第一個需要查看的地方。

    當你開始設定你的系統,對此檔案設定任何人均可寫入,否則,有問題的
程式可能因沒有寫入許可而無法在檔案中記錄。

啟始時的resource檔案

    此檔案包含一個resource的名單,在Authentication Widget 啟始之前被
xrdb載入。因此,你能用它來為那些widget設定resource。(你當然也能放置
任何其它的resource規格,但通常週期程式的使用者設定載入時會凌駕其上,
所以通常不把其它的規格放在這裡。)

    authentication widget resource的預設設定在某些情況是很細的,但為
了舉例,我們只設定和bunner不同的標題,我們建立我們的檔案

        /usr/bin/X11/xdm/our-resources      包含一行:

xlogin.Login.greeting:X-Window on the Plants network

xdm 的"Session(週期)"程式

    你可以指定任何程式為你週期中所需的程式,可是當週期結束,你通常選
擇一個程式讓你能啟始其它的程式,你能依賴xdm 的預設設定執行xterm ,但
這種方式每當xterm 執行時你仍必需手動所有你的設定。我們需要定義我們的
週期程式來做所有我們的設定,且保持活動(active)的狀態直到我們結束它為
止,但記住,我們希望使用者如果需要能定義他們自己的週期程式,所以我們
將使用兩階段的處理,如果是系統管理者,我們將設定一個一般性目的,基礎
的,週期程式來召換一個使用者自己的程式(如果它存在),但其它方面將執
行一個合理預設。當個別的使用者,我們將定義我們自己的設定週期,它將被
xdm 的一般目的程式執行(我們在另外一節討論它)。

    我們的基本的site-wide 週期程式非常簡單,如果使用者有設定檔案
$HOME/.Xsession 的常規我們便使用之,否則,我們將執行合理的預設 -- 啟
動uwm 而後傳遞控制到一個xterm(xterm為我們指定在螢幕左上方的那一個)
。但在做之前,我們先檢查是否使用者設定了檔案$HOME/.Xresources(其它的
常規),如果有的話,我們用xrdb載入它。一個完整的程式名單如圖20-2。

          ┌──────────────────────┐
          │   FIG 20.2        P.257                    │
          │                                            │
          │  圖20-2  程式/usr/lib/X11/xdm/our-session  │
          └──────────────────────┘

20.3.2  我們自己對於xdm 的建構

    現在我們改變角色:我們不再是系統管理者,而是一個使用者。我們可以
依賴系統管理者已定義之預設週期,但我們比較喜歡定義自己的週期,所以我
們要獲取那些說明我們所需的起始設定。

我們的實例.Xsession

    我們已建立我們自己的$HOME/.Xsession,如圖20-3,且此螢幕初始的建構
在它執行之後會如圖20-4。此程式的操作十分直接,但當你自行設定時有一些
要點需要注意,且當你建立site-wide 週期程式也是一樣。我們假設你的週期
程式是一個shell :雖非必定,但通常都是(除非你要寫一個xetrm 的複雜的
代替品)。

          ┌──────────────────────┐
          │   FIG 20.3        P.258                    │
          │                                            │
          │  圖20-3 $HOME/.Xsession 程式               │
          └──────────────────────┘

          ┌──────────────────────┐
          │   FIG 20.4        P.259                    │
          │                                            │
          │  圖20-4 我們初始化後的螢幕                 │
          └──────────────────────┘

    .檔案中的命令依序排列,所以最後一行所執行的是一個程式,它可以持
      續整個你的週期。(因為,當此程式結束,則週期程式結束,且每一件
      事也均將結束)。

    .除了在背景中最後的命令所有的命令均被執行,也就是說,在命令列最
      後加一個ampersand(&)  號。如果你不這樣做,此週期將從不獲取過去
      的任何不確定地執行的程式。例如:在我們的實例程式,如果我們在uwm
      那一行省略"&" 號,uwm 會啟動,但在uwm 結束時,它的下一行將不會
      繼續執行,絕不!

    .最後的命令必為exec的命令,所以它繼續執行且保持你的週期繼續活動。
      (如果你像其它命令一樣在背景中執行它,它會好好的執行,但此週期
      程式執行至檔案結束將會中斷,而結束週期。如果你不用exec,且省略
      "&" 號,則它會執行且此週期將完美地持續工作,你只是較你所需的多
      執行了一個處理,就如同你仍有最後的程式(last program)和週期程式
      本身。)

    .對所有的程式建立視窗時設定geometry規格 -- 否則當它們啟動時你將
      以”手動”方式指定它們的位置。

    .在檔案中最後一行的程式通常用來啟動xterm ,因為它定義了你週期的
      生命期,在你執行X時此視窗總是存在,所以你通常設定兩個特別的選
      項:

      1 .使用-C選項使得xterm 為一個”主控台”,所以系統訊息會在它的
          視窗顯示。

      2 .設定-ls 選項使它的shell 為login shell 。如此使得shell 讀入
          你的.login或.profile,所以你的環境變數會適當地設定。(如果
          你不這樣做,你只有一點兒定義:DISPLAY,HOME,USER,PATH和SHELL.)

      3 .此週期程式檔案必需有執行許可。使用上述site-wide 週期程式,
          這對使用者週期script不是絕對需要,它實際是對site-wide 程式
          本身。(如果那不能執行,你只能獲得xdm 的預設設定。)

    在裝設你的.Xsession 和依賴它啟始你的視窗週期之前,最好能夠從一個
xterm 視窗啟動你的.Xsession 以嚴格測試它。

20.4  我們自己的uwm 建構

    我們需要設定四個uwm 選單:一是連接到其它的主機,二是執行一些X的
應用程式,三是設定一些鍵盤和滑鼠參數(有點兒像預設的Preference選單),
四是執行展示程式。

    對我們的”主機”選單,我們現在希望只要藉著從選單中選取主機名稱便
可在任何主機上啟動xterm 。我們常常需在mars上做一些系統管理,所以我們
將設定選擇在其上為超級使用者(super user),我們將在左下角建立一個超級
使用者視窗,但對一般的xterm ,我們省略geometry規格,所以當它建立時,
我們可以明確地定位它。我們將以META-SHIFT-LEFT 繫結 (bind) 此選單。所
以在我們的$HOME/.uwmrc中我們包含了此列。如圖20 - 5.

          ┌──────────────────────┐
          │   FIG 20.5        P.260                    │
          │                                            │
          │  圖20-5  在$HOME/.uwmrc的主機選單          │
          └──────────────────────┘

    其它三個選單我們不常用,所以我們均以META-SHIFT-MIDDLE 繫結它們,
這沒什麼特別,但注意Misc. 不包含一個內建的混雜的uwm 和shell 命令。這
些對應到.uwmrc的項目如圖20 - 6。

          ┌──────────────────────┐
          │   FIG 20.6        P.261                    │
          │                                            │
          │  圖20-6  在$HOME/.uwmrc中其它的選單        │
          └──────────────────────┘

    uwmrc 剩餘的部份 (見圖20 - 7),我們用以設定定製繫結和一般視窗建構
操作的參數。注意下列幾點:

    .我們選擇一個較預設稍大的字型 (用"menufont=fixed"),降低選單選項
      中的空白空間 (用"vmenupad=1"),所以選單不會很大。(menufont 可能
      未在指南頁中描述)

    .我們設定所有的選單,繫結和變數可被重設(用resetmenus等等),這
      清除了uwm 的建構,所以我們不用混雜的預設建構和我們自己的建構做
      結束。

    .如果可能,我們較願意使用滑鼠的UP事件函數而非DOWN:這種方式你能
      藉著在鬆開按鈕之前按下其它的按鈕,來改變你的主意或中止操作。
      (但你不能將move操作繫結到一個UP事件。)

    .我們已包含一些定義uwm 選單的功能 -- 一個是殺掉應用程式視窗,另
      一個是重新啟始uwm 。它們不是必要的,但當你對系統很有經驗時會很
      有用。

          ┌──────────────────────┐
          │   FIG 20.7        P.262                    │
          │                                            │
          │  圖20-7  在$HOME/.uwmrc中繫結和參數的設定  │
          └──────────────────────┘

20.5  結論

    你已涵蓋了core版中所有使用者層次的程式和如何使用它們。

    你現在能夠自行設定和修訂成你所需的系統。大部份的修訂局限於你的家
目錄(home directory)中的三個檔案 -- .Xsession, .Xresources和.Uwmrc
-- 所以它很容易控制你的環境,且可在你的系統管理者所設定的任何設計下
執行。

    我們涵蓋了一大堆的材料,且有許多的新觀念包含進來,所以你尚未能完
全吸收它,這不是我們所預期的,現在因為你已用過系統一段期間,所以回頭
重讀系統的觀念概觀,你將發現你了解更多,且你可看到在系統表面之後的動
機。

    當你使用系統越多次,你將發現有一些面貌是你不喜歡的,但這些系統並
沒有。有一些工具和視窗相關程式可簡化你的工作,且有一些應用程式對X提
供介面有大利益,但不包含在此版本中,別失望! -- 看contrib 版軟體來取
代它。現在你知道基本系統的限制和能力,看一看其他的人利用它們做了什麼
,這也是你可能需要系統做的。

    本書的目的是讓你有一個開始 -- 它並無意當一本完整的參考手冊。在某
些地方我們忽略了一些程式不常用的細節和那些對初學者易產生混淆和較複雜
的部份。但現在你能回頭重讀系統提供的文件,指南頁和其它的資料是非常龐
大的,如果你知道你要做什麼和只是要某一點複習一下你的記憶,或找出某些
事如何正確的執行,你將在其中的某處找到它們。現在你已會使用系統和中止
系統,你能明白參考手冊的意義,為了幫助你找出你自己貫通文件的方法,我
們有一個附錄包含了在這個版本中的資料名單,告訴你在何處找到它們,和如
何更進一步的去探討系統。

    所以,現在我們只剩下一句話給您:祝一切順利!
--------------586E36D9105D
Content-Type: text/plain; charset=iso-8859-1; name="X-WINDOW使用手冊附錄.txt"
Content-Transfer-Encoding: 8bit
Content-Disposition: inline; filename="X-WINDOW使用手冊附錄.txt"

附錄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所列的供應商訂
      購一份。)

    .首先,對已有的建構檔案儘量少做更動,如果你是第一次安裝X,我們
      強力推薦你使用預設的目錄來安裝那些系統的各個不同的部份,只有在
      有確實需要更動目錄名稱時,才考慮重新安裝。(如果你不如此做,當
      有些問題發生時,你將無法知道,它真的是一個問題或你只是安裝時犯
      了一個小錯誤而已)

    .如果你是用這次發行的版本建立一個標準的系統,你幾乎不需要做任何
      更動便可完成安裝 -- 建構檔已正確地被設定。(本版發行的備忘錄對
      此有一點誤導,你可能會得到一個錯誤的印象,以為不論你使用什麼系
      統,均需作大量的更動。)

    .當你開始安裝,對大多數的系統而言,你不需明確指定系統的型態,它
      的建立是根據C語言的前處理器(preprocessor)來定義系統名稱而自動
      找到。

    .在你熟悉core版之前不要安裝contrib 軟體,因為它安裝費時,且易產
      生問題,當你熟悉系統之後,你可能總會修改一些建構參數。

    .如果你真的需要使用不同預設值的建構,閱讀文件
      $TOP/util/imake.includes/README 可得到關於如何更動的資訊。(它
      也對工具程式imake 給了一個概觀,imake 是一般Unix系統中make的前
      端(front_end) ,用以建立系統)。


B.2 建立本發行版

    在本次發行的軟體分為兩類:一部份核心軟體由X協會標準所提供,另一
部份則任何人都有可能提供,要使得核心軟體這一部份能在大多數的地方重新
建構、建立和安裝需極大的努力,而那些使用者貢獻的部份,也就是說,未經
X協會標準編譯和測試的部份只能自行逐一建立,在util/scripts中的ximake.sh
可能對從Imakefiles到建立Makefiles 非常有用。

    幾乎所有在核心軟體中的makefiles 均自動地由名叫imake 的公用程式所
產生,所有的Makefiles 初始版本均包含了在哪些地方不能使用imake (無疑
地,在特定的機器上需要修正)。在許多系統,X必需以正確的磁帶方能建立。
無論如何,它可以藉簡單的設定目錄util/imake.includes/中的檔案site.def
和*.macros中之參數,來重新建構。


B.2.1 安裝摘要

    欲載入(load)和安裝此次發行的X Window System你將需要:

    1. 讀完本次發行的備忘錄。

    2. 建一個你讀入磁帶的目錄(通常名稱類似/usr/local/src/X或/src/R31)
        你將需要大約30 megabytes給核心軟體,和超過80 megabytes給使用
        者貢獻軟體。

    3. 從步驟2 卸下核心軟體磁帶,既然使用者貢獻軟體必須自行建立,你
        可以等到以後載入,每一捲磁帶含有一個非常大的Unix的tar 檔案,
        以每英吋1600位元方式儲存。

    4. 閱讀檔案util/imake.includes/README以瞭解如何建構你的特定X系
        統。同樣地,確定你依照目錄server/ddx/ 中README檔案來計畫建造
        你的server。

    5. 如果你計畫在一部以上的機器編譯這個版本並且要有一個分類檔案系
        統,你可能希望依照util/scripts/lndir.sh 的說明來建立符號連接
        樹在每一個目的機器,它允許所有的機器如你所希望的使用X而分享
        一組原始程式,在這種情況下,build tree這個名詞被用來當作你編
        譯目錄樹的參考(和含有實際檔案的source tree 有所區別)。

    6. 如果你是在A/UX 1.0下建立在 Macintosh之上,確定你是自目錄
        server/ddx/macII執行R3 setup.sh 。它從util/cpp中的公益(public
        domain) 原始碼建立一個C的前處理器,和修正一些放錯位置的系統
        檔案。如果你是在一部SUN 上,確定你在檔案
        util/imake.includes/Sun.macros的頂端設定了四個OS的參數。如此
        作可防止在不同的SunOS 編譯器下的錯誤。如果你是在Apollo上建立,
        確定你是使用9.7.1 或更後面版本的C編譯器,否則,server將無法
        正確地編譯。

    7. 確定你已遵循所有和機器特性有關的指示,且imake 也是依你的機器
        而建構。(看source tree 中util/imake.includes/Imake.tmpl頂端
        的#ifdefs 區段(blocks))。

    8. 當你完成了建構,你可以準備建立core版,注意那些在
        util/imake.includes/應用到你的系統的.macros 檔案。它們在接近
        頂端有一行設定一個make的變數名稱為BOOTSTRAPCFLAGS 。如果這個
        變數值是空白,你可以用下列的命令開始建立:

            % make World > & make.world &

        如果不是空白,你必須將此定義附加到命令列上。這可用imake 對所
        有的編譯器設定特定的cpp 符號。(如果你在不同的系統安裝,見
        util/imake/imake.c)在所有的core版提供的macro 檔案中,只有
        A/UX需要這個旗標:

            % make BOOTSTRAPCFLAGS=-DmacII World >& make.world &

        不要用輸出檔make.log當作make clean藉著make World移去此名稱的
        所有檔。這將導致重建所有的Makefiles 和執行make -k all 來編譯
        core版中所有的東西。這將依你的機器不同,花掉2 至12小時。

    9. 當make完成後,檢討log 是否有任何問題。必須要沒有嚴重的問題,
        A/UX的使用者可以忽略有關列舉型態不調和(enumeration type
        clashes)的編譯警告,Applo 的使用者可以忽略最佳化的警告。

    10.如果你對一切均感到滿足且建立正確程序,測試一些不同的程式(如
        server, xterm, xinit, etc)。你也許需要在根目錄執行 server或
        xterm ,如果你執行上有問題,第二部的工作站或終端機將很有用。

    11.對你舊版的Xheader file, binaries, fonts, libraries 等作備份。

    12.到build tree頂端並鍵入

            % make install >& make.install

        你將不是在根目錄做便是在熟悉的目錄寫入存取(看Imakefile 最上
        階層和util/imake.includes/Imake.tmpl)。xterm 程式在大多數的
        系統必需安裝setuid到根目錄,xload 程式必需安裝setguid 到那些
        屬於/dev/kmem 的檔案。

    13.如果你要安裝指南頁,在build tree頂端鍵入

            % make install.man

    14.如果你要建立和安裝lint libraries,在build tree的頂端輸入:

            % make install.ln

        如果你是第一次安裝X,你可能也需要作以下的步驟。檢查一下在
        server/ddx目錄中不同的README檔案中附加的指示。

    15.加入裝置驅動器或重新建構你的核心(kernel)。

    16.建立附加的虛擬終端機(pseudo terminals)。查看你的操作系統說明
        /dev/MAKEDEV和問你的系統管理者細節部份。

    17.閱讀有關新的顯示管理器xdm 的指南頁,這個程式提供了一個可攜的
        自動執行X的方法,和許多為了初學者所建立非常好的介面符號。這
        取代了原先自/etc/init 執行的終端機模擬器xterm 。

    18.確定所有的X11 的使用者在他們的搜尋路徑中均為BINDIR的目錄(通
        常為/usr/bin/X11)。


B.2.2 操作系統需求

    X受歡迎的理由之一為和操作系統無關。雖然我們討論的範例均為在Unix
系統下,但有許多非Unix操作系統的製造廠商也提供X。本次發行的Server已
在下列系統建立:

          4.3+tahoe
          Ultrix 3.0 FT2(Ultrix 2.0)
          SunOS 3.4
          HP-UX 6.01
          Apollo Domain/IX 9.7
          IBM AOS 4.3
          A/UX 1.0

    如果你使用較早的版本,你可能招致一些麻煩,特別是,server將無法在
IBM 4.2A第二次發行版執行。在server/ddx/ 中不同的README檔案描述了對編
譯器、函數館、前處理器等等的特定需求。例如前述的A/UX 1.0的使用者將需
要建立一個新版的C前處理器,而Apollo的使用者將需要9.7.1版的C編譯器。

    你應在使用X前先確定你的網路系統和相互通訊公用程式作用正常。如果
像talk和rlogin這樣的程式無法工作,X大概也不行。


B.2.3 讀取本發行版的磁帶

    本發行版可以用電子媒體的方式從DARPA 交換網路、UUNET 計畫、一些諮
詢公司和不同的UUCP的檔案庫。尤有進者,MIT 軟體發行中心提供了一組2400
呎的1600BPI 密度的磁帶。(該中心不提供卡帶或磁碟片)

    每一捲MIT 的磁帶包含有一個大的tar 目錄結構,內含發行版一部份的軟
體的原始碼和文件。如果你受限於磁碟機的空間,你可以只下載core磁帶,刪
除任何你不需要的server,和產生一份使用者貢獻磁帶的目錄以供以後查詢,
所有的檔案名稱均以相對路徑方式給定(在開頭以一個點替代斜線),所以這
個發行版可放在你的檔案系統的任何地方。

    在讀取磁帶之前,確定你有足夠的磁碟空間,以下為你對每捲磁帶所需的
空間。

    版名        內容                        megabytes     情況
    core        servers,函數館,公用程式       35         必需
    contrib-1   程式,示範程式,字型           36         推薦使用
    contrib-2   使用者貢獻的工具               34         推薦使用

    編譯過的程式估計需要二分之一到三分之二原始碼所佔的空間,所以,光
是core版你便需要大約60 megabytes的磁碟空間。

    建立一個目錄用以放置所有的原始碼,在此目錄中,執行適當的作業系統
命令來讀取core版磁帶。如果你的機器預設tar 為讀取1600 BPI的磁帶,則你
鍵入的指令將類似:

        % mkdir /usr/local/scr/X
        % cd    /usr/local/scr/X
        % tar x

必要時可向你的系統管理者取得協助。


B.2.4 使用符號連結(Symbolic Link)

    本發行版在處理使用連結(Symbolic由機器所支援)避免檔案重覆(大多
的header file ),如果你在未提供建構檔案情況下建立本發行版,你必須在
適當的util/imake.includes/*.macros檔案檢查LN建構參數。如果你的作業系
統不提供軟體連結,LN需被設定為建立硬體連結(hard link) 或拷貝原始檔。

    如果你需要在建立後將本發行版移動到其它的機器,用tar 替代CP或rcp
以保留日期和連結,通常可用下列的命令達成:

        % (chdir/usr/local/src/X;tar cf - .) | \
          rsh othermachine "(chdir/moredisk/X; tar xpBf -)"

    可向你的系統管理者獲得協助。


B.2.5 建構本發行版

    這個發行版廣氾使用 imake 公用程式, 它可從機器相關的 (machine-
independent)Imakefiles 產生機器特有的 (machine-specific) Makefiles.
另一個叫做 makedepend 的公用程式,  是用於產生C語言檔案的 Makefile 相
關性 (dependencies). 假如你不在乎可攜性 (portability), 雖然我們強烈地
鼓勵你去使用imake 與 makedepend, 但是仍提供有樣本 makefiles.

    imake 的建構檔被置於 util/imake.includes 目錄. makefiles 是由一個
稱做imake.tmpl 的模板 (template)檔、一個機器特有的 .macros 檔與一個
site 特有的 site.def 檔所產生. 只有極少例外, 建構參數為 cpp 符號, 它可
以被定義於一個 per-server 基礎上或在一個給定 site 裡的所有 server.  模
板檔案不應該被修改.

    util/imale.includes/README 檔案每一個建構參數以及它可以設定的值.
預設值的選擇是考量可適用於多種機器且易於維護. site 特有的建構應在
sit.def 檔案內使用下列語法描述 :

        #ifndef BuildParameter
        #define BuildParameter site-specific-value
        #endif


B.2.6 編譯本發行版

    建構參數設定後, 你應該可以在構造樹 (build tree) 的最上層利用下列
命令以編譯core 軟體 :

        % make World > &make.world &

    若在建立過程, 將 make.log 這個特殊檔案刪除, 則請不要將輸出重導
(redirect) 到make.log。依照使用機器的不同, 這個步驟將花費 2 - 12 小
時, 且在大多數的機器上皆能順利完成。

    在所有 Makefiles 與相關性都建好之後, 你必須重新啟動以便使你的構
造 (build) 發生作用, 請在構造樹的最上層輸入下列命令:

        %make -k > &make.out &

假如你以後決定改變任何建構參數, 你將需要作另一個完整的 make World.


B.2.7 安裝發行版

    假如每一個編譯皆成功, 你可以輸入下列命令, 從建造樹最上層安裝軟體:

        # make install

    假如你不想安裝在根目錄, 你必須建一些可寫入的目錄並從你的帳號
(account) 安裝它們, 然後檢查在 BINDIR 目錄 (通常是 /USR/BIN/X11) 內
的 xterm 與 xload 的所有權(ownership) 與保護模式 (protection). xterm
必須安裝 setuid 至根目錄以便它能設定虛擬終端機與更新/etc/utmp. xload
需被 setuid 至根目錄, 或 setgid 至擁有檔案 /dev/kmem 的目錄以使它們
可以取得系統的平均負載.

    假如你的 /etc/termcap 與 /user/lib/terminfo 資料庫沒有 xterm 的
入口 (entry),可參考在 client/xterm 目錄內的樣本入口. System V 的使用
者將需要用 tic公用程式編譯 terminfo 入口.

    假如你計劃使用 xinit 程式去執行X, 你可能會想產生一個將指名的X
指到適當server 程式的連結 (link) (通常的名稱像 /usr/bin/x11/ 目錄裡
的 Xmachine). 然而,xinit 不打算給初學者使用; 取而代之, site 管理者被
期望能使用 xdm 或提供友善的使用介面.

    假如你想安裝指南頁, 請檢查在 util/imake.includes/ 裡的
MamDirectoryRoot、ManDir 與 LibManDir 三個建構參數, 並在構造樹的最上
層輸入:

        # make install.man

    假如你喜歡建立與安裝 lint 程式庫, 在構造樹的最上層輸入下列命令:

        # make install.ln

    最後, 確定所有使用者在它們的 PATH 環境變數都有 BINDIR (通常是
/usr/bin/x11/).


B.2.8 kernel 與特殊檔案的注意事項

    在某些機器上, 如果有一個新的裝置驅動器則必須重建 kernel 或至少經
過重新建構, 假如你以前從未執行X且使用一個沒有列在這些注意事項內的系
統, 你可能需要確定在你的 kernel 建構檔案裡的 csr位址能與你的硬體相匹
配. 另外, 你應該確定在系統啟動時 kernel 會自動建構顯示器.

    你可能需要為你的顯示器、滑鼠或鍵盤建立特殊的裝置. 例如:

        # /etc/mknod/dev/bell c 12 2     # for bell on Sun
        # MAKEDEV displays               # for displays on the RT/PC

    在顯示器裝置檔上的保護模式應該被設定成只有 server 可以開啟它. 假
如 server是以 /etc/init啟動, 這個保護可以被根讀/寫, 任何其他的人不能
存取.

    在一個 Digital QVSS (VAXstation II) 上, 你應該使用 adb 去確定
kernel 變數qv-def-scrn 被設定為 2, 以便使用 VR-260 監視器的整個寬度.
這可以藉著直接地改變/vmunix 或 /sys/vaxuba/qv.o 並重新連結與安裝
kernel 來達成. 你將需要 reboot 使新值發生作用.

    更詳細的資料請看 Server/ddx/ 目錄裡對應的 README 檔與指南頁.


B.2.9 測試本發行版

    即使你計劃在所有時間都使用 xdm 執行X, 你也應該要從另一個終端機執
行它, 以便檢查每個你所安裝部份的是否已被安裝且正常工作.

    來自 server 的錯誤訊息將會顯示在你的終端機, 而不是被寫到
xdm-errors 或/usr/adm/X?msgs ('?' 是顯示器的號碼).

    測試 server 最簡單的方法是先進入 /usr/bin/x11 (或任何你已安裝 X
程式的地方)然後執行 xinit, 如下:

        % cd/usr/bin/X11
        % xinit

    你應該可以看到一個灰色的帶狀圖樣覆蓋螢幕、一個形狀像 "X" 的游標追
蹤著指標以及一個終端機模擬視窗. 否則請按下列方式檢查 :

1. 假如沒有顯示出灰色螢幕背景, 檢查是否有在 server/ddx/ 子目錄內的
   README 裡描述的任何特殊裝置檔案的許可 (通常是儲存在 /dev/).

2. 假如背景出現, 但游標仍是白色方形. 請確定字型是否已安裝 (特別是
   usr/lib/X11/fonts/misc/ 裡的字型 cursor.snf; 見建構參數
   DefaultFontPath). 並確定在你的每一個字型目錄都有一個檔案叫做font.dir.
   這個檔案是由 mkfontdir 程式產生的, 被 server 用於找出一個目錄裡的字型.

3. 假如游標出現但不追蹤指標, 請確定任何特定裝置檔案 (它的名稱像
   /dev/mouse) 已被安裝 (見 server 的 README 檔).

4. 假如 SERVER 啟動且不久之後變成黑色, 表示啟始的 client (xterm 或
   xdm) 當掉了.請確定 xterm 安裝於根目錄並建立足夠的虛擬終端機. 假
   如你正執行 xinit, 且在你的home 目錄一個有叫做 .xinitrc 的檔案,
   確定它是可執行的而且上一個它所啟動的程式在前景執行 (亦即命令列尾
   端沒有一個 & 符號). 否則, .xinitrc 將立刻完成, 這也是 xinit 所
   假設的以及你所想要的. 只要你有正確工作的初始視窗, 試著從 xterm 執
   行其他的程式. 若想用 uwm 視窗管理器定位一個新視窗, 可在閃動的方框
   出現時按下按鈕 1 (通常在指標器的最左邊按鈕) :

        % xlock -g 200x200-0+0 &
        % uwm &
        % xlogo &
        % xeyes &
        ...

    X現在可以被使用了, 研讀一個新程式的指南頁, 看看新字型, 你會從中
得到樂趣.


B.2.10 建立額外的虛擬終端機

    因為每個 xterm 需要一個不同的虛擬終端機, 所以你應該建很多給它們
(在一個小型多使用者系統你可能至少要 32 個). 每個 ptr 有兩個裝置, 一
個主控 (master) 與一個從屬(slave), 它們通常叫做 /dev/tty/[pqrstu][0-f]
與 /dev/pty[pqrstu][0-f]. 假如你沒有最少的 "p" 與 "q" 列建構, 你應該
要求你的系統管理者加上它們. 這通常是以 /dev裡執行的 MAKEDEV script來
完成:

        # cd/dev
        # ./MAKEDEV pty0
        # ./MAKEDEV pty1


B.2.11 從 /etc/rc 啟動X

    本發行版提供一個可以從系統啟動檔 /etc/rc 執行X server 的新公用
程式叫做 xdm,它提供一個不同於從 /etc/init 執行X 的可攜式與吸引人的
方式. 設計時考慮到可以很容易地裁剪以應不同工作站的需求, xdm 小心地
保持 server 的執行, 提示輸入使用者名字與密碼並管理使用者的session.
樣本建構目前使用 shell script, 以提供相當簡單的環境. 這也將是未來發
行版繼續研究的地方.

    xdm 彈性的關鍵是它廣泛使用resource, 允許 site 管理者快速與容易地
測試不同的設定(setup). 當 xdm 啟動, 它讀入一個建構檔 (預設是
/usr/lib/X11/xdm/xdm-config 但可以用命令列旗標指定-config) 列出不同的
資料檔、預設參數以及啟動與關機時會被執行的程式. 因為它使用標準的
Toolkit resource檔案格式, 任何可以在 xdm-config 檔設定的參數也可以在命
令列使用 -xrm 選項指定.

    預設建構包含下面所列:

        DisplayManager.servers:         /use/lib/X11/Xservers
        DisplayManager.errorLogFile:    /use/lib/X11/Xdm-errors
        DisplayManager*resources:       /use/lib/X11/Xresources
        DisplayManager*startup:         /use/lib/X11/Xstartup
        DisplayManager*session:         /use/lib/X11/Xsession
        DisplayManager*reset:           /use/lib/X11/Xreset

    server 檔包含要啟動的 server 列表. errorLogFile 是 xdm 輸出被重
導的檔案.resources 檔包含 xdm Login 視窗預設的resource. 特別的地方是
特殊鍵的順序可以被指定 (在 xlogin*login.translation resource), startup
檔應該是一個程式或可執行的 script, 它可以在使用者打入合理的密碼之後執行
 它是一個作 site 特有的初始化, logging 等的圈套 (hook). session 入口是
用於啟動使用環境的一個 session 管理程式或可執行script 的名稱. 假如使用者
在他的 home 目錄內沒有一個可執行的 .xsession 檔, 有一個簡單的版本可提
供一個簡單的 xterm 視窗與 uwm 視窗管理器. 最後, 在使用者 logout之後一
個 reset 程式或可執行的 script 會被執行. 使用預設建構執行 xdm, 加入下列
一行到你的 boot 檔 (通常叫做 /etc/rc 或 /etc/rc.local) :

        /usr/bin/X11/xdm &

毫無疑問地, 大多數的 site 想建立它們自己的建構. 我們建議你們將 site
特有的xdm-config 檔與其它的 xdm 檔放在不同的目錄, 這樣才不會被某些作
了一個 makeinstall 的人蓋掉. 假如你將檔案儲存在 /usr/local/lib/xdm,
下面的命令可用於以啟動xdm :

     /usr/bin/X11/xdm -config /usr/local/lib/xdm-config &

    許多 server 在假設它們是嘗試讀取鍵盤的唯一程式下, 將鍵盤設定成非
阻斷式 I/O(non-blocking I/O). 不幸地, 某些 /etc/getty 的版本 (特別是
A/UX) 將立刻看到一個零長度讀取的連續 stream, 因為將它解釋成 EOF 檔尾
指示. 最後 /etc/init 將取消login, 一直到某人打入下列命令:

        # kill -HUP 1

在 A/UX 下, 一個變通的方法是禁止從控制台 login 且從 /etc/inittab 去
執行 xdm.然而, 請確定你存有一個舊的 /etc/inittab 拷貝以備你在出錯狀
況以及你必須從網路上或單使用者模式恢復 login 的時候使用.

    另一個較少為人徹底研究的是如何設定一個帳號 (account), 它的 shell
是在client/xdm/裡的 xdmshell 程式. 預設狀況下這個程式不會被安裝, 所以
site 管理者需要特別查看它是否符合需求. xdmshell 公用程式確定它執行於
適當的終端機型式、啟動 xdm、等待它完成與重置控制台 (如果需要的話).假
如 xdm resource檔包含一個終止-顯示器 (abort-display) 動作的繫結, 就像
下列命令 :

        xlogin*login.translations: #override Ctrl<Key>R: abort-display()

然後在 xdm login 視窗按下指定鍵 (上例是 <Ctrl-R>) 控制台即可以被恢復.

    xdmshell 程式通常安裝在根目錄, 但僅能被特殊群體的一份子執行, 如
此以 xdmshell作為 shell 的帳號 (account) 的人是唯一的一份子:

        % grep xdm  /etc/passwd
        X:aB9i7vhDVa82z:101:51:Acount for starting up X: (contd.)
        /tmp:/etc/xdmshell
        % grep 51 /etc/group
        xdmgrp:*:51:
        % ls -g /etc/xdmshell
        -rws--x--- 1 root xdmgrp 20338 Nov 1 01:32 /etc/xdmshell

    假如 xdm resource不曾有一個鍵繫結至 abort-display() 動作的建構,
一般使用者將沒有方法可直接 login 到控制台. 至於是否需要則視個別的
site 而定.


B.2.12 支援老舊系統 -- 從 /etc/init 啟動X

警告 : 下面所提供的適合較老的系統且在未來的發行版將不提供.

    Ultrix 與 4.3bsd 使用 /etc/ttys 建構檔的一個新的擴充格式, 它允許
你指定一個視窗系統與初始時被執行的程式. 雖然一般人比較喜歡使用 xdm,
但系統仍然提供可在 xterm裡啟動X與一個從 /etc/ttys 初始的 xterm 視窗.

建立 ttyv 終端機

    因為大多數的 /etc/init 版本需要給每個 /etc/ttys 的入口一個真實終
端列, 所以你必須給每一個顯示器指定一個虛擬終端機. 雖然正常狀態下xterm
動態地配置一個 pty, 但是 -L 選項可以強迫它使用從 /etc/init 傳過來的虛
擬終端機.

    依照協議, 具有最高的 "小裝置 (minor device) 號碼" 被改名成
[pt]tyv0, 次高的被改為 [pt]tyv1, 依此類推. 最高的被改為最低的, 可使
他們不以正常從低至高的搜尋方法 (大多數程式配置一個 pty 的方法) 取得
 在僅有 "p" 與 "q" 的小系統, 下面的命令可用以將兩個顯示器設定成"v"
終端機.

     # cd /dev
     # mv ttyqf ttyv0; mv ptyqf ptyv0
     # mv ttyqe ttyv1; mv ptyqf ptyv1

見你的系統管理者可以獲得幫助.

增加視窗進入口到 /etc/ttys

    只要你已經改變虛擬終端機的名稱, 你就能為它們在 /etc/ttys 增加入口
 再次提醒這個僅對具有以新的 4.3bsd 格式啟動視窗系統的系統, 不能用在
使用 4.2bsd 小進入口格式與 /etc/ttytype 的較老系統上. 假如你的系統沒
有新的格式, 將 ttyv 的與 ptyv 的改為原名並跳到下一部分.

    xserver 指南頁裡包含關於設定 /etc/ttys 進入口的更詳細敘述. 通常
, ttyv 被置於檔案的底部且類似下列:

        ttyv0"/usr/bin/X11/xterm -L -grometry 80x24+0+0 -display :0" (contd.)
        xterm off window="/usr/bin/X11/X :0"

    注意, 它不像 X10, 給 X server 命令的 server 號碼之引數必須在前面
置一個冒號. 額外的命令列選項可以在 xterm 命令列或X命令列指定. 然而,
許多 init 的版本具有相當小的程式名稱緩衝區, 限制了入口的長度. 也有某
些版本不允許在入口裡有 pound記號, 意謂著不能給任意數目的顏色指定, 這
也是為什麼會寫 xdm 的原因.

    只要你曾經增加或改變任何入口, 你必須送信號給 init, 告訴它重讀 /etc/ttys
與重新啟動. 在根目錄下打入下列命令即可以達到這個目的:

        # kill -HUP 1

這將會中止在重新啟動前任何改變列上的任何存在的處理 (process), 所以它
應該僅能由系統管理者去執行.

=====

附錄C  本發行版的內容 -- MIT Core Distribution

    本文件是從 MIT 發行版內的原始資料再製作而來的.

    本發行版含有大約 100 Mbytes 的原始碼與文件. 因為沒有人會對它的全
部內容都感興趣, 所以本發行版被分為大致相等的三個部分: Core 軟體(核心
軟體)、不同使用者貢獻的工具集和使用者貢獻的其他軟體.

C.1 核心版

    這核心版, 包含大約 30 Mbytes 由X協會成員所支援的軟體, 它是由下
面所列的目錄所架構起來的. 假如你發現該版中某個部分有錯誤 (bug), 請填
妥位於doc/bugs/bug-report 的表格, 並郵遞至 xbugs@expo.lcs.mit.edu.

  ./ 包含重要通知、一般的X指南頁與所有構成該發行版子目錄的最上層目錄.

  X11/ 所有公用的引頭檔 (header file) 不是儲存於此就是在建立系統的各
      階段時被連結. 本目錄與其下的位元圖像 (bitmaps) 在安裝階段被拷
      貝至 incdir架構參考所指定的目錄 (預設為 /usr/include/x11).  注
      意最後的目錄名稱應該是 X11, 否則所有X程式在編譯時將會出錯.

  X11/Bitmaps/ 本目錄內包含一些以 Bitmaps 格式儲存 (可用 Xlib 的常式
      XReadBitmapFile, XmuReadBitmapDataFromFile 與 XWrite BitmapFile
      處理者) 的一些單平面影像. 在 C 程式中它們通常被以 #include 引入
      且使用 xsetroot 公用程式被當作背景磁磚 (background tiles) ,而且
      X工具集 (toolkit) 允許使用者指定目錄內的檔名作為游標與表徵圖.
      詳細資訊請參考 bitmap 的指南頁與util/bm-convert/bm-convert.doc.

  clients/ 本目錄是使用者程式來源樹 (source tree) 的最上層. 其他一些
      程式則存於 domos/ 與 examples/ 樹,原因為它們只是為了示範目的而
      已. 其他一些非常有用的使用者貢獻程式可在 coutrib/clients/ 下找
      到.

  clients/bitmap/ 本目錄包含建立與修改單平面位元映成影像 (就像儲存於
      X11/bitmaps/ 的一樣) 的編輯器. 可用於定義雙色磁磚 (為了用stipple
      填滿區域) 與遮罩 (為剪除與指定游標影像). 所有resource皆可以
      用命令列與預設方式指定. 兩個新的程式bmtoa 與 atoma 已經被加入,
      它們用於轉換位元影像檔案成為簡單的字串及簡單字串轉換成映像檔案.

  clients/uwm/ 本目錄包含一個較老的X視窗管理器. 一些錯誤已更正且增加
      了一些新功能.

  clients/x10tox11/ 本目錄包含一個重寫過的 X10 至 X11 的通訊協定轉譯
      器. 它充當X10 Server, 轉換 X10 的 request 為 X11 的 request 以
      及 X11 的 event 為 X10 event. X10toX11 程式允許 X10 程式不經修
      改即可在 X11 server 上執行, 使得從 X10 轉換成 X11 非常容易, 新
      版本實質上會比舊版本有更快更精確的結果.

  clients/xbiff/ 本目錄包含一個簡單的小程式, 它會在你有新郵件送達時,
      在郵箱上顯示一個豎起的旗幟, 它使用 athena widget set 裡的 Mailbox
      (郵箱) Widget.

  clients/xcale/ 本目錄內包含一個可以模擬 TI-30、HP-10 與計算尺的桌上
      型計算器程式. 這個程式需要被重新改寫.

  clients/xcliphoard/ 本目錄內包含兩個程式用以處理段落. xclipboard 搜
      集來自其他 client (見 xterm 與 Athena Text widget) 的文字將它們
      送至 CLIP-BOARD, xcutsel 提供介於只能處理剪一緩衝區的舊 client
      與使用段落的新 client 之間的橋樑.

  clients/xclock/ 本目錄內含有一個可顯示時鐘的簡單小程式. 它可以顯示
      指針或數字型時間, 它使用 Athena Widget Set 裡的 Clock Widget.

  clients/xdm/ 本目錄內包含新的顯示管理器 (Display Mamager). 它企圖取
      代 xterm-L與大多數使用 xinit 的場合. 位置管理者應該研讀文件與樣
      本架構以裁剪 xdm 配合它們的特殊環境. 一些樣本架構提供於 config
      子目錄下面.

  clients/xdpyinfo/ 本目錄包含一個可以列印有關顯示器的視覺影像與
      螢幕的資訊的公用程式.

  clients/xedit/ 本目錄包含一個建立於 Athena Text widget 與 X Toolkit
      之上的文字編輯器.

  clients/xev/ 本目錄包含一個可以檢查 event 內容以及它們如何產生的程式.

  clients/xfd/ 本目錄包含一個可顯示指定字型的字元之公用程式.

  clients/xhost/ 本目錄包含一個以主機為基礎 (host-basis) 控制存取主機
      顯示器的公用程式.

  clients/xinit/ 本目錄包含一個可以在無法從 /etc/init 啟動一個X server
      與初始化一個 client 的系統上, 啟動X server 與初始化 client (通
      常是一個終端機模擬器) 的公用程式.

  clients/xkill/ 本目錄包含一個公用程式可除去不要的視窗.

  clients/xload/ 本目錄包含一個可監視機器平均負載狀況的程式. 它可以顯
      示最近一段期間平均負載的柱狀圖, 通常用於監視網路上的機器. 它使
      用 Athena widget set 裡的 Load widget, 假如你將X轉移至一個新
      的作業系統時, 它須要作些修改.

  clients/xlogo/ 本目錄包含一個使用 Athena widget set 裡的 Logo widget
      顯示 X視窗系統語標 (Logo) 的程式.

  clients/xlsfonts/ 本目錄包含一個可以列印目前 server 可供使用的字型
      之公用程式.假如你要求從具有許多壓縮字型的 server 作較長的列印,
      你的顯示可能會暫停一段較長的時間.

  clients/xlswins/ 本目錄包含一個可列印出顯示器上的視窗的公用程式.
      在找出一個因某種原因而忽然在螢幕上消失之視窗時非常有用.

  clients/xmag/ 本目錄包含一個當你在偵錯圖形時, 可以放大部分顯示的公
      用程式. 如果螢幕上同時有超過一種型式的視像, 可能無法達成目的.

  clients/xman/ 本目錄包含一個可以顯示指南頁的公用程式. 加上少量的修
      改可以模擬本地作業系統的 man 程式.

  clients/xmh/ 本目錄包含一個與 MH 郵件處理系統的視像介面. 它擴展X
      Toolkit 與Athena widget set 的使用.

  clients/xmodmap/ 本目錄包含一個可以顯示更改的鍵盤、修正器或指標圖
      . 它會讀取一個包含命令的 script 檔且通常在你登錄或第一次啟動X
      時執行.

  clients/xpr/ 本目錄包含一個可列印由 xwd 所獲得的螢幕傾印影像的公用
      程式.

  clients/xprop/ 本目錄包含一個可檢查一個特定視窗特性的公用程式.

  clients/xpseudoroot/ 本目錄包含一個在 Inter-Client 通訊慣例手冊
      (ICCCM) 的前一版本所描述的原型程式. 它只供實驗用且承諾在最終的
      ICCCM 規格被發展時予以修正.

  clients/xrdb/ 本目錄包含一個可載入使用者指定的預設resource定義給
      server 的公用程式, 它通常是在 login 或第一次啟動 X 時被執行.

  clients/xrefresh/ 本目錄包含一個可刷新全部螢幕的一個簡便公用程式.

  clients/xset/ 本目錄包含一個可設定按鍵聲音、指標加速度等個人喜好特
      性之公用程式.它現在提供從字型路徑增加與刪除進入點的功能.

  clients/xsetroot/ 本目錄包含一個可設定根視窗背景的公用程式.

  clients/xterm/ 本目錄包含一個 VT102 與 Tektronix 4014 終端機模擬器
      程式. 先前版本的許許多多錯誤都已修正. VT102 模式現在可以使用X
      Toolkit 轉換管理器(使任意重繫結按鍵成為可能)、選擇區 (selection)
      (見 xclipboard 與 xcutsel)與正確地設定它的處理群 (process group).

  clients/xwd/ 本目錄包含一個可以傾印視窗影像的公用程式. 它通常是將
      一個視窗快拍以便列印或稍後使用 xwud 程式顯示, 對某些使用 XY 格
      式影像的 server 仍有問題, 且執行時大都相當慢.

  clients/xwininfo/ 本目錄包含一個可以檢查各種不同的視窗屬性 (像大小
      、位置、視窗管理器資訊等) 的公用程式. 它常與 xprop 合用, 用以
      檢查視窗的階層架構.

  clients/xwud/ 本目錄包含一個可以顯示先前用 xwd 建立的影像之公用程式.

  demos/ 本目錄包含許多看來非常有趣, 但不常用的程式.

  demos/ico/ 本目錄包含一個可以讓一個多邊型物體繞著螢幕滾動的精巧程式.

  demos/maze/ 本目錄包含一個相當吸引人的解迷宮示範程式.

  demos/muncher, demos/plaid/ 目錄包含一個可以畫可愛圖畫的程式.

  demos/puzzle/ 本目錄包含一個為 X11 設計的 "重排磁磚" 的益智遊戲. 假
      如你有彩色顯示器, 試著在它建立時的目錄執行 puzzle -picture mandrill.cm.

  demos/xeyes/ 本目錄包含一個在 SIGGRAPH'88 看到的一個 NEWs demo 所
      啟發出的吸引人的程式.

  doc/ 本目錄包含描述標準版本的所有文件. 不同 client 的指南頁可以在
      個別的原始程式目錄裡找到.

  doc/HelloWorld/ 本目錄包含 DavidRosenthal's USENIX'88 Hello, World
      關於使用toolkit 的文章.

  doc/Protocol/ 本目錄包含X通訊協定的正式公認規格, 裡面說明了甚麼是
      與甚麼不是X的通訊協定部分以及那一部分是X標準的最後根據.

  doc/Server/ 本目錄包含將XServer 植入新工作台的許多指南.

  doc/Xaw/ 本目錄包含對 Athena Widget Set 的一個指南.

  doc/Xlib/ 本目錄包含 Xlib 程式規劃指南與指南頁的原始資料. 其中有一
      個未測試過的命令列程序叫做 doc/Xlib/Xman/ expand.names, 它會將
      指南頁更改名稱使其與它所描述的常式 (routines) 名稱匹配.

  doc/Xt/ 本目錄包含X Toolkit Intrinsics 的規格說明. Inrinsics 現在
      已經是X標準的一部分; 任何供應 Xlib 的供應商也大都會供應 Xt.

  doc/bdf/ 本目錄包含一個描述字型的位元映像分佈格式 (Bitmap
      Distribution Format). BDF 已是 X 標準的一部分; 所有的 server 供
      應商也大都會提供一個程式, 可以轉換該格式至任何他們所喜歡的內部
      格式.

  doc/bugs/ 本目錄包含一個可提供錯誤報告的模板(見 doc/bugs/bug-report).
      當使用xbug@expo.lcs.mit.edu 報告錯誤時時請使用這個格式.

  doc/extensions/ 本目錄包含 core 通訊協定基礎程式庫可能擴充的文件.
      它目前包含已提出的 PEX 3D 圖形擴充與一個輸入綜合 (INPUT
      SYNTHESIS) 擴充.

  doc/fontnames/ 本目錄包含一個經過X協會評估的字型命名草案的規格.
      這是對 AdobeSystem Inc.、Digital Equipment Corporation 與
      Bitstream Inc. 所贈送的字型命名時所使用的格式.

  doc/releasnotes/ 本目錄內包含目前你看的這份文件的原始資料.

  doc/tutorials/ 本目錄內包含評論如何使用X視窗系統的特別麻煩的部分.
      且歡迎使用者多提供.

  examples/ 本目錄內包含不屬於任何其他地方的不同例子.

  examples/CLX 本目錄內包含如何使用 CLX (Common Lisp X) 介面的一些樣
      本例子.

  examples/Xaw 本目錄內包含可以測出不同 Athena widget 的一些小程式.

  extensions/ 本目錄樹內包含一些 SERVER 擴充樣本的原始碼: 一個繪出
      request(bezier) 的雲形規、一個在X裡使用生動視像的程式集 (
      plxvideo)、為了作輸入記錄與綜合的一個擴充的開始 (xtest) 與一
      個梯形繪出要求 (zoid).

  extensions/include/ 本目錄包含擴充樣本的標頭檔.

  extensions/lib/ 本目錄包含 client 程式庫常式用以和擴充程式集通訊.

  extensions/server/ 本目錄包含用以撰寫擴充功能 server 的常式.

  extensions/test/ 本目錄包含一些用以測試擴充功能的範例.

  fonts/ 本目錄樹內包含可以給不同的公用程式產生與處理字型檔的原始資料
      . 使用者貢獻的版本有一個不同的轉換器用以轉換不同格式的字型成為
      BDF 格式.

  fonts/bdf/ 本目錄內包含經過仔細選擇的字型之原始資料. 從這個發行版開
      始, 給定字型名稱的長度與具有別名與通用字型名稱的能力, 對組織字
      型到目錄是相當重要的. 就像 BDF 格式現在已是X標準的部分, 所有
      server 的供應商被期待提供可以轉換 BDF 檔成他們的 server 可以接
      受的適當包裝字型格式的編譯器. 預設狀況是 sample server 將具有
      在這裡介紹的所有三個字型目錄. 假如主顯示器的解析度小於每英吋
      88 點, 75 dpi 字型將較 100 dpi 字型在路徑上優先. 否則 100 dpi
      字型出現在字型路徑的最前面.

  fonts/dbf/misc/ 本目錄包含前一發行版本的游標與固定寬度字型.

  fonts/bdf/75bpi/ 本目錄內包含由 Adobe System Inc. 與 DEC 以及
      Bitstream, inc.為每英吋 75 點的監視器所設計提供的字型. 這些字
      型遵照新的字型命名慣例; 多數使用者將想要去學習如何適當地使用通
      用字元 (wildcard).

  fonts/bdf/100bpi/ 本目錄內包含為每英吋 100 點的監視器所設計的 75
      dpi 字型版本.某些家族在這種解析度下無法及時備妥.

  fonts/bdftosnf/ 本目錄內包含用以編譯 BDF 格式的字型成為由 sample
      server 所使用的已被壓縮的 Server Natural Format 的格式.

  fonts/mkfontdir/ 本目錄內包含在建立字型資料庫時 server 用以映成字
      型名稱至對應檔案的新公用程式. 無論何時字型被增加或移出目錄, 這
      個程式必須在該目錄內執行以便重建資料庫.

  lib/ 本目錄包含標準版本內所有主要的程式庫.

  lib/CLX/ 本目錄包含 CLX common Lisp X程式集. 這是一個本國的 Common
      Lisp 與X通訊協定的介面 (也就是說,它不使用 Xlib), 它將會被X
      協會審核, 因為考慮它將納入X標準中.

  lib/X/ 本目錄內包含 Xlib C 語言程式的程式庫. 這個程式集所提供的介
      面是X標準的一部分 (亦即任何供應商提供任何 C 介面為了叫用它的
      產品X也必須提供 Xlib).供應商可以自由的去改變它的內部, 但介面
      必須保持相同. 自從上一個發行版發行以來一些新的常式已被加入以提
      供存取不透明的資料結構元素.

  lib/X/sysV/ 本目錄內包含一個使 Xlib 可工作於 System V-based 機
      器的常式.

  lib/X/mips/ 本目錄內包含一個使 Xlib 可工作於由 Mips Computer
      System 製造的工作台的常式.

  lib/Xaw/ 本目錄內包含 Athena widget set. 它是一個逐漸搜集使用者介
      面實體的開始,建於 X Toolkit Intrinsics 的頂端. Widget 是用於建
      立高階應用 (higher level), 且理想地應該儘可能地提供較多的機構
      與較少的政策. (使用者介面工具集、使用者介面管理系統與從應用至
      撰寫). 一個由 HP 發展的較完整集合可以在使用者貢獻版本中找到,
      (不幸的, 它還無法植入 R3 標準的 X Toolkit Intrinsics).

  lib/Xmu/ 本目錄內包含一個搜集有支援 MIT 應用的雜項常式. 它不是X
      標準的一部分; 供應商可以不提供這個程式庫. Xmu 使用外面介面連
      結所有程式庫且可被植入不同的系統. 它目前被部分 Athena widget
      set 與不同的 client 所使用.  lib/Xt/ 本目錄內包含一個 X
      Toolkit Intrinsics 撰寫樣品、一個resource、事件與物件的管理器
      , 此管理器機制用以建立使用者介面物件, 稱為 widgets. Intrinsics
      已被發展成為X標準的一部分. 任何供應 Xlib 的供應商也被期望能提
      供 Xt.  lib/oldX/ 本目錄內包含 X11 重新改寫的 X10 Xdraw 與
      Assoc Table.

  rgb/ 本目錄包含一個 RGB 彩色資料庫樣品與一個編譯它的程式. 一個好的
      資料庫是非常有需要的, 但是還沒一個有人志願去做. 灰度階與一些新
      色彩已被加入.

  server/ 本目錄包含一個 Core 通訊協定的 sample Server. 它應該與 X
      Protocol Specification 相當匹配, 但規格是最後的根據. 在試圖做
      任何改變之前請讀取在dos/Server 目錄內的文件與任何在 Server/ddx
      目錄內的 README 檔案, 並認真地研究它的碼.

  server/ddx/ 本目錄包含一些不同工作台的設備相關程式庫. 在建立或安裝
      任何 Server之前請研究每個 README 檔案.

  server/ddx/apollo/ 本目錄包含一些建立一個 server 的完整原始程式,
      它們須在單色與彩色 Apollo 顯示器上執行, README 檔內建立有這種
      Server 的提示與必要條件.

  server/ddx/cfb/ 本目錄包含一個非現場獲取色彩Ports的色彩架構緩衝器
      (color frame buffer)函數館之範例。在 server執行之後,它被用來
      在所有可用之硬體支援選擇最佳之使用。

  server/ddx/dec/ 本目錄包含在 VAXstation II、2000 及 300 系列的單色
      (qvss) 與彩色 (qdss) 顯示器上建立 server 的完整原始碼. 它也包
      含控制與解譯 LK201鍵盤的常式.

  server/ddx/hp/ 本目錄包含一個建立可執行於 HP 9000/300 系列,具有
      Topcat 顯示器的 server 之完整原始碼.

  server/ddx/ibm/ 本目錄包含一個建立可執行於 IBM AOS (不是 AIX) 下的
      APA16 與Magaple 顯示器的 server 之完整原始碼.

  server/ddx/macII/ 本目錄包含一個建立可執行於 A/UX 下的 Apple
      Macintosh II 的Server 之原始碼.

  server/ddx/mfb/ 本目錄包含一個單色架構緩衝顯示器的可攜式驅動器. 它
      的主要目的是為了沒有特殊圖形硬體的工作台作為一個初始植入基礎.
      假如硬體可以支援,它也可以用在任何可能的地方.

  server/ddx/mi/ 本目錄包含與機器無關的不同圖形操作的程式. 在將 server
      植入新工作台與處理在記憶体裡的 (in-memory) 影片影像 (pixmap) 時
      通常與 mfb 以及 cfb程式庫合用.

  server/ddx/ndx/ 本目錄包含建立一個不具有輸入或輸出裝置的 server 的
      原始碼. 它使用一般性的單色與彩色框架緩衝碼, 使得它對於測試 server
      與機器無關的部分很有用.

  server/ddx/plx/ 本目錄包含在 Sun 或 VAX 的 parallax 視訊圖形控制器
      上建立一個server 的原始程式. 它也使用到在 extensions/server/
      目錄裡的 Parallax VideoExtension.

  server/ddx/snf/ 本目錄包含處理 SNF 字型的常式. 大多數的 server 使
      用不方便的SNF, 但它們並沒有需要如此作.

  server/ddx/sun/ 本目錄包含一個建立可執行於 Sun bw2 與 cg 顯示器的
      server 的完整原始程式. 它使用 cfb 程式庫取代一些指定設備的常式
      , 也因此在支援分散處理的某些時候較其他彩色 server 慢. 在建立與
      安裝 Sun server 之前請閱讀目錄裡的README 檔.

  server/dix/ 本目錄包含 sample X server 與設備無關的部分. 它強烈地
      建議你不要改變任何碼, 就好像阻礙你更新至新版本一樣. 假如你發現
      問題或建議作一個改變使植入一個新工作台更容易, 請依照附錄E所描
      述的方式發出一個錯誤報告.

  server/include/ 本目錄包含整個 server 所需用到的前置檔.

  server/os/ 本目錄包含 server 與不同作業系統相關的部分.

  server/os/4.2bsd/ 本目錄包含可以使 sample server 執行於支援 4.2bsd
      插座介面的作業系統常式.

  server/os/bsdemul 本目錄包含可模擬一般使用的 BSD 的常式. 它是 System
      V 基礎的server 典型的用法.

  util/ 本目錄包含本發行版建立與建構的不同程式與 script. 當你想將X
      帶上新工作台時, 應該最先將本部分的程式植入.

  util/bm-convert/ 本目錄包含一個可以將 X10 格式的位元影像檔轉換成
      X11 格式的過濾器.

  util/checkfn/ 本目錄包含一個可以檢查不合法檔案名稱的公用程式. 它通
      常在準備發佈之前使用.

  util/compress/ 本目錄包含 BSD 壓縮程式的原始碼.

  util/cpp/ 本目錄包含一個由 Martin Minow's DECUS cpp 所發展的公開領
      域的 C 前置處理器的原始程式. 它提供那些 cpp 無法處理複雜的
      server 或 X Toolkit的系統. A/UX 1.0 的使用者在嘗試建立本發行版
      之前必須建立與安裝它 (參考 ser-ver/ddx/macII/R3setup.sh).

  util/imake/ 本目錄內包含建立系統時大多數重要的公用程式. imake 程式
      用於從機器無關的敘述稱作 Imakefile 的檔案產生適當的機器相關
      Makefile 檔. 它使用 C前置處理器所以記號名稱與巨集函式也可以被
      定義. 它有它自己的手工做的Makefile, 且有一個可決定初始編譯旗標
      的特殊程式. 假如你將本發行版植入新機器, 你可能需要去編輯
      util/imake/ccflags.c 以加入當你的機器在編譯 imake 時所需要的任
      何編譯旗標. Imake 會被自動地建立, 就好像 make World 的一部分.

  util/imake.includes/ 本目錄包含用於產生不同 Makefile 的架構檔.
      README 檔裡有哪些參數能被設定與在那裡設定的描述. server-specific
      值在適當的 macros 檔內給定, 與預設值不同的 site-wide 值在 site.def
      檔給定. Imake.tmpl 不應該被更改. 假如改變任何這些參數, 你將需
      要完全重新建立 (rebuild) 使其能發生作用.假如你正想將 X 植入新
      機器, 必須非常小心地研讀本目錄的檔案.  util/makedepend/ 本目
      錄包含一個可以自動產生 Makefile 的關聯性的程式. 它作用於程式建
      立過程, 在有任何原始程式改變的時候會正確地將應該重新編譯的檔案
      重新編譯. 假如架構參數 CppSourcesPresent 設為 Yes, makedepend
      會有一份 C 前置處理器的拷貝, 以便加快速度. 這不是必要的且本發
      行版也未完成該功能. makedepend 被自動地建立, 作為 "make World"
      階段的一部分.

  util/patch/ 本目錄包含 Larry Wall's patch 程式, 它是一個要將修補差
      異轉換成原始碼時非常有用的程式. 本程式在本發行版不會自動建立;
      它提供無法存取 comp.sources.unix 壓縮檔的人一個簡易與方便性.

  util/scripts/ 本目錄包含不同安裝軟体與產生連結樹等工作的有用說明。

  util/soelim/ 本目錄包含某些系統需要的一個 soelim 程式版本.

=====

附錄D  本發行版的內容 -- 使用者貢獻的軟体

D.1 使用者貢獻的版本

    本文件是從 MIT 發行版內的原始資料再製作而來的. 這個使用者貢獻的
版本包括下列的目錄. 本發行版這個部分的錯誤應該報告給個別的作者而不是
送至 Xbugs.contrib/ 本目錄是使用者貢獻版本的最上層. 這個安排是有意將
它與 core 版本視為平行的地位.

contrib/clients/ 本目錄內包含各種一般性的有用程式.

contrib/clients/alertyorngs/ 本目錄內包含一些可用以告訴或詢問使用者
    不同資訊的突現式對話視窗的公用程式.

contrib/clients/gsh/ 本目錄內包含給初學者使用的圖形 shell.

contrib/clients/hpxpr/ 本目錄內包含一個 xpr 的版本, 它可以在 HP Laserjet
    印表機上列印.

contrib/clients/kterm/ 本目錄內包含一個 xterm 的版本, 它可以使用
    Kanji 字型.

contrib/clients/magic/ 本目錄內包含可用於 magic VLSI 設計系統的 X 驅
    動器.

contrib/clients/pbm/ 本目錄內包含 Jet Poskanzer 的 Portable Bitmap
    Toolkit 與可轉換不同位元影像型式的公用程式.

contrib/clients/splot/ 本目錄內包含一個描繪圖形的程式集.

contrib/clients/spy/ 本目錄內包含另一種放大影像的公用程式.

contrib/clients/texx/ 本目錄內包含一個 DVI 試播的程式 (previewer).

contrib/clients/x11stsrtup/ 本目錄內搜錄有用以提供比普通的 xinit 更
    好的介面的script 與預設建構檔案.

contrib/clients/xbgsun/ 本目錄內包含一個可用以載入一個 Sun raster 影
    像到根視窗背景的公用程式.

contrib/clients/xcalendar/ 本目錄內包含一個可以管理行事曆的程式.

contrib/clients/xdvi/ 本目錄內包含另一個 DVI 試播的程式.

contrib/clients/xdvorak/ 本目錄內包含一個公用程式, 它可採用 Dvorak-style
    連結(binding) 方式將鍵盤重新映射 (remapping).

contrib/clients/xfig/ 本目錄內包含一個繪畫程式集.

contrib/clients/xim/ 本目錄內包含一個可以在 8 plane 顯示器上顯示 8
    與 24 位元影像的程式.

contrib/clients/xipr/ 本目錄內包含一個針對 Imagen printer 的 xpr 程
    式.

contrib/clients/xlock/ 本目錄內包含一個可以對不使用的顯示器上鎖的程
    式.

contrib/clients/xmessage/ 本目錄內包含另一個顯示訊息的程式. 它主要是
    用於顯示X啟動 script 時的錯誤訊息與在其他人的顯示器上留言.

contrib/clients/xmore/ 本目錄內包含一個針對 X 的 more 標頁數的公用程
    式.

contrib/clients/xperfmon/ 本目錄內包含一個搜集與顯示系統統計資料的公
    用程式. 它必須指定作業系統以及不同的的工作台.

contrib/clients/xpic/ 本目錄內包含一個 pic 試播器 (previewer).

contrib/clients/xplaces/ 本目錄內包含一個展開與記錄一個使用者初始交談
    (session)的工具.

contrib/clients/xpref/ 本目錄內包含一個與一些 xset 函式的視像介面.

contrib/clients/xshell/ 本目錄內包含一個可以將命令嵌入單一鍵的古老程
    式.

contrib/clients/xshowcmap/ 本目錄內包含一個可以使 colormap 顯示彩色
    的公用程式.

contrib/clients/xstring/ 本目錄內包含一個可以在另一個使用者的顯示器
    上顯示字串的程式.

contrib/clients/xtools/ 本目錄內包含另一個可以展開一個使用者交談的程
    式.

contrib/clients/xtroff/ 本目錄內包含一個 troff 試播器.

contrib/clients/xwebster/ 本目錄內包含一個 SRINIC webster 字典資料庫.

contrib/demos/ 本目錄內包含一些好玩的示範程式.

contrib/demos/paint/ 本目錄內包含一個非常簡單的畫圖程式.

contrib/demos/psycho/ 本目錄內包含一個 ico 的多重顯示器版本.

contrib/demos/spaceout/ 本目錄內包含另一個可以設定根視窗背景的程式.

contrib/demos/worm/ 本目錄內包含一個可以研究隨機滑行圖樣 (slither
    patterns) 的程式.

contrib/demos/xcolors/ 本目錄內包含一個可以顯示色彩名稱的程式.

contrib/demos/xfish/ 本目錄內包含另一個可以設定根視窗背景的程式.

contrib/demos/xgranite/ 本目錄內包含的仍然是另一個可以設定根視窗背景
    的程式.

contrib/demos/xphoon/ 本目錄內包含一個可以顯示月亮目前相位的可愛程式.

contrib/demos/xrotmap/ 本目錄內包含可以旋轉彩色圖形的一個難纏程式.

contrib/doc/ 本目錄樹內包含附加的文件.

doc/SharedLibs/ 本目錄內包含 AT&T 所提出的如何撰寫主要 C 語言程式庫
    共用版之規格. 它是由 AT&T 提出的並不是X的標準.

contrib/extensions/ 本目錄樹內包含 core 通訊協定的擴充程式集.

contrib/extensions/pex/ 本目錄內包含可以讓 PEX 將 3d 圖形擴充至X的
    現有文件與前置檔.

contrib/fonts/ 本目錄樹內包含編輯以及建立可供取捨的字型之公用程式.

contrib/fonts/bdf/ 本目錄樹內包含一些隨機字型的集合.

contrib/fonts/bdf/bmug/ 本目錄內包含轉換自 Berkeley Mac User Group
    公益軟体壓縮檔的字型.

contrib/fonts/bdf/info-mac/ 本目錄內包含轉換自 INFO-MAC 軟体壓縮檔的
    字型.

contrib/fonts/bdf/oldx10/ 本目錄內包含許多 X10 字型的 BDF 版.

contrib/fonts/bdf/oldx11/ 本目錄內包含發行 X11 之前所給出的字型. 它
    們大多數都很難看.

contrib/fonts/utils/ 本目錄樹內包含一些可以轉換各種不同字型格式為 BDF
    的公用程式,以及可用以分離字型檔使它們可以被編輯的兩版基本的工具
    程式.

contrib/games/ 本目錄樹包含一些有趣的遊戲, 它對於熟悉X是有幫助的.

contrib/games/mazewar/ 本目錄內包含一個光榮的古老迷宮大戰 (mazewar)
    的程式, 它是大多數網路計算機遊戲的鼻祖.

contrib/games/qix/ 本目錄內包含一個與X版 viedo arcade 遊戲同名的視
    訊游戲.

contrib/games/xhanoi/ 本目錄內包含一個可以解漢諾塔 (Tower of Hanoi)
    問題的程式.

contrib/games/xmille/ 本目錄內包含 Milles Bournes 牌戲的一個漂亮的計
    算機版本.

contrib/games/xpuzzle/ 本目錄內包含另一個 puzzle 程式.

contrib/games/xsol/ 本目錄內包含一個 solitaire 牌戲的X版本.

contrib/games/xtrek/ 本目錄內包含惡名昭彰的 xtrek. 它需要 System V
    共用記憶体介面才能工作.

contrib/hacks/ 本目錄樹內包含一些令人懷疑其有用性的程式.

contrib/hacks/arctest/ 本目錄內包含一個可以測試 arcs 的簡單程式.

contrib/hacks/reborder/ 本目錄內包含一個當 anti-social 視窗當掉後可
    用來重新設定視窗邊界的小公用程式.

contrib/hacks/xbounce/ 本目錄內包含一個可以在螢幕上帶著視窗前進的
    (dribbling window) 程式.

contrib/hacks/xchcursor/ 本目錄內包含一個可循環變化不同游標圖樣的程
    式.

contrib/hacks/xsetsize/ 本目錄內包含一個可以由命令列下達移動, 重定大
    小以及表徵圖化視窗的公用程式. 它是一個違反 Inter-Client 通訊慣例
    程式的主要範例且可能無法在大多數的視窗管理器上工作.

contrib/server/ 本目錄內包含未被整合進 sample server 項目的文件與程式
    碼.

contrib/server/sgi/ 本目錄樹內包含修補 sample server 和可以使 R3 server
    在Silicon Graphics 工作站上執行的機器指定的驅動器.

contrib/server/speedups/ 本目錄內包含最佳化樣本 server 的建議方法.
    它所強調的是精確度而不是性能. 它可以使許多地方有實質地改進.

contrib/server/veryoldxpc/ 本目錄內包含過去嘗試將非常早期的 X11 server
植入MS-DOS 下的 IBM PC 的結果. 要使它們有用還需要實質的努力. 這個程
式集將不包含在未來發行的版本, 除非有實質的進展使它可以發表.

contrib/toolkits/ 本目錄樹內包含一些現有的工具集.

contrib/toolkits/InterViews/ 本目錄內包含一個 Standford 大學 InterView
    C++ toolkit 的新版本.

contrib/toolkits/Xr11/ 本目錄內包含一個 HP X-Ray toolkit 的新版本.

contrib/toolkits/andrew/ 本目錄內包含一個 Carnegie-Mellon 大學 Andrew
    toolkit的新版本.

contrib/toolkits/clue/ 本目錄內包含一個 TI 公司的 Common Lisp 使用者
    環境的樣本程式.

contrib/widgets/ 本目錄樹內包含不同的 widget. 某些是立基於 R2 Intrisics
    , 其他則立基於目前的 Intrinsics.

contrib/widgets/Dclock/ 本目錄內包含一個立基於 R2 Intrisics 的數字時
    鐘 widget.

contrib/widgets/Mailwatch/ 本目錄內包含一個立基於 R3 Intrisics 的較
    佳郵箱 widget.

contrib/widgets/MenuBox/ 本目錄內包含一個選單 widget 的原型, 它終將
    變成 Athena widget 集的一部分. 它是立基於 R3 Intrinsics.

contrib/widgets/Xhp/ 本目錄內包含一個 HP 的大型整合性 widget 集以及
    一個 R2 X Toolkit Intrinsics 的版本, 依賴它這些 widget 可暫時被
    立基.

contrib/widgets/Xsw/ 本目錄內包含搜集自 Sony 的 widget, 它也是立基於
    R2 Intrinsics.

contrib/widgets/cpicker/ 本目錄內包含一個立基於 R2 Intrinsics, 用於
    選擇與修改色彩的 widget.

contrib/widgets/tblwidget/ 本目錄內包含一個幾何管理器, 它使用 tbl-style
    格式的命令並立基於 R2 Intrinsics 安排子視窗.

contrib/widgets/widgeteditor/ 本目錄內包含一個立基於 R2 Intrinsics 的簡
    單 widget編輯器.

contrib/widgets/widgetwrap/ 本目錄內包含一個可用於建立 widget 與設定
    他們的引數的公用常式.

contrib/widgets/xpalette/ 本目錄內包含可用於顯立基於 R2 Intrinsics
    彩色的 widget.

contrib/windowmgrs/ 本目錄樹內包含一些較流行的視窗管理器.

contrib/windowmgrs/awm/ 本目錄內包含 awm 視窗管理器.

contrib/windowmgrs/rtl/ 本目錄內包含 rtl tiling 視窗管理器. 

contrib/windowmgrs/twm/ 本目錄內包含 twm 視窗管理器.

contrib/windowmgrs/wm/ 本目錄內包含舊的 wm 視窗管理器. 它主要是因歷
    史的理由而提供的.

=====

附錄E  如何取得X

E.1 在美國

    僅要完整的手冊或手冊與全部 MIT 發行版磁帶兩者都要, 可以從下列地
方取得 :

          MIT Software Center
          Technology Licensing Office
          room E32-300
          77 Massachusetts Avenue
          Cambridge, MA 02139
          USA

E.2 在歐洲

    僅要完整的手冊、或手冊與磁帶、或僅要全部 MIT 發行版磁帶, 可以從
下列地方取得 :

          Unipalm Limited
          147 St. Neots Road
          Hardwick
          Cambridge CB3 7QJ
          England

          Phone:+44 954 211797 international, (0954) 211797 in UK.
          Fax:+44 954 211244 international, (0954) 211244 in UK.

E.3 如何取得 GNU Emacs

    GNU Emacs 的生產、開發與出版在 :

        Free Software Foundation
        1000 Mass Avenue
        Cambridge, MA 02138
        USA

    在執照期限內任何擁有系統拷貝的人被允許 (鼓勵) 可以自由地將原始碼
和文件拷貝給任何其他的人.

    假如你無從得知誰有一份拷貝, 只要付媒体價錢以及手續費你就可以獲得
一個系統的完整版本, 你可以從自由軟体基金會, 或者在歐洲, 從 Unipalm取
得.

=====

附錄F X網路與電子郵件服務

    透過電子郵件與其他網路可取得一些與X相關的服務. 這些包括公佈欄
(bulletin board)、"資訊服務 (information servers)", 與獲得X軟体 (包
括 MIT 發行版以及其他程式與軟体) 的設備.

F.1 xpert 郵件競技場

    xpert 郵件競技場 (Mailing List) 是一個用於討論X面貌的論壇. 包括
已存在軟体的問題、設計的變更、可能的改進與其他一般資訊. 它發源於 MIT
的X 研究人員, 是許多有用資訊的來源.

    要加入該競技場, 可以送一個郵件訊息至 :

        xpert-request@athena.mit.edu

要求加入各分佈區域的競技場.

F.2 xstuff Server

    xstuff Server 是一個透過郵件網路發送你的程式與(或)文件檔案的服務
程式, 用以反應一個你以電子郵件送出的要求. 它主要包含來自X協會 "認定
的" 資訊, 包括新發行的文件與確定 MIT所發行的軟体.

    本節剩於的部分是當你發送一個 "求助 (help)" request 至 server 時,
你從 server 所得到的訊息所組成.

       ┌─────────┐
       │見 p307-310 原文  │
       └─────────┘

F.2.1 注意事項

       ┌───────┐
       │見 p310 原文  │
       └───────┘

F.2.2 明朗性

       ┌───────┐
       │見 p310 原文  │
       └───────┘

F.3 FTP 與其他網路 Server

    對那些可以接取 Internet (Arpanet) 者, 有許多站可以提供 FTP 處理,
允許你直接由網路上獲得軟体. 也有其他站允許你以用 uucp 或其他通訊協定
存取. 詳細的這些內容有時候會印在 xpert 郵件競技場上.

=====

附錄G  需要從你的系統管理者得到的資訊

    如果你自行安裝X,我們強力推薦你使用預設的建構(configuration) ,
因而所有的檔案將儲存在標準的目錄中。

    如果系統是以一種非標準建構來安裝的話,你需要從你的系統管理者,至
少獲得下列的資訊:

    1. X可執行程式的目錄
        (預設值:/usr/bin/x11).

    2. 位元映像館的目錄
        (預設值:/usr/include/x11/bitmaps/).

    3. 指南頁的目錄
        (預設值:/usr/man/mann/).

    4. 字型的目錄
        (預設值:/usr/lib/x11/fonts/misc/, /usr/lib/x11/fonts/75dpi
                  和/usr/lib/x11/fonts/100dpi/).

    5. RGB 色彩資料庫的位置
        (預設值:/usr/lib/x11).

    6. 應用程式特性resource名稱的目錄
        (預設值:/usr/lib/x11/app-defaults/).

--
Origin: 中原電機心站 bbs.ee.cycu.edu.tw (140.135.12.1)
 

上一篇 下一篇 回到卷宗