【问题标题】:after kernel-upgrade: missing keyboard events内核升级后:缺少键盘事件
【发布时间】:2018-06-22 15:12:09
【问题描述】:

在内核升级(3.19 到 4.4)后,我的键盘鼠标按钮的键映射部分损坏。

虽然其他按钮仍按预期工作,但中间按钮仅在按键释放后触发(然后是 keydown 和 keyup)。

测试:

sudo cat /dev/input/event22
sudo evtest /dev/input/event22
sudo showkey

建议?有没有办法比“/dev/input/event22”更深一层?

【问题讨论】:

    标签: linux keyboard mouse udev


    【解决方案1】:

    我终于找到了一个可行的解决方案:

    sudo cat /dev/usb/hiddev0 | hexdump
    

    确实捕获了 keydown/keypress 事件!

    我没有深入研究 hiddev API,但识别出计数器前缀和每行重复的后缀值。由于它们在 keydown 和 keyup 之间没有区别,我在 python 中实现了一个切换功能(需要读取 /dev/usb/hiddev0 的权限):

    import os
    import time
    import pyautogui as pa
    
    DEVPATH = "/dev/usb/hiddev0"
    BTNHEX = "F200A0FF00000000" # first/unique hex value of ThinkPad middle button
    NEWKEY = "ctrlleft" # mapping target
    
    def byteToHex(byteStr):
      return "".join(["%02X" % ord(b) for b in byteStr]).strip()
    
    def waitForPathExists(DEVPATH):
      while not os.path.exists(DEVPATH): time.sleep(0.5)
    
    def watchHandleDev(dev, isPressed):
      byteStr = os.read(dev, 8)
      currentHex = byteToHex(byteStr[:8])
      if currentHex == BTNHEX:
        pa.keyUp(NEWKEY) if isPressed else pa.keyDown(NEWKEY)
        return not isPressed
      return isPressed
    
    def handleDevUnavailable(dev):
      print "device '%s' not readable, waiting" % DEVPATH
      os.close(dev)
      waitForPathExists(DEVPATH)
      print "device '%s' found, reopening" % DEVPATH
      return os.open(DEVPATH, os.O_RDONLY)
    
    def main():
      dev = os.open(DEVPATH, os.O_RDONLY)
      isPressed = False
      while True:
        try:
          isPressed = watchHandleDev(dev, isPressed)
        except OSError, err:
          print "err", err
          if err.errno == 5: dev = handleDevUnavailable(dev)
    

    【讨论】:

      猜你喜欢
      • 2016-02-29
      • 2021-01-15
      • 2014-05-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-20
      • 1970-01-01
      • 2021-07-29
      相关资源
      最近更新 更多