fluxbox/util/bsetbg
2003-04-28 14:45:13 +00:00

839 lines
18 KiB
Bash
Executable file

#!/bin/sh
# Copyright (c) 2000 LordZork Industries (lordzork@lordzork.com)
#
# 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: bsetbg,v 1.5 2003/04/28 14:44:04 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 [ -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.
#
error_msg() {
case $INFO in
yes|y|1)
info_msg
;;
esac
case $1 in
1)
cat << EOF >&2
$NAME: configuration error: $OPTION="$VALUE"
$NAME: please edit $CONFIG and provide the correct variable.
EOF
;;
2)
cat << EOF >&2
$NAME: error: couldn't execute '$APP'! tried to run fallback option $ARGUMENT
$NAME: but quit because of the following error in $CONFIG:
$NAME: $OPTION=$VALUE
$NAME: please edit $CONFIG and provide the correct variable!
EOF
;;
3)
cat << EOF >&2
$NAME: error: couldn't find any suitable image applications in the system path!
EOF
error_msg url
;;
4)
cat << EOF >&2
$NAME: error: invalid option, or non-existent image ($ARGUMENT).
EOF
;;
5)
cat << EOF >&2
$NAME: error: the image you specified ($IMAGE) could not be found."
EOF
;;
6)
cat << EOF >&2
$NAME: error: please specify a valid image.
EOF
;;
7)
cat << EOF >&2
$NAME: error: bsetroot couldn't be found! check your fluxbox installation.
EOF
;;
8)
cat << EOF >&2
$NAME: error: wrong number of arguments!
$NAME: make sure you enclosed the options for '$APP' in double quotes.
EOF
;;
nobgapp)
cat << EOF >&2
$NAME: error: tried to run '$VALUE' for $ARGUMENT argument,
$NAME: but couldnt find '$APP' in the path! please fix the following
$NAME: line in $CONFIG to point to an existing application:
$NAME: $OPTION=\$VALUE\
EOF
;;
nogrep)
cat << EOF >&2
$NAME: error: couldn't find grep!
This script needs grep to be in your path in order to function.
You can get GNU grep from ftp://ftp.gnu.org/bin/gnu/grep/
EOF
;;
url)
cat << EOF >&2
It is suggested that you use qiv, xli (xsetbg), or xv.
You can obtain them at the following locations:
qiv: http://www.klografx.de/software/qiv.shtml
xli: http://pantransit.reptiles.org/prog/#xli
xv: http://www.trilon.com/xv/downloads.html
The above URLs are current as of 05/23/2000.
EOF
;;
esac
exit 1
}
help_msg() {
cat << EOF
$NAME $VERSION: $MORE
options:
(none) image is set using default values
-full, -f image is set fullscreen
-tile, -t image is set tiled
-center, -c image is set centered
-last, -l last used image is set
-app, -a <application> image is set using <application> with
<'application options'> single-quote-enclosed options and
-center, -c|-tile, -t|-full, -f default fallback option
-display <string> display to connect to (bsetroot only)
-mod <x> <y> sets bsetroot modula pattern
-foreground, -fg <color> modula foreground color
-background, -bg <color> modula background color
-gradient <texture> sets bsetroot gradient texture
-from <color> gradient start color
-to <color> gradient end color
-solid <color> sets bsetroot solid color
-version, -v outputs $NAME's version number
-info, -i outputs configuration info
-help, -h this message
usage: <options...> <image>
EOF
exit 0
}
info_msg() {
case $ERROR in
[1-3])
SUMMARY="error: some variables are blank"
;;
4)
SUMMARY="no values have been specified"
;;
0)
SUMMARY="looks good"
;;
esac
case $APP_ERROR in
[1-4])
SUMMARY="error: some applications couldn't be found!"
;;
esac
case `which bsetroot 2>&1` in
*/*bsetroot)
BSETROOT=`which bsetroot`
;;
*)
BSETROOT="(error: not found)"
case $ERROR in
1-4)
SUMMARY="$SUMMARY, and bsetroot does not seem to be present."
;;
*)
SUMMARY="$SUMMARY, but bsetroot does not seem to be present."
;;
esac
;;
esac
cat << EOF
$NAME $VERSION configuration:
bsetroot: $BSETROOT
reading configuration from: $CONFIG
configuration values:
EOF
case $FULL_BGAPP_MSG in
*'not found')
echo " fullscreen (ERROR): $FULL_BGAPP_MSG"
;;
*)
echo " fullscreen (FULL): $FULL_MSG"
;;
esac
echo
case $TILE_BGAPP_MSG in
*'not found')
echo " tiled (ERROR): $TILE_BGAPP_MSG"
;;
*)
echo " tiled (TILE): $TILE_MSG"
;;
esac
echo
case $CENTER_BGAPP_MSG in
*'not found')
echo " centered (ERROR): $CENTER_BGAPP_MSG"
;;
*)
echo " centered (CENTER): $CENTER_MSG"
;;
esac
echo
case $DEFAULT_BGAPP_MSG in
*'not found')
echo " default (ERROR): $DEFAULT_BGAPP_MSG"
;;
*)
echo " default (DEFAULT): $DEFAULT_MSG"
;;
esac
echo
echo " summary: $SUMMARY"
exit 0
}
find_app() {
APP_PATH=`which $1 2>&1`
case $APP_PATH in
*/*$1)
echo "$NAME: checking for $1... $APP_PATH"
cat << EOF >> $TMPFILE
### $app
# FULL="$full"
# TILE="$tile"
# CENTER="$center"
# DEFAULT="$default"
EOF
FULL=$full
TILE=$tile
CENTER=$center
DEFAULT=$default
APP=$app
;;
*)
echo "$NAME: checking for $1... not found."
;;
esac
}
search_xsri() {
full='xsri --scale-width=100 --scale-width=100'
tile='xsri --tile'
center='xsri --center-x --center-y'
default=$center
find_app xsri
}
search_display() {
full='display -geometry 800x600 -window root'
tile='display -window root'
center='display -backdrop -window root'
default=$center
find_app display
}
search_Esetroot() {
full='Esetroot -scale'
tile='Esetroot'
center='Esetroot -c'
default=$center
find_app Esetroot
}
search_wmsetbg() {
full='wmsetbg -s -S'
tile='wmsetbg -t'
center='wmsetbg -e'
default=$center
find_app wmsetbg
}
search_xli() {
case `which xsetbg 2>&1` in
*/*xsetbg)
full='xsetbg -fillscreen'
tile='xsetbg'
center='xsetbg -center'
default=$center
app='xsetbg (xli)'
find_app xsetbg
;;
*)
case `which xli 2>&1` in
*/*xli)
full='xli -fillscreen -onroot -quiet'
tile='xli -onroot -quiet'
center='xli -center -onroot quiet'
default=$center
app=xli
find_app xli
;;
esac
;;
esac
}
search_qiv() {
full='qiv --root_s'
tile='qiv --root_t'
center='qiv --root'
default=$center
find_app qiv
}
search_xv() {
full='xv -max -smooth -root -quit'
tile='xv -root -quit'
center='xv -rmode 5 -root -quit'
default=$center
find_app xv
}
rm_tmpfiles() {
[ -f $TMPFILE ] && rm -f $TMPFILE
}
create_config() {
trap rm_tmpfiles INT QUIT STOP TERM
case `whoami` in root)
if [ ! "$ARGUMENT" = "-r" ]; then
cat << EOF >&2
$NAME: Running X as root is a security hazard, and is NOT a good idea!
$NAME: If you insist upon having a ~/.fluxbox/bsetbg for root, run bsetbg with
$NAME: the '-r' flag to force its creation. You have been warned!
$NAME: And you will be warned again and again and again. Don't you get it yet?
$NAME: DON'T DO IT!!!
EOF
exit 1
fi
;;
esac
case $ARGUMENT in
-r)
echo "$NAME: creating configuration for root (BAD IDEA)..."
;;
*)
echo "$NAME: $CONFIG not found, creating..."
;;
esac
rm_tmpfiles
for app in $IMAGE_APPS; do
search_$app
done
if [ -z "$FULL" -o -z "$TILE" -o -z "$CENTER" ]; then
rm -f $TMPFILE
unset INFO
error_msg 3
fi
if [ ! -d ${HOME}/.fluxbox ]; then
mkdir ${HOME}/.fluxbox
fi
cat << EOF > ${CONFIG}
# $CONFIG
#
# Automagically generated with loving care by $NAME $VERSION on `date`
#
# Uncomment the set below that corresponds to your favorite root-image
# application, or mix and match to suit your pleasure.
#
# xli misbehaves under larger screen resolutions when using the -fullscreen
# option. use -fullscreen if your resolution is higher than 1024x768.
#
### $APP
FULL="$FULL"
TILE="$TILE"
CENTER="$CENTER"
DEFAULT="$DEFAULT"
EOF
grep -v ${APP} ${TMPFILE} >> ${CONFIG}
rm -f $TMPFILE
if [ -f $CONFIG ]; then
echo "$NAME: default configuration was created in $CONFIG."
else
echo "ERROR: $CONFIG not found!"
exit 1
fi
}
check_config_apps() {
BGAPP=$1
APP_PATH=`which $BGAPP 2>&1`
case ${APP_PATH} in
*/*$BGAPP)
BGAPP_MSG="$APP_PATH"
;;
*)
BGAPP_MSG="$BGAPP: not found"
APP_ERROR=`expr $APP_ERROR + 1`
;;
esac
}
check_config_vars() {
ERROR=0
APP_ERROR=0
case $FB_ARG in
$FULL)
if [ -z "$FULL" ]; then
FULL_MSG="(no value)"
ERROR=`expr $ERROR + 1`
else
check_config_apps $FULL
FULL_BGAPP_MSG=$BGAPP_MSG
FULL_BGAPP=$BGAPP
FULL_MSG="$FULL"
fi
;;
$TILE)
if [ -z "$TILE" ]; then
TILE_MSG="(no value)"
ERROR=`expr $ERROR + 1`
else
check_config_apps $TILE
TILE_BGAPP_MSG=$BGAPP_MSG
TILE_BGAPP=$BGAPP
TILE_MSG="$TILE"
fi
;;
$CENTER)
if [ -z "$CENTER" ]; then
CENTER_MSG="(no value)"
ERROR=`expr $ERROR + 1`
else
check_config_apps $CENTER
CENTER_BGAPP_MSG=$BGAPP_MSG
CENTER_BGAPP=$BGAPP
CENTER_MSG="$CENTER"
fi
;;
*)
if [ -z "$DEFAULT" ]; then
DEFAULT_MSG="(no value)"
ERROR=`expr $ERROR + 1`
else
check_config_apps $DEFAULT
DEFAULT_BGAPP_MSG=$BGAPP_MSG
DEFAULT_BGAPP=$BGAPP
DEFAULT_MSG="$DEFAULT"
fi
;;
esac
}
final_error_check() {
case $ARGUMENT in
*full|-f|c)
OPTION=FULL
VALUE=$FULL_MSG
FB_ARG=$FULL
case $FULL_BGAPP_MSG in
*'not found')
APP=$FULL_BGAPP
error_msg nobgapp
;;
esac
;;
*tile|-t|t)
OPTION=TILE
VALUE=$TILE_MSG
FB_ARG=$TILE
case $TILE_BGAPP_MSG in
*'not found')
APP=$TILE_BGAPP
error_msg nobgapp
;;
esac
;;
*center|-c|c)
OPTION=CENTER
VALUE=$CENTER_MSG
FB_ARG=$CENTER
case $CENTER_BGAPP_MSG in
*'not found')
APP=$CENTER_BGAPP
error_msg nobgapp
;;
esac
;;
*last|-l|l)
OPTION=DEFAULT
VALUE=$DEFAULT_MSG
FB_ARG=$DEFAULT
ARGUMENT=default
case $DEFAULT_BGAPP_MSG in
*'not found')
APP=$DEFAULT_BGAPP
error_msg nobgapp
;;
esac
;;
*)
OPTION=DEFAULT
VALUE=$DEFAULT_MSG
FB_ARG=$DEFAULT
ARGUMENT=default
case $DEFAULT_BGAPP_MSG in
*'not found')
APP=$DEFAULT_BGAPP
error_msg nobgapp
;;
esac
if [ ! "$IMAGE_EXISTS" = yes ]; then
error_msg 4; fi
;;
esac
case $VALUE in
'(no value)')
if [ -n "$APP" ]; then
error_msg 2
else
error_msg 1
fi
;;
esac
}
check_config() {
if [ ! -f $CONFIG ]; then
create_config
fi
. $CONFIG
check_old_config
final_error_check
check_config_vars
}
check_image() {
case "$IMAGE" in
*~/*)
IMAGE="$HOME/`basename $IMAGE`"
;;
esac
case $NOARG in
yes|y|1)
NUM=4
;;
*)
if [ -n "$IMAGE" ]; then
NUM=5
else
NUM=6
fi
case $IMAGE in
$ARGUMENT|'.'|'./')
error_msg 6
;;
esac
esac
if [ ! -r "$IMAGE" ]; then
error_msg $NUM
else
IMAGE_EXISTS=yes
fi
}
exec_app() {
case `which $APP 2>&1` in
*/*$APP)
check_image
final_error_check
exec $APP $ARGS "$IMAGE"
;;
*)
check_image
check_config
exec $FB_ARG "$IMAGE"
;;
esac
}
check_bsetroot_args() {
case $1 in
-mod)
ARGS="$1 $2 $3 $4 $5 $6 $7"
;;
-gradient)
ARGS="$1 $2 $3 $4 $5 $6"
;;
-solid)
ARGS="$1 $2"
;;
esac
}
exec_bsetroot() {
case `which bsetroot 2>&1` in
*/*bsetroot)
exec bsetroot $ARGS
;;
*)
error_msg 7
;;
esac
}
check_old_config() {
if [ -f $CONFIG ]; then
if [ -n "$BGAPP" -o -n "$CENTER_ARGS" -o \
-n "$TILED_ARGS" -o -n "$OTHER_ARGS" -o \
-n "$DEFAULT_ARGS" ]; then
cat << EOF >&2
This version of $NAME ($VERSION) no longer uses the old configuration format."
Please update $CONFIG with the new syntax:"
CENTER="value"
FULL="value"
TILE="value"
DEFAULT="value"
Look at the sample.config file for details.
EOF
exit 1
fi
fi
}
debug() {
cat << EOF
DEBUG:--------------------------
config: $CONFIG
full: $FULL
tile: $TILE
center: $CENTER
default: $DEFAULT
error: $ERROR
app error: $APP_ERROR
argument: $ARGUMENT
________________________________
EOF
}
IMAGE_APPS="display Esetroot wmsetbg xv xli qiv xsri"
CONFIG="$HOME/.fluxbox/bsetbg"
LASTIMAGEFILE="$HOME/.fluxbox/bsetbg.lastimage"
NAME=`basename $0`
VERSION=1.13
MORE='(C) 2000 by lordzork industries (http://lordzork.com/)'
PATH=$PATH:/usr/bin:/usr/local/bin:/usr/X11R6/bin:/usr/X11/bin
TMPFILE=$CONFIG.tmp
ARGUMENT=$1
which grep > /dev/null 2> /dev/null || error_msg nogrep
case $1 in
*-full|-f|f)
check_config
IMAGE=$2
check_image
echo -e "full\n$IMAGE" > $LASTIMAGEFILE
exec $FULL "$IMAGE"
;;
*-tile|*tiled|-t|t)
check_config
IMAGE=$2
check_image
echo -e "tile\n$IMAGE" > $LASTIMAGEFILE
exec $TILE "$IMAGE"
;;
*-center|-c|c)
check_config
IMAGE=$2
check_image
echo -e "center\n$IMAGE" > $LASTIMAGEFILE
exec $CENTER "$IMAGE"
;;
*-last|-l|l)
check_config
LASTACTION="`head -n 1 $LASTIMAGEFILE 2> /dev/null`"
IMAGE="`tail -n 1 $LASTIMAGEFILE 2> /dev/null`" && check_image
ACTION=$DEFAULT
case "$LASTACTION" in
full) ACTION=$FULL ;;
tile) ACTION=$TILE ;;
center) ACTION=$CENTER ;;
*) echo "Error: $LASTIMAGEFILE is kaputt" >&2
exit 1
;;
esac
exec $ACTION "$IMAGE"
;;
*-app|-a|a)
APP=$2
ARGS="$3"
case $# in
4)
ARGUMENT=$3
IMAGE=$4
exec_app
;;
5)
COMMAND=`shift && echo $*`
ARGUMENT=$4
IMAGE=$5
exec_app
;;
*)
error_msg 8
;;
esac
;;
-mod|-gradient|-solid)
check_bsetroot_args $*
exec_bsetroot
;;
-display)
shift 1 && check_bsetroot_args $*
ARGS="-display $ARGS"
exec_bsetroot
;;
*-info|-i|i)
INFO=yes
check_config
info_msg
;;
*-version|-v|v)
cat << EOF
$NAME version $VERSION
$MORE
EOF
;;
*-help|-h|h)
help_msg
;;
-r)
case `whoami` in
root)
if [ -f $CONFIG ]; then
echo 'Error: Config already exists' >&2
exit 1
else
create_config
fi
;;
*)
echo 'Error: -r is for creating a config for root and your are not root' >&2
exit 1
esac
;;
*)
if [ -n "$1" ]; then
NOARG=yes
IMAGE=$1
check_image
check_config && final_error_check
echo -e "default\n$IMAGE" > $LASTIMAGEFILE
exec $DEFAULT "$1"
else
if [ ! -f $CONFIG ]; then
create_config
fi
help_msg
fi
;;
esac