#!/bin/sh # # Set wallpaper for fluxbox. # # Copyright (c) 2003 Han Boetes # # 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. # # $Id: fbsetbg,v 1.20 2003/09/29 11:59:35 fluxgen Exp $ # Portability notes: # To guarantee this script works on all platforms that support fluxbox # please keep the following restrictions in mind: # # - 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} # - don't use id -u, use whoami # - 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. # Non portable features like getopts in this script can be achieved in # other ways. # The wallpapersetter is selected in this order wpsetters='Esetroot wmsetbg feh chbg display qiv xv xsri xli xsetbg' # broken icewmbg' lastwallpaper=${HOME}/.fluxbox/lastwallpaper WHOAMI=`whoami` [ "$WHOAMI" = root ] && PATH=/bin:/usr/bin/:/usr/local/bin:/usr/X11R6/bin # Functions display_usage() { cat << EOF Usage: fbsetbg [ -fFcCtTaA /path/to/wallpaper ] [ -l ] [ -h ] [ -d ] [ -p ] EOF } display_help() { display_usage cat << EOF Options: -f Set fullscreen wallpaper -c Set centered wallpaper -t Set tiled wallpaper -a Set maximized wallpaper, preserving aspect. ( if your bgsetter doesn't support this fbsetbg falls back to -f ) -F,-C,-T,-A same as uncapsed but without remembering. -h Display this help -l Set previous wallpaper -d Debug fbsetbg -p Tips Files: ~/.fluxbox/lastwallpaper In this file the wallpaper you set will be stored, for the -l option: EOF } display_tips() { cat << EOF 1) To replace all occurrences of bsetbg with fbsetbg in a file use this command: perl -pi -e 's,([^f]|^)bsetbg,fbsetbg,' filename 2) If you want the style to set the wallpaper and you want fbsetbg to remember the previous wallpaper put this in your ~/.fluxbox/init session.screen0.rootCommand: fbsetbg -l 3) Use fbsetbg -d to find out what wallpapersetter fbsetbg will use and what he thinks about it. EOF } # ugly code for solaris compat. 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 message() { xmessage -center "$@" } remembercommand() { grep -vs "|${DISPLAY}$" ${lastwallpaper} > ${lastwallpaper}.tmp mv -f ${lastwallpaper}.tmp ${lastwallpaper} # Make dir/../../path/file.jpg work case $wallpaper in # no spaces allowed between the varname and '|' /*) echo $option'|'$wallpaper'|'$DISPLAY >> $lastwallpaper ;; *) echo $option'|'$PWD/$wallpaper'|'$DISPLAY >> $lastwallpaper ;; esac } debugfbsetbg() { echo echo $debugstory echo exit 0 } # Find the default wallpapersetter for wpsetter in $wpsetters; do if find_it $wpsetter; then WPSETTER=$wpsetter break fi done standardrant=\ "$WPSETTER sets the 'wrong' wallpaper. Transparency for fluxbox and apps like aterm and xchat won't work right with it. Consider using chbg, wmsetbg (from windowmaker) or Esetroot (from Eterm)" standardok=\ "$WPSETTER is a nice wallpapersetter. You won't have any problems." unset debug #Get options. getopts ":a:f:c:t:A:F:C:T:pdlh-" COMMAND_LINE_ARGUMENT case "${COMMAND_LINE_ARGUMENT}" in d) debug=true ;; a) option='$aspect' wallpaper=$OPTARG ;; f) option='$full' wallpaper=$OPTARG ;; c) option='$center' wallpaper=$OPTARG ;; t) option='$tile' wallpaper=$OPTARG ;; A) option='$aspect' wallpaper=$OPTARG remember=false ;; F) option='$full' wallpaper=$OPTARG remember=false ;; C) option='$center' wallpaper=$OPTARG remember=false ;; T) option='$tile' wallpaper=$OPTARG remember=false ;; l) if [ -r $lastwallpaper ]; then option=`grep "|${DISPLAY}$" $lastwallpaper|cut -d'|' -f1` wallpaper=`grep "|${DISPLAY}$" $lastwallpaper|cut -d'|' -f2` else message "No previous wallpaper recorded for display ${DISPLAY}" exit 1 fi remember=false ;; h) display_help ; exit 0 ;; p) display_tips ; exit 0 ;; -) echo "fbsetbg doesn't recognize -- gnu-longopts." echo 'Use fbsetbg -h for a help message.' display_usage exit 1 ;; *) if [ ! -r "$1" ]; then echo "$1 isn't an existing wallpaper or a valid option." >&2 display_usage exit 1 fi if [ -z "$1" ]; then message 'No wallpaper to set' >&2 display_usage exit 1 fi ;; esac case $WPSETTER in chbg) full='-once -mode maximize' tile='-once -mode tile' center='-once -mode center' aspect='-once -mode smart -max_grow 100 -max_size 100' debugstory="chbg supports all features but it doesn't report errors. I reported this bug to the chbg developers." ;; xsri) full='--center-x --center-y --scale-width=100 --scale-height=100' tile='--tile' center='--center-x --center-y --color=black' aspect='--center-x --center-y --scale-width=100 --scale-height=100 --keep-aspect --color=black' debugstory=$standardok ;; display) full="`xwininfo -root|grep geom` -window root" tile='-window root' center='-backdrop -window root' aspect=$full debugstory=$standardrant ;; Esetroot) full='-scale' tile='' center='-c' aspect='-fit' debugstory=$standardok ;; wmsetbg) full='-s -S' tile='-t' center='-b black -e' aspect='-b black -a' debugstory=$standardok ;; xsetbg) tile='-border black' center='-center -border black' aspect='-fullscreen -border black' full=$aspect #broken debugstory="xsetbg is actually xli. The fillscreen option (-f) is broken, defaults to (-a). $standardrant" ;; xli) tile='-onroot -quiet -border black' center='-center -onroot -quiet -border black' aspect='-fullscreen -onroot -quiet -border black' full=$aspect #broken debugstory="The fillscreen option (-f) is broken, defaults to (-a). $standardrant" ;; qiv) full='--root_s' tile='--root_t' center='--root' aspect='-m --root' debugstory=$standardrant ;; xv) full='-max -smooth -root -quit' tile='-root -quit' center='-rmode 5 -root -quit' aspect='-maxpect -smooth -root -quit' debugstory=$standardrant ;; feh) full='--bg-scale' tile='--bg-tile' center='--bg-center' aspect=$full debugstory=$standardok ;; 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." ;; '') message \ "I can't find an app to set the wallpaper with. You can install one in 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 ;; esac if [ "$debug" = true ];then debugfbsetbg exit 0 fi option=${option:='$full'} wallpaper=${wallpaper:=$1} if [ ! -r "$wallpaper" ]; then message "Can't find wallpaper $wallpaper" exit 1 fi $WPSETTER `eval echo $option` "$wallpaper" if [ $? -ne 0 ]; then message "Something went wrong while setting the wallpaper. Run '$WPSETTER $option "$wallpaper"' from an xterm to find out what." exit 1 fi #remember previous wallpaper if [ ! "$remember" = false ]; then remembercommand fi