我已经放弃尝试正确注册我的触摸板了。它想成为 imps/2 设备,我不能再花更多的下午时间试图说服它改变主意(公平地说,它作为 imps/2 设备表现相当不错 - 轻触即可单击,三指轻触即可中键单击,没有水平滚动,但你不能拥有一切)
然而,我无法接受最轻的刷子会导致水龙头失火的事实。
是否有命令可用于在最近按下某个键时禁用触摸板?xinput 似乎是我的朋友,设备出现并可配置为“ImPS/2 通用滚轮鼠标”
答案1
我改进了您的解决方案,这样就不需要几个文件了,grep 操作也更少了,并且稳定性也得到了轻微的改进。在代码中,我使用了我使用的“Logitech K400”设备,但您可以更改它。(使用该设备,我想在按下 Ctrl 时禁用鼠标,但这是另一个故事和代码。)我不知道仅在释放按键后禁用鼠标对您来说效果如何。您最好在按下按键时启动禁用,除非是 Ctrl 等修饰键,并在释放按键后经过一段时间延迟后启用(再次忽略修饰键)。
#!/bin/bash
# Use
# $ xinput --list
# to get the device names and test them with
# $ xinput --list "name"
# Modify the pointer device name to match your hardware
pointer_id=$(xinput list --id-only 'pointer:Logitech K400')
# Modify the keyboard name to match your hardware
keyb_id=$(xinput list --id-only 'keyboard:Logitech K400')
# exit, if the devices are not available
[[ $pointer_id && $keyb_id ]] || exit 1
quit_jobs() {
# terminate all running jobs, if any
kill $(jobs -pr) 2>/dev/null || :
}
# Prepare the script for exit
revert() {
# Terminate `xinput test` and other possible processes
quit_jobs
# The pointer may be disabled
xinput enable $pointer_id
}
trap revert EXIT
disable_pointer_temporarily() {
xinput disable $pointer_id
sleep 0.5
xinput enable $pointer_id
}
xinput test $keyb_id | while read -r line; do
if [[ $line == key\ release* ]]; then
quit_jobs
disable_pointer_temporarily &
fi
done
答案2
到目前为止,我的解决方案非常 hacky:
xinput test-xi2 --root | grep --line-buffered RawKeyRelease | while read -r line ; do pause-mouse-with-kill & sleep 0 ; done
这会报告传递给 xorg 的任何输入,检查是否是按键释放(这样我仍然可以按住 Ctrl 键并单击)并暂时禁用鼠标。这就是事情变得更加黑客化的地方 - 需要两个文件来防止重复按键延长鼠标超时:
/usr/bin/pause-mouse
执行实际的鼠标禁用:
#!/bin/bash
DEV="ImPS/2 Generic Wheel Mouse" ; xinput set-prop "$DEV" "Device Enabled" 0 && sleep 0.5 && xinput set-prop "$DEV" "Device Enabled" 1
/usr/bin/pause-mouse-with-kill
取消之前的鼠标禁用,并重新启动时钟
#!/bin/bash
killall pause-mouse
pause-mouse
最好有更好的解决方案!