插入鼠标时自动禁用鼠标加速

插入鼠标时自动禁用鼠标加速

我有一台笔记本电脑,我经常使用 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

相关内容