如何更改单个设备的键盘映射(罗技演示器)?

hto*_*que 20 remote-control udev

我的 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)
Run Code Online (Sandbox Code Playgroud)

基本上,我想用这个presenter远程控制Banshee,所以我想重新映射PriorBNextN,等等。

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

Flo*_*sch 15

我从来没有这样做过,但我认为您需要在其中创建一个键盘映射文件/lib/udev/keymaps/并为您的设备添加一个规则/lib/udev/rules.d/95-keymap.rules


细节:

  • udev 键盘映射将扫描代码映射到键代码,因此您需要找到两者来创建键盘映射文件。要查找扫描代码,请运行以下命令并按下设备上的按钮:

    sudo /lib/udev/keymap -i input/event5
    
    Run Code Online (Sandbox Code Playgroud)

    您可能需要为event*尝试不同的数字。输出应如下所示:

    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
    
    Run Code Online (Sandbox Code Playgroud)

    可以在此处找到关键代码列表

    现在创建键盘映射文件(我将其存储为/lib/udev/keymaps/logitech-r400):

    0x70037 brightnessdown
    0x70029 brightnessup
    0x7003E brightnessdown
    0x7004B brightnessup
    0x7004E brightnessdown
    
    Run Code Online (Sandbox Code Playgroud)

    没有做任何有用的事情 - 只是一个测试以轻松查看它是否有效。

  • 要临时测试新的键盘映射,请运行:

    sudo /lib/udev/keymap input/event5 /lib/udev/keymaps/logitech-r400
    
    Run Code Online (Sandbox Code Playgroud)

    这应该导致这样的输出:

    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)
    
    Run Code Online (Sandbox Code Playgroud)

    按钮现在应该改变亮度。

  • 如果您想让该更改永久生效,您需要添加一个 udev 规则来/lib/udev/rules.d/95-keymap.rules将键盘映射文件应用于设备。

    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"
      
      Run Code Online (Sandbox Code Playgroud)
    3. 保存,关闭,重启后按钮应该会改变亮度。

  • 你好@htorque,你能更新新方式的答案吗?在 Ubuntu Trusty 中,所有这些文件都不存在了。你是我在网上看到的唯一一个有同样问题的人。 (6认同)
  • `/lib/udev/keymap` 和 `/lib/udev/findkeyboards` 在 13.10 上不再存在。https://forum.ubuntu-fr.org/viewtopic.php?id=1395051 说改用 evtest 。 (2认同)

小智 5

我在 Ubuntu 16.04 上。我在这里做了一个指南

用evtest检测

sudo evtest
Run Code Online (Sandbox Code Playgroud)

查看设备列表:

/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"
Run Code Online (Sandbox Code Playgroud)

拿了第一个“罗技 USB 接收器”,这里它的事件 ID 为 9。

Testing ... (interrupt to exit)
Run Code Online (Sandbox Code Playgroud)

好的,现在 evtest 需要输入,只需单击 Logitech 远程按钮,我得到了这个(简化):

[>] value 7003e (KEY_PRESENTATION)
[>] value 70029 (KEY_PRESENTATION)
[ ] value 70037 (KEY_DISPLAYTOGGLE)
 <  value 7004b (KEY_PAGEUP)
 >  value 7004e (KEY_PAGEDOWN)
Run Code Online (Sandbox Code Playgroud)

注意:我发现在 [>] 上多次单击后会给出 7003e,然后是 70029,然后是 7003e,等等。我不知道为什么。

修改 udev conf

现在我们有了输入代码,让我们看看 udev conf:

sudo gedit /lib/udev/hwdb.d/60-keyboard.hwdb
Run Code Online (Sandbox Code Playgroud)

搜索“R400”并用你想要的、播放暂停停止cd箭头键替换演示和显示切换

# 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"
Run Code Online (Sandbox Code Playgroud)

如前所述,因为 07003e 和 070029 是相同的按钮,所以我给了它们相同的输出向上键。7004b 和 7004e 默认不会出现在这里,可能是因为它们是原生的 PAGEUP 和 PAGEDOWN 输入,与“Logitech Presenter R400”无关。让我们添加它们:

 KEYBOARD_KEY_07004b=previoussong #    top  left  <
 KEYBOARD_KEY_07004e=nextsong     #    top right  >  
Run Code Online (Sandbox Code Playgroud)

这是我的最终确认:

 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"
Run Code Online (Sandbox Code Playgroud)

重新加载(新)规则

sudo udevadm hwdb --update
Run Code Online (Sandbox Code Playgroud)

然后使用我们之前选择的相同事件 ID,这里是事件 ID 9:

sudo udevadm trigger /dev/input/event9
Run Code Online (Sandbox Code Playgroud)

您可以在 Web 浏览器中检查此新映射,例如:

$('body').on('keydown', function(e){ console.log(e.key) })
Run Code Online (Sandbox Code Playgroud)

这给了我:

[>] ArrowUp
[ ] ArrowDown
 <  ArrowLeft
 >  ArrowRight
Run Code Online (Sandbox Code Playgroud)