使用 xbindkeys 将鼠标按钮绑定到另一个鼠标按钮 - XEV 出现错误

使用 xbindkeys 将鼠标按钮绑定到另一个鼠标按钮 - XEV 出现错误

我有一款 Logitech M720 鼠标,希望将侧面按钮(通常是翻页)绑定到中间单击按钮 - 这是我在 Windows 上使用 Logitech Options 完成的。

经过研究,我发现我需要通过xbindkeys和来完成xautomation

我测试了按键xev,发现侧面按钮是button 9,中间滚轮按钮是button 2

然后我制作了.xbindkeysrc如下文件:

"xte 'mouseclick 2'"
  b:9

然而,在重新轮询 rc 文件之后xbindkeys,我的系统上的任何地方都无法识别键绑定,并且进行测试xev返回了一个奇怪的结果:

按下按钮 9 的通常结果

ButtonPress event, serial 37, synthetic NO, window 0x4a00001,
    root 0x1dd, subw 0x0, time 38400097, (160,106), root:(160,169),
    state 0x0, button 9, same_screen YES

ButtonRelease event, serial 37, synthetic NO, window 0x4a00001,
    root 0x1dd, subw 0x0, time 38400237, (160,106), root:(160,169),
    state 0x0, button 9, same_screen YES

修改 XBINDKEYSRC 文件后的结果(按钮 9)

KeymapNotify event, serial 37, synthetic NO, window 0x0,
    keys:  4294967261 0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   
           0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   

即使清除我的.xbindkeysrc文件后,输出仍然相同,并且只有在终端中killall xbindkeys输入并重新启动后才会恢复正常。xbindkeys

我找到了这个此主题有一个潜在的解决方案,但不幸的是对我来说不起作用。

例如,将按钮按下绑定到其他任何东西都"xte 'key a'"可以按预期工作。

有人可以指出我可能做错了什么吗?

干杯。

答案1

绑定键

我认为你需要为每个快捷方式添加第三行。也许这不是必须的,但我正在查看我设置的示例:

"pactl set-sink-volume @DEFAULT_SINK@ +5%"
    m:0x4 + c:112
    Control + Prior

"pactl set-sink-volume @DEFAULT_SINK@ -10%"
    m:0x4 + c:117
    Control + Next

# xautomation package
# Print Date
'"xte "keyup Super_L" "keyup Insert" "str `date +%Y.%m.%d`" "usleep 10" "keydown Super_L""'
    m:0x40 + c:118
    Mod4 + Insert

因此,我的每个条目都有第三行,用于定义快捷键。此外,我们必须自己释放按下的键,通常是在运行命令之前。Shift 会让情况变得更加复杂,因为我发现释放 Shift 会导致问题。


xmodmap(用户特定)

通常,xbindkeys用于复杂的绑定,或运行脚本/命令。您可以modmap尝试一下,这可能更接近您要完成的核心。使用xevevtest,您可以确定鼠标使用的键码,然后告诉 X 将其解释为另一个键码。

~/.Xmodmap

keycode 97 = Control_R NoSymbol Control_R

~/.xinitrc

[[ -f ~/.Xmodmap ]] && xmodmap ~/.Xmodmap

这告诉 X 如何处理键码97(随机,非鼠标)正常按下或使用修饰符(Shift、Alt 等)时。您需要在 中进行映射~/.Xmodmap并通过 加载它$ modmap ~/.Xmodmap,通常与 X 一起加载,因此在 中~/.xinitrc比 在 中evtest“更好”,xev因为它可以帮助您找到要测试的设备,而不是让您在系统中摸索着在/dev列表中找到它。


udev(系统范围)

另一个解决方案是使用udev/ evdev,让系统执行此转换,无论您是否/何时启动 X,以及设备的每个连接。这有点复杂,但一旦您习惯了某些设置,您就可以在这里迁移它们。

自定义规则位于/etc/udev/hwdb.d/ 这是硬件数据库 [配置] 目录中。这些规则按顺序加载,因此文件通常以两位数字作为前缀,但这仅在后续规则覆盖先前规则时才重要。这是按 USB 总线、设备和供应商 ID 列出的设备列表。此方法是理想的,因为您可以重新映射特定键盘的按键,而不是所有键盘。

/etc/udev/hwdb.d/99-myMouse.hwdb

evdev:input:bIDvIDpID1*
  KEYBOARD_KEY_210=menu

evdev:input:bIDvIDpID2*
  KEYBOARD_KEY_210=menu

此示例查找了两个输入设备,它们位于同一 USB 总线上,来自同一供应商,但 ID 不同。它们都将键码 210 映射到菜单按钮。您也可以通过这种方式学习重新映射鼠标上的按键。

系统将hwdb在另一个目录中包含文件/usr/lib/udev/hwdb.d。这些文件不应被编辑,但您可以将其用作示例来提供帮助。

进行更改后,需要更新数据库:

sudo systemd-hwdb update

相关内容