3 # Copyright (c) 2000-2002 Timothy M. King (tmk@lordzork.com)
5 # Permission is hereby granted, free of charge, to any person obtaining a
6 # copy of this software and associated documentation files (the "Software"),
7 # to deal in the Software without restriction, including without limitation
8 # the rights to use, copy, modify, merge, publish, distribute, sublicense,
9 # and/or sell copies of the Software, and to permit persons to whom the
10 # Software is furnished to do so, subject to the following conditions:
12 # The above copyright notice and this permission notice shall be included in
13 # all copies or substantial portions of the Software.
15 # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
18 # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20 # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
21 # DEALINGS IN THE SOFTWARE.
23 PATH=$PATH:/usr/bin:/usr/local/bin:/usr/X11R6/bin
25 img_apps="display xli xsetbg Esetroot qiv wmsetbg xv"
27 display_full_cmd="display -geometry 800x600 -window root"
28 display_tile_cmd="display -window root"
29 display_center_cmd="display -backdrop -window root"
30 display_default_cmd="$display_center_cmd"
32 Esetroot_full_cmd="Esetroot -scale"
33 Esetroot_tile_cmd="Esetroot"
34 Esetroot_center_cmd="Esetroot -c"
35 Esetroot_default_cmd="$Esetroot_center_cmd"
37 wmsetbg_full_cmd="wmsetbg -s -S"
38 wmsetbg_tile_cmd="wmsetbg -t"
39 wmsetbg_center_cmd="wmsetbg -e"
40 wmsetbg_default_cmd="$wmsetbg_center_cmd"
42 qiv_full_cmd="qiv --root_s"
43 qiv_tile_cmd="qiv --root_t"
44 qiv_center_cmd="qiv --root"
45 qiv_default_cmd="$qiv_center_cmd"
47 xv_full_cmd="xv -max -smooth -root -quit"
48 xv_tile_cmd="xv -root -quit"
49 xv_center_cmd="xv -rmode 5 -root -quit"
50 xv_default_cmd="$xv_center_cmd"
52 xli_full_cmd="xli -fullscreen -onroot -quiet"
53 xli_tile_cmd="xli -onroot -quiet"
54 xli_center_cmd="xli -center -onroot quiet"
55 xli_default_cmd="$xli_center_cmd"
57 xsetbg_full_cmd="xsetbg -fullscreen"
58 xsetbg_tile_cmd="xsetbg"
59 xsetbg_center_cmd="xsetbg -center"
60 xsetbg_default_cmd="$xsetbg_center_cmd"
62 ##################################
66 copyright="(c) 2000-$(date +%Y) by Timothy M. King (http://lordzork.com/)"
67 config=$HOME/.bsetbgrc
68 last_cmd_file=$HOME/.bsetbg_last_cmd
75 [ "$1" ] && rc=$1 && shift 1
76 [ "$*" ] && echo -e $*
82 [yY][eE][sS]|1|[yY]|[tT][rR][uU][eE]|[oO][nN]) : ;;
91 elif [ -x "$(which $1 2>/dev/null)" ]; then
93 elif [ -x "$(type $1 2>/dev/null)" ]; then
103 $me $version $copyright
105 -center <file> center an image on the desktop
106 -tile <file> tile an image on the desktop
107 -full <file> stretch an image to fill the desktop
108 -exec <args> <file> specify an external command to execute
110 -app <app> specify the image application to use
111 -post <string> arguments to be passed to the post-command
112 -debug prints commands without executing them
114 -display <string> use display connection
115 -mod <x> <y> modula pattern
116 -foreground, -fg <color> modula foreground color
117 -background, -bg <color> modula background color
119 -gradient <texture> gradient texture
120 -from <color> gradient start color
121 -to <color> gradient end color
123 -solid <color> solid color
125 -generate <string> generate a config file
127 -version output version information
134 for a in $img_apps; do
135 if check_exe_in_path $a; then
136 eval center_cmd=\$$a\_center_cmd
137 eval full_cmd=\$$a\_full_cmd
138 eval tile_cmd=\$$a\_tile_cmd
139 eval default_cmd=\$$a\_default_cmd
142 if [ "$not_found" ]; then
143 not_found="$not_found $a"
154 echo -e "# created by $me $version on $(date)\n#"
155 echo -e "# seting NO_EXEC to a boolean value (eg true/false) will cause $me"
156 echo -e "# to never modify the root window\n#"
157 echo -e "#NO_EXEC=\n#"
158 echo -e "# POST_COMMAND can be set to a command that will be run run every time"
159 echo -e "# $me sets the root image\n#"
160 echo -e "#POST_COMMAND=\n#"
161 echo -e "# if LOG_LAST_CMD is set (boolean), bsetbg will keep a log of the last"
162 echo -e "# two successful commands.\n#"
163 echo -e "#LOG_LAST_CMD=\n#"
164 echo -e "# the LOGFILE specifies the file that bsetbg uses when LOG_LAST_CMD"
165 echo -e "# is defined. this defaults to ~/.bsetbg_last_cmd .\n#"
166 echo -e "#LOGFILE=\n#"
167 echo -e "# the following are default configuration values for the most popular image"
168 echo -e "# programs. See the man page of the respective application for more info.\n"
170 [ "$*" ] && img_apps="$*"
172 for a in $img_apps; do
173 if check_exe_in_path $a; then
174 if ! bool $have_match; then
176 [ "$(eval echo \$$a\_center_cmd)" ] &&
177 eval echo CENTER=$q\$$a\_center_cmd$q &&
179 [ "$(eval echo \$$a\_full_cmd)" ] &&
180 eval echo FULL=$q\$$a\_full_cmd$q &&
182 [ "$(eval echo \$$a\_tile_cmd)" ] &&
183 eval echo TILE=$q\$$a\_tile_cmd$q &&
185 [ "$(eval echo \$$a\_default_cmd)" ] &&
186 eval echo -e DEFAULT=$q\$$a\_default_cmd$q \\\\n &&
190 [ "$(eval echo \$$a\_center_cmd)" ] &&
191 eval echo \\#CENTER=$q\$$a\_center_cmd$q
193 [ "$(eval echo \$$a\_full_cmd)" ] &&
194 eval echo \\#FULL=$q\$$a\_full_cmd$q
196 [ "$(eval echo \$$a\_tile_cmd)" ] &&
197 eval echo \\#TILE=$q\$$a\_tile_cmd$q
199 [ "$(eval echo \$$a\_default_cmd)" ] &&
200 eval echo -e \\#DEFAULT=$q\$$a\_default_cmd$q \\\\n
209 if check_exe_in_path bsetroot; then
212 $debug bsetroot $* 2>/dev/null; rc=$?
214 if [ "$rc" -gt 0 ]; then
217 log_cmd bsetroot $*; $refresh_cmd 2>/dev/null
220 quit 1 "couldn't find bsetroot in $PATH"
226 [ -z "$1" ] && help_msg 1
228 bool $noconfig || read_config
231 check_img_command $do_this
238 if [ -f "$file" ]; then
239 exec_img_command $do_this $file
241 quit 1 "$file does not exist"
247 [ "$#" -lt 3 ] && help_msg 3
249 bool $noconfig || read_config
251 # check to see if -*c, -*f, or -*t were spcified, if so
252 # assume the last argument is a filename
253 b_arg=$(eval echo \$$(( $# - 1 )) )
257 -c|*-center|c|-t|*-tile*|t|-f|*-full|f)
259 f_args="$b_arg $file"
262 # put the rest of the arguments into the varialbe $e_args
267 *) e_args="$e_args "$1""
273 # with $f_args defined, check for image and do things normally
274 if [ "$f_args" ]; then
275 [ ! -f "$file" ] && quit 1 "$file does not exist"
277 if check_img_command $e_args; then
281 get_img_command $f_args
282 check_img_command $do_this
283 echo "$p couldn't find '$app' in path, using $type command instead"
285 # without $f_args, run the command blindly if it's in $PATH
286 elif check_exe_in_path $e_args; then
289 quit 1 "$p unable to run the following command: $e_args"
292 exec_img_command $do_this $file
298 *-full|-f|f) type=full; do_this="$full_cmd" ;;
299 *-tile|-t|t) type=tile; do_this="$tile_cmd" ;;
300 *-center|-c|c) type=center; do_this="$center_cmd" ;;
301 *) type=default; do_this="$default_cmd"
307 if check_exe_in_path $1; then
314 quit 1 "$p couldn't find a suitable image program. tried the following:\\n
315 $(for a in $not_found; do echo " $a\\n"; done)"
318 if [ "$rc" -gt 0 -a -z "$e_args" ] && bool $read_config; then
319 echo "$p couldn't find a suitable $type command in $config"
330 if [ "$debug" ]; then
333 $command >/dev/null 2>&1; rc=$?
336 if [ "$rc" -gt 0 ]; then
337 echo "$p '$command' exited with status $rc"
340 parse_args ${f_args:-$my_args}
341 echo "$p using '$command' as $type"
342 $debug $command >/dev/null 2>&1; rc=$?
343 [ "$rc" = 0 ] && log_cmd $do_this $file && $refresh_cmd 2>/dev/null
345 log_cmd $do_this $file; xrefresh 2>/dev/null
352 bool $LOG_LAST_CMD || return 1
353 [ "$debug" ] && return 1
354 echo -e "$prev_cmd\n$*" >$last_cmd_file
360 [ -f $config ] || return 1
362 if bool $read_config; then
368 . $HOME/.bsetbgrc 2>/dev/null
375 last_cmd_file=${LOGFILE:-$last_cmd_file}
377 bool $LOG_LAST_CMD && prev_cmd=$(tail -n 1 $last_cmd_file 2>/dev/null)
383 quit 0 "$p no_exec mode. the root window will not be modified."
388 bool $noconfig || read_config
390 if [ -n "$POST_COMMAND" -a "$1" = 0 ]; then
391 if [ -n "$debug" ]; then
392 $debug "running post_command: $POST_COMMAND $post_args"
394 post_command_output=$($POST_COMMAND $post_args 2>&1); erc=$?
395 if [ "$erc" -gt 0 ]; then
396 echo "$p post-command '$POST_COMMAND $post_args' exited with status $erc"
397 [ -n "$post_command_output" ] &&
398 echo "$POST_COMMAND $post_args: $post_command_output"
416 [ -z "$1" ] && return 1
417 if [ "$post_args" ]; then
418 post_args="$post_args $1"
426 if [ -z "$command" ]; then
427 command=${2:-$1}; eval ${3:-${2:-$1}}=1
428 elif bool $do_post; then
430 elif [ "$command" = do_exec ]; then
432 elif [ "$command" != do_bsetroot ]; then
441 unset refresh_cmd; debug=echo\ $me\_debug: ;;
444 unset finished do_standard do_exec; do_post=1 ;;
446 -c|*-center|c|-t|*-tile*|t|-f|*-full|f)
448 do_standard|do_generate|do_bsetroot)
451 if ! bool $got_fcmd; then
452 add_arg $1 args; got_fcmd=1
457 add_arg $1; do_standard=1; command=do_standard
460 -a|*-app|a|-e|*-exec|e)
461 command=do_exec; check_cmd ;;
463 -mod|-gradient|-solid|-display)
464 check_cmd "do_bsetroot" && add_arg $1 ;;
467 check_cmd $1 "do_generate" ;;
470 [ -z "$command" ] && quit 0 $me $version $copyright ;;
473 [ -z "$command" ] && help_msg ;;
476 bool $finished && return 1
479 bool $do_exec || bool $do_bsetroot || bool $do_post || help_msg 1
482 if bool $do_standard || bool $do_exec || bool $do_bsetroot || bool $do_generate; then
484 elif bool $do_post; then
487 add_arg $1; command=do_standard; finished=1
492 [ -z "$*" ] && help_msg 1
503 $debug $command $args
504 post_command ${rc:-0}