鼠标按键
本文介绍如何配置具有 3 个以上按钮的鼠标。
在 X 中进行先决条件鼠标输入测试
本页面假定您正在使用 Xorg (X Window System) 而不是 Wayland。
您首先需要检查 X 从鼠标中看到的内容。X 事件可以通过 xev 实用程序显示。运行以下命令会弹出一个窗口
$ xev -event button | grep button
任何 xevents(例如移动、调整大小或在窗口中单击)都将报告给您启动 xev 的控制台。由于您正在过滤包含“button”的行,它将显示鼠标单击和释放事件及其相关的按钮编号。对于大多数鼠标,这将是 '1' 代表左键,'2' 代表中键,'3' 代表右键。其他按钮将有所不同(例如,对于 Logitech MX Master 3,滚轮是 4 和 5,拇指轮是 6 和 7,拇指尖按钮是 9,内拇指按钮是 8)。
示例输出
state 0x0, button 1, same_screen YES state 0x100, button 1, same_screen YES state 0x0, button 9, same_screen YES state 0x0, button 9, same_screen YES
这对应于鼠标左键单击和释放,然后是拇指尖单击和释放。
您可以使用 xev 来确认鼠标按钮编号,并确认 X 已收到鼠标单击的通知。
重新绑定鼠标和键盘功能
本节介绍使用各种工具重新排列鼠标和键盘功能的详细信息。
将鼠标按键绑定到键盘功能
xte
当我们想要将键盘按钮绑定到鼠标时,来自 xautomation 的 xte 非常方便。
这是一个 ~/.xbindkeysrc
示例,它将 Shift_R
绑定到鼠标按钮 3(“右键单击”)
~/.xbindkeysrc
"xte 'mouseclick 3'" Shift_R
将键盘按键绑定到鼠标按键
xvkbd 和 xbindkeys
假设我们想要将一些鼠标按钮绑定到键盘按钮。我们将遇到的问题是我们不知道如何模拟按键。这里 xvkbdAUR 派上了用场。我们可以将其与 xbindkeys 一起使用。
$ xbindkeys --defaults >> ~/.xbindkeysrc $ xbindkeys
要重启 xbindkeys,请输入
$ pkill -f xbindkeys $ xbindkeys
这是一个 ~/.xbindkeysrc
配置示例
"xvkbd -text "\[F8]"" m:0x0 + b:8 "xvkbd -text "\[Shift]\[Left]"" m:0x0 + b:9 "xvkbd -text "\[Shift]\[Right]"" m:0x0 + b:10 "xvkbd -text 2" m:0x0 + b:11 "xvkbd -text 3" m:0x0 + b:12
如果您想检查鼠标按钮编号,请使用 xev。不要忘记在 xvkbd -text 用法中输入大写字母,并使用 \ 转义左方括号,否则您只会得到 [Shift]。
这是一个 xbindkeys 的示例,用于启用 x 选择粘贴(第三次单击粘贴),您需要安装 xsel 和 xvkbd。它的作用是在每次按下鼠标按钮 13 时执行该命令(在 ~/.xbindkeysrc 中)
"xvkbd -no-jump-pointer -text "\D1$(xsel)" 2>/dev/null" b:13
这是一个 Meta+M 的按键绑定示例
"xvkbd -text "\{+Super_L}m\{-Super_L}"" b:10
evrouter
一些程序,尤其是游戏,使用不同的输入读取方法,因此需要另一个程序:evrouterAUR。
为了使 evrouter
命令能够读取输入设备,它必须在 input
组中运行(或以 root 身份运行)。这可以通过将您自己添加到该组来实现
# gpasswd -a user input
现在我们可以使用 --dump
选项来显示要更改的按钮的名称
/dev/input/by-id/
中创建符号链接,这些链接可用于引用特定设备。$ evrouter --dump /dev/input/event*
device 0: /dev/input/event0: AT Translated Set 2 keyboard device 1: /dev/input/event1: Microsoft Microsoft Trackball Explorer® device 2: /dev/input/event2: Sleep Button device 3: /dev/input/event3: Power Button device 4: /dev/input/event4: Power Button device 5: /dev/input/event5: PC Speaker Display name: :0.0
现在按下您想要更改的按钮
Window "(null)": # Window title # Window "(null)": # Resource name # Window "(null)": # Class name "Microsoft Trackball Explorer®" "/dev/input/event1" none key/275 "fill this in!" Window "(null)": # Window title # Window "(null)": # Resource name # Window "(null)": # Class name "Microsoft Trackball Explorer®" "/dev/input/event1" none key/276 "fill this in!"
以 “fill this in!” 结尾的行可以复制到配置文件中,默认情况下是 ~/.evrouterrc
。例如,使用 evrouter 内置的 X11 键盘事件模拟器
~/.evrouterrc
"Microsoft Trackball Explorer®" "/dev/input/event*" any key/275 "XKey/1" "Microsoft Trackball Explorer®" "/dev/input/event*" any key/276 "XKey/2"
“event1” 已更改为 “event*”,以防 udev 在启动时为其提供不同的设备编号。“none” 已更改为 “any”,以便即使在按下按钮时按下了任何修饰键,该规则也有效。要确定键代码(在括号中),您可以使用
# xmodmap -pk
有关字段的完整说明,请参阅 evrouter(1)。
设置配置文件后,将其作为守护程序运行
$ evrouter /dev/input/event*
要停止守护程序
$ evrouter -q $ rm -f /tmp/.evrouter*
/tmp/.evrouter:0.0
文件存在但在退出时未删除,则 evrouter
将无法启动,因此您必须自行删除它。用户工具
本节概述了特定于硬件的工具,这些工具对于配置鼠标设置(尤其是其按钮)非常有用。对于通用重映射工具,请参阅 输入重映射实用程序。
- Piper (piper) 是用于配置游戏鼠标的图形用户界面,可与 Wayland 一起使用。为了与您的鼠标一起使用,它必须在 受支持设备列表 中。
- lomocoAUR 用于 Logitech MX 鼠标,将帮助您设置适当的分辨率、启用或禁用智能滚动(也支持启动时支持!),等等。请务必查看
/etc/udev/lomoco_mouse.conf
并设置您希望在鼠标由 udev 加载时自动应用的选项。注意: lomoco 软件包可能已过时。有一个用于较新的 Logitech 鼠标的 hack:[1] - logiopsAUR 是用于配置 Logitech 鼠标的工具(Linux 版 Logitech Options)。它可以将按钮重新映射到操作、支持手势、智能切换等等。
evdev Xorg.conf 设置
本节介绍如何使用 evdev
设置具有 3 个以上按钮的鼠标。还有其他方法可以实现此目的,但此处描述的一些注释和工具可能对有其他需求的人有用。某些部分可能有助于在使用其他驱动程序时使额外的鼠标按钮工作。
我们将使用用于 Xorg 的 evdev 驱动程序。EVentDEVice 是用于 USB 输入设备的高级驱动程序,它比标准 Xorg mouse
驱动程序提供更大的功率。它也比 mouse
驱动程序更 “直接”,从而允许更低的延迟和更少的转换问题。
- 请注意,
evdev
既是内核模块又是 Xorg 输入驱动程序。所有 Arch 内核都带有evdev
模块。
对于 Xorg 11R7.0 或更高版本,只需要对 /etc/X11/xorg.conf
进行以下更改。
查找鼠标名称
第一步是找到鼠标的名称。为此,请执行以下命令
$ grep -E "Name|Handlers" /proc/bus/input/devices | grep -E -B1 'Handlers.*mouse'
这应该输出类似这样的内容
N: Name="Logitech USB Gaming Mouse" H: Handlers=mouse0 event0 ts0
或者如果您有多个鼠标,则输出类似这样的内容
N: Name="Kensington Kensington Expert Mouse Wireless" H: Handlers=event0 mouse0 -- N: Name="Logitech USB Receiver" H: Handlers=kbd event2 mouse1
鼠标是具有 Handlers=mouse0
的那个,因此设备的名称是 Logitech USB Gaming Mouse
。
Name
会有所不同。复制设备名称,然后打开 /etc/X11/xorg.conf
。
配置 Xorg
现在,我们需要在 xorg.conf
中添加一个条目,告诉 X 如何使用此鼠标。它应该看起来像这样
Section "InputDevice" Identifier "Evdev Mouse" Driver "evdev" Option "Name" "Logitech USB Gaming Mouse" Option "evBits" "+1-2" Option "keyBits" "~272-287" Option "relBits" "~0-2 ~6 ~8" Option "Pass" "3" Option "CorePointer" EndSection
将 Name
选项替换为您从上面复制的名称。如果您使用多个鼠标或在尝试加载 Xorg 时遇到错误,也可以省略 CorePointer
选项。其他选项都是 evdev 的基本鼠标配置,应该适用于大多数鼠标。
接下来,我们需要告诉 X 使用鼠标,因此请在 xorg.conf
中查找 ServerLayout
。
修改 ServerLayout
部分以使用 “Evdev Mouse” 作为设备。完成后,它应该看起来像这样
Section "ServerLayout" Identifier "Default Layout" Screen 0 "Monitor0" 0 0 InputDevice "Keyboard0" "CoreKeyboard" InputDevice "Evdev Mouse" "CorePointer" EndSection
您应该在布局中更改的唯一内容是引用鼠标的 InputDevice
行。
这应该是所有需要的。
- 编辑者:xxsashixx
这是为 Logitech G5 鼠标用户准备的。我没有在其他鼠标上测试过,但是如果您不添加此项,您的鼠标可能无法工作。如果您不需要添加此项,则不要添加。
放入
Option "Device" "/dev/input/event[#]"
在 InputDevice
部分中,否则鼠标将不会被识别。
[#] = 您从以下位置获得的数字
grep -E "Name|Handlers" /proc/bus/input/devices
- 编辑者:bapman
使用上述方法,您的鼠标可能在重启后无法工作(事件编号更改)。要解决此问题,您可以使用 /dev/input/by-id
中的符号链接。例如
Option "Device" "/dev/input/by-id/usb-Logitech_USB_Receiver-event-mouse"
要查找适当的 id,请执行
ls /dev/input/by-id/
- 编辑者:Diamir
使用桌面式键盘鼠标时,这不起作用,因为只有一个 USB 连接,并且 /dev/input/by-id
仅包含键盘。在这种情况下,我们可以创建一个 udev 规则来获得一致的链接。以下规则创建链接 /dev/input/usbmouse
,该链接指向正确的事件条目
KERNEL=="event[0-9]*", BUS=="usb", SYSFS{modalias}=="usb:v045Ep008Ad7373dc00dsc00dp00ic03isc00ip00", SYMLINK+="input/usbmouse"
您可以将其命名为 z10_usb_mouse.rules
并将其放在 /etc/udev/rules.d
中
用于 SYSFS(modalias)
的神秘值可以通过以下方式获得
输入命令 cat /proc/bus/input/devices
您将找到键盘和鼠标,并看到在这种情况下 event4 是鼠标
I: Bus=0003 Vendor=045e Product=008a Version=0111 N: Name="Microsoft Microsoft Wireless Optical Desktop� 1.00" P: Phys=usb-0000:00:10.0-2/input0 S: Sysfs=/devices/pci0000:00/0000:00:10.0/usb1/1-2/1-2:1.0/input/input3 U: Uniq= H: Handlers=kbd event0 B: EV=120013 B: KEY=1000000000007 ff800000000007ff febeffdff3cfffff fffffffffffffffe B: MSC=10 B: LED=107
I: Bus=0003 Vendor=045e Product=008a Version=0111 N: Name="Microsoft Microsoft Wireless Optical Desktop� 1.00" P: Phys=usb-0000:00:10.0-2/input1 S: Sysfs=/devices/pci0000:00/0000:00:10.0/usb1/1-2/1-2:1.1/input/input4 U: Uniq= H: Handlers=kbd mouse0 event1 B: EV=17 B: KEY=3000000000000 0 1f0000 f8400244000 601878d800d448 1e000000000000 0 B: REL=7c3 B: MSC=10
所以我输入以下命令(根据您的具体情况调整事件编号)
udevinfo -a -p $(udevinfo -q path -n /dev/input/event4) | grep modalias ATTRS{modalias}=="input:b0003v045Ep008Ae0111-0,1,2,4,k71,72,73,74,83,86,8A,8C,8E,8F,9B,9C,9E,9F,A3,A4,A5,A6,AB,AC,B5,B6,CE,D2,D5,E2,E7,E8,E9,EA,EB,110,111,112,113,114,1B0,1B1,r0,1,6,7,8,9,A,am4,lsfw" ATTRS{modalias}=="usb:v045Ep008Ad7373dc00dsc00dp00ic03isc00ip00" ATTRS{modalias}=="pci:v00001106d00003038sv00001043sd000080EDbc0Csc03i00"
获取 ATTRS,它以 usb: 开头,以完成 “SYSFS{modalias}== ” 条目
最后,在 xorg.conf
中使用 usbmouse
作为设备选项
Option "Device" "/dev/input/usbmouse"
evdev Xorg - 后期配置
谷歌浏览器
它工作正常。水平滚动开箱即用 - 向左或向右推动滚轮。拇指按钮也可以作为上一页/下一页使用。
Opera 浏览器
它工作正常。注意:可以在 Preferences > Advanced > Shortcuts > Mouse set-up
中轻松地将按钮映射到功能。例如,将按钮 8 绑定到后退
- 导航到鼠标设置并展开应用程序下拉菜单
- 在输入列中,键入:按钮 8
- 在操作列中,键入:后退
火狐浏览器
水平滚动
要启用后退和前进功能,而不是左右滚动,请在 about:config
中更改以下设置
mousewheel.default.action.override_x 2 mousewheel.default.delta_multiplier_x -100
拇指按钮 - 前进和后退
为此,我们需要将按键映射到所需的鼠标按钮,并安装 xvkbdAUR 和 xbindkeys。
在大多数使用后退/前进功能的现代应用程序中,默认情况下 XF86Back 映射到后退,XF86Forward 映射到前进。在大多数 MX 鼠标上,拇指按钮解析为 8 和 9。如果您的鼠标不同,请使用 xev 检查按钮编号,并替换示例中使用的数字(b:8 和 b:9)。
因此,如果您有 MX 鼠标,您应该创建文件 ~/.xbindkeysrc
,其中包含
# Mouse Buttons "xvkbd -xsendevent -text "\[XF86Back]"" m:0x0 + b:8 "xvkbd -xsendevent -text "\[XF86Forward]"" m:0x0 + b:9
现在进行测试... 运行以下命令,如果它按预期工作,请记住将 xbindkeys 添加到 .xinitrc
或其他每次 X 启动时都会执行的地方。此外,这应该适用于 Epiphany 和 Konqueror,无需任何额外的配置或使用 IMWheel。
xbindkeys
由于 xvkbd 在官方仓库中不可用,这里是另一个使用 xte 的示例,它来自 xautomation 软件包
# Mouse Buttons "xte "key XF86Back"" m:0x0 + b:8 "xte "key XF86Forward"" m:0x0 + b:9
xmodmap 调整
对于某些人来说,更改按钮代码的顺序可能更舒适,例如对于左撇子。根据您使用的环境,按钮代码可以通过两种不同的方式配置。如果您使用 .xinitrc
加载 X,则将其添加到 .xinitrc
(根据您拥有的按钮数量进行更改)
xmodmap -e "pointer = 1 2 3 6 7 8 9 10 11 12 4 5" &
请注意,按钮 4 和 5 必须放在末尾,否则您的滚轮将无法工作。
如果您使用 GDM/SDDM/XDM 而不是 .xinitrc
,则创建文件 ~/.Xmodmap
并将其添加到其中(根据您拥有的按钮数量进行更改)
pointer = 1 2 3 6 7 8 9 10 11 12 4 5
- GDM/SDDM/XDM 会读取
~/.Xmodmap
文件(如果存在),而startx
不会。 另一种解决方案是将此添加到您的~/.xinitrc
中:xmodmap ~/.Xmodmap
。这将允许您在使用 *DM 和startx
的同时,只需在需要进行更改时编辑~/.Xmodmap
。
您可能需要稍微调整这些数字才能获得所需的行为。有些鼠标使用按钮 6 和 7 进行滚轮滚动,在这种情况下,这些按钮必须是最后的数字。不断尝试,直到它工作为止!
xinput 调整
出于调试目的,可以使用 xinput
,因为它能够在用户空间中动态更改按钮映射。以下行更正了按钮映射(已报告 Logitech M505/B605 鼠标以及其他鼠标的案例),以便接收到的事件被正确映射
$ xinput set-button-map "$(xinput | awk -F'[=]' '/Logitech M505\/B605/ {print $2}' | awk '{print $1}')" 1 2 3 4 5 8 9
设备特定配置
罗技 G600
众所周知,在 xorg-server 1.18.0-3 中,G600 的侧键不被识别为单独的键盘设备,而是另一个鼠标,这会导致奇怪的行为(当单击主鼠标按钮之一时,鼠标光标移动到屏幕边缘)。要强制 xorg 将它们识别为键盘按钮,请将以下部分添加到您的 /etc/X11/xorg.conf
Section "InputClass" Identifier "G600 misconfiguration fix" MatchProduct "G600" # Match just the keyboard section of the G600 MatchIsKeyboard "true" # evdev assumes it is a mouse when it sees the absolute axis. Stop that from happening. Option "IgnoreAbsoluteAxes" "on" EndSection
Mad Catz 鼠标
罗技 M560/M545/M546
这些鼠标专为 Windows 8 设计,具有非传统的行为:鼠标显示为鼠标和键盘,并且某些按钮不发出标准的鼠标按钮事件,而是键盘和鼠标按钮按下的组合。这妨碍了在 Linux 下“舒适地”使用此鼠标。
适当的驱动程序允许像普通鼠标一样使用该鼠标
- M560 的内核模块(已合并到内核 v4.2 中)
- M545/M546 的内核模块
另请参阅 Xbindkeys 以了解鼠标按钮映射。
罗技 G5 鼠标:绑定 + 和 -
如果您想绑定 G5/7 鼠标中的按钮 +
和 -
(通常用于更改 DPI),则必须使用 lomoco 作者发布的 g5hack
[3]。
wget http://piie.net/temp/g5_hiddev.c gcc -o g5hack g5_hiddev.c ./g5hack /dev/usb/hiddev0 3
这将把您的 DPI 更改为 2000,点亮第一个 LED,并禁用 DPI 动态更改,以便您可以将其与 evrouter 一起使用。如果您经常使用它,我建议您将其复制到 /usr/bin
目录
# cp g5hack /usr/bin/
如果您想绑定您的 +
和 -
按钮,您必须将底部的一行(上面有注释“"-" button does not function anymore”)复制到您将要使用的模式中,例如,在“case 3:”下,您可以将其放在注释“turn on third led”的行上(当然要先删除旧的)。
对于最新的 G5 鼠标,据报告为“product 0xc049”,原始 hack 不起作用。您必须简单地将 #define MOUSE_G5 0xc041
更改为 #define MOUSE_G5 0xc049
并重新编译。
您可以使用 systemd 单元在系统启动时执行 g5hack 工具。有关详细信息,请参阅 Systemd#编写单元文件。
如果 Arch 是虚拟机
如果您想支持两个或三个以上的鼠标按钮,该功能将取决于您的虚拟机管理程序软件。
VMware workstation
对于您基于 Arch 的虚拟机,将以下行添加到其 .vmx 配置文件中
mouse.vusb.enable = "TRUE" mouse.vusb.useBasicMouse = "FALSE"