Block > WallPaperOnTheFly

Heute will ich euch mal ein kleines Script vorstellen, das mir Wallpaper on the fly generiert, d.h. es erstellt welche im Hintergrund (kann man auch per Cronjob regeln) und zeigt dann stuendlich einen neuen an (mit Cronjob).

Aber ich muss zuerst einige andere Dinge erlaeutern.

Ich habe einen kleinen Laptopbildschirm mit einer Aufloesung von 1280x800 und einen externen Bildschirm mit 1920x1080. Wenn ich mich nun einlogge und somit X starte, muss ich immer noch mit xrandr ein paar Settings vornehmen (das kann man natuerlich auch in die .xinitrc eintragen).

Das heisst, ich konfiguriere den Bildschirm so:

$ xrandr --output VGA1 --mode 1920x1080 --right-of LVDS1

Kurz danach wechsele ich noch den Bildschirmhintergrund, und zwar mit feh. Wmii zeigt mir den dann an. Natuerlich soll das Wallpaper random sein:

$ set -f; O=$IFS IFS=$'\n' files=($(/usr/bin/find /home/${USER}/pictures/wallpaper/2944x1080/ -type f -name '*')) IFS=$O; set +f && /usr/bin/feh --bg-scale ${files[ $(( $RANDOM % ${#files[@]} )) ]}

Weil ich durch xrandr nachher eine Groesse von 2944x1080 habe, soll der Befehl natuerlich nur Bilder aus diesem Pool auswaehlen.

Soweit so gut. Doch wie aendert man den Wallpaper nun per Cronjob?

Dazu muss man einen Eintrag in die Crontab vornehmen (am besten schreibt man sich den vorherigen Befehl in eine Datei und macht sie ausfuehrbar):

$ crontab -e

## --- snip ---
# fuehrt folgendes Script stuendlich aus:
0 */1 * * * DISPLAY=:0.0 /home/${USER}/random-wallpaper.sh
## --- snap ---

Wichtig ist dabei DISPLAY=:0.0, denn ansonsten jammert Feh rum und bringt folgenden Error (Hier gefunden (Post von nj)):

feh ERROR: Can't open X display. It \*is\* running, yeah?

Ok, das klappt nun. Doch wie bekomme ich so ein Wallpaper ueberhaupt erstellt?

Zuerst sollte man ueberlegen, was fuer eine Groesse man ueberhaupt braucht. Also wenn man einen einzelnen Bildschirm verwendet, ist die Sache ja einfach. Aber bei 2 muss man halt erstmal ausrechnen. Ich habe mich z.B. fuer 2 Wallpaper entschieden, einer mit einer Groesse von 1024x768 und einer mit 1920x1080.

Dann muss man sich natuerlich ein paar Wallpaper herunterladen. Empfehlenswerte gibts hier: ewallpapers.eu und interfacelift.com.

Nun kann man die Bilder umbenennen und in Ordner sortieren. Umbenennen kann man mit rename oder virn (ist auch bei Leerzeichen empfehlenswert, da sonst feh nicht richtig funktioniert), und sortieren mit identify von ImageMagick:

#!/bin/bash
for i in *.* ; do
        if[ ! -d "$i" ] ; then
                ordner=`identify $i | awk '{print $3}'`
                if[ ! -d "$ordner" ] ; then
                        mkdir $ordner
                fi
                mv $i $ordner
        fi
done

Nun wandelt man noch zu grosse Bilder um. Und zwar mit convert.

#!/bin/bash
for i in `ls $1` ; do
        convert -geometry 1024x1024 ./$1/$i $i # 1024x1024 mit der passenden Groesse ersetzen. Wenn man z.B. Bilder in eine Aufloesung von 1920x1080 zwaengen will: 1920x1920.
done

Juhu, schon fast fertig. Der naechste und fast letzte Schritt ist das Konkatenieren von Bildern. Dies machen wir mit montage.

#!/bin/bash
set -f; O=$IFS IFS=$'\n' files=($(/usr/bin/find /home/${USER}/pictures/wallpaper/1024x768/ -type f -name '*')) IFS=$O; set +f && rand1=${files[ $(( $RANDOM % ${#files[@]} )) ]}
set -f; O=$IFS IFS=$'\n' files=($(/usr/bin/find /home/${USER}/pictures/wallpaper/1920x1080/ -type f -name '*')) IFS=$O; set +f && rand2=${files[ $(( $RANDOM % ${#files[@]} )) ]}
name1=`basename $rand1`
name2=`basename $rand2`
montage -background black -mode Concatenate $rand1 $rand2 /home/${USER}/pictures/wallpaper/2944x1080/${name1}+${name2}.png

Ok. Nun gibt es schonmal ein paar Pools, aus denen wir Bilder generieren koennen. Das machen wir mit einer einfachen For-Schleife. Wpotf ist dabei das letzte Script.

$ for i in {0..9} ; do ./wpotf ; done

Das kann man natuerlich auch mit einem Cronjob machen. Das bleibt dann dir ueberlassen.

Ich hoffe, das hat jemandem geholfen ;)

Geschrieben: 2010-02-08, 03:45 - Tags: linux, wallpaper