Postez ici vos trucs & astuces.
Répondre

Boutons de souris mal mappés: comment faire ?

#1Messageil y a 9 ans

Bonsoir à tous

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 :bien

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.
Répondre