【发布时间】: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”更深一层?
【问题讨论】:
在内核升级(3.19 到 4.4)后,我的键盘鼠标按钮的键映射部分损坏。
虽然其他按钮仍按预期工作,但中间按钮仅在按键释放后触发(然后是 keydown 和 keyup)。
测试:
sudo cat /dev/input/event22
sudo evtest /dev/input/event22
sudo showkey
建议?有没有办法比“/dev/input/event22”更深一层?
【问题讨论】:
我终于找到了一个可行的解决方案:
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)
【讨论】: