![如何让 MS Natural Ergonomic 4000 滑块在 Linux Mint 上工作?](https://linux22.com/image/98272/%E5%A6%82%E4%BD%95%E8%AE%A9%20MS%20Natural%20Ergonomic%204000%20%E6%BB%91%E5%9D%97%E5%9C%A8%20Linux%20Mint%20%E4%B8%8A%E5%B7%A5%E4%BD%9C%EF%BC%9F.png)
我试图让 MS 键盘上的滑块正常工作,但仍然不行。
我已经尝试过的:
在/etc/udev/hwdb.d/61-keyboard-local.hwdb
keyboard:usb:v045Ep00DB*
KEYBOARD_KEY_c022d=up
KEYBOARD_KEY_c022e=down
和
evdev:input:b0003v045Ep00DB*
KEYBOARD_KEY_c022d=up
KEYBOARD_KEY_c022e=down
下列的
sudo udevadm hwdb --update
sudo udevadm control --reload
并重新启动没有做任何事情。
在/lib/udev/keymaps/microsoft-ergonomic-keyboard
0xC022D 0xC1 # Zoom Up which we wish to be Scroll up
0xC022E 0xC2 # Zoom Down which we wish to be Scroll down
并重新启动没有做任何事情。
在/etc/X11/xorg.conf.d/10-keyboard.conf
Section "InputDevice"
Identifier "Keyboard1"
Driver "evdev"
Option "Device" "/dev/input/event9"
Option "event_key_remap" "418=185 419=186 423=101 425=156 421=157"
EndSection
并重新启动没有做任何事情。
我拥有的是
> sudo evtest /dev/input/event9
Input driver version is 1.0.1
Input device ID: bus 0x3 vendor 0x45e product 0xdb version 0x111
Input device name: "Microsoft Natural® Ergonomic Keyboard 4000"
...
Testing ... (interrupt to exit)
Event: time 1478692111.766327, type 4 (EV_MSC), code 4 (MSC_SCAN), value c022d
Event: time 1478692111.766327, type 1 (EV_KEY), code 418 (KEY_ZOOMIN), value 1
Event: time 1478692111.766327, -------------- SYN_REPORT ------------
Event: time 1478692111.886318, type 4 (EV_MSC), code 4 (MSC_SCAN), value c022d
Event: time 1478692111.886318, type 1 (EV_KEY), code 418 (KEY_ZOOMIN), value 0
Event: time 1478692111.886318, -------------- SYN_REPORT ------------
Event: time 1478692112.678287, type 4 (EV_MSC), code 4 (MSC_SCAN), value c022e
Event: time 1478692112.678287, type 1 (EV_KEY), code 419 (KEY_ZOOMOUT), value 1
Event: time 1478692112.678287, -------------- SYN_REPORT ------------
Event: time 1478692112.798370, type 4 (EV_MSC), code 4 (MSC_SCAN), value c022e
Event: time 1478692112.798370, type 1 (EV_KEY), code 419 (KEY_ZOOMOUT), value 0
Event: time 1478692112.798370, -------------- SYN_REPORT ------------
因此滑块可以工作,evtest
可以看到事件,但xev
不显示任何内容。 2016 年我还能做些什么来让它发挥作用吗?
我正在使用带有 4.4.0-34-generic 内核的 Linux Mint 18 Sarah。
答案1
背景:您的键盘是高压气体放电管USB 设备,内核可以正确识别滑块键的 HID USB 事件,并将它们转换为键码(KEY_ZOOMIN
和KEY_ZOOMOUT
)。因此,在这方面,它已经“工作”了:您可以接收事件并用它做一些有用的事情。
但是,X 键盘翻译仅支持最多 255 个键码(请参阅这个答案,这是 X 协议的限制)。所以你不能将它们转换为 X 键符号。 (无论如何,也许这不是您想要的,因为缩放通常由应用程序中的鼠标按钮事件处理,即按钮 4 和 5。因此,即使您确实将其转换为键盘符号,它们也不会放大或缩小)。
但从您尝试执行的操作来看,您似乎想将它们重新映射到up和down键,与键盘上已用作其他键的向上和向下箭头键相同。
正如在回答已链接,使 X 能够重新映射大于 255 的键码,某人创建了一个修补变体X
evdev
驱动程序的。所以你需要编译并安装这个修补过的变体,并且然后该选项event_key_remap
将被识别。标准驱动程序无法识别它,因此您的输入没有执行任何操作evdev
也就不足为奇了。xorg.conf
这可能是最干净的方法。
在接管所有Linux的过程中,
systemd
显然现在也拥有自己的硬件数据库并且可以覆盖键盘映射。我不太确定这在内核的哪个级别上工作,所以我不知道它是否有帮助,并且“硬件数据库”的格式似乎没有记录。所以在这方面我帮不了你太多。但是,匹配的格式似乎已经改变,所以如果您按照描述包含公交车号码,也许您会更幸运。
编辑:阅读内核源代码,我发现每个输入设备都有自己的扫描码(取决于硬件,最多 8 个字节,尽管在许多地方仅传输内核中的 1/2/4 个字节)到键码(您在 中看到的内容
evtest
)翻译映射。可以使用设备上的EVIOCGKEYCODE_V2
和ioctl设置和获取大代码值。EVIOCSKEYCODE_V2
类似于xmodmap
或 的通用工具loadkeys/dumpkeys
似乎不存在,尽管一些 IR 接收器相关工具显然使用这些 ioctl。如果这就是systemd
数据库的工作方式,则更灵活的替代方案是在udev
规则中使用此类工具(也更易于测试)。我写了一个快速的 C 程序来转储映射,也许我应该把它放在 github 上......原则上,您已经可以使用自己的程序或脚本处理事件并执行您想做的任何操作。例如,运行
evtest
它,使用 bash 脚本解析输出,并xdotool
通过按 4 或 5 次按钮进行调用,以获得与滑块按钮的鼠标滚轮相同的效果。等等(有一个 stackexchange 问题,其中有一个用于类似目的的基本脚本,但我现在找不到它。如果有必要,我可以搜索更多)。