Определить, нажата ли кнопка мыши, затем вызвать скрипт или команду

11

Есть ли способ получить состояние кнопки мыши из bash? Xdotool может получить только местоположение мыши.

Я хотел бы установить кое-что, где я могу определить правило, при котором при нажатии кнопки мыши может выполняться скрипт.

MartinP
источник
Вы, конечно, можете обнаружить события мыши , но я не верю, что есть способ спросить систему, нажата ли кнопка мыши в данный момент . Каждый анализатор активности мыши, за которым я видел, следит, если вы простите псевдокод, 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 ('mouse') на что-то другое.

Виктор
источник
xinput --listдает мне X Input extension not available.. К сожалению, Google по этому вопросу не раскрывает ничего полезного в моем случае: Xvnc4на минимальной виртуальной машине Debian. Вероятно, мне не повезло
Тино
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.

Ссылки

SLM
источник
2
Но это работает только для созданного окна. Как я могу поймать это событие во всем мире?
MartinP
4

если вы просто хотите запустить команду bash в xterm по щелчку мыши (или по событию wheel), вы можете попробовать этот пример:

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

это для события колеса (для щелчка, установленного вместо 12)

Иван М
источник
Пожалуйста, вы можете объяснить?
lucaswxp
2

Вы не можете сделать так, чтобы ваш пирог нажал на событие и съел его. Если вы хотите, чтобы ваш скрипт получал событие мыши, тогда событие мыши будет отправлено вашему сценарию, а не любому другому приложению - это означает, что ваш сценарий должен захватить событие мыши. Если ваш сценарий не требует события, то окно, которое должно получить его, получает его.

Если вы хотите, вы можете повторно отправить событие мыши в сфокусированное окно или окно с заданными координатами ( xdotool click).

Вы можете использовать XBindKeys для выполнения скрипта при определенных событиях мыши или клавиатуры.

Жиль "ТАК - перестань быть злым"
источник