Comment remapper automatiquement les boutons de ma souris au démarrage?

30

J'ai eu du mal avec cela au cours du week-end et j'ai besoin de remapper les boutons de ma souris.

zerobandwidth
la source

Réponses:

47

J'ai une souris Logitech avec 9 boutons, et appuyer sur le "bouton du milieu" (# 2) implique de cliquer sur la molette de défilement. Je n'aime pas cela parce que je suis maladroit et finis généralement par faire défiler la fenêtre dans laquelle je suis lorsque j'essaie de cliquer sur la roue. Je voulais donc remapper automatiquement le bouton du haut (# 9 dans ce cas) sur le bouton du milieu (# 2). Je voulais également mapper le bouton latéral inférieur (# 8) afin qu'il exécute un double-clic sur le bouton gauche (# 1).

Bien que mes objectifs soient spécifiques, les solutions ci-dessous peuvent être généralisées à toute situation dans laquelle vous souhaitez remapper automatiquement les boutons de la souris au démarrage.

Mappage des boutons de la souris à d'autres boutons de la souris

Vous devrez xinputinstaller pour cette tâche. Cela peut être fait entièrement dans votre .xsessionrcdossier. Tout d'abord, utilisez xinputpour découvrir le nom attribué à votre souris, qui est ensuite corrélé à un ID de périphérique d'entrée. Voici un exemple de sortie de mon ordinateur portable:

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

Ma souris s'appelle Logitech USB Laser Mouseet s'affiche comme id=11. Votre souris aura un nom différent; comprendre que cela est laissé comme un exercice pour le lecteur.

Bien que vous connaissiez toujours l'ID du périphérique dans cette session, découvrez combien de boutons le gestionnaire d'entrée pense que votre souris possède, en utilisant . Cela peut être différent du nombre de boutons qui apparaît sur l'appareil.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"

Avec ma souris, il n'y a que 9 boutons physiques évidents, mais en xinputrapporte 16.

Compte tenu de la nature de l'USB, cet ID peut changer chaque fois que vous redémarrez, il ne suffit donc pas de scripter quelque chose qui est statiquement associé à un ID que vous découvrez une fois. Vous devrez analyser dynamiquement cela au démarrage et exécuter votre re-mappage en fonction de l'ID actuel.

Maintenant que vous connaissez son nom, vous pouvez utiliser xinput testpour déterminer la clé à remapper. Appuyez sur les boutons de la souris que vous souhaitez mapper depuis et vers, afin d'obtenir leurs indices. (Pour référence, 1, 2 et 3 "toujours" (c'est-à-dire, généralement) se réfèrent aux boutons gauche, central et droit d'une souris à 3 boutons. Une nouvelle cartographie commune les inverse pour rendre la souris gaucher. )

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

Dans ce cas, j'ai trouvé que je voulais mapper le bouton # 9 (côté, haut) au bouton # 2 (milieu).

Maintenant que vous savez comment s'appelle votre souris et quels boutons vous souhaitez modifier, vous pouvez écrire un ~/.xsessionrcscript qui invoque xinputpour exécuter le remappage des boutons au démarrage. Voici mon script complet.

# 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

La première ligne définit ici une variable de session temporaire égale à l'ID de la souris tel que rapporté par xinput. Cela se fait grepen recherchant le nom connu de la souris dans le rapport xinput, puis en utilisant sedpour extraire le numéro d'identification de ce id=xxxjeton dans le rapport. Cette valeur est ensuite utilisée dans une xinput set-button-mapdirective, qui exécute le remappage. Dans l'exemple ci-dessus, le seul changement est que le bouton n ° 9 est en cours de mappage sur le bouton n ° 2. Tous les autres restent à leur réglage par défaut.

Mise à jour: Comme le souligne @Lokasenna ci - dessous , si votre appareil se signale à la fois comme une souris et un clavier, vous devrez peut-être limiter le nombre de résultats de l' greputilisation -m 1.

Mappage des boutons de la souris à des fonctions arbitraires

Voir aussi cette réponse .

Vous aurez besoin de xinput, xbindkeyset xautomation(y compris xte) installé pour cette tâche.

Utilisez xinput listet xinput testpour découvrir l'ID de l'appareil de votre souris et le numéro du bouton que vous souhaitez attribuer. Dans mon cas, je voulais mapper le bouton latéral inférieur (# 8) à un double-clic sur le bouton gauche (# 1).

Créez ou modifiez ~/.xbindkeysrc. Le format de ce fichier est une série de lignes appariées. La première ligne est une commande à exécuter pour un événement; la deuxième ligne est la description de l'événement. Nous utiliserons le xtecomposant de xautomationpour envoyer des événements directement au gestionnaire d'entrée.

Pour créer un événement de double-clic lorsqu'un bouton est relâché, j'ai ajouté ce qui suit:

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

Cette configuration associe une séquence de deux clics de souris sur le bouton n ° 1 à la libération du bouton n ° 8. (En théorie, je suppose que vous pouvez mapper n'importe quelle commande sur un bouton de la souris, mais c'est le cas le plus courant. Voir cette réponse pour d'autres exemples pratiques.)

Mise à jour pour 16.04 Ubuntu

Pour les utilisateurs avec plusieurs souris connectées à votre système, vous devez également transmettre l'ID de l'appareil. Cela peut ne pas s'appliquer à tous les utilisateurs et a été découvert sur Ubuntu 16.04 avec 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)]

Modifiez ensuite le fichier .xbindkeysrc en référençant la valeur id = à partir de la sortie de la commande (id = 9 dans cet exemple):

"/usr/bin/xte -i 9 'mouseclick 1' 'mouseclick 1' &"
b:8 + Release
zerobandwidth
la source
7
Merci pour l'information. Votre awk semble devoir être modifié en fonction du nombre de mots dans l'appareil. J'ai utilisésed 's/^.*id=\([0-9]*\)[ \t].*$/\1/'
jbo5112
Selon le test xinput, la touche de pouce déclenche trois pressions de touches différentes - comment les lier ensemble dans .xbindkeysrc?
axltop
@ jbo5112 Je viens de commencer à utiliser plusieurs souris sur mon ordinateur portable de travail et j'avais de bonnes raisons de revoir votre commentaire. J'ai maintenant remplacé mon ancienne awkdéclaration par votre seddéclaration dans mes exemples. Merci pour l'amélioration!
zerobandwidth
2
Il n'est pas nécessaire d'utiliser un identifiant dans set-button-map; par exemple:xinput set-button-map "Logitech Trackball" 1 3 3
jaustin
Problème inhabituel je suppose: xinputmontre ma souris deux fois, comme ceci: ↳ USB OPTICAL MOUSE id = 12 [pointeur esclave (2)] ↳ USB OPTICAL MOUSE id = 13 [pointeur esclave (2)] Seul l'ID 13 capturera les commandes avec xinput test. Le script attrapera toujours le premier ID. Mais pourquoi est-ce deux fois de toute façon? Les deux disparaissent lorsque je déconnecte cette souris et réapparaissent lorsqu'ils sont connectés.
w-sky
6

Les étapes courtes pour cela sont:

Il existe un utilitaire appelé xinput. xinput listou xinputaffichera simplement tous les périphériques d'entrée X et leurs identifiants. Vous trouverez ici l'ID de la souris que vous souhaitez remapper.

Je vais utiliser mon ID comme exemple, à partir de ma configuration, qui est 21, puis xinput --get-button-map 21afficherai

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

Maintenant, si vous voulez, par exemple, permuter les boutons gauche et droit, vous exécutez simplement

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

Nous y voilà, le remappage est terminé.

Pour l'exécuter au démarrage, mettez-le dans un fichier:

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

lui donner la permission exécutable

chmod +x leftmouseremap.sh 

Enfin, ajoutez ceci à Statrtup Application manuellement depuis l'interface graphique ou, si vous le souhaitez depuis CLI, mettez le texte ci-dessous (changez les chemins vers le vôtre) dans un fichier dans votre ~/.config/autostart, voici le mien ( 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=

Gardez à l'esprit qu'avec KDE, le chemin serait le même ~/.kde/Autosart, pour d'autres gestionnaires de bureau, cela pourrait être légèrement différent. Alternativement, le démarrage peut être exécuté avec une approche générale en utilisant /etc/rc.local.

Ruslan Gerasimov
la source
Cela a résolu mon problème de déversement d'eau. J'ai des boutons de clic gauche / droit sous le pavé tactile de mon ordinateur portable. J'ai renversé de l'eau et maintenant les deux boutons envoient un signal de clic central à l'OS (je l'ai découvert en utilisant l'application 'keymon'). J'ai utilisé votre méthode pour remapper le clic du milieu au clic gauche, afin que je puisse à tout le moins profiter d'une expérience de clic gauche. Je n'utilise jamais le clic du milieu, donc cela fonctionne parfaitement pour moi :) Merci pour les instructions simples. Mon ID de périphérique d'entrée était 11, j'ai donc exécuté "xinput --set-button-map 11 1 1 3" Merci !!
Vahid Pazirandeh
3

Lorsque vous utilisez la grande réponse de zerobandwidth , certains appareils, tels que MX Ergo de Logitech, apparaissent à la fois comme un pointeur et un périphérique de clavier :

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

Par conséquent, grep "Logitech MX Ergo"finit par renvoyer deux valeurs. Ce dernier finit par être inclus comme premier élément dans la chaîne de mappage et visse tous les boutons de votre souris.

Le correctif est facile - utilisez simplement l' grepargument de nombre maximal de -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
la source
Excellent conseil; J'ai édité la réponse pour l'inclure. Merci!
zerobandwidth
1

J'ai pu changer le mappage du bouton central de ma souris Logitech sur `` Retour '' en utilisant la reconnaissance de gestes Easystroke que j'ai téléchargé à partir du Centre logiciel Ubuntu. Modifier: Dans l'application, vous sélectionnez Ajouter une action, Nommez-la, sélectionnez le type de clé, cliquez sur Détails et appuyez sur Entrée, appuyez sur Enregistrer coup et, pendant l'invite, appuyez sur le bouton du milieu.

atr15
la source
1
Bienvenue sur AskUbuntu. Vous devez fournir plus de détails avec votre réponse.
David
Ok, veuillez voir ci-dessus modifier.
atr15
Bonne prise. Mais ce que vous avez décrit ne fonctionne pas comme vous l'avez demandé: en fait, le bouton du milieu est le bouton par défaut pour mettre cette application en `` mode de reconnaissance des gestes '': lorsque vous appuyez dessus, l'application commence à reconnaître le geste que vous faites. Pourtant, +1 parce que cette application dispose d'un module pour révéler les ID des boutons de la souris; cela aide lorsque nous voulons utiliser xinputdes boutons qui n'apparaissent pas lors de l'utilisation xinput list <devID>.
1111161171159459134
1
Oh, cela est arrivé 1 an plus tard - votre réponse vaut +1
1111161171159459134
1

Avant le 12.04, il y avait un outil graphique simple appelé "btnx" dans le référentiel standard, qui était ajouté en tant que "Propriétés des boutons" dans la configuration du système. Malheureusement, il a cependant été abandonné. Un PPA "non approuvé" actuellement maintenu pour les 14.04, 16.04 et 18.04 est ici: https://launchpad.net/~oliverstar/+archive/ubuntu/ppa (trouvé sur https://launchpad.net/ubuntu/xenial/+source / btnx )

Il ne s'intégrera pas avec les paramètres système mais fonctionne très bien sur mon ordinateur portable avec une souris à 5 boutons bon marché. Il peut aussi remapper sur les touches et les commandes et la configuration est beaucoup plus simple qu'avec toute autre méthode!

w-sky
la source
Je me demande si l'outil apporte les mêmes changements, juste en arrière-plan. ^ _ ^
zerobandwidth
0

J'ai HP elitebook 2570p, Ubuntu 18.04.2. Ici, j'ai un trackpoint qui est inutile pour moi et voici 2 boutons de trackpoint inutiles sous l'espace

Je n'utilise pas ces touches car je les ai sous le pavé tactile. Je voudrais remapper ces boutons à gauche = back_button (Alt_L + Left), celui de droite = middle_mouse_button. Le trackpoint dans "xinput" est id = 11 et le bouton gauche est le numéro 1, la droite est 3.

Quelqu'un pourrait-il m'écrire le bon code à copier sur le terminal? J'ai combiné avec xbindkeysrc mais qui définit n'importe quelle action sur les deux boutons (trackpoint et touchpad)

Atome
la source
J'ai fait cela et je l'ai fait simplement: <code> echo xinput set-button-map 11 8 1 2 >> ~ / .xsessionrc </code> Cela fait que mes boutons tactiles (id 11) font de la gauche le 8ème bouton, le milieu en tant que clic gauche (no 1), et le cliquet droit en tant qu'intermédiaire, puis 'code' echo -e "\" / usr / bin / xte 'keydown Alt_L' 'key Left' 'keyup Alt_L' & amp; \ "\ nb: 8" >> ~ / .xbindkeysrc 'code' Il définit le bouton n ° 8 (b: 8) sur Alt_L + Gauche => retour :) J'ai maintenant 2 boutons de souris utiles
Atom