autoWallChange: Automatically changes wallpaper

About the script
This is a KDE (may not work in KDE 4) only shell script which changes wallpaper every few minutes as set by you. KDE too has a built-in feature to change wallpaper but it has few limitations:-

  1. It doesn’t show pictures within the sub-directories of the given path.
  2. It applies the same picture position setting (i.e. Scala&Crop, Tile, etc.) to all the pictures.

This script allows you to apply different picture position settings to pictures from different directories. e.g. if you use the following settings

picDir=”/home/geek/Pictures”
shapeDir=”Rectangle Square Tall”
shapeMode=”8 8 5″

Then pictures from /home/geek/Pictures/Rectangle and /home/geek/Pictures/Square will be shown using Scale & Crop position setting, and pictures from /home/geek/Pictures/Tall will be Titled Maxpect. Following is the table for which number stands for what position setting.

  • 1 -> Centered
  • 2 -> Titled
  • 3 -> Center Titled
  • 4 -> Centered Maxpect
  • 5 -> Titled Maxpect
  • 6 -> Scaled
  • 7 -> Centered Auto Fit
  • 8 -> Scale & Crop

This script is best used with my iflickrDown script (see here).

The code
License: GNU Public License version 3.

[code lang=”bash”]#!/bin/bash
#Coded by AppleGrew
#License: GPL version 3

#############################################
############Alternative way to set###########
##########the following variables############
#Create another shell script and export it #
#from there. #
#===============SAMPLE=======================
# #!/bin/bash
# export picDir="/home/geek/Pictures" #Donot put ‘/’ at the end
# export shapeDir="Square Rectangle Tall"
# export shapeMode="8 8 5"
# export changeWallIntv=2 #in mins
#
# ./autoWallChange >/tmp/autoWall.log & #Launching the main program.
############Configs##########################
picDir="" #Donot put ‘/’ at the end
shapeDir=""
shapeMode=""
changeWallIntv=1 #in mins
#############################################

tmpFile="/tmp/autoWallChange.tmp"
lstFile="/tmp/autoWallChange.lst"
fileLen=0
factor=0

shapeDir=( $shapeDir )
shapeMode=( $shapeMode )

echo "${shapeDir[@]}"
echo "${shapeMode[@]}"

function refreshFileList(){
local DIR_PATH=$1
local sM=$2
echo "Refreshing content of ‘$DIR_PATH’, shape mode is $sM"

if [ -a "$DIR_PATH" ] && [ -d "$DIR_PATH" ] && [ -w "$DIR_PATH" ]
then
for f in `find "$DIR_PATH" -type f -print | sed ‘s/ /|/g’`
do
matchFound=0
for fl in `cat "$tmpFile"`
do
fl=`echo "$fl"|sed -e ‘s/\([^>]*\)>\([^>]*\)/\1\n\2/g’|head -n 1|tail -n 1`
[[ "$fl" == "$f" ]] && matchFound=1 && break
done
[[ $matchFound == 0 ]] && printf "%s>%d\n" $f $sM >>"$tmpFile" && let ‘fileLen++’
done
let ‘factor=(fileLen-1)*100000000/32767’
fi
echo "Refreshed"
}

printf "">"$tmpFile" #Creating new empty file.
i=0
for shape in ${shapeDir[@]}
do
test -a "$picDir/$shape" && find -L "$picDir/$shape" -type f -print > "$lstFile.$i"
test -a "$picDir/$shape" && refreshFileList "$picDir/$shape" ${shapeMode[$i]}
let ‘i++’
done

shownPicsLine=0
lastL=""
totShown=0
RANDOM=$$
while true
do
let ‘l=(factor*RANDOM+100000000)/100000000’
test $totShown -ge $fileLen && lastL="" && totShown=0
while echo "$lastL" | grep -o "\"$l\"" > /dev/null
do
let "l++"
test $l -gt $fileLen && l=1
done
lastL="${lastL}\"$l\""
let "totShown++"

pfileL=`cat "$tmpFile"|head -n $l|tail -n 1`
pfilePath=`echo "$pfileL"|sed -e ‘s/\([^>]*\)>\([^>]*\)/\1\n\2/g’|head -n 1|tail -n 1|sed ‘s/|/ /g’`
pfileMode=`echo "$pfileL"|sed -e ‘s/\([^>]*\)>\([^>]*\)/\1\n\2/g’|head -n 2|tail -n 1`

if [ $totShown -ge $fileLen ]
then
lastL=""
totShown=0
fi

[ -f "$pfilePath" ] && dcop kdesktop KBackgroundIface setWallpaper "$pfilePath" "$pfileMode"

i=0
for shape in ${shapeDir[@]}
do
if test -a "$picDir/$shape" && ! find -L "$picDir/$shape" -type f -print | diff "$lstFile.$i" ->/dev/null
then
echo "’$picDir/$shape’ content changed"
refreshFileList "$picDir/$shape" ${shapeMode[$i]}
find -L "$picDir/$shape" -type f -print > "$lstFile.$i"
fi
let ‘i++’
done
echo "sleeping"
sleep "${changeWallIntv}m"
done<[/code]

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.