Utilitaires
Scripts
Divers
Jeux
Rechercher
Quillevere.net
Techniques informatiques

Retroarch : utiliser Hotkey et des boutons dédiés en même temps

27/07/2025
On verra ici comment charger et sauver un jeu par un simple clic sur un bouton, tout en conservant les fonctionnalités de la touche Hotkey.

Sur Retroarch, il y a des commandes 'systèmes' ; elles permettent d'afficher le menu, de mettre en pause, de réinitialiser la ROM, de charger/sauver l'état du jeu...

Il y a cependant une contrainte à l'utilisation de ces commandes mais voyons d'abord comment elles fonctionnent avant de montrer comment en modifier l'usage : assigner une touche pour le chargement et une autre pour la sauvegarde !

Fonctionnements possibles : la touche Hotkey

Deux possibilités sont offertes pour personnaliser le déclenchement de ces commandes :

  1. Utiliser la touche Hotkey
    Cela consiste à désigner une touche qui, lorsqu'elle est combinée à une autre, déclenche la commande système. Cette touche est nommée "Hotkey".
    Il faut donc désigner plusieurs autres touches pour chaque commande et appuyer simultanément sur la touche Hotkey + la touche de la commande.
  2. Ne pas utiliser de touche Hotkey
    Il faut alors affecter une touche spécifiquement à une commande.
    Cette touche ne pourra effectuer que la commande indiquée et implique d'avoir autant de touches que de commandes souhaitées.

Inconvénients du fonctionnement prévu

La première méthode, avec une touche Hotkey paramétrée, est celle par défaut sur Retroarch et est probablement la plus utilisée car elle propose beaucoup de fonctionnalités pratiques en réutilisant les touches déjà existantes pour les commandes du jeu (s'il y a 8 touches de fonctions et un stick, cela permet d'avoir 11 commandes). Mais elle présente comme inconvénient un manque de rapidité.

Certes, si on souhaite juste quitter le jeu en cours, appuyer sur 2 touches en même temps ne présente pas un problème de temps en soi. Par contre, si on veut sauvegarder un jeu rapidement, à un moment où le temps est crucial, localiser et appuyer sur 2 touches simultanément prend un laps de temps qui peut être critique selon le jeu. Et avec un risque d'erreur (on peut confondre le sauver et le charger par exemple).

La seconde méthode (pas de touche Hotkey) ne présente plus l'inconvénient du laps de temps critique pour sauvegarder mais nécessite d'avoir autant de touches disponibles que de fonctions à utiliser : il faut une touche pour quitter le jeu, une autre pour accéder aux paramètres de Retroarch, une autre pour charger, une autre pour sauver, encore deux autres pour naviguer dans les sauvegardes... Bref, tout un clavier !

Une méthode à la croisée des chemins

L'idéal aurait été de pouvoir paramétrer Retroarch pour indiquer que telle fonction système est appelée soit par une touche dédiée, soit par une combinaison Hotkey+touche.

En cherchant dans la documentation de Retroarch, on apprend qu'il écoute certains ports, notamment le 55355, pour permettre d'exécuter des commandes par le réseau : quitter, faire des captures d'écran, modifier le volume... C'est indiqué ici

Dans la documentation de Batocera (qui lance Retroarch), on apprend qu'on peut créer un fichier de configuration des touches pour lancer des scripts. Cette documentation propose de jouer sur la luminosité ou le volume de Batocera lorsqu'on appuie sur certaines touches.

Vous l'avez compris : l'idée est donc, lorsqu'on appuie sur une touche spécifique, d'envoyer une commande réseau localement, qui sera traitée par Retroarch. La touche Hotkey reste utilisée mais les appels directs à certaines touches sont interceptés pour envoyer des commandes à Retroarch.

Mise en oeuvre pour charger et sauver rapidement

Connaître le nom des touches dédiées

L'idéal est d'avoir une touche pour sauver l'état d'un jeu et une touche pour charger cet état.

Au préalable, il va falloir trouver le nom technique de ces 2 touches. Une méthode pour y parvenir est de se connecter en SSH à sa machine et de lancer le logiciel evtest.

Celui-ci affichera, si vous appuyez sur une touche, le statut et le nom de celle-ci. Dans mon cas, j'obtiens ceci pour la touche 'sauver' :

type : 1 (EV_KEY), code 296 (BTN_BASE3), value 1 => 0

Et cela pour la touche 'charger':

type : 1 (EV_KEY), code 297 (BTN_BASE4), value 1 => 0

Création d'un script

J'ai écrit le script à lancer dans 2 langages différents (Python et Bash). Les 2 fonctionnent mais j'ai une préférence pour le script en Bash, plus court et probablement plus rapide. Je mets les 2 ici, à choisir selon les préférences de chacun et d'éventuelles évolutions...

Les différents affichages (echo et print) ne seront évidemment pas affichés et ne servent qu'à des fins de débugage.

Les 2 scripts détectent si Retroarch est en cours. Si c'est le cas, ils lanceront le chargement ou la sauvegarde de l'état du jeu. Si ce n'est pas le cas, cela changera la luminosité sur EmulationStation (à noter que ce point-là ne fonctionne pas forcément sur toutes les installations).

Code Python

Enregistrez le code ci-dessous dans le fichier /userdata/system/configs/game_state_changer.py.

#!/usr/bin/python3
# Si retroarch est lancé :
# Si argument=1, sauvegarde la partie
# Si argument=2, charge la dernière partie sauvée
# Si retroarch n'est pas lancé :
# Si argument=1, baisse la luminosité
# Si argument=2, augmente la luminosité

import sys # Pour récupérer le paramètre
import subprocess # Pour détecter si retroarch est en cours d'exécution
import socket # Pour sock.sendto

# Vérifie si retroarch est en cours d'exécution
def is_retroarch_running():
    try:
        result = subprocess.run(['pgrep', '-x', 'retroarch'], stdout=subprocess.PIPE, stderr=subprocess.PIPE)

        if result.stdout:
            return True # RetroArch est en cours d'exécution
        else:
            return False # RetroArch n'est pas en cours d'exécution
    except Exception as e:
        print(f"Une erreur s'est produite : {e}")
        return False

def modifie_luminosite(valeur):
    try:
        result = subprocess.run(['/overlay/base/usr/bin/batocera-brightness', valeur], check=True, text=True, capture_output=True)
        print("Sortie standard :", result.stdout)
        print("Erreur standard :", result.stderr)
    except subprocess.CalledProcessError as e:
        print("Une erreur s'est produite :", e)

# Récupérer le paramètre (1=sauver, 2=charger)
fonction = sys.argv[1]

# Utilisation de la fonction
if is_retroarch_running():
    print("RetroArch est en cours d'exécution.")

 sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
 if fonction=='1':
    sock.sendto(b"SAVE_STATE", ("127.0.0.1", 55355))
 elif fonction=='2':
    sock.sendto(b"LOAD_STATE", ("127.0.0.1", 55355))
else:
    print("RetroArch n'est pas en cours d'exécution.")
    if fonction=='1':
        modifie_luminosite(-5)
    elif fonction=='2':
        modifie_luminosite(+5)

Puis accordez les droits d'exécution :

chmod +x /userdata/system/configs/game_state_changer.py

Code Bash

Enregistrez le code ci-dessous dans le fichier /userdata/system/configs/game_state_changer.sh.

#!/bin/bash
# Si retroarch est lancé :
# Si argument=1, sauvegarde la partie
# Si argument=2, charge la dernière partie sauvée
# Si retroarch n'est pas lancé :
# Si argument=1, baisse la luminosité
# Si argument=2, augmente la luminosité

# Vérifie si retroarch est en cours d'exécution
is_retroarch_running() {
    pgrep -x "retroarch" > /dev/null 2>&1
    return $?
    }

modifie_luminosite() {
    local valeur=$1
    /overlay/base/usr/bin/batocera-brightness "$valeur"
    }

# Récupérer le paramètre (1=sauver, 2=charger)
fonction=$1

# Utilisation de la fonction
if is_retroarch_running; then
    echo "RetroArch est en cours d'exécution."

    if [ "$fonction" == "1" ]; then
        echo "Sauvegarde de l'état..."
        printf "SAVE_STATE" > /dev/udp/127.0.0.1/55355
    elif [ "$fonction" == "2" ]; then
        echo "Chargement de l'état..."
        printf "LOAD_STATE" > /dev/udp/127.0.0.1/55355
    fi
else
    echo "RetroArch n'est pas en cours d'exécution."
    if [ "$fonction" == "1" ]; then
        echo "Baisse de la luminosité..."
        modifie_luminosite -5
    elif [ "$fonction" == "2" ]; then
        echo "Augmentation de la luminosité..."
        modifie_luminosite +5
    fi
fi

Puis accordez les droits d'exécution :

chmod +x /userdata/system/configs/game_state_changer.sh

Paramétrer Batocera

Pour capturer des touches sur Batocera, il faut créer le fichier /share/system/configs/multimedia_keys.conf.

Ce fichier est automatiquement recherché et chargé au démarrage, rien d'autre à faire.

Pour Python

BTN_BASE3 1 python /userdata/system/configs/game_state_changer.py 1
BTN_BASE4 1 python /userdata/system/configs/game_state_changer.py 2

Pour Bash

BTN_BASE3 1 /userdata/system/configs/game_state_changer.sh
BTN_BASE4 1 /userdata/system/configs/game_state_changer.sh

Contrôle du fonctionnement

Batocera a besoin d'être redémarré pour que le paramétrage des touches soit effectif.

Une fois un jeu lancé, si vous appuyez sur 'Sauver' ou 'Charger' vous devriez avoir un message en bas de l'écran indiquant cet état.

Dernière modification le 27/07/2025 - Quillevere.net

Commentaires

Aucune inscription n'est requise si vous souhaitez

Rechercher sur le site

fr en rss RSS info Informations