将额外的鼠标按钮配置为 Wayland 下的第二次中键单击

将额外的鼠标按钮配置为 Wayland 下的第二次中键单击

我使用 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,可以按如下方式重新映射按钮:

  1. 运行xev | grep button以记录鼠标单击事件并通过在窗口中单击来获取事件的编号。就我而言,中间按钮是:

    state 0x10, button 2, same_screen YES
    

    我想将其映射到:

    state 0x10, button 13, same_screen YES
    
  2. 然后运行xinput --list并找到你的指针设备,我的是:

    Logitech Performance MX  id=9  [slave pointer  (2)]
    
  3. xinput get-button-map 9返回:

    1 2 3 4 ... 20
    
  4. 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/

相关内容