代码之家  ›  专栏  ›  技术社区  ›  Vlastimil Burián

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

  •  0
  • Vlastimil Burián  · 技术社区  · 6 年前

    TL;博士 :在Linux上,如何使用POSIX shell禁用鼠标一秒钟,而不等待第二秒钟,并立即执行某些操作?


    操作系统:Linux Mint 18.3 64位肉桂色,带LightDM显示管理器和Mutter(Muffin)窗口管理器,X11窗口系统。


    脚本环境: dash .


    我需要:

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

    2. 禁用鼠标一秒钟。但脚本必须继续。这非常重要。

    3. 运行应用程序( Lightshot 在一般打印屏幕模式下)立即。

    根本原因 :因为 灯光拍摄 可能包含错误,鼠标不能在打印屏幕前移动,否则通常会导致如下结果:

    lightshot_bug_when_mouse_moving

    2 回复  |  直到 6 年前
        1
  •  3
  •   Vlastimil Burián    4 年前

    TL;博士

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

    my_mouse_device_id=12
    
    disable_mouse_for_a_second()
    {
        if xinput --disable "$1" 2> /dev/null
        then
            (
                sleep 1s
                xinput --enable "$1"
            ) &
            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. 从实用的角度来看,我们所需要做的就是将其封装在一个漂亮的函数中。

        2
  •  1
  •   jarno    4 年前

    我在OP的回答中添加了一些信号处理,因此如下所示:

    #!/bin/sh
    my_mouse_device_id=12
    
    disable_mouse_for_a_second()
    {
        if xinput --disable "$1" 2> /dev/null
        then
            (
                # ensure the device will not be left disabled
                id=$1
                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
    

    请注意 { ... } 似乎可以替代 ( ... ) 这里,如果你愿意的话,但无论如何都会有一个子壳。

    您必须存储 $1 在变量中(此处 id )因为否则至少Dash shell在退出时不会知道它。

    我指的是 this answer 打开信号灯。