几乎自我解决了。
以下内容来自:linux_xmodmap_tutorial
扫描码→键盘发送给计算机的号码。对于USB 键盘,它由USB标准定义。
Keycode→Linux内核用来表示密钥(或鼠标)的数字 按钮/轮)。 Linux内核将扫描代码转换为密钥代码。
Keysym→密钥的名称。 keys11由X11应用程序接收。
我可能错了,但是sudo evtest
打印看起来像扫描码集1,因为/dev/input/event*
输出类似,至少我的系统扫描码和linux密钥码大致相同。
xev命令打印keycode和keysym,我发现无论我使用的键盘布局如何,键码都不会改变; qwerty和dvorak布局产生不同的键,但键码相同。
然而,它不是linux密钥代码,也不是隐藏使用id,也不是任何一个扫描代码集; set1,set2也不是set3。
根据arch wiki(我不能发布链接):
/etc/udev/hwdb.bin
将扫描码转换为键码。
显而易见的是:
hwdb.bin
hwdb.bin
可以检测不同的键盘并进行翻译
扫描码与键码不同。对于ubuntu,我能找到的唯一hwdb文件是:/etc/udev/hwdb.d/61-keyboard-local.hwdb
,这几乎是空的。因此,默认情况下,ubuntu会保留默认扫描码并将其用作我认为的密钥代码。
有些黑客在这里给我们留下了线索:https://www.charvolant.org/doug/xkb/html/index.html
扫描码到键码映射规则文件(正在使用哪一个是问题)位于:/usr/share/X11/xkb/keycodes
setxkbmap -print -verbose 10
打印
Trying to load rules file ./rules/evdev...
Trying to load rules file /usr/share/X11/xkb/rules/evdev...
所以,上面的文件应该控制Xkb的加载行为(Linux变化很大,所以不应该期待将来相同)。
例:
setxkbmap -print -verbose 10
Setting verbose level to 10
locale is C
Trying to load rules file ./rules/evdev...
Trying to load rules file /usr/share/X11/xkb/rules/evdev...
Success.
Applied rules from evdev:
rules: evdev
model: pc105
layout: us,us
variant: dvp,
Trying to build keymap using the following components:
keycodes: evdev+aliases(qwerty)
types: complete
compat: complete
symbols: pc+us(dvp)+us:2+inet(evdev)
geometry: pc(pc105)
xkb_keymap {
xkb_keycodes { include "evdev+aliases(qwerty)" };
xkb_types { include "complete" };
xkb_compat { include "complete" };
xkb_symbols { include "pc+us(dvp)+us:2+inet(evdev)" };
xkb_geometry { include "pc(pc105)" };
/usr/share/X11/xkb/rules/evdev
中可能控制键码文件加载行为的部分:
! model = keycodes
pc98 = evdev(pc98)
applealu_jis = evdev+macintosh(jisevdev)
olpc = evdev+olpc(olpc)
olpcm = evdev+olpc(olpcm)
* = evdev
! layout[1] = keycodes
$azerty = +aliases(azerty)
$qwertz = +aliases(qwertz)
* = +aliases(qwerty)
XServer查看键盘的供应商ID和设备ID,并应用不同的规则将扫描码转换为键码。
xkb/keycodes/evdev
似乎被用作大多数键盘的翻译规则,使用它可能会成功。
没有
传统的X11核心协议不提供生成键盘事件的键盘的供应商ID和设备ID。
XI2 - X输入扩展2.x
https://www.x.org/releases/X11R7.7/doc/inputproto/XI2proto.txt
A RawEvent provides the information provided by the driver to the
client. RawEvent provides both the raw data as supplied by the driver and
transformed data as used in the server.
我无法提取隐藏使用ID和扫描码;但也许我只是忽略了它们 Capture XI2 RawKeyPress event and interpreting it with python