Script para trocar botões primários e secundários do mouse

Script para trocar botões primários e secundários do mouse

Esta respostamostre as linhas de comando para trocar o botão primário e secundário do mouse. No entanto, gostaria que um script trocasse automaticamente os botões do mouse sempre que for executado. Alguém poderia me dar uma dica de como fazer isso, não sei quase nada sobre scripts bash.

Responder1

Sem fornecer a saída de xinput listonseusistema, ninguém pode oferecer uma resposta que você possa usar diretamente. Isso ocorre porque xinputpode mostrar dispositivos diferentes dos ilustrados emComo faço para trocar os botões do mouse para canhotos no terminal?.

Por exemplo, aqui está a saída no OSX:

$ xinput list
⎡ Virtual core pointer                      id=2    [master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer                id=4    [slave  pointer  (2)]
⎜   ↳ xquartz virtual pointer                   id=6    [slave  pointer  (2)]
⎜   ↳ pen                                       id=8    [slave  pointer  (2)]
⎜   ↳ cursor                                    id=9    [slave  pointer  (2)]
⎜   ↳ eraser                                    id=10   [slave  pointer  (2)]
⎣ Virtual core keyboard                     id=3    [master keyboard (2)]
    ↳ Virtual core XTEST keyboard               id=5    [slave  keyboard (3)]
    ↳ xquartz virtual keyboard                  id=7    [slave  keyboard (3)]

e aqui está a saída do meu Debian/testing:

$ xinput list
⎡ Virtual core pointer                      id=2    [master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer                id=4    [slave  pointer  (2)]
⎜   ↳ VMware VMware Virtual USB Mouse           id=7    [slave  pointer  (2)]
⎜   ↳ VirtualPS/2 VMware VMMouse                id=9    [slave  pointer  (2)]
⎜   ↳ VirtualPS/2 VMware VMMouse                id=10   [slave  pointer  (2)]
⎣ Virtual core keyboard                     id=3    [master keyboard (2)]
    ↳ Virtual core XTEST keyboard               id=5    [slave  keyboard (3)]
    ↳ Power Button                              id=6    [slave  keyboard (3)]
    ↳ AT Translated Set 2 keyboard              id=8    [slave  keyboard (3)]

de modo que em um sistema haja possivelmente um ID para escolher (ponteiro virtual xquartz), enquanto em outro há três possibilidades. Se você ler estes, descobrirá que os exemplos citados aqui não são inventados:

Dada a variação (e vagadocumentação paraxinput), você provavelmente não poderá automatizar a parte de obtenção do ID do dispositivo de mouse.

Supondo que você escolha um identificador utilizável e, para fins de discussão, chame-o de "12". Um script pode ler a saída de

xinput get-button-map 12

em uma matriz. Algumas linguagens de script fornecem arrays, por exemplo, bash. Mas existem várias armadilhas:

  • no meu sistema OSX, que retorna uma lista "1 2 3", enquanto no sistema Debian, que retorna uma lista "1 2 3 4 5 6 7 8 9 10 11 12".
  • você tem que adivinhar se os botões extras significam alguma coisa, e
  • mesmo a atribuição de três números de botão pode não ser o óbvio esquerdo/meio/direito.

Então o script para alternar as chaves deve salvar seu estado em algum lugar, por exemplo, um arquivo em seu diretório inicial. Um script para gerenciar isso teria que

  • inicialize o arquivo com os botões atuais
  • atualize-o de acordo com seu esquema de botões de alternância (com 3 há "3!" arranjos possíveis)

Supondo que você tenha a configuração (e interpretação) mais simples, você poderia fazer algo assim em um script:

#!/bin/sh
id=$1
cfg=$HOME/.mousebuttons
[ -f "$cfg" ] || xinput get-button-map $id | awk ' { printf "normal: %s\n", $0; }' >$cfg
mode=$(awk '{print $1;}' <$cfg)
# read and toggle
list=$(awk '{printf "%d %d %d\n", $3, $2, $4; }' <$cfg)
if [ "x$mode" = "xnormal" ]
then
    mode=reverse
else
    mode=normal
fi
# update the configuration
echo "$mode $list" | awk '{ printf "%s %d %d %d\n", $1, $2, $3, $4; }' >$cfg
xinput set-button-map $id $list
# show result
xinput get-button-map $id

O script aceita um parâmetro (o identificador do dispositivo do mouse). Para o exemplo dado (e nomeando o script como "botões de alternância", tornando-o executável e colocando-o no seu $PATH):

toggle-buttons 12

deveria fazer o trabalho.

Responder2

Acrescentarei minha própria solução, pois as outras respostas às vezes parecem muito complicadas para a simples tarefa de trocar os botões principais (1 e 3) de um mouse.

#!/bin/bash                                                                                           
set -e

# To get the name of a devices, do "xinput list --name-only"                                          
DEVICE_NAME="PixArt Microsoft USB Optical Mouse"

current_button_map=$(xinput get-button-map "$DEVICE_NAME")

if [[ $current_button_map =~ "1 2 3" ]]; then
    echo "Making the mouse a lefty"
    xinput set-button-map "$DEVICE_NAME" 3 2 1
else
    echo "Making the mouse a righty"
    xinput set-button-map "$DEVICE_NAME" 1 2 3
fi

Responder3

Eu faria algo como:

#!/bin/sh

mxid=$(xinput --list --short | awk '/Razer/{gsub(/.*id=/, "");gsub(/[[:blank:]].*/, "");print}')
bmap=$(xinput get-button-map $mxid)
nmap=$(awk '{s=$1;$1=$3;$3=s};1' <<<$bmap)
xinput set-button-map $mxid $nmap

Isso pressupõe que você saiba o "nome" do seu mouse (no meu caso é Razer) e conheça o mapeamento de botões padrão (ou seja, quais botões estão à esquerda e à direita para que você possa trocá-los) obtido com xinput list $mxid:

Button labels: "Button Left" "Button Middle" "Button Right"....

e xinput get-button-map $mxid:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

Como você pode ver, no meu caso 1 =>> lefto 3 =>> rightscript acima apenas lê o mapeamento atual e troca o primeiro e o terceiro valores e então define o novo mapeamento.

Responder4

Se você precisar alternar um estado (e a ordem inversa/inversa das teclas do mouse é esse estado), do dispositivo, você deverá ser capaz de consultar o estado atual do dispositivo ou manter o estado em algum arquivo.

Como não consegui descobrir se xinputhá uma maneira de solicitar ao mouse o mapeamento do botão, você provavelmente deveria armazenar o estado em um arquivo, por exemplo ~/.config/mousebuttons. Seu script deve escrever 'reverse' no arquivo quando for executado:

xinput set-button-map 12 3 2 1 e escreva 'normal' nesse arquivo ao executar:

xinput set-button-map 12 2 3 A ação real a ser tomada depende da leitura do arquivo: execute a primeira etapa se o conteúdo do arquivo quando o script for iniciado for normal(ou o arquivo não existir) e execute a segunda se o conteúdo são reverse.

O conteúdo do arquivo muda de reversepara normalem cada chamada. Seu estado real pode não refletir o conteúdo do arquivo, por exemplo, após uma reinicialização; portanto, imprima na tela qual é o novo estado também para um lembrete visual. Se o arquivo estiver fora de sincronia com o estado, uma única invocação do seu script irá sincronizá-lo novamente.

informação relacionada