Detecte se o botão do mouse está pressionado e chame um script ou comando

11

Existe alguma maneira de obter o estado do botão do mouse no bash? O Xdotool pode apenas obter a localização do mouse.

Eu gostaria de definir algo em que eu possa definir uma regra em que, quando um botão do mouse for pressionado, um script possa ser executado.

MartinP
fonte
Você certamente pode detectar eventos do mouse , mas não acredito que haja uma maneira de perguntar ao sistema se o botão do mouse está sendo pressionado no momento . Todo analisador de atividade do mouse que eu vi observa, se você perdoar o pseudocódigo MouseButton1Downe os MouseButton1Upeventos para agir.
DopeGhoti
Eu preciso de algum script que observe o mouse e quando o botão esquerdo for pressionado, ele fará alguma coisa.
MartinP
Precisa de esclarecimentos. Você está querendo algo onde, quando está em um shell, e clica na janela do terminal, esse shell específico faz alguma coisa? Ou você deseja que, ao clicar em um botão específico do mouse em qualquer lugar em que um script seja executado (e você não precise vê-lo em um terminal)?
27413 Patrick
Preciso de script, que executarei e depois observarei os botões do mouse em qualquer lugar da área de trabalho. Não bloqueia o mouse, apenas o escuta. Eu tentei escrever um programa para ele em C com o Xlib, mas ele possui apenas XGrabButton e XGrabPointer e não o quero, porque ele agarra o ponteiro e outras janelas não registram eventos de clique.
MartinP

Respostas:

11
xinput --query-state <mouse_id>

Isso fornece um estado para todos os botões do mouse, assim:

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

O mouse_id pode ser obtido em:

xinput --list

Aqui está um pequeno script do observador de botão do mouse:

#!/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

Pode ser necessário alterar a sequência de detecção do MOUSE_ID ('mouse') para outra coisa.

Vencedor
fonte
xinput --listme dá X Input extension not available.. Infelizmente, o Google para esse assunto não revela nada que seja útil no meu caso: Xvnc4em uma VM Debian mínima. Provavelmente estou fora da sorte
Tino
6

Você pode usar a ferramenta de linha de comando xevpara descobrir o estado dos botões do mouse no ambiente X.

Exemplo

$ 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

Mas essas informações levam você apenas parcialmente a uma solução. As principais informações que você deseja extrair de cima são qual número está associado a um botão específico do mouse. No meu exemplo, estou pressionando o botão esquerdo "buton 1".

xbindkeys

Você pode usar esta ferramenta para configurar uma ação associada a um botão que está sendo pressionado. Você pode até configurar uma regra que exija o pressionamento de tecla ou mesmo um botão + pressionado juntos.

Exemplo

Você precisará primeiro verificar se os pacotes xbindkeys estão instalados.

Em seguida, você precisará executar o comando a seguir, apenas uma vez, para criar um arquivo de configuração do modelo xbindkeys.

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

Com o arquivo criado, você pode abri-lo em um editor de texto e adicionar uma regra como esta:

"xterm"
  b:3

Esta regra indica que queremos executar o programa xtermquando o botão 3 for pressionado. O "botão 3" é o botão direito do mouse.

Com a alteração acima feita, precisamos matar o xbindkeys se ele já estiver em execução e depois reiniciá-lo.

$ killall xbindkeys
$ xbindkeys

Agora, com isso sendo executado sempre que eu clicar no botão direito do mouse, um xtermserá executado.

Referências

slm
fonte
2
Mas isso funciona apenas para a janela criada. Como posso assistir a esse evento globalmente?
MartinP
4

se você quiser executar o comando bash no xterm com um clique do mouse (ou evento de roda), tente este exemplo:

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

isto é para evento de roda (para o conjunto de cliques 12)

Ivan M
fonte
Por favor, você pode explicar?
Lucaswxp
2

Você não pode pressionar o botão do bolo e comê-lo. Se você deseja que seu script receba um evento do mouse, o evento do mouse será enviado ao seu script em vez de qualquer outro aplicativo - isso significa que seu script precisa capturar o evento do mouse. Se o seu script não reivindicar o evento, a janela que deve obtê-lo será exibida.

Se desejar, você pode reenviar o evento do mouse para a janela focada ou a janela nas coordenadas especificadas ( xdotool click).

Você pode usar XBindKeys para executar um script em determinados eventos de mouse ou teclado.

Gilles 'SO- parar de ser mau'
fonte