在 Linux 上,如何使用 POSIX shell 禁用鼠标一秒钟,而不是等待第二个并立即做一些工作?

On Linux, how to disable mouse for a second using POSIX shell, without waiting for the second and do some job immediately?

TL;DR:在 Linux 上,如何使用 POSIX shell 禁用鼠标一秒钟,而无需等待第二个并立即做一些工作?


OS:Linux Mint 18.3 64 位 Cinnamon,带 LightDM 显示管理器和 Mutter (Muffin) window 管理器,X11 windowing 系统。


脚本环境:dash.


我需要:

  1. 做点什么(为了这个问题的目的究竟是什么并不重要,但你可以阅读the full script on Core Review)。

  2. 暂时禁用鼠标。但剧本必须继续。这个很重要。

  3. 运行 立即申请(Lightshot 在一般打印屏幕模式下)。

基本原理:由于Lightshot可能包含一个错误,鼠标不能在打印屏幕之前移动,否则通常会导致类似这个:

TL;DR

假设,在我的系统上,鼠标设备 ID 等于 12。然后在 POSIX shell 脚本中执行该技巧的函数如下所示:

my_mouse_device_id=12

disable_mouse_for_a_second()
{
    if xinput --disable "" 2> /dev/null
    then
        (
            sleep 1s
            xinput --enable ""
        ) &
        return 0
    else
        return 1
    fi
}

# example usage
if disable_mouse_for_a_second "$my_mouse_device_id"
then
    echo "Success"
else
    echo "Failure"
fi

说来话长

  1. 您需要使用以下方法找到鼠标设备 ID:

    xinput list --short
    
  2. This thread 对我帮助很大,例如以下内容已弃用:

    xinput --set-int-prop 
    
  3. 之后我们需要运行这两个命令:

    sleep 1s
    xinput --enable "$my_mouse_device_id"
    

    棘手的部分是我们需要:

    让它正常工作。

  4. 从实际的角度来看,我们需要做的就是将它包装在一个漂亮的函数中。

我在 OP 的回答中添加了一些信号处理,所以这里是:

#!/bin/sh
my_mouse_device_id=12

disable_mouse_for_a_second()
{
    if xinput --disable "" 2> /dev/null
    then
        (
            # ensure the device will not be left disabled
            id=
            trap 'xinput --enable "$id"; trap - EXIT; exit' \
            EXIT TERM INT HUP
            sleep 1s
        ) &
        return 0
    else
        return 1
    fi
}

# example usage
if disable_mouse_for_a_second "$my_mouse_device_id"
then
    echo "Success"
else
    echo "Failure"
fi

请注意 { ... } 似乎可以替代 ( ... ) 在这里,如果您愿意的话,但是会有分shell 反正.

你必须将 </code> 存储在一个变量中(这里是 <code>id),否则至少 Dash shell 在退出时不会知道它。

我参考了 this answer 信号处理。