我有一台 Apple Magic Mouse 鼠标和一台 Dell Latitude E7440(运行 Ubuntu 16.04 LTS),它有一个奇怪的习惯,就是时不时断开连接 [我必须手动重新连接](或断开连接,仍然不确定谁是罪魁祸首)。
不仅如此,每次重新连接鼠标时,鼠标 [指针] 速度设置都会消失!xinput
每次重新连接鼠标时,我都必须 [手动] 重新应用配置。
Ubuntu 的鼠标和触摸板设置没有任何效果:我已将加速度一直向下滑动,但它仍然太快了。
问题:xinput --set-prop
每次鼠标重新连接时,有没有办法使用 [应用] 这些设置?(这种情况 - 每次鼠标重新连接时都必须应用这些设置 - 这是不可接受的,因为鼠标每天都会断开并重新连接几次!]
长版、语境化版本:
我发现了许多解决这种间歇性断线问题的建议(这里和这里),但他们未能彻底解决问题。断线仍然时有发生,可能频率稍微低一些(但这可能是一种偏见)。
滚动速度 [太慢,需要加快] 已修复,如下所示这为了使其确定性(在重新启动后仍然存在),一行 modprobe 配置文件解决了它:
/etc/modprobe.d/hid_magicmouse.conf:
options hid_magicmouse scroll-speed=40 scroll-acceleration=1
另一个问题是鼠标指针移动太快;解决方案已经找到这里。但这不是一个明确的解决方案,因为每次重新启动计算机时,配置就会消失,需要重新应用配置——手动。
xinput --set-prop 'Apple Magic Mouse' "Device Accel Constant Deceleration" 2
xinput --set-prop 'Apple Magic Mouse' "Device Accel Velocity Scaling" 1
但是每次鼠标断开连接时,设置就会消失,需要再次手动重新应用。
我想使它更加明确,即每次鼠标重新连接时自动重新应用。
udev 框架/机制看起来非常合适。将此脚本连接到 udev 规则(因此每次连接鼠标时都会重新应用设置)。
(udev 规则)
/etc/udev/rules.d/71-applemagicmouse.rules
SUBSYSTEMS=="input", ATTRS{name}=="Apple Magic Mouse", ACTION=="add", ENV{DISPLAY}=":0.0", ENV{XAUTHORITY}="/home/cfeng01/.Xauthority", RUN+="/bin/su cfeng01 -c /home/cfeng01/bin/set_apple_mouse_speed.sh"
(以及剧本)
/home/cfeng01/bin/set_apple_mouse_speed.sh
#!/bin/sh
# references:
# * about udev and running scripts after the device is plugged in [or recognized by Linux]
# https://askubuntu.com/questions/686144/run-a-shell-command-after-a-bluetooth-input-device-is-detected
#
# * about how the need of XDISPLAY and XAUTHORITY env variables
# https://ubuntuforums.org/showthread.php?t=2334004&page=2
# for debugging purposes
#set -x
while [ ! "$(/usr/bin/hcitool info 1C:1A:C0:D6:74:10 2>&1 > /dev/null; echo $?)" ]; do
sleep 0.1
done
# the xinput requires X [to acessible] and since this script will be triggered by udev,
# there won't be these X-related variables;
# However, exporting here (in the script) doesn't work!
#
# export XDISPLAY=:0
# export XAUTHORITY=/home/cfeng01/.Xauthority
#
# It only worked when I added in the udev rule:
#
# SUBSYSTEMS=="input", ATTRS{name}=="Apple Magic Mouse", ACTION=="add", ENV{DISPLAY}=":0.0", ENV{XAUTHORITY}="/home/cfeng01/.Xauthority", RUN+="/bin/su cfeng01 -c /home/cfeng01/bin/set_apple_mouse_speed.sh"
while [ ! "$(xinput query-state 'Apple Magic Mouse' 2>&1 > /dev/null; echo $?)" ]; do
sleep 0.1
done
MOUSE_ID=`xinput --list | grep "Apple Magic Mouse" | awk 'BEGIN {FS = " "}; { print $6}' | awk 'BEGIN {FS = "="}; { print $2}'`
if [ "${MOUSE_ID}" != "" ]; then
logger $0 Magic Mouse found, updating the mouse speed settings.
# para desacelerar o Apple Magic Mouse
xinput --set-prop ${MOUSE_ID} "Device Accel Constant Deceleration" 2
xinput --set-prop ${MOUSE_ID} "Device Accel Velocity Scaling" 1
else
logger $0 Magic Mouse not found, skipping.
fi
然而,反复循环“禁用蓝牙 > 启用蓝牙 > 激活鼠标”没有任何效果。分析/var/log/syslog
[并比较“定时”xinput list
输出] 看起来鼠标只是“连接”到 X后udev 完成运行脚本[当 udev 脚本尚未完成时,Magic Mouse 不会出现在输出中xinput list
]。
我推断,在设备实际连接到 X 之前,xinput 无法对其执行任何操作。
因此,需要某种机制来解决这个问题。也许是某种回调?
有谁能解释一下吗?