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

时间:2017-08-19 16:54:49

标签: linux hid

几乎自我解决了。

背景信息

linux keycode

以下内容来自:linux_xmodmap_tutorial

  • 扫描码→键盘发送给计算机的号码。对于USB 键盘,它由USB标准定义。

  • Keycode→Linux内核用来表示密钥(或鼠标)的数字 按钮/轮)。 Linux内核将扫描代码转换为密钥代码。

  • Keysym→密钥的名称。 keys11由X11应用程序接收。

我可能错了,但是sudo evtest打印看起来像扫描码集1,因为/dev/input/event*输出类似,至少我的系统扫描码和linux密钥码大致相同。

X11键码

xev命令打印keycode和keysym,我发现无论我使用的键盘布局如何,键码都不会改变; qwerty和dvorak布局产生不同的键,但键码相同。
然而,它不是linux密钥代码,也不是隐藏使用id,也不是任何一个扫描代码集; set1,set2也不是set3。

如何生成linux keycode?

根据arch wiki(我不能发布链接):
/etc/udev/hwdb.bin将扫描码转换为键码。

显而易见的是:

  1. wiki说有非默认的* .hwdb文件可以 编译为hwdb.bin
  2. hwdb.bin可以检测不同的键盘并进行翻译 扫描码与键码不同。
  3. 对于ubuntu,我能找到的唯一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。

    潜在的解决方案?

    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.   
    

    现在我尝试了RawKeyPress

    我无法提取隐藏使用ID和扫描码;但也许我只是忽略了它们 Capture XI2 RawKeyPress event and interpreting it with python

0 个答案:

没有答案