Principe des sessions Linux

Tout d'abord un peu de théorie pour mieux comprendre ce qu'on va faire par la suite… Une session Linux graphique est simplement un programme principal qui lance d'autres programmes pour afficher le bureau, des menus, des barres d'outils, des applets, etc. Ce programme est lancé par le gestionnaire de connexion, celui qui affiche l'écran où vous devez entrer identifiant et mot de passe. La session se termine lorsque le programme principal de la session se termine lui aussi, ce qui redonne la main au gestionnaire de connexion, bref c'est finalement d'une simplicité enfantine !

Comme il n'y a rien de figé à l'avance dans ce principe, une session peut très bien lancer comme programme principal une seule application. Les curieux qui auront une fois lancé la session « Terminal de secours » se seront d'ailleurs retrouvés dans un écran contenant un terminal xterm[1] sans rien d'autre, ni même la possibilité de pouvoir changer les dimensions ou la position de ce terminal ! Pour sortir de cette session un peu spéciale, il faut quitter le terminal avec la classique commande exit.

L'idée est donc de lancer plutôt gamine ou pysycache à la place de xterm qui ne convient pas trop aux petits enfants ! Le principe consiste à d'abord tester dans cette session xterm ultra dépouillée quelle est la ou quelles sont les commande(s) qui permet(tent) d'avoir l'application visée en plein écran. On aura ensuite un ou deux fichiers à créer pour ajouter la session correspondante. Rassurons tout de suite ceux qui n'auraient pas le courage de suivre les instructions qui suivent : mon dépôt de paquets Debian fournit tout ce qui est évoqué dans les lignes qui suivent[2] sous la dénomination DoudouLinux, pas la peine de répéter 50 fois le même travail !

Créer un nouveau type de session

Au moins pour les Linux Debian et dérivés, tout se passe dans le répertoire /usr/share/xsessions/ dont le contenu est chez moi :

$ ls /usr/share/xsessions/
gnome.desktop   LXDE.desktop     ssh.desktop
enlightenment.desktop  openbox.desktop […]

On y retrouve de quoi lancer Gnome, LXDE ou encore Enlightenment. Un peu de curiosité nous permet de savoir assez rapidement ce que ces fichiers définissent :

$ cat /usr/share/xsessions/LXDE.desktop
[Desktop Entry]
Encoding=UTF-8
# The names/descriptions should really be better
Name=LXDE
Comment=LXDE - Lightweight X11 desktop environment
Comment[zh_TW]=LXDE - 輕量級的 X11 桌面環境
Exec=/usr/bin/startlxde
# Icon=
Type=Application

Rappelons que la commande cat ne fait qu'afficher dans la console le contenu d'un fichier texte. Il n'y a pas besoin d'un anglais courant pour comprendre que Name est le nom de la session, Comment sa description qui apparaît dans une bulle d'information et Exec le chemin du programme à lancer pour démarrer la session. Nous allons donc partir de ce fichier pour produire une session childsplay, en laissant toutefois tomber les traduction en chinois de Taïwan ;-) :

$ sudo nano /usr/share/xsessions/childsplay.desktop

Ici la commande sudo permet de lancer en tant que root l'édition du fichier childsplay.desktop avec l'éditeur nano. Vous y entrerez alors le texte suivant :

[Desktop Entry]
Encoding=UTF-8
Name=ChildsPlay
Comment=This will start the ChildsPlay application for kids
Comment[fr]=Ceci lancera l'application ChildsPlay pour les petits
Exec=/usr/games/childsplay
Type=Application

Ici nous avons utilisé le chemin complet de l'application, obtenu par la commande which :

$ which childsplay
/usr/games/childsplay

Pour tester vous n'avez plus qu'à fermer votre session puis en ouvrir une nouvelle en choisissant bien la session childsplay ! Dans le principe tout est très simple, cependant il y a des applications avec lesquelles ça se passe moins bien comme nous le verrons en fin de billet.

Associer la session à un utilisateur

Habituellement c'est avant la connexion par identifiant/mot de passe que l'on choisit le type de session, en cliquant sur le texte session. Éventuellement le gestionnaire de connexion aura repéré que ce n'est pas votre session habituelle et vous proposera de changer vos habitudes. Il est néanmoins possible de modifier la session par défaut sans passer par le gestionnaire de connexion. Et, comme expliqué dans la page DebianJr SpecialSession, on peut aussi créer des sessions sans mot de passe pour les enfants[3] (c'est aussi expliqué plus loin dans ce billet).

Nous allons supposer par la suite que les comptes des enfants ont déjà été créés et qu'il ne reste donc plus qu'à les configurer pour utiliser par défaut les sessions adéquates compte tenu de leur âge. Si vous ne l'avez pas fait, le plus simple est d'utiliser l'outil de gestion des utilisateurs et groupes plutôt que de se lancer dans les lignes de commandes (une fois n'est pas coutume…). Ça vous permettra en plus de les ajouter facilement dans le groupe audio pour qu'ils aient du son dans leurs jeux !

Le fichier de l'utilisateur qui détermine la session à lancer par défaut est le fichier caché .dmrc dans le répertoire de l'utilisateur :

$ cat .dmrc
[Desktop]
Session=LXDE

Dans mon cas c'est LXDE qui est choisi par défaut. Pour modifier cette valeur, la méthode manuelle consiste à utiliser nano ou tout autre éditeur de texte, la méthode systématique consiste à utiliser sed, un outil de transformation de texte. On peut notamment lui donner des expressions régulières à rechercher et le remplacement à effectuer. Ces deux paramètres sont séparés par des caractères barre oblique (/) dans une chaîne de caractères commençant par s :

$ sed -r 's/Session=.+/Session=childsplay/' .dmrc
[Desktop]
Session=childsplay

Évidemment il suffit de remplacer childsplay dans la commande par la session de prédilection si childsplay ne vous convient pas. On enregistre ensuite le résultat en ajoutant l'option -i à la commande précédente. Bien sûr ceci ne marchera que si vous avez le droit de modifier le fichier, dans le cas contraire, le mieux est de vous faire auparavant passer pour l'utilisateur concerné avec la commande su :

$ su - login
$ sed -ir 's/Session=.+/Session=childsplay/' .dmrc

L'argument signe moins (-) de su sert à dire que vous souhaitez vous connecter en tant que l'utilisateur login dans son répertoire personnel, ce qui vous permettra de voir directement le fichier .dmrc. Vous aurez bien sûr à entrer le mot de passe de l'utilisateur si vous ne l'avez pas enlevé. L'élimination du mot de passe, si ça vous tente, se fait de cette manière :

$ sudo passwd -d login

La commande passwd sert bien sûr à modifier le mot de passe et l'argument -d indique qu'il faut le détruire (delete).

Enfin rien de plus agréable que d'avoir une petite image à cliquer pour entrer dans sa session, surtout quand on ne sait pas lire… Il faut pour cela modifier la photo de connexion de l'utilisateur. L'outil graphique pour faire ceci est « À propos de moi » dans les Linux récents. Il crée un fichier caché .face dans le répertoire de l'utilisateur qui est simplement l'image à afficher :

$ file .face
.face: PNG image, 60 x 60, 8-bit/color RGBA, non-interlaced

Rappelons que file est la commande magique qui détermine le contenu d'un fichier sans se fier ni à son nom ni à son extension. Ça évite de prendre des fichiers exécutables pour des images ou des archives zip par exemple, en changeant l'extension ou en insérant des dizaines d'espaces[4].

Remarque : les paquets contenant des photos de connexion sont gdm et kdepasswd, leurs images atterrissent respectivement dans les répertoires /usr/share/pixmaps/faces/ et /usr/share/apps/kdm/pics/users/ et celles de KDE sont plus petites que celles de GDM.

Bien sûr il vous reste à choisir un thème de gestionnaire de connexion qui affiche les photos de connexion sans quoi vous ne les verrez jamais ! Si vous utilisez gdm (qui vient habituellement par défaut avec Gnome), c'est l'application gdmsetup qui permet de le faire, elle se trouve dans le menu d'administration sous l'intitulé « fenêtre de connexion ».

doudoulinux gdm

Écran de connexion DoudouLinux avec photos de connexion.

Trouver ce qu'il faut lancer…

Ça peut paraître absurde, mais il vaut mieux d'abord vérifier que la commande lançant l'application va effectivement l'afficher en plein écran. C'est bien ce qui se passe pour pysycache et childsplay. En revanche pour gamine, gcompris ou encore tuxpaint ce n'est pas le cas. Pour les deux derniers, un petit tour dans les pages de manuel (man gcompris et man tuxpaint) nous indique qu'il suffit de les lancer ainsi :

$ gcompris -f
$ tuxpaint --800x480

On voit donc que tuxpaint était ici gêné par la résolution un peu inhabituelle de l'écran[5]. Si vous avez une version récente de tuxpaint (0.9.20 dans Debian Lenny), vous pouvez utiliser plutôt ces options qui ne nécessitent pas de spécifier la résolution :

$ tuxpaint --fullscreen --native

Dans le cas contraire, pour ne pas avoir à adapter manuellement cette valeur à l'écran, on peut récupérer la résolution avec la commande suivante :

$ xdpyinfo
name of display:    :0.0
version number:    11.0
vendor string:    The X.Org Foundation
[…]
screen #0:
  dimensions:    800x480 pixels (211x126 millimeters)

La résolution peut alors être extraite à l'aide d'expressions régulières :

$ xdpyinfo | grep -Eoe '[0-9]+x[0-9]+ pixels' | grep -Eoe '^\w+'
800x480

La première extrait le texte « 800x480 pixels » et la seconde « 800x480 ». On ne cherche pas directement 800x480 pour être sûr de bien trouver la résolution. Il n'y a plus qu'à ré-injecter cela dans la commande lançant tuxpaint :

$ SCREENRESOL=$(xdpyinfo | grep -Eoe '[0-9]+x[0-9]+ pixels' | grep -Eoe '^\\w+')
$ tuxpaint --$SCREENRESOL

Par contre avec gamine, le problème est un peu moins évident. Dans une session Gnome il n'y a bien sûr aucun problème, mais dans une session xterm on est loin du plein écran : l'application occupe juste un petit rectangle en haut à gauche… Comme cette application n'accepte aucune option au lancement, il faut lancer avant elle quelque chose qui lui permettra d'accéder au plein écran et qui est lié à l'environnement Gnome. Quelques investigations on permis de trouver que le gestionnaire de fenêtres de Gnome metacity résout le problème. Il suffit de le lancer en tâche de fond juste avant :

$ metacity &
$ gamine

En fait des essais complémentaires avec openbox comme gestionnaire de fenêtres ont donné le même résultat positif. Il semble donc que n'importe quel gestionnaire de fenêtres fasse l'affaire.

Mes scripts de lancement de session

Je vous propose un petit coup d'œil aux scripts pour les curieux. Ceux qui sont plus intéressés par l'utilisation gagneront à plutôt visiter mon dépôt de paquets Debian conçus pour Debian Lenny mais qui peuvent marcher sur d'autres versions (Ubuntu, Xandros, Debian Etch, etc.).

Pour tuxpaint :

#!/bin/sh
#
# just starts tuxpaint fullscreen in native resolution

/usr/bin/tuxpaint --fullscreen --native

Pour gcompris, le lancement de l'application pouvant être long, une splash image a été ajoutée avec l'icône gcompris et la commande xli du paquet éponyme :

#!/bin/sh
#
# just starts Gcompris fullscreen with a kind of
# splash screen while waiting for application to araise

xli /usr/share/pixmaps/gcompris.png -fullscreen &
/usr/games/gcompris --fullscreen

Pour gamine, une liste de gestionnaire de fenêtre est parcourue pour essayer d'en trouver un à lancer, c'est donc le script le plus « complexe » si on peut dire :

#!/bin/sh
#
# starts gamine full screen after starting a window manager
#TODO: reduce the workspace number from 4 to 1 in user prefs

WMLIST='openbox metacity kwin'
WMSTARTED=0

for WM in $WMLIST; do
	if [ -x "$(which $WM)" ]; then
		$WM &
		WMSTARTED=1
		break
	fi
done

if [ $WMSTARTED = 1 ]; then
	gamine
else
	echo '! unable to start a window manager among' $WMLIST
fi

Comme indiqué en commentaire du script, il faudrait dans l'idéal modifier le nombre de bureaux virtuels de l'utilisateur afin qu'il n'en ait qu'un seul. En effet la classique combinaison de touches Control + Alt + flèche de droite/gauche, en changeant de bureau, fait disparaître l'application de l'écran !

Notes

[1] ceci ne marchera bien évidemment que si vous avez installé xterm, par exemple avec la commande apt-get install xterm

[2] ce sont les paquets childsplay-session, gamine-session, gcompris-session, pysycache-session et tuxpaint-session

[3] cela dit même s'il faut régulièrement leur taper leur mot de passe au début, leur donner un mot de passe, c'est leur donner une bonne habitude…

[4] méthodes ultra classiques pour faire lancer à l'utilisateur de Windows® un logiciel malveillant…

[5] signalons à ce propos que pysycache et childsplay ne fonctionne qu'à une résolution minimale de 800x600 au grand damne des petits EeePC, mais le billet Activer une résolution d'écran virtuelle sur l'EeePC a déjà traité ce problème ;-)