映射额外的 mmo 鼠标侧键

映射额外的 mmo 鼠标侧键

我最近购买了 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, . . . 

显然,如果鼠标没有告诉我按钮“地址”是什么,我就无法映射按钮,如以下两个相关帖子所示:

如何配置 Logitech 鼠标中的额外按钮

Kubuntu 中的鼠标快捷键与键盘按键混淆

有人能给出建议来进一步尝试找出鼠标上的这些按钮是什么吗?

显然鼠标是可以工作的,只是没有以我喜欢的方式映射到按钮上。因此,在我看来必须来解决这个问题,我非常乐意深入研究来解决这个问题。我一直在查看 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 灯?

相关内容