Mouse binding, jeux vidéos et R.A.T MMO7 sous linux

Bonjour à tous

Aujourd’hui, c’est mouse binding!! Il y a 1 an je faisais l’acquisition d’une R.A.T MMO7 (une souris avec une 21 boutons pour un total d’une 40aine de combinaisons de contrôle (sans compter le switch de profile)).

Le soucis sous linux c’est que la souris n’est pas reconnu comme il faut par défaut, et la plupart des tutoriaux (1,2,3) se contentent de « fix » crade contre performant à base de driver « mouse » dans la config Xorg résultant d’une consommation de CPU > 30% par Xorg lorsque l’on ne fait que déplacer la souris!!!

Et les boutons ne sont pas tous reconnu la plupart du temps :s, au final je me suis donc tourné vers evdev, conseillé par le wiki d’archlinux (beaucoup plus performant et fonctionnel).

La config à rajouter dans Xorg (via xorg.conf.d ou directement dans le xorg.conf) :

Section "InputClass"
	Identifier      "Evdev Mouse"
	Driver          "evdev"
	MatchProduct    "Saitek Cyborg M.M.O.7 Gaming Mouse"
	Option      "Name" "Saitek Cyborg M.M.O.7 Gaming Mouse"
	Option      "Device" "/dev/input/by-id/usb-Saitek_Cyborg_M.M.O.7_Gaming_Mouse_RD000961-event-mouse"
EndSection

La souris est directement détecté et fonctionnel (si la souris reste bloqué, il faut appuyer sur le bouton de profile, apparemment, son fonctionnement n’est pas tout à fait compris par le driver).

Mouse binding

La solution simple : xbindkey

La solution la plus connu probablement, le gros soucis c’est que les bindings sont testé sur un « ET » logique; exemple, avec la configuration suivante (dans .xbindkeysrc) :

"xte 'keydown Alt_L' 'keydown Control_L' 'key n' 'keyup Control_L' 'keyup Alt_L'"
   b:12 + Release

Si j’appuie sur le bouton b:12, je lance le raccourci Alt + Ctl + n, mais si en même temps j’appuis sur le bouton 1(clic gauche), le raccourci n’est pas lancé car b:1 + b:12 != b:12 (logique :)). Mais dans les jeux vidéos, WoW par exemple on peut rester cliquer sur le clic droit (vérouillage de la caméra) pendant plusieurs minutes sans le relâcher, donc rajouter la condition b:3 + b:12 + Release bloquerait l’action jusqu’à ce qu’on lâche le bouton.

On est jamais mieux servi que par soi-même : python + xlib

Comme je ne trouvais pas d’alternative (au début ^^), j’ai donc décidé de créer mon propre keybinder en python avec xlib :

Ici dans Wow, les contrôles étaient exécutés, mais apparemment, le jeu n’aimait pas cette méthode et faisait « sauter » les boutons qui étaient maintenu (en maintenant le clic droit, le raccourci du bouton 12 était exécuté, mais ensuite le clic droit était relâché, même si l’on restait sur le bouton :s), après quelque test dans d’autres jeux vidéos, il semblerait que seul wow ait eu cette réaction (2 hypothèses : le jeux fait sauter les contrôles lorsqu’il en détecte trop (les 3 touches émulés, le clics droits plus le b:12 plus les autres appuie sur le clavier), ou wine ne supporte pas autant d’entrés entre le clavier et la souris).

Petit aparté : Concernant mon script, créer un keylogger en python semble trivial ^^ (les fonctions du clavier étant aussi gérer par xlib).

La solution finale : evrouter

Solution simple, rapide et fonctionnelle dans mon cas (config dans .evrouterrc) :

"Saitek Cyborg M.M.O.7 Gaming Mouse" "/dev/input/by-id/usb-Saitek_Cyborg_M.M.O.7_Gaming_Mouse_RD000961-event-mouse" none key/286 "XKey/Control_L+Alt_L+n"

Un coup de sudo evrouter /dev/input/by-id/usb-Saitek_Cyborg_M.M.O.7_Gaming_Mouse_RD000961-event-mouse, et ça marche :).

Après suivant vos besoins xbindkey devrait suffire, mais si vous cherchez plus de contrôle, evrouter, ou mon script pourront vous intéresser.