Variety, un wallpaper changeant sous GNU/Linux

Bien que la configuration de mon bureau soit stabilisée depuis un long moment maintenant (est-ce cela, entrer dans la vie adulte ?), il restait un petit regret de temps à autre, aiguisé récemment par un collègue au boulot : le fond d’écran.

Après avoir amassé — sans doute comme beaucoup — des centaines d’images diverses durant mon adolescence, je me rendait bien compte que changer de fond d’écran tous les jours était une tâche ridiculement inutile. J’ai donc pendant longtemps conservé le même fond d’écran, neutre par excellence et reposant pour les yeux. Mais quid de ma super grande collection ?

Mon collègue utilise un petit logiciel (je ne me souviens plus si il l’a ajouté ou si c’est natif dans Unity) pour changer de fond d’écran à intervalle régulier. « Bon sang mais c’est bien sûr ! ». J’entends déjà vos moqueries atteindre mes oreilles : oui, je sais que c’est vieux comme le monde, j’en avais même testé à une époque mais cela m’étais complètement sortie de la tête.

En quête d’un bon changeur de fond d’écran

Me voilà donc en quête du meilleur changeur de fond d’écran, au vu de ma configuration (Archlinux, Awesome WM). Je me retrouve donc avec, au choix :

Je ne me voyais pas, pour une fois, devoir mettre les mains dans le cambouis pour maintenir le bouzin, du coup l’existence d’un paquet pour Archlinux (que je n’ai pas besoin de maintenir moi-même si possible) était un impondérable. Par ailleurs, je souhaitais pouvoir profiter de la banque d’image absolument infinie de Flickr et d’une interface graphique un peu chouette pour éviter de trop traîner dans des scripts.

De ce fait — et parce qu’il faut bien faire un choix un jour — j’ai rapidement évacué l’option des scripts et Wallch, qui ne propose pas de greffon pour Flickr.

Il me restait donc Wally et Variety. J’ai finalement écarté Wally également sur des prétextes que d’aucun qualifieraient de fallacieux, mais un choix est un choix : Wally est développé en QT là où une majorité mes applications — ex-gnome-user oblige — est en GTK et il n’est disponible qu’en tant que « paquet utilisateur » sur AUR pour ma distribution. À côté de ça, Variety est développé en PyGTK et est même disponible dans les dépôts officiels de ma distribution. Banco

Après installation de la chose, j’ai découvert deux points hyper positifs pour ce logiciel :

Variety et Nitrogen

En l’occurrence, une fois sorti du monde Gnome, Unity, KDE et consort, la seule option proposée par l’auteur de Variety est d’utiliser feh. Pourquoi pas. Mais historiquement j’ai toujours utilisé Nitrogen, un petit logiciel très léger et efficace. Pourquoi changer ?

J’ai donc profité de la possibilité d’utiliser ses propres scripts pour rendre Variety interopérable avec Nitrogen. Voilà comment.

Récupérer la valeur du papier peint courant

Le script get_wallpaper permet de récupérer la valeur du dernier papier peint enregistré. Ce script ne sert réellement qu’au démarrage de Variety, pour qu’il décide quel fond d’écran utiliser rapidement. Nitrogen utilisant un fichier de configuration pour sauvegarder les choix de l’utilisateur, il était assez simple pour moi de récupérer cette valeur. Voilà ci-après le contenu de mon script ~/.config/variety/scripts/get_wallpaper :

1: #!/usr/bin/env bash
2: 
3: sed -n "s/file=\(.*\)/\1/p" $HOME/.config/nitrogen/bg-saved.cfg | tail -n 1

Mise à jour du papier peint

Cette partie là a demandé, en tout cas sous Archlinux, une petite manipulation supplémentaire. En effet, la version de Nitrogen installable facilement via les paquets n’est pas la plus à jour et dans mon cas très précis j’avais besoin des derniers changements apportés à l’interface en ligne de commande concernant la gestion des écrans multiples.

Il a donc fallu tout simplement que je désinstalle Nitrogen pour récupérer le paquet utilisateur nitrogen-git. C’est tout.

Voici donc le contenu de mon script ~/.config/variety/scripts/set_wallpaper :

 1: #!/usr/bin/env bash
 2: 
 3: WP=$1
 4: WP_SIZE=`identify "$WP" | cut -d' ' -f3 | cut -dx -f1`
 5: 
 6: SCREEN_NUMBER=1
 7: SCREEN_SIZE=0
 8: SCREEN_MSG='fills all screens.'
 9: if which xrandr &>/dev/null ; then
10:     SCREEN_NUMBER=`xrandr -q | grep '*' | wc -l`
11:     SCREEN_SIZE=`xrandr -q | head -n1 | sed -n "s/.*current \([0-9]*\) x .*/\1/p"`
12: fi
13: 
14: if [ "$SCREEN_SIZE" -gt "$WP_SIZE" -a "$SCREEN_NUMBER" -gt '1' ]; then
15:     for ((cur_screen=0; cur_screen < SCREEN_NUMBER ; cur_screen++))
16:     do
17:         nitrogen --head=$cur_screen --set-zoom-fill "$WP" 2> /dev/null
18:     done
19:     SCREEN_MSG='on each screen.'
20: else
21:     nitrogen --head=-1 --set-zoom-fill "$WP" 2> /dev/null
22: fi
23: 
24: # Show a notification on wallpaper change (only when the change is automatic). Display the original filename, but the post-effects image.
25: if [ "$2" == "auto" ]; then
26:     WP_CAP=`basename $WP`
27:     convert "$WP" -resize 100x100 "/tmp/resize_$WP_CAP"
28:     notify-send --icon "/tmp/resize_$WP_CAP" "Wallpaper changed" "$WP_CAP $SCREEN_MSG"
29:     rm "/tmp/resize_$WP_CAP"
30: fi

La première partie permet de décider de la commande Nitrogen à utiliser : s’agit-il de placer le même fond d’écran sur les différents écrans allumés, ou la résolution du fond d’écran spécifié est suffisamment bonne pour permettre son utilisation unique au travers des différents écrans. Je vous invite à vous reporter à l’aide de Nitrogen pour mieux comprendre les options utilisées (nitrogen --help).

La seconde partie — à partir de « # Show a notification on wallpaper change » — est beaucoup plus gadget et me permet, à l’aide d’ImageMagick, de m’afficher dans une notification système un aperçu du fond écran utilisé après un changement. Travaillant très souvent en plein écran, cela me permet d’avoir quand même un petit aperçu des jolies images affichées, sans pour autant être trop gênant.