Eu tenho um mouse da Logitech com 9 botões e pressionar o "botão do meio" (# 2) envolve clicar na roda de rolagem. Eu não gosto disso porque sou desajeitado e normalmente acabo rolando a janela em que estou quando tento clicar na roda. Então eu quis automaticamente remapear o botão do lado superior (# 9 neste caso) para o botão do meio (# 2). Eu também queria mapear o botão do lado inferior (# 8) para que ele execute um clique duplo no botão esquerdo (# 1).
Embora meus objetivos fossem específicos, as soluções abaixo podem ser generalizadas para qualquer situação na qual você deseje remapear automaticamente os botões do mouse na inicialização.
Mapeando os botões do mouse para outros botões do mouse
Você precisará de xinput
instalado para essa tarefa. Isso pode ser feito inteiramente no seu arquivo .xsessionrc
. Primeiro, use xinput
para descobrir o nome atribuído ao mouse, que é correlacionado a um ID de dispositivo de entrada. Abaixo estão alguns exemplos 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 Mouse
e é 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 na esta sessão, descubra quantos botões o manipulador de entrada acha que seu mouse possui, usando xinput list
deviceID
. Isso pode ser diferente do número de botões que é aparente no dispositivo.
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 meu mouse, existem apenas 9 botões físicos óbvios, mas xinput
reporta 16.
Dada a natureza do USB, esse ID pode mudar toda vez que você reiniciar, por isso, não é suficiente para o script de algo que é codificado estaticamente para um ID que você descobre uma vez. Você terá que analisar dinamicamente isso na inicialização e executar seu remapeamento com base no ID atual.
Agora que você sabe o nome dele, você pode usar xinput test
para descobrir qual tecla deve ser remapeada. Pressione os botões do mouse que você deseja mapear de e para, a fim de obter seus índices. (Para referência, 1, 2 e 3 "sempre" (ou seja, geralmente) referem-se aos botões esquerdo, médio e direito de um mouse de 3 botões. Um mapeamento comum os inverte para tornar o mouse canhoto. )
button press 2
button release 2
button press 9
button release 9
Neste caso, descobri que quero mapear o botão # 9 (lado superior) para o botão nº 2 (meio).
Agora que você sabe como seu mouse é chamado e quais botões deseja alterar, é possível escrever um script ~/.xsessionrc
que invoque xinput
para executar o mapeamento de novo botão na inicialização. Abaixo está meu roteiro 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].*$//')
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 por grep
ing para o nome conhecido do mouse no relatório de xinput
, em seguida, usando sed
para extrair o número de ID desse token id=xxx
no relatório. Este valor é então usado em uma diretiva xinput set-button-map
, que executa o mapeamento. No exemplo acima, a única mudança é que o botão nº 9 está sendo mapeado novamente para imitar o botão nº 2. Todos os outros permanecem com a configuração padrão.
Mapeando Botões do Mouse para Funções Arbitrárias
Veja também esta resposta .
Você precisará de xinput
, xbindkeys
e xautomation
(incluindo xte
) instalado para esta tarefa.
Use xinput list
e xinput test
para 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 (# 8) para um clique duplo do botão esquerdo (# 1).
Crie ou edite ~/.xbindkeysrc
. O formato deste arquivo é uma série de linhas pareadas. A primeira linha é um comando a ser executado para um evento; a segunda linha é a descrição do evento. Usaremos o componente xte
de xautomation
para enviar eventos diretamente para o manipulador de entrada.
Para criar um evento de clique duplo quando um botão é liberado, adicionei o seguinte:
"/usr/bin/xte 'mouseclick 1' 'mouseclick 1' &"
b:8 + Release
Esta configuração mapeia uma sequência de dois cliques do mouse no botão # 1 até a liberação do botão # 8. (Em teoria, eu acho que você poderia 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 16.04 Ubuntu
Para usuários com vários mouses conectados ao seu sistema, você também precisa informar o ID do dispositivo. Isso pode não se aplicar a todos os usuários e foi descoberto no Ubuntu 16.04 com o 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)]
Em seguida, 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