如何更改单个设备的键盘映射(Logitech演示者)?
我的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,所以我想重新映射到B
Prior
, N
,依此类推。
如何仅更改此设备的键映射(因为我当然不希望全局重新映射这些键代码)?
我从来没有这样做,但我认为你需要在/lib/udev/keymaps/
创建一个keymap文件,并为你的设备添加一个规则到/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
可以在此处找到密钥代码列表。
现在创建keymap文件(我将其存储为/ lib / udev / keymaps / 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)
按钮现在应该改变亮度。
-
如果要使更改成为永久更改,则需要向
/lib/udev/rules.d/95-keymap.rules
添加udev规则,以将keymap文件应用于设备。- 打开文件:
gksudo gedit /lib/udev/rules.d/95-keymap.rules
-
在文件的底部,但在
LABEL="keyboard_end"
行之前,添加:ENV{ID_VENDOR}=="Logitech*", ATTRS{idProduct}=="c52d", RUN+="keymap $name logitech-r400"
-
保存,关闭,重启后按钮应改变亮度。
- 打开文件:
我在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"
拿了第一个“罗技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 conf
现在我们有了输入代码,让我们来看看udev conf:
sudo gedit /lib/udev/hwdb.d/60-keyboard.hwdb
搜索“R400”并根据需要替换演示和显示切换 , playpause和stopcd箭头键:
# 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
您可以在Web浏览器中检查此新映射,例如:
$('body').on('keydown', function(e){ console.log(e.key) })
那给了我:
[>] ArrowUp [ ] ArrowDown < ArrowLeft > ArrowRight