我在 Ubuntu 18.10 LTS 上运行 Firefox 版本 67。
我有一个罗技M-UAG120鼠标带有滚轮。滚轮有向左和向右推的方法。我需要的是向左推的动作与 Firefox 的 Alt-LEFT 相同,可以返回上一页,而向右推滚轮则相反。目前,Firefox 不会响应任何滚轮推动操作的 X 事件。(我将这些称为“推动操作”,因为这与通过垂直向下推滚轮单击鼠标中键不同,后者可以正常工作)。滚动操作也正常工作。
我跑了軍并确定它正在生成以下 X 事件:
- 左滚轮按压操作:按钮 6
- 右滚轮按压操作:按钮 7
我调查了http://kb.mozillazine.org/About:config但未找到与这些事件有关的具体信息,在网上搜索后仍无所获。
我该如何配置鼠标或 Firefox,让 X 事件保持一致,从而产生相同的行为?如果可能的话,我不想为这个鼠标安装特殊的驱动程序。
更新 #1
在我的 Ubuntu 18.10 LTS 桌面上,有一个罗技 M525 蓝牙鼠标,左右滚轮推动操作产生不同的一组 X 事件比我的笔记本电脑上使用的有线鼠标多,从軍:
- 左滚轮按压操作:按钮 8
- 右滚轮按压操作:按钮 9
并且这款特殊鼠标的左/右滚轮推压操作正如我预期的那样工作。
更新 #2:
我测试了罗技M-UAG120鼠标在两台机器上(我的笔记本电脑和台式机,都运行 Ubuntu 18.10 LTS)再次检查,生成的 X 事件始终一致不同的比罗技 M525 蓝牙鼠标。
我推测特定的 X 事件在不同的鼠标设备上并没有标准化,但这令人惊讶,因为两种鼠标设备都是来自 Logitech。
答案1
解决方案
我找到了以下解决方案:
我补充道/usr/share/X11/xorg.conf.d/71-Logitech-Optical-Tilt-Wheel-Mouse-M-UAG120.conf
:
Section "InputClass"
Identifier "Logitech Optical Tilt Wheel Mouse M-UAG120"
MatchUSBID "046d:c019"
MatchDevicePath "/dev/input/event*"
# I found that using this command:
#
# xinput --set-button-map 10 1 2 3 4 5 8 9 8 9
# ^ ^
# The "^" above are the numbers I changed from 6 and 7 to 8 and 9, respectively.
# That does the same thing as this ButtonMapping below:
#
Option "ButtonMapping" "1 2 3 4 5 8 9 8 9"
EndSection
并重新启动。
令我感到困惑的是,使用sudo service gdm restart
做过不是工作:它阻止我登录(即使我没有打开 CAPSLOCK 或任何其他功能,它仍然会弹回到密码提示),所以我不得不重新启动。
TL;DR 参考资料
我发现有助于理解上述内容的参考资料:
xinput 查找设备id和按钮参数
设备 ID 指的是下面的数字。“按钮参数”指的是文件id=10
中使用的参数的含义。ButtonMapping
/usr/share/X11/xorg.conf.d/71-Logitech-Optical-Tilt-Wheel-Mouse-M-UAG120.conf
插入设备后,使用 grep 查找设备:
$ xinput --list | grep -i logit
⎜ ↳ Logitech USB Optical Mouse id=10 [slave pointer (2)]
看看系统认为这些按钮的含义:
$ xinput --list 10 | grep -i 'Button labels'
Button labels: "Button Left" "Button Middle" "Button Right" "Button Wheel Up" "Button Wheel Down" "Button Horiz Wheel Left" "Button Horiz Wheel Right" "Button Side" "Button Extra" "Button Forward" "Button Back" None
我推测那里的引号字符串是对应于的基于 1 的枚举值ButtonMapping
,但我还没有证据。因此,假设这是正确的,我们可以对它们进行编号:
$ xinput --list 10 | grep -i 'Button labels' | sed 's%: %:\n%g; s%" "%"\n"%g' | sed '1d' | cat -n
1 "Button Left"
2 "Button Middle"
3 "Button Right"
4 "Button Wheel Up"
5 "Button Wheel Down"
6 "Button Horiz Wheel Left"
7 "Button Horiz Wheel Right"
8 "Button Side"
9 "Button Extra"
10 "Button Forward"
11 "Button Back" None
$
这种猜测似乎也符合Logitech_Marble_Mouse -- 基本功能。
因此,ButtonMapping
8 和 9 的位置对应于我希望系统传递给 Firefox X 应用程序的“浏览器后退”和“浏览器前进”操作。由于我想保留所有其他行为,因此文件中的关键行/usr/share/X11/xorg.conf.d/71-Logitech-Optical-Tilt-Wheel-Mouse-M-UAG120.conf
是:
Option "ButtonMapping" "1 2 3 4 5 8 9 8 9"
# ^ ^
(^
仅标记了 6 和 7 个参数被更改)。
按钮映射
libinput(4) 手册页按钮映射部分描述了该机制。
我偶然发现了“libinput”,因为Ubuntu 16.04 和 Logitech M570它指出:
Ubuntu 18.04 默认不再使用 evdev 驱动程序。它已被 Libinput 取代
使用 xinput 命令动态更改按钮映射
输入(1)手册页有一个选项可以直接验证按钮参数,ButtonMapping
而无需重新启动显示管理器或 X 服务器:
--set-button-map device map_button_1 [map_button_2 [...]]
Change the button mapping of device. The buttons are specified in physical order (starting with button 1) and are mapped to the logical button provided. 0 disables a but‐
ton. The default button mapping for a device is 1 2 3 4 5 6 etc.
因此,无需重新启动/重启任何东西,我可以使用的命令是:
$ xinput --set-button-map 10 1 2 3 4 5 8 9 8 9
$
分配按钮
Logitech_Marble_Mouse——分配按钮是 ArchLinux 特定且特定于设备的,但仍然非常有用,特别是它指出:
您可能希望为按钮按下分配新操作。这可以通过设置位置参数来完成。可以更改按钮 1、2、3、8 和 9 的值。(按钮 2 只是两个大按钮的组合按下。)不要更改参数 4、5、6 或 7。
但实际上我确实必须更改我的ButtonMapping
鼠标设备的 6 和 7 个参数。上面没有解释为什么它显示“请勿更改”。
xorg.conf(5) 手册页
xorg.conf(5) 手册页显示了 conf 文件的工作方式,但请注意,由于行为会随着版本的不同而变化,请确保您使用正确的版本,如在其网页顶部所示:
lsusb -d 供应商:设备
运行 lsusb 命令(lsusb(8) 手册页)帮助我识别了供应商和设备ID:
$ lsusb -d 046d:c019
Bus 001 Device 009: ID 046d:c019 Logitech, Inc. Optical Tilt Wheel Mouse
这就是我最终在部分中MatchUSBID
的选项中使用的内容。请参阅InputClass
71-Logitech-Optical-Tilt-Wheel-Mouse-M-UAG120.conf
Govelius 对 Linux 中为多个同时输入设备分配不同布局的问题的解答。
/var/log/Xorg*.log 文件
查找最近修改的/var/log/Xorg.*.log
文件:
$ ls -ladtr /var/log/X*
-rw-r--r-- 1 root root 18922 Mar 17 2017 /var/log/Xorg.failsafe.log.old
-rw-r--r-- 1 root root 18922 Mar 19 2017 /var/log/Xorg.failsafe.log
-rw-r--r-- 1 root root 26019 Jun 8 12:20 /var/log/Xorg.2.log.old
-rw-r--r-- 1 root root 26019 Jun 8 12:21 /var/log/Xorg.2.log
-rw-r--r-- 1 root root 28910 Jun 8 12:45 /var/log/Xorg.0.log.old
-rw-r--r-- 1 root root 38010 Jun 8 12:45 /var/log/Xorg.1.log.old
-rw-r--r-- 1 root root 27869 Jun 8 12:57 /var/log/Xorg.0.log
-rw-r--r-- 1 root root 34901 Jun 8 12:57 /var/log/Xorg.1.log
$
然后通过 grep 命令查看ButtonMapping
是否出现了以下内容:
$ grep -n -B10 -i -H -e 'ButtonMapping' /var/log/Xorg.1.log
/var/log/Xorg.1.log-292-[ 665.912] (**) Logitech USB Optical Mouse: Applying InputClass "libinput pointer catchall"
/var/log/Xorg.1.log-293-[ 665.912] (**) Logitech USB Optical Mouse: Applying InputClass "Logitech Optical Tilt Wheel Mouse M-UAG120"
/var/log/Xorg.1.log-294-[ 665.912] (II) Using input driver 'libinput' for 'Logitech USB Optical Mouse'
/var/log/Xorg.1.log-295-[ 665.912] (II) systemd-logind: got fd for /dev/input/event5 13:69 fd 46 paused 0
/var/log/Xorg.1.log-296-[ 665.913] (**) Logitech USB Optical Mouse: always reports core events
/var/log/Xorg.1.log-297-[ 665.913] (**) Option "Device" "/dev/input/event5"
/var/log/Xorg.1.log-298-[ 665.913] (**) Option "_source" "server/udev"
/var/log/Xorg.1.log-299-[ 665.914] (II) event5 - Logitech USB Optical Mouse: is tagged by udev as: Mouse
/var/log/Xorg.1.log-300-[ 665.914] (II) event5 - Logitech USB Optical Mouse: device is a pointer
/var/log/Xorg.1.log-301-[ 665.914] (II) event5 - Logitech USB Optical Mouse: device removed
/var/log/Xorg.1.log:302:[ 665.914] (**) Option "ButtonMapping" "1 2 3 4 5 8 9 8 9"
$
Logitech Optical Tilt Wheel Mouse M-UAG120
出现以及随后的ButtonMapping
。
InputClass 配置
这libinput(4) 手册页 InputClass 部分描述包括选项在内的所有选项MatchUSBID
。