Changer automatiquement de fond d'écran dans LightDM/GTK+ Greeter
classé dans Asrall, Geekeries, Linux
Dans cet article, nous allons voir comment changer automatiquement de fond d'écran dans LightDM et GTK+ Greeter.
Qu'est-ce que LightDM ?
LightDM (Light Display Manager), est un gestionnaire d'affichage pour X Window System, et qui gère, entres autres, l'ouverture des sessions graphiques.
Ce logiciel utilise divers front-ends pour dessiner l'interface de connexion, comme GTK+ Greeter, Unity Greeter ou Webkit2 Greeter.
GTK+ Greeter ?
Ce front-end reprend le style de GDM, et est facilement configurable.
Comment changer le fond d'écran
Par défaut, le fond d'écran est celui de la distribution (Debian, Ubuntu ou dérivée…).
Image par défaut
Sous Debian, avec GTK+ Greeter, l'image par défaut est définie dans /usr/share/lightdm/lightdm-gtk-greeter.conf.d/01_debian.conf
Cependant, ce n'est pas une bonne idée de modifier la configuration à cet endroit là.
Il vaut mieux éditer le fichier de configuration /etc/lightdm/lightdm-gtk-greeter.conf
Par exemple, l'image que je veux utiliser est /usr/local/share/lightdm/walls/miku.jpg
[greeter] background=/usr/local/share/lightdm/walls/miku.jpg
Le résultat obtenu.
Changer automatiquement de fond d'écran
À priori, Webkit2 Greeter supporterait le changement automatique de fond d'écran. Cependant :
- cela nécessite de récupérer le code source de ce front-end (non packagé dans Debian) ;
- cela utilise webkit (moteur de rendu html) pour afficher une image (pourquoi ne pas lancer carrément Firefox tant qu'on y est). #troll ;
- ce n'est pas amusant si on ne doit pas scripter.
Choix des images
On commence d'abord par choisir des images. J'en ai choisi avec le moins d'éléments graphiques au centre, je préfère que la fenêtre de connexion soit au centre et non déporté sur l'un des côtés de l'écran.
Les images étant un mélange de .jpg et de .png, j'ai converti les .png en .jpg à la main avec EOG (Fichier -> Enregistrer sous…)
Les images sont numérotées (de 1 à 7 dans mon cas).
Le répertoire /usr/local/share/lightdm/walls/ est créé, et est rendu lisible par lightdm (un chmod 0644 devrait convenir). Les images sont copiées dedans.
Un lien symbolique (symlink) est créé.
ln -sf 6.jpg default.jpg
Ici, j'utilise l'image 6.
Paramétrage
On modifie /etc/lightdm/lightdm-gtk-greeter.conf
et on utilise default.jpg à la place de l'image utilisée précédemment.
[greeter] background=/usr/local/share/lightdm/walls/default.jpg
Désormais, pour changer l'image de fond, il suffit de modifier le lien symbolique et non un fichier de configuration.
Changement automatique
Définir le lien symbolique à la main, c'est bien joli, mais je ne veux pas le faire à chaque fois que j'allume mon ordinateur.
Scriptons un peu avec bash.
#!/bin/bash cd /usr/local/share/lightdm/walls MIN=1 MAX=7 CURR=$(($(ls -l default.jpg | sed 's/\(.*\)> \(.*\)\.jpg/\2/') +1)) if [ $CURR -gt $MAX ] then CURR=$MIN fi ln -sf $CURR.jpg default.jpg
Le script est enregistré dans /usr/local/bin/change-fond-lightdm.sh et est rendu exécutable via chmod +x.
Quelques explications s'imposent :
- On se déplace d'abord là où sont stockées les images ;
- On définit deux variables, MIN et MAX :
- MIN contient la valeur de la première image (certains comptent à partir de zéro, d'autres à partir de un) ;
- MAX contient la valeur de la dernière image (très important pour la suite) ;
Là, on arrive sur cette instruction imbuvable.
Décomposons cette instruction :
- ls -l default.jpg
- sed
- 's/(.*)> (.*).jpg/2/')
- +1
- CURR=$(( ))
ls -l default.jpg. On l'utilise pour récupérer le nom du fichier pointé par default. Ici, le résultat est :
lrwxrwxrwx 1 root staff 5 mai 1 16:42 /usr/local/share/lightdm/walls/default.jpg -> 6.jpg
On utilise ensuite l'éditeur sed pour extraire le nom du fichier.
L'extraction en elle même s'effectue via l'expression régulière 's/(.*)> (.*).jpg/2/')
On cherche deux groupes. Le premier s'arrête à > (noter la présence de l'espace après le >). Le second groupe est le texte qui suit, et qui précède .jpg.
On ne garde que le second groupe.
On obtient alors
6
On ajoute 1.
On stocke le résultat dans la variable CURR.
Ensuite
- On compare le nombre contenu dans CURR avec MAX ;
- Si CURR strictement supérieur à MAX
- alors CURR prend la valeur MIN
Ici, CURR contient 7. 7 n'est pas strictement supérieur à 7, donc on continue. Si CURR aurait la valeur 8, alors la ligne then aurait été appelée, et CURR serait revenu à 1.
- On crée le lien symbolique (-s) default.jpg avec remplacement si celui-ci existe (f) avec comme nom le nombre contenu dans CURR, que l'on concatène avec .jpg
On teste
Il suffit de regarder la cible de default.jpg, puis d'appeler le script, puis de regarder, etc…
Cela fonctionne correctement, on voit bien qu'après 7, on revient bien à 1.
Le cas 9 -> 10 n'a pas été testé.
On intègre l'automatisation
Ici, plusieurs possibilités :
- Ajouter l'appel au script dans /etc/rc.local ;
- Créer un unit systemd ;
- Exécuter le script toutes les heures via cron ;
- Faire en sorte que cela soit LightDM qui appelle automatiquement le script lorsque LightDM démarre.
C'est la dernière solution qui a été retenue.
On édite /etc/lightdm/lightdm.conf
Sous la section [Seat:*], on décommente/ajoute la ligne display-setup-script=… comme ceci :
[Seat:*] display-setup-script=/usr/local/bin/change-fond-lightdm.sh
Test en vidéo :
Ici, LightDM est redémarré pour vérifier que le changement d'image de fond est effectif.
À noter : si on veut que l'image change non pas au démarrage de LightDM mais à chaque fois que LightDM est affiché (l'ordinateur démarre : une image, on ouvre la session, on ferme la session, l'image change…), il faut utiliser greeter-setup-script à la place de display-setup-script
[Seat:*] greeter-setup-script=/usr/local/bin/change-fond-lightdm.sh
Remerciements
Dave Null (@devnull) pour l'idée de base, le script de capture de l'écran de connexion, et avoir confirmé que ça fonctionne :)
Remarques
Si vous me suivez sur Mastodon et que cet article vous dit quelque chose, c'est normal :)