Block > WallPaperOnTheFly
3 min (591 Wörter, 3380 Zeichen)
Hinweis
Dieser Eintrag ist älter als 3 Jahre und entspricht vermutlich nicht mehr dem neuesten Stand der Technik/Realität.
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
# 1024x1024 mit der passenden Groesse ersetzen. Wenn man z.B.
# Bilder in eine Aufloesung von 1920x1080 zwaengen will: 1920x1920.
convert -geometry 1024x1024 ./$1/$i $i
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 😉