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

Kyl*_*yle 13 mouse wayland libinput

我使用 10 键鼠标 (Logitech M705)。在 X11 下,我能够通过修改etc/X11/xorg.conf.d.

在 Wayland 下,这不再有效。我的研究表明我需要对libinput. 我认为这将是一个常见问题,但在任何地方都找不到答案。

有人可以解释如何重新映射鼠标按钮或解释为什么不能这样做吗?

MIc*_*ael 20

我花了 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
Run Code Online (Sandbox Code Playgroud)

您可以使用 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 ------------
Run Code Online (Sandbox Code Playgroud)

现在为 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
Run Code Online (Sandbox Code Playgroud)

是的,按钮确实被映射为键盘按键扫描码回鼠标中键。不要使用太通用的设备标识符,evdev:input:*因为它可能会干扰您的其他设备,例如在我的 Thinkpad T490 上,它会破坏麦克风静音按钮 (Fn+F4)。

保存文件并重新扫描 hwdb

[root@centos8 ~]# systemd-hwdb update
Run Code Online (Sandbox Code Playgroud)

我还必须从 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
Run Code Online (Sandbox Code Playgroud)

现在您可以再次测试 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
Run Code Online (Sandbox Code Playgroud)

如果一切正常,您应该能够在 Wayland 本机应用程序(如 gnome-terminal)中粘贴两个额外的按钮。

享受。


小智 13

现在有一种图形化的方法可以做到这一点。所有的命令行解决方案都会受到伤害。我找到的 GUI 程序称为 Key Mapper,它适用于 X11 和 Wayland。它使用 root 权限并解决所有问题:

  • 从 GitHub 上的发布页面安装 deb 包等程序(或者如下文所述,还有一个用于基于 arch 的发行版的 AUR 包,或者您可以使用 pip)。
  • 打开密钥映射器
  • 选择您想要的鼠标。
  • 点击“点击这里”
  • 单击要更改的按钮(如果卡在“按键”上,请首先按照底部弹出窗口中的说明进行“恢复默认值”——应用之前任何映射中的更改,“恢复默认值”按钮不会删除它们)。
  • 当它接受您的按钮后,按钮的名称将出现在左栏中。然后您可以单击右侧的列并开始输入您希望按钮执行的操作。例如,我希望在上一步中单击的 Logitech Marble Mouse 侧按钮变为中键单击,因此我开始输入“middle”,然后选择“BTN_MIDDLE”。
  • 点击“应用”后立即生效!

我通过搜索找到了这个:鼠标按钮映射 gui ubuntu

我找到的文章对此做了更多介绍:Remap Keyboard And Mouse Buttons On Linux With The New Key Mapper GUI (Supports X11 And Wayland) February 23, 2021 on Linux Uprising

  • 现在它被称为输入重新映射器,并且在 Ubuntu 22.04 软件源中可用。 (3认同)

小智 10

如果您正在运行 Wayland,则可以像这样重新映射按钮:

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

    state 0x10, button 2, same_screen YES
    
    Run Code Online (Sandbox Code Playgroud)

    我想把它映射到:

    state 0x10, button 13, same_screen YES
    
    Run Code Online (Sandbox Code Playgroud)
  2. 然后运行xinput --list并找到您的指针设备,我的是:

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

    1 2 3 4 ... 20
    
    Run Code Online (Sandbox Code Playgroud)
  4. xinput 设置按钮映射:

    $ xinput set-button-map 9  1 13 3 4 .. 12 2 14 .. 20
    
    Run Code Online (Sandbox Code Playgroud)

注意:替换9返回的号码的号码id=

如果该键的行为已定义,则您的事件将被映射。如果不是,那是一个有点不同的问题。在 Wayland TBH 下,我还没有找到对事件执行命令的方法(这对于 Xorg 来说很容易xbindkeys),因此完全自定义键和鼠标事件的行为..我相信 Wayland 正在努力提高安全性并禁用此行为.

无论如何,您仍然有机会轻松切换到 Xorg 并享受其功能。

  • 这只会更改 xorg 输入驱动程序,不会更改任何本机使用 wayland 组合的应用程序,例如 Gnome Shell 或 Nautilus (3认同)

小智 5

我制作了一个小的 shell 脚本 + systemd 单元文件,我称之为wayland-mouse-mapper

摘录mathportillo/wayland-mouse-mapper

用于将鼠标按钮映射到 Wayland 上的击键的小脚本。

我为自己制作了使用我的鼠标额外按钮来获取有用的东西。它已经过测试,可在 Fedora 27 上使用 Gnome 与 Logitech MX Master 2S 一起使用,也可以在我的旧 Logitech Performance MX 上使用。它可能适用于任何 Wayland 和任何 Logitech 鼠标(或任何鼠标,如果您编辑映射),因为似乎没有其他方法(xdotools、xbindkeys 等)有效。

它的工作原理是从 libinput 调试事件中读取,并根据已识别设备的已识别按钮使用 evemu 触发关键事件。

纽扣

这些只是默认设置,您可以在 mousemapper.sh 脚本的开头自定义它们。

  • 前进:移至上方的工作区 ( Super+ Page up)
  • 返回:移至下方的工作区 ( Super+ Page down)