如何更改单个设备的键盘映射(Logitech演示者)?


20

我的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,所以我想重新映射PriorBNextN等等。

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


AFAIU“从属指针”表示它是鼠标,而不是键盘。您不能将键盘映射加载到鼠标上。这些真的是xinput列表中唯一存在的设备吗?
Marius Gedminas

@MariusGedminas我必须通过/ dev / input / eventX设备,而event5是演示者,所以它毕竟似乎是一个“键盘”。
htorque 2011年

Answers:


15

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


细节:

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

    sudo /lib/udev/keymap -i input/event5
    

    您可能需要为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
    

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

    现在创建键盘映射文件(我将其存储为/ 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)
    

    现在,按钮应更改亮度。

  • 如果要永久保留该更改,则需要添加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"
      
    3. 保存,关闭,并在重新启动后,按钮应更改亮度。


哦,我怎么能忘记这一点呢(/ lib / udev / keymaps / zepto-znote由我贡献:D)。稍后,我将在您的答案中添加更多有关如何使它起作用的信息。
htorque 2011年

只是想添加到此答案中,您可以通过运行来清零键盘可能出现的“ eventX” /lib/udev/findkeyboards。这将列出所有当前连接的键盘,因此您无需尝试太多。Logitech r400对我来说显示为“ USB键盘:input / event11”。
2012年

好的答案,但是我如何发现要使用的ID_VENDOR和idProduct?我试过了/sys/class/dmi/id/sys_vendor/sys/class/dmi/id/product_name但是没有用。
PutzKipa

2
/lib/udev/keymap并且/lib/udev/findkeyboards不再存在于13.10。forum.ubuntu-fr.org/viewtopic.php?id=1395051说改用evtest。
斯特凡纳·古里科

6
您好@htorque,您能更新新方法的答案吗?在Ubuntu Trusty中,所有这些文件都不再存在。您是我在网上看到的唯一具有相同问题的人。
londumas 2014年

4

我在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 conf

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

sudo gedit /lib/udev/hwdb.d/60-keyboard.hwdb

搜索“ R400”,并用所需的内容,播放暂停停止箭头键替换演示文稿和显示切换

# 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  >  

这是我最后的conf:

 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

我在GitHub的原始logitech-r400-remap.md指南中做了一些小改进。如果需要,请随时更改它们或将它们编辑到您的GitHub网页中(无需归属我)。您的答案被否决了,因为我认为这是仅链接的答案,因此我也取消了该否决。
karel

降级词已被删除,因此您的答案现在有机会像这里的其他答案一样,根据其自身优点进行考虑。
卡雷尔

1
使用了您的指南。像魅力一样工作:)
哥斯达黎加
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.