#!/bin/sh
# Lance l'application dont l'identifiant .desktop est donne en argument.
#
# Appele UNIQUEMENT par redrtos-appli@.service (mode resident). La variable
# REDRTOS_RESIDENT=1 est posee par l'unite : c'est elle que l'application lit
# pour demarrer SANS fenetre et ne pas mourir quand on ferme la fenetre.
#
# ═══ POURQUOI ON RELIT LE .desktop AU LIEU D'UNE TABLE ═══
# Ecrire « io.redsolution.redgallery -> /usr/bin/redgallery » quelque part serait
# une deuxieme source de verite. Elle se desynchroniserait le jour ou un binaire
# est renomme, et le symptome serait une unite qui echoue au demarrage de session
# pour une raison illisible. Le .desktop EST la source de verite du systeme :
# c'est deja lui que le lanceur execute.
set -u

id=${1:-}
if [ -z "$id" ]; then
	echo "usage: $0 <identifiant-desktop>" >&2
	exit 2
fi

desktop="/usr/share/applications/${id}.desktop"
if [ ! -r "$desktop" ]; then
	echo "$desktop introuvable : impossible de lancer « $id »." >&2
	exit 2
fi

# ⚠️ `head -1` : un .desktop peut contenir des sections [Desktop Action …] qui
#    portent chacune leur propre Exec=. Seul le premier, celui de
#    [Desktop Entry], lance l'application.
# ☠️ On NE met PAS ce sed en fin de tuyau d'une commande dont le code compte :
#    un sed final masque le code de retour de ce qui precede. Ici la source est
#    un fichier deja teste lisible, et le resultat est verifie juste apres.
ligne=$(sed -n 's/^Exec=//p' "$desktop" | head -1)
if [ -z "$ligne" ]; then
	echo "$desktop n'a pas de ligne Exec= : rien a lancer." >&2
	exit 2
fi

# Les codes de champ XDG (%u %U %f %F %i %c %k %d %D %n %N %v %m) designent des
# fichiers ou des URL a ouvrir. En mode resident il n'y en a AUCUN : l'ouverture
# se fera plus tard par D-Bus (org.freedesktop.Application.Open). Les laisser
# passerait « %u » comme argument litteral — et une application qui prend un
# chemin en argument tenterait d'ouvrir un fichier nomme « %u ».
commande=$(printf '%s' "$ligne" | sed 's/%[uUfFickdDnNvm]//g')

# Sans guillemets, VOLONTAIREMENT : la ligne Exec= est une commande avec ses
# arguments, elle doit etre decoupee par le shell.
# shellcheck disable=SC2086
exec $commande
