键盘布局与xmodmap的关系


12

我正在使用Xubuntu。登录之前,我可以选择键盘布局。我xmodmap用来重新映射一些键。

我对两件事感兴趣:

  1. (a)当我打开笔记本电脑时,(b)在启动过程中,以及(c)登录到系统(在这三个阶段)以及在使用系统时(登录),键盘映射状态如何变化。
  2. 是什么原因导致在各个阶段中哪些符号将显示在屏幕上(以及发送的控制键)。当我按下某个键时,它会向键盘驱动程序(?)发送一些信号,然后必须有一些决定过程(应用程序和配置文件)来确定将显示哪些符号。这个问题的答案应该是应用程序列表和那些配置文件的路径(我对Ubuntu(基于Debian的系统)特别感兴趣,但是您可以描述其他系统,但最好使用Ubuntu)。

Answers:


25

这里有两层,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,模式切换和Caps Lock / Shift Lock)被硬编码到X11中。Shift等其他方面实际上是可配置的。与模式切换或数字锁定不同,任何键都可以映射为移位。

KEYCODE代表操作系统内核发送的物理密钥。每个KEYCODE可以映射到8个可能的KEYSYM。仅使用4个,有时称为1-4级。级别1指定在没有修改器处于活动状态时打印的KEYSYM。这些通常是小写字母和数字。修饰符是在修饰符处于活动状态(按下或启用时)时,其修饰其他键代码生成的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决定将键映射到的数字。


感谢您的出色解释和新信息。您是否知道在引导过程中启动了哪些应用程序(upstart或initscript),启动过程由键盘决定,在登录阶段会发生什么,我可以选择布局。哪个程序与之交互,并将其存储在文件系统中的什么位置?登录后,xmodmap或xkb是否会覆盖登录过程中选择的默认布局?
xralf 2011年

正如我所说,内核键映射是loadkeys由一个初始化脚本加载的。grep loadkeys /etc/init.d/*显示文件keymap.sh。X11具有自己的键映射,传统上是由Xmodmap从Xsession启动脚本之一运行的来加载的。如今,使用XKB代替Xmodmap,可以通过各种Xkb选项或HAL在Xorg.conf中设置默认键映射。加载Gnome或KDE显示管理器后,他们可以通过setxkbmap命令加载自己的布局。用户的桌面环境也可能在登录时设置不同的布局。
penguin359'5

我试着命令grep loadkeys /etc/init.d/*locate keymap.sh和什么也没有找到。找不到文件Xorg.conf。它是否取决于我的Ubuntu版本10.04?
xralf 2011年

窗口将接收什么样的事件?带有KEYSYM的事件,然后应用程序通过哪种方式将KEYSYM转换为文本?Xorg是否为应用程序提供IPC / RPC接口以将KEYSYM转换为文本?还是该应用程序必须独自完成?
炸鱼薯条德里克18/12/5
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.