J'ai eu du mal avec cela au cours du week-end et j'ai besoin de remapper les boutons de ma souris.
J'ai une souris Logitech avec 9 boutons et appuyer sur le "bouton du milieu" (n ° 2) implique de cliquer sur la molette de défilement. Je n'aime pas cela parce que je suis maladroit et finit généralement par faire défiler la fenêtre dans laquelle je me trouve lorsque j'essaie de cliquer sur la molette. Je voulais donc remapper automatiquement le bouton supérieur (n ° 9 dans ce cas) sur le bouton du milieu (n ° 2). Je voulais aussi mapper le bouton du bas (n ° 8) pour qu'il exécute un double-clic sur le bouton de gauche (n ° 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.
Vous aurez besoin de xinput
pour cette tâche. Cela peut être fait entièrement dans votre fichier .xsessionrc
. Commencez par utiliser xinput
pour découvrir le nom attribué à votre souris, qui est ensuite corrélé à un ID de périphérique d'entrée. Vous trouverez ci-dessous 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 Mouse
et est représentée par id=11
. Votre souris aura un nom différent. comprendre que cela est laissé comme un exercice pour le lecteur.
Tandis que vous connaissez toujours l’ID du périphérique dans cette session , déterminez le nombre de boutons que le gestionnaire d’entrée pense que votre souris possède, en utilisant xinput list
deviceID
. Ce nombre peut être différent du nombre de boutons apparaissant sur le périphérique.
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’ya que 9 boutons physiques évidents, mais xinput
en signale 16.
Étant donné la nature de l'USB, cet ID peut changer à chaque redémarrage. Il ne suffit donc pas de scripter quelque chose qui est lié de manière statique à un ID que vous avez découvert une fois. Vous devrez analyser dynamiquement cette information au démarrage et exécuter votre nouvelle cartographie en fonction de l'ID actuel.
Maintenant que vous connaissez son nom, vous pouvez utiliser xinput test
pour déterminer la clé à remapper. Appuyez sur les boutons de la souris que vous souhaitez mapper de et vers, afin d’obtenir leurs indices. (Pour référence, 1, 2 et 3 "toujours" (c'est-à-dire, généralement) font référence 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 n ° 9 (côté haut) sur le bouton n ° 2 (milieu).
Maintenant que vous savez comment s'appelle votre souris et quels boutons vous souhaitez modifier, vous pouvez écrire un script ~/.xsessionrc
qui appelle xinput
pour exécuter le remappage des boutons au démarrage. Ci-dessous, 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
. Ceci est fait en grep
ing pour le nom de souris connu dans le rapport de xinput
, puis en utilisant sed
pour extraire le numéro d'identification de ce jeton id=xxx
dans le rapport. Cette valeur est ensuite utilisée dans une directive xinput set-button-map
, qui exécute le remappage. Dans l'exemple ci-dessus, le seul changement est que le bouton n ° 9 est en cours de nouvelle correspondance avec le bouton n ° 2. Tous les autres restent à leur réglage par défaut.
Mise à jour: Comme @Lokasenna le souligne ci-dessous , si votre appareil se signale à la fois comme souris et clavier, vous devrez peut-être limiter le nombre de résultats de grep
à l'aide de -m 1
.
Voir aussi cette réponse .
Vous aurez besoin de xinput
, xbindkeys
, et xautomation
(y compris xte
) installé pour cette tâche.
Utilisez xinput list
et xinput test
pour découvrir l'ID de périphérique de votre souris et le numéro du bouton que vous souhaitez attribuer. Dans mon cas, je voulais mapper le bouton du bas (n ° 8) sur un double-clic sur le bouton de gauche (n ° 1).
Créez ou éditez ~/.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 allons utiliser le composant xte
de xautomation
pour envoyer des événements directement au gestionnaire d’entrée.
Pour créer un événement de double-clic quand un bouton est relâché, j'ai ajouté ce qui suit:
"/usr/bin/xte 'mouseclick 1' 'mouseclick 1' &"
b:8 + Release
Cette configuration mappe une séquence de deux clics de souris sur le bouton n ° 1 avec la libération du bouton n ° 8. (En théorie, je suppose que vous pourriez mapper toute commande sur un bouton de la souris, mais c'est le cas le plus courant. Voir cette réponse pour d'autres exemples pratiques. )
Pour les utilisateurs ayant plusieurs souris connectées à votre système, vous devez également indiquer l'ID du périphérique. 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
Les étapes courtes pour cela sont:
Il existe un utilitaire appelé xinput
. xinput list
ou simplement xinput
affichera tous les périphériques d'entrée X et leurs ID. Ici vous trouvez l'ID de la souris que vous voulez remapper.
Je vais utiliser mon identifiant comme exemple, à partir de ma configuration, qui est 21, alors xinput --get-button-map 21
sera affiché
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
Maintenant, si vous voulez, par exemple, échanger les boutons gauche et droit, vous exécutez simplement
xinput --set-button-map 21 3 2 1
Nous y sommes, le remappage est terminé.
Pour le lancer au démarrage, placez-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 à partir de l'interface graphique ou, si vous le souhaitez à partir de la CLI, mettez le texte ci-dessous (changez les chemins d'accès) dans un fichier de 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 comme ~/.kde/Autosart
, pour d'autres gestionnaires de bureau, cela pourrait être très différent. Alternativement, le démarrage peut être exécuté avec une approche générale en utilisant /etc/rc.local
.
Lors de l'utilisation de excellente réponse de zerobandwidth , certains périphériques, tels que MX Ergo de Logitech, s'affichent sous la forme d'un pointeur et d'un symbole clavier périphérique:
⎡ 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"
renvoie deux valeurs. Ce dernier finit par être inclus en tant que premier élément de la chaîne de mappage et visse tous les boutons de votre souris.
Le correctif est simple: utilisez simplement l'argument de nombre maximal de grep
, -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
Avant 12.04, il existait dans le référentiel standard un outil graphique simple appelé "btnx", qui était ajouté en tant que "Propriétés du bouton" dans la configuration du système. Malheureusement, il a été abandonné. Un PPA "non approuvé" actuellement maintenu pour les versions 14.04, 16.04 et 18.04 est disponible: https://launchpad.net/~oliverstar/+archive/ubuntu/ppa (trouvé à https://launchpad.net/ubuntu/xenial/+source/btnx )
Il ne s'intégrera pas avec les paramètres système mais fonctionne assez bien sur mon ordinateur portable avec une souris à 5 boutons bon marché. Il peut aussi être transformé en frappes au clavier et en commandes et la configuration est beaucoup plus simple qu'avec toute autre méthode!
J'ai été en mesure de modifier le mappage du bouton central de la souris Logitech sur "Retour" à l'aide de Easystroke Gesture Recognition, que j'ai téléchargé à partir du Centre de logiciel Ubuntu. Modifier: dans l'application, vous devez sélectionner Ajouter une action, le nommer, sélectionner le type de clé, cliquer sur Détails et appuyer sur Entrée, appuyer sur Enregistrer le tracé et, pendant l'invite, appuyer sur le bouton du milieu.