j'ai acheté une souris pour remplacer ma Logitech qui commençait à être pleine de faux-contacts; problème, j'ai choisi cette souris parce qu'elle avait la roulette qui pouvait cliquer latéralement, fonction bien pratique pour faire "page-précédente" et "page-suivante" dans les explorateurs de fichiers et les navigateurs web; je m'étais habitué à cette fonction.
le truc, c'est que la souris en question possède bien cette possibilité, mais ça marche pas.
j'explique la procédure avec cette souris HP X3300 (qui a un bouton de plus derrière la molette), mais elle doit pouvoir s'appliquer avec n'importe quelle souris dont les boutons sont reconnus par Xorg.
le premier point à connaitre, c'est que Xorg interprète les boutons d'une souris dans cet ordre:
P1 Left click
P2 Middle click
P3 Right click
P4 Wheel up
P5 Wheel down
P6 Wheel left
P7 Wheel right
P8 Thumb1
P9 Thumb2
P10 ExtBt7
P11 ExtBt8
NB: pour info, "thumb" sont les boutons de pouce quand y en a, et "ExtBt" des boutons additionnels; le reste est clair.
premier point, on va trouver l'identifiant de la souris avec Xinput:
[david@manjaro ~]$ xinput list
⎡ Virtual core pointer id=2 [master pointer (3)]
⎜ ↳ Virtual core XTEST pointer id=4 [slave pointer (2)]
⎜ ↳ Logitech USB Keyboard id=10 [slave pointer (2)]
⎜ ↳ MCE IR Keyboard/Mouse (ene_ir) id=13 [slave pointer (2)]
⎜ ↳ HP HP Link-5 micro dongle id=8 [slave pointer (2)]
⎜ ↳ Logitech Unifying Device. Wireless PID:400a id=15 [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)]
↳ Power Button id=7 [slave keyboard (3)]
↳ Logitech USB Keyboard id=9 [slave keyboard (3)]
↳ USB Video Device id=11 [slave keyboard (3)]
↳ Eee PC WMI hotkeys id=12 [slave keyboard (3)]
↳ ENE eHome Infrared Remote Receiver id=14 [slave keyboard (3)]
↳ HP HP Link-5 micro dongle id=16 [slave keyboard (3)]
on voit qu'il y plein de choses, mais pour une souris il faut regarder dans la partie "Virtual core pointer", et on y trouve ma souris HP (HP HP Link-5 micro dongle) ou plutôt son dongle sans fil, et l'ancienne souris Logitech (Logitech Unifying Device), que j'ai laissée branché (ce qui sera important pour la suite).
ce qui est important, c'est le "id=", donc pour la HP c'est 8.
on va donc regarder comment la HP est mappée:
xinput test 8 | grep "button press"
vous remarquez que j'ai utilisé l'identifiant trouvé avant; là il faut appuyer sur tous les boutons de la souris, un par un et même scroller, et voir ce qui s'affiche comme chiffres pour chacun; tout noter sur un papier, et pour arrêter, il faut utiliser Ctrl-C. ne pas oublier les trois clics de la molette: central, gauche et droite (on est là pour ça, non ?)
là, j'ai eu la surprise de constater que la souris HP est mappée exactement dans l'ordre attendu par Xorg: 1 2 3 4 5 6 7 8 (les trois derniers étant inexistants sur cette souris); la question était donc: pourquoi ça ne marche pas ?
j'ai donc regardé comment était mappée la Logitech (grâce à son id trouvé avant):
xinput test 15 | grep "button press"
et je me suis aperçu que celle-ci était dans le désordre: 1 2 3 4 5 8 9 (pas d'autres boutons).
la seule conclusion possible est que les souris Logitech étant très répandues, Xorg a une règle pour elles (une règle Evdev que je n'ai pas trouvée, mais je n'ai pas beaucoup cherché), alors que la souris HP n'en a pas.
on peut déjà tester si on peut faire marcher cette souris HP normalement, en injectant les bonnes règles avec Xinput:
xinput set-button-map 8 1 2 3 4 5 8 9 0 0 6 0
ici, on voit que le premier chiffre à indiquer est l'id de la souris, et les autres les chiffres trouvés pour les boutons dans l'ordre attendu par Xorg; et dans cet ordre attendu, il faut mettre "0" quand on n'a pas de bouton à attribuer; au passage, on note que j'ai attribué le bouton derrière la molette (6) à la fonction ExtBt7 (je sais pas encore à quoi je vais l'utiliser).
on essaie la souris, et il se trouve que c'est bon, ça marche; le seul truc, c'est qu'au prochain reboot, il faudra le refaire, ce qui est possible avec un script à mettre en autostart, mais pourquoi se prendre la tête ?
au lieu de ça, on va créer une règle pour Xorg avec un nouveau fichier:
sudo <editeur de texte qu'on veut> /usr/share/X11/xorg.conf.d/90-hpx3300.conf
par exemple
sudo nano /usr/share/X11/xorg.conf.d/90-hpx3300.conf
ou un éditeur graphique...
le nom du fichier est arbitraire, mais le numéro (90) est important.
dedans on met ceci:
Section "InputClass"
Identifier "hpx3300"
MatchUSBID "03f0:a407"
Option "ButtonMapping" "1 2 3 4 5 8 9 0 0 6 0"
EndSection
expliquons ça...
-pour "Identifier" on met ce qu'on veut
-pour MatchUSBID, il faut mettre ce qu'on trouve en faisant un lsusb
Bus 006 Device 004: ID 03f0:a407 Hewlett-Packard
-pour "ButtonMapping" on met les même chiffres dans le même ordre que pour la commande de test, sans l'id (8 dans mon cas).
on oublie pas de sauvegarder le fichier, il ne reste plus qu'à redémarrer, pour voir si tout est bon.
et vous n'avez plus d'excuse pour ne pas avoir TOUS les boutons de votre souris fonctionnels
PS: à mon avis ça marcherait aussi en mettant le fichier 90-hpx3300.conf dans /etc/X11/xorg.conf.d, mais peu importe: c'est un fichier qu'on a ajouté, il ne fait partie d'aucun paquet, donc il ne sera pas écrasé par une mise à jour.