查看單個文章
舊 2005-01-25, 07:38 AM   #5 (permalink)
psac
榮譽會員
 
psac 的頭像
榮譽勳章
UID - 3662
在線等級: 級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時
註冊日期: 2002-12-07
住址: 木柵市立動物園
文章: 17381
現金: 5253 金幣
資產: 33853 金幣
預設

在Linux主機上的鍵盤映射
這部分致力於下面的問題並提供關於在Linux中鍵盤映射的附加細節:
我的(語言-細節)鍵盤不被VMware Workstation支持。


我的鍵碟上的一些鍵在虛擬機中不能正常工作。


當我本機使用虛擬機時,鍵盤工作地很好,但是當我使用一個遠端X伺服器執行相同的虛擬機時鍵盤不工作。


快速答案
如果你的鍵盤使用本機X伺服器工作正常,而且你正想使用一個遠端X伺服器(也是在一台PC上執行的XFree86伺服器)需要相同的行為,關閉虛擬機並關閉VMware Workstation視窗,然後增加行
xkeymap.usekeycodeMapIfXFree86 = true
到虛擬機組態文件或到~/.vmware/config。


在主機上作出這個改變,是在你執行虛擬機的地方,不是在使用遠端X伺服器的電腦上。



如果你正在使用一個VMware Workstation不能識別的關於XFree86的伺服器作為一個XFree86伺服器,使用這行:



xkeymap.usekey codeMap = true
如果你正在使用一個本機執行的XFree86伺服器,而且鍵盤不正確地工作,請向VMware技術支持部門報告問題。


漫長的歷史


不幸的是,對PC(虛擬的或其它的)鍵盤的支持是一個複雜的事情。


公平而論,我們必須以一些背景訊息開始-已經極大地簡化。


在PC鍵碟上按下一個鍵產生一個關於鍵位置的掃瞄碼。


例如,在一個德國鍵碟上的Z鍵產生一個和英文鍵碟上的Y鍵相同的程式碼,因為他們在鍵碟上位置相同。


大多數鍵有一字元掃瞄程式碼,一些使用前綴0xe0的鍵有二字元掃瞄程式碼。

在內部,VMware Workstation使用PC掃瞄程式碼的一個簡化版本,這個掃瞄程式碼是一個單精度9位數值,叫做v-scan程式碼。

一個v-scan程式碼被寫成一個三個數位的十六進位數。第一個數位是0或1。例如,左側的Ctrl鍵有一個一字元掃瞄程式碼(0x1d);它的v-scan程式碼是0x01d。右側的Ctrl鍵掃瞄程式碼是二個字元(0xe0,0x1d);它的v-scan程式碼是0x11d。
一個X伺服器使用一個二級鍵編碼。


X鍵程式碼是一個一字元值。對鍵的鍵程式碼分配依賴X伺服器實現和物理的鍵盤。結果,一個X應用程式通常不能直接使用鍵程式碼。


而是,鍵程式碼被映射到有比如space、escape、x、和2名字的keysyms之內。

那個映射被一個X應用程式由函數XChangeKeyboardMapping()或程序xmodmap控制。


要研究鍵盤映射,你可以進入使用xev,對輸入進它的視窗的鍵它顯示鍵程式碼和keysyms。



為了扼要重述,一個鍵程式碼大約對應一個實際的鍵,當keysym對應鍵上的符號時。


例如,一個執行在PC上的XFree86伺服器,在德國鍵碟上的Z鍵和在英文鍵碟上的 Y鍵有相同的鍵程式碼。然而,德國Z keysym,與英文的Z keysym相同,與英文的Y keysym不同。


對於在一台PC上的一個XFree86伺服器, 有一個從X鍵程式碼到PC掃瞄程式碼(或v-scan程式碼,它是VMware Workstation實際使用的)的一對一映射。


VMware Workstation利用這個事實。

當它正在本機主機上使用一個XFree86伺服器時,它使用內建的從X鍵程式碼到v-scan程式碼的映射。

這個映射是獨立於鍵盤的而且應該對大部分,不是所有的,語言是正確的。


在其他的情況(不是一個XFree86伺服器或一個本機伺服器),VMware Workstation必須把keysyms映射到v-scan程式碼,使用一組特定鍵盤表。


鍵程式碼映射是簡單的、自動的和笨人也會處理的。(Keysym映射更複雜,稍後描述)。


然而,因為程序不能區別一個遠端伺服器正執行在一台PC上還是在一些其他檔案類型的電腦上,它在安全方面犯錯並且僅對本機X伺服器使用鍵程式碼映射。這時常太保守的而且有不受歡迎的效果。


幸運的是,與鍵程式碼映射相關的這個和其他行為可能通過關閉虛擬機並關閉VMware Workstation視窗被控制,然後使用一個文本編輯器來把組態設定增加到虛擬機組態文件。


xkeymap.usekeycodeMapIfXFree86 = true
如果使用一個XFree86伺服器,使用鍵程式碼映射,即使它是遠端的。
xkeymap.usekeycodeMap = true
總是使用鍵程式碼映射而不管伺服器檔案類型。
xkeymap.nokeycodeMap = true
從不使用鍵程式碼映射。


xkeymap.keycode.<code> = <v-scan code>
如果使用鍵程式碼映射, 映射鍵程式碼<code>到<v-scan code>.在這個例子中,<code> 必須是一個十進位數而且<v-scan code>應該是一個C-語法十六進位數(例如,0x001)。


要為一個鍵尋找X鍵程式碼的最容易方法是執行xev或xmodmap -pk。大多數v-scan程式碼包含在V-scan程式碼表中。在下面描述的keysym映射表也是有說明 的。



使用這個特性對那個映射作小的修改。

例如, 交換左邊的control和caps lock,使用下面的行:
xkeymap.key code.64 = 0x01d # X Caps_Lock -> VM left ctrl
xkeymap.key code.37 = 0x03a # X Control_L -> VM caps lock
這些組態行可能被增加到個別的虛擬機組態,加入你個人的VMware Workstation組態 (~/.vmware/config),或主機範圍(/etc/vmware/config)或(通常是/usr/local/lib/vmware/config)組態。


當鍵程式碼映射沒有被使用(或被禁用)時,VMware Workstation把keysyms映射到v-scan程式碼。這被做使用VMware Workstation安裝中的xkeymap目錄的表之一(通常是/usr/local/lib/vmware)。



你應該使用哪一個表依賴鍵盤佈局。對美國和許多歐洲國家和語言的PC鍵盤的正常發怖包括表。而且對於這些的大部分,都有101-鍵(或102-鍵)和104 鍵(或105-鍵)變體。


VMware Workstation通過檢查現用的Xkeymap自動決定使用哪一張表。然而,它的試探法有時可能失效。


除此之外,每個映射是類BIOS的並且對任何既定鍵盤和X鍵程式碼到keysym映射不可能完全正確。

例如,一個用戶可能已經使用xmodmap交換了control和caps lock。當使用一個遠端伺服器 (keysym映射)時這意謂著鍵在虛擬機中被交換但是當使用一個本機伺服器(鍵程式碼映射)時不交換。
因此,keysym映射必然有缺點。


要彌補這個缺點,組態設定可以改變大多數行為:


xkeymap.language = <keyboard-type>
如果VMware Workstation在xkeymap中對你的鍵盤有一張表但是不能檢測它,使用這個。<keyboard-type>必須是在xkeymap目錄中的表之一。


(位置見上面。)然而,要檢測鍵盤的失效或許意謂著表對你是不完全正確的。


xkeymap.keysym.<sym> = <v-scan code>
如果你使用keysym映射, 映射keysym <sym>到<v-scan程式碼>。


當你做的時候,<sym>必須是一個X keysym名字而且<v-scan code>應該是一個C-語法十六進位數(例如,0x001)。



找到一個鍵的keysym名字的最簡單方法是執行xev或xmodmap -pk。
X頭文件/usr/X11R6/include/X11/keysymdef.h有一個完整的keysyms列表。


(keysym的名字與它的使用XK_ 前綴的C常數相同)。大多數v-Scan程式碼在V-Scan程式碼表中。

xkeymap表本身也是有說明 的。使用他們在已存在的映射中修改一些小錯誤。
xkeymap.fileName = <file-path>
在<file-path>中使用keysym映射表。


一張表是一個<sym> = <v-scan code>形式的組態行次序,這裡<sym>是一個X keysym 名字,<v-scan code>是一個C-語法十六進位數(例如,0x001)。


(關於找到你的鍵盤的keysyms和v-scan程式碼的技巧見上面的xkeymap.keysym的解釋。)
編譯完整的keysym映射很難。最好從一張已存在的表開始並作一些小改變。
V-Scan程式碼表
這是104-key U.S.鍵盤的v-scan程式碼:

(該表省略,具體見手冊原版)


84-key鍵盤在數位小鍵碟上有一個Sys Req:
Symbol Shifted symbol Location V-scan code
Sys Req numeric pad 0x054
美式鍵盤以外的鍵盤通常有一個額外的鍵(通常是< >或< > | )在左shift鍵的下面:
Symbol Shifted symbol Location V-scan code
< > 0x056
psac 目前離線  
送花文章: 3, 收花文章: 1631 篇, 收花: 3205 次