Fonds d’écran dynamiques
avec Sway

Ces derniers mois, je suis tombé amoureux de Sway, un gestionnaire de fenêtre inspiré d’i3 qui fonctionne nativement sous Wayland. J’y ai trouvé toute l’efficacité et les habitudes que j’avais développées sous i3, avec un système plus fluide et réactif.

Toutes mes applications y fonctionnent très bien, et j’ai enfin pu découvrir – après 15 années sous Linux – un affichage sans tearing. Firefox, en particulier, y propose un défilement incroyablement fluide, qui n’existait jusqu’ici que sous macOS.

Au quotidien, j’utilise waybar pour afficher les espaces de travail, kitty pour l’émulateur de terminal et wofi comme lanceur d’applications. Toutes les applications que j’utilise au quotidien ont un affichage native sous Wayland, à l’exception de steam et gimp : pour celles-ci, xwayland fait un pont qui hélas ne supporte pas le HiDPI pour l’instant, et provoque donc des applications pixelisées.

Une chose qui me manquait cependant, bien que complètement inutile, était de pouvoir automatiser un changement de fond d’écran. Celui-ci était géré par swaybg qui, lorsque redémarré, affichait un écran gris pour quelques instants.

Relancer le fonds d’écran sans flash gris

L’astuce est de ne pas relancer swaybg, mais d’en créer une nouvelle instance avant d’arrêter la précédente.

En supposant que l’on obtient le fond d’écran avec :

swaybg -i image1.png -m fill &

L’identifiant du processus (PID) de la dernière commande est automatiquement stockée dans $!. On l’enregistre dans une variable :

PID=$!

Quand souhaité, on peut lancer une deuxième instance avec un second fond d’écran. Celle-ci n’apparaîtra pas de suite, car l’ancienne tourne toujours :

swaybg -i image2.png -m fill &

Dès que l’on arrête l’instance précédente, le fond d’écran va changer sans flash gris :

kill $PID

Fond d’écran aléatoire

Supposons que l’on a un répertoire img/ avec plusieurs images. On peut en sélectionner une au hasard avec :

find img/. -type f | shuf -n1

Pour changer le fond d’écran aléatoirement, on peut donc utiliser :

swaybg -i $(find img/. -type f | shuf -n1) -m fill &

Il est donc possible d’utiliser un script qui change le fond d’écran aléatoirement, par exemple toutes les dix minutes (600 secondes) :

#!/bin/sh
swaybg -i $(find img/. -type f | shuf -n1) -m fill &
OLD_PID=$!
while true; do
    sleep 600
    swaybg -i $(find img/. -type f | shuf -n1) -m fill &
    NEXT_PID=$!
    sleep 5
    kill $OLD_PID
    OLD_PID=$NEXT_PID
done

On rend ce script exécutable avec chmod +x, puis on peut le lancer automatiquement avec Sway en ajoutant dans la configuration de Sway :

exec "cd your_script_folder && ./your_script.sh"

Une autre façon de procéder pourrait être d’utiliser pidof swaybg, puis kill: ceci est illustré dans l’exemple suivant.

Fond d’écran dynamique selon l’heure de la journée

J’ai récemment réalisé un fond d’écran dynamique, basé sur l’animation 25th hour de Louis Coyle.

Cette animation a été enregistrée et transformée en 144 images, six par heures, pour obtenir un fond d’écrans qui change toutes les dix minutes. Vous pouvez le trouver ici : Lakesize dynamic wallpaper).

Ce script utilise cette commande pour recharger le fond d’écran toutes les dix minutes :

#!/bin/sh
#!/bin/sh
cd projets/lakeside
while true; do
    PID=`pidof swaybg`
    swaybg -i ./img/$(date -u -d @$((($(date -u +%s) / 600) * 600)) "+%Hh%M").png -m fill &
    sleep 1
    kill $PID
    sleep 599
done