マウスボタンが押されたかどうかを検出し、スクリプトまたはコマンドを呼び出します


11

bashからマウスボタンの状態を取得する方法はありますか?Xdotoolはマウスの位置のみを取得できます。

マウスボタンが押されたときにスクリプトを実行できるルールを定義できる場所を設定したいと思います。


マウスイベントを確実に検出できますが、現在マウスボタンが現在押されているかどうかをシステムに確認する方法はないと思います。私が見たすべてのマウスアクティビティパーサーは、擬似コードを許すかどうか、MouseButton1DownそしてMouseButton1Up行動するイベントを監視します。
DopeGhoti

マウスを監視し、左ボタンが押されたときに何かを実行するスクリプトが必要です。
MartinP

明確化が必要です。シェルを開いているときにターミナルウィンドウをクリックすると、その特定のシェルが何かをする何かが必要ですか?または、特定のマウスボタンをクリックしたときにスクリプトが実行されるようにしたいですか(端末でスクリプトを表示する必要はありません)。
パトリック

スクリプトが必要です。これを実行すると、デスクトップ上の任意の場所でマウスボタンを監視します。マウスはブロックされず、リスニングのみが行われます。Xlibを使用してC用のプログラムを作成しようとしましたが、XGrabButtonとXGrabPointerしかありません。これは、ポインターを取得し、別のウィンドウがクリックイベントを登録しないためです。
MartinP

回答:


11
xinput --query-state <mouse_id>

これにより、すべてのマウスボタンの状態が次のようになります。

2 classes :
ButtonClass
    button[1]=up
    button[2]=up
    button[3]=up
    button[4]=up
    button[5]=up
    button[6]=up
    button[7]=up
    button[8]=up
    button[9]=up
    button[10]=up
    button[11]=up
    button[12]=up
    button[13]=up
    button[14]=up
    button[15]=up
    button[16]=up
ValuatorClass Mode=Relative Proximity=In
    valuator[0]=313
    valuator[1]=667
    valuator[2]=-20

mouse_idは次の場所から取得できます。

xinput --list

これは、小さなマウスボタン監視スクリプトです。

#!/bin/bash

MOUSE_ID=$(xinput --list | grep -i -m 1 'mouse' | grep -o 'id=[0-9]\+' | grep -o '[0-9]\+')

STATE1=$(xinput --query-state $MOUSE_ID | grep 'button\[' | sort)
while true; do
    sleep 0.2
    STATE2=$(xinput --query-state $MOUSE_ID | grep 'button\[' | sort)
    comm -13 <(echo "$STATE1") <(echo "$STATE2")
    STATE1=$STATE2
done

MOUSE_ID検出文字列(「マウス」)を別のものに変更する必要がある場合があります。


xinput --list私に与えますX Input extension not available.。残念ながら、この問題についてGoogleは、私の場合に役立つもの、つまりXvnc4最小限のDebian VM については明らかにしていません。 そう私は運が悪いよ
ティノ

6

コマンドラインツールxevを使用して、X環境内のマウスボタンの状態を調べることができます。

$ xev
...
ButtonPress event, serial 36, synthetic NO, window 0x3800001,
    root 0x86, subw 0x0, time 319064320, (164,14), root:(166,101),
    state 0x0, button 1, same_screen YES

ButtonRelease event, serial 36, synthetic NO, window 0x3800001,
    root 0x86, subw 0x0, time 319064439, (164,14), root:(166,101),
    state 0x100, button 1, same_screen YES

ButtonPress event, serial 36, synthetic NO, window 0x3800001,
    root 0x86, subw 0x0, time 319065208, (164,14), root:(166,101),
    state 0x0, button 1, same_screen YES

ButtonRelease event, serial 36, synthetic NO, window 0x3800001,
    root 0x86, subw 0x0, time 319065337, (164,14), root:(166,101),
    state 0x100, button 1, same_screen YES

ButtonPress event, serial 36, synthetic NO, window 0x3800001,
    root 0x86, subw 0x0, time 319066059, (164,14), root:(166,101),
    state 0x0, button 1, same_screen YES

しかし、この情報は、部分的にしか解決策を導き出せません。上記から抽出したいキー情報は、マウスの特定のボタンに関連付けられている番号です。私の例では、左ボタン「buton 1」を押しています。

xbindkeys

このツールを使用して、押されているボタンに関連付けられているアクションをセットアップできます。キーを押すか、キーとボタンを同時に押す必要があるルールを設定することもできます。

最初にパッケージxbindkeysがインストールされていることを確認する必要があります。

次に、次のコマンドを1回だけ実行して、テンプレートxbindkeys構成ファイルを作成する必要があります。

$ xbindkeys --defaults > /home/saml/.xbindkeysrc

ファイルを作成したら、テキストエディターで開き、次のようなルールを追加できます。

"xterm"
  b:3

このルールはxterm、ボタン3が押されたときにプログラムを実行することを示しています。「ボタン3」はマウスの右ボタンです。

上記の変更により、xbindkeysが既に実行されている場合は強制終了してから再起動する必要があります。

$ killall xbindkeys
$ xbindkeys

これで、マウスの右ボタンをクリックするたびにxterm実行され、実行されます。

参照資料


2
しかし、それは作成されたウィンドウに対してのみ機能します。そのイベントをグローバルにキャッチするにはどうすればよいですか?
MartinP

4

マウスのクリック(またはホイールイベント)でxtermでbashコマンドを実行する場合は、次の例を試してください。

$ echo -e "\e[?1000h"
$ while read -n 6; do echo hellowworld; done

これはホイールイベント用です(クリックセット12の代わりに)


説明してください
lucaswxp

2

ケーキボタンを押してイベントを開催して食べることはできません。スクリプトでマウスイベントを受信する場合、マウスイベントは他のアプリケーションではなくスクリプトに送信されます。つまり、スクリプトはマウスイベントを取得する必要があります。スクリプトがイベントを要求しない場合、それを取得するウィンドウがそれを取得します。

必要に応じて、マウスイベントをフォーカスされたウィンドウまたは指定された座標(xdotool click)のウィンドウに再送信できます。

XBindKeysを使用して、特定のマウスまたはキーボードイベントでスクリプトを実行できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.