在 Linux 中按下键盘键时禁用鼠标

在 Linux 中按下键盘键时禁用鼠标

我已经放弃尝试正确注册我的触摸板了。它想成为 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

最好有更好的解决方案!

相关内容