Como remapear botões automaticamente no mouse na inicialização?

30

Eu lutei com isso no fim de semana e preciso remapear os botões do mouse.

zerobandwidth
fonte

Respostas:

47

Eu tenho um mouse Logitech com 9 botões e pressionar o "botão do meio" (nº 2) envolve clicar na roda de rolagem. Não gosto disso porque sou desajeitada e, geralmente, acabo rolando a janela em que estou quando tento clicar na roda. Então, eu queria remapear automaticamente o botão do lado superior (# 9 nesse caso) para o botão do meio (# 2). Eu também queria mapear o botão do lado inferior (nº 8) para que ele execute um clique duplo no botão esquerdo (nº 1).

Embora meus objetivos fossem específicos, as soluções abaixo podem ser generalizadas para qualquer situação em que você queira remapear automaticamente os botões do mouse na inicialização.

Mapeando os botões do mouse para outros botões do mouse

Você precisará xinputinstalado para esta tarefa. Isso pode ser feito inteiramente em seu .xsessionrcarquivo. Primeiro, use xinputpara descobrir o nome atribuído ao mouse, que é correlacionado a um ID do dispositivo de entrada. Abaixo está uma amostra de saída do meu laptop:

⎡ Virtual core pointer                      id=2    [master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer            id=4    [slave  pointer  (2)]
⎜   ↳ Logitech USB Laser Mouse              id=11   [slave  pointer  (2)]
⎣ Virtual core keyboard                     id=3    [master keyboard (2)]
    ↳ Virtual core XTEST keyboard           id=5    [slave  keyboard (3)]

Meu mouse se chama Logitech USB Laser Mousee é mostrado como id=11. Seu mouse terá um nome diferente; descobrir isso é deixado como um exercício para o leitor.

Enquanto você ainda conhece o ID do dispositivo nesta sessão, descubra quantos botões o manipulador de entrada acha que seu mouse possui usando . Isso pode ser diferente do número de botões que é aparente no dispositivo.xinput list deviceID

Logitech USB Laser Mouse                    id=11   [slave  pointer  (2)]
    Reporting 7 classes:
        Class originated from: 11. Type: XIButtonClass
        Buttons supported: 16
        Button labels: "Button Left" "Button Middle" "Button Right" "Button Wheel Up" "Button Wheel Down" "Button Horiz Wheel Left" "Button Horiz Wheel Right" "Button Side" "Button Extra" "Button Forward" "Button Back" "Button Task" "Button Unknown" "Button Unknown" "Button Unknown" "Button Unknown"

Com o mouse, existem apenas 9 botões físicos óbvios, mas os xinputrelatórios 16.

Dada a natureza do USB, esse ID pode mudar toda vez que você reinicia, portanto, não é suficiente criar um script que esteja estaticamente codificado em um ID que você descobrir uma vez. Você precisará analisar dinamicamente isso na inicialização e executar seu novo mapa com base no ID atual.

Agora que você sabe o nome, pode usar xinput testpara descobrir qual chave remapear. Pressione os botões do mouse dos quais deseja mapear de e para, a fim de obter seus índices. (Para referência, 1, 2 e 3 "sempre" (por exemplo, geralmente)) referem-se aos botões esquerdo, do meio e direito de um mouse de 3 botões. Um novo mapa comum os inverte para tornar o mouse canhoto. )

button press   2
button release 2
button press   9
button release 9

Nesse caso, descobri que quero mapear o botão 9 (lateral, superior) para o botão 2 (meio).

Agora que você sabe como o mouse é chamado e quais botões deseja alterar, você pode escrever um ~/.xsessionrcscript que é chamado xinputpara executar o mapeamento de botão na inicialização. Abaixo está o meu script completo.

# Map button 9 (top side button) to button 2 (middle button)
my_mouse_id=$(xinput | grep "Logitech USB Laser Mouse" | sed 's/^.*id=\([0-9]*\)[ \t].*$/\1/')
echo $my_mouse_id > ~/temp/my_mouse_id
xinput set-button-map $my_mouse_id 1 2 3 4 5 6 7 8 2 10 11 12 13 14 15 16

A primeira linha aqui define uma variável de sessão temporária igual ao ID do mouse, conforme relatado por xinput. Isso é feito usando grepo nome conhecido do mouse no relatório de e xinput, em seguida, usando sedpara extrair o número de ID desse id=xxxtoken no relatório. Esse valor é usado em uma xinput set-button-mapdiretiva, que executa o novo mapeamento. No exemplo acima, a única alteração é que o botão nº 9 está sendo re-mapeado para imitar o botão nº 2. Todos os outros permanecem na configuração padrão.

Atualização: como o @Lokasenna aponta abaixo , se o dispositivo se reportar como mouse e teclado, talvez seja necessário limitar a contagem de resultados do grepuso -m 1.

Mapeando botões do mouse para funções arbitrárias

Veja também esta resposta .

Você precisará xinput, xbindkeyse xautomation(incluindo xte) instalado para esta tarefa.

Use xinput liste xinput testpara descobrir o ID do dispositivo do mouse e o número do botão que você deseja atribuir. No meu caso, eu queria mapear o botão do lado inferior (nº 8) com um clique duplo no botão esquerdo (nº 1).

Crie ou edite ~/.xbindkeysrc. O formato deste arquivo é uma série de linhas emparelhadas. A primeira linha é um comando a ser executado para um evento; a segunda linha é a descrição do evento. Usaremos o xtecomponente de xautomationpara enviar eventos diretamente para o manipulador de entrada.

Para criar um evento de clique duplo quando um botão é lançado, adicionei o seguinte:

"/usr/bin/xte 'mouseclick 1' 'mouseclick 1' &"
b:8 + Release

Essa configuração mapeia uma sequência de dois cliques do mouse no botão 1 para o lançamento do botão 8. (Em teoria, acho que você pode mapear qualquer comando para um botão do mouse, mas este é o caso mais comum. Veja esta resposta para outros exemplos práticos.)

Atualização para o Ubuntu 16.04

Para usuários com vários mouses conectados ao seu sistema, você também precisa passar o ID do dispositivo. Isso pode não se aplicar a todos os usuários e foi descoberto no Ubuntu 16.04 com Unity.

xinput list

⎡ Virtual core pointer                      id=2    [master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer                id=4    [slave  pointer  (2)]
⎜   ↳ Kensington      Kensington Expert Mouse   id=9    [slave  pointer  (2)]
⎜   ↳ SynPS/2 Synaptics TouchPad                id=13   [slave  pointer  (2)]
⎜   ↳ TPPS/2 IBM TrackPoint                     id=14   [slave  pointer  (2)]

Modifique o arquivo .xbindkeysrc referenciando o valor id = da saída do comando (id = 9 neste exemplo):

"/usr/bin/xte -i 9 'mouseclick 1' 'mouseclick 1' &"
b:8 + Release
zerobandwidth
fonte
7
Obrigado pela informação. Parece que o seu awk precisaria ser alterado com base no número de palavras no dispositivo. Eu useised 's/^.*id=\([0-9]*\)[ \t].*$/\1/'
jbo5112 23/09/16
De acordo com o teste xinput, a tecla thumb aciona três pressionamentos de tecla diferentes - como uni-los todos em .xbindkeysrc?
### axltop #
@ jbo5112 Comecei a usar vários mouses no meu laptop de trabalho e tive boas razões para revisitar seu comentário. Agora substituí minha awkdeclaração antiga pela sua sedem meus exemplos. Obrigado pela melhoria!
Zerobandwidth
2
Não há necessidade de usar um ID no mapa de conjunto de botões; por exemplo:xinput set-button-map "Logitech Trackball" 1 3 3
jaustin
Problema incomum, eu acho: xinputmostra meu mouse duas vezes, assim: ↳ USB OPTICAL MOUSE id = 12 [ponteiro escravo (2)] ↳ USB OPTICAL MOUSE id = 13 [ponteiro escravo (2)] Somente o ID 13 captura comandos xinput test. O script sempre captura o primeiro ID. Mas por que duas vezes, afinal? Ambos desaparecem quando eu desconecto este mouse e reaparecem quando conectados.
W / sky
6

Etapas curtas para isso são:

Existe um utilitário chamado xinput. xinput listou apenas xinputmostrará todos os dispositivos de entrada X e seus IDs. Aqui você encontra o ID do mouse que deseja remapear.

Usarei meu ID como exemplo, na minha configuração, que é 21, e depois xinput --get-button-map 21gerarei

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

Agora, se você quiser, digamos, trocar os botões esquerdo e direito, basta executar

xinput --set-button-map 21 3 2 1

Aqui estamos, o remapeamento está feito.

Para executá-lo na inicialização, basta colocar isso em um arquivo:

echo "xinput --set-button-map 21 3 2 1" > leftmouseremap.sh

dê permissão executável

chmod +x leftmouseremap.sh 

Por fim, adicione isso ao Statrtup Application manualmente a partir da GUI ou, se você quiser da CLI, coloque o texto abaixo (altere os caminhos para o seu) em um arquivo no seu ~/.config/autostart, aqui está o meu ( less .config/autostart/leftmouseremap.sh.desktop):

[Desktop Entry]
Type=Application
Exec=/home/ruslan/leftmouseremap.sh
Hidden=false
NoDisplay=false
X-GNOME-Autostart-enabled=true
Name[en_US]=/home/ruslan/leftmouseremap.sh
Name=/home/ruslan/leftmouseremap.sh
Comment[en_US]=
Comment=

Lembre-se de que, com o KDE, seria o caminho ~/.kde/Autosart; para outros gerentes de área de trabalho, isso pode ser bem diferente. Como alternativa, a execução da inicialização pode ser feita com uma abordagem geral usando /etc/rc.local.

Ruslan Gerasimov
fonte
Isso resolveu meu problema de derramamento de água. Tenho os botões esquerdo / direito do mouse abaixo do touchpad do meu laptop. Derramei água e agora os dois botões enviam um sinal de clique do meio para o sistema operacional (descobri isso usando o aplicativo 'keymon'). Usei seu método para remapear o clique do meio para clicar com o botão esquerdo, para que eu possa, no mínimo, desfrutar de uma experiência com o botão esquerdo. Eu nunca uso o clique do meio para que funcione perfeitamente para mim :) Obrigado pelas instruções simples. Meu ID do dispositivo de entrada era 11, então executei "xinput --set-button-map 11 1 1 3" Obrigado!
Vahid Pazirandeh 20/09
3

Ao usar a excelente resposta da zerobandwidth , alguns dispositivos, como o MX Ergo da Logitech, aparecem como um ponteiro e um dispositivo de teclado :

⎡ Virtual core pointer                          id=2    [master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer                id=4    [slave  pointer  (2)]
⎜   ↳ Logitech MX Ergo                          id=10   [slave  pointer  (2)]
⎜   ↳ SynPS/2 Synaptics TouchPad                id=14   [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)]
    ...
    ↳ Logitech MX Ergo                          id=15   [slave  keyboard (3)]

Consequentemente, grep "Logitech MX Ergo"acaba retornando dois valores. O último acaba sendo incluído como o primeiro item na sequência de mapeamento e aparafusa todos os botões do mouse.

A correção é fácil - basta usar grepo argumento de contagem máxima -m 1:

my_mouse_id=$(xinput | grep -m 1 "Logitech MX Ergo" | sed 's/^.*id=\([0-9]*\)[ \t].*$/\1/')
echo $my_mouse_id > ~/temp/my_mouse_id
xinput --set-button-map $my_mouse_id 1 2 3 4 5 6 7 8 2 10 11 12 13 14 15 16
Lokasenna
fonte
Ótima dica; Eu editei a resposta para incluí-la. Obrigado!
Zerobandwidth
1

Consegui mudar o mapeamento do botão do meio do mouse da Logitech para 'Return' usando o Easystroke Gesture Recognition, que baixei do Ubuntu Software Center. Editar: No aplicativo, você selecionaria Adicionar ação, Nomeie-o, selecione o tipo de chave, clique em Detalhes e pressione Enter, pressione Gravar curso e, durante o prompt, pressione o botão do meio.

atr15
fonte
1
Bem-vindo ao AskUbuntu. Você precisa fornecer mais detalhes com sua resposta.
David
Ok, veja acima editar.
atr15 15/09/2015
Boa pegada. Mas o que você descreveu não funciona como você instruiu: na verdade, o botão do meio é o botão padrão para colocar o aplicativo no 'modo de reconhecimento de gestos': ao pressioná-lo, o aplicativo começa a reconhecer o gesto que você está fazendo. No entanto, +1 porque esse aplicativo possui um módulo para revelar os IDs dos botões do mouse; isso ajuda quando queremos usar os xinputbotões que não aparecem ao usar xinput list <devID>.
1111161171159459134
1
Ah, isso veio 1 ano depois - sua resposta vale +1
1111161171159459134
1

Antes da versão 12.04, havia uma ferramenta gráfica fácil chamada "btnx" no repositório padrão, que era adicionada como "Propriedades do botão" na Configuração do sistema. Infelizmente, no entanto, foi descartado. Um PPA "não confiável" atualmente mantido para 14.04, 16.04 e 18.04 está aqui: https://launchpad.net/~oliverstar/+archive/ubuntu/ppa (encontrado em https://launchpad.net/ubuntu/xenial/+source / btnx )

Ele não se integra às configurações do sistema, mas está funcionando muito bem no meu laptop com um mouse barato de 5 botões. Também pode remapear para pressionar teclas e comandos e a configuração é muito mais simples do que com qualquer outro método!

w-sky
fonte
Gostaria de saber se a ferramenta está fazendo as mesmas alterações, apenas em segundo plano. ^ _ ^
zerobandwidth 10/10
0

Eu tenho o HP elitebook 2570p, Ubuntu 18.04.2. Aqui eu tenho um trackpoint que é inútil para mim e aqui estão 2 botões de trackpoint inúteis sob o espaço

Não uso essas teclas porque tenho sob o touchpad. Eu gostaria de remapear esses botões para left = back_button (Alt_L + Left), o botão direito = middle_mouse_button. O trackpoint em "xinput" é id = 11 e o botão esquerdo é o número 1, o direito é 3.

Alguém poderia me escrever o código certo para copiar no terminal? Combinei com xbindkeysrc, mas isso define qualquer ação para os botões (trackpoint e touchpad)

Átomo
fonte
Fiz isso e simplifiquei: <code> echo xinput set-button-map 11 8 1 2 >> ~ / .xsessionrc </code> Faz meus botões de touchpoint (id 11) virar à esquerda como oitavo botão, o meio como clique esquerdo (no 1) e o botão direito como o meio e depois 'code' echo -e "\" / usr / bin / xte 'keydown Alt_L' 'key Left' 'keyup Alt_L' & amp; \ "\ nb: 8" >> ~ / .xbindkeysrc 'code' Define o botão no 8 (b: 8) para Alt_L + Esquerda => voltar :) Agora eu tenho dois botões úteis do mouse
Atom