我最近购买了 Utechsmart Venus 鼠标:http://www.utechsmart.com/product/show/id/477/US-D16400-GM
我无法将这些侧面按钮(以及鼠标左键附近的“快速射击按钮”)绑定到不同的按键,除非改变侧面按钮和快速射击按钮指向的按键。
原因是我无法真正让 xev 将侧边按钮和快速射击按钮识别为它们自己的事件。相反,当我按下侧边按钮或快速射击按钮时,xev 事件测试器会立即报告按钮映射到的绑定。
即我按下侧面按钮“1”,事件映射器报告:
KeyPress event, serial 74, . . .
KeyRelease event, serial 74 . . .
当我按下鼠标左键时,映射器报告:
ButtonPress event, serial 37, . . .
Button Release event, serial 37, . . .
显然,如果鼠标没有告诉我按钮“地址”是什么,我就无法映射按钮,如以下两个相关帖子所示:
有人能给出建议来进一步尝试找出鼠标上的这些按钮是什么吗?
显然鼠标是可以工作的,只是没有以我喜欢的方式映射到按钮上。因此,在我看来必须来解决这个问题,我非常乐意深入研究来解决这个问题。我一直在查看 Xorg 和 evdev 驱动程序的文档,但我甚至不确定这是否是正确的方向。
不一定非要找人直接帮我解决这个问题。但如果能帮我集思广益,想出一些关于如何解决这个问题的想法,我将不胜感激。
谢谢你的耐心!
更新:
所以我在 archlinux 论坛上找到了一篇关于 razer naga 的帖子,它是一款非常相似的鼠标。看起来很有希望:https://bbs.archlinux.org/viewtopic.php?id=145502。这让我发现了红外遥控器的类似问题:https://www.mythtv.org/wik147+853!#@#+!i/Generic_HID_%22MCE%22_Remotes#XKB_Remapping。那里有大量信息深入探讨了这个问题。如果他们能更好地解释如何确定脚本中的“键”是什么,那就太好了,但在阅读了大量补充材料后,似乎 <AE[01/12]> 是出于惯例(而且由于鼠标上的按钮与这些键映射相对应,所以这更有意义了……
但是,我还是遇到了一点问题。我还没有创建 shebang,而是尝试手动运行命令。
首先,我创建了符号文件 /usr/share/X11/xkb/symbols/custom(我不太清楚他们为什么使用 tmp 目录)并包含以下内容:
xkb_symbols "venus" {
2 key <AE01> { [ y, Y ]
3 key <AE02> { [ i, I ]
4 key <AE03> { [bracketleft, braceleft ]
5 key <AE04> { [bracketright, braceright ]
6 key <AE05> { [ slash, question ]
7 key <AE06> { [ j, J ]
8 key <AE07> { [ k, K ]
9 key <AE08> { [ l, L ]
10 key <AE09> { [ semicolon, colon ]
11 key <AE10> { [ comma, less ]
12 key <AE11> { [ minus, underscore ]
13 key <AE12> { [ equal, plus ]
14 };
然后我运行了 xinput list,结果如下:
⎡ Virtual core pointer id=2 [master pointer (3)]
⎜ ↳ Virtual core XTEST pointer id=4 [slave pointer (2)]
⎜ ↳ USB Laser Game Mouse id=9 [slave pointer (2)]
⎜ ↳ USB Laser Game Mouse id=11 [slave pointer (2)]
⎜ ↳ EST Gaming keyboard 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)]
↳ Power Button id=7 [slave keyboard (3)]
↳ Sleep Button id=8 [slave keyboard (3)]
↳ USB Laser Game Mouse id=10 [slave keyboard (3)]
↳ EST Gaming keyboard id=12 [slave keyboard (3)]
↳ EST Gaming keyboard id=14 [slave keyboard (3)]
↳ C-Media Electronics Inc. USB Audio Device id=15 [slave keyboard (3)]
↳ USB Laser Game Mouse id=16 [slave keyboard (3)]
↳ EST Gaming keyboard id=17 [slave keyboard (3)]
分析了上面两个链接中写的脚本后,我推断我的 $remote_id 变量应该是 16,因此我运行了以下命令:
setxkbmap -device 16 -print | sed's/\(xkb_symbols.*\)"/\1+custom(venus)"/' | xkbcomp -I /usr/share/X11/xkb -i 16 -synch $DISPLAY
我没有将输出导入到 /dev/null,因为我想看看输出会是什么(显然,当我编写脚本时,我会这样做,但我正在尝试了解我目前正在做什么)。我的输出如下:
Warning: Too many file names on command line
Compiling /usr/share/X11/xkb, writing to -, ignoring :0
syntax error: line 1 of /usr/share/X11/xkb
last scanned symbol is:
Errors encountered in /usr/share/X11/xkb; not compiled.
我真的不知道接下来该去哪儿……
答案1
大家好消息!
我终于能够让它工作了。很久以前,我就放弃了这个问题,开始着手处理事情。从那时起,我学到了很多关于编程和 unix 环境的知识,包括了解如何使用这个脚本中使用的 sed。举个例子,当我提出这个问题时,我甚至不知道手册页。不用说,当我发表这篇文章时,很容易看出我的一些错误。
但是,修复这些错误并不足以解决问题。无论出于什么原因(我仍然无法弄清楚),将键映射导入 xkbcomp 最终不会编译我想要在上面的符号文件中进行的更改。
但是,如果我只是运行:
setxkbmap -device $venus_keyboard -print | sed 's/\(xkb_symbols.*\)"/\1+venus"/' > keymap
xkbcomp keymap -i $venus_keyboard -synch $DISPLAY
按键编译得很好。老实说,我仍然不明白为什么我不能直接将 sed 的输出导入 xkbcomp,但这确实映射了我鼠标上的按键,而键盘上的按键完全不受影响。
希望这能对遇到与我类似问题的人有所帮助。
下面是我编写的整个 shell 脚本(除了符号文件,该文件已在我提供的链接的帖子中解释过)。
如果有人能解释为什么将 sed 的输出导入 xkbcomp 不起作用(或者有兴趣帮助我解决这个问题),请在这里回复我。这仍然让我有点烦。
#!/bin/sh
venus_keyboard=$(xinput list | sed -n 's/.*USB Laser Game Mouse[[:space:]]*id=\([0-9]*\).*keyboard.*/\1/p')
[ "$venus_keyboard" ] || exit
setxkbmap -device $venus_keyboard -print | sed 's/\(xkb_symbols.*\)"/\1+venus"/' > ~/xkb/keymap
xkbcomp ~/xkb/keymap -i $venus_keyboard -synch $DISPLAY 2>/dev/null
答案2
我妻子的鼠标和这个非常相似。我对您的解决方案做了一些调整。该文件/usr/share/X11/xkb/symbols/venus
包含以下内容:
xkb_symbols "venus" {
key <AE01> { [ KP_1 , KP_1 ] };
key <AE02> { [ KP_2 , KP_2 ] };
key <AE03> { [ KP_3 , KP_3 ] };
key <AE04> { [ KP_4 , KP_4 ] };
key <AE05> { [ KP_5 , KP_5 ] };
key <AE06> { [ KP_6 , KP_6 ] };
key <AE07> { [ KP_7 , KP_7 ] };
key <AE08> { [ KP_8 , KP_8 ] };
key <AE09> { [ KP_9 , KP_9 ] };
key <AE10> { [ F2 , F2 ] };
key <KPAD> { [ XF86Calculator, XF86Calculator ] };
key <KPSU> { [ period , period ] };
};
~/bin/mouse_config.sh
我添加到 MATE 桌面环境启动中的脚本有以下内容:
#!/bin/sh
venus_keyboard=$(xinput list | sed -n 's/.*USB Gaming Mouse[[:space:]]*id=\([0-9]*\).*keyboard.*/\1/p')
[ "$venus_keyboard" ] || exit
setxkbmap -device $venus_keyboard -print | sed 's/\(xkb_symbols.*\)"/\1+venus"/' > ~/.venus_keymap
xkbcomp ~/.venus_keymap -i $venus_keyboard -synch $DISPLAY
你会注意到我需要对名称进行一些调整USB Gaming Mouse
,除此之外,一切都很完美。
她正在用它做搅拌机。
啊,但是也许有人知道如何关闭这只鼠标上的 LED 灯?