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

2

Esta resposta mostra as linhas de comando para trocar o botão primário e secundário do mouse. No entanto, eu gostaria que um script trocasse automaticamente os botões do mouse toda vez que fosse executado. Alguém poderia me sugerir como fazer isso, eu sei quase nada sobre scripts bash.

    
por Fachicon 22.05.2016 / 00:31

5 respostas

0

Sem fornecer a saída de xinput list em seu sistema, ninguém pode oferecer uma resposta que você possa usar diretamente. Isso porque xinput pode mostrar dispositivos diferentes dos ilustrados em .

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 no 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)]

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

Dada a variação (e vaga documentação para xinput ), você provavelmente não pode automatizar a parte sobre como obter o ID do dispositivo de mouse.

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

xinput get-button-map 12

em uma matriz. Algumas linguagens de script fornecem matrizes, 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ê precisa adivinhar se os botões extras significam algo e
  • até mesmo a atribuição de três números de botão pode não ser a óbvia esquerda / meio / direita.

Em seguida, o script para alternar as chaves precisa salvar seu estado em algum lugar, por exemplo, um arquivo em seu diretório pessoal. Um script para gerenciar isso teria que

  • inicialize o arquivo com os botões atuais
  • atualize-o de acordo com o seu esquema de alternar botões (com 3 existem "3!" arranjos possíveis)

Supondo que você tenha a configuração (e interpretação) mais simples, 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 de mouse). Para o exemplo dado (e nomear o script "toggle-buttons", tornando-o executável e colocando-o em seu $PATH ):

toggle-buttons 12

deve fazer o trabalho.

    
por 22.05.2016 / 12:23
1

Adicionarei minha própria solução a isso, pois as outras respostas às vezes parecem muito complicadas para a simples tarefa de trocar os botões primários (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
    
por 12.12.2016 / 19:01
0

Você pode colocar a linha de comando em um arquivo:

#!/bin/bash

xinput set-button-map 12 3 2 1 

Depois de fazer isso, torne-o executável (se o arquivo tiver o nome swap_buttons.sh):

chomd +x swap_buttons.sh

Agora você pode executar o script com:

./swap_buttons.sh
    
por 22.05.2016 / 01:40
0

Se você precisar alternar um estado (e seu reverso / não-reverso, a ordem das teclas do mouse é tal estado), do dispositivo você tem que ser capaz de consultar o dispositivo para o estado atual, ou manter o estado em algum arquivo.

Como não consegui descobrir se xinput tem uma maneira de solicitar um mouse para o mapeamento de botões, provavelmente você deve armazenar o estado em um arquivo, por exemplo, %código%. Seu script deve escrever 'reverse' no arquivo quando ele for executado:

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

xinput set-button-map 12 2 3 A ação real a ser tomada depende da leitura do arquivo: faça a primeira etapa se o conteúdo do arquivo quando o script for iniciado for ~/.config/mousebuttons (ou o arquivo não existir) e faça o segundo se o conteúdo for normal . / p>

O conteúdo do arquivo passa de reverse para reverse em cada chamada. Seu estado real pode não refletir o conteúdo do arquivo, por exemplo depois de uma reinicialização, imprima na tela o que o novo estado também é para um lembrete visual. Se o arquivo estiver fora de sincronia com o estado, uma única chamada do script será sincronizada novamente.

    
por 22.05.2016 / 07:24
0

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 você conhece o mapeamento de botões padrão (ou seja, quais botões são esquerdos e corretos para que você possa trocá-los)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 e 3 =>> right , o script acima apenas lê o mapeamento atual, troca os valores primeiro e terceiro e define o novo mapeamento.

    
por 22.05.2016 / 12:32

Tags