Boot

鍵盤佈局和xmodmap的關係

  • February 14, 2016

我正在使用Xubuntu。在登錄之前,我可以選擇鍵盤佈局。我正在使用xmodmap重新映射一些鍵。

我對兩件事感興趣:

  1. 鍵盤映射的狀態如何變化(a)當我打開筆記型電腦時,(b)在啟動過程中和(c)登錄到系統(在這三個階段)和使用系統時(登錄)。
  2. 是什麼原因導致在各個階段將在螢幕上顯示哪些符號(以及發送的控制鍵)。當我按下某個鍵時,它會向鍵盤驅動程序(?)發送一些信號,然後必須有一些決策過程(應用程序和配置文件)來確定將顯示哪些符號。這個問題的答案應該是應用程序列表和這些配置文件的路徑(我對 Ubuntu(基於 Debian 的系統)特別感興趣,但您可以描述一些其他系統,但首選 Ubuntu)。

這裡有兩層,KEYCODE 到 KEYSYM 映射和 KEYSYM 到文本映射。如果算上核心,還有更多層,它必須將 AT 鍵盤掃描碼映射到 XT 樣式的 KEYCODE 或將 USB 鍵盤 HID 程式碼映射到 KEYCODE。KEYCODE 只是作業系統核心傳遞給 X11 伺服器的 8 位無符號整數。它可能因作業系統(如 Linux 和 Solaris)而異。在 Linux 上,這些 KEYCODE 通常與舊 XT PC 鍵盤上使用的數字相同。帶有 AT、PS/2 或 USB 鍵盤的較新電腦通常只是將這些鍵盤映射到舊的 XT 程式碼以獲取密鑰以保持簡單。

原始鍵盤程式碼,無論是 XT、AT、PS/2 還是 USB,都表示鍵盤上的物理位置。XT 鍵盤僅在按下或釋放鍵時發送一個 8 位數字。美式/英式 XT 鍵盤上的 q 鍵發送數字 16。在法語鍵盤上,相同的物理鍵標記為 a,但仍發送 16。作業系統中的更高層為其賦予了真正的含義。當在 XT 鍵盤上釋放一個鍵時,會發送相同的鍵碼加上 128。對於此範例,當按下 q 時,會發送一個 16,但在釋放時,會發送數字 142 (16+128)。AT 鍵盤使用掃描碼,掃描碼是一系列數字,可以變得很長。關鍵版本添加了額外的程式碼。例如,暫停的掃描碼是 E1、1D、45、E1、9D、C5。大多數作業系統,包括 DOS、Windows、Linux、FreeBSD、並且 BIOS 都將掃描碼映射成更簡單的 XT 樣式的掃描碼。它還可以更輕鬆地支持使用不同程式碼的新鍵盤,例如發送 HID 程式碼的 USB 鍵盤。在 X11 或應用程序看到它們之前,所有程式碼都被作業系統映射到相同的一致程式碼集。

X11 不知道這部分過程,它只是從核心獲取 KEYCODE 並應用自己的映射將該 KEYCODE 轉換為 KEYSYM。 Xmodmap是控制該映射的標準工具。鍵盤映射的大部分行為都是可配置的,但也有一些特殊情況,例如 Num Lock、Mode Switch 和 Caps Lock/Shift Lock,它們被硬編碼到 X11 中。Shift 等其他方面實際上是可配置的。與模式開關或 Num Lock 不同,任何鍵都可以映射為 shift。

KEYCODE 代表作業系統核心發送的物理鍵。每個 KEYCODE 可以映射到 8 個可能的 KEYSYM。僅使用 4 個,有時稱為 1-4 級。級別 1 指定在沒有啟動修飾符時列印的 KEYSYM。這些通常是小寫字母和數字。修改器是 KEYCODE,當修改器處於活動狀態(按下或打開)時,修改其他 KEYCODE 生成的 KEYSYM。修改器鍵碼也通過 Xmodmap 控制。級別 2 指定按下 shift 修飾符時要發送的 KEYSYM。只要按下模式開關 KEYSYM,就會啟動第 3 級。當換檔鍵和模式開關都處於活動狀態時,將啟動 4 級。

一旦生成了 KEYSYM,就可以直接對其進行解釋,但大多數情況下會被轉換為文本。並非所有 KEYSYM 都會變成文本,或者可能只會影響未來的 KEYSYM。一個例子當然是 Shift_L,它沒有文本表示,但也有許多 KEYSYM 用於組成另一個字元。我的系統上的列表在/usr/share/X11/locale/en_US.UTF-8/Compose. 一個這樣的例子是 dead_acute KEYSYM,當按下它時,它將嘗試將下一個 KEYSYM 轉換為一個重音重音字母。有一個將 KEYSYM 轉換為 Unicode的標準映射。

既然已經說了所有這些,請注意 Xmodmap 已過時並被更複雜的 XKB 取代。這會影響 KEYCODE 映射到 KEYSYM 的方式,但不會影響核心生成 KEYCODE 的方式,也不會影響 KEYSYM 如何轉換為文本或組成仍然相同的文本。可以禁用 XKB 以恢復 Xmodmap 行為。它還有一個兼容層來支持 Xmodmap,但它可能存在問題,因為它不完全兼容。XKB 規則在/usr/share/X11/xkb/並且更加複雜。在其他地方有一些很好的文件,介紹了它如何生成用於將 KEYCODE 映射到 KEYSYM 的鍵盤佈局。

至於 Linux 控制台,它有自己的鍵盤佈局,這些佈局儲存在命令中並隨命令/usr/share/keymaps一起載入。loadkeys在 BIOS 和更早的引導載入程序階段(包括 GRUB2)中,鍵盤映射是 BIOS 決定將鍵映射到的任何數字。

引用自:https://unix.stackexchange.com/questions/12510