如何将X11键码可靠地转换回扫描码或隐藏使用ID

几乎自我解决。

背景信息

linux的键码

以下是来自:linux_xmodmap_tutorial

我可能是错的,但什么sudo evtest打印似乎像sudo evtest设置1,因为/dev/input/event*输出是相似的,至less我的系统扫描码和linux键码大多是相同的。

X11键码

xev命令打印keycode和keysym,我观察到keycode不会改变,不pipe我使用的键盘布局如何; qwerty和dvorak布局产生不同的keysym,但是相同的keycode。
尽pipe如此,它不是一个Linux密钥代码,也不隐藏使用ID,也不是任何一个扫描码集; set1,set2和set3。

如何生成的Linux键码?

根据维基(我不能张贴链接):
/etc/udev/hwdb.bin将扫描码转换为键码。

显而易见的是:

  1. 该wiki说有非默认的* .hwdb文件可以编译到hwdb.bin
  2. hwdb.bin可以检测不同的键盘,并且可能会将扫描码转换为不同的键码。

对于ubuntu,我能find的唯一的hwdb文件是: /etc/udev/hwdb.d/61-keyboard-local.hwdb ,这几乎是空的。 所以,默认情况下,ubuntu会保留默认的扫描码,并将其用作我相信的键码。

如何生成X11键码

有些黑客给我们留下了一个线索: 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,并应用不同的规则将扫描码转换为键码。

我可以从X11键码获得扫描码吗?

xkb/keycodes/evdev似乎被用作大多数键盘的翻译规则,使用它可能会有诀窍。

它可靠吗?

没有
传统的X11核心协议不提供生成键盘事件的键盘的厂商ID和设备ID。

潜在的解决scheme?

XI2 – Xinput扩展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. 

现在我已经尝试过RawKeyPress

我无法提取HID使用ID,也无法扫描代码;虽然也许我只是忽略了它们。
捕获XI2 RawKeyPress事件并用python解释它

Solutions Collecting From Web of "如何将X11键码可靠地转换回扫描码或隐藏使用ID"