我有一台笔记本电脑,我经常使用 Logitech G5 鼠标。我不喜欢使用鼠标时的加速功能。因此每次插入鼠标时我都必须禁用加速功能。有没有办法在插入鼠标时自动禁用鼠标加速功能?
答案1
是的,可以做到,而且相对容易。您需要创建 3 个文件 - 一个 udev 规则和两个脚本。
UDEV 规则
UDEV 规则将检测鼠标插入事件,并在事件发生时触发脚本。在以下位置创建一个文件/etc/udev/rules.d
:
sudo gedit /etc/udev/rules.d/42-kill-mouse-accel.rules
粘贴以下行:
ACTION=="add", ATTRS{bInterfaceClass}=="03", ENV{DISPLAY}=":0.0", ENV{XAUTHORITY}="/home/[YOUR_USER_NAME]/.Xauthority", ENV{ID_CLASS}="mouse", RUN+="/usr/local/bin/kill-mouse-accel.sh"
请注意[YOUR_USER_NAME]
,您必须将其替换为您的用户名。
保存并退出 Gedit。
加速脚本
加速脚本将是由 UDEV 规则触发的代码,该规则又会在后台分叉一个工作脚本。后台脚本将执行实际工作。我们这样做是因为我们想在更改加速之前等待一段时间,但我们不想阻止 UDEV。在 下创建一个文件/usr/local/bin
:
sudo gedit /usr/local/bin/kill-mouse-accel.sh
粘贴以下代码:
#!/bin/bash
export DISPLAY=${DISPLAY}
/usr/local/bin/kill-mouse-accel-worker.sh &
保存并退出 Gedit。
后台加速脚本
此脚本是调用禁用鼠标加速的命令的地方。在以下位置创建一个文件/usr/local/bin
:
sudo gedit /usr/local/bin/kill-mouse-accel-worker.sh
粘贴以下代码:
#!/bin/bash
sleep 2
for i in $(xinput list | grep [Mm]ouse | sed -e 's/^.*id=\([0-9]*.\).*$/\1/')
do
echo "Found device: $i"
# The command disabling mouse acceleration
xinput set-ptr-feedback $i 10 1 1
done
保存并退出 Gedit。
定稿和测试
使两个脚本都可执行:
sudo chmod +x /usr/local/bin/kill-mouse-accel.sh /usr/local/bin/kill-mouse-accel-worker.sh
重新启动 UDEV:
sudo service udev restart
最后,重新插入 USB 鼠标并等待几秒钟。鼠标加速应该被禁用。
致谢
感谢以下博客文章的作者:http://granjow.net/udev-rules.html
答案2
我遇到了类似的问题并且已经开发出不同的解决方案。
我写过监听 udev 事件的 Python 脚本并在设备插入或拔出时运行一些命令。就我而言,其中一个命令禁用鼠标加速。我选择这个解决方案是因为它不需要 root 权限,因此可以应用于任何 Linux 系统。我只需让 Python 脚本在后台运行,就不用担心它了。
所有脚本均可在以下网址获取https://github.com/denilsonsa/small_scripts,并且也将它们复制/镜像如下,以供参考。
auto_configure_upon_usb_device_change.py
#!/usr/bin/env python3
import functools
import os.path
import pyudev
import subprocess
import time
def main():
BASE_PATH = os.path.dirname(os.path.realpath(os.path.abspath(__file__)))
path = functools.partial(os.path.join, BASE_PATH)
call = lambda x, *args: subprocess.call([path(x)] + list(args))
context = pyudev.Context()
monitor = pyudev.Monitor.from_netlink(context)
monitor.filter_by(subsystem='usb')
monitor.start()
call('xinput_disable_mouse_acceleration.sh')
for device in iter(monitor.poll, None):
# Wait a short amount of time to let the device get ready.
time.sleep(0.250)
call('xinput_disable_mouse_acceleration.sh')
if __name__ == '__main__':
main()
xinput_disable_mouse_acceleration.sh
#!/bin/sh
xsp_microsoft() {
xinput set-prop 'Microsoft Microsoft Basic Optical Mouse v2.0 ' "$@"
}
xsp_logitech() {
xinput set-prop 'Logitech USB Laser Mouse' "$@"
}
xsp_microsoft 'Device Accel Profile' -1
xsp_logitech 'Device Accel Profile' -1
xsp_microsoft 'Device Accel Constant Deceleration' 1.5