Detectar se o botão do mouse estiver pressionado e invocar um script ou comando

10

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

Eu gostaria de definir algo onde eu possa definir uma regra onde quando um botão do mouse é pressionado, um script pode ser executado.

    
por MartinP 27.12.2013 / 01:39

4 respostas

9
xinput --query-state <mouse_id>

Isso lhe dá 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 de 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 string de detecção MOUSE_ID ('mouse') para outra coisa.

    
por 05.12.2014 / 02:52
5

Você pode usar a ferramenta de linha de comando xev para 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 essa informação só leva você parcialmente a uma solução. As principais informações que você deseja extrair acima é qual número está associado a um determinado botão no mouse. No meu exemplo, estou pressionando o botão esquerdo, "buton 1".

xbindkeys

Você pode usar essa ferramenta para configurar uma ação associada a um botão pressionado. Você pode até configurar uma regra que requer uma tecla pressionada ou até mesmo um botão + pressionado juntos.

Exemplo

Você precisará primeiro certificar-se de que os pacotes xbindkeys estejam instalados.

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

$ 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 xterm quando o botão 3 for pressionado. O "botão 3" é o botão direito do meu mouse.

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

$ killall xbindkeys
$ xbindkeys

Agora, com isso em execução sempre que eu clicar com o botão direito do mouse, um xterm será executado.

Referências

por 27.12.2013 / 02:14
3

se você quer apenas executar o comando bash no xterm ao clicar com o mouse (ou roda o evento), você pode tentar este exemplo:

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

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

    
por 07.03.2015 / 16:23
2

Você não pode ter o botão bolo para pressionar o evento e comê-lo. Se você quiser que seu script receba um evento de mouse, o evento do mouse será enviado ao seu script em vez de a 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á obtida.

Se desejar, você pode reenviar o evento do mouse para a janela em foco ou a janela em determinadas coordenadas ( xdotool click ).

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

    
por 28.12.2013 / 03:04

Tags