]> icculus.org git repositories - dana/openbox.git/blob - util/bsetbg
Initial revision
[dana/openbox.git] / util / bsetbg
1 #!/bin/sh
2
3 # Copyright (c) 2000 LordZork Industries (lordzork@lordzork.com)
4 #
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:
11
12 # The above copyright notice and this permission notice shall be included in 
13 # all copies or substantial portions of the Software. 
14
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.
22
23
24 error_msg()
25 {
26  case $INFO in yes|y|1) info_msg; esac
27
28  case $1 in
29    1)
30      echo; echo "$NAME: configuration error: $OPTION=\"$VALUE\"" 
31      echo "$NAME: please edit $CONFIG and provide the correct variable."
32      ;;
33    2)
34      echo; echo "$NAME: error: couldn't execute '$APP'! tried to run fallback option $ARGUMENT"
35      echo "$NAME: but quit because of the following error in $CONFIG:"
36      echo "$NAME: $OPTION= $VALUE"
37      echo "$NAME: please edit $CONFIG and provide the correct variable!"
38      ;;
39    3)
40      echo; echo "$NAME: error: couldn't find any suitable image applications in the system path!"
41      echo
42      error_msg url
43      ;;
44    4)
45      echo; echo "$NAME: error: invalid option, or non-existent image ($ARGUMENT)."
46      ;;
47    5)
48      echo; echo "$NAME: error: the image you specified ($IMAGE) could not be found."
49      ;;
50    6)
51      echo; echo "$NAME: error: please specify a valid image."
52      ;;
53    7)
54      echo; echo "$NAME: error: bsetroot couldn't be found! check your openbox installation."
55      ;;
56    8)
57      echo; echo "$NAME: error: wrong number of arguments!"
58      echo "$NAME: make sure you enclosed the options for '$APP' in double quotes."
59      ;;
60    nobgapp)
61      echo; echo "$NAME: error: tried to run '$VALUE' for $ARGUMENT argument,"
62      echo "$NAME: but couldnt find '$APP' in the path! please fix the following"
63      echo "$NAME: line in $CONFIG to point to an existing application:"
64      echo "$NAME: $OPTION=\"$VALUE\""
65      ;;
66    nogrep)
67      echo "$NAME: error: couldn't find grep!"
68      echo "this script needs grep to be in your path in order to function." 
69      echo "you can get GNU grep from ftp://ftp.gnu.org/bin/gnu/grep/" && exit 1
70      ;;
71    url)
72      echo "it is suggested that you use qiv, xli (xsetbg), or xv."
73      echo "you can obtain them at the following locations:"
74      echo
75      echo "   qiv: http://www.klografx.de/software/qiv.shtml"
76      echo "   xli: http://pantransit.reptiles.org/prog/#xli"
77      echo "   xv: http://www.trilon.com/xv/downloads.html"
78      echo
79      echo "the above URLs are current as of 05/23/2000."
80  esac
81  exit 1     
82 }
83
84
85 help_msg()
86 {
87     echo "$NAME $VERSION: $MORE"
88     echo "options:"
89     echo
90     echo "  (none)                             image is set using default values"
91     echo
92     echo "  -full, -f                          image is set fullscreen"
93     echo "  -tile, -t                          image is set tiled"
94     echo "  -center, -c                        image is set centered"
95     echo
96     echo "  -app, -a <application>             image is set using <application> with"
97     echo "     <"'"application options"'">            quote-enclosed \"options\" and" 
98     echo "     -center, -c|-tile, -t|-full, -f    default fallback option"
99     echo
100     echo "  -display <string>                  display to connect to (bsetroot only)"
101     echo "  -mod <x> <y>                       sets bsetroot modula pattern"
102     echo "     -foreground, -fg <color>           modula foreground color"
103     echo "     -background, -bg <color>           modula background color"
104     echo
105     echo "  -gradient <texture>                sets bsetroot gradient texture"
106     echo "     -from <color>                      gradient start color"
107     echo "     -to <color>                        gradient end color"
108     echo
109     echo "  -solid <color>                     sets bsetroot solid color"
110     echo
111     echo "  -version, -v                       outputs $NAME's version number"
112     echo "  -info, -i                          outputs configuration info"
113     echo "  -help, -h                          this message"
114     echo
115     echo "usage: <options...> <image>"
116     exit 0 
117 }
118
119
120 info_msg()
121 {
122     case $ERROR in
123         [1-3])
124             SUMMARY="error: some variables are blank"
125             ;;
126         4)
127             SUMMARY="no values have been specified"
128             ;;
129         0)
130             SUMMARY="looks good"
131     esac
132
133     case $APP_ERROR in [1-4])
134         SUMMARY="error: some applications couldn't be found!"
135     esac
136
137     case `which bsetroot 2>&1` in
138         */*bsetroot)
139             BSETROOT=`which bsetroot`
140             ;;
141         *)
142             BSETROOT="(error: not found)"
143             case $ERROR in
144                 1-4)
145                     SUMMARY="$SUMMARY, and bsetroot does not seem to be present."
146                     ;;
147                 *)
148                     SUMMARY="$SUMMARY, but bsetroot does not seem to be present."
149             esac
150     esac
151
152     echo "$NAME $VERSION configuration:"
153     echo
154     echo "  bsetroot:                          $BSETROOT"
155     echo
156     echo "  reading configuration from:        $CONFIG"
157     echo
158     echo "  configuration values:"
159     echo
160     case $FULL_BGAPP_MSG in 
161         *"not found")
162             echo "      fullscreen (ERROR):            $FULL_BGAPP_MSG"
163             ;;
164         *)
165             echo "      fullscreen (FULL):             $FULL_MSG"
166     esac
167
168     echo
169
170     case $TILE_BGAPP_MSG in 
171         *"not found")
172             echo "      tiled (ERROR):                 $TILE_BGAPP_MSG"
173             ;;
174         *)
175             echo "      tiled (TILE):                  $TILE_MSG"
176     esac
177
178     echo
179
180     case $CENTER_BGAPP_MSG in 
181         *"not found")
182             echo "      centered (ERROR):              $CENTER_BGAPP_MSG"
183             ;;
184         *)
185             echo "      centered (CENTER):             $CENTER_MSG"
186     esac
187
188     echo
189
190     case $DEFAULT_BGAPP_MSG in 
191         *"not found")
192             echo "      default (ERROR):               $DEFAULT_BGAPP_MSG"
193             ;;
194         *)
195             echo "      default (DEFAULT):             $DEFAULT_MSG"
196     esac
197     echo
198     echo "  summary: $SUMMARY"
199     exit 0
200 }
201
202
203 find_app()
204 {
205     case `which $1 2>&1` in 
206         */*$1)
207             echo "$NAME: checking for $1... `which $1`"
208             echo "### $app" >> $TMPFILE
209             echo "# FULL=\"$full\"" >> $TMPFILE
210             echo "# TILE=\"$tile\"" >> $TMPFILE
211             echo "# CENTER=\"$center\"" >> $TMPFILE
212             echo "# DEFAULT=\"$default\"" >> $TMPFILE
213             echo >> $TMPFILE
214
215             FULL=$full
216             TILE=$tile
217             CENTER=$center
218             DEFAULT=$default
219             APP=$app
220             ;;
221         *)
222         echo "$NAME: checking for $1... not found."
223     esac
224 }
225
226 search_display()
227 {
228     ### display
229     full="display -geometry 800x600 -window root"
230     tile="display -window root"
231     center="display -backdrop -window root"
232     default=$center
233     find_app display
234 }
235
236 search_Esetroot()
237 {
238     ### Esetroot
239     full="Esetroot -scale"
240     tile="Esetroot"
241     center="Esetroot -c"
242     default=$center
243     find_app Esetroot
244 }
245
246 search_wmsetbg()
247 {
248     ### wmsetbg
249     full="wmsetbg -s -S"
250     tile="wmsetbg -t"
251     center="wmsetbg -e"
252     default=$center
253     find_app wmsetbg
254 }
255
256 search_xli()
257 {
258     ### xli
259     case `which xsetbg 2>&1` in
260         */*xsetbg)
261             full="xsetbg -fillscreen"
262             tile="xsetbg"
263             center="xsetbg -center"
264             default=$center
265             app="xsetbg (xli)"
266             find_app xsetbg
267             ;;
268         *)
269             case `which xli 2>&1` in */*xli)
270                 full="xli -fillscreen -onroot -quiet"
271                 tile="xli -onroot -quiet"
272                 center="xli -center -onroot quiet"
273                 default=$center
274                 app=xli
275                 find_app xli
276             esac
277     esac
278 }
279
280 search_qiv()
281 {
282     ### qiv
283     full="qiv --root_s"
284     tile="qiv --root_t"
285     center="qiv --root"
286     default=$center
287     find_app qiv
288 }
289
290 search_xv()
291 {
292     ### xv
293     full="xv -max -smooth -root -quit"
294     tile="xv -root -quit"
295     center="xv -rmode 5 -root -quit"
296     default=$center
297     find_app xv
298 }
299
300
301 rm_tmpfiles()
302 {
303     [ -f $TMPFILE ] && rm -f $TMPFILE
304 }
305
306
307 create_config()
308 {
309     trap rm_tmpfiles INT QUIT STOP TERM
310     case $UID in 0)
311         if [ "$ARGUMENT" != "-r" ]; then
312             echo "$NAME: running X as root is a security hazard, and is NOT a good idea!"
313             echo "$NAME: if you insist upon having a ~/.bsetbgrc for root, run bsetbg with"
314             echo "$NAME: the '-r' flag to force its creation. you have been warned!"
315             exit 1
316         fi
317     esac
318
319     case $ARGUMENT in
320         -r)
321             echo "$NAME: creating configuration for root (BAD IDEA)..."
322             ;;
323         *)
324             echo "$NAME: $CONFIG not found, creating..."
325     esac
326
327     for app in $IMAGE_APPS; do
328         search_$app
329     done
330
331     if [ -z "$FULL" ] || [ -z "TILE" ] || [ -z "$CENTER" ]; then
332         rm -f $TMPFILE
333         INFO= && error_msg 3
334     fi
335
336     echo "# $CONFIG" >> $CONFIG
337     echo "#" >> $CONFIG
338     echo "# automagically generated with loving care by $NAME $VERSION on `date`" >> $CONFIG
339     echo "#" >> $CONFIG
340     echo "# uncomment the set below that corresponds to your favorite root-image" >> $CONFIG
341     echo "# application, or mix and match to suit your pleasure." >> $CONFIG
342     echo "#" >> $CONFIG
343     echo "# xli misbehaves under larger screen resolutions when using the -fillscreen" >> $CONFIG
344     echo "# option. use -fullscreen if your resolution is higher than 1024x768." >> $CONFIG
345     echo "#" >> $CONFIG
346     echo; echo >> $CONFIG
347     echo "### $APP" >> $CONFIG
348     echo "FULL=\"$FULL\"" >> $CONFIG
349     echo "TILE=\"$TILE\"" >> $CONFIG
350     echo "CENTER=\"$CENTER\"" >> $CONFIG
351     echo "DEFAULT=\"$DEFAULT\"" >> $CONFIG
352     echo >> $CONFIG
353  
354     cat $TMPFILE | grep -v $APP >> $CONFIG
355
356     rm -f $TMPFILE
357
358     if [ -f $CONFIG ]; then
359         echo "$NAME: default configuration was created in $CONFIG."
360     else
361         echo "ERROR: $CONFIG not found!" && exit 1
362     fi
363 }
364
365 check_config_apps()
366 {
367     BGAPP=$1
368     case `which $1 2>&1` in
369         */*$1)
370             BGAPP_MSG="`which $1`"
371             ;;
372         *)
373             BGAPP_MSG="$BGAPP: not found"
374             APP_ERROR=`expr $APP_ERROR + 1`
375     esac
376 }
377
378
379 check_config_vars()
380 {
381     ERROR=0
382     APP_ERROR=0
383
384     if [ -z "$FULL" ]; then
385         FULL_MSG="(no value)" && ERROR=`expr $ERROR + 1`
386     else
387         check_config_apps $FULL
388         FULL_BGAPP_MSG=$BGAPP_MSG
389         FULL_BGAPP=$BGAPP
390         FULL_MSG="$FULL" 
391     fi
392
393     if [ -z "$TILE" ]; then
394         TILE_MSG="(no value)" && ERROR=`expr $ERROR + 1`
395     else
396         check_config_apps $TILE
397         TILE_BGAPP_MSG=$BGAPP_MSG
398         TILE_BGAPP=$BGAPP
399         TILE_MSG="$TILE"
400     fi
401
402     if [ -z "$CENTER" ]; then
403         CENTER_MSG="(no value)" && ERROR=`expr $ERROR + 1`
404     else
405         check_config_apps $CENTER
406         CENTER_BGAPP_MSG=$BGAPP_MSG
407         CENTER_BGAPP=$BGAPP
408         CENTER_MSG="$CENTER"
409     fi
410
411     if [ -z "$DEFAULT" ]; then
412         DEFAULT_MSG="(no value)" && ERROR=`expr $ERROR + 1`
413     else
414         check_config_apps $DEFAULT
415         DEFAULT_BGAPP_MSG=$BGAPP_MSG
416         DEFAULT_BGAPP=$BGAPP
417         DEFAULT_MSG="$DEFAULT"
418     fi
419 }
420
421
422 final_error_check()
423 {
424     case $ARGUMENT in
425         *full|-f|c)
426             OPTION=FULL
427             VALUE=$FULL_MSG
428             FB_ARG=$FULL
429             case $FULL_BGAPP_MSG in *"not found")
430                 APP=$FULL_BGAPP
431                 error_msg nobgapp
432             esac
433             ;;
434         *tile|-t|t)
435             OPTION=TILE
436             VALUE=$TILE_MSG
437             FB_ARG=$TILE
438             case $TILE_BGAPP_MSG in *"not found")
439                 APP=$TILE_BGAPP
440                 error_msg nobgapp
441             esac
442             ;;
443         *center|-c|c)
444             OPTION=CENTER
445             VALUE=$CENTER_MSG
446             FB_ARG=$CENTER
447             case $CENTER_BGAPP_MSG in *"not found")
448                 APP=$CENTER_BGAPP
449                 error_msg nobgapp
450             esac                    
451             ;;
452         *)
453             OPTION=DEFAULT
454             VALUE=$DEFAULT_MSG
455             FB_ARG=$DEFAULT
456             ARGUMENT=default
457             case $DEFAULT_BGAPP_MSG in *"not found")
458                 APP=$DEFAULT_BGAPP
459                 error_msg nobgapp
460             esac
461
462             if [ "$IMAGE_EXISTS" != yes ]; then
463             error_msg 4; fi
464     esac
465
466     case $VALUE in "(no value)")
467         if [ -n "$APP" ]; then
468             error_msg 2
469         else
470             error_msg 1
471         fi
472     esac
473 }
474
475
476 check_config()
477 {
478     if [ ! -f $CONFIG ]; then
479         create_config
480     fi
481
482     check_old_config
483     . $CONFIG
484     check_config_vars
485     final_error_check
486 }
487
488
489 check_image()
490 {
491     case "$IMAGE" in
492         *~/*)
493             IMAGE="$HOME/`basename $IMAGE`"
494     esac
495
496     case $NOARG in 
497         yes|y|1)
498             NUM=4
499             ;;
500         *)
501             if [ -n "$IMAGE" ]; then
502                 NUM=5
503             else
504                 NUM=6
505             fi
506             case $IMAGE in $ARGUMENT|"."|"./")
507                 error_msg 6
508             esac
509     esac
510
511     if [ ! -e "$IMAGE" ]; then
512         error_msg $NUM  
513     else
514         IMAGE_EXISTS=yes
515     fi
516 }
517
518
519 exec_app()
520 {
521     case `which $APP 2>&1` in
522         */*$APP)
523             check_image
524             final_error_check
525             exec $APP $ARGS "$IMAGE"
526             ;;
527         *)
528             check_image
529             check_config
530             exec $FB_ARG "$IMAGE"
531     esac
532 }
533
534
535 check_bsetroot_args()
536 {
537     case $1 in
538         -mod)
539             ARGS="$1 $2 $3 $4 $5 $6 $7"
540             ;;
541         -gradient)
542             ARGS="$1 $2 $3 $4 $5 $6"
543             ;;
544         -solid)
545             ARGS="$1 $2"
546     esac
547 }
548
549
550 exec_bsetroot()
551 {
552     case `which bsetroot 2>&1` in
553         */*bsetroot)
554             exec bsetroot $ARGS
555             ;;
556         *)
557             error_msg 7
558     esac
559 }
560
561
562 check_old_config()
563 {
564    if [ -f $CONFIG ]; then
565         . $CONFIG
566         if [ -n "$BGAPP" ] || [ -n "$CENTER_ARGS" ] || \
567            [ -n "$TILED_ARGS" ] || [ -n "$OTHER_ARGS" ] || \
568            [ -n "$DEFAULT_ARGS" ]; then
569                 echo " this version of $NAME ($VERSION) no longer uses the old configuration format."
570                 echo " please update $CONFIG with the new syntax:"
571                 echo
572                 echo "        CENTER=\"value\""
573                 echo "        FULL=\"value\""
574                 echo "        TILE=\"value\""
575                 echo "        DEFAULT=\"value\""
576                 echo
577                 echo "     see the sample.config file for details."
578                 exit 0
579         fi
580     fi
581 }
582
583
584 debug()
585
586     echo "DEBUG:--------------------------"
587     echo "config: $CONFIG"
588     echo "full: $FULL"
589     echo "tile: $TILE"
590     echo "center: $CENTER"
591     echo "default: $DEFAULT"
592     echo "error: $ERROR"
593     echo "app error: $APP_ERROR"
594     echo "argument: $ARGUMENT"
595     echo "________________________________"
596     echo
597 }
598
599 IMAGE_APPS="display Esetroot wmsetbg xv xli qiv"
600 CONFIG="$HOME/.bsetbgrc"
601 NAME=bsetbg
602 VERSION=1.12
603 MORE="(C) 2000 by lordzork industries (http://lordzork.com/)"
604 PATH=$PATH:/usr/bin:/usr/local/bin:/usr/X11R6/bin:/usr/X11/bin
605 TMPFILE=`tempfile --prefix=bsetbg`
606 ARGUMENT=$1
607
608
609 case `which grep 2>&1` in */*grep) : ;;
610     *)
611         error_msg nogrep
612 esac
613
614 case $1 in 
615     *-full|-f|f)
616         check_config
617         IMAGE=$2 && check_image
618         exec $FULL "$IMAGE"
619         ;;
620     *-tile|*tiled|-t|t)
621         check_config
622         IMAGE=$2 && check_image
623         exec $TILE "$IMAGE"
624         ;;
625     *-center|-c|c)
626         check_config
627         IMAGE=$2 && check_image
628         exec $CENTER "$IMAGE"
629         ;;
630     *-app|-a|a)
631         APP=$2
632         ARGS="$3"
633         case $# in
634             4)
635                 ARGMENT=$3
636                 IMAGE=$4 
637                 exec_app
638                 ;;
639             5)
640                 COMMAND=`shift 1 && echo $*`
641                 ARGUMENT=$4
642                 IMAGE=$5
643                 exec_app
644                 ;;
645             *)
646                 error_msg 8
647         esac
648         ;;
649     -mod|-gradient|-solid)
650         check_bsetroot_args $*
651         exec_bsetroot
652         ;;
653     -display)
654         shift 1 && check_bsetroot_args $*
655         ARGS="-display $ARGS"
656         exec_bsetroot
657         ;;
658     *-info|-i|i)
659         INFO=yes
660         check_config
661         info_msg
662         ;;
663     *-version|-v|v)
664         echo; echo "    $NAME version $VERSION"; echo "    $MORE";  exit 0
665         ;;
666     *-help|-h|h)
667         help_msg
668         ;;
669     -r)
670         case $UID in
671             0)
672                 if [ -f $CONFIG ]; then
673                     exit 1
674                 else
675                     create_config
676                 fi              
677                 ;;
678             *)
679                 exit 1
680         esac
681         ;;
682     *)
683         if [ -n "$1" ]; then
684             NOARG=yes
685             IMAGE=$1 && check_image
686             check_config && final_error_check
687             exec $DEFAULT "$1"
688         else
689             if [ ! -f $CONFIG ]; then
690                 create_config && exit 0
691             fi
692             help_msg
693         fi
694 esac