web-dev-qa-db-fra.com

Comment puis-je alterner entre deux applications en mode kiosque?

J'ai actuellement un système mono-utilisateur qui se charge automatiquement dans X et démarre XBMC via un travail Upstart super simple qui s'exécute:

su -c "startx /etc/X11/Xsession /usr/bin/xbmc-standalone -- -bs" oli

Super simple et ça marche, solide comme un roc ... Aucun bureau ne gêne. Aucun gestionnaire de fenêtres pour ralentir les performances. Et il rebondit lorsque XBMC plante (une fois par jour). C'est fantastique si tout ce que vous voulez faire est d'utiliser XBMC. Mais maintenant, j'aimerais installer Steam pour jouer à des jeux. Cela pose quelques problèmes:

  1. Steam et XBMC vont se battre sur le temps d'écran (il n'y a pas de gestionnaire de fenêtres, rappelez-vous) et les appareils audio. Nous devons fermer XBMC avant de démarrer Steam mais sans tuer X . Notez comment XBMC est actuellement lancé. Comment je fais ça?

  2. Ce serait aussi vraiment génial si je pouvais déclencher le basculement XBMC → Steam à partir de mon contrôleur XBox sans fil. Il est connecté avec xboxdrv qui a une option exec:

    xboxdrv --ui-buttonmap XBOXBTN=exec:/home/oli/bin/switch.sh
    

    Donc, en supposant que # 1 puisse être scripté, je peux me connecter.

  3. La seconde moitié de # 1. Lorsque Steam existe, j'ai besoin de XBMC pour revenir.

  4. Si ce qui est en cours d'exécution - plante, il doit être la chose qui se charge.

Il semble donc que mon plus gros problème soit de surveiller une application. S'il se ferme normalement (code 0, par exemple, je lui ai demandé de quitter, ou j'ai appelé un script qui lui a demandé de quitter), il devrait charger l'autre application et la surveiller. S'il s'est écrasé (pas le code zéro), il devrait exécuter la même application et le surveiller. Ça a du sens? Mais comment?

Tout cela ressemble à quelque chose d'Upstart serait génial, sauf que les deux sont des applications X exécutées au niveau de l'utilisateur. Je suis au 14.04, donc s'il est allé assez loin, cela pourrait être une option.

Il peut également y avoir un moyen de le faire qui est spécial pour XBMC et/ou Steam. Je suis ouvert aux suggestions.

3
Oli

C'est juste moi qui pense à haute voix. Voici un script qui devrait alterner entre deux commandes blocage

#!/bin/bash

XBMC="xbmc-standalone"
Steam="Steam steam://open/bigpicture"

current=$XBMC

openbox-session  # urgh required by Steam for keyboard IO

while true; do
    $current  # blocks until exit code

    [[ "$?" -ne "0" ]] && continue

    if [[ $current == $XBMC ]]; then
        current=$Steam
    else
        current=$XBMC
    fi
done

Si je peux appeler cela au lieu de xbmc-standalone au démarrage de X, qui devrait permettre au script de rester en vie indéfiniment (ce qui maintiendrait X en vie).

3
Oli