我用的是Xubuntu。登录之前我可以选择键盘布局。我用来xmodmap
重新映射一些键。
我对两件事感兴趣:
- 键盘映射的状态如何变化(a)当我打开笔记本电脑时,(b)在启动过程中以及(c)登录系统(在这三个阶段)以及使用系统时(登录)。
- 是什么导致在各个阶段期间屏幕上显示哪些符号(以及发送的控制键)。当我按下某个键时,它会向键盘驱动程序发送一些信号(?),然后必须有一些决策过程(应用程序和配置文件)来确定将显示哪些符号。这个问题的答案应该是应用程序列表和这些配置文件的路径(我对 Ubuntu(基于 Debian 的系统)特别感兴趣,但您可以描述一些其他系统,但首选 Ubuntu)。
答案1
这里有两层,KEYCODE到KEYSYM的映射和KEYSYM到文本的映射。如果算上内核的话,还有更多层,它必须将 AT 键盘扫描码映射到 XT 样式的 KEYCODE 或将 USB 键盘 HID 代码映射到 KEYCODE。 KEYCODE 只是一个 8 位无符号整数,操作系统内核将其传递给 X11 服务器。它可能因操作系统(例如 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)实际上是可以配置的。与模式开关或数字锁定键不同,任何键都可以映射为充当 Shift 键。
KEYCODE 代表操作系统内核发送的物理键。每个 KEYCODE 可以映射到 8 个可能的 KEYSYM。仅使用 4 个级别,有时称为级别 1-4。级别 1 指定当没有任何修饰符处于活动状态时打印的 KEYSYM。这些通常是小写字母和数字。修饰符是当修饰符处于活动状态(按下或打开)时修改其他 KEYCODE 生成的 KEYSYM 的 KEYCODE。修饰符键码也通过 Xmodmap 控制。级别 2 指定按下 Shift 修改键时要发送的 KEYSYM。只要按下模式开关 KEYSYM,就会激活级别 3。当 Shift 键和模式开关都处于活动状态时,级别 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 决定将按键映射到的数字。