2003-04-27 15:33:26 +00:00
#!/bin/sh
#
# Set wallpaper for fluxbox.
#
2004-01-17 01:29:40 +00:00
# Copyright (c) 2003-2004 Han Boetes <han@mijncomputer.nl>
2003-04-27 15:33:26 +00:00
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
# "Software"), to deal in the Software without restriction, including
# without limitation the rights to use, copy, modify, merge, publish,
# distribute, sublicense, and/or sell copies of the Software, and to
# permit persons to whom the Software is furnished to do so, subject to
# the following conditions:
#
# The above copyright notice and this permission notice shall be
# included in all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
# IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
# CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#
2004-11-19 11:37:27 +00:00
# $Id$
2003-04-27 15:33:26 +00:00
# Portability notes:
# To guarantee this script works on all platforms that support fluxbox
# please keep the following restrictions in mind:
#
2003-08-17 13:30:35 +00:00
# - don't use if ! command;, use command; if [ $? -ne 0 ];
# - don't use [ -e file ] use [ -r file ]
# - don't use $(), use ``
# - don't use ~, use ${HOME}
2004-03-11 00:08:34 +00:00
# - don't use id -u or $UID, use whoami
2003-10-16 15:54:20 +00:00
# - don't use echo -e
2003-08-17 13:30:35 +00:00
# - getopts won't work on all platforms, but the config-file can
# compensate for that.
# - various software like grep/sed/perl may be not present or not
# the version you have. for example grep '\W' only works on gnu-grep.
# Keep this in mind, use bare basic defaults.
# - Do _NOT_ suggest to use #!/bin/bash. Not everybody uses bash.
2003-10-08 14:00:47 +00:00
# TODO purheps: xprop -root _WIN_WORKSPACE
# _NET_CURRENT_DESKTOP
2003-04-27 15:33:26 +00:00
2003-06-06 02:18:34 +00:00
# The wallpapersetter is selected in this order
2003-10-16 15:54:20 +00:00
wpsetters=${wpsetters:=Esetroot wmsetbg feh chbg display qiv xv xsri xli xsetbg} # broken icewmbg'
2003-04-27 15:33:26 +00:00
lastwallpaper=${HOME}/.fluxbox/lastwallpaper
2003-04-29 11:26:34 +00:00
2003-04-27 15:33:26 +00:00
WHOAMI=`whoami`
2003-06-06 02:18:34 +00:00
[ "$WHOAMI" = root ] && PATH=/bin:/usr/bin/:/usr/local/bin:/usr/X11R6/bin
2003-04-27 15:33:26 +00:00
2003-10-08 14:00:47 +00:00
command="`basename \"$0\"`"
2003-04-27 15:33:26 +00:00
# Functions
display_usage() {
2003-07-20 11:23:51 +00:00
cat << EOF
2003-12-29 00:00:28 +00:00
Usage: $command [-u/-U [wallpapersetter]] [-fFcCtTaA /path/to/wallpaper]
[-r/-R /path/to/wallpaperdirectory]
[-b/-B bsetrootoptions] [-l] [-h] [-i] [-p]
2003-12-08 19:31:40 +00:00
Use \`\`$command -h'' for a complete help message.
2003-10-16 15:54:20 +00:00
2003-04-27 15:33:26 +00:00
EOF
}
display_help() {
display_usage
2003-07-20 11:23:51 +00:00
cat << EOF
2003-04-27 15:33:26 +00:00
Options:
2003-12-12 13:07:47 +00:00
-f Set fullscreen wallpaper.
-c Set centered wallpaper.
-t Set tiled wallpaper.
2003-04-28 14:45:13 +00:00
-a Set maximized wallpaper, preserving aspect.
( if your bgsetter doesn't support this
2003-10-08 14:00:47 +00:00
we fall back to -f )
2003-12-12 13:07:47 +00:00
-u Use specified wallpapersetter, use no argument to forget.
-b Forward the options to bsetroot.
2003-12-29 00:00:28 +00:00
-r set random wallpaper from a directory
2003-04-27 15:33:26 +00:00
2003-12-29 00:00:28 +00:00
-F,-C,-T,-A,-U,-B,-R same as uncapsed but without remembering.
2003-08-17 13:30:35 +00:00
2003-12-12 13:07:47 +00:00
-h Display this help.
2003-04-27 15:33:26 +00:00
2003-12-12 13:07:47 +00:00
-l Set previous wallpaper.
2003-04-27 15:33:26 +00:00
2003-12-12 13:07:47 +00:00
-i Information about selected wallpaper command.
-d (deprecated, use -i) Debug info.
-p Tips.
2003-12-08 19:31:40 +00:00
2003-04-27 15:33:26 +00:00
Files:
2003-09-18 12:15:17 +00:00
~/.fluxbox/lastwallpaper In this file the wallpaper you set
will be stored, for the -l option:
2003-10-16 15:54:20 +00:00
Environment variables:
wpsetters Wallpapersetters to use.
example:
wpsetters=feh fbsetbg wallpaper.jpg
DISPLAY The display you want to set the wallpaper on.
example:
DISPLAY=:0.0 fbsetbg -l
2003-04-27 15:33:26 +00:00
EOF
}
2003-08-17 13:30:35 +00:00
display_tips() {
cat << EOF
2003-10-08 14:00:47 +00:00
Common tips to use with $command:
2003-04-27 15:33:26 +00:00
2003-10-08 14:00:47 +00:00
1) To replace all occurrences of bsetbg with $command in a file use this
2003-09-18 12:15:17 +00:00
command:
2003-04-27 15:33:26 +00:00
2003-10-08 14:00:47 +00:00
perl -pi -e 's,([^f]|^)bsetbg,$command,' filename
2003-04-27 15:33:26 +00:00
2003-10-08 14:00:47 +00:00
2) If you want the style to set the wallpaper and you want $command to
2003-08-17 13:30:35 +00:00
remember the previous wallpaper put this in your ~/.fluxbox/init
2003-04-27 15:33:26 +00:00
2003-10-08 14:00:47 +00:00
session.screen0.rootCommand: $command -l
2003-04-27 15:33:26 +00:00
2003-10-08 14:00:47 +00:00
3) Use $command -i to find out what wallpapersetter $command will be
2003-12-08 19:31:40 +00:00
used and what $command thinks about it.
2003-04-27 15:33:26 +00:00
EOF
}
# ugly code for solaris compat.
2003-08-17 13:30:35 +00:00
case `uname` in
Linux|*BSD)
find_it() {
which $1 > /dev/null 2>&1 && shift && $*
}
;;
*)
find_it() {
file=`which $1 2> /dev/null`
if [ -x "$file" ]; then
if [ $# -gt 1 ]; then
shift
$*
fi
return 0
else
return 1
fi
}
;;
esac
2003-04-27 15:33:26 +00:00
message() {
2004-03-11 00:08:34 +00:00
# This Terminal detection method is inaccurate. Looking for a
# replacement.
# echo if we have terminal output, otherwise pop up a window
# if [ -t 1 ]; then
# echo "$command: $@"
# else
2004-06-17 16:12:20 +00:00
extra_args="-default okay"
2004-03-11 00:08:34 +00:00
if find_it gxmessage; then
2004-06-17 16:12:20 +00:00
gxmessage $extra_args -center "$command: $@" &
2004-03-11 00:08:34 +00:00
else
2004-06-17 16:12:20 +00:00
xmessage $extra_args -center "$command: $@" &
2004-03-11 00:08:34 +00:00
fi
# fi
2003-04-27 15:33:26 +00:00
}
2003-04-28 14:45:13 +00:00
remembercommand() {
2003-07-20 10:58:27 +00:00
grep -vs "|${DISPLAY}$" ${lastwallpaper} > ${lastwallpaper}.tmp
2003-07-10 11:10:51 +00:00
mv -f ${lastwallpaper}.tmp ${lastwallpaper}
2003-12-12 13:07:47 +00:00
if [ "$option" = bsetroot ]; then
echo $option'|'$wallpaper'|'$DISPLAY >> $lastwallpaper
return
fi
2003-07-10 11:10:51 +00:00
# Make dir/../../path/file.jpg work
2003-04-29 11:26:34 +00:00
case $wallpaper in
2003-07-10 11:10:51 +00:00
# no spaces allowed between the varname and '|'
/*) echo $option'|'$wallpaper'|'$DISPLAY >> $lastwallpaper ;;
*) echo $option'|'$PWD/$wallpaper'|'$DISPLAY >> $lastwallpaper ;;
2003-04-29 11:26:34 +00:00
esac
2003-04-28 14:45:13 +00:00
}
2003-08-17 13:30:35 +00:00
debugfbsetbg() {
2003-04-29 11:26:34 +00:00
echo
echo $debugstory
2004-03-11 00:08:34 +00:00
echo $sad_esetroot_story
2003-04-27 15:33:26 +00:00
exit 0
}
2003-10-08 14:00:47 +00:00
if [ $# -eq 0 ]; then
message "no options given"
2003-12-08 19:31:40 +00:00
display_usage
2003-10-08 14:00:47 +00:00
exit 1
fi
2003-10-16 15:54:20 +00:00
2003-12-08 19:31:40 +00:00
unset debug setterfromcommandline
2003-10-08 14:00:47 +00:00
# Parse command-line options
2003-10-16 15:54:20 +00:00
while [ $# -gt 0 ]; do
2003-10-08 14:00:47 +00:00
case "$1" in
2003-10-16 15:54:20 +00:00
-u)
if find_it "$2"; then
2003-12-08 19:31:40 +00:00
grep -v wpsetters $lastwallpaper > ${lastwallpaper}.tmp
echo "wpsetters $2" >> ${lastwallpaper}.tmp
mv ${lastwallpaper}.tmp $lastwallpaper
WPSETTER=$2
setterfromcommandline=true
elif [ -z "$2" ]; then
grep -v wpsetters $lastwallpaper > ${lastwallpaper}.tmp
mv ${lastwallpaper}.tmp $lastwallpaper
message "wpsetter removed from historyfile"
exit 0
else
message "Couldn't find \"$2\" for wallpapersetter"
display_usage
exit 1
fi
shift 2 ;;
-U)
if find_it "$2"; then
WPSETTER=$2
setterfromcommandline=true
2003-10-16 15:54:20 +00:00
else
message "Couldn't find \"$2\" for wallpapersetter"
display_usage
exit 1
fi
shift 2 ;;
2003-10-08 14:00:47 +00:00
-d|-i) debug=true
break ;;
-a) option='$aspect'
wallpaper=$2
break ;;
-f) option='$full'
wallpaper=$2
break ;;
-c) option='$center'
wallpaper=$2
break ;;
-t) option='$tile'
wallpaper=$2
break ;;
-A) option='$aspect'
wallpaper=$2
remember=false
break ;;
-F) option='$full'
wallpaper=$2
remember=false
break ;;
-C) option='$center'
wallpaper=$2
remember=false
break ;;
-T) option='$tile'
wallpaper=$2
remember=false
break ;;
2003-12-12 13:07:47 +00:00
-b) option=bsetroot
shift
wallpaper=$*
break ;;
-B) option=bsetroot
shift
wallpaper=$*
remember=false
2003-12-29 00:00:28 +00:00
break ;;
-r) option=random
wallpaper=$2 # in this case it's a dir
break ;;
-R) option=random
wallpaper=$2 # in this case it's a dir
remember=false
break ;;
2003-10-08 14:00:47 +00:00
-l)
if [ -r "$lastwallpaper" ]; then
option=`grep "|${DISPLAY}$" $lastwallpaper|cut -d'|' -f1`
wallpaper=`grep "|${DISPLAY}$" $lastwallpaper|cut -d'|' -f2`
if [ -z "$wallpaper" ]; then
message "No previous wallpaper recorded for display ${DISPLAY}"
exit 1
fi
2004-03-11 00:08:34 +00:00
else
message "No previous wallpaper recorded for display ${DISPLAY}"
exit 1
2003-10-08 14:00:47 +00:00
fi
remember=false
2003-12-29 00:00:28 +00:00
break ;;
2003-10-08 14:00:47 +00:00
-p) display_tips ; exit 0 ;;
-h) display_help ; exit 0 ;;
--)
2003-12-08 19:31:40 +00:00
message "$command doesn't recognize -- gnu-longopts."
message 'Use $command -h for a help message.'
2003-10-08 14:00:47 +00:00
display_usage
exit 1 ;;
-*)
2003-12-08 19:31:40 +00:00
message "unrecognized option "\`"$1'"
2003-10-08 14:00:47 +00:00
display_usage
2003-12-29 00:00:28 +00:00
exit 1 ;;
2003-10-08 14:00:47 +00:00
*)
2003-12-29 00:00:28 +00:00
if [ "$option" = random ]; then
option='$aspect'
elif [ ! -r "$1" ]; then
2003-12-08 19:31:40 +00:00
message "$1 isn't an existing wallpaper or a valid option."
2003-10-08 14:00:47 +00:00
display_usage
exit 1
elif [ -z "$1" ]; then
2003-12-08 19:31:40 +00:00
message 'No wallpaper to set'
2003-10-08 14:00:47 +00:00
display_usage
exit 1
else
2003-10-16 15:54:20 +00:00
wallpaper=$1
2003-10-08 14:00:47 +00:00
break
2003-12-29 00:00:28 +00:00
fi ;;
2003-10-08 14:00:47 +00:00
esac
done
2003-09-18 12:15:17 +00:00
2003-10-16 15:54:20 +00:00
# Find the default wallpapersetter
2003-12-08 19:31:40 +00:00
if [ "$setterfromcommandline" != true ]; then
2004-01-22 05:48:41 +00:00
if [ -r "$lastwallpaper" ]; then
wpsetters="`awk '/wpsetters/ {print $2}' $lastwallpaper` $wpsetters"
fi
2003-12-08 19:31:40 +00:00
for wpsetter in $wpsetters; do
if find_it $wpsetter; then
2004-03-11 00:08:34 +00:00
if [ ! "$wpsetter" = Esetroot ]; then
WPSETTER=$wpsetter
break
elif ldd `which Esetroot`|grep libImlib 2>&1 > /dev/null; then
WPSETTER=$wpsetter
break
else
sad_esetroot_story="I also found Esetroot, but it doesn't have support for setting wallpapers. You need to install libimlib2 and rebuild Eterm to get it working."
fi
2003-12-08 19:31:40 +00:00
fi
done
fi
2003-10-16 15:54:20 +00:00
standardrant=\
"$WPSETTER sets the 'wrong' wallpaper. Transparency for fluxbox and
apps like aterm and xchat won't work right with it. Consider installing
2003-11-23 01:19:01 +00:00
feh, wmsetbg (from windowmaker) or Esetroot (from Eterm) and I'll use
2003-10-16 15:54:20 +00:00
them instead."
standardok=\
"$WPSETTER is a nice wallpapersetter. You won't have any problems."
2003-09-18 12:15:17 +00:00
2003-04-27 15:33:26 +00:00
case $WPSETTER in
2003-06-29 08:22:24 +00:00
chbg)
full='-once -mode maximize'
tile='-once -mode tile'
center='-once -mode center'
aspect='-once -mode smart -max_grow 100 -max_size 100'
2003-09-18 12:15:17 +00:00
debugstory="chbg supports all features but it doesn't report errors. I reported this bug to the chbg developers."
2003-07-02 05:42:47 +00:00
;;
2003-04-27 15:33:26 +00:00
xsri)
2003-08-26 20:32:27 +00:00
full='--center-x --center-y --scale-width=100 --scale-height=100'
2003-07-29 09:29:45 +00:00
tile='--tile'
2003-09-03 11:55:29 +00:00
center='--center-x --center-y --color=black'
aspect='--center-x --center-y --scale-width=100 --scale-height=100 --keep-aspect --color=black'
debugstory=$standardok
2003-04-27 15:33:26 +00:00
;;
2003-06-06 02:18:34 +00:00
display)
2003-10-16 15:54:20 +00:00
full="`xwininfo -root 2> /dev/null|grep geom` -window root"
2003-04-27 15:33:26 +00:00
tile='-window root'
center='-backdrop -window root'
2003-04-28 14:45:13 +00:00
aspect=$full
2003-04-29 11:26:34 +00:00
debugstory=$standardrant
2003-04-27 15:33:26 +00:00
;;
Esetroot)
full='-scale'
tile=''
center='-c'
2003-04-28 14:45:13 +00:00
aspect='-fit'
2003-08-04 16:49:25 +00:00
debugstory=$standardok
2003-04-27 15:33:26 +00:00
;;
wmsetbg)
full='-s -S'
tile='-t'
center='-b black -e'
2003-04-28 14:45:13 +00:00
aspect='-b black -a'
2003-08-04 16:49:25 +00:00
debugstory=$standardok
2003-04-27 15:33:26 +00:00
;;
xsetbg)
2003-07-29 09:29:45 +00:00
tile='-border black'
center='-center -border black'
2003-04-28 14:45:13 +00:00
aspect='-fullscreen -border black'
2003-07-29 09:29:45 +00:00
full=$aspect #broken
2003-04-29 11:26:34 +00:00
debugstory="xsetbg is actually xli. The fillscreen option (-f) is broken, defaults to (-a). $standardrant"
2003-07-29 09:29:45 +00:00
;;
2003-04-27 15:33:26 +00:00
xli)
2003-07-29 09:29:45 +00:00
tile='-onroot -quiet -border black'
center='-center -onroot -quiet -border black'
2003-04-28 14:45:13 +00:00
aspect='-fullscreen -onroot -quiet -border black'
2003-07-29 09:29:45 +00:00
full=$aspect #broken
2003-09-18 12:15:17 +00:00
debugstory="The fillscreen option (-f) is broken, defaults to (-a). $standardrant"
2003-04-27 15:33:26 +00:00
;;
qiv)
full='--root_s'
tile='--root_t'
center='--root'
2003-04-28 14:45:13 +00:00
aspect='-m --root'
2003-04-29 11:26:34 +00:00
debugstory=$standardrant
2003-04-27 15:33:26 +00:00
;;
xv)
full='-max -smooth -root -quit'
tile='-root -quit'
center='-rmode 5 -root -quit'
2003-04-28 14:45:13 +00:00
aspect='-maxpect -smooth -root -quit'
2003-04-29 11:26:34 +00:00
debugstory=$standardrant
2003-04-27 15:33:26 +00:00
;;
2003-09-18 12:15:17 +00:00
feh)
full='--bg-scale'
tile='--bg-tile'
center='--bg-center'
aspect=$full
debugstory=$standardok
;;
2003-06-06 02:18:34 +00:00
icewmbg)
tile='-s'
full=$tile
center=$tile
aspect=$tile
debugstory="icewmbg does support transparency, but only tiling. And I noticed odd
errormessages with aterm. Don't use it unless you have to."
;;
2003-04-27 15:33:26 +00:00
'')
2003-08-04 16:49:25 +00:00
message \
"I can't find an app to set the wallpaper with. You can install one in
2003-04-29 11:26:34 +00:00
many many ways but I will give you some simple advice: install Eterm and
you're set. Eterm provides Esetroot and thats a great wallpaper setter. I
recommend you install the package provided by your distro."
exit 1
;;
2003-04-27 15:33:26 +00:00
esac
2003-12-29 00:00:28 +00:00
if [ "$debug" = true ]; then
2003-09-18 12:15:17 +00:00
debugfbsetbg
exit 0
fi
2003-04-27 15:33:26 +00:00
2003-09-18 12:15:17 +00:00
option=${option:='$full'}
2003-04-27 15:33:26 +00:00
2003-12-12 13:07:47 +00:00
2003-04-27 15:33:26 +00:00
2003-12-29 00:00:28 +00:00
if [ -z "$DISPLAY" ]; then
2003-10-16 15:54:20 +00:00
message "You are not connected to an X session\nPerhaps you should set the DISPLAY environment variable?"
exit 1
fi
2003-12-29 00:00:28 +00:00
2003-12-12 13:07:47 +00:00
if [ "$option" = bsetroot ]; then
bsetroot $wallpaper
if [ ! "$remember" = false ]; then
remembercommand
fi
exit 0
fi
2003-12-29 00:00:28 +00:00
# random wallpaper code
if [ "$option" = random ]; then
# Lets make one thing clear...
wallpaperdir=$wallpaper
if [ -z "$wallpaperdir" ]; then
message "No random wallpaper directory specified."
exit 1
fi
if [ -d "$wallpaperdir" ]; then
number_of_wallpapers=`ls $wallpaperdir|wc -l`
2004-01-03 01:23:59 +00:00
if find_it random_number; then
randomnumber=$(random_number)
2003-12-29 00:00:28 +00:00
# some shells don't support $RANDOM
2004-01-03 01:23:59 +00:00
elif [ -z $RANDOM ]; then
2003-12-29 00:00:28 +00:00
randomnumber=`(echo $$ ;time ps; w ; date )2>&1 | cksum | cut -f1 -d' '`
else
randomnumber=$RANDOM
fi
wallpapernumber=`expr $randomnumber % $number_of_wallpapers + 1`
#remember previous wallpaper
if [ ! "$remember" = false ]; then
remembercommand
fi
remember=false
#set -x
wallpaper="$wallpaperdir/`ls $wallpaperdir|sed -n ${wallpapernumber}p`"
option='$aspect' # have to choose something...
else
message "Invalid random wallpaper directory specified."
exit 1
fi
fi
2003-12-12 13:07:47 +00:00
if [ ! -r "$wallpaper" ]; then
message "Can't find wallpaper $wallpaper"
exit 1
fi
2003-10-16 15:54:20 +00:00
2003-12-29 00:00:28 +00:00
2003-09-20 16:03:30 +00:00
$WPSETTER `eval echo $option` "$wallpaper"
2003-09-18 12:15:17 +00:00
if [ $? -ne 0 ]; then
message "Something went wrong while setting the wallpaper.
2003-10-16 15:54:20 +00:00
Run '$WPSETTER "`eval echo $option` $wallpaper"' from an xterm to find out what."
2003-09-18 12:15:17 +00:00
exit 1
fi
2003-12-29 00:00:28 +00:00
2003-04-27 15:33:26 +00:00
#remember previous wallpaper
2003-09-29 11:59:35 +00:00
if [ ! "$remember" = false ]; then
remembercommand
fi