![鼠标 [Razer Naga] 上的按钮映射问题](https://linux22.com/image/62850/%E9%BC%A0%E6%A0%87%20%5BRazer%20Naga%5D%20%E4%B8%8A%E7%9A%84%E6%8C%89%E9%92%AE%E6%98%A0%E5%B0%84%E9%97%AE%E9%A2%98.png)
我目前在尝试映射我的 Razer Naga 那伽梵蛇上的侧面按钮时遇到问题,我正在运行 Elementary OS,但据我所知,这是一个 Ubuntu,我应该补充一点,这对我来说也是非常新的!
Naga的侧面有12个按钮,目前映射为1-12。有一个选项可以将这些更改为数字键盘映射(可通过鼠标本身的物理开关进行配置),这可以解决我的问题,但无意中导致我的右键单击在 60% 的情况下失败。
我还应该提到,我在两台完全不同的机器上但使用相同的物理鼠标时遇到了相同的情况。
我的最终目标是将至少 3 个按钮 (1-3) 绑定到其他按钮,为了便于讨论,我们假设为 F1、F2 和 F3。
到目前为止,我已经做了很多谷歌搜索,但是当其他人解决了这个问题时,我注意到一个关键的区别是我的xinput
输出的差异:
⎡ Virtual core pointer id=2 [master pointer (3)]
⎜ ↳ Virtual core XTEST pointer id=4 [slave pointer (2)]
⎜ ↳ SynPS/2 Synaptics TouchPad id=12 [slave pointer (2)]
⎜ ↳ Razer Razer Naga id=14 [slave pointer (2)]
⎜ ↳ Razer Razer Naga id=13 [slave pointer (2)]
⎣ Virtual core keyboard id=3 [master keyboard (2)]
↳ Virtual core XTEST keyboard id=5 [slave keyboard (3)]
↳ Power Button id=6 [slave keyboard (3)]
↳ Video Bus id=7 [slave keyboard (3)]
↳ Power Button id=8 [slave keyboard (3)]
↳ Lenovo EasyCamera id=9 [slave keyboard (3)]
↳ Ideapad extra buttons id=10 [slave keyboard (3)]
↳ AT Translated Set 2 keyboard id=11 [slave keyboard (3)]
在其他人的输出中,我注意到指针部分有一个“Razer Naga”,键盘部分有一个。正如您在我的中看到的,仅在指针部分列出了两个。
其他决议建议运行一个脚本来替换键盘输入的键映射,我认为这对我不起作用。
我尝试使用xev
来显示按下其中一个按钮时发生的情况,但这并没有真正帮助我。下面是我单击鼠标左键的示例:
ButtonRelease event, serial 37, synthetic NO, window 0x3a00001,
root 0x9d, subw 0x3a00002, time 16486037, (24,50), root:(618,357),
state 0x100, button 1, same_screen YES
现在侧面神秘的“1”按钮:
KeyPress event, serial 37, synthetic NO, window 0x3a00001,
root 0x9d, subw 0x3a00002, time 16536943, (31,58), root:(625,365),
state 0x0, keycode 10 (keysym 0x31, 1), same_screen YES,
XLookupString gives 1 bytes: (31) "1"
XmbLookupString gives 1 bytes: (31) "1"
XFilterEvent returns: False
KeyRelease event, serial 37, synthetic NO, window 0x3a00001,
root 0x9d, subw 0x3a00002, time 16537199, (31,58), root:(625,365),
state 0x0, keycode 10 (keysym 0x31, 1), same_screen YES,
XLookupString gives 1 bytes: (31) "1"
XFilterEvent returns: False
此时我真的不知道该从哪里继续(我什至不知道 xinput 中列出的两个设备中哪一个是映射到按钮的设备),因此任何建议或指示将不胜感激!
答案1
我不完全理解这种情况(并不是说你没有很好地解释它),但我遇到了 Naga 映射问题,在网上找不到解决方案后,我决定尝试一下并实际让它工作。
问题是,即使您的系统将设备标记为指针而不是键盘,也许我的解决方案也适合您。尝试一下并让我知道!
我的解决方案可能不是最好的,但它确实对我有用。我用 C++ 编写了一个小守护程序,并将其放入 github 存储库中,您可以从中下载和安装这里
这个想法是实现以下三个步骤:
使用以下命令使设备静音,以便按钮“不执行任何操作”:
$xinput set-int-prop <id> "Device Enabled" 8 0
xinput 中看到的键盘 id 在哪里(在您的情况下可能是 13?)
捕获按下按钮触发的事件。我通过从事件设备节点获取原始输入来完成此操作。使用C++,一些sys linux库和input.h。你可以看看如何在谷歌中做到这一点(我不能发布两个以上的链接,但在reddit链接中你有一个带有解释这一点的页面的链接)。这种方法的好处是,只要 xinput 看到它,您就可以从任何设备捕获数据(xinput 是否认为它是一个指针并不重要,只要它有按钮并且 xinput 有一个 id 我相信)这种方法会起作用,但不要引用我的话)。
使用 C++ system() 调用和 xdotool(您可以从官方 ubuntu 存储库安装)来模拟按键(请注意,system() 调用允许您运行任何类型的系统实用程序或自定义脚本)。有关更多信息,请参阅 xdotool 的手册页,但最好的部分是使用 xdotool 和“--window getactivewindow”,模拟的按键操作发生在当前聚焦的窗口中!
这里进一步解释一下: http://www.reddit.com/r/razer/comments/37yc3y/tutorial_remapping_naga_side_keyboard_numpad_in/
我建议您查看 github 存储库,因为它包含有关我所做的一切的信息。而且源代码(只有大约 100 行)很容易推断到其他设备或情况。如果您有 Naga 和 ubuntu,您可能只需要使用安装程序,一切都会自动设置。
对于提出问题的人来说,如果运气好的话,可以在文件“nagastart.sh”中手动指定键盘设备的 ID 来完成这项工作。只换一根线。 (当前脚本在键盘设备下搜索 Naga)。
我希望这是足够的信息,如果没有,我会很乐意解释我能解释的一切。 (这不是很多)
顺便说一句,它不是很万无一失,所以如果你使用错误的设备 ID 安装它,你会得到意想不到的行为(比如如果键盘 id=13 而你输入 id=14,鼠标点击会做一些有趣的事情),但是不担心。只需打开一个终端并杀死所有纳迦。为了删除所有更改运行
$sudo rm /usr/local/bin/naga ~/.config/autostart/naga.desktop /usr/local/bin/nagastart.sh
祝你好运!