我使用 10 键鼠标(Logitech M705)。在 X11 下,我能够通过修改etc/X11/xorg.conf.d
.
在 Wayland 的领导下,这不再有效。我的研究表明我需要做一些事情libinput
。我认为这将是一个常见问题,但在任何地方都找不到答案。
有人可以解释如何重新映射鼠标按钮或解释为什么不能这样做吗?
答案1
我花了 2 天的时间进行谷歌搜索,测试了我找到的数十种方法,并努力在 Wayland 下重新映射鼠标按钮......
所以分享我所学到的:
罗技 M570 轨迹球有 2 个额外按钮。他们在 libinput 中生成 BTN_SIDE 和 BTN_EXTRA:
[root@centos8 ~]# libinput debug-events --device /dev/input/event21
-event21 DEVICE_ADDED Logitech M570
seat0 default group1 cap:p left scroll-nat scroll-button
event21 POINTER_BUTTON +16.93s BTN_EXTRA (276) pressed, seat count: 1
event21 POINTER_BUTTON +17.09s BTN_EXTRA (276) released, seat count: 0
event21 POINTER_BUTTON +17.89s BTN_SIDE (275) pressed, seat count: 1
event21 POINTER_BUTTON +17.99s BTN_SIDE (275) released, seat count: 0
您可以使用 evtest 检查它,它也会显示按钮扫描代码:
[root@centos8 ~]# evtest
No device specified, trying to scan all of /dev/input/event*
Available devices:
...
/dev/input/event21: Logitech M570
Select the device event number [0-21]: 21
Event: time 1589974995.415405, -------------- SYN_REPORT ------------
Event: time 1589974996.969613, type 4 (EV_MSC), code 4 (MSC_SCAN), value 90004
Event: time 1589974996.969613, type 1 (EV_KEY), code 275 (BTN_SIDE), value 1
Event: time 1589975000.165574, -------------- SYN_REPORT ------------
Event: time 1589975000.611570, type 4 (EV_MSC), code 4 (MSC_SCAN), value 90005
Event: time 1589975000.611570, type 1 (EV_KEY), code 276 (BTN_EXTRA), value 1
Event: time 1589975002.369616, -------------- SYN_REPORT ------------
现在为 udev hwdb 创建一个规则文件,以将扫描码重新映射到所需的按钮,例如/etc/udev/hwdb.d/70-mouse-remap.hwdb
:
# remap buttons on Logitech M570 trackball
evdev:name:Logitech M570:*
ID_INPUT_KEY=1
KEYBOARD_KEY_90004=btn_middle
KEYBOARD_KEY_90005=btn_middle
是的,按钮是真的映射为键盘按键扫描码回鼠标中键。不要使用太通用的设备标识符,evdev:input:*
因为它可能会干扰您的其他设备,例如在我的 Thinkpad T490 上,它会破坏麦克风静音按钮 (Fn+F4)。
保存文件并重新扫描 hwdb
[root@centos8 ~]# systemd-hwdb update
我还必须从 USB 物理拔下鼠标(在本例中为无线接收器)才能看到变化。将其插回并检查规则是否已应用:
[root@centos8 ~]# udevadm info /dev/input/event21
P: /devices/pci0000:00/0000:00:14.0/usb1/1-4/1-4.4/1-4.4:1.2/0003:046D:C52B.0097/0003:046D:1028.0098/input/input84/event21
...
E: KEYBOARD_KEY_90004=btn_middle
E: KEYBOARD_KEY_90005=btn_middle
现在您可以再次测试 libinput,您应该看到两个按钮都生成 BTN_MIDDLE 事件:
[root@centos8 ~]# libinput debug-events --device /dev/input/event21
-event21 DEVICE_ADDED Logitech M570 seat0 default group1 cap:kp left scroll-nat scroll-button
event21 POINTER_BUTTON +1.45s BTN_MIDDLE (274) pressed, seat count: 1
event21 POINTER_BUTTON +1.59s BTN_MIDDLE (274) released, seat count: 0
event21 POINTER_BUTTON +2.20s BTN_MIDDLE (274) pressed, seat count: 1
event21 POINTER_BUTTON +2.28s BTN_MIDDLE (274) released, seat count: 0
如果一切正常,您应该能够在 Wayland 本机应用程序(如 gnome-terminal)中粘贴两个额外的按钮。
享受。
答案2
现在有一种图形化的方法可以做到这一点。所有的命令行解决方案都会受到伤害。我找到的 GUI 程序称为 Key Mapper,它适用于 X11 和 Wayland。它使用 root 权限并解决所有问题:
- 安装程序,例如来自以下位置的 deb 包发布GitHub 上的页面(或者正如下面的文章中提到的,还有一个用于基于 arch 的发行版的 AUR 包,或者您可以使用 pip)。
- 打开密钥映射器
- 选择您想要的鼠标。
- 点击“点击这里”
- 单击要更改的按钮(如果卡在“按键”上,请首先按照底部弹出窗口中的说明进行“恢复默认值”——应用之前任何映射的更改,“恢复默认值”按钮不会删除它们)。
- 当它接受您的按钮后,按钮的名称将出现在左栏中。然后您可以单击右侧的列并开始输入您希望按钮执行的操作。例如,我希望在上一步中单击的 Logitech Marble Mouse 侧按钮变为中键单击,因此我开始输入“middle”,然后选择“BTN_MIDDLE”。
- 点击“应用”后立即生效!
我通过搜索找到了这个:鼠标按钮映射 gui ubuntu
我找到的文章对此做了更多说明:使用新的按键映射器 GUI 重新映射 Linux 上的键盘和鼠标按钮(支持 X11 和 Wayland)2021 年 2 月 23 日关于 Linux Uprising
答案3
如果您正在运行 Wayland,可以按如下方式重新映射按钮:
运行
xev | grep button
以记录鼠标单击事件并通过在窗口中单击来获取事件的编号。就我而言,中间按钮是:state 0x10, button 2, same_screen YES
我想将其映射到:
state 0x10, button 13, same_screen YES
然后运行
xinput --list
并找到你的指针设备,我的是:Logitech Performance MX id=9 [slave pointer (2)]
xinput get-button-map 9
返回:1 2 3 4 ... 20
xinput 设置按钮映射:
$ xinput set-button-map 9 1 13 3 4 .. 12 2 14 .. 20
笔记:将数字替换9
为返回的数字id=
如果定义了该键的行为,您的事件就会被映射。如果不是,那问题就有点不同了。在 Wayland TBH 下,我还没有找到一种在事件上执行命令的方法(这对于 Xorg 来说非常容易xbindkeys
),因此完全自定义按键和鼠标事件的行为。我相信 Wayland 正在尝试更多安全的并禁用此行为。
无论如何,您仍然有机会轻松切换到 Xorg 并享受其功能。
答案4
尝试修改 hwdb udev 规则。这会将鼠标按钮注册为键盘键(例如 Launch8/F16),并禁用所有程序、wayland 或其他程序中的功能。
# /usr/lib/udev/hwdb.d/71-mouse-local.hwdb
evdev:input:*
KEYBOARD_KEY_90004=key_f16
KEYBOARD_KEY_90005=key_f17
然后以 root 身份systemd-hwdb update; udevadm trigger
拔下鼠标,然后重新插入。
额外的健全性检查:sudo udevadm info /dev/input/by-path/*-usb-*-mouse | grep -A3 -P3 KEYBOARD_KEY
,或像这样查询它,systemd-hwdb query "evdev:input:v046dp406a*
请参阅源代码以获取有关提取 id 的详细信息。
来源:https://yulistic.gitlab.io/2017/12/linux-keymapping-with-udev-hwdb/