マウスの動きを無視しながらスクリーンセーバーのようにマウスクリックを検出するスクリプト

マウスの動きを無視しながらスクリーンセーバーのようにマウスクリックを検出するスクリプト

1分間ユーザーアクティビティがない場合は、ネットワークカードを切断したいと思います。ここで、非アクティブとは、マウスクリックやホイールスクロールがないと定義されます。マウスの動きは無視されるので、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シェルスクリプトを作成できます。

( 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が必要です。そうしないと、新しいイベントが検出され、egrepSIGPIPEを介して終了するまでパイプラインは終了しません。kill -pipeSIGPIPEシグナルを使用すると、shell()のプロセスIDを取得するためにシェルが必要kill -hupないため、周辺シェルコードは終了しません。(...)$BASHPID

またはからPS / 2データストリームを取得できますが、/dev/input/miceフォーマットの詳細についてはわかりません。次のコマンドを使用すると、3バイトのレコードを表示できます。

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

関連情報