如何正确更改键盘映射?

joh*_*und 5 linux xorg keyboard x11 keyboard-layout

我将尝试详细描述问题。我经常在上网本上使用外接键盘。键盘是“TK Stealth”:


点击放大

您可以看到,小键盘与经典的小键盘非常相似,但实际上箭头键的映射方式不同 - 作为宽键盘上的附加箭头键。

我想让它们像数字键盘一样映射,即“8”==“向上”、“2”==“向下”、“4”==“左”、“6”==“右”和很快。

只有在连接了这种类型的键盘时,这些设置才能起作用。

我尝试使用xmodmap /home/johnfound/TKStelth以下地图文件“TKStelth”来实现这一点:

keycode  79 = KP_Home KP_Home KP_Home KP_Home
keycode  80 = KP_Up KP_Up KP_Up KP_Up
keycode  81 = KP_Prior KP_Prior KP_Prior KP_Prior
keycode  83 = KP_Left KP_Left KP_Left KP_Left
keycode  84 = KP_Begin KP_Begin KP_Begin KP_Begin
keycode  85 = KP_Right KP_Right KP_Right KP_Right
keycode  87 = KP_End KP_End KP_End KP_End
keycode  88 = KP_Down KP_Down KP_Down KP_Down
keycode  89 = KP_Next KP_Next KP_Next KP_Next
keycode  90 = KP_Insert KP_Insert KP_Insert KP_Insert
keycode  91 = KP_Delete KP_Delete KP_Delete KP_Delete
Run Code Online (Sandbox Code Playgroud)

它实际上有效,但有丑陋的副作用。例如,有时布局恢复为默认值,我必须手动运行上述脚本。将脚本包含在初始化脚本中会导致一些冲突/锁定,从而使操作系统在从挂起状态恢复和更改屏幕分辨率后挂起几分钟。这样,我被迫从初始化脚本中删除脚本。

我在某处读到 xmodmap 实际上是处理键盘布局的旧方法。

所以,问题是:如何配置 Linux 来正确处理这个键盘?

附加信息:带有 XFCE 的 Manjaro Linux。键盘配置有两种布局 - 美式和保加利亚语,在上述配置更改后它们必须保留。

joh*_*und 1

只要我找到正确的解决方案,我就会回答我自己的问题。

有一个名为keyfuzz的程序,它可以根据输入设备更改内核使用的键盘映射 - 即分别针对连接到计算机的每个键盘。

该程序有两个问题在文档中没有正确描述:

  1. USB 键盘生成扫描码,而不是连接到 ps/2 端口的键盘的扫描码。这样,如果您需要重新映射 USB 键盘,您将需要一种方法来知道按键的扫描码。通常推荐用于测试扫描码和键码的工具“showkey”无法完成这项工作,因为它读取/dev/console发出“标准”扫描码的表单,而与键盘无关。

为了根据键盘的地址测试键盘的扫描码,您需要使用名为getscancodes/dev/input/KEYBOARD的程序。请注意,从上述链接下载的文件未正确压缩。它被命名为,但采用 ZIP 算法压缩。该包包含源代码以及预编译的二进制文件。getscancodes.tar.gz

就我而言,keyfuzz 配置文件如下所示:

### evdev 1.0.0., driver 'TK Stealth keyboard'
### Proper old-style numpad handling

0x70059    107
0x7005A    108
0x7005B    109
0x7005C    105
0x7005D    108
0x7005E    106
0x7005F    102
0x70060    103
0x70061    104

0x70062    110
0x70063    111
Run Code Online (Sandbox Code Playgroud)
  1. 程序“keyfuzz”在引导期间作为服务启动,以便尽早修补表。不幸的是,USB 键盘是后来添加到设备中的,因此当 keyfuzz 启动时,即使在启动过程中连接了 USB 键盘,也没有键盘需要修补。

解决方案是使用udev规则文件并在添加所需键盘时启动 keyfuzz。

为此,您需要添加一个文件/etc/udev/rules.d/mykeyboard.rules,其中包含(在我的例子中):

ACTION=="add", ATTRS{idVendor}=="2516", RUN+="/usr/lib/systemd/scripts/keyfuzz start"
Run Code Online (Sandbox Code Playgroud)

现在,插入键盘后,keyfuzz 启动脚本将启动并修补键盘解码表。