마우스 버튼을 눌렀는지 감지 한 후 스크립트 또는 명령을 호출하십시오.


11

bash에서 마우스 버튼 상태를 얻는 방법이 있습니까? Xdotool은 마우스 위치 만 가져올 수 있습니다.

마우스 버튼을 눌렀을 때 스크립트가 실행될 수있는 규칙을 정의 할 수있는 것을 설정하고 싶습니다.


확실히 마우스 이벤트를 감지 할 수는 있지만, 현재 마우스 버튼 을 눌렀 는지 시스템에 물어볼 방법이 없다고 생각 합니다. 당신이 의사를 용서 있을지는 위해 시계를 본 적이 모든 마우스 활동 파서 MouseButton1DownMouseButton1Up에 따라 행동하는 이벤트.
DopeGhoti

마우스를 볼 수있는 스크립트가 필요하며 왼쪽 버튼을 누르면 무언가를 할 것입니다.
MartinP

설명이 필요합니다. 쉘에있을 때 무언가를 원하고 터미널 창을 클릭하면 특정 쉘이 무엇을합니까? 또는 스크립트가 실행되는 곳 어디에서나 특정 마우스 버튼을 클릭하면 터미널에서 스크립트를 볼 필요가 없도록 하시겠습니까?
Patrick

스크립트가 필요합니다. 스크립트가 실행되면 데스크탑 어디에서나 마우스 버튼이 표시됩니다. 마우스를 막지 않고 들으려고합니다. 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 감지 문자열 ( 'mouse')을 다른 것으로 변경해야 할 수도 있습니다.


xinput --list나에게 준다 X Input extension not available.. 슬프게도이 문제에 대해 Google Xvnc4은 최소한의 데비안 VM 에서 내 경우에 도움이되는 것을 밝히지 않습니다 . 아마 나는 운이 없다
Tino

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 패키지가 설치되어 있는지 확인해야합니다.

그런 다음 템플릿 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.