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 list
onseusistema, ninguém pode oferecer uma resposta que você possa usar diretamente. Isso ocorre porque xinput
pode 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:
- Como posso alterar o mapeamento do teclado do mouse
- 'xinput list' mostra o mesmo dispositivo duas vezes e os IDs dos dispositivos mudam: como usar 'set-prop' em um script?
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 =>> left
o 3 =>> right
script 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 xinput
há 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 reverse
para normal
em 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.