Des geekeries, de la MAO, de tout et de rien…
Je suis
Charlie

Changer automatiquement de fond d'écran dans LightDM/GTK+ Greeter

Icône auteur nah, Icône canondrier 01 mai 2017, Icône commentaire
Mots clés Icône catégorie geekeries, GNU/Linux, linux, classé dans Icône catégorie 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…).

LightDM avec le fond d écran Debian

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
LightDM avec le fond d'écran que j'ai défini

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
LightDM avec le fond d'écran "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…

Capture d'écran du terminal contenant en alternance les commandes ls -l default.jpg et l'appel au script de changement d'image

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 :)