我有一款 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
尝试一下,这可能更接近您要完成的核心。使用xev
或evtest
,您可以确定鼠标使用的键码,然后告诉 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