Clavier à la manette !

Message 1, par Elzen

§ Posté le 25/10/2015 à 13h 10m 10

Salut tout le monde !


Non non, je ne suis pas mort 😊


Simplement, tous mes efforts de rédactions sont actuellement concentrés sur mon manuscrit de thèse, donc j'ai beaucoup moins de (temps et de) motivation pour rédiger des articles pour ce blog. Je continue cependant d'accumuler les brouillons, et je devrai reprendre mes activités « normales » dès que ce petit détail sera réglé ^^

En attendant, quand j'ai besoin de me changer les idées, je code. J'ai plein de modifications pour Touhy en cours (dont un certain nombre sont déjà sur le dépôt, il faudra que je tienne la doc à jour fasse de la vraie doc, un jour ; en attendant, vous pourrez avoir des infos en suivant le Topic des Codeurs, ou en rejoignant le chan IRC du projet ./play.it(1) où nous en parlons de temps à autres), et je fais également quelques autres trucs, comme remettre à jour mon script GreaseMonkey pour Ubuntu-fr.


Mais c'est d'autre chose que je voulais vous parler aujourd'hui, et ce message s'adresse principalement aux gens qui disposent d'une manette à brancher sur leur ordi et trouvent qu'ils n'ont pas assez d'occasions de s'en servir. En effet, il existe un certain nombre de jeux qui sont codés de telle manière qu'on ne peut y jouer qu'au clavier, or une manette peut parfois s'avérer beaucoup plus ergonomique (ne serait-ce que parce qu'elle permet généralement de s'éloigner un peu plus de l'écran). Et même pour d'autres applications que les jeux, d'ailleurs, une manette pourrait parfois être un sacré plus en terme d'ergonomie.


D'où ce script. Il s'agit d'un utilitaire à lancer en tâche de fond permettant d'écouter l'appui sur les boutons de la manette, et de simuler un appui sur une touche du clavier. Il « suffit » donc de le configurer pour associer à chaque touche que vous voulez pouvoir utiliser un bouton de la manette, et tout marchera bien. Sachant que vous pouvez, bien sûr, associer une configuration différente à chaque fenêtre, pour que la manette ait un comportement différent selon l'application qui a actuellement le focus.


Ce script dépend, d'une part, de la bibliothèque SFML, utilisée pour coder des jeux bien, et qui permet d'écouter assez facilement la manette, et d'autre part de la Xlib (la bibliothèque de X11, le serveur graphique bas niveau utilisé sur la plupart(2) des systèmes Unix-like libres, dont les différents GNU/Linux et *BSD), qui permet de savoir quelle fenêtre est active et de simuler l'appui sur les touches du clavier. Mon script est normalement compatible Python 2/Python 3, donc vous pouvez installer, sous Debian, aussi bien python-sfml et python-xlib que python3-sfml et python3-xlib. Pour les autres systèmes, je vous laisse chercher dans vos dépôts à quoi ça correspond. Normalement, ce sont les seules dépendances requises.

Notez que vous pouvez aussi compiler ce script grâce à Cython, ce qui devrait vous permettre de le killer plus facilement en cas de besoin.


Pour l'instant, la configuration se fait à la main (une piste d'amélioration serait de la gérer automatiquement, en affichant la fenêtre SFML associée avec la classe de la fenêtre précédemment active, et en demandant d'appuyer directement sur les boutons/touches pour lesquels on veut une association, mais je n'ai pas le courage de me pencher là-dessus pour le moment, on verra plus tard).

Il y a deux emplacements possibles pour la configuration : si la variable XDG_CONFIG_HOME est définie au lancement (ce qui suppose donc un système compatible freedesktop), ça utilise un fichier « joykeys.cfg » dans le répertoire indiqué. Sinon, ça utilise un « ~/.joykeysrc », à l'ancienne. Le fichier de configuration est un simple fichier texte au format .ini/.desktop, et vous trouverez ici un exemple de ma propre configuration à l'instant où j'écris ces lignes.


La section « [*] » contient les associations qui s'appliquent quand la fenêtre active ne correspond à aucune configuration spécifique, ou qu'il n'y a aucune fenêtre active. Les autres correspondent aux classes de fenêtres, ou au titre si aucune classe n'est exploitable. Il est nécessaire de configurer toutes les associations fenêtre par fenêtre, ce qui permet de facilement désactiver le script pour une application en particulier (par exemple, pour celles qui gèrent déjà la manette elles-mêmes, et donc pour lesquelles les événements claviers simultanés ne feraient que gêner). C'est le cas pour Mednafen, Mupen64+ et PCSX dans mon exemple.

Pour le reste, ma manette étant une vieille manette PlayStation, j'ai associé, bien évidemment, les boutons de directions aux touches directionnelles ; ainsi que les quatre touches L/R aux touches modificatrices (Shift/Ctrl/Alt/Super). Pour les quatre boutons d'actions, j'ai choisi les touches d'activations classiques (Entrée et Espace pour, respectivement, Croix et Rond), la touche tabulation (ce qui me permet de naviguer entre les fenêtres avec L1+Carré, qui donne Alt+Tab), et la touche menu (associée à Triangle, parce que j'ai gardé cette vieille habitude de Final Fantasy d'ouvrir le menu avec Triangle). Restaient Start et Select, auxquels j'ai associé Pause et Échap (la touche pause ne sert pas à grand chose en temps normal, mais elle allait tellement bien avec Start… et puis, comme j'ai un raccourcis clavier Ctrl+Pause qui inverse l'état de mon MPD, je peux aussi y accéder avec L2+Start. La touche Échap, pour sa part, permet entre autres de fermer les fenêtres de dialogue).

Cette configuration présente l'avantage d'être utilisable sur pas mal d'applis (naviguer entre les onglets d'Iceweasel avec L2+Carré est assez fun, par exemple), mais j'ai quand même réglé une configuration différente pour Catapult, le lanceur d'application de Touhy, qui n'a absolument pas besoin des touches Shift et Super, mais qui a certaines options activables avec PageUp et PageDown. Tout le reste de la conf' est identique pour cette fenêtre.


Bref, si vous avez des question ou des remarques à ce sujet, si vous voulez partager votre propre configuration ou autres, n'hésitez pas 😊 Notez que la configuration est automatiquement relue quand le fichier est modifié, donc vous n'avez pas à tuer le script et le relancer pour faire vos changements. En revanche, pour une raison qui m'échappe plus ou moins (je suppose que les fonctions bloquantes de SFML sont vraiment très bloquantes), il risque d'être nécessaire d'appuyer sur un bouton de la manette pour que le programme s'arrête vraiment après un kill -15 ou un Ctrl+C dans un terminal.


(Suite au décès inopiné de mon précédent serveur, je profite de mettre en place une nouvelle machine pour essayer de refaire un outil de blog digne de ce nom. J'en profiterai d'ailleurs aussi pour repasser un peu sur certains articles, qui commencent à être particulièrement datés. En attendant, le système de commentaires de ce blog n'est plus fonctionnel, et a donc été désactivé. Désolé ! Vous pouvez néanmoins me contacter si besoin par mail (« mon login at ma machine, comme les gens normaux »), ou d'ailleurs par n'importe quel autre moyen. En espérant remettre les choses en place assez vite, tout plein de datalove sur vous !)