如何更改单个设备的键盘映射(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 PriorN ,依此类推。

如何仅更改此设备的键映射(因为我当然不希望全局重新映射这些键代码)?

我从来没有这样做,但我认为你需要在/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文件应用于设备。

    1. 打开文件: gksudo gedit /lib/udev/rules.d/95-keymap.rules
    2. 在文件的底部,但在LABEL="keyboard_end"行之前,添加:

       ENV{ID_VENDOR}=="Logitech*", ATTRS{idProduct}=="c52d", RUN+="keymap $name logitech-r400" 
    3. 保存,关闭,重启后按钮应改变亮度。

我在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”并根据需要替换演示和显示切换playpausestopcd箭头键:

 # 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