我的 Logitech R400 演示器发送以下密钥代码:
keycode 112 (keysym 0xff55, Prior) [page up]
keycode 117 (keysym 0xff56, Next) [page down]
keycode 60 (keysym 0x2e, period)
keycode 71 (keysym 0xffc2, F5)
keycode 9 (keysym 0xff1b, Escape)
基本上,我想使用这个演示者来远程控制 Banshee,所以我想重新映射Prior
到B
、Next
到N
等等。
我怎样才能仅更改此设备的键盘映射(因为我当然不想全局重新映射这些键代码)?
答案1
我从来没有这样做过,但我认为你需要创建一个键盘映射文件,/lib/udev/keymaps/
并为你的设备添加一条规则/lib/udev/rules.d/95-keymap.rules
细节:
udev 键盘映射将扫描代码映射到按键代码,因此您需要找到两者才能创建键盘映射文件。要找到扫描代码,请运行以下命令并按下设备上的按钮:
sudo /lib/udev/keymap -i input/event5
您可能需要尝试不同的数字事件*。输出应如下所示:
scan code: 0x70037 key code: dot scan code: 0x70029 key code: esc scan code: 0x7003E key code: f5 scan code: 0x7004B key code: pageup scan code: 0x7004E key code: pagedown
可以找到密钥代码列表这里。
现在创建键盘映射文件(我将其存储为/lib/udev/键盘映射/logitech-r400):
0x70037 brightnessdown 0x70029 brightnessup 0x7003E brightnessdown 0x7004B brightnessup 0x7004E brightnessdown
没有做任何有用的事情 - 只是一个测试,以方便查看它是否有效。
要临时测试新的键盘映射,请运行:
sudo /lib/udev/keymap input/event5 /lib/udev/keymaps/logitech-r400
输出结果如下:
Remapped scancode 0x70037 to 0xe0 (prior: 0x34) Remapped scancode 0x70029 to 0xe1 (prior: 0x01) Remapped scancode 0x7003e to 0xe0 (prior: 0x3f) Remapped scancode 0x7004b to 0xe1 (prior: 0x68) Remapped scancode 0x7004e to 0xe0 (prior: 0x6d)
按钮现在应该改变亮度。
如果您想使该更改永久生效,您需要添加一个 udev 规则,将
/lib/udev/rules.d/95-keymap.rules
键盘映射文件应用于该设备。- 打开文件:
gksudo gedit /lib/udev/rules.d/95-keymap.rules
在文件底部,但在该
LABEL="keyboard_end"
行之前,添加:ENV{ID_VENDOR}=="Logitech*", ATTRS{idProduct}=="c52d", RUN+="keymap $name logitech-r400"
保存,关闭,重新启动后按钮的亮度就会改变。
- 打开文件:
答案2
我在 Ubuntu 16.04 上。我做了一个指南这里
使用 evtest 进行检测
sudo evtest
查看设备列表:
/dev/input/event0: Lid Switch /dev/input/event1: Power Button /dev/input/event2: Sleep Button /dev/input/event3: Power Button /dev/input/event4: AT Translated Set 2 keyboard /dev/input/event5: Video Bus /dev/input/event6: USB Optical Mouse /dev/input/event7: AlpsPS/2 ALPS DualPoint Stick /dev/input/event8: AlpsPS/2 ALPS DualPoint TouchPad /dev/input/event9: Logitech USB Receiver /dev/input/event10: Logitech USB Receiver /dev/input/event11: HDA Intel PCH Dock Mic /dev/input/event12: HDA Intel PCH Headset Mic /dev/input/event13: HDA Intel PCH Dock Line Out /dev/input/event14: HDA Intel PCH Headphone /dev/input/event15: HDA Intel PCH HDMI/DP,pcm=3 /dev/input/event16: HDA Intel PCH HDMI/DP,pcm=7 /dev/input/event17: HDA Intel PCH HDMI/DP,pcm=8 /dev/input/event18: Integrated Webcam /dev/input/event19: Dell WMI hotkeys Select the device event number [0-19]: 9 Input driver version is 1.0.1 Input device ID: bus 0x3 vendor 0x46d product 0xc52d version 0x111 Input device name: "Logitech USB Receiver"
取第一个“Logitech USB 接收器”,这里它的事件 ID 为 9。
Testing ... (interrupt to exit)
好的,现在 evtest 需要输入,只需单击 Logitech 远程按钮,我得到了这个(简化):
[>] value 7003e (KEY_PRESENTATION) [>] value 70029 (KEY_PRESENTATION) [ ] value 70037 (KEY_DISPLAYTOGGLE) < value 7004b (KEY_PAGEUP) > value 7004e (KEY_PAGEDOWN)
笔记:之后我发现多次单击 [>] 会得到 7003e,然后是 70029,然后是 7003e 等等。我不知道为什么。
修改 udev 配置
现在我们有了输入代码,让我们看一下 udev conf:
sudo gedit /lib/udev/hwdb.d/60-keyboard.hwdb
搜索“R400”并将 presentation & displaytoggle 替换为你想要的,播放暂停&停止光盘方向键:
# Logitech Presenter R400 evdev:input:b0003v046DpC52D* KEYBOARD_KEY_070029=playpause # bottom left [>] was "presentation" KEYBOARD_KEY_07003e=playpause # bottom left [>] was "presentation" KEYBOARD_KEY_070037=stopcd # bottom right [ ] was "displaytoggle"
如前所述,因为 07003e 和 070029 是相同的按钮,所以我给了它们相同的输出向上键。7004b 和 7004e 默认不出现在这里,可能是因为它们是原生的 PAGEUP 和 PAGEDOWN 输入,与“Logitech Presenter R400”无关。让我们添加它们:
KEYBOARD_KEY_07004b=previoussong # top left < KEYBOARD_KEY_07004e=nextsong # top right >
这是我的最终结论:
KEYBOARD_KEY_07004b=previoussong # top left < KEYBOARD_KEY_07004e=nextsong # top right > KEYBOARD_KEY_070029=playpause # bottom left [>] was "presentation" KEYBOARD_KEY_07003e=playpause # bottom left [>] was "presentation" KEYBOARD_KEY_070037=stopcd # bottom right [ ] was "displaytoggle"
重新加载(新)规则
sudo udevadm hwdb --update
然后使用我们之前选择的相同事件 ID,这里是事件 ID 9:
sudo udevadm trigger /dev/input/event9
您可以在网络浏览器中检查这个新的映射,例如:
$('body').on('keydown', function(e){ console.log(e.key) })
这给了我:
[>] ArrowUp [ ] ArrowDown < ArrowLeft > ArrowRight