Визначте, чи натиснута кнопка миші, а потім викликайте сценарій або команду


11

Чи є спосіб отримати стан кнопки миші з bash? Xdotool може отримати лише місце миші.

Я хотів би встановити щось, де я можу визначити правило, де при натисканні кнопки миші сценарій може бути виконаний.


Ви, звичайно, можете виявити події миші , але я не вірю, що існує спосіб запитати систему, чи натискає кнопку миші зараз . Кожен аналізатор діяльності миші, за яким я бачив, спостерігає, якщо ви простите псевдокод MouseButton1Downта MouseButton1Upподії, на які потрібно діяти.
DopeGhoti

Мені потрібен сценарій, який буде спостерігати за мишкою, і коли натискається ліва кнопка, вона щось зробить.
MartinP

Потрібні роз'яснення. Ви хочете чогось там, коли ви знаходитесь в оболонці, і натискаєте вікно терміналу, що конкретна оболонка щось робить? Або ви хочете, щоб після натискання певної кнопки миші скрізь запускався сценарій (і вам не потрібно бачити сценарій у терміналі)?
Патрік

Мені потрібен сценарій, який я запускатиму, а потім він буде дивитися на кнопки миші в будь-якому місці робочого столу. Миша не блокує, вона лише слухатиме її. Я спробував написати програму для цього в C за допомогою Xlib, але у неї є лише 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

Але ця інформація лише частково приводить вас до рішення. Ключова інформація, яку ви хочете витягти зверху, - це те, яке число пов’язане з певною кнопкою миші. У своєму прикладі я натискаю ліву кнопку "кнопка 1".

xbindkeys

Цей інструмент можна використовувати для налаштування дії, пов’язаної з натисканням кнопки. Ви навіть можете налаштувати правило, яке вимагає натискання клавіші або навіть натискання клавіші + кнопки разом.

Приклад

Спочатку потрібно переконатися, що пакети xbindkeys встановлені.

Тоді вам потрібно буде запустити наступну команду, лише один раз, щоб створити шаблон конфігураційного файлу xbindkeys.

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

Зі створеним файлом ви можете відкрити його в текстовому редакторі та додати таке правило:

"xterm"
  b:3

Це правило говорить про те, що ми хочемо запустити програму, xtermколи натиснути кнопку 3. "Кнопка 3" - це моя права кнопка миші.

Зробленою вище зміною нам потрібно вбити xbindkeys, якщо він вже запущений, а потім перезапустити його.

$ killall xbindkeys
$ xbindkeys

Тепер із цим запуском у будь-який момент, коли я натискаю праву кнопку миші, xtermбуде виконуватися повідомлення.

Список літератури


2
Але це працює лише для створеного вікна. Як я можу зловити цю подію в усьому світі?
MartinP

4

якщо ви просто хочете запустити команду bash в xterm при натисканні миші (або події колеса), ви можете спробувати цей приклад:

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

це для подій колеса (замість набору 12 натискань)


Будь ласка, можете пояснити?
lucaswxp

2

Ви не можете натиснути подію на кнопку торта і з'їсти її. Якщо ви хочете, щоб ваш сценарій отримував подію миші, подія миші буде відправлено на ваш сценарій замість будь-якої іншої програми - це означає, що ваш сценарій повинен захопити подія миші. Якщо ваш скрипт не претендує на подію, його отримує вікно, яке має отримати його.

Якщо ви хочете, ви можете надіслати подію миші до зосередженого вікна або до вікна із заданими координатами ( xdotool click).

Ви можете використовувати XBindKeys для виконання сценарію для певних подій миші або клавіатури.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.