原文地址:http://www.linuxidc.com/Linux/2011-04/35197.htm
对于英语来说,键盘上的字母键直接和英语字母表中的字母对应,但是对于非英语的语种来说,情况就不太一样了。例如,德语中的“ß”字母就没有直接的键和它对应,为此,Linux 提供“键盘映射”或“键盘翻译”,利用键盘映射可将某些键转换为特殊键。
前面提到,X Window 直接处理了键盘的输入输出端口,因此,在 Linux 虚拟控制台下和 X Window 下使用不同的键盘映射方法。在 Linux 虚拟控制台上,可利用 loadkeys 命令将特殊按键映射为特殊字符;而在 X Window 中,必须使用 xmodmap 命令完成键盘映射。这些命令均按照字符映射表文件(文本文件)中的规定完成相应的转换。在 X Window 启动时,它会参考 Linux 文本模式下的字符映射表,因此可获得某些一致的键映射。
字符映射表文件保存在 /usr/lib/kbd/keytables 目录下,defkeymap.map 是默认的字符映射表文件。利用命令:
$ loadkeys fr.map
可装入 fr.map 所规定的字符映射表。这时,按下“.”会显示“:”。命令
$ loadkeys –d
可装入默认字符映射表。对于非默认的键盘映射,可在启动时在 shell 脚本中装入特殊的映射表。
对X Window 而言,它对键盘的处理过程分如下两个步骤:
1.X Server 首先将键码转换为键符号名(keysym)。文件 /usr/include/X11/keysymdef.h 中包含所有的符号名。X Server 能够区分修饰键带来的不同,因为 keysymdef.h 中区分了两种不同的键,例如对“a”和“A”,分别用“KS_a”和“KS_A”定义。
2.X Server 将键符号翻译为 ASCII 字符串。对于大多数的键来说,该字符串只包含一个字符,而对于功能键等特殊按键来说,则包含多个字符。例如,F5 键对应的默认 ASCII 字符串为 “5~”。
利用 xmodmap 工具可修改键盘和键符号名之间的对应关系。例如,X Window 中“A”的键码为 30,而“Q”的键码为16。如果建立文件 maptest:
keycode 38 = A
keycode 24 = Q
在 xterm 中运行
$ xmodmap maptest
之后,将发现“A”键和“Q”键交换了过来。
上述的 maptest 文件实际就是一个简单的 X Window 映射文件。但需要注意的是,文件中的 keycode 和 Linux 内核对键值的定义是不一样的,一般而言,X Window 中的键码要比内核的键值大 8。利用 showkey 命令可以查看内核对键值的定义。例如,运行 showkey 并前后按下“A”和“Q”后,程序的输出为:
$ showkey
kb mode was RAW
...
keycode 30 press
keycode 30 press
keycode 16 press
keycode 16 press
该程序给出的是“A”和“Q”的内核键值。
在 XF86Config 文件中,Keyboard 段用来指定键盘参数,一般而言,这些参数不需要特殊设置:
Section “Keyboard”
Protocol “Standard”
AutoRepeat 500 5
EndSection