Como faço automaticamente remapear botões do meu mouse na inicialização?

17

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

    
por zerobandwidth 07.07.2014 / 15:13

3 respostas

32

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
    
por zerobandwidth 07.07.2014 / 15:13
1

Consegui alterar o mapeamento do botão do meio do mouse da minha Logitech para 'Return' usando o Easystroke Gesture Recognition, que baixei do Ubuntu Software Center. Edit: No aplicativo, você selecionaria Add Action, Name it, selecione o tipo de chave, clique em Details e pressione Enter, clique em Record Stroke e, durante o prompt, pressione o botão do meio.

    
por atr15 13.09.2015 / 20:02
0

Os passos curtos para isso são:

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

Eu usarei meu ID como exemplo, da minha configuração, que é 21, então xinput --get-button-map 21 será processado

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, simplesmente execute

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

Aqui estamos, o remapeamento é 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 

Finalmente, adicione isso ao Statrtup Application manualmente 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 é 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=

Tenha em mente que, com o KDE, o caminho seria como ~/.kde/Autosart , para outros gerentes de Desktop isso pode ser diferente. Como alternativa, a execução de inicialização pode ser feita com abordagem geral usando /etc/rc.local .

    
por Ruslan Gerasimov 06.07.2017 / 10:30