Eu lutei com isso no fim de semana e preciso remapear os botões do mouse.
Eu lutei com isso no fim de semana e preciso remapear os botões do mouse.
Respostas:
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.
Você precisará xinput
instalado para esta tarefa. Isso pode ser feito inteiramente em seu .xsessionrc
arquivo. Primeiro, use xinput
para 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 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 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 xinput
relató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 test
para 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 ~/.xsessionrc
script que é chamado xinput
para 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 grep
o nome conhecido do mouse no relatório de e xinput
, em seguida, usando sed
para extrair o número de ID desse id=xxx
token no relatório. Esse valor é usado em uma xinput set-button-map
diretiva, 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 grep
uso -m 1
.
Veja também esta resposta .
Você precisará 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 (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 xte
componente de xautomation
para 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.)
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
awk
declaração antiga pela sua sed
em meus exemplos. Obrigado pela melhoria!
xinput set-button-map "Logitech Trackball" 1 3 3
xinput
mostra 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.
Etapas curtas 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 deseja remapear.
Usarei meu ID como exemplo, na minha configuração, que é 21, e depois xinput --get-button-map 21
gerarei
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
.
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 grep
o 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
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.
xinput
botões que não aparecem ao usar xinput list <devID>
.
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!
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)
sed 's/^.*id=\([0-9]*\)[ \t].*$/\1/'