Lors du confinement, j’ai ressorti une vielle manette des cartons. Pas si mal, la bête dispose de (voir photo à droite):

  • 2 axes x, y (avec un stick et un volant permettant de moduler l’amplitude de 0 à 255)
  • 10 boutons (valeur 0 et 1, 0 pour relâché et 1 pour pressé)

Elle fonctionne parfaitement sous Linux mais j’ai été confronté à des soucis de compatibilité avec des jeux créés pour utiliser une manette de Xbox 360. En effet, certains boutons était inutilisables, d’autres n’étaient pas au même endroit que sur une manette de Xbox. J’ai donc cherché des solutions pour changer le “mapping” des touches et ainsi changer le rôle des boutons.

Mon objectif était de jouer aux jeux présents en Cloud Gaming sur Blacknut mais les techniques que je vais évoquer sont sans doute valables pour d’autres scénarios tels que le souhait de jouer à des jeux obtenus sur Steam.

Il m’a fallu envisager 3 techniques différentes afin de parvenir à mes fins. Je vous propose ici une série de 3 articles dans lesquels j’évoque :

  1. L’utilisation de controllermap pour un jeu SDL (article ci-dessous)
  2. Le mapping des touches avec systemd-udev (voir l’article)
  3. L’émulation d’une manette en espace utilisateur avec ubox360 (article à venir)

Après un aperçu de la manette Xbox 360, voici la première technique utilisant controllermap.

Aperçu de la manette de Xbox 360

La manette de Xbox360 est composée de :

  • 2 “sticks” (reconnus comme 4 axes)
  • 1 “pad” directionnel (reconnu comme 2 axes)
  • 9 boutons
  • 2 “triggers” (reconnus comme 2 axes)

Xbox 360 controller

Les 2 “triggers” sont en fait reconnus comme 2 axes par le système d’exploitation (Linux dans mon cas). Sur un jeux de voiture, cela permet de moduler la force de l’accélération ou du freinage.

Configuration SDL

En bref

Pour un jeux développé avec la bibliothèque SDL, il est assez simple de configurer les mappings d’une manette.

Pour cela, il faut exécuter le programme controllermap:

controllermap

Cet utilitaire affiche à l’écran les boutons d’une manette Xbox 360 et demande à l’utilisateur de presser le bouton à faire correspondre à chaque touche. Il génère ensuite un fichier gamecontrollerdb.txt à placer dans le répertoire du jeux et le tour est joué !

Installation de “controllermap”

Les utilisateurs d’ArchLinux peuvent installer facilement controllermap depuis AUR. Pour les autres, il faudra compiler le fichier controllermap.c.

Une fois installé, il faut lancer la commande suivante pour rediriger la sortie dans le fichier gamecontrollerdb.txt:

controllermap 0 > gamecontrollerdb.txt

Conclusion

Blacknut semble être basé sur SDL mais je ne suis pas parvenu à utiliser cette méthode. Peut-être que la gestion des manettes n’utilise pas l’API de la bibliothèque SDL ? Difficile de savoir …

Bref, j’ai donc tenté une autre technique basée sur systemd-udev (voir l’article).

Ressources (en anglais)