像屏幕保护程序一样检测鼠标点击,同时忽略鼠标移动的脚本

像屏幕保护程序一样检测鼠标点击,同时忽略鼠标移动的脚本

希望在用户不活动一分钟后断开网卡,其中不活动定义为没有鼠标单击或滚轮滚动。鼠标移动将被忽略,因此 xscreensaver 不适合,xautolock 也不适合。如何从命令行检测并区分鼠标事件?

答案1

根据 meuh 的说明,这个“屏幕保护程序”是如何完成的:

#!/bin/bash
evemu-record /dev/input/event2 |
stdbuf -oL egrep 'EV_KEY|REL_WHEEL' |
(
    ./network_saver.sh   
)

其中network_saver.sh是这样的:

#!/bin/bash
WAIT=5
while [ 1 ]
do
    echo Waiting for $WAIT seconds of mouse button inactivity
    while read -t $WAIT line
    do
        echo -n .
    done
    echo; echo Disabling networking
    nmcli n off
    echo Waiting for a mouse button press
    while read line
    do
        echo -n .
        break;
    done
    echo; echo Enabling networking
    nmcli n on
    # Connect the main nic as soon as possible
    nmcli conn up "Ethernet connection 1" >/dev/null
done

答案2

如果您不想编写程序来执行此操作,有几个程序可以显示鼠标事件。例如,evemu-record在鼠标输入设备上,将以非常详细的输出显示每个按钮的按下、滚轮滚动和移动,例如(显示已编辑):

E: 0001 0111 0001  # EV_KEY / BTN_RIGHT            1
E: 0000 0000 0000  # ------------ SYN_REPORT (0) ---------- +552ms
E: 0002 0008 -001  # EV_REL / REL_WHEEL            -1
E: 0000 0000 0000  # ------------ SYN_REPORT (0) ---------- +1016ms
E: 0002 0000 0001  # EV_REL / REL_X                1
E: 0002 0001 0003  # EV_REL / REL_Y                3

不带参数运行evemu-record以列出输入设备。就我而言是

/dev/input/event5:      Logitech USB Optical Mouse

然后你可以编写一个 bash shell 脚本,例如:

( pid=$BASHPID
  evemu-record /dev/input/event5 |
  stdbuf -oL egrep 'EV_KEY|REL_WHEEL' |
  ( while read -t 5 junk
    do echo -n .
    done
    echo ok
    kill -pipe $pid
  )
)

这用于egrep过滤除按钮和滚轮线之外的所有线,用于确保输出不被缓冲(尽管您的 grep 可能接受执行相同操作的stdbuf选项)。 --line-bufferedwhile 循环读取每一行并回显“.”,但如果 5 秒内没有输入 ( -t 5),循环就会停止。最后,kill管道需要 a,否则管道将不会结束,直到检测到新事件并egrep通过 SIGPIPE 结束。使用kill -pipe发送 SIGPIPE 信号,这可以避免您从kill -hup.(...)需要外壳来获取外壳 ( $BASHPID) 的进程 ID,该外壳不会杀死任何周围的外壳代码。

或者,您可以从 获取 PS/2 数据流/dev/input/mice,但我不知道格式的完整细节。您可以使用以下命令查看 3 字节记录

od -v -An -w3 -tx1 /dev/input/mice

相关内容