http://packetstormsecurity.org/UNIX/admin/xscreensaver-3.32.tar.gz
authorZygo Blaxell <zblaxell@hungrycats.org>
Mon, 2 Mar 2009 05:42:47 +0000 (00:42 -0500)
committerZygo Blaxell <zblaxell@faye.furryterror.org>
Fri, 8 Feb 2013 17:53:43 +0000 (12:53 -0500)
-rw-r--r-- 1 zblaxell zblaxell 1602500 Apr 15  2001 xscreensaver-3.32.tar.gz
99f7828d302d8d93cb1244056f4ea36280919046  xscreensaver-3.32.tar.gz

69 files changed:
Makefile.in
README
config.h.in
configure
configure.in
driver/Makefile.in
driver/XScreenSaver.ad.in
driver/XScreenSaver_ad.h
driver/demo-Gtk-stubs.h
driver/demo-Gtk-widgets.c
driver/demo-Gtk.c
driver/demo-Xm.c
driver/lock.c
driver/prefs.c
driver/prefs.h
driver/splash.c
driver/test-fade.c [new file with mode: 0644]
driver/xscreensaver-command.man
driver/xscreensaver-demo.glade
driver/xscreensaver-demo.man
driver/xscreensaver-getimage-file [new file with mode: 0755]
driver/xscreensaver-getimage-file.man [new file with mode: 0644]
driver/xscreensaver-getimage-video [new file with mode: 0755]
driver/xscreensaver-getimage-video.man [new file with mode: 0644]
driver/xscreensaver-getimage.c [new file with mode: 0644]
driver/xscreensaver-getimage.man [new file with mode: 0644]
driver/xscreensaver.c
driver/xscreensaver.man
hacks/Makefile.in
hacks/blitspin.man
hacks/bumps.h
hacks/bumps.man [new file with mode: 0644]
hacks/decayscreen.man
hacks/distort.man
hacks/glx/Makefile.in
hacks/glx/atlantis.c
hacks/glx/atlantis.h
hacks/glx/dangerball.c
hacks/glx/molecule.c
hacks/images/sea-texture.xpm [new file with mode: 0644]
hacks/jigsaw.c
hacks/jigsaw.man
hacks/maze.c
hacks/rotzoomer.man
hacks/screenhack.c
hacks/slidescreen.c
hacks/slidescreen.man
hacks/slip.man
hacks/spotlight.man
hacks/vidwhacker
hacks/webcollage
hacks/xteevee.c
hacks/xteevee.man
hacks/zoom.man
utils/Makefile.in
utils/colorbars.c [new file with mode: 0644]
utils/colorbars.h [new file with mode: 0644]
utils/compile_axp.com
utils/compile_decc.com
utils/fade.c
utils/grabclient.c [new file with mode: 0644]
utils/grabscreen.c
utils/logo.c
utils/resources.h
utils/sgivideo.c [deleted file]
utils/sgivideo.h [deleted file]
utils/version.h
xscreensaver.lsm
xscreensaver.spec

index d33dc24b35758fd3776f79e874e66754d418ac15..6fe2ba0ec3e652d872185de6943611853bc4d399 100644 (file)
@@ -175,8 +175,9 @@ rpm::
   mkdir $$DIR ;                                                                   \
   ( cd $$DIR; mkdir BUILD RPMS RPMS/$$ARCH SOURCES SPECS SRPMS ) ;        \
   cp -p xscreensaver-$$VERS.tar.gz $$DIR/SOURCES/ ;                       \
-  rpm -vba --define "_topdir $$DIR"                                       \
-           --define "USE_GL yes" xscreensaver.spec ;                      \
+  rpm --define "_topdir $$DIR"                                            \
+      --define "USE_GL yes"                                               \
+      -v -ba xscreensaver.spec ;                                          \
   echo '' ;                                                               \
   echo 'RPM build complete' ;                                             \
   echo '' ;                                                               \
diff --git a/README b/README
index 9bcbcd6f27c837be6f0dabe28f44c381ebae7170..cedca8ea16fb61670d3043972f03ae18a51960b7 100644 (file)
--- a/README
+++ b/README
@@ -71,6 +71,21 @@ http://www.jwz.org/xscreensaver/.
 
                               ============
 
+Changes since 3.31:   * The image-manipulating hacks (`slidescreen', etc.) can
+                        now operate on randomly chosen image files from disk,
+                        or on frames captured from the system's video input,
+                        instead of (or in addition to) manipulating images of
+                        the desktop.
+                      * Rewrote `vidwhacker' to use the new image-grabbing
+                        mechanism.
+                      * Made fading work on TrueColor XFree86 4.x systems.
+                      * Fixed a subtle rendering bug in `atlantis' (the fish
+                        were inside out!)
+                      * Made `atlantis' have a texture simulating light
+                        reflections from the surface of the ocean.
+                      * Fixed up label placement in `molecule'.
+                      * Better color bars in `xteevee'.
+                      * Made `install-strip' not try to strip scripts.
 Changes since 3.30:   * Put in more sensible defaults for DPMS, and updated
                         the documentation to reflect the fact that all your
                         DPMS settings are now belong to xscreensaver.
index 6cfb67a03af7ad03d58a5183478685a380f0fde8..ed31807e2c84348d3a3b9f5f2a7b3c32d3eebba9 100644 (file)
  */
 #undef HAVE_READ_DISPLAY_EXTENSION
 
-/* Define this if you have the Iris Video Library (dmedia/vl.h on SGI.)
-   A few of the screenhacks will take advantage of this if it's available.
- */
-#undef HAVE_SGI_VIDEO
-
 /* Define this if you have the XHPDisableReset function (an HP only thing.)
  */
 #undef HAVE_XHPDISABLERESET
  */
 #undef HAVE_XF86VMODE
 
+/*  Define this if you have the functions XF86VidModeGetGamma() and
+ *  XF86VidModeSetGamma(), which allow clients to change the gamma
+ *  response of the monitor.  This is an XFree86 4.x thing, and probably
+ *  doesn't exist elsewhere.  (It's available if the file
+ *  /usr/include/X11/extensions/xf86vmode.h exists and has stuff about
+ *  gamma in it.)
+ */
+#undef HAVE_XF86VMODE_GAMMA
+
 /*  Define this if you have a Linux-like /proc/interrupts file which can be
  *  examined to determine when keyboard activity has occurred.
  */
index 37b9ac87e41989639434138105a6a63bcc5a9e10..24e782b956078f94da555c2e6034de847f412ba8 100755 (executable)
--- a/configure
+++ b/configure
@@ -50,6 +50,8 @@ ac_help="$ac_help
   --with-dpms-ext         Include support for the DPMS extension."
 ac_help="$ac_help
   --with-xf86vmode-ext    Include support for XFree86 virtual screens."
+ac_help="$ac_help
+  --with-xf86gamma-ext    Include support for XFree86 gamma fading."
 ac_help="$ac_help
   --with-proc-interrupts  Include support for consulting the /proc/interrupts
                           file to notice keyboard activity."
@@ -92,8 +94,6 @@ ac_help="$ac_help
 ac_help="$ac_help
   --with-readdisplay      Include support for the XReadDisplay extension."
 ac_help="$ac_help
-  --with-sgivideo         Include support for SGI's Iris Video Library."
-ac_help="$ac_help
 
   --with-zippy=PROGRAM    Some demos are able to run an external program and
                           display its text; this names the program to use by
@@ -1073,7 +1073,7 @@ echo "configure:1076: checking how to request ANSI compilation" >&5
       ;;
 
       *-dec-* )
-        echo "$ac_t""DEC: adding -std1" 1>&6
+        echo "$ac_t""DEC: adding -std1 -ieee" 1>&6
         CC="$CC -std1"
       ;;
 
@@ -1526,14 +1526,21 @@ else
 fi
 
 
+# By default, autoconf sets INSTALL_SCRIPT to '${INSTALL_PROGRAM}'.
+# That's wrong: it should be set to '${INSTALL}', so that one can
+# implement the "install-strip" target properly (strip executables,
+# but do not try to strip scripts.)
+#
+INSTALL_SCRIPT='${INSTALL}'
+
 # random libc stuff
 echo $ac_n "checking for ANSI C header files""... $ac_c" 1>&6
-echo "configure:1543: checking for ANSI C header files" >&5
+echo "configure:1550: checking for ANSI C header files" >&5
 if eval "test \"`echo '$''{'ac_cv_header_stdc'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 1548 "configure"
+#line 1555 "configure"
 #include "confdefs.h"
 #include <stdlib.h>
 #include <stdarg.h>
@@ -1541,7 +1548,7 @@ else
 #include <float.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:1556: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:1563: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -1558,7 +1565,7 @@ rm -f conftest*
 if test $ac_cv_header_stdc = yes; then
   # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
 cat > conftest.$ac_ext <<EOF
-#line 1573 "configure"
+#line 1580 "configure"
 #include "confdefs.h"
 #include <string.h>
 EOF
@@ -1576,7 +1583,7 @@ fi
 if test $ac_cv_header_stdc = yes; then
   # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
 cat > conftest.$ac_ext <<EOF
-#line 1591 "configure"
+#line 1598 "configure"
 #include "confdefs.h"
 #include <stdlib.h>
 EOF
@@ -1597,7 +1604,7 @@ if test "$cross_compiling" = yes; then
   :
 else
   cat > conftest.$ac_ext <<EOF
-#line 1612 "configure"
+#line 1619 "configure"
 #include "confdefs.h"
 #include <ctype.h>
 #define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
@@ -1608,7 +1615,7 @@ if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) exit(2);
 exit (0); }
 
 EOF
-if { (eval echo configure:1623: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+if { (eval echo configure:1630: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
 then
   :
 else
@@ -1635,17 +1642,17 @@ for ac_hdr in unistd.h
 do
 ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:1650: checking for $ac_hdr" >&5
+echo "configure:1657: checking for $ac_hdr" >&5
 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 1655 "configure"
+#line 1662 "configure"
 #include "confdefs.h"
 #include <$ac_hdr>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:1660: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:1667: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -1672,12 +1679,12 @@ fi
 done
 
 echo $ac_n "checking for mode_t""... $ac_c" 1>&6
-echo "configure:1687: checking for mode_t" >&5
+echo "configure:1694: checking for mode_t" >&5
 if eval "test \"`echo '$''{'ac_cv_type_mode_t'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 1692 "configure"
+#line 1699 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
 #if STDC_HEADERS
@@ -1705,12 +1712,12 @@ EOF
 fi
 
 echo $ac_n "checking for pid_t""... $ac_c" 1>&6
-echo "configure:1720: checking for pid_t" >&5
+echo "configure:1727: checking for pid_t" >&5
 if eval "test \"`echo '$''{'ac_cv_type_pid_t'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 1725 "configure"
+#line 1732 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
 #if STDC_HEADERS
@@ -1738,12 +1745,12 @@ EOF
 fi
 
 echo $ac_n "checking for size_t""... $ac_c" 1>&6
-echo "configure:1753: checking for size_t" >&5
+echo "configure:1760: checking for size_t" >&5
 if eval "test \"`echo '$''{'ac_cv_type_size_t'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 1758 "configure"
+#line 1765 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
 #if STDC_HEADERS
@@ -1771,12 +1778,12 @@ EOF
 fi
 
 echo $ac_n "checking return type of signal handlers""... $ac_c" 1>&6
-echo "configure:1786: checking return type of signal handlers" >&5
+echo "configure:1793: checking return type of signal handlers" >&5
 if eval "test \"`echo '$''{'ac_cv_type_signal'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 1791 "configure"
+#line 1798 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
 #include <signal.h>
@@ -1793,7 +1800,7 @@ int main() {
 int i;
 ; return 0; }
 EOF
-if { (eval echo configure:1808: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:1815: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   ac_cv_type_signal=void
 else
@@ -1812,12 +1819,12 @@ EOF
 
 
 echo $ac_n "checking whether time.h and sys/time.h may both be included""... $ac_c" 1>&6
-echo "configure:1827: checking whether time.h and sys/time.h may both be included" >&5
+echo "configure:1834: checking whether time.h and sys/time.h may both be included" >&5
 if eval "test \"`echo '$''{'ac_cv_header_time'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 1832 "configure"
+#line 1839 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
 #include <sys/time.h>
@@ -1826,7 +1833,7 @@ int main() {
 struct tm *tp;
 ; return 0; }
 EOF
-if { (eval echo configure:1841: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:1848: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   ac_cv_header_time=yes
 else
@@ -1847,12 +1854,12 @@ EOF
 fi
 
 echo $ac_n "checking for sys/wait.h that is POSIX.1 compatible""... $ac_c" 1>&6
-echo "configure:1862: checking for sys/wait.h that is POSIX.1 compatible" >&5
+echo "configure:1869: checking for sys/wait.h that is POSIX.1 compatible" >&5
 if eval "test \"`echo '$''{'ac_cv_header_sys_wait_h'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 1867 "configure"
+#line 1874 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
 #include <sys/wait.h>
@@ -1868,7 +1875,7 @@ wait (&s);
 s = WIFEXITED (s) ? WEXITSTATUS (s) : 1;
 ; return 0; }
 EOF
-if { (eval echo configure:1883: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:1890: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   ac_cv_header_sys_wait_h=yes
 else
@@ -1893,12 +1900,12 @@ for ac_hdr in dirent.h sys/ndir.h sys/dir.h ndir.h
 do
 ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for $ac_hdr that defines DIR""... $ac_c" 1>&6
-echo "configure:1908: checking for $ac_hdr that defines DIR" >&5
+echo "configure:1915: checking for $ac_hdr that defines DIR" >&5
 if eval "test \"`echo '$''{'ac_cv_header_dirent_$ac_safe'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 1913 "configure"
+#line 1920 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
 #include <$ac_hdr>
@@ -1906,7 +1913,7 @@ int main() {
 DIR *dirp = 0;
 ; return 0; }
 EOF
-if { (eval echo configure:1921: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:1928: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   eval "ac_cv_header_dirent_$ac_safe=yes"
 else
@@ -1931,7 +1938,7 @@ done
 # Two versions of opendir et al. are in -ldir and -lx on SCO Xenix.
 if test $ac_header_dirent = dirent.h; then
 echo $ac_n "checking for opendir in -ldir""... $ac_c" 1>&6
-echo "configure:1946: checking for opendir in -ldir" >&5
+echo "configure:1953: checking for opendir in -ldir" >&5
 ac_lib_var=`echo dir'_'opendir | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -1939,7 +1946,7 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-ldir  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 1954 "configure"
+#line 1961 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -1950,7 +1957,7 @@ int main() {
 opendir()
 ; return 0; }
 EOF
-if { (eval echo configure:1965: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:1972: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -1972,7 +1979,7 @@ fi
 
 else
 echo $ac_n "checking for opendir in -lx""... $ac_c" 1>&6
-echo "configure:1987: checking for opendir in -lx" >&5
+echo "configure:1994: checking for opendir in -lx" >&5
 ac_lib_var=`echo x'_'opendir | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -1980,7 +1987,7 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-lx  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 1995 "configure"
+#line 2002 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -1991,7 +1998,7 @@ int main() {
 opendir()
 ; return 0; }
 EOF
-if { (eval echo configure:2006: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:2013: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -2014,12 +2021,12 @@ fi
 fi
 
 echo $ac_n "checking how to call gettimeofday""... $ac_c" 1>&6
-echo "configure:2029: checking how to call gettimeofday" >&5
+echo "configure:2036: checking how to call gettimeofday" >&5
   if eval "test \"`echo '$''{'ac_cv_gettimeofday_args'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 2034 "configure"
+#line 2041 "configure"
 #include "confdefs.h"
 #include <stdlib.h>
                     #include <sys/time.h>
@@ -2028,7 +2035,7 @@ struct timeval tv; struct timezone tzp;
                     gettimeofday(&tv, &tzp);
 ; return 0; }
 EOF
-if { (eval echo configure:2043: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:2050: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   ac_gettimeofday_args=2
 else
@@ -2036,7 +2043,7 @@ else
   cat conftest.$ac_ext >&5
   rm -rf conftest*
   cat > conftest.$ac_ext <<EOF
-#line 2051 "configure"
+#line 2058 "configure"
 #include "confdefs.h"
 #include <stdlib.h>
                                     #include <sys/time.h>
@@ -2044,7 +2051,7 @@ int main() {
 struct timeval tv; gettimeofday(&tv);
 ; return 0; }
 EOF
-if { (eval echo configure:2059: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:2066: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   ac_gettimeofday_args=1
 else
@@ -2083,12 +2090,12 @@ EOF
 for ac_func in select fcntl uname nice setpriority getcwd getwd putenv
 do
 echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:2098: checking for $ac_func" >&5
+echo "configure:2105: checking for $ac_func" >&5
 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 2103 "configure"
+#line 2110 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char $ac_func(); below.  */
@@ -2111,7 +2118,7 @@ $ac_func();
 
 ; return 0; }
 EOF
-if { (eval echo configure:2126: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:2133: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_func_$ac_func=yes"
 else
@@ -2139,12 +2146,12 @@ done
 for ac_func in sigaction syslog realpath
 do
 echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:2154: checking for $ac_func" >&5
+echo "configure:2161: checking for $ac_func" >&5
 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 2159 "configure"
+#line 2166 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char $ac_func(); below.  */
@@ -2167,7 +2174,7 @@ $ac_func();
 
 ; return 0; }
 EOF
-if { (eval echo configure:2182: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:2189: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_func_$ac_func=yes"
 else
@@ -2192,12 +2199,12 @@ fi
 done
 
 echo $ac_n "checking for struct icmp""... $ac_c" 1>&6
-echo "configure:2207: checking for struct icmp" >&5
+echo "configure:2214: checking for struct icmp" >&5
 if eval "test \"`echo '$''{'ac_cv_have_icmp'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 2212 "configure"
+#line 2219 "configure"
 #include "confdefs.h"
 #include <stdlib.h>
                    #include <stdio.h>
@@ -2237,7 +2244,7 @@ struct icmp i;
                    
 ; return 0; }
 EOF
-if { (eval echo configure:2252: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:2259: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   ac_cv_have_icmp=yes
 else
@@ -2257,12 +2264,12 @@ EOF
 
  fi
 echo $ac_n "checking for struct icmphdr""... $ac_c" 1>&6
-echo "configure:2272: checking for struct icmphdr" >&5
+echo "configure:2279: checking for struct icmphdr" >&5
 if eval "test \"`echo '$''{'ac_cv_have_icmphdr'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 2277 "configure"
+#line 2284 "configure"
 #include "confdefs.h"
 #include <stdlib.h>
                    #include <stdio.h>
@@ -2297,7 +2304,7 @@ struct icmphdr i;
                    ip.ip_hl = 0;
 ; return 0; }
 EOF
-if { (eval echo configure:2312: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:2319: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   ac_cv_have_icmphdr=yes
 else
@@ -2320,17 +2327,17 @@ for ac_hdr in crypt.h sys/select.h
 do
 ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:2335: checking for $ac_hdr" >&5
+echo "configure:2342: checking for $ac_hdr" >&5
 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 2340 "configure"
+#line 2347 "configure"
 #include "confdefs.h"
 #include <$ac_hdr>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:2345: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:2352: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -2361,7 +2368,7 @@ do
 # Extract the first word of "$ac_prog", so it can be a program name with args.
 set dummy $ac_prog; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:2376: checking for $ac_word" >&5
+echo "configure:2383: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_path_PERL'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -2400,7 +2407,7 @@ done
     PERL_VERSION=0
   else
     echo $ac_n "checking perl version""... $ac_c" 1>&6
-echo "configure:2415: checking perl version" >&5
+echo "configure:2422: checking perl version" >&5
 if eval "test \"`echo '$''{'ac_cv_perl_version'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -2422,7 +2429,7 @@ fi
 # Uses ac_ vars as temps to allow command line to override cache and checks.
 # --without-x overrides everything else, but does not touch the cache.
 echo $ac_n "checking for X""... $ac_c" 1>&6
-echo "configure:2437: checking for X" >&5
+echo "configure:2444: checking for X" >&5
 
 # Check whether --with-x or --without-x was given.
 if test "${with_x+set}" = set; then
@@ -2484,12 +2491,12 @@ if test "$ac_x_includes" = NO; then
 
   # First, try using that file with no special directory specified.
 cat > conftest.$ac_ext <<EOF
-#line 2499 "configure"
+#line 2506 "configure"
 #include "confdefs.h"
 #include <$x_direct_test_include>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:2504: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:2511: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -2558,14 +2565,14 @@ if test "$ac_x_libraries" = NO; then
   ac_save_LIBS="$LIBS"
   LIBS="-l$x_direct_test_library $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 2573 "configure"
+#line 2580 "configure"
 #include "confdefs.h"
 
 int main() {
 ${x_direct_test_function}()
 ; return 0; }
 EOF
-if { (eval echo configure:2580: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:2587: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   LIBS="$ac_save_LIBS"
 # We can link X programs with no special library path.
@@ -2671,17 +2678,17 @@ else
     case "`(uname -sr) 2>/dev/null`" in
     "SunOS 5"*)
       echo $ac_n "checking whether -R must be followed by a space""... $ac_c" 1>&6
-echo "configure:2686: checking whether -R must be followed by a space" >&5
+echo "configure:2693: checking whether -R must be followed by a space" >&5
       ac_xsave_LIBS="$LIBS"; LIBS="$LIBS -R$x_libraries"
       cat > conftest.$ac_ext <<EOF
-#line 2689 "configure"
+#line 2696 "configure"
 #include "confdefs.h"
 
 int main() {
 
 ; return 0; }
 EOF
-if { (eval echo configure:2696: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:2703: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   ac_R_nospace=yes
 else
@@ -2697,14 +2704,14 @@ rm -f conftest*
       else
        LIBS="$ac_xsave_LIBS -R $x_libraries"
        cat > conftest.$ac_ext <<EOF
-#line 2712 "configure"
+#line 2719 "configure"
 #include "confdefs.h"
 
 int main() {
 
 ; return 0; }
 EOF
-if { (eval echo configure:2719: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:2726: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   ac_R_space=yes
 else
@@ -2736,7 +2743,7 @@ rm -f conftest*
     # libraries were built with DECnet support.  And karl@cs.umb.edu says
     # the Alpha needs dnet_stub (dnet does not exist).
     echo $ac_n "checking for dnet_ntoa in -ldnet""... $ac_c" 1>&6
-echo "configure:2751: checking for dnet_ntoa in -ldnet" >&5
+echo "configure:2758: checking for dnet_ntoa in -ldnet" >&5
 ac_lib_var=`echo dnet'_'dnet_ntoa | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -2744,7 +2751,7 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-ldnet  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 2759 "configure"
+#line 2766 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -2755,7 +2762,7 @@ int main() {
 dnet_ntoa()
 ; return 0; }
 EOF
-if { (eval echo configure:2770: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:2777: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -2777,7 +2784,7 @@ fi
 
     if test $ac_cv_lib_dnet_dnet_ntoa = no; then
       echo $ac_n "checking for dnet_ntoa in -ldnet_stub""... $ac_c" 1>&6
-echo "configure:2792: checking for dnet_ntoa in -ldnet_stub" >&5
+echo "configure:2799: checking for dnet_ntoa in -ldnet_stub" >&5
 ac_lib_var=`echo dnet_stub'_'dnet_ntoa | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -2785,7 +2792,7 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-ldnet_stub  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 2800 "configure"
+#line 2807 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -2796,7 +2803,7 @@ int main() {
 dnet_ntoa()
 ; return 0; }
 EOF
-if { (eval echo configure:2811: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:2818: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -2825,12 +2832,12 @@ fi
     # The nsl library prevents programs from opening the X display
     # on Irix 5.2, according to dickey@clark.net.
     echo $ac_n "checking for gethostbyname""... $ac_c" 1>&6
-echo "configure:2840: checking for gethostbyname" >&5
+echo "configure:2847: checking for gethostbyname" >&5
 if eval "test \"`echo '$''{'ac_cv_func_gethostbyname'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 2845 "configure"
+#line 2852 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char gethostbyname(); below.  */
@@ -2853,7 +2860,7 @@ gethostbyname();
 
 ; return 0; }
 EOF
-if { (eval echo configure:2868: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:2875: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_func_gethostbyname=yes"
 else
@@ -2874,7 +2881,7 @@ fi
 
     if test $ac_cv_func_gethostbyname = no; then
       echo $ac_n "checking for gethostbyname in -lnsl""... $ac_c" 1>&6
-echo "configure:2889: checking for gethostbyname in -lnsl" >&5
+echo "configure:2896: checking for gethostbyname in -lnsl" >&5
 ac_lib_var=`echo nsl'_'gethostbyname | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -2882,7 +2889,7 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-lnsl  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 2897 "configure"
+#line 2904 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -2893,7 +2900,7 @@ int main() {
 gethostbyname()
 ; return 0; }
 EOF
-if { (eval echo configure:2908: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:2915: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -2923,12 +2930,12 @@ fi
     # -lsocket must be given before -lnsl if both are needed.
     # We assume that if connect needs -lnsl, so does gethostbyname.
     echo $ac_n "checking for connect""... $ac_c" 1>&6
-echo "configure:2938: checking for connect" >&5
+echo "configure:2945: checking for connect" >&5
 if eval "test \"`echo '$''{'ac_cv_func_connect'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 2943 "configure"
+#line 2950 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char connect(); below.  */
@@ -2951,7 +2958,7 @@ connect();
 
 ; return 0; }
 EOF
-if { (eval echo configure:2966: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:2973: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_func_connect=yes"
 else
@@ -2972,7 +2979,7 @@ fi
 
     if test $ac_cv_func_connect = no; then
       echo $ac_n "checking for connect in -lsocket""... $ac_c" 1>&6
-echo "configure:2987: checking for connect in -lsocket" >&5
+echo "configure:2994: checking for connect in -lsocket" >&5
 ac_lib_var=`echo socket'_'connect | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -2980,7 +2987,7 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-lsocket $X_EXTRA_LIBS $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 2995 "configure"
+#line 3002 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -2991,7 +2998,7 @@ int main() {
 connect()
 ; return 0; }
 EOF
-if { (eval echo configure:3006: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:3013: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -3015,12 +3022,12 @@ fi
 
     # gomez@mi.uni-erlangen.de says -lposix is necessary on A/UX.
     echo $ac_n "checking for remove""... $ac_c" 1>&6
-echo "configure:3030: checking for remove" >&5
+echo "configure:3037: checking for remove" >&5
 if eval "test \"`echo '$''{'ac_cv_func_remove'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 3035 "configure"
+#line 3042 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char remove(); below.  */
@@ -3043,7 +3050,7 @@ remove();
 
 ; return 0; }
 EOF
-if { (eval echo configure:3058: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:3065: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_func_remove=yes"
 else
@@ -3064,7 +3071,7 @@ fi
 
     if test $ac_cv_func_remove = no; then
       echo $ac_n "checking for remove in -lposix""... $ac_c" 1>&6
-echo "configure:3079: checking for remove in -lposix" >&5
+echo "configure:3086: checking for remove in -lposix" >&5
 ac_lib_var=`echo posix'_'remove | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -3072,7 +3079,7 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-lposix  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 3087 "configure"
+#line 3094 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -3083,7 +3090,7 @@ int main() {
 remove()
 ; return 0; }
 EOF
-if { (eval echo configure:3098: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:3105: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -3107,12 +3114,12 @@ fi
 
     # BSDI BSD/OS 2.1 needs -lipc for XOpenDisplay.
     echo $ac_n "checking for shmat""... $ac_c" 1>&6
-echo "configure:3122: checking for shmat" >&5
+echo "configure:3129: checking for shmat" >&5
 if eval "test \"`echo '$''{'ac_cv_func_shmat'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 3127 "configure"
+#line 3134 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char shmat(); below.  */
@@ -3135,7 +3142,7 @@ shmat();
 
 ; return 0; }
 EOF
-if { (eval echo configure:3150: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:3157: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_func_shmat=yes"
 else
@@ -3156,7 +3163,7 @@ fi
 
     if test $ac_cv_func_shmat = no; then
       echo $ac_n "checking for shmat in -lipc""... $ac_c" 1>&6
-echo "configure:3171: checking for shmat in -lipc" >&5
+echo "configure:3178: checking for shmat in -lipc" >&5
 ac_lib_var=`echo ipc'_'shmat | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -3164,7 +3171,7 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-lipc  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 3179 "configure"
+#line 3186 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -3175,7 +3182,7 @@ int main() {
 shmat()
 ; return 0; }
 EOF
-if { (eval echo configure:3190: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:3197: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -3208,7 +3215,7 @@ fi
   # libraries we check for below, so use a different variable.
   #  --interran@uluru.Stanford.EDU, kb@cs.umb.edu.
   echo $ac_n "checking for IceConnectionNumber in -lICE""... $ac_c" 1>&6
-echo "configure:3223: checking for IceConnectionNumber in -lICE" >&5
+echo "configure:3230: checking for IceConnectionNumber in -lICE" >&5
 ac_lib_var=`echo ICE'_'IceConnectionNumber | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -3216,7 +3223,7 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-lICE $X_EXTRA_LIBS $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 3231 "configure"
+#line 3238 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -3227,7 +3234,7 @@ int main() {
 IceConnectionNumber()
 ; return 0; }
 EOF
-if { (eval echo configure:3242: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:3249: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -3258,7 +3265,7 @@ fi
 
 
     echo $ac_n "checking for X app-defaults directory""... $ac_c" 1>&6
-echo "configure:3273: checking for X app-defaults directory" >&5
+echo "configure:3280: checking for X app-defaults directory" >&5
 if eval "test \"`echo '$''{'ac_cv_x_app_defaults'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -3457,7 +3464,7 @@ case "$host" in
 
         # Some versions of Slowlaris Motif require -lgen.  But not all.  Why?
         echo $ac_n "checking for regcmp in -lgen""... $ac_c" 1>&6
-echo "configure:3472: checking for regcmp in -lgen" >&5
+echo "configure:3479: checking for regcmp in -lgen" >&5
 ac_lib_var=`echo gen'_'regcmp | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -3465,7 +3472,7 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-lgen  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 3480 "configure"
+#line 3487 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -3476,7 +3483,7 @@ int main() {
 regcmp()
 ; return 0; }
 EOF
-if { (eval echo configure:3491: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:3498: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -3500,7 +3507,7 @@ fi
     ;;
   esac
 echo $ac_n "checking for XPointer""... $ac_c" 1>&6
-echo "configure:3515: checking for XPointer" >&5
+echo "configure:3522: checking for XPointer" >&5
 if eval "test \"`echo '$''{'ac_cv_xpointer'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -3511,14 +3518,14 @@ else
   fi
   CPPFLAGS="$CPPFLAGS $X_CFLAGS"
   cat > conftest.$ac_ext <<EOF
-#line 3526 "configure"
+#line 3533 "configure"
 #include "confdefs.h"
 #include <X11/Xlib.h>
 int main() {
 XPointer foo = (XPointer) 0;
 ; return 0; }
 EOF
-if { (eval echo configure:3533: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:3540: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   ac_cv_xpointer=yes
 else
@@ -3556,17 +3563,17 @@ have_xmu=no
   CPPFLAGS="$CPPFLAGS $X_CFLAGS"
   ac_safe=`echo "X11/Xmu/Error.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for X11/Xmu/Error.h""... $ac_c" 1>&6
-echo "configure:3571: checking for X11/Xmu/Error.h" >&5
+echo "configure:3578: checking for X11/Xmu/Error.h" >&5
 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 3576 "configure"
+#line 3583 "configure"
 #include "confdefs.h"
 #include <X11/Xmu/Error.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:3581: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:3588: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -3591,13 +3598,11 @@ fi
 if test "$have_xmu" = no ; then
   XMU_SRCS='$(UTILS_SRC)/xmu.c'
   XMU_OBJS='$(UTILS_BIN)/xmu.o'
+  XMU_LIBS=''
 else
   XMU_SRCS=''
   XMU_OBJS=''
-  SAVER_LIBS="-lXmu $SAVER_LIBS"
-  HACK_LIBS="-lXmu $HACK_LIBS"
-  MOTIF_LIBS="-lXmu $MOTIF_LIBS"
-  GTK_LIBS="-lXmu $GTK_LIBS"
+  XMU_LIBS='-lXmu'
   cat >> confdefs.h <<\EOF
 #define HAVE_XMU 1
 EOF
@@ -3617,7 +3622,7 @@ if test "$have_xmu" = yes ; then
   case "$host" in
     *-sunos4*)
     echo $ac_n "checking for the SunOS 4.1.x _get_wmShellWidgetClass bug""... $ac_c" 1>&6
-echo "configure:3632: checking for the SunOS 4.1.x _get_wmShellWidgetClass bug" >&5
+echo "configure:3637: checking for the SunOS 4.1.x _get_wmShellWidgetClass bug" >&5
 if eval "test \"`echo '$''{'ac_cv_sunos_xmu_bug'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -3630,14 +3635,14 @@ else
                     # with X libraries because we know it's SunOS.
                     LDFLAGS="$LDFLAGS -lXmu -lXt -lX11 -lXext -lm"
                     cat > conftest.$ac_ext <<EOF
-#line 3645 "configure"
+#line 3650 "configure"
 #include "confdefs.h"
 
 int main() {
 
 ; return 0; }
 EOF
-if { (eval echo configure:3652: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:3657: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   ac_cv_sunos_xmu_bug=no
 else
@@ -3653,21 +3658,21 @@ fi
 echo "$ac_t""$ac_cv_sunos_xmu_bug" 1>&6
     if test "$ac_cv_sunos_xmu_bug" = yes ; then
       echo $ac_n "checking whether the compiler understands -static""... $ac_c" 1>&6
-echo "configure:3668: checking whether the compiler understands -static" >&5
+echo "configure:3673: checking whether the compiler understands -static" >&5
 if eval "test \"`echo '$''{'ac_cv_ld_static'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   ac_save_LDFLAGS="$LDFLAGS"
                       LDFLAGS="$LDFLAGS -static"
                       cat > conftest.$ac_ext <<EOF
-#line 3675 "configure"
+#line 3680 "configure"
 #include "confdefs.h"
 
 int main() {
 
 ; return 0; }
 EOF
-if { (eval echo configure:3682: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:3687: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   ac_cv_ld_static=yes
 else
@@ -3750,7 +3755,7 @@ fi
 
     /*)
      echo $ac_n "checking for SGI SCREEN_SAVER headers""... $ac_c" 1>&6
-echo "configure:3765: checking for SGI SCREEN_SAVER headers" >&5
+echo "configure:3770: checking for SGI SCREEN_SAVER headers" >&5
      d=$with_sgi/include
      if test -d $d; then
        X_CFLAGS="-I$d $X_CFLAGS"
@@ -3760,7 +3765,7 @@ echo "configure:3765: checking for SGI SCREEN_SAVER headers" >&5
      fi
 
      echo $ac_n "checking for SGI SCREEN_SAVER libs""... $ac_c" 1>&6
-echo "configure:3775: checking for SGI SCREEN_SAVER libs" >&5
+echo "configure:3780: checking for SGI SCREEN_SAVER libs" >&5
      d=$with_sgi/lib
      if test -d $d; then
        X_LIBS="-L$d $X_LIBS"
@@ -3793,17 +3798,17 @@ if test "$with_sgi" = yes; then
   CPPFLAGS="$CPPFLAGS $X_CFLAGS"
   ac_safe=`echo "X11/extensions/XScreenSaver.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for X11/extensions/XScreenSaver.h""... $ac_c" 1>&6
-echo "configure:3808: checking for X11/extensions/XScreenSaver.h" >&5
+echo "configure:3813: checking for X11/extensions/XScreenSaver.h" >&5
 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 3813 "configure"
+#line 3818 "configure"
 #include "confdefs.h"
 #include <X11/extensions/XScreenSaver.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:3818: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:3823: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -3860,7 +3865,7 @@ fi
 
     /*)
      echo $ac_n "checking for MIT-SCREEN-SAVER headers""... $ac_c" 1>&6
-echo "configure:3875: checking for MIT-SCREEN-SAVER headers" >&5
+echo "configure:3880: checking for MIT-SCREEN-SAVER headers" >&5
      d=$with_mit/include
      if test -d $d; then
        X_CFLAGS="-I$d $X_CFLAGS"
@@ -3870,7 +3875,7 @@ echo "configure:3875: checking for MIT-SCREEN-SAVER headers" >&5
      fi
 
      echo $ac_n "checking for MIT-SCREEN-SAVER libs""... $ac_c" 1>&6
-echo "configure:3885: checking for MIT-SCREEN-SAVER libs" >&5
+echo "configure:3890: checking for MIT-SCREEN-SAVER libs" >&5
      d=$with_mit/lib
      if test -d $d; then
        X_LIBS="-L$d $X_LIBS"
@@ -3903,17 +3908,17 @@ if test "$with_mit" = yes; then
   CPPFLAGS="$CPPFLAGS $X_CFLAGS"
   ac_safe=`echo "X11/extensions/scrnsaver.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for X11/extensions/scrnsaver.h""... $ac_c" 1>&6
-echo "configure:3918: checking for X11/extensions/scrnsaver.h" >&5
+echo "configure:3923: checking for X11/extensions/scrnsaver.h" >&5
 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 3923 "configure"
+#line 3928 "configure"
 #include "confdefs.h"
 #include <X11/extensions/scrnsaver.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:3928: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:3933: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -3958,7 +3963,7 @@ fi
   LDFLAGS="$LDFLAGS $X_LIBS $X_EXTRA_LIBS"
 
   echo $ac_n "checking for XScreenSaverRegister in -lXext""... $ac_c" 1>&6
-echo "configure:3973: checking for XScreenSaverRegister in -lXext" >&5
+echo "configure:3978: checking for XScreenSaverRegister in -lXext" >&5
 ac_lib_var=`echo Xext'_'XScreenSaverRegister | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -3966,7 +3971,7 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-lXext -lm $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 3981 "configure"
+#line 3986 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -3977,7 +3982,7 @@ int main() {
 XScreenSaverRegister()
 ; return 0; }
 EOF
-if { (eval echo configure:3992: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:3997: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -4024,7 +4029,7 @@ fi
   LDFLAGS="$LDFLAGS $X_LIBS $X_EXTRA_LIBS"
 
   echo $ac_n "checking for XScreenSaverRegister in -lXExExt""... $ac_c" 1>&6
-echo "configure:4039: checking for XScreenSaverRegister in -lXExExt" >&5
+echo "configure:4044: checking for XScreenSaverRegister in -lXExExt" >&5
 ac_lib_var=`echo XExExt'_'XScreenSaverRegister | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -4032,7 +4037,7 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-lXExExt -lX11 -lXext -lm $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 4047 "configure"
+#line 4052 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -4043,7 +4048,7 @@ int main() {
 XScreenSaverRegister()
 ; return 0; }
 EOF
-if { (eval echo configure:4058: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:4063: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -4093,7 +4098,7 @@ fi
   LDFLAGS="$LDFLAGS $X_LIBS $X_EXTRA_LIBS"
 
   echo $ac_n "checking for XScreenSaverRegister in -lXss""... $ac_c" 1>&6
-echo "configure:4108: checking for XScreenSaverRegister in -lXss" >&5
+echo "configure:4113: checking for XScreenSaverRegister in -lXss" >&5
 ac_lib_var=`echo Xss'_'XScreenSaverRegister | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -4101,7 +4106,7 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-lXss -lX11 -lXext -lm $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 4116 "configure"
+#line 4121 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -4112,7 +4117,7 @@ int main() {
 XScreenSaverRegister()
 ; return 0; }
 EOF
-if { (eval echo configure:4127: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:4132: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -4178,7 +4183,7 @@ fi
 
     /*)
      echo $ac_n "checking for XIDLE headers""... $ac_c" 1>&6
-echo "configure:4193: checking for XIDLE headers" >&5
+echo "configure:4198: checking for XIDLE headers" >&5
      d=$with_xidle/include
      if test -d $d; then
        X_CFLAGS="-I$d $X_CFLAGS"
@@ -4188,7 +4193,7 @@ echo "configure:4193: checking for XIDLE headers" >&5
      fi
 
      echo $ac_n "checking for XIDLE libs""... $ac_c" 1>&6
-echo "configure:4203: checking for XIDLE libs" >&5
+echo "configure:4208: checking for XIDLE libs" >&5
      d=$with_xidle/lib
      if test -d $d; then
        X_LIBS="-L$d $X_LIBS"
@@ -4221,17 +4226,17 @@ if test "$with_xidle" = yes; then
   CPPFLAGS="$CPPFLAGS $X_CFLAGS"
   ac_safe=`echo "X11/extensions/xidle.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for X11/extensions/xidle.h""... $ac_c" 1>&6
-echo "configure:4236: checking for X11/extensions/xidle.h" >&5
+echo "configure:4241: checking for X11/extensions/xidle.h" >&5
 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 4241 "configure"
+#line 4246 "configure"
 #include "confdefs.h"
 #include <X11/extensions/xidle.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:4246: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:4251: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -4287,7 +4292,7 @@ fi
 
     /*)
      echo $ac_n "checking for SGI-VIDEO-CONTROL headers""... $ac_c" 1>&6
-echo "configure:4302: checking for SGI-VIDEO-CONTROL headers" >&5
+echo "configure:4307: checking for SGI-VIDEO-CONTROL headers" >&5
      d=$with_sgivc/include
      if test -d $d; then
        X_CFLAGS="-I$d $X_CFLAGS"
@@ -4297,7 +4302,7 @@ echo "configure:4302: checking for SGI-VIDEO-CONTROL headers" >&5
      fi
 
      echo $ac_n "checking for SGI-VIDEO-CONTROL libs""... $ac_c" 1>&6
-echo "configure:4312: checking for SGI-VIDEO-CONTROL libs" >&5
+echo "configure:4317: checking for SGI-VIDEO-CONTROL libs" >&5
      d=$with_sgivc/lib
      if test -d $d; then
        X_LIBS="-L$d $X_LIBS"
@@ -4332,17 +4337,17 @@ if test "$with_sgivc" = yes; then
   CPPFLAGS="$CPPFLAGS $X_CFLAGS"
   ac_safe=`echo "X11/extensions/XSGIvc.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for X11/extensions/XSGIvc.h""... $ac_c" 1>&6
-echo "configure:4347: checking for X11/extensions/XSGIvc.h" >&5
+echo "configure:4352: checking for X11/extensions/XSGIvc.h" >&5
 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 4352 "configure"
+#line 4357 "configure"
 #include "confdefs.h"
 #include <X11/extensions/XSGIvc.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:4357: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:4362: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -4386,7 +4391,7 @@ fi
   LDFLAGS="$LDFLAGS $X_LIBS $X_EXTRA_LIBS"
 
   echo $ac_n "checking for XSGIvcQueryGammaMap in -lXsgivc""... $ac_c" 1>&6
-echo "configure:4401: checking for XSGIvcQueryGammaMap in -lXsgivc" >&5
+echo "configure:4406: checking for XSGIvcQueryGammaMap in -lXsgivc" >&5
 ac_lib_var=`echo Xsgivc'_'XSGIvcQueryGammaMap | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -4394,7 +4399,7 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-lXsgivc -lXext -lX11 $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 4409 "configure"
+#line 4414 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -4405,7 +4410,7 @@ int main() {
 XSGIvcQueryGammaMap()
 ; return 0; }
 EOF
-if { (eval echo configure:4420: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:4425: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -4470,7 +4475,7 @@ fi
 
     /*)
      echo $ac_n "checking for DPMS headers""... $ac_c" 1>&6
-echo "configure:4485: checking for DPMS headers" >&5
+echo "configure:4490: checking for DPMS headers" >&5
      d=$with_dpms/include
      if test -d $d; then
        X_CFLAGS="-I$d $X_CFLAGS"
@@ -4480,7 +4485,7 @@ echo "configure:4485: checking for DPMS headers" >&5
      fi
 
      echo $ac_n "checking for DPMS libs""... $ac_c" 1>&6
-echo "configure:4495: checking for DPMS libs" >&5
+echo "configure:4500: checking for DPMS libs" >&5
      d=$with_dpms/lib
      if test -d $d; then
        X_LIBS="-L$d $X_LIBS"
@@ -4515,17 +4520,17 @@ if test "$with_dpms" = yes; then
   CPPFLAGS="$CPPFLAGS $X_CFLAGS"
   ac_safe=`echo "X11/extensions/dpms.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for X11/extensions/dpms.h""... $ac_c" 1>&6
-echo "configure:4530: checking for X11/extensions/dpms.h" >&5
+echo "configure:4535: checking for X11/extensions/dpms.h" >&5
 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 4535 "configure"
+#line 4540 "configure"
 #include "confdefs.h"
 #include <X11/extensions/dpms.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:4540: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:4545: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -4571,7 +4576,7 @@ fi
   LDFLAGS="$LDFLAGS $X_LIBS $X_EXTRA_LIBS"
 
   echo $ac_n "checking for DPMSInfo in -lXext""... $ac_c" 1>&6
-echo "configure:4586: checking for DPMSInfo in -lXext" >&5
+echo "configure:4591: checking for DPMSInfo in -lXext" >&5
 ac_lib_var=`echo Xext'_'DPMSInfo | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -4579,7 +4584,7 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-lXext -lXext -lX11 $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 4594 "configure"
+#line 4599 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -4590,7 +4595,7 @@ int main() {
 DPMSInfo()
 ; return 0; }
 EOF
-if { (eval echo configure:4605: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:4610: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -4636,7 +4641,7 @@ fi
   LDFLAGS="$LDFLAGS $X_LIBS $X_EXTRA_LIBS"
 
   echo $ac_n "checking for DPMSInfo in -lXdpms""... $ac_c" 1>&6
-echo "configure:4651: checking for DPMSInfo in -lXdpms" >&5
+echo "configure:4656: checking for DPMSInfo in -lXdpms" >&5
 ac_lib_var=`echo Xdpms'_'DPMSInfo | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -4644,7 +4649,7 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-lXdpms -lXext -lX11 $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 4659 "configure"
+#line 4664 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -4655,7 +4660,7 @@ int main() {
 DPMSInfo()
 ; return 0; }
 EOF
-if { (eval echo configure:4670: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:4675: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -4700,7 +4705,7 @@ fi
 
 ###############################################################################
 #
-#       Check for the XF86VMODE server extension.
+#       Check for the XF86VMODE server extension (for virtual screens.)
 #
 ###############################################################################
 
@@ -4722,7 +4727,7 @@ fi
 
     /*)
      echo $ac_n "checking for xf86vmode headers""... $ac_c" 1>&6
-echo "configure:4737: checking for xf86vmode headers" >&5
+echo "configure:4742: checking for xf86vmode headers" >&5
      d=$with_xf86vmode/include
      if test -d $d; then
        X_CFLAGS="-I$d $X_CFLAGS"
@@ -4732,7 +4737,7 @@ echo "configure:4737: checking for xf86vmode headers" >&5
      fi
 
      echo $ac_n "checking for xf86vmode libs""... $ac_c" 1>&6
-echo "configure:4747: checking for xf86vmode libs" >&5
+echo "configure:4752: checking for xf86vmode libs" >&5
      d=$with_xf86vmode/lib
      if test -d $d; then
        X_LIBS="-L$d $X_LIBS"
@@ -4767,17 +4772,17 @@ if test "$with_xf86vmode" = yes; then
   CPPFLAGS="$CPPFLAGS $X_CFLAGS"
   ac_safe=`echo "X11/extensions/xf86vmode.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for X11/extensions/xf86vmode.h""... $ac_c" 1>&6
-echo "configure:4782: checking for X11/extensions/xf86vmode.h" >&5
+echo "configure:4787: checking for X11/extensions/xf86vmode.h" >&5
 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 4787 "configure"
+#line 4792 "configure"
 #include "confdefs.h"
 #include <X11/extensions/xf86vmode.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:4792: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:4797: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -4821,7 +4826,7 @@ fi
   LDFLAGS="$LDFLAGS $X_LIBS $X_EXTRA_LIBS"
 
   echo $ac_n "checking for XF86VidModeGetViewPort in -lXxf86vm""... $ac_c" 1>&6
-echo "configure:4836: checking for XF86VidModeGetViewPort in -lXxf86vm" >&5
+echo "configure:4841: checking for XF86VidModeGetViewPort in -lXxf86vm" >&5
 ac_lib_var=`echo Xxf86vm'_'XF86VidModeGetViewPort | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -4829,7 +4834,7 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-lXxf86vm -lXext -lX11 $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 4844 "configure"
+#line 4849 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -4840,7 +4845,7 @@ int main() {
 XF86VidModeGetViewPort()
 ; return 0; }
 EOF
-if { (eval echo configure:4855: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:4860: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -4881,6 +4886,198 @@ elif test "$with_xf86vmode" != no; then
 fi
 
 
+###############################################################################
+#
+#       Check for the XF86VMODE server extension (for gamma fading.)
+#
+###############################################################################
+
+have_xf86gamma=no
+with_xf86gamma_req=unspecified
+# Check whether --with-xf86gamma-ext or --without-xf86gamma-ext was given.
+if test "${with_xf86gamma_ext+set}" = set; then
+  withval="$with_xf86gamma_ext"
+  with_xf86gamma="$withval"; with_xf86gamma_req="$withval"
+else
+  with_xf86gamma=yes
+fi
+
+
+
+   case "$with_xf86gamma" in
+    yes) ;;
+    no)  ;;
+
+    /*)
+     echo $ac_n "checking for xf86gamma headers""... $ac_c" 1>&6
+echo "configure:4925: checking for xf86gamma headers" >&5
+     d=$with_xf86gamma/include
+     if test -d $d; then
+       X_CFLAGS="-I$d $X_CFLAGS"
+       echo "$ac_t""$d" 1>&6
+     else
+       echo "$ac_t""not found ($d: no such directory)" 1>&6
+     fi
+
+     echo $ac_n "checking for xf86gamma libs""... $ac_c" 1>&6
+echo "configure:4935: checking for xf86gamma libs" >&5
+     d=$with_xf86gamma/lib
+     if test -d $d; then
+       X_LIBS="-L$d $X_LIBS"
+       echo "$ac_t""$d" 1>&6
+     else
+       echo "$ac_t""not found ($d: no such directory)" 1>&6
+     fi
+
+     # replace the directory string with "yes".
+     with_xf86gamma_req="yes"
+     with_xf86gamma=$with_xf86gamma_req
+     ;;
+
+    *)
+     echo ""
+     echo "error: argument to --with-xf86gamma-ext must be \"yes\", \"no\", or a directory."
+     echo "       If it is a directory, then \`DIR/include' will be added to"
+     echo "       the -I list, and \`DIR/lib' will be added to the -L list."
+     exit 1
+     ;;
+   esac
+  
+
+if test "$with_xf86gamma" = yes; then
+
+  # first check for xf86vmode.h, if we haven't already
+  if test "$have_xf86vmode" = yes; then
+    have_xf86gamma=yes
+  else
+    
+  ac_save_CPPFLAGS="$CPPFLAGS"
+  if test \! -z "$includedir" ; then 
+    CPPFLAGS="$CPPFLAGS -I$includedir"
+  fi
+  CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+  ac_safe=`echo "X11/extensions/xf86vmode.h" | sed 'y%./+-%__p_%'`
+echo $ac_n "checking for X11/extensions/xf86vmode.h""... $ac_c" 1>&6
+echo "configure:4973: checking for X11/extensions/xf86vmode.h" >&5
+if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 4978 "configure"
+#include "confdefs.h"
+#include <X11/extensions/xf86vmode.h>
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:4983: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+  rm -rf conftest*
+  eval "ac_cv_header_$ac_safe=yes"
+else
+  echo "$ac_err" >&5
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_header_$ac_safe=no"
+fi
+rm -f conftest*
+fi
+if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+  have_xf86gamma=yes
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+  CPPFLAGS="$ac_save_CPPFLAGS"
+  fi
+
+  # if that succeeded, then check for the -lXxf86vm
+  if test "$have_xf86gamma" = yes; then
+    have_xf86gamma=no
+    
+  ac_save_CPPFLAGS="$CPPFLAGS"
+  ac_save_LDFLAGS="$LDFLAGS"
+#  ac_save_LIBS="$LIBS"
+
+  if test \! -z "$includedir" ; then 
+    CPPFLAGS="$CPPFLAGS -I$includedir"
+  fi
+  # note: $X_CFLAGS includes $x_includes
+  CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+
+  if test \! -z "$libdir" ; then
+    LDFLAGS="$LDFLAGS -L$libdir"
+  fi
+  # note: $X_LIBS includes $x_libraries
+  LDFLAGS="$LDFLAGS $X_LIBS $X_EXTRA_LIBS"
+
+  echo $ac_n "checking for XF86VidModeSetGamma in -lXxf86vm""... $ac_c" 1>&6
+echo "configure:5028: checking for XF86VidModeSetGamma in -lXxf86vm" >&5
+ac_lib_var=`echo Xxf86vm'_'XF86VidModeSetGamma | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  ac_save_LIBS="$LIBS"
+LIBS="-lXxf86vm -lXext -lX11 $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 5036 "configure"
+#include "confdefs.h"
+/* Override any gcc2 internal prototype to avoid an error.  */
+/* We use char because int might match the return type of a gcc2
+    builtin and then its argument prototype would still apply.  */
+char XF86VidModeSetGamma();
+
+int main() {
+XF86VidModeSetGamma()
+; return 0; }
+EOF
+if { (eval echo configure:5047: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  rm -rf conftest*
+  eval "ac_cv_lib_$ac_lib_var=yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_lib_$ac_lib_var=no"
+fi
+rm -f conftest*
+LIBS="$ac_save_LIBS"
+
+fi
+if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+  have_xf86gamma=yes
+else
+  echo "$ac_t""no" 1>&6
+true
+fi
+
+  CPPFLAGS="$ac_save_CPPFLAGS"
+  LDFLAGS="$ac_save_LDFLAGS"
+#  LIBS="$ac_save_LIBS"
+  
+  fi
+
+  # pull in the lib, if we haven't already
+  if test "$have_xf86gamma" = yes -a "$have_xf86vmode" = no; then
+    SAVER_LIBS="$SAVER_LIBS -lXxf86vm"
+  fi
+
+  # if that succeeded, then we've really got it.
+  if test "$have_xf86gamma" = yes; then
+    cat >> confdefs.h <<\EOF
+#define HAVE_XF86VMODE_GAMMA 1
+EOF
+
+  fi
+
+elif test "$with_xf86gamma" != no; then
+  echo "error: must be yes or no: --with-xf86gamma-ext=$with_xf86vmode"
+  exit 1
+fi
+
+
 ###############################################################################
 #
 #       Check for HP XHPDisableReset and XHPEnableReset.
@@ -4894,7 +5091,7 @@ fi
   fi
   CPPFLAGS="$CPPFLAGS $X_CFLAGS"
   cat > conftest.$ac_ext <<EOF
-#line 4909 "configure"
+#line 5106 "configure"
 #include "confdefs.h"
 #include <X11/XHPlib.h>
 EOF
@@ -4932,7 +5129,7 @@ fi
 if test "$with_proc_interrupts" = yes; then
 
    echo $ac_n "checking whether /proc/interrupts contains keyboard data""... $ac_c" 1>&6
-echo "configure:4947: checking whether /proc/interrupts contains keyboard data" >&5
+echo "configure:5144: checking whether /proc/interrupts contains keyboard data" >&5
 if eval "test \"`echo '$''{'ac_cv_have_proc_interrupts'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -5065,7 +5262,7 @@ fi
 
     /*)
      echo $ac_n "checking for PAM headers""... $ac_c" 1>&6
-echo "configure:5080: checking for PAM headers" >&5
+echo "configure:5277: checking for PAM headers" >&5
      d=$with_pam/include
      if test -d $d; then
        X_CFLAGS="-I$d $X_CFLAGS"
@@ -5075,7 +5272,7 @@ echo "configure:5080: checking for PAM headers" >&5
      fi
 
      echo $ac_n "checking for PAM libs""... $ac_c" 1>&6
-echo "configure:5090: checking for PAM libs" >&5
+echo "configure:5287: checking for PAM libs" >&5
      d=$with_pam/lib
      if test -d $d; then
        X_LIBS="-L$d $X_LIBS"
@@ -5101,7 +5298,7 @@ echo "configure:5090: checking for PAM libs" >&5
 
 if test "$enable_locking" = yes -a "$with_pam" = yes; then
   echo $ac_n "checking for PAM""... $ac_c" 1>&6
-echo "configure:5116: checking for PAM" >&5
+echo "configure:5313: checking for PAM" >&5
 if eval "test \"`echo '$''{'ac_cv_pam'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -5112,14 +5309,14 @@ else
   fi
   CPPFLAGS="$CPPFLAGS $X_CFLAGS"
   cat > conftest.$ac_ext <<EOF
-#line 5127 "configure"
+#line 5324 "configure"
 #include "confdefs.h"
 #include <security/pam_appl.h>
 int main() {
 
 ; return 0; }
 EOF
-if { (eval echo configure:5134: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:5331: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   ac_cv_pam=yes
 else
@@ -5144,7 +5341,7 @@ EOF
     # libpam typically requires dlopen and dlsym.  On FreeBSD,
     # those are in libc.  On Linux and Solaris, they're in libdl.
     echo $ac_n "checking for dlopen in -ldl""... $ac_c" 1>&6
-echo "configure:5159: checking for dlopen in -ldl" >&5
+echo "configure:5356: checking for dlopen in -ldl" >&5
 ac_lib_var=`echo dl'_'dlopen | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -5152,7 +5349,7 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-ldl  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 5167 "configure"
+#line 5364 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -5163,7 +5360,7 @@ int main() {
 dlopen()
 ; return 0; }
 EOF
-if { (eval echo configure:5178: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:5375: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -5185,12 +5382,12 @@ fi
 
 
     echo $ac_n "checking how to call pam_strerror""... $ac_c" 1>&6
-echo "configure:5200: checking how to call pam_strerror" >&5
+echo "configure:5397: checking how to call pam_strerror" >&5
     if eval "test \"`echo '$''{'ac_cv_pam_strerror_args'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 5205 "configure"
+#line 5402 "configure"
 #include "confdefs.h"
 #include <stdio.h>
                       #include <stdlib.h>
@@ -5200,7 +5397,7 @@ pam_handle_t *pamh = 0;
                       char *s = pam_strerror(pamh, PAM_SUCCESS);
 ; return 0; }
 EOF
-if { (eval echo configure:5215: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:5412: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   ac_pam_strerror_args=2
 else
@@ -5208,7 +5405,7 @@ else
   cat conftest.$ac_ext >&5
   rm -rf conftest*
   cat > conftest.$ac_ext <<EOF
-#line 5223 "configure"
+#line 5420 "configure"
 #include "confdefs.h"
 #include <stdio.h>
                                       #include <stdlib.h>
@@ -5218,7 +5415,7 @@ char *s =
                                        pam_strerror(PAM_SUCCESS);
 ; return 0; }
 EOF
-if { (eval echo configure:5233: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:5430: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   ac_pam_strerror_args=1
 else
@@ -5275,7 +5472,7 @@ fi
 
     /*)
      echo $ac_n "checking for Kerberos headers""... $ac_c" 1>&6
-echo "configure:5290: checking for Kerberos headers" >&5
+echo "configure:5487: checking for Kerberos headers" >&5
      d=$with_kerberos/include
      if test -d $d; then
        X_CFLAGS="-I$d $X_CFLAGS"
@@ -5285,7 +5482,7 @@ echo "configure:5290: checking for Kerberos headers" >&5
      fi
 
      echo $ac_n "checking for Kerberos libs""... $ac_c" 1>&6
-echo "configure:5300: checking for Kerberos libs" >&5
+echo "configure:5497: checking for Kerberos libs" >&5
      d=$with_kerberos/lib
      if test -d $d; then
        X_LIBS="-L$d $X_LIBS"
@@ -5311,7 +5508,7 @@ echo "configure:5300: checking for Kerberos libs" >&5
 
 if test "$enable_locking" = yes -a "$with_kerberos" = yes; then
   echo $ac_n "checking for Kerberos 4""... $ac_c" 1>&6
-echo "configure:5326: checking for Kerberos 4" >&5
+echo "configure:5523: checking for Kerberos 4" >&5
 if eval "test \"`echo '$''{'ac_cv_kerberos'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -5322,14 +5519,14 @@ else
   fi
   CPPFLAGS="$CPPFLAGS $X_CFLAGS"
   cat > conftest.$ac_ext <<EOF
-#line 5337 "configure"
+#line 5534 "configure"
 #include "confdefs.h"
 #include <krb.h>
 int main() {
 
 ; return 0; }
 EOF
-if { (eval echo configure:5344: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:5541: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   ac_cv_kerberos=yes
 else
@@ -5344,7 +5541,7 @@ fi
 
 echo "$ac_t""$ac_cv_kerberos" 1>&6
   echo $ac_n "checking for Kerberos 5""... $ac_c" 1>&6
-echo "configure:5359: checking for Kerberos 5" >&5
+echo "configure:5556: checking for Kerberos 5" >&5
 if eval "test \"`echo '$''{'ac_cv_kerberos5'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -5355,14 +5552,14 @@ else
   fi
   CPPFLAGS="$CPPFLAGS $X_CFLAGS"
   cat > conftest.$ac_ext <<EOF
-#line 5370 "configure"
+#line 5567 "configure"
 #include "confdefs.h"
 #include <kerberosIV/krb.h>
 int main() {
 
 ; return 0; }
 EOF
-if { (eval echo configure:5377: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:5574: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   ac_cv_kerberos5=yes
 else
@@ -5409,12 +5606,12 @@ EOF
 
   if test "$have_kerberos" = yes ; then
     echo $ac_n "checking for res_search""... $ac_c" 1>&6
-echo "configure:5424: checking for res_search" >&5
+echo "configure:5621: checking for res_search" >&5
 if eval "test \"`echo '$''{'ac_cv_func_res_search'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 5429 "configure"
+#line 5626 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char res_search(); below.  */
@@ -5437,7 +5634,7 @@ res_search();
 
 ; return 0; }
 EOF
-if { (eval echo configure:5452: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:5649: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_func_res_search=yes"
 else
@@ -5455,7 +5652,7 @@ if eval "test \"`echo '$ac_cv_func_'res_search`\" = yes"; then
 else
   echo "$ac_t""no" 1>&6
 echo $ac_n "checking for res_search in -lresolv""... $ac_c" 1>&6
-echo "configure:5470: checking for res_search in -lresolv" >&5
+echo "configure:5667: checking for res_search in -lresolv" >&5
 ac_lib_var=`echo resolv'_'res_search | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -5463,7 +5660,7 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-lresolv  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 5478 "configure"
+#line 5675 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -5474,7 +5671,7 @@ int main() {
 res_search()
 ; return 0; }
 EOF
-if { (eval echo configure:5489: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:5686: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -5529,7 +5726,7 @@ fi
 
     /*)
      echo $ac_n "checking for shadow password headers""... $ac_c" 1>&6
-echo "configure:5544: checking for shadow password headers" >&5
+echo "configure:5741: checking for shadow password headers" >&5
      d=$with_shadow/include
      if test -d $d; then
        X_CFLAGS="-I$d $X_CFLAGS"
@@ -5539,7 +5736,7 @@ echo "configure:5544: checking for shadow password headers" >&5
      fi
 
      echo $ac_n "checking for shadow password libs""... $ac_c" 1>&6
-echo "configure:5554: checking for shadow password libs" >&5
+echo "configure:5751: checking for shadow password libs" >&5
      d=$with_shadow/lib
      if test -d $d; then
        X_LIBS="-L$d $X_LIBS"
@@ -5577,7 +5774,7 @@ fi
 
 if test "$with_shadow" = yes ; then
   echo $ac_n "checking for Sun-style shadow passwords""... $ac_c" 1>&6
-echo "configure:5592: checking for Sun-style shadow passwords" >&5
+echo "configure:5789: checking for Sun-style shadow passwords" >&5
 if eval "test \"`echo '$''{'ac_cv_sun_adjunct'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -5588,7 +5785,7 @@ else
   fi
   CPPFLAGS="$CPPFLAGS $X_CFLAGS"
   cat > conftest.$ac_ext <<EOF
-#line 5603 "configure"
+#line 5800 "configure"
 #include "confdefs.h"
 #include <stdlib.h>
                                     #include <unistd.h>
@@ -5601,7 +5798,7 @@ struct passwd_adjunct *p = getpwanam("nobody");
                        const char *pw = p->pwa_passwd;
 ; return 0; }
 EOF
-if { (eval echo configure:5616: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:5813: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   ac_cv_sun_adjunct=yes
 else
@@ -5631,7 +5828,7 @@ fi
 
 if test "$with_shadow" = yes ; then
   echo $ac_n "checking for DEC-style shadow passwords""... $ac_c" 1>&6
-echo "configure:5646: checking for DEC-style shadow passwords" >&5
+echo "configure:5843: checking for DEC-style shadow passwords" >&5
 if eval "test \"`echo '$''{'ac_cv_enhanced_passwd'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -5642,7 +5839,7 @@ else
   fi
   CPPFLAGS="$CPPFLAGS $X_CFLAGS"
   cat > conftest.$ac_ext <<EOF
-#line 5657 "configure"
+#line 5854 "configure"
 #include "confdefs.h"
 #include <stdlib.h>
                                     #include <unistd.h>
@@ -5659,7 +5856,7 @@ struct pr_passwd *p;
                        pw = p->ufld.fd_encrypt;
 ; return 0; }
 EOF
-if { (eval echo configure:5674: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:5871: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   ac_cv_enhanced_passwd=yes
 else
@@ -5683,7 +5880,7 @@ echo "$ac_t""$ac_cv_enhanced_passwd" 1>&6
     # But on DEC, it's in -lsecurity.
     #
     echo $ac_n "checking for getprpwnam in -lprot""... $ac_c" 1>&6
-echo "configure:5698: checking for getprpwnam in -lprot" >&5
+echo "configure:5895: checking for getprpwnam in -lprot" >&5
 ac_lib_var=`echo prot'_'getprpwnam | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -5691,7 +5888,7 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-lprot -lx $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 5706 "configure"
+#line 5903 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -5702,7 +5899,7 @@ int main() {
 getprpwnam()
 ; return 0; }
 EOF
-if { (eval echo configure:5717: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:5914: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -5721,7 +5918,7 @@ if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
 else
   echo "$ac_t""no" 1>&6
 echo $ac_n "checking for getprpwnam in -lsecurity""... $ac_c" 1>&6
-echo "configure:5736: checking for getprpwnam in -lsecurity" >&5
+echo "configure:5933: checking for getprpwnam in -lsecurity" >&5
 ac_lib_var=`echo security'_'getprpwnam | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -5729,7 +5926,7 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-lsecurity  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 5744 "configure"
+#line 5941 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -5740,7 +5937,7 @@ int main() {
 getprpwnam()
 ; return 0; }
 EOF
-if { (eval echo configure:5755: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:5952: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -5773,7 +5970,7 @@ fi
 
 if test "$with_shadow" = yes ; then
   echo $ac_n "checking for HP-style shadow passwords""... $ac_c" 1>&6
-echo "configure:5788: checking for HP-style shadow passwords" >&5
+echo "configure:5985: checking for HP-style shadow passwords" >&5
 if eval "test \"`echo '$''{'ac_cv_hpux_passwd'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -5784,7 +5981,7 @@ else
   fi
   CPPFLAGS="$CPPFLAGS $X_CFLAGS"
   cat > conftest.$ac_ext <<EOF
-#line 5799 "configure"
+#line 5996 "configure"
 #include "confdefs.h"
 #include <stdlib.h>
                                     #include <unistd.h>
@@ -5797,7 +5994,7 @@ struct s_passwd *p = getspwnam("nobody");
                        const char *pw = p->pw_passwd;
 ; return 0; }
 EOF
-if { (eval echo configure:5812: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:6009: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   ac_cv_hpux_passwd=yes
 else
@@ -5818,7 +6015,7 @@ echo "$ac_t""$ac_cv_hpux_passwd" 1>&6
 
     # on HPUX, bigcrypt is in -lsec
     echo $ac_n "checking for bigcrypt in -lsec""... $ac_c" 1>&6
-echo "configure:5833: checking for bigcrypt in -lsec" >&5
+echo "configure:6030: checking for bigcrypt in -lsec" >&5
 ac_lib_var=`echo sec'_'bigcrypt | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -5826,7 +6023,7 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-lsec  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 5841 "configure"
+#line 6038 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -5837,7 +6034,7 @@ int main() {
 bigcrypt()
 ; return 0; }
 EOF
-if { (eval echo configure:5852: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:6049: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -5875,7 +6072,7 @@ fi
 
 if test "$with_shadow" = yes ; then
   echo $ac_n "checking for FreeBSD-style shadow passwords""... $ac_c" 1>&6
-echo "configure:5890: checking for FreeBSD-style shadow passwords" >&5
+echo "configure:6087: checking for FreeBSD-style shadow passwords" >&5
 if eval "test \"`echo '$''{'ac_cv_master_passwd'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -5901,7 +6098,7 @@ fi
 
 if test "$with_shadow" = yes ; then
   echo $ac_n "checking for generic shadow passwords""... $ac_c" 1>&6
-echo "configure:5916: checking for generic shadow passwords" >&5
+echo "configure:6113: checking for generic shadow passwords" >&5
 if eval "test \"`echo '$''{'ac_cv_shadow'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -5912,7 +6109,7 @@ else
   fi
   CPPFLAGS="$CPPFLAGS $X_CFLAGS"
   cat > conftest.$ac_ext <<EOF
-#line 5927 "configure"
+#line 6124 "configure"
 #include "confdefs.h"
 #include <stdlib.h>
                                     #include <unistd.h>
@@ -5924,7 +6121,7 @@ struct spwd *p = getspnam("nobody");
                        const char *pw = p->sp_pwdp;
 ; return 0; }
 EOF
-if { (eval echo configure:5939: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:6136: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   ac_cv_shadow=yes
 else
@@ -5945,7 +6142,7 @@ echo "$ac_t""$ac_cv_shadow" 1>&6
     # On some systems (UnixWare 2.1), getspnam() is in -lgen instead of -lc.
     have_getspnam=no
     echo $ac_n "checking for getspnam in -lc""... $ac_c" 1>&6
-echo "configure:5960: checking for getspnam in -lc" >&5
+echo "configure:6157: checking for getspnam in -lc" >&5
 ac_lib_var=`echo c'_'getspnam | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -5953,7 +6150,7 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-lc  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 5968 "configure"
+#line 6165 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -5964,7 +6161,7 @@ int main() {
 getspnam()
 ; return 0; }
 EOF
-if { (eval echo configure:5979: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:6176: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -5986,7 +6183,7 @@ fi
 
     if test "$have_getspnam" = no ; then
       echo $ac_n "checking for getspnam in -lgen""... $ac_c" 1>&6
-echo "configure:6001: checking for getspnam in -lgen" >&5
+echo "configure:6198: checking for getspnam in -lgen" >&5
 ac_lib_var=`echo gen'_'getspnam | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -5994,7 +6191,7 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-lgen  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 6009 "configure"
+#line 6206 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -6005,7 +6202,7 @@ int main() {
 getspnam()
 ; return 0; }
 EOF
-if { (eval echo configure:6020: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:6217: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -6041,7 +6238,7 @@ if test "$enable_locking" = yes ; then
   # On some systems (UnixWare 2.1), crypt() is in -lcrypt instead of -lc.
   have_crypt=no
   echo $ac_n "checking for crypt in -lc""... $ac_c" 1>&6
-echo "configure:6056: checking for crypt in -lc" >&5
+echo "configure:6253: checking for crypt in -lc" >&5
 ac_lib_var=`echo c'_'crypt | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -6049,7 +6246,7 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-lc  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 6064 "configure"
+#line 6261 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -6060,7 +6257,7 @@ int main() {
 crypt()
 ; return 0; }
 EOF
-if { (eval echo configure:6075: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:6272: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -6082,7 +6279,7 @@ fi
 
   if test "$have_crypt" = no ; then
     echo $ac_n "checking for crypt in -lcrypt""... $ac_c" 1>&6
-echo "configure:6097: checking for crypt in -lcrypt" >&5
+echo "configure:6294: checking for crypt in -lcrypt" >&5
 ac_lib_var=`echo crypt'_'crypt | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -6090,7 +6287,7 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-lcrypt  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 6105 "configure"
+#line 6302 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -6101,7 +6298,7 @@ int main() {
 crypt()
 ; return 0; }
 EOF
-if { (eval echo configure:6116: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:6313: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -6185,7 +6382,7 @@ fi
 
     /*)
      echo $ac_n "checking for Motif headers""... $ac_c" 1>&6
-echo "configure:6200: checking for Motif headers" >&5
+echo "configure:6397: checking for Motif headers" >&5
      d=$with_motif/include
      if test -d $d; then
        X_CFLAGS="-I$d $X_CFLAGS"
@@ -6195,7 +6392,7 @@ echo "configure:6200: checking for Motif headers" >&5
      fi
 
      echo $ac_n "checking for Motif libs""... $ac_c" 1>&6
-echo "configure:6210: checking for Motif libs" >&5
+echo "configure:6407: checking for Motif libs" >&5
      d=$with_motif/lib
      if test -d $d; then
        X_LIBS="-L$d $X_LIBS"
@@ -6234,17 +6431,17 @@ if test "$with_motif" = yes; then
   CPPFLAGS="$CPPFLAGS $X_CFLAGS"
   ac_safe=`echo "Xm/Xm.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for Xm/Xm.h""... $ac_c" 1>&6
-echo "configure:6249: checking for Xm/Xm.h" >&5
+echo "configure:6446: checking for Xm/Xm.h" >&5
 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 6254 "configure"
+#line 6451 "configure"
 #include "confdefs.h"
 #include <Xm/Xm.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:6259: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:6456: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -6283,17 +6480,17 @@ if test "$have_motif" = yes; then
   CPPFLAGS="$CPPFLAGS $X_CFLAGS"
   ac_safe=`echo "Xm/ComboBox.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for Xm/ComboBox.h""... $ac_c" 1>&6
-echo "configure:6298: checking for Xm/ComboBox.h" >&5
+echo "configure:6495: checking for Xm/ComboBox.h" >&5
 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 6303 "configure"
+#line 6500 "configure"
 #include "confdefs.h"
 #include <Xm/ComboBox.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:6308: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:6505: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -6356,7 +6553,7 @@ esac
 
     /*)
      echo $ac_n "checking for Gtk headers""... $ac_c" 1>&6
-echo "configure:6371: checking for Gtk headers" >&5
+echo "configure:6568: checking for Gtk headers" >&5
      d=$with_gtk/include
      if test -d $d; then
        X_CFLAGS="-I$d $X_CFLAGS"
@@ -6366,7 +6563,7 @@ echo "configure:6371: checking for Gtk headers" >&5
      fi
 
      echo $ac_n "checking for Gtk libs""... $ac_c" 1>&6
-echo "configure:6381: checking for Gtk libs" >&5
+echo "configure:6578: checking for Gtk libs" >&5
      d=$with_gtk/lib
      if test -d $d; then
        X_LIBS="-L$d $X_LIBS"
@@ -6424,7 +6621,7 @@ esac
 
     /*)
      echo $ac_n "checking for Gnome headers""... $ac_c" 1>&6
-echo "configure:6439: checking for Gnome headers" >&5
+echo "configure:6636: checking for Gnome headers" >&5
      d=$with_gnome/include
      if test -d $d; then
        X_CFLAGS="-I$d $X_CFLAGS"
@@ -6434,7 +6631,7 @@ echo "configure:6439: checking for Gnome headers" >&5
      fi
 
      echo $ac_n "checking for Gnome libs""... $ac_c" 1>&6
-echo "configure:6449: checking for Gnome libs" >&5
+echo "configure:6646: checking for Gnome libs" >&5
      d=$with_gnome/lib
      if test -d $d; then
        X_LIBS="-L$d $X_LIBS"
@@ -6490,7 +6687,7 @@ do
 # Extract the first word of "$ac_prog", so it can be a program name with args.
 set dummy $ac_prog; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:6505: checking for $ac_word" >&5
+echo "configure:6702: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_path_glib_config'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -6530,7 +6727,7 @@ do
 # Extract the first word of "$ac_prog", so it can be a program name with args.
 set dummy $ac_prog; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:6545: checking for $ac_word" >&5
+echo "configure:6742: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_path_gtk_config'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -6572,7 +6769,7 @@ do
 # Extract the first word of "$ac_prog", so it can be a program name with args.
 set dummy $ac_prog; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:6587: checking for $ac_word" >&5
+echo "configure:6784: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_path_gnome_config'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -6618,7 +6815,7 @@ done
 
   if test "$have_gtk" = yes; then
     echo $ac_n "checking Gtk version number""... $ac_c" 1>&6
-echo "configure:6633: checking Gtk version number" >&5
+echo "configure:6830: checking Gtk version number" >&5
 if eval "test \"`echo '$''{'ac_cv_gtk_version_string'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -6647,7 +6844,7 @@ echo "$ac_t""$ac_cv_gtk_version_string" 1>&6
 
   if test "$have_gtk" = yes; then
     echo $ac_n "checking for Gtk includes""... $ac_c" 1>&6
-echo "configure:6662: checking for Gtk includes" >&5
+echo "configure:6859: checking for Gtk includes" >&5
 if eval "test \"`echo '$''{'ac_cv_gtk_config_cflags'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -6656,7 +6853,7 @@ fi
 
 echo "$ac_t""$ac_cv_gtk_config_cflags" 1>&6
     echo $ac_n "checking for Gtk libs""... $ac_c" 1>&6
-echo "configure:6671: checking for Gtk libs" >&5
+echo "configure:6868: checking for Gtk libs" >&5
 if eval "test \"`echo '$''{'ac_cv_gtk_config_libs'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -6673,7 +6870,7 @@ echo "$ac_t""$ac_cv_gtk_config_libs" 1>&6
   if test "$have_gnome" = yes -a "$have_gtk" = yes; then
     gnome_config_libs="capplet gnomeui"
     echo $ac_n "checking for Gnome capplet includes""... $ac_c" 1>&6
-echo "configure:6688: checking for Gnome capplet includes" >&5
+echo "configure:6885: checking for Gnome capplet includes" >&5
     if eval "test \"`echo '$''{'ac_cv_gnome_config_cflags'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -6696,7 +6893,7 @@ fi
 
   if test "$have_gnome" = yes -a "$have_gtk" = yes; then
     echo $ac_n "checking for Gnome capplet libs""... $ac_c" 1>&6
-echo "configure:6711: checking for Gnome capplet libs" >&5
+echo "configure:6908: checking for Gnome capplet libs" >&5
     if eval "test \"`echo '$''{'ac_cv_gnome_config_libs'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -6757,7 +6954,7 @@ fi
 have_lesstif=no
 if test "$have_motif" = yes ; then
   echo $ac_n "checking whether Motif is really LessTif""... $ac_c" 1>&6
-echo "configure:6772: checking whether Motif is really LessTif" >&5
+echo "configure:6969: checking whether Motif is really LessTif" >&5
 if eval "test \"`echo '$''{'ac_cv_have_lesstif'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -6768,14 +6965,14 @@ else
   fi
   CPPFLAGS="$CPPFLAGS $X_CFLAGS"
   cat > conftest.$ac_ext <<EOF
-#line 6783 "configure"
+#line 6980 "configure"
 #include "confdefs.h"
 #include <Xm/Xm.h>
 int main() {
 long vers = LesstifVersion;
 ; return 0; }
 EOF
-if { (eval echo configure:6790: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:6987: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   ac_cv_have_lesstif=yes
 else
@@ -6800,7 +6997,7 @@ if test "$have_lesstif" = yes ; then
   ltv=unknown
   echo unknown > conftest-lt
   echo $ac_n "checking LessTif version number""... $ac_c" 1>&6
-echo "configure:6815: checking LessTif version number" >&5
+echo "configure:7012: checking LessTif version number" >&5
 if eval "test \"`echo '$''{'ac_cv_lesstif_version_string'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -6815,7 +7012,7 @@ else
                      ac_cv_lesstif_version_string=unknown
 else
   cat > conftest.$ac_ext <<EOF
-#line 6830 "configure"
+#line 7027 "configure"
 #include "confdefs.h"
 #include <stdio.h>
                      #include <Xm/Xm.h>
@@ -6828,7 +7025,7 @@ else
                        exit(0);
                      }
 EOF
-if { (eval echo configure:6843: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+if { (eval echo configure:7040: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
 then
   ltv=`cat conftest-lt`
                      ac_cv_lesstif_version=`echo $ltv | sed 's/ .*//'`
@@ -6858,7 +7055,7 @@ if test "$have_motif" = yes ; then
   mtv=unknown
   echo unknown > conftest-mt
   echo $ac_n "checking Motif version number""... $ac_c" 1>&6
-echo "configure:6873: checking Motif version number" >&5
+echo "configure:7070: checking Motif version number" >&5
 if eval "test \"`echo '$''{'ac_cv_motif_version_string'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -6873,7 +7070,7 @@ else
                      ac_cv_motif_version_string=unknown
 else
   cat > conftest.$ac_ext <<EOF
-#line 6888 "configure"
+#line 7085 "configure"
 #include "confdefs.h"
 #include <stdio.h>
                      #include <Xm/Xm.h>
@@ -6886,7 +7083,7 @@ else
                        exit(0);
                      }
 EOF
-if { (eval echo configure:6901: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+if { (eval echo configure:7098: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
 then
   mtv=`cat conftest-mt`
                      ac_cv_motif_version=`echo $mtv | sed 's/ .*//'`
@@ -6930,7 +7127,7 @@ fi
 motif_requires_xpm=no
 if test "$have_motif" = yes ; then
    echo $ac_n "checking whether Motif requires XPM""... $ac_c" 1>&6
-echo "configure:6945: checking whether Motif requires XPM" >&5
+echo "configure:7142: checking whether Motif requires XPM" >&5
    if test "$motif_version" = "unknown" || test "$motif_version" -ge 2000
    then
      motif_requires_xpm=yes
@@ -6972,7 +7169,7 @@ if test "$have_motif" = yes ; then
   LDFLAGS="$LDFLAGS $X_LIBS $X_EXTRA_LIBS"
 
   echo $ac_n "checking for XpQueryExtension in -lXp""... $ac_c" 1>&6
-echo "configure:6987: checking for XpQueryExtension in -lXp" >&5
+echo "configure:7184: checking for XpQueryExtension in -lXp" >&5
 ac_lib_var=`echo Xp'_'XpQueryExtension | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -6980,7 +7177,7 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-lXp -lX11 -lXext -lm $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 6995 "configure"
+#line 7192 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -6991,7 +7188,7 @@ int main() {
 XpQueryExtension()
 ; return 0; }
 EOF
-if { (eval echo configure:7006: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:7203: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -7045,7 +7242,7 @@ if test "$have_motif" = yes ; then
   LDFLAGS="$LDFLAGS $X_LIBS $X_EXTRA_LIBS"
 
   echo $ac_n "checking for _Xsetlocale in -lXintl""... $ac_c" 1>&6
-echo "configure:7060: checking for _Xsetlocale in -lXintl" >&5
+echo "configure:7257: checking for _Xsetlocale in -lXintl" >&5
 ac_lib_var=`echo Xintl'_'_Xsetlocale | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -7053,7 +7250,7 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-lXintl -lX11 -lXext -lm $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 7068 "configure"
+#line 7265 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -7064,7 +7261,7 @@ int main() {
 _Xsetlocale()
 ; return 0; }
 EOF
-if { (eval echo configure:7079: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:7276: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -7121,7 +7318,7 @@ fi
 
     /*)
      echo $ac_n "checking for GL headers""... $ac_c" 1>&6
-echo "configure:7136: checking for GL headers" >&5
+echo "configure:7333: checking for GL headers" >&5
      d=$with_gl/include
      if test -d $d; then
        X_CFLAGS="-I$d $X_CFLAGS"
@@ -7131,7 +7328,7 @@ echo "configure:7136: checking for GL headers" >&5
      fi
 
      echo $ac_n "checking for GL libs""... $ac_c" 1>&6
-echo "configure:7146: checking for GL libs" >&5
+echo "configure:7343: checking for GL libs" >&5
      d=$with_gl/lib
      if test -d $d; then
        X_LIBS="-L$d $X_LIBS"
@@ -7167,17 +7364,17 @@ if test "$with_gl" = yes; then
   CPPFLAGS="$CPPFLAGS $X_CFLAGS"
   ac_safe=`echo "GL/gl.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for GL/gl.h""... $ac_c" 1>&6
-echo "configure:7182: checking for GL/gl.h" >&5
+echo "configure:7379: checking for GL/gl.h" >&5
 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 7187 "configure"
+#line 7384 "configure"
 #include "confdefs.h"
 #include <GL/gl.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:7192: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:7389: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -7208,17 +7405,17 @@ fi
   CPPFLAGS="$CPPFLAGS $X_CFLAGS"
   ac_safe=`echo "GL/glx.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for GL/glx.h""... $ac_c" 1>&6
-echo "configure:7223: checking for GL/glx.h" >&5
+echo "configure:7420: checking for GL/glx.h" >&5
 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 7228 "configure"
+#line 7425 "configure"
 #include "confdefs.h"
 #include <GL/glx.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:7233: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:7430: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -7250,7 +7447,7 @@ fi
     # to link against.
     #
     echo $ac_n "checking whether GL is really MesaGL""... $ac_c" 1>&6
-echo "configure:7265: checking whether GL is really MesaGL" >&5
+echo "configure:7462: checking whether GL is really MesaGL" >&5
 if eval "test \"`echo '$''{'ac_cv_have_mesa_gl'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -7262,7 +7459,7 @@ else
   fi
   CPPFLAGS="$CPPFLAGS $X_CFLAGS"
   cat > conftest.$ac_ext <<EOF
-#line 7277 "configure"
+#line 7474 "configure"
 #include "confdefs.h"
 #include <GL/glx.h>
 EOF
@@ -7291,7 +7488,7 @@ echo "$ac_t""$ac_cv_have_mesa_gl" 1>&6
     #
     if test "$ac_have_mesa_gl" = yes; then
       echo $ac_n "checking for pthread_create in -lpthread""... $ac_c" 1>&6
-echo "configure:7306: checking for pthread_create in -lpthread" >&5
+echo "configure:7503: checking for pthread_create in -lpthread" >&5
 ac_lib_var=`echo pthread'_'pthread_create | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -7299,7 +7496,7 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-lpthread  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 7314 "configure"
+#line 7511 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -7310,7 +7507,7 @@ int main() {
 pthread_create()
 ; return 0; }
 EOF
-if { (eval echo configure:7325: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:7522: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -7357,7 +7554,7 @@ fi
   LDFLAGS="$LDFLAGS $X_LIBS $X_EXTRA_LIBS"
 
   echo $ac_n "checking for glXCreateContext in -lMesaGL""... $ac_c" 1>&6
-echo "configure:7372: checking for glXCreateContext in -lMesaGL" >&5
+echo "configure:7569: checking for glXCreateContext in -lMesaGL" >&5
 ac_lib_var=`echo MesaGL'_'glXCreateContext | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -7365,7 +7562,7 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-lMesaGL -lMesaGLU $GL_LIBS -lX11 -lXext -lm $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 7380 "configure"
+#line 7577 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -7376,7 +7573,7 @@ int main() {
 glXCreateContext()
 ; return 0; }
 EOF
-if { (eval echo configure:7391: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:7588: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -7422,7 +7619,7 @@ fi
   LDFLAGS="$LDFLAGS $X_LIBS $X_EXTRA_LIBS"
 
   echo $ac_n "checking for glXCreateContext in -lGL""... $ac_c" 1>&6
-echo "configure:7437: checking for glXCreateContext in -lGL" >&5
+echo "configure:7634: checking for glXCreateContext in -lGL" >&5
 ac_lib_var=`echo GL'_'glXCreateContext | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -7430,7 +7627,7 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-lGL -lGLU $GL_LIBS -lX11 -lXext -lm $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 7445 "configure"
+#line 7642 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -7441,7 +7638,7 @@ int main() {
 glXCreateContext()
 ; return 0; }
 EOF
-if { (eval echo configure:7456: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:7653: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -7499,12 +7696,12 @@ EOF
     if test "$ac_have_mesa_gl" = yes; then
 
       echo $ac_n "checking MesaGL version number""... $ac_c" 1>&6
-echo "configure:7514: checking MesaGL version number" >&5
+echo "configure:7711: checking MesaGL version number" >&5
 if eval "test \"`echo '$''{'ac_cv_mesagl_version_string'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 7519 "configure"
+#line 7716 "configure"
 #include "confdefs.h"
 #include <GL/gl.h>
 #ifndef MESA_MAJOR_VERSION
@@ -7575,7 +7772,7 @@ echo "$ac_t""$ac_cv_mesagl_version_string" 1>&6
   LDFLAGS="$LDFLAGS $X_LIBS $X_EXTRA_LIBS"
 
   echo $ac_n "checking for glBindTexture in -l$gl_lib_1""... $ac_c" 1>&6
-echo "configure:7590: checking for glBindTexture in -l$gl_lib_1" >&5
+echo "configure:7787: checking for glBindTexture in -l$gl_lib_1" >&5
 ac_lib_var=`echo $gl_lib_1'_'glBindTexture | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -7583,7 +7780,7 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-l$gl_lib_1 $GL_LIBS -lX11 -lXext -lm $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 7598 "configure"
+#line 7795 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -7594,7 +7791,7 @@ int main() {
 glBindTexture()
 ; return 0; }
 EOF
-if { (eval echo configure:7609: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:7806: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -7655,7 +7852,7 @@ fi
 
     /*)
      echo $ac_n "checking for GLE headers""... $ac_c" 1>&6
-echo "configure:7670: checking for GLE headers" >&5
+echo "configure:7867: checking for GLE headers" >&5
      d=$with_gle/include
      if test -d $d; then
        X_CFLAGS="-I$d $X_CFLAGS"
@@ -7665,7 +7862,7 @@ echo "configure:7670: checking for GLE headers" >&5
      fi
 
      echo $ac_n "checking for GLE libs""... $ac_c" 1>&6
-echo "configure:7680: checking for GLE libs" >&5
+echo "configure:7877: checking for GLE libs" >&5
      d=$with_gle/lib
      if test -d $d; then
        X_LIBS="-L$d $X_LIBS"
@@ -7701,17 +7898,17 @@ if test "$with_gle" = yes; then
   CPPFLAGS="$CPPFLAGS $X_CFLAGS"
   ac_safe=`echo "GL/gle.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for GL/gle.h""... $ac_c" 1>&6
-echo "configure:7716: checking for GL/gle.h" >&5
+echo "configure:7913: checking for GL/gle.h" >&5
 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 7721 "configure"
+#line 7918 "configure"
 #include "confdefs.h"
 #include <GL/gle.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:7726: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:7923: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -7744,17 +7941,17 @@ fi
   CPPFLAGS="$CPPFLAGS $X_CFLAGS"
   ac_safe=`echo "GL/gutil.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for GL/gutil.h""... $ac_c" 1>&6
-echo "configure:7759: checking for GL/gutil.h" >&5
+echo "configure:7956: checking for GL/gutil.h" >&5
 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 7764 "configure"
+#line 7961 "configure"
 #include "confdefs.h"
 #include <GL/gutil.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:7769: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:7966: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -7785,17 +7982,17 @@ fi
   CPPFLAGS="$CPPFLAGS $X_CFLAGS"
   ac_safe=`echo "GL/tube.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for GL/tube.h""... $ac_c" 1>&6
-echo "configure:7800: checking for GL/tube.h" >&5
+echo "configure:7997: checking for GL/tube.h" >&5
 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 7805 "configure"
+#line 8002 "configure"
 #include "confdefs.h"
 #include <GL/tube.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:7810: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:8007: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -7841,7 +8038,7 @@ fi
   LDFLAGS="$LDFLAGS $X_LIBS $X_EXTRA_LIBS"
 
   echo $ac_n "checking for gleCreateGC in -lgle""... $ac_c" 1>&6
-echo "configure:7856: checking for gleCreateGC in -lgle" >&5
+echo "configure:8053: checking for gleCreateGC in -lgle" >&5
 ac_lib_var=`echo gle'_'gleCreateGC | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -7849,7 +8046,7 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-lgle $GL_LIBS -lX11 -lXext -lm $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 7864 "configure"
+#line 8061 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -7860,7 +8057,7 @@ int main() {
 gleCreateGC()
 ; return 0; }
 EOF
-if { (eval echo configure:7875: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:8072: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -7920,7 +8117,7 @@ fi
   LDFLAGS="$LDFLAGS $X_LIBS $X_EXTRA_LIBS"
 
   echo $ac_n "checking for uview_direction in -lgle""... $ac_c" 1>&6
-echo "configure:7935: checking for uview_direction in -lgle" >&5
+echo "configure:8132: checking for uview_direction in -lgle" >&5
 ac_lib_var=`echo gle'_'uview_direction | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -7928,7 +8125,7 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-lgle $GL_LIBS -lX11 -lXext -lm $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 7943 "configure"
+#line 8140 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -7939,7 +8136,7 @@ int main() {
 uview_direction()
 ; return 0; }
 EOF
-if { (eval echo configure:7954: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:8151: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -7984,7 +8181,7 @@ fi
   LDFLAGS="$LDFLAGS $X_LIBS $X_EXTRA_LIBS"
 
   echo $ac_n "checking for uview_direction_d in -lmatrix""... $ac_c" 1>&6
-echo "configure:7999: checking for uview_direction_d in -lmatrix" >&5
+echo "configure:8196: checking for uview_direction_d in -lmatrix" >&5
 ac_lib_var=`echo matrix'_'uview_direction_d | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -7992,7 +8189,7 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-lmatrix $GL_LIBS -lX11 -lXext -lm $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 8007 "configure"
+#line 8204 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -8003,7 +8200,7 @@ int main() {
 uview_direction_d()
 ; return 0; }
 EOF
-if { (eval echo configure:8018: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:8215: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -8076,7 +8273,7 @@ fi
 
     /*)
      echo $ac_n "checking for XPM headers""... $ac_c" 1>&6
-echo "configure:8091: checking for XPM headers" >&5
+echo "configure:8288: checking for XPM headers" >&5
      d=$with_xpm/include
      if test -d $d; then
        X_CFLAGS="-I$d $X_CFLAGS"
@@ -8086,7 +8283,7 @@ echo "configure:8091: checking for XPM headers" >&5
      fi
 
      echo $ac_n "checking for XPM libs""... $ac_c" 1>&6
-echo "configure:8101: checking for XPM libs" >&5
+echo "configure:8298: checking for XPM libs" >&5
      d=$with_xpm/lib
      if test -d $d; then
        X_LIBS="-L$d $X_LIBS"
@@ -8119,17 +8316,17 @@ if test "$with_xpm" = yes; then
   CPPFLAGS="$CPPFLAGS $X_CFLAGS"
   ac_safe=`echo "X11/xpm.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for X11/xpm.h""... $ac_c" 1>&6
-echo "configure:8134: checking for X11/xpm.h" >&5
+echo "configure:8331: checking for X11/xpm.h" >&5
 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 8139 "configure"
+#line 8336 "configure"
 #include "confdefs.h"
 #include <X11/xpm.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:8144: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:8341: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -8195,7 +8392,7 @@ fi
 
     /*)
      echo $ac_n "checking for XSHM headers""... $ac_c" 1>&6
-echo "configure:8210: checking for XSHM headers" >&5
+echo "configure:8407: checking for XSHM headers" >&5
      d=$with_xshm/include
      if test -d $d; then
        X_CFLAGS="-I$d $X_CFLAGS"
@@ -8205,7 +8402,7 @@ echo "configure:8210: checking for XSHM headers" >&5
      fi
 
      echo $ac_n "checking for XSHM libs""... $ac_c" 1>&6
-echo "configure:8220: checking for XSHM libs" >&5
+echo "configure:8417: checking for XSHM libs" >&5
      d=$with_xshm/lib
      if test -d $d; then
        X_LIBS="-L$d $X_LIBS"
@@ -8240,17 +8437,17 @@ if test "$with_xshm" = yes; then
   CPPFLAGS="$CPPFLAGS $X_CFLAGS"
   ac_safe=`echo "X11/extensions/XShm.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for X11/extensions/XShm.h""... $ac_c" 1>&6
-echo "configure:8255: checking for X11/extensions/XShm.h" >&5
+echo "configure:8452: checking for X11/extensions/XShm.h" >&5
 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 8260 "configure"
+#line 8457 "configure"
 #include "confdefs.h"
 #include <X11/extensions/XShm.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:8265: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:8462: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -8284,17 +8481,17 @@ fi
   CPPFLAGS="$CPPFLAGS $X_CFLAGS"
   ac_safe=`echo "sys/ipc.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for sys/ipc.h""... $ac_c" 1>&6
-echo "configure:8299: checking for sys/ipc.h" >&5
+echo "configure:8496: checking for sys/ipc.h" >&5
 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 8304 "configure"
+#line 8501 "configure"
 #include "confdefs.h"
 #include <sys/ipc.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:8309: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:8506: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -8329,17 +8526,17 @@ fi
   CPPFLAGS="$CPPFLAGS $X_CFLAGS"
   ac_safe=`echo "sys/shm.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for sys/shm.h""... $ac_c" 1>&6
-echo "configure:8344: checking for sys/shm.h" >&5
+echo "configure:8541: checking for sys/shm.h" >&5
 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 8349 "configure"
+#line 8546 "configure"
 #include "confdefs.h"
 #include <sys/shm.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:8354: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:8551: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -8391,7 +8588,7 @@ fi
   LDFLAGS="$LDFLAGS $X_LIBS $X_EXTRA_LIBS"
 
   echo $ac_n "checking for XShmQueryExtension in -lXextSam""... $ac_c" 1>&6
-echo "configure:8406: checking for XShmQueryExtension in -lXextSam" >&5
+echo "configure:8603: checking for XShmQueryExtension in -lXextSam" >&5
 ac_lib_var=`echo XextSam'_'XShmQueryExtension | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -8399,7 +8596,7 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-lXextSam -lX11 -lXext -lm $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 8414 "configure"
+#line 8611 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -8410,7 +8607,7 @@ int main() {
 XShmQueryExtension()
 ; return 0; }
 EOF
-if { (eval echo configure:8425: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:8622: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -8477,7 +8674,7 @@ fi
 
     /*)
      echo $ac_n "checking for DOUBLE-BUFFER headers""... $ac_c" 1>&6
-echo "configure:8492: checking for DOUBLE-BUFFER headers" >&5
+echo "configure:8689: checking for DOUBLE-BUFFER headers" >&5
      d=$with_xdbe/include
      if test -d $d; then
        X_CFLAGS="-I$d $X_CFLAGS"
@@ -8487,7 +8684,7 @@ echo "configure:8492: checking for DOUBLE-BUFFER headers" >&5
      fi
 
      echo $ac_n "checking for DOUBLE-BUFFER libs""... $ac_c" 1>&6
-echo "configure:8502: checking for DOUBLE-BUFFER libs" >&5
+echo "configure:8699: checking for DOUBLE-BUFFER libs" >&5
      d=$with_xdbe/lib
      if test -d $d; then
        X_LIBS="-L$d $X_LIBS"
@@ -8521,17 +8718,17 @@ if test "$with_xdbe" = yes; then
   CPPFLAGS="$CPPFLAGS $X_CFLAGS"
   ac_safe=`echo "X11/extensions/Xdbe.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for X11/extensions/Xdbe.h""... $ac_c" 1>&6
-echo "configure:8536: checking for X11/extensions/Xdbe.h" >&5
+echo "configure:8733: checking for X11/extensions/Xdbe.h" >&5
 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 8541 "configure"
+#line 8738 "configure"
 #include "confdefs.h"
 #include <X11/extensions/Xdbe.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:8546: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:8743: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -8594,7 +8791,7 @@ fi
 
     /*)
      echo $ac_n "checking for XReadDisplay headers""... $ac_c" 1>&6
-echo "configure:8609: checking for XReadDisplay headers" >&5
+echo "configure:8806: checking for XReadDisplay headers" >&5
      d=$with_readdisplay/include
      if test -d $d; then
        X_CFLAGS="-I$d $X_CFLAGS"
@@ -8604,7 +8801,7 @@ echo "configure:8609: checking for XReadDisplay headers" >&5
      fi
 
      echo $ac_n "checking for XReadDisplay libs""... $ac_c" 1>&6
-echo "configure:8619: checking for XReadDisplay libs" >&5
+echo "configure:8816: checking for XReadDisplay libs" >&5
      d=$with_readdisplay/lib
      if test -d $d; then
        X_LIBS="-L$d $X_LIBS"
@@ -8637,17 +8834,17 @@ if test "$with_readdisplay" = yes; then
   CPPFLAGS="$CPPFLAGS $X_CFLAGS"
   ac_safe=`echo "X11/extensions/readdisplay.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for X11/extensions/readdisplay.h""... $ac_c" 1>&6
-echo "configure:8652: checking for X11/extensions/readdisplay.h" >&5
+echo "configure:8849: checking for X11/extensions/readdisplay.h" >&5
 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 8657 "configure"
+#line 8854 "configure"
 #include "confdefs.h"
 #include <X11/extensions/readdisplay.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:8662: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:8859: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -8678,162 +8875,6 @@ elif test "$with_readdisplay" != no; then
 fi
 
 
-###############################################################################
-#
-#       Check for the SGI Iris Video Library.
-#
-###############################################################################
-
-have_sgivideo=no
-with_sgivideo_req=unspecified
-# Check whether --with-sgivideo or --without-sgivideo was given.
-if test "${with_sgivideo+set}" = set; then
-  withval="$with_sgivideo"
-  with_sgivideo="$withval"; with_sgivideo_req="$withval"
-else
-  with_sgivideo=yes
-fi
-
-
-
-   case "$with_sgivideo" in
-    yes) ;;
-    no)  ;;
-
-    /*)
-     echo $ac_n "checking for Iris Video headers""... $ac_c" 1>&6
-echo "configure:8717: checking for Iris Video headers" >&5
-     d=$with_sgivideo/include
-     if test -d $d; then
-       X_CFLAGS="-I$d $X_CFLAGS"
-       echo "$ac_t""$d" 1>&6
-     else
-       echo "$ac_t""not found ($d: no such directory)" 1>&6
-     fi
-
-     echo $ac_n "checking for Iris Video libs""... $ac_c" 1>&6
-echo "configure:8727: checking for Iris Video libs" >&5
-     d=$with_sgivideo/lib
-     if test -d $d; then
-       X_LIBS="-L$d $X_LIBS"
-       echo "$ac_t""$d" 1>&6
-     else
-       echo "$ac_t""not found ($d: no such directory)" 1>&6
-     fi
-
-     # replace the directory string with "yes".
-     with_sgivideo_req="yes"
-     with_sgivideo=$with_sgivideo_req
-     ;;
-
-    *)
-     echo ""
-     echo "error: argument to --with-sgivideo must be \"yes\", \"no\", or a directory."
-     echo "       If it is a directory, then \`DIR/include' will be added to"
-     echo "       the -I list, and \`DIR/lib' will be added to the -L list."
-     exit 1
-     ;;
-   esac
-  
-
-if test "$with_sgivideo" = yes; then
-  
-  ac_save_CPPFLAGS="$CPPFLAGS"
-  if test \! -z "$includedir" ; then 
-    CPPFLAGS="$CPPFLAGS -I$includedir"
-  fi
-  CPPFLAGS="$CPPFLAGS $X_CFLAGS"
-  ac_safe=`echo "dmedia/vl.h" | sed 'y%./+-%__p_%'`
-echo $ac_n "checking for dmedia/vl.h""... $ac_c" 1>&6
-echo "configure:8760: checking for dmedia/vl.h" >&5
-if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
-  echo $ac_n "(cached) $ac_c" 1>&6
-else
-  cat > conftest.$ac_ext <<EOF
-#line 8765 "configure"
-#include "confdefs.h"
-#include <dmedia/vl.h>
-EOF
-ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:8770: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
-ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
-if test -z "$ac_err"; then
-  rm -rf conftest*
-  eval "ac_cv_header_$ac_safe=yes"
-else
-  echo "$ac_err" >&5
-  echo "configure: failed program was:" >&5
-  cat conftest.$ac_ext >&5
-  rm -rf conftest*
-  eval "ac_cv_header_$ac_safe=no"
-fi
-rm -f conftest*
-fi
-if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
-  echo "$ac_t""yes" 1>&6
-  have_sgivideo=yes
-else
-  echo "$ac_t""no" 1>&6
-fi
-
-  CPPFLAGS="$ac_save_CPPFLAGS"
-  if test "$have_sgivideo" = yes; then
-    have_sgivideo=no
-    echo $ac_n "checking for vlOpenVideo in -lvl""... $ac_c" 1>&6
-echo "configure:8795: checking for vlOpenVideo in -lvl" >&5
-ac_lib_var=`echo vl'_'vlOpenVideo | sed 'y%./+-%__p_%'`
-if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
-  echo $ac_n "(cached) $ac_c" 1>&6
-else
-  ac_save_LIBS="$LIBS"
-LIBS="-lvl  $LIBS"
-cat > conftest.$ac_ext <<EOF
-#line 8803 "configure"
-#include "confdefs.h"
-/* Override any gcc2 internal prototype to avoid an error.  */
-/* We use char because int might match the return type of a gcc2
-    builtin and then its argument prototype would still apply.  */
-char vlOpenVideo();
-
-int main() {
-vlOpenVideo()
-; return 0; }
-EOF
-if { (eval echo configure:8814: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
-  rm -rf conftest*
-  eval "ac_cv_lib_$ac_lib_var=yes"
-else
-  echo "configure: failed program was:" >&5
-  cat conftest.$ac_ext >&5
-  rm -rf conftest*
-  eval "ac_cv_lib_$ac_lib_var=no"
-fi
-rm -f conftest*
-LIBS="$ac_save_LIBS"
-
-fi
-if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
-  echo "$ac_t""yes" 1>&6
-  have_sgivideo=yes
-else
-  echo "$ac_t""no" 1>&6
-fi
-
-    if test "$have_sgivideo" = yes; then
-      SGI_VIDEO_OBJS="$(UTILS_BIN)/sgivideo.o"
-      SGI_VIDEO_LIBS="-lvl"
-      cat >> confdefs.h <<\EOF
-#define HAVE_SGI_VIDEO 1
-EOF
-
-    fi
-  fi
-elif test "$with_sgivideo" != no; then
-  echo "error: must be yes or no: --with-sgivideo=$with_sgivideo"
-  exit 1
-fi
-
-
 ###############################################################################
 #
 #       Check for a program to generate random text.
@@ -8870,7 +8911,7 @@ if test -n "$with_zippy_req" ; then
   case "$with_zippy_req" in
     /*)
       echo $ac_n "checking for $with_zippy_req""... $ac_c" 1>&6
-echo "configure:8885: checking for $with_zippy_req" >&5
+echo "configure:8926: checking for $with_zippy_req" >&5
       if test -x "$with_zippy_req" ; then
         echo "$ac_t""yes" 1>&6
       else
@@ -8884,7 +8925,7 @@ echo "configure:8885: checking for $with_zippy_req" >&5
       # Extract the first word of "$with_zippy_req", so it can be a program name with args.
 set dummy $with_zippy_req; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:8899: checking for $ac_word" >&5
+echo "configure:8940: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_path_zip2'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -8934,7 +8975,7 @@ do
 # Extract the first word of "$ac_prog", so it can be a program name with args.
 set dummy $ac_prog; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:8949: checking for $ac_word" >&5
+echo "configure:8990: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_emacs_exe'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -8968,7 +9009,7 @@ do
 # Extract the first word of "$ac_prog", so it can be a program name with args.
 set dummy $ac_prog; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:8983: checking for $ac_word" >&5
+echo "configure:9024: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_xemacs_exe'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -9003,7 +9044,7 @@ done
 
   if test -n "$emacs_exe" ; then
     echo $ac_n "checking for emacs yow""... $ac_c" 1>&6
-echo "configure:9018: checking for emacs yow" >&5
+echo "configure:9059: checking for emacs yow" >&5
     #
     # get emacs to tell us where the libexec directory is.
     #
@@ -9025,7 +9066,7 @@ echo "configure:9018: checking for emacs yow" >&5
 
   if test -z "$ac_cv_zippy_program" ; then
     echo $ac_n "checking for xemacs yow""... $ac_c" 1>&6
-echo "configure:9040: checking for xemacs yow" >&5
+echo "configure:9081: checking for xemacs yow" >&5
     if test -n "$xemacs_exe" ; then
       #
       # get xemacs to tell us where the libexec directory is.
@@ -9084,7 +9125,7 @@ do
 # Extract the first word of "$ac_prog", so it can be a program name with args.
 set dummy $ac_prog; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:9099: checking for $ac_word" >&5
+echo "configure:9140: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_fortune'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -9120,7 +9161,7 @@ do
 # Extract the first word of "$ac_prog", so it can be a program name with args.
 set dummy $ac_prog; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:9135: checking for $ac_word" >&5
+echo "configure:9176: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_path_fortune'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -9195,7 +9236,7 @@ fi
 
     /*)
      echo $ac_n "checking for setuid hacks headers""... $ac_c" 1>&6
-echo "configure:9210: checking for setuid hacks headers" >&5
+echo "configure:9251: checking for setuid hacks headers" >&5
      d=$setuid_hacks/include
      if test -d $d; then
        X_CFLAGS="-I$d $X_CFLAGS"
@@ -9205,7 +9246,7 @@ echo "configure:9210: checking for setuid hacks headers" >&5
      fi
 
      echo $ac_n "checking for setuid hacks libs""... $ac_c" 1>&6
-echo "configure:9220: checking for setuid hacks libs" >&5
+echo "configure:9261: checking for setuid hacks libs" >&5
      d=$setuid_hacks/lib
      if test -d $d; then
        X_LIBS="-L$d $X_LIBS"
@@ -9291,7 +9332,7 @@ else
   LOCK_OBJS='$(NOLOCK_OBJS_1)'
 fi
 
-INSTALL_SETUID='$(INSTALL) $(SUID_FLAGS)'
+INSTALL_SETUID='$(INSTALL_PROGRAM) $(SUID_FLAGS)'
 
 if test "$need_setuid" = yes; then
   NEED_SETUID=yes
@@ -9365,7 +9406,6 @@ fi
 
 
 
-
 
 
 APPDEFAULTS=$ac_x_app_defaults
@@ -9554,12 +9594,11 @@ s%@SETUID_HACKS@%$SETUID_HACKS%g
 s%@INSTALL_DIRS@%$INSTALL_DIRS%g
 s%@NEED_SETUID@%$NEED_SETUID%g
 s%@INSTALL_PAM@%$INSTALL_PAM%g
-s%@SGI_VIDEO_OBJS@%$SGI_VIDEO_OBJS%g
-s%@SGI_VIDEO_LIBS@%$SGI_VIDEO_LIBS%g
 s%@PASSWD_SRCS@%$PASSWD_SRCS%g
 s%@PASSWD_OBJS@%$PASSWD_OBJS%g
 s%@XMU_SRCS@%$XMU_SRCS%g
 s%@XMU_OBJS@%$XMU_OBJS%g
+s%@XMU_LIBS@%$XMU_LIBS%g
 s%@SAVER_GL_SRCS@%$SAVER_GL_SRCS%g
 s%@SAVER_GL_OBJS@%$SAVER_GL_OBJS%g
 s%@SAVER_GL_LIBS@%$SAVER_GL_LIBS%g
@@ -10049,10 +10088,6 @@ if test "$with_readdisplay_req" = yes -a "$have_readdisplay" = no ; then
   warn 'Use of XReadDisplay was requested, but it was not found.'
 fi
 
-if test "$with_sgivideo_req" = yes -a "$have_sgivideo" = no ; then
-  warn 'Use of the Iris Video Library was requested, but it was not found.'
-fi
-
 if test -n "$with_zippy_req"; then
   if test "$with_zippy_req" != "$ac_cv_zippy_program" ; then
     warnL "$with_zippy_req was requested as the Zippy program,"
@@ -10113,7 +10148,7 @@ do_dir_warning=no
 # M4 sucks!!
 
 rpmv=`(rpm -qv xscreensaver) 2>&- | \
-      sed 's/^xscreensaver-\([0-9][0-9]*[.][0-9][0-9]*\)-.*$/\1/'`
+      sed -n 's/^xscreensaver-\([0-9][0-9]*[.][0-9][0-9]*\)-.*$/\1/p'`
 
 
 if test \! -z "$rpmv" ; then
index 342988f7f9cd447006979626f285af9922729cda..9fbdfe306982b546950a86c456d8b9b19eec1551 100644 (file)
@@ -46,7 +46,7 @@ AC_DEFUN(AC_PROG_CC_ANSI,
       ;;
 
       *-dec-* )
-        AC_MSG_RESULT(DEC: adding -std1)
+        AC_MSG_RESULT(DEC: adding -std1 -ieee)
         CC="$CC -std1"
       ;;
 
@@ -745,6 +745,13 @@ AC_PROG_INSTALL
 AC_PROG_INSTALL_DIRS
 AC_PROG_MAKE_SET
 
+# By default, autoconf sets INSTALL_SCRIPT to '${INSTALL_PROGRAM}'.
+# That's wrong: it should be set to '${INSTALL}', so that one can
+# implement the "install-strip" target properly (strip executables,
+# but do not try to strip scripts.)
+#
+INSTALL_SCRIPT='${INSTALL}'
+
 # random libc stuff
 AC_HEADER_STDC
 AC_CHECK_HEADERS(unistd.h)
@@ -792,13 +799,11 @@ AC_CHECK_X_HEADER(X11/Xmu/Error.h, [have_xmu=yes])
 if test "$have_xmu" = no ; then
   XMU_SRCS='$(UTILS_SRC)/xmu.c'
   XMU_OBJS='$(UTILS_BIN)/xmu.o'
+  XMU_LIBS=''
 else
   XMU_SRCS=''
   XMU_OBJS=''
-  SAVER_LIBS="-lXmu $SAVER_LIBS"
-  HACK_LIBS="-lXmu $HACK_LIBS"
-  MOTIF_LIBS="-lXmu $MOTIF_LIBS"
-  GTK_LIBS="-lXmu $GTK_LIBS"
+  XMU_LIBS='-lXmu'
   AC_DEFINE(HAVE_XMU)
 fi
 
@@ -1087,7 +1092,7 @@ fi
 
 ###############################################################################
 #
-#       Check for the XF86VMODE server extension.
+#       Check for the XF86VMODE server extension (for virtual screens.)
 #
 ###############################################################################
 
@@ -1124,6 +1129,54 @@ elif test "$with_xf86vmode" != no; then
 fi
 
 
+###############################################################################
+#
+#       Check for the XF86VMODE server extension (for gamma fading.)
+#
+###############################################################################
+
+have_xf86gamma=no
+with_xf86gamma_req=unspecified
+AC_ARG_WITH(xf86gamma-ext,
+[  --with-xf86gamma-ext    Include support for XFree86 gamma fading.],
+  [with_xf86gamma="$withval"; with_xf86gamma_req="$withval"],
+  [with_xf86gamma=yes])
+
+HANDLE_X_PATH_ARG(with_xf86gamma, --with-xf86gamma-ext, xf86gamma)
+
+if test "$with_xf86gamma" = yes; then
+
+  # first check for xf86vmode.h, if we haven't already
+  if test "$have_xf86vmode" = yes; then
+    have_xf86gamma=yes
+  else
+    AC_CHECK_X_HEADER(X11/extensions/xf86vmode.h, [have_xf86gamma=yes])
+  fi
+
+  # if that succeeded, then check for the -lXxf86vm
+  if test "$have_xf86gamma" = yes; then
+    have_xf86gamma=no
+    AC_CHECK_X_LIB(Xxf86vm, XF86VidModeSetGamma,
+                  [have_xf86gamma=yes],
+                   [true], -lXext -lX11)
+  fi
+
+  # pull in the lib, if we haven't already
+  if test "$have_xf86gamma" = yes -a "$have_xf86vmode" = no; then
+    SAVER_LIBS="$SAVER_LIBS -lXxf86vm"
+  fi
+
+  # if that succeeded, then we've really got it.
+  if test "$have_xf86gamma" = yes; then
+    AC_DEFINE(HAVE_XF86VMODE_GAMMA)
+  fi
+
+elif test "$with_xf86gamma" != no; then
+  echo "error: must be yes or no: --with-xf86gamma-ext=$with_xf86vmode"
+  exit 1
+fi
+
+
 ###############################################################################
 #
 #       Check for HP XHPDisableReset and XHPEnableReset.
@@ -2328,38 +2381,6 @@ elif test "$with_readdisplay" != no; then
 fi
 
 
-###############################################################################
-#
-#       Check for the SGI Iris Video Library.
-#
-###############################################################################
-
-have_sgivideo=no
-with_sgivideo_req=unspecified
-AC_ARG_WITH(sgivideo,
-[  --with-sgivideo         Include support for SGI's Iris Video Library.],
-  [with_sgivideo="$withval"; with_sgivideo_req="$withval"],
-  [with_sgivideo=yes])
-
-HANDLE_X_PATH_ARG(with_sgivideo, --with-sgivideo, Iris Video)
-
-if test "$with_sgivideo" = yes; then
-  AC_CHECK_X_HEADER(dmedia/vl.h, have_sgivideo=yes)
-  if test "$have_sgivideo" = yes; then
-    have_sgivideo=no
-    AC_CHECK_LIB(vl, vlOpenVideo, [have_sgivideo=yes])
-    if test "$have_sgivideo" = yes; then
-      SGI_VIDEO_OBJS="$(UTILS_BIN)/sgivideo.o"
-      SGI_VIDEO_LIBS="-lvl"
-      AC_DEFINE(HAVE_SGI_VIDEO)
-    fi
-  fi
-elif test "$with_sgivideo" != no; then
-  echo "error: must be yes or no: --with-sgivideo=$with_sgivideo"
-  exit 1
-fi
-
-
 ###############################################################################
 #
 #       Check for a program to generate random text.
@@ -2597,7 +2618,7 @@ else
   LOCK_OBJS='$(NOLOCK_OBJS_1)'
 fi
 
-INSTALL_SETUID='$(INSTALL) $(SUID_FLAGS)'
+INSTALL_SETUID='$(INSTALL_PROGRAM) $(SUID_FLAGS)'
 
 if test "$need_setuid" = yes; then
   NEED_SETUID=yes
@@ -2653,13 +2674,12 @@ AC_SUBST(SETUID_HACKS)
 AC_SUBST(INSTALL_DIRS)
 AC_SUBST(NEED_SETUID)
 AC_SUBST(INSTALL_PAM)
-AC_SUBST(SGI_VIDEO_OBJS)
-AC_SUBST(SGI_VIDEO_LIBS)
 
 AC_SUBST(PASSWD_SRCS)
 AC_SUBST(PASSWD_OBJS)
 AC_SUBST(XMU_SRCS)
 AC_SUBST(XMU_OBJS)
+AC_SUBST(XMU_LIBS)
 AC_SUBST(SAVER_GL_SRCS)
 AC_SUBST(SAVER_GL_OBJS)
 AC_SUBST(SAVER_GL_LIBS)
@@ -2936,10 +2956,6 @@ if test "$with_readdisplay_req" = yes -a "$have_readdisplay" = no ; then
   warn 'Use of XReadDisplay was requested, but it was not found.'
 fi
 
-if test "$with_sgivideo_req" = yes -a "$have_sgivideo" = no ; then
-  warn 'Use of the Iris Video Library was requested, but it was not found.'
-fi
-
 if test -n "$with_zippy_req"; then
   if test "$with_zippy_req" != "$ac_cv_zippy_program" ; then
     warnL "$with_zippy_req was requested as the Zippy program,"
@@ -3000,7 +3016,7 @@ do_dir_warning=no
 # M4 sucks!!
 changequote(X,Y)
 rpmv=`(rpm -qv xscreensaver) 2>&- | \
-      sed 's/^xscreensaver-\([0-9][0-9]*[.][0-9][0-9]*\)-.*$/\1/'`
+      sed -n 's/^xscreensaver-\([0-9][0-9]*[.][0-9][0-9]*\)-.*$/\1/p'`
 changequote([,])
 
 if test \! -z "$rpmv" ; then
index 787a97211d6e0edbbbf66a53f933ce48b4c08ce8..c71601427b3f0075d32efe21bff185592668c855 100644 (file)
@@ -28,6 +28,7 @@ LDFLAGS               = @LDFLAGS@
 DEFS           = @DEFS@
 DEFS2          = $(DEFS) -DDEFAULT_PATH_PREFIX='"@HACKDIR@"'
 LIBS           = @LIBS@
+PERL           = @PERL@
 
 DEPEND         = @DEPEND@
 DEPEND_FLAGS   = @DEPEND_FLAGS@
@@ -46,6 +47,7 @@ X_CFLAGS      = @X_CFLAGS@
 X_LIBS         = @X_LIBS@
 X_PRE_LIBS     = @X_PRE_LIBS@
 X_EXTRA_LIBS   = @X_EXTRA_LIBS@
+XMU_LIBS       = @XMU_LIBS@
 
 # Note:
 #
@@ -59,6 +61,7 @@ X_EXTRA_LIBS  = @X_EXTRA_LIBS@
 #
 # SAVER_LIBS is the link line for "xscreensaver", and
 # CMD_LIBS is the link line for "xscreensaver-command".
+# GETIMG_LIBS is the link line for "xscreensaver-getimage".
 
 
 AD_DIR         = @APPDEFAULTS@
@@ -91,12 +94,12 @@ NOLOCK_SRCS_1       = lock.c
 NOLOCK_OBJS_1  = lock.o
 
 TEST_SRCS      = test-passwd.c test-uid.c test-xdpms.c test-grab.c \
-                 test-apm.c xdpyinfo.c
+                 test-apm.c test-fade.c xdpyinfo.c
 TEST_EXES      = test-passwd   test-uid   test-xdpms   test-grab \
-                 test-apm   xdpyinfo
+                 test-apm   test-fade   xdpyinfo
 
-MOTIF_LIBS     = @MOTIF_LIBS@ @XPM_LIBS@
-GTK_LIBS       = @GTK_LIBS@
+MOTIF_LIBS     = @MOTIF_LIBS@ @XPM_LIBS@ $(XMU_LIBS)
+GTK_LIBS       = @GTK_LIBS@ $(XMU_LIBS)
 
 XDPMS_LIBS     = @XDPMS_LIBS@
 
@@ -121,14 +124,29 @@ DEMO_UTIL_OBJS    = $(UTILS_BIN)/resources.o $(UTILS_BIN)/usleep.o \
                  $(UTILS_BIN)/visual.o
 
 SAVER_UTIL_SRCS        = $(UTILS_SRC)/fade.c $(UTILS_SRC)/overlay.c \
-                 $(UTILS_SRC)/logo.c $(UTILS_SRC)/spline.c \
-                 $(UTILS_SRC)/yarandom.c \
+                 $(UTILS_SRC)/logo.c $(UTILS_SRC)/yarandom.c \
                  $(DEMO_UTIL_SRCS)
 SAVER_UTIL_OBJS        = $(UTILS_BIN)/fade.o $(UTILS_BIN)/overlay.o \
-                 $(UTILS_BIN)/logo.o $(UTILS_BIN)/spline.o \
-                 $(UTILS_BIN)/yarandom.o \
+                 $(UTILS_BIN)/logo.o $(UTILS_BIN)/yarandom.o \
                  $(DEMO_UTIL_OBJS)
 
+GETIMG_SRCS_1  = xscreensaver-getimage.c
+GETIMG_OBJS_1  = xscreensaver-getimage.o
+
+GETIMG_SRCS    = $(GETIMG_SRCS_1) \
+                 $(UTILS_SRC)/colorbars.o $(UTILS_SRC)/resources.o \
+                 $(UTILS_SRC)/yarandom.o $(UTILS_SRC)/visual.o \
+                 $(UTILS_SRC)/usleep.o $(UTILS_SRC)/hsv.o \
+                 $(UTILS_SRC)/colors.o $(UTILS_SRC)/grabscreen.o \
+                 $(UTILS_SRC)/logo.o prefs.o $(XMU_SRCS)
+
+GETIMG_OBJS    = $(GETIMG_OBJS_1) \
+                 $(UTILS_BIN)/colorbars.o $(UTILS_BIN)/resources.o \
+                 $(UTILS_BIN)/yarandom.o $(UTILS_BIN)/visual.o \
+                 $(UTILS_BIN)/usleep.o $(UTILS_BIN)/hsv.o \
+                 $(UTILS_BIN)/colors.o $(UTILS_BIN)/grabscreen.o \
+                 $(UTILS_BIN)/logo.o prefs.o $(XMU_OBJS)
+
 SAVER_SRCS_1   = xscreensaver.c windows.c timers.c subprocs.c \
                  xset.c splash.c setuid.c stderr.c
 SAVER_OBJS_1   = xscreensaver.o windows.o timers.o subprocs.o \
@@ -148,22 +166,29 @@ DEMO_OBJS_1       = prefs.o dpms.o $(XMU_OBJS)
 DEMO_SRCS      = prefs.c dpms.c remote.c $(DEMO_UTIL_SRCS)
 DEMO_OBJS      = prefs.o dpms.o remote.o $(DEMO_UTIL_OBJS)
 
-SAVER_LIBS     = $(LIBS) $(X_LIBS) @SAVER_LIBS@ $(XDPMS_LIBS) $(GL_LIBS) \
-                 $(X_PRE_LIBS) -lXt -lX11 -lXext $(X_EXTRA_LIBS) \
+SAVER_LIBS     = $(LIBS) $(X_LIBS) $(XMU_LIBS) @SAVER_LIBS@ \
+                 $(XDPMS_LIBS) $(GL_LIBS) $(X_PRE_LIBS) \
+                 -lXt -lX11 -lXext $(X_EXTRA_LIBS) \
                  $(PASSWD_LIBS)
 
 CMD_LIBS       = $(LIBS) $(X_LIBS) \
                  $(X_PRE_LIBS) -lX11 -lXext $(X_EXTRA_LIBS)
 
-EXES           = xscreensaver xscreensaver-command xscreensaver-demo
+GETIMG_LIBS    = $(LIBS) $(X_LIBS) \
+                 $(X_PRE_LIBS) -lXt -lX11 $(XMU_LIBS) -lXext $(X_EXTRA_LIBS)
+
+EXES           = xscreensaver xscreensaver-command xscreensaver-demo \
+                 xscreensaver-getimage
 EXES2          = @ALL_DEMO_PROGRAMS@
+SCRIPTS                = xscreensaver-getimage-file xscreensaver-getimage-video
 
 HDRS           = XScreenSaver_ad.h xscreensaver.h prefs.h remote.h \
                  demo-Gtk-widgets.h demo-Gtk-stubs.h
 MEN            = xscreensaver.man xscreensaver-demo.man \
-                 xscreensaver-command.man
-ALL_MEN                = xscreensaver.man \
-                 xscreensaver-demo.man xscreensaver-command.man
+                 xscreensaver-command.man \
+                 xscreensaver-getimage.man \
+                 xscreensaver-getimage-file.man \
+                 xscreensaver-getimage-video.man
 EXTRAS         = README Makefile.in XScreenSaver.ad.in xscreensaver.pam \
                  xscreensaver.kss xscreensaver-demo.glade \
                  screensaver-properties.desktop.in \
@@ -176,21 +201,21 @@ VMSFILES  = compile_axp.com compile_decc.com link_axp.com link_decc.com \
 TARFILES       = $(EXTRAS) $(VMSFILES) $(SAVER_SRCS_1) \
                  $(MOTIF_SRCS) $(GTK_SRCS) $(PWENT_SRCS) \
                  $(KERBEROS_SRCS) $(PAM_SRCS) $(LOCK_SRCS_1) $(DEMO_SRCS_1) \
-                 $(CMD_SRCS) $(HDRS) $(TEST_SRCS) $(ALL_MEN)
+                 $(CMD_SRCS) $(GETIMG_SRCS_1) $(HDRS) $(SCRIPTS) \
+                 $(TEST_SRCS) $(MEN)
 
 
 default: $(EXES)
 all: $(EXES) $(EXES2)
 tests: $(TEST_EXES)
 
-install:   install-program   install-ad   install-gnome   install-kde   \
-          install-man   @INSTALL_PAM@
-uninstall: uninstall-program uninstall-ad uninstall-gnome uninstall-kde \
-          uninstall-man
+install:   install-program   install-ad    install-scripts \
+          install-gnome     install-kde   install-man   @INSTALL_PAM@
+uninstall: uninstall-program uninstall-ad  \
+          uninstall-gnome   uninstall-kde uninstall-man
 
 install-strip:
        $(MAKE) INSTALL_PROGRAM='$(INSTALL_PROGRAM) -s' \
-               INSTALL_SETUID='$(INSTALL_SETUID) -s' \
                install
 
 install-program: $(EXES)
@@ -220,14 +245,12 @@ install-program: $(EXES)
        fi ;                                                                  \
        echo $$inst xscreensaver $(install_prefix)$(bindir)/xscreensaver ;    \
        $$inst xscreensaver $(install_prefix)$(bindir)/xscreensaver
-       @echo $(INSTALL_PROGRAM) xscreensaver-command \
-         $(install_prefix)$(bindir)/xscreensaver-command ; \
        $(INSTALL_PROGRAM) xscreensaver-command \
          $(install_prefix)$(bindir)/xscreensaver-command
-       @echo $(INSTALL_PROGRAM) xscreensaver-demo \
-         $(install_prefix)$(bindir)/xscreensaver-demo ; \
        $(INSTALL_PROGRAM) xscreensaver-demo \
          $(install_prefix)$(bindir)/xscreensaver-demo
+       $(INSTALL_PROGRAM) xscreensaver-getimage \
+         $(install_prefix)$(bindir)/xscreensaver-getimage
 
 install-ad: XScreenSaver.ad
        @if [ ! -d $(install_prefix)$(AD_DIR) ]; then                         \
@@ -262,6 +285,33 @@ install-ad: XScreenSaver.ad
          fi                                                                  \
        fi
 
+install-scripts: $(SCRIPTS) munge-scripts
+       @for program in $(SCRIPTS); do                                  \
+         if [ -r $$program ] ; then                                    \
+           p=$$program ;                                               \
+         else                                                          \
+           p=$(srcdir)/$$program ;                                     \
+         fi ;                                                          \
+         echo $(INSTALL_SCRIPT) $$p                                    \
+           $(install_prefix)$(bindir)/$$program ;                      \
+         $(INSTALL_SCRIPT) $$p                                         \
+           $(install_prefix)$(bindir)/$$program ;                      \
+       done
+
+munge-scripts: $(SCRIPTS)
+       @tmp=/tmp/mf.$$$$ ;                                             \
+       perl="${PERL}" ;                                                \
+       for program in $(SCRIPTS); do                                   \
+         echo "adjusting location of perl in $$program..." ;           \
+         sed "s@^\(#!\)\(/[^ ]*/perl[^ ]*\)\(.*\)\$$@\1$$perl\3@"      \
+             < $(srcdir)/$$program > $$tmp ;                           \
+         if cmp -s $(srcdir)/$$program $$tmp ; then                    \
+           true ;                                                      \
+         else                                                          \
+           cat $$tmp > ./$$program ;                                   \
+         fi ;                                                          \
+       done
+
 install-man: $(MEN)
        @men="$(MEN)" ;                                                 \
        if [ ! -d $(install_prefix)$(man1dir) ]; then                   \
@@ -276,7 +326,7 @@ install-man: $(MEN)
        done
 
 uninstall-program:
-       @for program in $(EXES); do                                     \
+       @for program in $(EXES) $(SCRIPTS); do                          \
          echo rm -f $(install_prefix)$(bindir)/$$program ;             \
          rm -f $(install_prefix)$(bindir)/$$program ;                  \
        done
@@ -520,7 +570,7 @@ depend: XScreenSaver_ad.h
        $(DEPEND) -s '# DO NOT DELETE: updated by make depend'              \
        $(DEPEND_FLAGS) --                                                  \
        $(INCLUDES) $(DEFS) $(DEPEND_DEFINES) $(CFLAGS) $(X_CFLAGS) --      \
-       $(SAVER_SRCS) $(CMD_SRCS)
+       $(SAVER_SRCS) $(CMD_SRCS) $(GETIMG_SRCS_1)
 
 # Adds some dependencies to Makefile.in -- not totally accurate, but pretty
 # close.  This excludes dependencies on files in /usr/include, etc.  It tries
@@ -531,7 +581,7 @@ distdepend: update_ad_version update_man_version XScreenSaver_ad.h
        $(DEPEND) -w 0 -f -                                                 \
        -s '# DO NOT DELETE: updated by make distdepend' $(DEPEND_FLAGS) -- \
        $(INCLUDES) $(DEFS) $(DEPEND_DEFINES) $(CFLAGS) $(X_CFLAGS) --      \
-       $(SAVER_SRCS_1) $(MOTIF_SRCS) $(GTK_SRCS)                           \
+       $(SAVER_SRCS_1) $(MOTIF_SRCS) $(GTK_SRCS) $(GETIMG_SRCS_1)          \
        $(PWENT_SRCS) $(LOCK_SRCS_1) $(DEMO_SRCS_1) $(CMD_SRCS)             \
        $(TEST_SRCS) |                                                      \
        (                                                                   \
@@ -605,8 +655,8 @@ $(UTILS_BIN)/usleep.o:              $(UTILS_SRC)/usleep.c
 $(UTILS_BIN)/visual.o:         $(UTILS_SRC)/visual.c
 $(UTILS_BIN)/xmu.o:            $(UTILS_SRC)/xmu.c
 $(UTILS_BIN)/logo.o:           $(UTILS_SRC)/logo.c
-$(UTILS_BIN)/spline.o:         $(UTILS_SRC)/spline.c
 $(UTILS_BIN)/yarandom.o:       $(UTILS_SRC)/yarandom.c
+$(UTILS_BIN)/colorbars.o:      $(UTILS_SRC)/colorbars.c
 
 $(SAVER_UTIL_OBJS):
        cd $(UTILS_BIN) ; \
@@ -655,6 +705,8 @@ xscreensaver-demo-Gtk: $(DEMO_OBJS) $(GTK_OBJS)
        $(GTK_LIBS) $(X_PRE_LIBS) -lXt -lX11 $(XDPMS_LIBS) -lXext \
        $(X_EXTRA_LIBS)
 
+xscreensaver-getimage: $(GETIMG_OBJS)
+       $(CC) $(LDFLAGS) -o $@ $(GETIMG_OBJS) $(GETIMG_LIBS) -lm
 
 
 TEST_PASSWD_OBJS = test-passwd.o $(LOCK_OBJS_1) $(PASSWD_OBJS) \
@@ -678,6 +730,10 @@ test-grab: test-grab.o
 test-apm: test-apm.o
        $(CC) $(LDFLAGS) -o $@ test-apm.o $(SAVER_LIBS) -lapm
 
+TEST_FADE_OBJS = test-fade.o $(UTILS_SRC)/fade.o $(DEMO_UTIL_OBJS)
+test-fade: test-fade.o 
+       $(CC) $(LDFLAGS) -o $@ $(TEST_FADE_OBJS) $(SAVER_LIBS)
+
 
 xdpyinfo.o: xdpyinfo.c
        $(CC) -c $(INCLUDES) -DHAVE_GLX $(CFLAGS) $(X_CFLAGS) \
@@ -697,72 +753,51 @@ xdpyinfo: xdpyinfo.o
 xscreensaver.o: ../config.h
 xscreensaver.o: $(srcdir)/xscreensaver.h
 xscreensaver.o: $(srcdir)/prefs.h
-xscreensaver.o: $(UTILS_SRC)/version.h
-xscreensaver.o: $(UTILS_SRC)/yarandom.h
-xscreensaver.o: $(UTILS_SRC)/resources.h
-xscreensaver.o: $(UTILS_SRC)/visual.h
-xscreensaver.o: $(UTILS_SRC)/usleep.h
 xscreensaver.o: XScreenSaver_ad.h
 windows.o: ../config.h
 windows.o: $(srcdir)/xscreensaver.h
 windows.o: $(srcdir)/prefs.h
-windows.o: $(UTILS_SRC)/visual.h
-windows.o: $(UTILS_SRC)/fade.h
 timers.o: ../config.h
 timers.o: $(srcdir)/xscreensaver.h
 timers.o: $(srcdir)/prefs.h
 subprocs.o: ../config.h
 subprocs.o: $(srcdir)/xscreensaver.h
 subprocs.o: $(srcdir)/prefs.h
-subprocs.o: $(UTILS_SRC)/yarandom.h
-subprocs.o: $(UTILS_SRC)/visual.h
 xset.o: ../config.h
 xset.o: $(srcdir)/xscreensaver.h
 xset.o: $(srcdir)/prefs.h
 splash.o: ../config.h
 splash.o: $(srcdir)/xscreensaver.h
 splash.o: $(srcdir)/prefs.h
-splash.o: $(UTILS_SRC)/resources.h
 setuid.o: ../config.h
 setuid.o: $(srcdir)/xscreensaver.h
 setuid.o: $(srcdir)/prefs.h
 stderr.o: ../config.h
 stderr.o: $(srcdir)/xscreensaver.h
 stderr.o: $(srcdir)/prefs.h
-stderr.o: $(UTILS_SRC)/resources.h
-stderr.o: $(UTILS_SRC)/visual.h
 demo-Xm.o: ../config.h
-demo-Xm.o: $(UTILS_SRC)/version.h
 demo-Xm.o: $(srcdir)/prefs.h
-demo-Xm.o: $(UTILS_SRC)/resources.h
-demo-Xm.o: $(UTILS_SRC)/visual.h
 demo-Xm.o: $(srcdir)/remote.h
-demo-Xm.o: $(UTILS_SRC)/usleep.h
 demo-Xm.o: XScreenSaver_ad.h
 demo-Xm-widgets.o: ../config.h
 demo-Gtk.o: ../config.h
-demo-Gtk.o: $(UTILS_SRC)/version.h
 demo-Gtk.o: $(srcdir)/prefs.h
-demo-Gtk.o: $(UTILS_SRC)/resources.h
-demo-Gtk.o: $(UTILS_SRC)/visual.h
 demo-Gtk.o: $(srcdir)/remote.h
-demo-Gtk.o: $(UTILS_SRC)/usleep.h
-demo-Gtk.o: $(UTILS_SRC)/logo-50.xpm
-demo-Gtk.o: $(UTILS_SRC)/logo-180.xpm
 demo-Gtk.o: $(srcdir)/demo-Gtk-widgets.h
 demo-Gtk.o: XScreenSaver_ad.h
 demo-Gtk-widgets.o: ../config.h
 demo-Gtk-widgets.o: $(srcdir)/demo-Gtk-stubs.h
 demo-Gtk-widgets.o: $(srcdir)/demo-Gtk-widgets.h
+xscreensaver-getimage.o: ../config.h
+xscreensaver-getimage.o: $(srcdir)/prefs.h
+xscreensaver-getimage.o: XScreenSaver_ad.h
 passwd-pwent.o: ../config.h
 lock.o: ../config.h
 lock.o: $(srcdir)/xscreensaver.h
 lock.o: $(srcdir)/prefs.h
-lock.o: $(UTILS_SRC)/resources.h
 passwd.o: ../config.h
 prefs.o: ../config.h
 prefs.o: $(srcdir)/prefs.h
-prefs.o: $(UTILS_SRC)/resources.h
 dpms.o: ../config.h
 dpms.o: $(srcdir)/xscreensaver.h
 dpms.o: $(srcdir)/prefs.h
@@ -770,16 +805,15 @@ remote.o: ../config.h
 remote.o: $(srcdir)/remote.h
 xscreensaver-command.o: ../config.h
 xscreensaver-command.o: $(srcdir)/remote.h
-xscreensaver-command.o: $(UTILS_SRC)/version.h
 test-passwd.o: ../config.h
 test-passwd.o: $(srcdir)/xscreensaver.h
 test-passwd.o: $(srcdir)/prefs.h
-test-passwd.o: $(UTILS_SRC)/resources.h
-test-passwd.o: $(UTILS_SRC)/version.h
-test-passwd.o: $(UTILS_SRC)/visual.h
 test-passwd.o: XScreenSaver_ad.h
 test-uid.o: ../config.h
 test-xdpms.o: ../config.h
 test-grab.o: ../config.h
 test-apm.o: ../config.h
+test-fade.o: ../config.h
+test-fade.o: $(srcdir)/xscreensaver.h
+test-fade.o: $(srcdir)/prefs.h
 
index abb3dcab17a8bba6806d961a171a8c8073553cdf..e2d79ebd8e7416d4e62283152d7cf42a20885dca 100644 (file)
@@ -4,8 +4,8 @@
 !            a screen saver and locker for the X window system
 !                            by Jamie Zawinski
 !
-!                              version 3.31
-!                              29-Mar-2001
+!                              version 3.32
+!                              15-Apr-2001
 !
 ! See "man xscreensaver" for more info.  The latest version is always
 ! available at http://www.jwz.org/xscreensaver/
 *dpmsStandby:          2:00:00
 *dpmsSuspend:          2:00:00
 *dpmsOff:              4:00:00
+*grabDesktopImages:    True
+*grabVideoFrames:      False
+*chooseRandomImages:   False
+*imageDirectory:       
 *nice:                 10
 *lock:                 False
 *lockVTs:              True
index 7669ee6331331bb47a0139b67c1e1e8b56097db4..f45b5c87a140b00acc974b1b4156d3e089c388fc 100644 (file)
@@ -9,6 +9,10 @@
 "*dpmsStandby:         2:00:00",
 "*dpmsSuspend:         2:00:00",
 "*dpmsOff:             4:00:00",
+"*grabDesktopImages:   True",
+"*grabVideoFrames:     False",
+"*chooseRandomImages:  False",
+"*imageDirectory:      ",
 "*nice:                        10",
 "*lock:                        False",
 "*lockVTs:             True",
index 55c4358ffca03a66c13cd49ddc85497938123eb3..a9fadcd311acaae27f7aaf61a5c9d36627ef3134 100644 (file)
@@ -76,11 +76,13 @@ notebook_switch_page_cb                (GtkNotebook     *notebook,
                                         gpointer         user_data);
 
 void
-pref_changed_cb                        (GtkNotebook     *notebook,
-                                        GtkNotebookPage *page,
-                                        gint             page_num,
+pref_changed_cb                        (GtkToggleButton *togglebutton,
                                         gpointer         user_data);
 
 void
 enabled_cb                             (GtkToggleButton *togglebutton,
                                         gpointer         user_data);
+
+void
+browse_image_dir_cb                    (GtkButton       *button,
+                                        gpointer         user_data);
index 8066bbb5dfd2f3f2255386da326a8fd08ef39075..08392c1f497d08e6f13bc90a4dd3be266f197929 100644 (file)
@@ -73,18 +73,7 @@ create_xscreensaver_demo (void)
   GtkWidget *demo_tab;
   GtkWidget *options_vbox;
   GtkWidget *options_table;
-  GtkWidget *blanking_frame;
-  GtkWidget *blanking_table;
-  GtkWidget *lock_text;
-  GtkWidget *cycle_text;
-  GtkWidget *timeout_text;
-  GtkWidget *timeout_label;
-  GtkWidget *cycle_label;
-  GtkWidget *lock_label;
-  GtkWidget *blanking_dummy;
-  GtkWidget *blanking_hr;
-  GtkWidget *lock_button_eventbox;
-  GtkWidget *lock_button;
+  GtkWidget *options_table_2;
   GtkWidget *dpms_frame;
   GtkWidget *dpms_table;
   GtkWidget *dpms_off_text;
@@ -96,26 +85,50 @@ create_xscreensaver_demo (void)
   GtkWidget *dpms_dummy;
   GtkWidget *dpms_button_eventbox;
   GtkWidget *dpms_button;
-  GtkWidget *diag_frame;
-  GtkWidget *diag_table;
-  GtkWidget *verbose_button_eventbox;
-  GtkWidget *verbose_button;
-  GtkWidget *capture_button_eventbox;
-  GtkWidget *capture_button;
-  GtkWidget *splash_button_eventbox;
-  GtkWidget *splash_button;
   GtkWidget *cmap_frame;
   GtkWidget *cmap_table;
   GtkWidget *fade_text;
   GtkWidget *cmap_dummy;
   GtkWidget *fade_label;
-  GtkWidget *cmap_hr;
   GtkWidget *install_button_eventbox;
   GtkWidget *install_button;
   GtkWidget *fade_button_eventbox;
   GtkWidget *fade_button;
   GtkWidget *unfade_button_eventbox;
   GtkWidget *unfade_button;
+  GtkWidget *cmap_hr;
+  GtkWidget *options_table_1;
+  GtkWidget *grab_frame;
+  GtkWidget *grab_table;
+  GtkWidget *grab_image_eventbox;
+  GtkWidget *grab_image_button;
+  GtkWidget *image_browse_button;
+  GtkWidget *grab_video_eventbox;
+  GtkWidget *grab_video_button;
+  GtkWidget *grab_desk_eventbox;
+  GtkWidget *grab_desk_button;
+  GtkWidget *grab_dummy;
+  GtkWidget *image_text;
+  GtkWidget *blanking_frame;
+  GtkWidget *blanking_table;
+  GtkWidget *lock_text;
+  GtkWidget *cycle_text;
+  GtkWidget *timeout_text;
+  GtkWidget *timeout_label;
+  GtkWidget *cycle_label;
+  GtkWidget *lock_label;
+  GtkWidget *blanking_dummy;
+  GtkWidget *lock_button_eventbox;
+  GtkWidget *lock_button;
+  GtkWidget *blanking_hr;
+  GtkWidget *diag_frame;
+  GtkWidget *diag_table;
+  GtkWidget *splash_button_eventbox;
+  GtkWidget *splash_button;
+  GtkWidget *capture_button_eventbox;
+  GtkWidget *capture_button;
+  GtkWidget *verbose_button_eventbox;
+  GtkWidget *verbose_button;
   GtkWidget *options_tab;
   GtkAccelGroup *accel_group;
   GtkTooltips *tooltips;
@@ -128,7 +141,6 @@ create_xscreensaver_demo (void)
   gtk_widget_set_name (xscreensaver_demo, "xscreensaver_demo");
   gtk_object_set_data (GTK_OBJECT (xscreensaver_demo), "xscreensaver_demo", xscreensaver_demo);
   gtk_window_set_title (GTK_WINDOW (xscreensaver_demo), "XScreenSaver");
-  gtk_window_set_default_size (GTK_WINDOW (xscreensaver_demo), 600, 400);
   gtk_window_set_policy (GTK_WINDOW (xscreensaver_demo), TRUE, TRUE, FALSE);
   gtk_window_set_wmclass (GTK_WINDOW (xscreensaver_demo), "xscreensaver", "XScreenSaver");
 
@@ -600,155 +612,32 @@ create_xscreensaver_demo (void)
   gtk_widget_show (options_vbox);
   gtk_container_add (GTK_CONTAINER (notebook), options_vbox);
 
-  options_table = gtk_table_new (2, 2, TRUE);
+  options_table = gtk_table_new (1, 2, TRUE);
   gtk_widget_set_name (options_table, "options_table");
   gtk_widget_ref (options_table);
   gtk_object_set_data_full (GTK_OBJECT (xscreensaver_demo), "options_table", options_table,
                             (GtkDestroyNotify) gtk_widget_unref);
   gtk_widget_show (options_table);
   gtk_box_pack_start (GTK_BOX (options_vbox), options_table, FALSE, FALSE, 0);
-  gtk_container_set_border_width (GTK_CONTAINER (options_table), 10);
-  gtk_table_set_row_spacings (GTK_TABLE (options_table), 2);
-
-  blanking_frame = gtk_frame_new ("Blanking and Locking:");
-  gtk_widget_set_name (blanking_frame, "blanking_frame");
-  gtk_widget_ref (blanking_frame);
-  gtk_object_set_data_full (GTK_OBJECT (xscreensaver_demo), "blanking_frame", blanking_frame,
-                            (GtkDestroyNotify) gtk_widget_unref);
-  gtk_widget_show (blanking_frame);
-  gtk_table_attach (GTK_TABLE (options_table), blanking_frame, 0, 1, 0, 1,
-                    (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
-                    (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0);
-  gtk_container_set_border_width (GTK_CONTAINER (blanking_frame), 10);
-
-  blanking_table = gtk_table_new (5, 3, FALSE);
-  gtk_widget_set_name (blanking_table, "blanking_table");
-  gtk_widget_ref (blanking_table);
-  gtk_object_set_data_full (GTK_OBJECT (xscreensaver_demo), "blanking_table", blanking_table,
-                            (GtkDestroyNotify) gtk_widget_unref);
-  gtk_widget_show (blanking_table);
-  gtk_container_add (GTK_CONTAINER (blanking_frame), blanking_table);
-  gtk_container_set_border_width (GTK_CONTAINER (blanking_table), 10);
-  gtk_table_set_row_spacings (GTK_TABLE (blanking_table), 2);
-  gtk_table_set_col_spacings (GTK_TABLE (blanking_table), 10);
-
-  lock_text = gtk_entry_new_with_max_length (8);
-  gtk_widget_set_name (lock_text, "lock_text");
-  gtk_widget_ref (lock_text);
-  gtk_object_set_data_full (GTK_OBJECT (xscreensaver_demo), "lock_text", lock_text,
-                            (GtkDestroyNotify) gtk_widget_unref);
-  gtk_widget_show (lock_text);
-  gtk_table_attach (GTK_TABLE (blanking_table), lock_text, 1, 2, 4, 5,
-                    (GtkAttachOptions) (0),
-                    (GtkAttachOptions) (0), 0, 0);
-  gtk_tooltips_set_tip (tooltips, lock_text, "How long after the screen saver has activated until a password will be required (if  `Require Password' is also set.)", NULL);
-
-  cycle_text = gtk_entry_new_with_max_length (8);
-  gtk_widget_set_name (cycle_text, "cycle_text");
-  gtk_widget_ref (cycle_text);
-  gtk_object_set_data_full (GTK_OBJECT (xscreensaver_demo), "cycle_text", cycle_text,
-                            (GtkDestroyNotify) gtk_widget_unref);
-  gtk_widget_show (cycle_text);
-  gtk_table_attach (GTK_TABLE (blanking_table), cycle_text, 1, 2, 1, 2,
-                    (GtkAttachOptions) (0),
-                    (GtkAttachOptions) (0), 0, 0);
-  gtk_tooltips_set_tip (tooltips, cycle_text, "How long each demo will be run before moving on to another.", NULL);
-
-  timeout_text = gtk_entry_new_with_max_length (8);
-  gtk_widget_set_name (timeout_text, "timeout_text");
-  gtk_widget_ref (timeout_text);
-  gtk_object_set_data_full (GTK_OBJECT (xscreensaver_demo), "timeout_text", timeout_text,
-                            (GtkDestroyNotify) gtk_widget_unref);
-  gtk_widget_show (timeout_text);
-  gtk_table_attach (GTK_TABLE (blanking_table), timeout_text, 1, 2, 0, 1,
-                    (GtkAttachOptions) (0),
-                    (GtkAttachOptions) (0), 0, 0);
-  gtk_tooltips_set_tip (tooltips, timeout_text, "How long until the screen saver activates and begins running demos.", NULL);
-
-  timeout_label = gtk_label_new ("Blank After:");
-  gtk_widget_set_name (timeout_label, "timeout_label");
-  gtk_widget_ref (timeout_label);
-  gtk_object_set_data_full (GTK_OBJECT (xscreensaver_demo), "timeout_label", timeout_label,
-                            (GtkDestroyNotify) gtk_widget_unref);
-  gtk_widget_show (timeout_label);
-  gtk_table_attach (GTK_TABLE (blanking_table), timeout_label, 0, 1, 0, 1,
-                    (GtkAttachOptions) (GTK_FILL),
-                    (GtkAttachOptions) (0), 0, 0);
-  gtk_label_set_justify (GTK_LABEL (timeout_label), GTK_JUSTIFY_RIGHT);
-  gtk_misc_set_alignment (GTK_MISC (timeout_label), 1, 0.5);
-
-  cycle_label = gtk_label_new ("Cycle After:");
-  gtk_widget_set_name (cycle_label, "cycle_label");
-  gtk_widget_ref (cycle_label);
-  gtk_object_set_data_full (GTK_OBJECT (xscreensaver_demo), "cycle_label", cycle_label,
-                            (GtkDestroyNotify) gtk_widget_unref);
-  gtk_widget_show (cycle_label);
-  gtk_table_attach (GTK_TABLE (blanking_table), cycle_label, 0, 1, 1, 2,
-                    (GtkAttachOptions) (GTK_FILL),
-                    (GtkAttachOptions) (0), 0, 0);
-  gtk_label_set_justify (GTK_LABEL (cycle_label), GTK_JUSTIFY_RIGHT);
-  gtk_misc_set_alignment (GTK_MISC (cycle_label), 1, 0.5);
-
-  lock_label = gtk_label_new ("Lock After:");
-  gtk_widget_set_name (lock_label, "lock_label");
-  gtk_widget_ref (lock_label);
-  gtk_object_set_data_full (GTK_OBJECT (xscreensaver_demo), "lock_label", lock_label,
-                            (GtkDestroyNotify) gtk_widget_unref);
-  gtk_widget_show (lock_label);
-  gtk_table_attach (GTK_TABLE (blanking_table), lock_label, 0, 1, 4, 5,
-                    (GtkAttachOptions) (GTK_FILL),
-                    (GtkAttachOptions) (0), 0, 0);
-  gtk_label_set_justify (GTK_LABEL (lock_label), GTK_JUSTIFY_RIGHT);
-  gtk_misc_set_alignment (GTK_MISC (lock_label), 1, 0.5);
-
-  blanking_dummy = gtk_label_new ("");
-  gtk_widget_set_name (blanking_dummy, "blanking_dummy");
-  gtk_widget_ref (blanking_dummy);
-  gtk_object_set_data_full (GTK_OBJECT (xscreensaver_demo), "blanking_dummy", blanking_dummy,
-                            (GtkDestroyNotify) gtk_widget_unref);
-  gtk_widget_show (blanking_dummy);
-  gtk_table_attach (GTK_TABLE (blanking_table), blanking_dummy, 2, 3, 4, 5,
-                    (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
-                    (GtkAttachOptions) (0), 0, 0);
-  gtk_label_set_justify (GTK_LABEL (blanking_dummy), GTK_JUSTIFY_LEFT);
 
-  blanking_hr = gtk_hseparator_new ();
-  gtk_widget_set_name (blanking_hr, "blanking_hr");
-  gtk_widget_ref (blanking_hr);
-  gtk_object_set_data_full (GTK_OBJECT (xscreensaver_demo), "blanking_hr", blanking_hr,
+  options_table_2 = gtk_table_new (2, 1, FALSE);
+  gtk_widget_set_name (options_table_2, "options_table_2");
+  gtk_widget_ref (options_table_2);
+  gtk_object_set_data_full (GTK_OBJECT (xscreensaver_demo), "options_table_2", options_table_2,
                             (GtkDestroyNotify) gtk_widget_unref);
-  gtk_widget_show (blanking_hr);
-  gtk_table_attach (GTK_TABLE (blanking_table), blanking_hr, 0, 3, 2, 3,
+  gtk_widget_show (options_table_2);
+  gtk_table_attach (GTK_TABLE (options_table), options_table_2, 1, 2, 0, 1,
                     (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
                     (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0);
 
-  lock_button_eventbox = gtk_event_box_new ();
-  gtk_widget_set_name (lock_button_eventbox, "lock_button_eventbox");
-  gtk_widget_ref (lock_button_eventbox);
-  gtk_object_set_data_full (GTK_OBJECT (xscreensaver_demo), "lock_button_eventbox", lock_button_eventbox,
-                            (GtkDestroyNotify) gtk_widget_unref);
-  gtk_widget_show (lock_button_eventbox);
-  gtk_table_attach (GTK_TABLE (blanking_table), lock_button_eventbox, 0, 3, 3, 4,
-                    (GtkAttachOptions) (GTK_FILL),
-                    (GtkAttachOptions) (GTK_FILL), 0, 0);
-  gtk_tooltips_set_tip (tooltips, lock_button_eventbox, "Whether a password should be required to unblank the screen.", NULL);
-
-  lock_button = gtk_check_button_new_with_label ("Require Password");
-  gtk_widget_set_name (lock_button, "lock_button");
-  gtk_widget_ref (lock_button);
-  gtk_object_set_data_full (GTK_OBJECT (xscreensaver_demo), "lock_button", lock_button,
-                            (GtkDestroyNotify) gtk_widget_unref);
-  gtk_widget_show (lock_button);
-  gtk_container_add (GTK_CONTAINER (lock_button_eventbox), lock_button);
-
   dpms_frame = gtk_frame_new ("Display Power Management:");
   gtk_widget_set_name (dpms_frame, "dpms_frame");
   gtk_widget_ref (dpms_frame);
   gtk_object_set_data_full (GTK_OBJECT (xscreensaver_demo), "dpms_frame", dpms_frame,
                             (GtkDestroyNotify) gtk_widget_unref);
   gtk_widget_show (dpms_frame);
-  gtk_table_attach (GTK_TABLE (options_table), dpms_frame, 1, 2, 0, 1,
-                    (GtkAttachOptions) (GTK_FILL),
+  gtk_table_attach (GTK_TABLE (options_table_2), dpms_frame, 0, 1, 0, 1,
+                    (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
                     (GtkAttachOptions) (GTK_FILL), 0, 0);
   gtk_container_set_border_width (GTK_CONTAINER (dpms_frame), 10);
 
@@ -863,94 +752,14 @@ create_xscreensaver_demo (void)
   gtk_container_add (GTK_CONTAINER (dpms_button_eventbox), dpms_button);
   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (dpms_button), TRUE);
 
-  diag_frame = gtk_frame_new ("Diagnostics:");
-  gtk_widget_set_name (diag_frame, "diag_frame");
-  gtk_widget_ref (diag_frame);
-  gtk_object_set_data_full (GTK_OBJECT (xscreensaver_demo), "diag_frame", diag_frame,
-                            (GtkDestroyNotify) gtk_widget_unref);
-  gtk_widget_show (diag_frame);
-  gtk_table_attach (GTK_TABLE (options_table), diag_frame, 0, 1, 1, 2,
-                    (GtkAttachOptions) (GTK_FILL),
-                    (GtkAttachOptions) (GTK_FILL), 0, 0);
-  gtk_container_set_border_width (GTK_CONTAINER (diag_frame), 10);
-
-  diag_table = gtk_table_new (3, 1, FALSE);
-  gtk_widget_set_name (diag_table, "diag_table");
-  gtk_widget_ref (diag_table);
-  gtk_object_set_data_full (GTK_OBJECT (xscreensaver_demo), "diag_table", diag_table,
-                            (GtkDestroyNotify) gtk_widget_unref);
-  gtk_widget_show (diag_table);
-  gtk_container_add (GTK_CONTAINER (diag_frame), diag_table);
-  gtk_container_set_border_width (GTK_CONTAINER (diag_table), 10);
-  gtk_table_set_row_spacings (GTK_TABLE (diag_table), 2);
-  gtk_table_set_col_spacings (GTK_TABLE (diag_table), 10);
-
-  verbose_button_eventbox = gtk_event_box_new ();
-  gtk_widget_set_name (verbose_button_eventbox, "verbose_button_eventbox");
-  gtk_widget_ref (verbose_button_eventbox);
-  gtk_object_set_data_full (GTK_OBJECT (xscreensaver_demo), "verbose_button_eventbox", verbose_button_eventbox,
-                            (GtkDestroyNotify) gtk_widget_unref);
-  gtk_widget_show (verbose_button_eventbox);
-  gtk_table_attach (GTK_TABLE (diag_table), verbose_button_eventbox, 0, 1, 0, 1,
-                    (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
-                    (GtkAttachOptions) (GTK_FILL), 0, 0);
-  gtk_tooltips_set_tip (tooltips, verbose_button_eventbox, "Whether the daemon should print lots of debugging information.", NULL);
-
-  verbose_button = gtk_check_button_new_with_label ("Verbose Diagnostics");
-  gtk_widget_set_name (verbose_button, "verbose_button");
-  gtk_widget_ref (verbose_button);
-  gtk_object_set_data_full (GTK_OBJECT (xscreensaver_demo), "verbose_button", verbose_button,
-                            (GtkDestroyNotify) gtk_widget_unref);
-  gtk_widget_show (verbose_button);
-  gtk_container_add (GTK_CONTAINER (verbose_button_eventbox), verbose_button);
-
-  capture_button_eventbox = gtk_event_box_new ();
-  gtk_widget_set_name (capture_button_eventbox, "capture_button_eventbox");
-  gtk_widget_ref (capture_button_eventbox);
-  gtk_object_set_data_full (GTK_OBJECT (xscreensaver_demo), "capture_button_eventbox", capture_button_eventbox,
-                            (GtkDestroyNotify) gtk_widget_unref);
-  gtk_widget_show (capture_button_eventbox);
-  gtk_table_attach (GTK_TABLE (diag_table), capture_button_eventbox, 0, 1, 1, 2,
-                    (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
-                    (GtkAttachOptions) (GTK_FILL), 0, 0);
-  gtk_tooltips_set_tip (tooltips, capture_button_eventbox, "Whether the stdout and stderr streams of graphics demos should be displayed on the xscreensaver window.", NULL);
-
-  capture_button = gtk_check_button_new_with_label ("Display Subprocess Errors");
-  gtk_widget_set_name (capture_button, "capture_button");
-  gtk_widget_ref (capture_button);
-  gtk_object_set_data_full (GTK_OBJECT (xscreensaver_demo), "capture_button", capture_button,
-                            (GtkDestroyNotify) gtk_widget_unref);
-  gtk_widget_show (capture_button);
-  gtk_container_add (GTK_CONTAINER (capture_button_eventbox), capture_button);
-
-  splash_button_eventbox = gtk_event_box_new ();
-  gtk_widget_set_name (splash_button_eventbox, "splash_button_eventbox");
-  gtk_widget_ref (splash_button_eventbox);
-  gtk_object_set_data_full (GTK_OBJECT (xscreensaver_demo), "splash_button_eventbox", splash_button_eventbox,
-                            (GtkDestroyNotify) gtk_widget_unref);
-  gtk_widget_show (splash_button_eventbox);
-  gtk_table_attach (GTK_TABLE (diag_table), splash_button_eventbox, 0, 1, 2, 3,
-                    (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
-                    (GtkAttachOptions) (0), 0, 0);
-  gtk_tooltips_set_tip (tooltips, splash_button_eventbox, "Whether the splash screen (with the version number and `Help' button) should be momentarily displayed when the daemon first starts up.", NULL);
-
-  splash_button = gtk_check_button_new_with_label ("Display Splash Screen at Startup");
-  gtk_widget_set_name (splash_button, "splash_button");
-  gtk_widget_ref (splash_button);
-  gtk_object_set_data_full (GTK_OBJECT (xscreensaver_demo), "splash_button", splash_button,
-                            (GtkDestroyNotify) gtk_widget_unref);
-  gtk_widget_show (splash_button);
-  gtk_container_add (GTK_CONTAINER (splash_button_eventbox), splash_button);
-  gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (splash_button), TRUE);
-
-  cmap_frame = gtk_frame_new ("Colormaps: (8-bit displays only)");
+  cmap_frame = gtk_frame_new ("Colormaps:");
   gtk_widget_set_name (cmap_frame, "cmap_frame");
   gtk_widget_ref (cmap_frame);
   gtk_object_set_data_full (GTK_OBJECT (xscreensaver_demo), "cmap_frame", cmap_frame,
                             (GtkDestroyNotify) gtk_widget_unref);
   gtk_widget_show (cmap_frame);
-  gtk_table_attach (GTK_TABLE (options_table), cmap_frame, 1, 2, 1, 2,
-                    (GtkAttachOptions) (GTK_FILL),
+  gtk_table_attach (GTK_TABLE (options_table_2), cmap_frame, 0, 1, 1, 2,
+                    (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
                     (GtkAttachOptions) (GTK_FILL), 0, 0);
   gtk_container_set_border_width (GTK_CONTAINER (cmap_frame), 10);
 
@@ -999,16 +808,6 @@ create_xscreensaver_demo (void)
   gtk_label_set_justify (GTK_LABEL (fade_label), GTK_JUSTIFY_RIGHT);
   gtk_misc_set_alignment (GTK_MISC (fade_label), 1, 0.5);
 
-  cmap_hr = gtk_hseparator_new ();
-  gtk_widget_set_name (cmap_hr, "cmap_hr");
-  gtk_widget_ref (cmap_hr);
-  gtk_object_set_data_full (GTK_OBJECT (xscreensaver_demo), "cmap_hr", cmap_hr,
-                            (GtkDestroyNotify) gtk_widget_unref);
-  gtk_widget_show (cmap_hr);
-  gtk_table_attach (GTK_TABLE (cmap_table), cmap_hr, 0, 3, 1, 2,
-                    (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
-                    (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0);
-
   install_button_eventbox = gtk_event_box_new ();
   gtk_widget_set_name (install_button_eventbox, "install_button_eventbox");
   gtk_widget_ref (install_button_eventbox);
@@ -1066,6 +865,347 @@ create_xscreensaver_demo (void)
   gtk_widget_show (unfade_button);
   gtk_container_add (GTK_CONTAINER (unfade_button_eventbox), unfade_button);
 
+  cmap_hr = gtk_hseparator_new ();
+  gtk_widget_set_name (cmap_hr, "cmap_hr");
+  gtk_widget_ref (cmap_hr);
+  gtk_object_set_data_full (GTK_OBJECT (xscreensaver_demo), "cmap_hr", cmap_hr,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (cmap_hr);
+  gtk_table_attach (GTK_TABLE (cmap_table), cmap_hr, 0, 3, 1, 2,
+                    (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
+                    (GtkAttachOptions) (GTK_FILL), 0, 2);
+
+  options_table_1 = gtk_table_new (3, 1, FALSE);
+  gtk_widget_set_name (options_table_1, "options_table_1");
+  gtk_widget_ref (options_table_1);
+  gtk_object_set_data_full (GTK_OBJECT (xscreensaver_demo), "options_table_1", options_table_1,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (options_table_1);
+  gtk_table_attach (GTK_TABLE (options_table), options_table_1, 0, 1, 0, 1,
+                    (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
+                    (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0);
+
+  grab_frame = gtk_frame_new ("Image Manipulation:");
+  gtk_widget_set_name (grab_frame, "grab_frame");
+  gtk_widget_ref (grab_frame);
+  gtk_object_set_data_full (GTK_OBJECT (xscreensaver_demo), "grab_frame", grab_frame,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (grab_frame);
+  gtk_table_attach (GTK_TABLE (options_table_1), grab_frame, 0, 1, 1, 2,
+                    (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
+                    (GtkAttachOptions) (GTK_FILL), 0, 0);
+  gtk_container_set_border_width (GTK_CONTAINER (grab_frame), 10);
+
+  grab_table = gtk_table_new (4, 3, FALSE);
+  gtk_widget_set_name (grab_table, "grab_table");
+  gtk_widget_ref (grab_table);
+  gtk_object_set_data_full (GTK_OBJECT (xscreensaver_demo), "grab_table", grab_table,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (grab_table);
+  gtk_container_add (GTK_CONTAINER (grab_frame), grab_table);
+  gtk_container_set_border_width (GTK_CONTAINER (grab_table), 10);
+
+  grab_image_eventbox = gtk_event_box_new ();
+  gtk_widget_set_name (grab_image_eventbox, "grab_image_eventbox");
+  gtk_widget_ref (grab_image_eventbox);
+  gtk_object_set_data_full (GTK_OBJECT (xscreensaver_demo), "grab_image_eventbox", grab_image_eventbox,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (grab_image_eventbox);
+  gtk_table_attach (GTK_TABLE (grab_table), grab_image_eventbox, 0, 3, 2, 3,
+                    (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
+                    (GtkAttachOptions) (GTK_FILL), 0, 0);
+  gtk_tooltips_set_tip (tooltips, grab_image_eventbox, "Whether the image-manipulating modes should operate on random images loaded from disk.", NULL);
+
+  grab_image_button = gtk_check_button_new_with_label ("Choose Random Image:");
+  gtk_widget_set_name (grab_image_button, "grab_image_button");
+  gtk_widget_ref (grab_image_button);
+  gtk_object_set_data_full (GTK_OBJECT (xscreensaver_demo), "grab_image_button", grab_image_button,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (grab_image_button);
+  gtk_container_add (GTK_CONTAINER (grab_image_eventbox), grab_image_button);
+
+  image_browse_button = gtk_button_new_with_label ("Browse");
+  gtk_widget_set_name (image_browse_button, "image_browse_button");
+  gtk_widget_ref (image_browse_button);
+  gtk_object_set_data_full (GTK_OBJECT (xscreensaver_demo), "image_browse_button", image_browse_button,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (image_browse_button);
+  gtk_table_attach (GTK_TABLE (grab_table), image_browse_button, 2, 3, 3, 4,
+                    (GtkAttachOptions) (0),
+                    (GtkAttachOptions) (0), 4, 0);
+
+  grab_video_eventbox = gtk_event_box_new ();
+  gtk_widget_set_name (grab_video_eventbox, "grab_video_eventbox");
+  gtk_widget_ref (grab_video_eventbox);
+  gtk_object_set_data_full (GTK_OBJECT (xscreensaver_demo), "grab_video_eventbox", grab_video_eventbox,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (grab_video_eventbox);
+  gtk_table_attach (GTK_TABLE (grab_table), grab_video_eventbox, 0, 3, 1, 2,
+                    (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
+                    (GtkAttachOptions) (GTK_FILL), 0, 0);
+  gtk_tooltips_set_tip (tooltips, grab_video_eventbox, "Whether the image-manipulating modes should operate on images captured from the system's video input (if there is one).", NULL);
+
+  grab_video_button = gtk_check_button_new_with_label ("Grab Video Frames");
+  gtk_widget_set_name (grab_video_button, "grab_video_button");
+  gtk_widget_ref (grab_video_button);
+  gtk_object_set_data_full (GTK_OBJECT (xscreensaver_demo), "grab_video_button", grab_video_button,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (grab_video_button);
+  gtk_container_add (GTK_CONTAINER (grab_video_eventbox), grab_video_button);
+
+  grab_desk_eventbox = gtk_event_box_new ();
+  gtk_widget_set_name (grab_desk_eventbox, "grab_desk_eventbox");
+  gtk_widget_ref (grab_desk_eventbox);
+  gtk_object_set_data_full (GTK_OBJECT (xscreensaver_demo), "grab_desk_eventbox", grab_desk_eventbox,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (grab_desk_eventbox);
+  gtk_table_attach (GTK_TABLE (grab_table), grab_desk_eventbox, 0, 3, 0, 1,
+                    (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
+                    (GtkAttachOptions) (GTK_FILL), 0, 0);
+  gtk_tooltips_set_tip (tooltips, grab_desk_eventbox, "Whether the image-manipulating modes should be allowed to operate on an image of your desktop.", NULL);
+
+  grab_desk_button = gtk_check_button_new_with_label ("Grab Desktop Images");
+  gtk_widget_set_name (grab_desk_button, "grab_desk_button");
+  gtk_widget_ref (grab_desk_button);
+  gtk_object_set_data_full (GTK_OBJECT (xscreensaver_demo), "grab_desk_button", grab_desk_button,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (grab_desk_button);
+  gtk_container_add (GTK_CONTAINER (grab_desk_eventbox), grab_desk_button);
+
+  grab_dummy = gtk_label_new ("");
+  gtk_widget_set_name (grab_dummy, "grab_dummy");
+  gtk_widget_ref (grab_dummy);
+  gtk_object_set_data_full (GTK_OBJECT (xscreensaver_demo), "grab_dummy", grab_dummy,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (grab_dummy);
+  gtk_table_attach (GTK_TABLE (grab_table), grab_dummy, 0, 1, 3, 4,
+                    (GtkAttachOptions) (GTK_SHRINK | GTK_FILL),
+                    (GtkAttachOptions) (GTK_SHRINK), 0, 0);
+  gtk_label_set_justify (GTK_LABEL (grab_dummy), GTK_JUSTIFY_LEFT);
+  gtk_misc_set_padding (GTK_MISC (grab_dummy), 8, 0);
+
+  image_text = gtk_entry_new ();
+  gtk_widget_set_name (image_text, "image_text");
+  gtk_widget_ref (image_text);
+  gtk_object_set_data_full (GTK_OBJECT (xscreensaver_demo), "image_text", image_text,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (image_text);
+  gtk_table_attach (GTK_TABLE (grab_table), image_text, 1, 2, 3, 4,
+                    (GtkAttachOptions) (GTK_SHRINK | GTK_FILL),
+                    (GtkAttachOptions) (0), 0, 0);
+  gtk_tooltips_set_tip (tooltips, image_text, "The directory from which images will be randomly chosen.", NULL);
+
+  blanking_frame = gtk_frame_new ("Blanking and Locking:");
+  gtk_widget_set_name (blanking_frame, "blanking_frame");
+  gtk_widget_ref (blanking_frame);
+  gtk_object_set_data_full (GTK_OBJECT (xscreensaver_demo), "blanking_frame", blanking_frame,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (blanking_frame);
+  gtk_table_attach (GTK_TABLE (options_table_1), blanking_frame, 0, 1, 0, 1,
+                    (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
+                    (GtkAttachOptions) (GTK_FILL), 0, 0);
+  gtk_container_set_border_width (GTK_CONTAINER (blanking_frame), 10);
+
+  blanking_table = gtk_table_new (5, 3, FALSE);
+  gtk_widget_set_name (blanking_table, "blanking_table");
+  gtk_widget_ref (blanking_table);
+  gtk_object_set_data_full (GTK_OBJECT (xscreensaver_demo), "blanking_table", blanking_table,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (blanking_table);
+  gtk_container_add (GTK_CONTAINER (blanking_frame), blanking_table);
+  gtk_container_set_border_width (GTK_CONTAINER (blanking_table), 10);
+  gtk_table_set_row_spacings (GTK_TABLE (blanking_table), 2);
+  gtk_table_set_col_spacings (GTK_TABLE (blanking_table), 10);
+
+  lock_text = gtk_entry_new_with_max_length (8);
+  gtk_widget_set_name (lock_text, "lock_text");
+  gtk_widget_ref (lock_text);
+  gtk_object_set_data_full (GTK_OBJECT (xscreensaver_demo), "lock_text", lock_text,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (lock_text);
+  gtk_table_attach (GTK_TABLE (blanking_table), lock_text, 1, 2, 4, 5,
+                    (GtkAttachOptions) (0),
+                    (GtkAttachOptions) (0), 0, 0);
+  gtk_tooltips_set_tip (tooltips, lock_text, "How long after the screen saver has activated until a password will be required (if  `Require Password' is also set.)", NULL);
+
+  cycle_text = gtk_entry_new_with_max_length (8);
+  gtk_widget_set_name (cycle_text, "cycle_text");
+  gtk_widget_ref (cycle_text);
+  gtk_object_set_data_full (GTK_OBJECT (xscreensaver_demo), "cycle_text", cycle_text,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (cycle_text);
+  gtk_table_attach (GTK_TABLE (blanking_table), cycle_text, 1, 2, 1, 2,
+                    (GtkAttachOptions) (0),
+                    (GtkAttachOptions) (0), 0, 0);
+  gtk_tooltips_set_tip (tooltips, cycle_text, "How long each demo will be run before moving on to another.", NULL);
+
+  timeout_text = gtk_entry_new_with_max_length (8);
+  gtk_widget_set_name (timeout_text, "timeout_text");
+  gtk_widget_ref (timeout_text);
+  gtk_object_set_data_full (GTK_OBJECT (xscreensaver_demo), "timeout_text", timeout_text,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (timeout_text);
+  gtk_table_attach (GTK_TABLE (blanking_table), timeout_text, 1, 2, 0, 1,
+                    (GtkAttachOptions) (0),
+                    (GtkAttachOptions) (0), 0, 0);
+  gtk_tooltips_set_tip (tooltips, timeout_text, "How long until the screen saver activates and begins running demos.", NULL);
+
+  timeout_label = gtk_label_new ("Blank After:");
+  gtk_widget_set_name (timeout_label, "timeout_label");
+  gtk_widget_ref (timeout_label);
+  gtk_object_set_data_full (GTK_OBJECT (xscreensaver_demo), "timeout_label", timeout_label,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (timeout_label);
+  gtk_table_attach (GTK_TABLE (blanking_table), timeout_label, 0, 1, 0, 1,
+                    (GtkAttachOptions) (GTK_FILL),
+                    (GtkAttachOptions) (0), 0, 0);
+  gtk_label_set_justify (GTK_LABEL (timeout_label), GTK_JUSTIFY_RIGHT);
+  gtk_misc_set_alignment (GTK_MISC (timeout_label), 1, 0.5);
+
+  cycle_label = gtk_label_new ("Cycle After:");
+  gtk_widget_set_name (cycle_label, "cycle_label");
+  gtk_widget_ref (cycle_label);
+  gtk_object_set_data_full (GTK_OBJECT (xscreensaver_demo), "cycle_label", cycle_label,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (cycle_label);
+  gtk_table_attach (GTK_TABLE (blanking_table), cycle_label, 0, 1, 1, 2,
+                    (GtkAttachOptions) (GTK_FILL),
+                    (GtkAttachOptions) (0), 0, 0);
+  gtk_label_set_justify (GTK_LABEL (cycle_label), GTK_JUSTIFY_RIGHT);
+  gtk_misc_set_alignment (GTK_MISC (cycle_label), 1, 0.5);
+
+  lock_label = gtk_label_new ("Lock After:");
+  gtk_widget_set_name (lock_label, "lock_label");
+  gtk_widget_ref (lock_label);
+  gtk_object_set_data_full (GTK_OBJECT (xscreensaver_demo), "lock_label", lock_label,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (lock_label);
+  gtk_table_attach (GTK_TABLE (blanking_table), lock_label, 0, 1, 4, 5,
+                    (GtkAttachOptions) (GTK_FILL),
+                    (GtkAttachOptions) (0), 0, 0);
+  gtk_label_set_justify (GTK_LABEL (lock_label), GTK_JUSTIFY_RIGHT);
+  gtk_misc_set_alignment (GTK_MISC (lock_label), 1, 0.5);
+
+  blanking_dummy = gtk_label_new ("");
+  gtk_widget_set_name (blanking_dummy, "blanking_dummy");
+  gtk_widget_ref (blanking_dummy);
+  gtk_object_set_data_full (GTK_OBJECT (xscreensaver_demo), "blanking_dummy", blanking_dummy,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (blanking_dummy);
+  gtk_table_attach (GTK_TABLE (blanking_table), blanking_dummy, 2, 3, 4, 5,
+                    (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
+                    (GtkAttachOptions) (0), 0, 0);
+  gtk_label_set_justify (GTK_LABEL (blanking_dummy), GTK_JUSTIFY_LEFT);
+
+  lock_button_eventbox = gtk_event_box_new ();
+  gtk_widget_set_name (lock_button_eventbox, "lock_button_eventbox");
+  gtk_widget_ref (lock_button_eventbox);
+  gtk_object_set_data_full (GTK_OBJECT (xscreensaver_demo), "lock_button_eventbox", lock_button_eventbox,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (lock_button_eventbox);
+  gtk_table_attach (GTK_TABLE (blanking_table), lock_button_eventbox, 0, 3, 3, 4,
+                    (GtkAttachOptions) (GTK_FILL),
+                    (GtkAttachOptions) (GTK_FILL), 0, 0);
+  gtk_tooltips_set_tip (tooltips, lock_button_eventbox, "Whether a password should be required to unblank the screen.", NULL);
+
+  lock_button = gtk_check_button_new_with_label ("Require Password");
+  gtk_widget_set_name (lock_button, "lock_button");
+  gtk_widget_ref (lock_button);
+  gtk_object_set_data_full (GTK_OBJECT (xscreensaver_demo), "lock_button", lock_button,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (lock_button);
+  gtk_container_add (GTK_CONTAINER (lock_button_eventbox), lock_button);
+
+  blanking_hr = gtk_hseparator_new ();
+  gtk_widget_set_name (blanking_hr, "blanking_hr");
+  gtk_widget_ref (blanking_hr);
+  gtk_object_set_data_full (GTK_OBJECT (xscreensaver_demo), "blanking_hr", blanking_hr,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (blanking_hr);
+  gtk_table_attach (GTK_TABLE (blanking_table), blanking_hr, 0, 3, 2, 3,
+                    (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
+                    (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 2);
+
+  diag_frame = gtk_frame_new ("Diagnostics:");
+  gtk_widget_set_name (diag_frame, "diag_frame");
+  gtk_widget_ref (diag_frame);
+  gtk_object_set_data_full (GTK_OBJECT (xscreensaver_demo), "diag_frame", diag_frame,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (diag_frame);
+  gtk_table_attach (GTK_TABLE (options_table_1), diag_frame, 0, 1, 2, 3,
+                    (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
+                    (GtkAttachOptions) (GTK_FILL), 0, 0);
+  gtk_container_set_border_width (GTK_CONTAINER (diag_frame), 10);
+
+  diag_table = gtk_table_new (3, 1, FALSE);
+  gtk_widget_set_name (diag_table, "diag_table");
+  gtk_widget_ref (diag_table);
+  gtk_object_set_data_full (GTK_OBJECT (xscreensaver_demo), "diag_table", diag_table,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (diag_table);
+  gtk_container_add (GTK_CONTAINER (diag_frame), diag_table);
+  gtk_container_set_border_width (GTK_CONTAINER (diag_table), 10);
+  gtk_table_set_row_spacings (GTK_TABLE (diag_table), 2);
+  gtk_table_set_col_spacings (GTK_TABLE (diag_table), 10);
+
+  splash_button_eventbox = gtk_event_box_new ();
+  gtk_widget_set_name (splash_button_eventbox, "splash_button_eventbox");
+  gtk_widget_ref (splash_button_eventbox);
+  gtk_object_set_data_full (GTK_OBJECT (xscreensaver_demo), "splash_button_eventbox", splash_button_eventbox,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (splash_button_eventbox);
+  gtk_table_attach (GTK_TABLE (diag_table), splash_button_eventbox, 0, 1, 2, 3,
+                    (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
+                    (GtkAttachOptions) (0), 0, 0);
+  gtk_tooltips_set_tip (tooltips, splash_button_eventbox, "Whether the splash screen (with the version number and `Help' button) should be momentarily displayed when the daemon first starts up.", NULL);
+
+  splash_button = gtk_check_button_new_with_label ("Display Splash Screen at Startup");
+  gtk_widget_set_name (splash_button, "splash_button");
+  gtk_widget_ref (splash_button);
+  gtk_object_set_data_full (GTK_OBJECT (xscreensaver_demo), "splash_button", splash_button,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (splash_button);
+  gtk_container_add (GTK_CONTAINER (splash_button_eventbox), splash_button);
+  gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (splash_button), TRUE);
+
+  capture_button_eventbox = gtk_event_box_new ();
+  gtk_widget_set_name (capture_button_eventbox, "capture_button_eventbox");
+  gtk_widget_ref (capture_button_eventbox);
+  gtk_object_set_data_full (GTK_OBJECT (xscreensaver_demo), "capture_button_eventbox", capture_button_eventbox,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (capture_button_eventbox);
+  gtk_table_attach (GTK_TABLE (diag_table), capture_button_eventbox, 0, 1, 1, 2,
+                    (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
+                    (GtkAttachOptions) (0), 0, 0);
+  gtk_tooltips_set_tip (tooltips, capture_button_eventbox, "Whether the stdout and stderr streams of graphics demos should be displayed on the xscreensaver window.", NULL);
+
+  capture_button = gtk_check_button_new_with_label ("Display Subprocess Errors");
+  gtk_widget_set_name (capture_button, "capture_button");
+  gtk_widget_ref (capture_button);
+  gtk_object_set_data_full (GTK_OBJECT (xscreensaver_demo), "capture_button", capture_button,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (capture_button);
+  gtk_container_add (GTK_CONTAINER (capture_button_eventbox), capture_button);
+
+  verbose_button_eventbox = gtk_event_box_new ();
+  gtk_widget_set_name (verbose_button_eventbox, "verbose_button_eventbox");
+  gtk_widget_ref (verbose_button_eventbox);
+  gtk_object_set_data_full (GTK_OBJECT (xscreensaver_demo), "verbose_button_eventbox", verbose_button_eventbox,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (verbose_button_eventbox);
+  gtk_table_attach (GTK_TABLE (diag_table), verbose_button_eventbox, 0, 1, 0, 1,
+                    (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
+                    (GtkAttachOptions) (0), 0, 0);
+  gtk_tooltips_set_tip (tooltips, verbose_button_eventbox, "Whether the daemon should print lots of debugging information.", NULL);
+
+  verbose_button = gtk_check_button_new_with_label ("Verbose Diagnostics");
+  gtk_widget_set_name (verbose_button, "verbose_button");
+  gtk_widget_ref (verbose_button);
+  gtk_object_set_data_full (GTK_OBJECT (xscreensaver_demo), "verbose_button", verbose_button,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (verbose_button);
+  gtk_container_add (GTK_CONTAINER (verbose_button_eventbox), verbose_button);
+
   options_tab = gtk_label_new ("Screensaver Options");
   gtk_widget_set_name (options_tab, "options_tab");
   gtk_widget_ref (options_tab);
@@ -1122,70 +1262,88 @@ create_xscreensaver_demo (void)
   gtk_signal_connect (GTK_OBJECT (manual), "clicked",
                       GTK_SIGNAL_FUNC (manual_cb),
                       NULL);
-  gtk_signal_connect (GTK_OBJECT (lock_text), "activate",
+  gtk_signal_connect (GTK_OBJECT (dpms_off_text), "activate",
                       GTK_SIGNAL_FUNC (pref_changed_cb),
                       NULL);
-  gtk_signal_connect (GTK_OBJECT (lock_text), "focus_out_event",
+  gtk_signal_connect (GTK_OBJECT (dpms_off_text), "focus_out_event",
                       GTK_SIGNAL_FUNC (pref_changed_cb),
                       NULL);
-  gtk_signal_connect (GTK_OBJECT (cycle_text), "activate",
+  gtk_signal_connect (GTK_OBJECT (dpms_suspend_text), "activate",
                       GTK_SIGNAL_FUNC (pref_changed_cb),
                       NULL);
-  gtk_signal_connect (GTK_OBJECT (cycle_text), "focus_out_event",
+  gtk_signal_connect (GTK_OBJECT (dpms_suspend_text), "focus_out_event",
                       GTK_SIGNAL_FUNC (pref_changed_cb),
                       NULL);
-  gtk_signal_connect (GTK_OBJECT (timeout_text), "activate",
+  gtk_signal_connect (GTK_OBJECT (dpms_standby_text), "activate",
                       GTK_SIGNAL_FUNC (pref_changed_cb),
                       NULL);
-  gtk_signal_connect (GTK_OBJECT (timeout_text), "focus_out_event",
+  gtk_signal_connect (GTK_OBJECT (dpms_standby_text), "focus_out_event",
                       GTK_SIGNAL_FUNC (pref_changed_cb),
                       NULL);
-  gtk_signal_connect (GTK_OBJECT (lock_button), "toggled",
+  gtk_signal_connect (GTK_OBJECT (dpms_button), "toggled",
                       GTK_SIGNAL_FUNC (pref_changed_cb),
                       NULL);
-  gtk_signal_connect (GTK_OBJECT (dpms_off_text), "activate",
+  gtk_signal_connect (GTK_OBJECT (fade_text), "activate",
                       GTK_SIGNAL_FUNC (pref_changed_cb),
                       NULL);
-  gtk_signal_connect (GTK_OBJECT (dpms_off_text), "focus_out_event",
+  gtk_signal_connect (GTK_OBJECT (fade_text), "focus_out_event",
                       GTK_SIGNAL_FUNC (pref_changed_cb),
                       NULL);
-  gtk_signal_connect (GTK_OBJECT (dpms_suspend_text), "activate",
+  gtk_signal_connect (GTK_OBJECT (install_button), "toggled",
                       GTK_SIGNAL_FUNC (pref_changed_cb),
                       NULL);
-  gtk_signal_connect (GTK_OBJECT (dpms_suspend_text), "focus_out_event",
+  gtk_signal_connect (GTK_OBJECT (fade_button), "toggled",
                       GTK_SIGNAL_FUNC (pref_changed_cb),
                       NULL);
-  gtk_signal_connect (GTK_OBJECT (dpms_standby_text), "activate",
+  gtk_signal_connect (GTK_OBJECT (unfade_button), "toggled",
                       GTK_SIGNAL_FUNC (pref_changed_cb),
                       NULL);
-  gtk_signal_connect (GTK_OBJECT (dpms_standby_text), "focus_out_event",
+  gtk_signal_connect (GTK_OBJECT (grab_image_button), "toggled",
                       GTK_SIGNAL_FUNC (pref_changed_cb),
                       NULL);
-  gtk_signal_connect (GTK_OBJECT (dpms_button), "toggled",
+  gtk_signal_connect (GTK_OBJECT (image_browse_button), "clicked",
+                      GTK_SIGNAL_FUNC (browse_image_dir_cb),
+                      NULL);
+  gtk_signal_connect (GTK_OBJECT (grab_video_button), "toggled",
                       GTK_SIGNAL_FUNC (pref_changed_cb),
                       NULL);
-  gtk_signal_connect (GTK_OBJECT (verbose_button), "toggled",
+  gtk_signal_connect (GTK_OBJECT (grab_desk_button), "toggled",
                       GTK_SIGNAL_FUNC (pref_changed_cb),
                       NULL);
-  gtk_signal_connect (GTK_OBJECT (capture_button), "toggled",
+  gtk_signal_connect (GTK_OBJECT (image_text), "activate",
                       GTK_SIGNAL_FUNC (pref_changed_cb),
                       NULL);
-  gtk_signal_connect (GTK_OBJECT (splash_button), "toggled",
+  gtk_signal_connect (GTK_OBJECT (image_text), "focus_out_event",
                       GTK_SIGNAL_FUNC (pref_changed_cb),
                       NULL);
-  gtk_signal_connect (GTK_OBJECT (fade_text), "activate",
+  gtk_signal_connect (GTK_OBJECT (lock_text), "activate",
                       GTK_SIGNAL_FUNC (pref_changed_cb),
                       NULL);
-  gtk_signal_connect (GTK_OBJECT (fade_text), "focus_out_event",
+  gtk_signal_connect (GTK_OBJECT (lock_text), "focus_out_event",
                       GTK_SIGNAL_FUNC (pref_changed_cb),
                       NULL);
-  gtk_signal_connect (GTK_OBJECT (install_button), "toggled",
+  gtk_signal_connect (GTK_OBJECT (cycle_text), "activate",
                       GTK_SIGNAL_FUNC (pref_changed_cb),
                       NULL);
-  gtk_signal_connect (GTK_OBJECT (fade_button), "toggled",
+  gtk_signal_connect (GTK_OBJECT (cycle_text), "focus_out_event",
                       GTK_SIGNAL_FUNC (pref_changed_cb),
                       NULL);
-  gtk_signal_connect (GTK_OBJECT (unfade_button), "toggled",
+  gtk_signal_connect (GTK_OBJECT (timeout_text), "activate",
+                      GTK_SIGNAL_FUNC (pref_changed_cb),
+                      NULL);
+  gtk_signal_connect (GTK_OBJECT (timeout_text), "focus_out_event",
+                      GTK_SIGNAL_FUNC (pref_changed_cb),
+                      NULL);
+  gtk_signal_connect (GTK_OBJECT (lock_button), "toggled",
+                      GTK_SIGNAL_FUNC (pref_changed_cb),
+                      NULL);
+  gtk_signal_connect (GTK_OBJECT (splash_button), "toggled",
+                      GTK_SIGNAL_FUNC (pref_changed_cb),
+                      NULL);
+  gtk_signal_connect (GTK_OBJECT (capture_button), "toggled",
+                      GTK_SIGNAL_FUNC (pref_changed_cb),
+                      NULL);
+  gtk_signal_connect (GTK_OBJECT (verbose_button), "toggled",
                       GTK_SIGNAL_FUNC (pref_changed_cb),
                       NULL);
 
index 6564748fce36886fc8ec7e800b2a4f9ace85d6c1..2f04b6f0ac34010823a1f30a93209babec4f6094 100644 (file)
@@ -33,6 +33,7 @@
 #endif /* HAVE_UNAME */
 
 #include <stdio.h>
+#include <sys/stat.h>
 
 #include <X11/Xproto.h>                /* for CARD32 */
 #include <X11/Xatom.h>         /* for XA_INTEGER */
@@ -938,6 +939,63 @@ hack_time_text (GtkWidget *widget, const char *line, Time *store, Bool sec_p)
 }
 
 
+static Bool
+directory_p (const char *path)
+{
+  struct stat st;
+  if (!path || !*path)
+    return False;
+  else if (stat (path, &st))
+    return False;
+  else if (!S_ISDIR (st.st_mode))
+    return False;
+  else
+    return True;
+}
+
+static char *
+normalize_directory (const char *path)
+{
+  int L;
+  char *p2, *s;
+  if (!path) return 0;
+  L = strlen (path);;
+  p2 = (char *) malloc (L + 2);
+  strcpy (p2, path);
+  if (p2[L-1] == '/')  /* remove trailing slash */
+    p2[--L] = 0;
+
+  for (s = p2; s && *s; s++)
+    {
+      if (*s == '/' &&
+          (!strncmp (s, "/../", 4) ||                  /* delete "XYZ/../" */
+           !strncmp (s, "/..\000", 4)))                        /* delete "XYZ/..$" */
+        {
+          char *s0 = s;
+          while (s0 > p2 && s0[-1] != '/')
+            s0--;
+          if (s0 > p2)
+            {
+              s0--;
+              s += 3;
+              strcpy (s0, s);
+              s = s0-1;
+            }
+        }
+      else if (*s == '/' && !strncmp (s, "/./", 3))    /* delete "/./" */
+        strcpy (s, s+2), s--;
+      else if (*s == '/' && !strncmp (s, "/.\000", 3)) /* delete "/.$" */
+        *s = 0, s--;
+    }
+
+  for (s = p2; s && *s; s++)           /* normalize consecutive slashes */
+    while (s[0] == '/' && s[1] == '/')
+      strcpy (s, s+1);
+
+  return p2;
+}
+
+
 void
 prefs_ok_cb (GtkButton *button, gpointer user_data)
 {
@@ -977,6 +1035,23 @@ prefs_ok_cb (GtkButton *button, gpointer user_data)
      *(field) = value; \
   } while(0)
 
+# define PATHNAME(field, name) do { \
+    char *line = gtk_entry_get_text (\
+                    GTK_ENTRY (name_to_widget (GTK_WIDGET(button), (name)))); \
+    if (! *line) \
+      ; \
+    else if (!directory_p (line)) \
+      { \
+       char b[255]; \
+       sprintf (b, "Error:\n\n" "Directory does not exist: \"%s\"\n", line); \
+       warning_dialog (GTK_WIDGET (button), b, False, 100); \
+      } \
+   else { \
+     if ((field)) free ((field)); \
+     (field) = strdup(line); \
+    } \
+  } while(0)
+
 # define CHECKBOX(field, name) \
   field = gtk_toggle_button_get_active (\
              GTK_TOGGLE_BUTTON (name_to_widget (GTK_WIDGET(button), (name))))
@@ -991,6 +1066,11 @@ prefs_ok_cb (GtkButton *button, gpointer user_data)
   MINUTES (&p2->dpms_suspend,     "dpms_suspend_text");
   MINUTES (&p2->dpms_off,         "dpms_off_text");
 
+  CHECKBOX (p2->grab_desktop_p,   "grab_desk_button");
+  CHECKBOX (p2->grab_video_p,     "grab_video_button");
+  CHECKBOX (p2->random_image_p,   "grab_image_button");
+  PATHNAME (p2->image_directory,  "image_text");
+
   CHECKBOX (p2->verbose_p,        "verbose_button");
   CHECKBOX (p2->capture_stderr_p, "capture_button");
   CHECKBOX (p2->splash_p,         "splash_button");
@@ -1003,6 +1083,7 @@ prefs_ok_cb (GtkButton *button, gpointer user_data)
 # undef SECONDS
 # undef MINUTES
 # undef INTEGER
+# undef PATHNAME
 # undef CHECKBOX
 
 # define COPY(field) \
@@ -1019,6 +1100,20 @@ prefs_ok_cb (GtkButton *button, gpointer user_data)
   COPY(dpms_suspend);
   COPY(dpms_off);
 
+  COPY (grab_desktop_p);
+  COPY (grab_video_p);
+  COPY (random_image_p);
+
+  if (!p->image_directory ||
+      !p2->image_directory ||
+      strcmp(p->image_directory, p2->image_directory))
+    changed = True;
+  if (p->image_directory && p->image_directory != p2->image_directory)
+    free (p->image_directory);
+  p->image_directory = normalize_directory (p2->image_directory);
+  if (p2->image_directory) free (p2->image_directory);
+  p2->image_directory = 0;
+
   COPY(verbose_p);
   COPY(capture_stderr_p);
   COPY(splash_p);
@@ -1176,6 +1271,103 @@ enabled_cb (GtkWidget *cb, gpointer client_data)
     }
 }
 
+
+
+typedef struct {
+  prefs_pair *pair;
+  GtkFileSelection *widget;
+} file_selection_data;
+
+
+
+static void
+store_image_directory (GtkWidget *button, gpointer user_data)
+{
+  file_selection_data *fsd = (file_selection_data *) user_data;
+  prefs_pair *pair = fsd->pair;
+  GtkFileSelection *selector = fsd->widget;
+  GtkWidget *top = toplevel_widget;
+  saver_preferences *p = pair->a;
+  char *path = gtk_file_selection_get_filename (selector);
+
+  if (p->image_directory && !strcmp(p->image_directory, path))
+    return;  /* no change */
+
+  if (!directory_p (path))
+    {
+      char b[255];
+      sprintf (b, "Error:\n\n" "Directory does not exist: \"%s\"\n", path);
+      warning_dialog (GTK_WIDGET (top), b, False, 100);
+      return;
+    }
+
+  if (p->image_directory) free (p->image_directory);
+  p->image_directory = normalize_directory (path);
+
+  gtk_entry_set_text (GTK_ENTRY (name_to_widget (top, "image_text")),
+                      (p->image_directory ? p->image_directory : ""));
+  demo_write_init_file (GTK_WIDGET (top), p);
+}
+
+
+static void
+browse_image_dir_cancel (GtkWidget *button, gpointer user_data)
+{
+  file_selection_data *fsd = (file_selection_data *) user_data;
+  gtk_widget_hide (GTK_WIDGET (fsd->widget));
+}
+
+static void
+browse_image_dir_ok (GtkWidget *button, gpointer user_data)
+{
+  browse_image_dir_cancel (button, user_data);
+  store_image_directory (button, user_data);
+}
+
+static void
+browse_image_dir_close (GtkWidget *widget, GdkEvent *event, gpointer user_data)
+{
+  browse_image_dir_cancel (widget, user_data);
+}
+
+
+void
+browse_image_dir_cb (GtkButton *button, gpointer user_data)
+{
+  /* prefs_pair *pair = (prefs_pair *) client_data; */
+  prefs_pair *pair = global_prefs_pair;  /* I hate C so much... */
+  saver_preferences *p = pair->a;
+  static file_selection_data *fsd = 0;
+
+  GtkFileSelection *selector = GTK_FILE_SELECTION(
+    gtk_file_selection_new ("Please select the image directory."));
+
+  if (!fsd)
+    fsd = (file_selection_data *) malloc (sizeof (*fsd));  
+
+  fsd->widget = selector;
+  fsd->pair = pair;
+
+  if (p->image_directory && *p->image_directory)
+    gtk_file_selection_set_filename (selector, p->image_directory);
+
+  gtk_signal_connect (GTK_OBJECT (selector->ok_button),
+                      "clicked", GTK_SIGNAL_FUNC (browse_image_dir_ok),
+                      (gpointer *) fsd);
+  gtk_signal_connect (GTK_OBJECT (selector->cancel_button),
+                      "clicked", GTK_SIGNAL_FUNC (browse_image_dir_cancel),
+                      (gpointer *) fsd);
+  gtk_signal_connect (GTK_OBJECT (selector), "delete_event",
+                      GTK_SIGNAL_FUNC (browse_image_dir_close),
+                      (gpointer *) fsd);
+
+  gtk_widget_set_sensitive (GTK_WIDGET (selector->file_list), False);
+
+  gtk_window_set_modal (GTK_WINDOW (selector), True);
+  gtk_widget_show (GTK_WIDGET (selector));
+}
+
+
 \f
 /* Populating the various widgets
  */
@@ -1355,6 +1547,23 @@ populate_prefs_page (GtkWidget *top, prefs_pair *pair)
                    GTK_TOGGLE_BUTTON (name_to_widget (top, "dpms_button")),
                    p->dpms_enabled_p);
 
+  gtk_toggle_button_set_active (
+                   GTK_TOGGLE_BUTTON (name_to_widget (top,"grab_desk_button")),
+                   p->grab_desktop_p);
+  gtk_toggle_button_set_active (
+                   GTK_TOGGLE_BUTTON (name_to_widget(top,"grab_video_button")),
+                   p->grab_video_p);
+  gtk_toggle_button_set_active (
+                   GTK_TOGGLE_BUTTON (name_to_widget(top,"grab_image_button")),
+                   p->random_image_p);
+  gtk_entry_set_text (GTK_ENTRY (name_to_widget (top, "image_text")),
+                      (p->image_directory ? p->image_directory : ""));
+  gtk_widget_set_sensitive (GTK_WIDGET (name_to_widget (top, "image_text")),
+                            p->random_image_p);
+  gtk_widget_set_sensitive (
+                       GTK_WIDGET (name_to_widget (top,"image_browse_button")),
+                            p->random_image_p);
+
   gtk_toggle_button_set_active (
                    GTK_TOGGLE_BUTTON (name_to_widget (top, "install_button")),
                    p->install_cmap_p);
@@ -1383,6 +1592,10 @@ populate_prefs_page (GtkWidget *top, prefs_pair *pair)
          }
       }
 
+#ifdef HAVE_XF86VMODE_GAMMA
+    found_any_writable_cells = True;  /* if we can gamma fade, go for it */
+#endif
+
 #ifdef HAVE_DPMS_EXTENSION
     {
       int op = 0, event = 0, error = 0;
@@ -1510,6 +1723,12 @@ fix_text_entry_sizes (GtkWidget *toplevel)
   width = gdk_text_width (w->style->font, "PseudoColor___", 14);
   gtk_widget_set_usize (w, width, -2);
 
+  /* Now fix the size of the file entry text.
+   */
+  w = GTK_WIDGET (name_to_widget (GTK_WIDGET (toplevel), "image_text"));
+  width = gdk_text_width (w->style->font, "MMMMMMMMMMMMMM", 14);
+  gtk_widget_set_usize (w, width, -2);
+
 #if 0
   /* Now fix the size of the list.
    */
index bf7e0520dc7d582d21c305c04a54681fc373f408..198f9bd8be60c7d4de5cae4140b79ba490bdee18 100644 (file)
@@ -1012,6 +1012,10 @@ populate_prefs_page (Widget top, prefs_pair *pair)
          }
       }
 
+#ifdef HAVE_XF86VMODE_GAMMA
+    found_any_writable_cells = True;  /* if we can gamma fade, go for it */
+#endif
+
     XtVaSetValues (name_to_widget (top, "fadeSecondsLabel"), XtNsensitive,
                            found_any_writable_cells, 0);
     XtVaSetValues (name_to_widget (top, "fadeTicksLabel"), XtNsensitive,
index d47c99a0d1d159ab0a0868f54abbf8f97c3d2399..0e8e5dff4af9c1019f4e934459c117fb53221932 100644 (file)
@@ -360,7 +360,7 @@ make_passwd_window (saver_info *si)
   pw->logo_pixmap = xscreensaver_logo (si->dpy, si->passwd_dialog, cmap,
                                        pw->background, 
                                        &pw->logo_pixels, &pw->logo_npixels,
-                                       True);
+                                       0, True);
 
   /* Before mapping the window, save the bits that are underneath the
      rectangle the window will occlude.  When we lower the window, we
index bbc322d101dba4be40d01927126e17a6a9555d58..629b1b31196c824e4f8e6b19462eaab70dfb32a7 100644 (file)
@@ -222,6 +222,10 @@ static const char * const prefs[] = {
   "dpmsStandby",
   "dpmsSuspend",
   "dpmsOff",
+  "grabDesktopImages",
+  "grabVideoFrames",
+  "chooseRandomImages",
+  "imageDirectory",
   "",
   "programs",
   "",
@@ -495,6 +499,9 @@ write_entry (FILE *out, const char *key, const char *value)
   fprintf(out, "%s:", key);
   col = strlen(key) + 1;
 
+  if (strlen(key) > 14)
+    col = tab_to (out, col, 20);
+
   while (1)
     {
       if (!programs_p)
@@ -724,10 +731,17 @@ write_init_file (saver_preferences *p, const char *version_string,
       CHECK("captureStderr")   type = pref_bool, b = p->capture_stderr_p;
       CHECK("captureStdout")   continue;  /* don't save */
       CHECK("font")            type = pref_str,  s =    stderr_font;
+
       CHECK("dpmsEnabled")     type = pref_bool, b = p->dpms_enabled_p;
       CHECK("dpmsStandby")     type = pref_time, t = p->dpms_standby;
       CHECK("dpmsSuspend")     type = pref_time, t = p->dpms_suspend;
       CHECK("dpmsOff")         type = pref_time, t = p->dpms_off;
+
+      CHECK("grabDesktopImages") type =pref_bool, b = p->grab_desktop_p;
+      CHECK("grabVideoFrames")   type =pref_bool, b = p->grab_video_p;
+      CHECK("chooseRandomImages")type =pref_bool, b = p->random_image_p;
+      CHECK("imageDirectory")    type =pref_str,  s = p->image_directory;
+
       CHECK("programs")                type = pref_str,  s =    programs;
       CHECK("pointerPollTime") type = pref_time, t = p->pointer_timeout;
       CHECK("windowCreationTimeout")type=pref_time,t= p->notice_events_timeout;
@@ -924,9 +938,15 @@ load_init_file (saver_preferences *p)
                                                       "Time");
 
   p->dpms_enabled_p  = get_boolean_resource ("dpmsEnabled", "Boolean");
-  p->dpms_standby    = 1000 * get_seconds_resource ("dpmsStandby", "Time");
-  p->dpms_suspend    = 1000 * get_seconds_resource ("dpmsSuspend", "Time");
-  p->dpms_off        = 1000 * get_seconds_resource ("dpmsOff",     "Time");
+  p->dpms_standby    = 1000 * get_minutes_resource ("dpmsStandby", "Time");
+  p->dpms_suspend    = 1000 * get_minutes_resource ("dpmsSuspend", "Time");
+  p->dpms_off        = 1000 * get_minutes_resource ("dpmsOff",     "Time");
+
+  p->grab_desktop_p  = get_boolean_resource ("grabDesktopImages",  "Boolean");
+  p->grab_video_p    = get_boolean_resource ("grabVideoFrames",    "Boolean");
+  p->random_image_p  = get_boolean_resource ("chooseRandomImages", "Boolean");
+  p->image_directory = get_string_resource  ("imageDirectory",
+                                             "ImageDirectory");
 
   p->shell = get_string_resource ("bourneShell", "BourneShell");
 
@@ -945,6 +965,15 @@ load_init_file (saver_preferences *p)
       p->splash_p = True;
   }
 
+  /* If "*grabDesktopImages" is unset, default to true. */
+  {
+    char *s = get_string_resource ("grabDesktopImages", "Boolean");
+    if (s)
+      free (s);
+    else
+      p->grab_desktop_p = True;
+  }
+
   p->use_xidle_extension = get_boolean_resource ("xidleExtension","Boolean");
   p->use_mit_saver_extension = get_boolean_resource ("mitSaverExtension",
                                                     "Boolean");
index a2b83b75bcc26cefe949fcea56437714021802bb..0ff0ff829ea7d1034778e38acee89d8b68cdad53 100644 (file)
@@ -74,6 +74,11 @@ struct saver_preferences {
   Time dpms_suspend;           /* how long until monitor power-saves */
   Time dpms_off;               /* how long until monitor powers down */
 
+  Bool grab_desktop_p;         /* These are not used by "xscreensaver" */
+  Bool grab_video_p;           /*  itself: they are used by the external */
+  Bool random_image_p;         /*  "xscreensaver-getimage" program, and set */
+  char *image_directory;       /*  by the "xscreensaver-demo" configurator. */
+
   Bool use_xidle_extension;    /* which extension to use, if possible */
   Bool use_mit_saver_extension;
   Bool use_sgi_saver_extension;
index d1daf2cd5259404ca6167fca280e6e302105b7b5..33d255ebc3675e889e6290cef84dd312fcad7be7 100644 (file)
@@ -363,7 +363,7 @@ make_splash_dialog (saver_info *si)
   sp->logo_pixmap = xscreensaver_logo (si->dpy, si->splash_dialog, cmap,
                                        sp->background, 
                                        &sp->logo_pixels, &sp->logo_npixels,
-                                       True);
+                                       0, True);
 
   XMapRaised (si->dpy, si->splash_dialog);
   XSync (si->dpy, False);
diff --git a/driver/test-fade.c b/driver/test-fade.c
new file mode 100644 (file)
index 0000000..b8e4475
--- /dev/null
@@ -0,0 +1,120 @@
+/* test-fade.c --- playing with colormap and/or gamma fading.
+ * xscreensaver, Copyright (c) 2001 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation.  No representations are made about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or 
+ * implied warranty.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <stdlib.h>
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+
+#include <stdio.h>
+
+#include <X11/Intrinsic.h>
+#include "xscreensaver.h"
+#include "fade.h"
+
+#ifdef HAVE_SGI_VC_EXTENSION
+# include <X11/extensions/XSGIvc.h>
+#endif
+#ifdef HAVE_XF86VMODE_GAMMA
+# include <X11/extensions/xf86vmode.h>
+#endif
+
+XrmDatabase db = 0;
+char *progname = 0;
+char *progclass = "XScreenSaver";
+
+#define SGI_VC_NAME "SGI-VIDEO-CONTROL"
+#define XF86_VIDMODE_NAME "XFree86-VidModeExtension"
+
+int
+main (int argc, char **argv)
+{
+  int seconds = 3;
+  int ticks = 20;
+  int delay = 1;
+
+  int op, event, error, major, minor;
+
+  XtAppContext app;
+  Widget toplevel_shell = XtAppInitialize (&app, progclass, 0, 0,
+                                          &argc, argv, 0, 0, 0);
+  Display *dpy = XtDisplay (toplevel_shell);
+  Colormap *current_maps;
+  int i;
+
+  XtGetApplicationNameAndClass (dpy, &progname, &progclass);
+  db = XtDatabase (dpy);
+
+  current_maps = (Colormap *) calloc(sizeof(Colormap), ScreenCount(dpy));
+  for (i = 0; i < ScreenCount(dpy); i++)
+    current_maps[i] = DefaultColormap (dpy, i);
+
+  if (!XQueryExtension (dpy, SGI_VC_NAME, &op, &event, &error))
+    fprintf(stderr, "%s: no " SGI_VC_NAME " extension\n", progname);
+  else
+    {
+# ifdef HAVE_SGI_VC_EXTENSION
+      if (!XSGIvcQueryVersion (dpy, &major, &minor))
+        fprintf(stderr, "%s: unable to get " SGI_VC_NAME " version\n",
+                progname);
+      else
+        fprintf(stderr, "%s: " SGI_VC_NAME " version %d.%d\n",
+                progname, major, minor);
+# else /* !HAVE_SGI_VC_EXTENSION */
+      fprintf(stderr, "%s: no support for display's " SGI_VC_NAME
+              " extension\n", progname);
+# endif /* !HAVE_SGI_VC_EXTENSION */
+    }
+
+
+  if (!XQueryExtension (dpy, XF86_VIDMODE_NAME, &op, &event, &error))
+    fprintf(stderr, "%s: no " XF86_VIDMODE_NAME " extension\n", progname);
+  else
+    {
+# ifdef HAVE_XF86VMODE_GAMMA
+      if (!XF86VidModeQueryVersion (dpy, &major, &minor))
+        fprintf(stderr, "%s: unable to get " XF86_VIDMODE_NAME " version\n",
+                progname);
+      else
+        fprintf(stderr, "%s: " XF86_VIDMODE_NAME " version %d.%d\n",
+                progname, major, minor);
+# else /* !HAVE_XF86VMODE_GAMMA */
+      fprintf(stderr, "%s: no support for display's " XF86_VIDMODE_NAME
+              " extension\n", progname);
+# endif /* !HAVE_XF86VMODE_GAMMA */
+    }
+
+  while (1)
+    {
+      XSync (dpy, False);
+
+      fprintf(stderr, "%s: out...", progname);
+      fflush(stderr);
+      fade_screens (dpy, current_maps, 0, seconds, ticks, True, False);
+      fprintf(stderr, "done.\n");
+      fflush(stderr);
+
+      if (delay) sleep (delay);
+
+      fprintf(stderr,"%s: in...", progname);
+      fflush(stderr);
+      fade_screens (dpy, current_maps, 0, seconds, ticks, False, False);
+      fprintf(stderr, "done.\n");
+      fflush(stderr);
+
+      if (delay) sleep (delay);
+    }
+}
index eea2ff833e009d74db4ec9b3a4bfe2b6d4c150dc..25befb7e43d4ebccc7adcfb05eccc1a2d79c54e7 100644 (file)
@@ -11,7 +11,7 @@
 .if n .sp 1
 .if t .sp .5
 ..
-.TH XScreenSaver 1 "29-Mar-2001 (3.31)" "X Version 11"
+.TH XScreenSaver 1 "15-Apr-2001 (3.32)" "X Version 11"
 .SH NAME
 xscreensaver-command - control a running xscreensaver process
 .SH SYNOPSIS
index 6629a9597b2ac8643dbf309ae6c9280e28f5bb23..7fa9f86d34896e79254dfa3cc508ef45416020f7 100644 (file)
@@ -28,8 +28,6 @@
   <type>GTK_WINDOW_TOPLEVEL</type>
   <position>GTK_WIN_POS_NONE</position>
   <modal>False</modal>
-  <default_width>600</default_width>
-  <default_height>400</default_height>
   <allow_shrink>True</allow_shrink>
   <allow_grow>True</allow_grow>
   <auto_shrink>False</auto_shrink>
@@ -598,11 +596,10 @@ Mono
        <widget>
          <class>GtkTable</class>
          <name>options_table</name>
-         <border_width>10</border_width>
-         <rows>2</rows>
+         <rows>1</rows>
          <columns>2</columns>
          <homogeneous>True</homogeneous>
-         <row_spacing>2</row_spacing>
+         <row_spacing>0</row_spacing>
          <column_spacing>0</column_spacing>
          <child>
            <padding>0</padding>
@@ -611,15 +608,16 @@ Mono
          </child>
 
          <widget>
-           <class>GtkFrame</class>
-           <name>blanking_frame</name>
-           <border_width>10</border_width>
-           <label>Blanking and Locking:</label>
-           <label_xalign>0</label_xalign>
-           <shadow_type>GTK_SHADOW_ETCHED_IN</shadow_type>
+           <class>GtkTable</class>
+           <name>options_table_2</name>
+           <rows>2</rows>
+           <columns>1</columns>
+           <homogeneous>False</homogeneous>
+           <row_spacing>0</row_spacing>
+           <column_spacing>0</column_spacing>
            <child>
-             <left_attach>0</left_attach>
-             <right_attach>1</right_attach>
+             <left_attach>1</left_attach>
+             <right_attach>2</right_attach>
              <top_attach>0</top_attach>
              <bottom_attach>1</bottom_attach>
              <xpad>0</xpad>
@@ -633,295 +631,542 @@ Mono
            </child>
 
            <widget>
-             <class>GtkTable</class>
-             <name>blanking_table</name>
+             <class>GtkFrame</class>
+             <name>dpms_frame</name>
              <border_width>10</border_width>
-             <rows>5</rows>
-             <columns>3</columns>
-             <homogeneous>False</homogeneous>
-             <row_spacing>2</row_spacing>
-             <column_spacing>10</column_spacing>
+             <label>Display Power Management:</label>
+             <label_xalign>0</label_xalign>
+             <shadow_type>GTK_SHADOW_ETCHED_IN</shadow_type>
+             <child>
+               <left_attach>0</left_attach>
+               <right_attach>1</right_attach>
+               <top_attach>0</top_attach>
+               <bottom_attach>1</bottom_attach>
+               <xpad>0</xpad>
+               <ypad>0</ypad>
+               <xexpand>True</xexpand>
+               <yexpand>False</yexpand>
+               <xshrink>False</xshrink>
+               <yshrink>False</yshrink>
+               <xfill>True</xfill>
+               <yfill>True</yfill>
+             </child>
 
              <widget>
-               <class>GtkEntry</class>
-               <name>lock_text</name>
-               <tooltip>How long after the screen saver has activated until a password will be required (if  `Require Password' is also set.)</tooltip>
-               <can_focus>True</can_focus>
-               <signal>
-                 <name>activate</name>
-                 <handler>pref_changed_cb</handler>
-                 <last_modification_time>Mon, 03 Apr 2000 02:28:29 GMT</last_modification_time>
-               </signal>
-               <signal>
-                 <name>focus_out_event</name>
-                 <handler>pref_changed_cb</handler>
-                 <last_modification_time>Mon, 03 Apr 2000 02:35:28 GMT</last_modification_time>
-               </signal>
-               <editable>True</editable>
-               <text_visible>True</text_visible>
-               <text_max_length>8</text_max_length>
-               <text></text>
-               <child>
-                 <left_attach>1</left_attach>
-                 <right_attach>2</right_attach>
-                 <top_attach>4</top_attach>
-                 <bottom_attach>5</bottom_attach>
-                 <xpad>0</xpad>
-                 <ypad>0</ypad>
-                 <xexpand>False</xexpand>
-                 <yexpand>False</yexpand>
-                 <xshrink>False</xshrink>
-                 <yshrink>False</yshrink>
-                 <xfill>False</xfill>
-                 <yfill>False</yfill>
-               </child>
-             </widget>
+               <class>GtkTable</class>
+               <name>dpms_table</name>
+               <border_width>10</border_width>
+               <rows>4</rows>
+               <columns>3</columns>
+               <homogeneous>False</homogeneous>
+               <row_spacing>2</row_spacing>
+               <column_spacing>10</column_spacing>
 
-             <widget>
-               <class>GtkEntry</class>
-               <name>cycle_text</name>
-               <tooltip>How long each demo will be run before moving on to another.</tooltip>
-               <can_focus>True</can_focus>
-               <signal>
-                 <name>activate</name>
-                 <handler>pref_changed_cb</handler>
-                 <last_modification_time>Mon, 03 Apr 2000 02:28:29 GMT</last_modification_time>
-               </signal>
-               <signal>
-                 <name>focus_out_event</name>
-                 <handler>pref_changed_cb</handler>
-                 <last_modification_time>Mon, 03 Apr 2000 02:35:28 GMT</last_modification_time>
-               </signal>
-               <editable>True</editable>
-               <text_visible>True</text_visible>
-               <text_max_length>8</text_max_length>
-               <text></text>
-               <child>
-                 <left_attach>1</left_attach>
-                 <right_attach>2</right_attach>
-                 <top_attach>1</top_attach>
-                 <bottom_attach>2</bottom_attach>
-                 <xpad>0</xpad>
-                 <ypad>0</ypad>
-                 <xexpand>False</xexpand>
-                 <yexpand>False</yexpand>
-                 <xshrink>False</xshrink>
-                 <yshrink>False</yshrink>
-                 <xfill>False</xfill>
-                 <yfill>False</yfill>
-               </child>
-             </widget>
+               <widget>
+                 <class>GtkEntry</class>
+                 <name>dpms_off_text</name>
+                 <tooltip>How long until the monitor powers down (if Power Management is enabled).</tooltip>
+                 <can_focus>True</can_focus>
+                 <signal>
+                   <name>activate</name>
+                   <handler>pref_changed_cb</handler>
+                   <last_modification_time>Mon, 03 Apr 2000 02:28:29 GMT</last_modification_time>
+                 </signal>
+                 <signal>
+                   <name>focus_out_event</name>
+                   <handler>pref_changed_cb</handler>
+                   <last_modification_time>Mon, 03 Apr 2000 02:35:28 GMT</last_modification_time>
+                 </signal>
+                 <editable>True</editable>
+                 <text_visible>True</text_visible>
+                 <text_max_length>8</text_max_length>
+                 <text></text>
+                 <child>
+                   <left_attach>1</left_attach>
+                   <right_attach>2</right_attach>
+                   <top_attach>3</top_attach>
+                   <bottom_attach>4</bottom_attach>
+                   <xpad>0</xpad>
+                   <ypad>0</ypad>
+                   <xexpand>False</xexpand>
+                   <yexpand>False</yexpand>
+                   <xshrink>False</xshrink>
+                   <yshrink>False</yshrink>
+                   <xfill>False</xfill>
+                   <yfill>False</yfill>
+                 </child>
+               </widget>
 
-             <widget>
-               <class>GtkEntry</class>
-               <name>timeout_text</name>
-               <tooltip>How long until the screen saver activates and begins running demos.</tooltip>
-               <can_focus>True</can_focus>
-               <signal>
-                 <name>activate</name>
-                 <handler>pref_changed_cb</handler>
-                 <last_modification_time>Mon, 03 Apr 2000 02:28:10 GMT</last_modification_time>
-               </signal>
-               <signal>
-                 <name>focus_out_event</name>
-                 <handler>pref_changed_cb</handler>
-                 <last_modification_time>Mon, 03 Apr 2000 02:34:26 GMT</last_modification_time>
-               </signal>
-               <editable>True</editable>
-               <text_visible>True</text_visible>
-               <text_max_length>8</text_max_length>
-               <text></text>
-               <child>
-                 <left_attach>1</left_attach>
-                 <right_attach>2</right_attach>
-                 <top_attach>0</top_attach>
-                 <bottom_attach>1</bottom_attach>
+               <widget>
+                 <class>GtkEntry</class>
+                 <name>dpms_suspend_text</name>
+                 <tooltip>How long until the monitor goes into power-saving mode (if Power Management is enabled).</tooltip>
+                 <can_focus>True</can_focus>
+                 <signal>
+                   <name>activate</name>
+                   <handler>pref_changed_cb</handler>
+                   <last_modification_time>Mon, 03 Apr 2000 02:28:29 GMT</last_modification_time>
+                 </signal>
+                 <signal>
+                   <name>focus_out_event</name>
+                   <handler>pref_changed_cb</handler>
+                   <last_modification_time>Mon, 03 Apr 2000 02:35:28 GMT</last_modification_time>
+                 </signal>
+                 <editable>True</editable>
+                 <text_visible>True</text_visible>
+                 <text_max_length>8</text_max_length>
+                 <text></text>
+                 <child>
+                   <left_attach>1</left_attach>
+                   <right_attach>2</right_attach>
+                   <top_attach>2</top_attach>
+                   <bottom_attach>3</bottom_attach>
+                   <xpad>0</xpad>
+                   <ypad>0</ypad>
+                   <xexpand>False</xexpand>
+                   <yexpand>False</yexpand>
+                   <xshrink>False</xshrink>
+                   <yshrink>False</yshrink>
+                   <xfill>False</xfill>
+                   <yfill>False</yfill>
+                 </child>
+               </widget>
+
+               <widget>
+                 <class>GtkEntry</class>
+                 <name>dpms_standby_text</name>
+                 <tooltip>How long before the monitor goes completely black (if Power Management is enabled).</tooltip>
+                 <can_focus>True</can_focus>
+                 <signal>
+                   <name>activate</name>
+                   <handler>pref_changed_cb</handler>
+                   <last_modification_time>Mon, 03 Apr 2000 02:28:29 GMT</last_modification_time>
+                 </signal>
+                 <signal>
+                   <name>focus_out_event</name>
+                   <handler>pref_changed_cb</handler>
+                   <last_modification_time>Mon, 03 Apr 2000 02:35:28 GMT</last_modification_time>
+                 </signal>
+                 <editable>True</editable>
+                 <text_visible>True</text_visible>
+                 <text_max_length>8</text_max_length>
+                 <text></text>
+                 <child>
+                   <left_attach>1</left_attach>
+                   <right_attach>2</right_attach>
+                   <top_attach>1</top_attach>
+                   <bottom_attach>2</bottom_attach>
+                   <xpad>0</xpad>
+                   <ypad>0</ypad>
+                   <xexpand>False</xexpand>
+                   <yexpand>False</yexpand>
+                   <xshrink>False</xshrink>
+                   <yshrink>False</yshrink>
+                   <xfill>False</xfill>
+                   <yfill>False</yfill>
+                 </child>
+               </widget>
+
+               <widget>
+                 <class>GtkLabel</class>
+                 <name>dpms_standby_label</name>
+                 <label>Standby After:</label>
+                 <justify>GTK_JUSTIFY_RIGHT</justify>
+                 <wrap>False</wrap>
+                 <xalign>1</xalign>
+                 <yalign>0.5</yalign>
                  <xpad>0</xpad>
                  <ypad>0</ypad>
-                 <xexpand>False</xexpand>
-                 <yexpand>False</yexpand>
-                 <xshrink>False</xshrink>
-                 <yshrink>False</yshrink>
-                 <xfill>False</xfill>
-                 <yfill>False</yfill>
-               </child>
-             </widget>
+                 <child>
+                   <left_attach>0</left_attach>
+                   <right_attach>1</right_attach>
+                   <top_attach>1</top_attach>
+                   <bottom_attach>2</bottom_attach>
+                   <xpad>0</xpad>
+                   <ypad>0</ypad>
+                   <xexpand>False</xexpand>
+                   <yexpand>False</yexpand>
+                   <xshrink>False</xshrink>
+                   <yshrink>False</yshrink>
+                   <xfill>True</xfill>
+                   <yfill>False</yfill>
+                 </child>
+               </widget>
 
-             <widget>
-               <class>GtkLabel</class>
-               <name>timeout_label</name>
-               <label>Blank After:</label>
-               <justify>GTK_JUSTIFY_RIGHT</justify>
-               <wrap>False</wrap>
-               <xalign>1</xalign>
-               <yalign>0.5</yalign>
-               <xpad>0</xpad>
-               <ypad>0</ypad>
-               <child>
-                 <left_attach>0</left_attach>
-                 <right_attach>1</right_attach>
-                 <top_attach>0</top_attach>
-                 <bottom_attach>1</bottom_attach>
+               <widget>
+                 <class>GtkLabel</class>
+                 <name>dpms_off_label</name>
+                 <label>Off After:</label>
+                 <justify>GTK_JUSTIFY_RIGHT</justify>
+                 <wrap>False</wrap>
+                 <xalign>1</xalign>
+                 <yalign>0.5</yalign>
                  <xpad>0</xpad>
                  <ypad>0</ypad>
-                 <xexpand>False</xexpand>
-                 <yexpand>False</yexpand>
-                 <xshrink>False</xshrink>
-                 <yshrink>False</yshrink>
-                 <xfill>True</xfill>
-                 <yfill>False</yfill>
-               </child>
-             </widget>
+                 <child>
+                   <left_attach>0</left_attach>
+                   <right_attach>1</right_attach>
+                   <top_attach>3</top_attach>
+                   <bottom_attach>4</bottom_attach>
+                   <xpad>0</xpad>
+                   <ypad>0</ypad>
+                   <xexpand>False</xexpand>
+                   <yexpand>False</yexpand>
+                   <xshrink>False</xshrink>
+                   <yshrink>False</yshrink>
+                   <xfill>True</xfill>
+                   <yfill>False</yfill>
+                 </child>
+               </widget>
 
-             <widget>
-               <class>GtkLabel</class>
-               <name>cycle_label</name>
-               <label>Cycle After:</label>
-               <justify>GTK_JUSTIFY_RIGHT</justify>
-               <wrap>False</wrap>
-               <xalign>1</xalign>
-               <yalign>0.5</yalign>
-               <xpad>0</xpad>
-               <ypad>0</ypad>
-               <child>
-                 <left_attach>0</left_attach>
-                 <right_attach>1</right_attach>
-                 <top_attach>1</top_attach>
-                 <bottom_attach>2</bottom_attach>
+               <widget>
+                 <class>GtkLabel</class>
+                 <name>dpms_suspend_label</name>
+                 <label>Suspend After:</label>
+                 <justify>GTK_JUSTIFY_RIGHT</justify>
+                 <wrap>False</wrap>
+                 <xalign>1</xalign>
+                 <yalign>0.5</yalign>
                  <xpad>0</xpad>
                  <ypad>0</ypad>
-                 <xexpand>False</xexpand>
-                 <yexpand>False</yexpand>
-                 <xshrink>False</xshrink>
-                 <yshrink>False</yshrink>
-                 <xfill>True</xfill>
-                 <yfill>False</yfill>
-               </child>
-             </widget>
+                 <child>
+                   <left_attach>0</left_attach>
+                   <right_attach>1</right_attach>
+                   <top_attach>2</top_attach>
+                   <bottom_attach>3</bottom_attach>
+                   <xpad>0</xpad>
+                   <ypad>0</ypad>
+                   <xexpand>False</xexpand>
+                   <yexpand>False</yexpand>
+                   <xshrink>False</xshrink>
+                   <yshrink>False</yshrink>
+                   <xfill>True</xfill>
+                   <yfill>False</yfill>
+                 </child>
+               </widget>
 
-             <widget>
-               <class>GtkLabel</class>
-               <name>lock_label</name>
-               <label>Lock After:</label>
-               <justify>GTK_JUSTIFY_RIGHT</justify>
-               <wrap>False</wrap>
-               <xalign>1</xalign>
-               <yalign>0.5</yalign>
-               <xpad>0</xpad>
-               <ypad>0</ypad>
-               <child>
-                 <left_attach>0</left_attach>
-                 <right_attach>1</right_attach>
-                 <top_attach>4</top_attach>
-                 <bottom_attach>5</bottom_attach>
+               <widget>
+                 <class>GtkLabel</class>
+                 <name>dpms_dummy</name>
+                 <label></label>
+                 <justify>GTK_JUSTIFY_LEFT</justify>
+                 <wrap>False</wrap>
+                 <xalign>0.5</xalign>
+                 <yalign>0.5</yalign>
                  <xpad>0</xpad>
                  <ypad>0</ypad>
-                 <xexpand>False</xexpand>
-                 <yexpand>False</yexpand>
-                 <xshrink>False</xshrink>
-                 <yshrink>False</yshrink>
-                 <xfill>True</xfill>
-                 <yfill>False</yfill>
-               </child>
+                 <child>
+                   <left_attach>2</left_attach>
+                   <right_attach>3</right_attach>
+                   <top_attach>3</top_attach>
+                   <bottom_attach>4</bottom_attach>
+                   <xpad>0</xpad>
+                   <ypad>0</ypad>
+                   <xexpand>True</xexpand>
+                   <yexpand>False</yexpand>
+                   <xshrink>False</xshrink>
+                   <yshrink>False</yshrink>
+                   <xfill>True</xfill>
+                   <yfill>False</yfill>
+                 </child>
+               </widget>
+
+               <widget>
+                 <class>GtkEventBox</class>
+                 <name>dpms_button_eventbox</name>
+                 <tooltip>Whether the monitor should be powered down after a while.</tooltip>
+                 <child>
+                   <left_attach>0</left_attach>
+                   <right_attach>3</right_attach>
+                   <top_attach>0</top_attach>
+                   <bottom_attach>1</bottom_attach>
+                   <xpad>0</xpad>
+                   <ypad>0</ypad>
+                   <xexpand>False</xexpand>
+                   <yexpand>False</yexpand>
+                   <xshrink>False</xshrink>
+                   <yshrink>False</yshrink>
+                   <xfill>True</xfill>
+                   <yfill>True</yfill>
+                 </child>
+
+                 <widget>
+                   <class>GtkCheckButton</class>
+                   <name>dpms_button</name>
+                   <can_focus>True</can_focus>
+                   <signal>
+                     <name>toggled</name>
+                     <handler>pref_changed_cb</handler>
+                     <last_modification_time>Mon, 03 Apr 2000 02:33:01 GMT</last_modification_time>
+                   </signal>
+                   <label>Power Management Enabled</label>
+                   <active>True</active>
+                   <draw_indicator>True</draw_indicator>
+                 </widget>
+               </widget>
              </widget>
+           </widget>
 
-             <widget>
-               <class>GtkLabel</class>
-               <name>blanking_dummy</name>
-               <label></label>
-               <justify>GTK_JUSTIFY_LEFT</justify>
-               <wrap>False</wrap>
-               <xalign>0.5</xalign>
-               <yalign>0.5</yalign>
+           <widget>
+             <class>GtkFrame</class>
+             <name>cmap_frame</name>
+             <border_width>10</border_width>
+             <label>Colormaps:</label>
+             <label_xalign>0</label_xalign>
+             <shadow_type>GTK_SHADOW_ETCHED_IN</shadow_type>
+             <child>
+               <left_attach>0</left_attach>
+               <right_attach>1</right_attach>
+               <top_attach>1</top_attach>
+               <bottom_attach>2</bottom_attach>
                <xpad>0</xpad>
                <ypad>0</ypad>
-               <child>
-                 <left_attach>2</left_attach>
-                 <right_attach>3</right_attach>
-                 <top_attach>4</top_attach>
-                 <bottom_attach>5</bottom_attach>
-                 <xpad>0</xpad>
-                 <ypad>0</ypad>
-                 <xexpand>True</xexpand>
-                 <yexpand>False</yexpand>
-                 <xshrink>False</xshrink>
-                 <yshrink>False</yshrink>
-                 <xfill>True</xfill>
-                 <yfill>False</yfill>
-               </child>
-             </widget>
+               <xexpand>True</xexpand>
+               <yexpand>False</yexpand>
+               <xshrink>False</xshrink>
+               <yshrink>False</yshrink>
+               <xfill>True</xfill>
+               <yfill>True</yfill>
+             </child>
 
              <widget>
-               <class>GtkHSeparator</class>
-               <name>blanking_hr</name>
-               <child>
-                 <left_attach>0</left_attach>
-                 <right_attach>3</right_attach>
-                 <top_attach>2</top_attach>
-                 <bottom_attach>3</bottom_attach>
+               <class>GtkTable</class>
+               <name>cmap_table</name>
+               <border_width>10</border_width>
+               <rows>5</rows>
+               <columns>3</columns>
+               <homogeneous>False</homogeneous>
+               <row_spacing>2</row_spacing>
+               <column_spacing>10</column_spacing>
+
+               <widget>
+                 <class>GtkEntry</class>
+                 <name>fade_text</name>
+                 <tooltip>How long it should take for the screen to fade in and out.</tooltip>
+                 <can_focus>True</can_focus>
+                 <signal>
+                   <name>activate</name>
+                   <handler>pref_changed_cb</handler>
+                   <last_modification_time>Mon, 03 Apr 2000 02:28:29 GMT</last_modification_time>
+                 </signal>
+                 <signal>
+                   <name>focus_out_event</name>
+                   <handler>pref_changed_cb</handler>
+                   <last_modification_time>Mon, 03 Apr 2000 02:35:28 GMT</last_modification_time>
+                 </signal>
+                 <editable>True</editable>
+                 <text_visible>True</text_visible>
+                 <text_max_length>8</text_max_length>
+                 <text></text>
+                 <child>
+                   <left_attach>1</left_attach>
+                   <right_attach>2</right_attach>
+                   <top_attach>4</top_attach>
+                   <bottom_attach>5</bottom_attach>
+                   <xpad>0</xpad>
+                   <ypad>0</ypad>
+                   <xexpand>False</xexpand>
+                   <yexpand>False</yexpand>
+                   <xshrink>False</xshrink>
+                   <yshrink>False</yshrink>
+                   <xfill>False</xfill>
+                   <yfill>False</yfill>
+                 </child>
+               </widget>
+
+               <widget>
+                 <class>GtkLabel</class>
+                 <name>cmap_dummy</name>
+                 <label></label>
+                 <justify>GTK_JUSTIFY_LEFT</justify>
+                 <wrap>False</wrap>
+                 <xalign>0.5</xalign>
+                 <yalign>0.5</yalign>
                  <xpad>0</xpad>
                  <ypad>0</ypad>
-                 <xexpand>True</xexpand>
-                 <yexpand>True</yexpand>
-                 <xshrink>False</xshrink>
-                 <yshrink>False</yshrink>
-                 <xfill>True</xfill>
-                 <yfill>True</yfill>
-               </child>
-             </widget>
+                 <child>
+                   <left_attach>2</left_attach>
+                   <right_attach>3</right_attach>
+                   <top_attach>4</top_attach>
+                   <bottom_attach>5</bottom_attach>
+                   <xpad>0</xpad>
+                   <ypad>0</ypad>
+                   <xexpand>True</xexpand>
+                   <yexpand>False</yexpand>
+                   <xshrink>False</xshrink>
+                   <yshrink>False</yshrink>
+                   <xfill>True</xfill>
+                   <yfill>False</yfill>
+                 </child>
+               </widget>
 
-             <widget>
-               <class>GtkEventBox</class>
-               <name>lock_button_eventbox</name>
-               <tooltip>Whether a password should be required to unblank the screen.</tooltip>
-               <child>
-                 <left_attach>0</left_attach>
-                 <right_attach>3</right_attach>
-                 <top_attach>3</top_attach>
-                 <bottom_attach>4</bottom_attach>
+               <widget>
+                 <class>GtkLabel</class>
+                 <name>fade_label</name>
+                 <label>Fade Duration:</label>
+                 <justify>GTK_JUSTIFY_RIGHT</justify>
+                 <wrap>False</wrap>
+                 <xalign>1</xalign>
+                 <yalign>0.5</yalign>
                  <xpad>0</xpad>
                  <ypad>0</ypad>
-                 <xexpand>False</xexpand>
-                 <yexpand>False</yexpand>
-                 <xshrink>False</xshrink>
-                 <yshrink>False</yshrink>
-                 <xfill>True</xfill>
-                 <yfill>True</yfill>
-               </child>
+                 <child>
+                   <left_attach>0</left_attach>
+                   <right_attach>1</right_attach>
+                   <top_attach>4</top_attach>
+                   <bottom_attach>5</bottom_attach>
+                   <xpad>0</xpad>
+                   <ypad>0</ypad>
+                   <xexpand>False</xexpand>
+                   <yexpand>False</yexpand>
+                   <xshrink>False</xshrink>
+                   <yshrink>False</yshrink>
+                   <xfill>True</xfill>
+                   <yfill>False</yfill>
+                 </child>
+               </widget>
 
                <widget>
-                 <class>GtkCheckButton</class>
-                 <name>lock_button</name>
-                 <can_focus>True</can_focus>
-                 <signal>
-                   <name>toggled</name>
-                   <handler>pref_changed_cb</handler>
-                   <last_modification_time>Mon, 03 Apr 2000 02:31:53 GMT</last_modification_time>
-                 </signal>
-                 <label>Require Password</label>
-                 <active>False</active>
-                 <draw_indicator>True</draw_indicator>
+                 <class>GtkEventBox</class>
+                 <name>install_button_eventbox</name>
+                 <tooltip>Whether to install a private colormap when running in 8-bit mode on the default Visual.</tooltip>
+                 <child>
+                   <left_attach>0</left_attach>
+                   <right_attach>3</right_attach>
+                   <top_attach>0</top_attach>
+                   <bottom_attach>1</bottom_attach>
+                   <xpad>0</xpad>
+                   <ypad>0</ypad>
+                   <xexpand>False</xexpand>
+                   <yexpand>False</yexpand>
+                   <xshrink>False</xshrink>
+                   <yshrink>False</yshrink>
+                   <xfill>True</xfill>
+                   <yfill>True</yfill>
+                 </child>
+
+                 <widget>
+                   <class>GtkCheckButton</class>
+                   <name>install_button</name>
+                   <can_focus>True</can_focus>
+                   <signal>
+                     <name>toggled</name>
+                     <handler>pref_changed_cb</handler>
+                     <last_modification_time>Mon, 03 Apr 2000 02:32:25 GMT</last_modification_time>
+                   </signal>
+                   <label>Install Colormap</label>
+                   <active>False</active>
+                   <draw_indicator>True</draw_indicator>
+                 </widget>
+               </widget>
+
+               <widget>
+                 <class>GtkEventBox</class>
+                 <name>fade_button_eventbox</name>
+                 <tooltip>Whether the screen should slowly fade to black when the screen saver activates.</tooltip>
+                 <child>
+                   <left_attach>0</left_attach>
+                   <right_attach>3</right_attach>
+                   <top_attach>2</top_attach>
+                   <bottom_attach>3</bottom_attach>
+                   <xpad>0</xpad>
+                   <ypad>0</ypad>
+                   <xexpand>False</xexpand>
+                   <yexpand>False</yexpand>
+                   <xshrink>False</xshrink>
+                   <yshrink>False</yshrink>
+                   <xfill>True</xfill>
+                   <yfill>True</yfill>
+                 </child>
+
+                 <widget>
+                   <class>GtkCheckButton</class>
+                   <name>fade_button</name>
+                   <can_focus>True</can_focus>
+                   <signal>
+                     <name>toggled</name>
+                     <handler>pref_changed_cb</handler>
+                     <last_modification_time>Mon, 03 Apr 2000 02:32:39 GMT</last_modification_time>
+                   </signal>
+                   <label>Fade To Black When Blanking</label>
+                   <active>False</active>
+                   <draw_indicator>True</draw_indicator>
+                 </widget>
+               </widget>
+
+               <widget>
+                 <class>GtkEventBox</class>
+                 <name>unfade_button_eventbox</name>
+                 <tooltip>Whether the screen should slowly fade in from black when the screen saver deactivates.</tooltip>
+                 <child>
+                   <left_attach>0</left_attach>
+                   <right_attach>3</right_attach>
+                   <top_attach>3</top_attach>
+                   <bottom_attach>4</bottom_attach>
+                   <xpad>0</xpad>
+                   <ypad>0</ypad>
+                   <xexpand>False</xexpand>
+                   <yexpand>False</yexpand>
+                   <xshrink>False</xshrink>
+                   <yshrink>False</yshrink>
+                   <xfill>True</xfill>
+                   <yfill>True</yfill>
+                 </child>
+
+                 <widget>
+                   <class>GtkCheckButton</class>
+                   <name>unfade_button</name>
+                   <can_focus>True</can_focus>
+                   <signal>
+                     <name>toggled</name>
+                     <handler>pref_changed_cb</handler>
+                     <last_modification_time>Mon, 03 Apr 2000 02:32:51 GMT</last_modification_time>
+                   </signal>
+                   <label>Fade From Black When Unblanking</label>
+                   <active>False</active>
+                   <draw_indicator>True</draw_indicator>
+                 </widget>
+               </widget>
+
+               <widget>
+                 <class>GtkHSeparator</class>
+                 <name>cmap_hr</name>
+                 <child>
+                   <left_attach>0</left_attach>
+                   <right_attach>3</right_attach>
+                   <top_attach>1</top_attach>
+                   <bottom_attach>2</bottom_attach>
+                   <xpad>0</xpad>
+                   <ypad>2</ypad>
+                   <xexpand>True</xexpand>
+                   <yexpand>False</yexpand>
+                   <xshrink>False</xshrink>
+                   <yshrink>False</yshrink>
+                   <xfill>True</xfill>
+                   <yfill>True</yfill>
+                 </child>
                </widget>
              </widget>
            </widget>
          </widget>
 
          <widget>
-           <class>GtkFrame</class>
-           <name>dpms_frame</name>
-           <border_width>10</border_width>
-           <label>Display Power Management:</label>
-           <label_xalign>0</label_xalign>
-           <shadow_type>GTK_SHADOW_ETCHED_IN</shadow_type>
+           <class>GtkTable</class>
+           <name>options_table_1</name>
+           <rows>3</rows>
+           <columns>1</columns>
+           <homogeneous>False</homogeneous>
+           <row_spacing>0</row_spacing>
+           <column_spacing>0</column_spacing>
            <child>
-             <left_attach>1</left_attach>
-             <right_attach>2</right_attach>
+             <left_attach>0</left_attach>
+             <right_attach>1</right_attach>
              <top_attach>0</top_attach>
              <bottom_attach>1</bottom_attach>
              <xpad>0</xpad>
              <ypad>0</ypad>
-             <xexpand>False</xexpand>
-             <yexpand>False</yexpand>
+             <xexpand>True</xexpand>
+             <yexpand>True</yexpand>
              <xshrink>False</xshrink>
              <yshrink>False</yshrink>
              <xfill>True</xfill>
@@ -929,633 +1174,656 @@ Mono
            </child>
 
            <widget>
-             <class>GtkTable</class>
-             <name>dpms_table</name>
+             <class>GtkFrame</class>
+             <name>grab_frame</name>
              <border_width>10</border_width>
-             <rows>4</rows>
-             <columns>3</columns>
-             <homogeneous>False</homogeneous>
-             <row_spacing>2</row_spacing>
-             <column_spacing>10</column_spacing>
-
-             <widget>
-               <class>GtkEntry</class>
-               <name>dpms_off_text</name>
-               <tooltip>How long until the monitor powers down (if Power Management is enabled).</tooltip>
-               <can_focus>True</can_focus>
-               <signal>
-                 <name>activate</name>
-                 <handler>pref_changed_cb</handler>
-                 <last_modification_time>Mon, 03 Apr 2000 02:28:29 GMT</last_modification_time>
-               </signal>
-               <signal>
-                 <name>focus_out_event</name>
-                 <handler>pref_changed_cb</handler>
-                 <last_modification_time>Mon, 03 Apr 2000 02:35:28 GMT</last_modification_time>
-               </signal>
-               <editable>True</editable>
-               <text_visible>True</text_visible>
-               <text_max_length>8</text_max_length>
-               <text></text>
-               <child>
-                 <left_attach>1</left_attach>
-                 <right_attach>2</right_attach>
-                 <top_attach>3</top_attach>
-                 <bottom_attach>4</bottom_attach>
-                 <xpad>0</xpad>
-                 <ypad>0</ypad>
-                 <xexpand>False</xexpand>
-                 <yexpand>False</yexpand>
-                 <xshrink>False</xshrink>
-                 <yshrink>False</yshrink>
-                 <xfill>False</xfill>
-                 <yfill>False</yfill>
-               </child>
-             </widget>
-
-             <widget>
-               <class>GtkEntry</class>
-               <name>dpms_suspend_text</name>
-               <tooltip>How long until the monitor goes into power-saving mode (if Power Management is enabled).</tooltip>
-               <can_focus>True</can_focus>
-               <signal>
-                 <name>activate</name>
-                 <handler>pref_changed_cb</handler>
-                 <last_modification_time>Mon, 03 Apr 2000 02:28:29 GMT</last_modification_time>
-               </signal>
-               <signal>
-                 <name>focus_out_event</name>
-                 <handler>pref_changed_cb</handler>
-                 <last_modification_time>Mon, 03 Apr 2000 02:35:28 GMT</last_modification_time>
-               </signal>
-               <editable>True</editable>
-               <text_visible>True</text_visible>
-               <text_max_length>8</text_max_length>
-               <text></text>
-               <child>
-                 <left_attach>1</left_attach>
-                 <right_attach>2</right_attach>
-                 <top_attach>2</top_attach>
-                 <bottom_attach>3</bottom_attach>
-                 <xpad>0</xpad>
-                 <ypad>0</ypad>
-                 <xexpand>False</xexpand>
-                 <yexpand>False</yexpand>
-                 <xshrink>False</xshrink>
-                 <yshrink>False</yshrink>
-                 <xfill>False</xfill>
-                 <yfill>False</yfill>
-               </child>
-             </widget>
-
-             <widget>
-               <class>GtkEntry</class>
-               <name>dpms_standby_text</name>
-               <tooltip>How long before the monitor goes completely black (if Power Management is enabled).</tooltip>
-               <can_focus>True</can_focus>
-               <signal>
-                 <name>activate</name>
-                 <handler>pref_changed_cb</handler>
-                 <last_modification_time>Mon, 03 Apr 2000 02:28:29 GMT</last_modification_time>
-               </signal>
-               <signal>
-                 <name>focus_out_event</name>
-                 <handler>pref_changed_cb</handler>
-                 <last_modification_time>Mon, 03 Apr 2000 02:35:28 GMT</last_modification_time>
-               </signal>
-               <editable>True</editable>
-               <text_visible>True</text_visible>
-               <text_max_length>8</text_max_length>
-               <text></text>
-               <child>
-                 <left_attach>1</left_attach>
-                 <right_attach>2</right_attach>
-                 <top_attach>1</top_attach>
-                 <bottom_attach>2</bottom_attach>
-                 <xpad>0</xpad>
-                 <ypad>0</ypad>
-                 <xexpand>False</xexpand>
-                 <yexpand>False</yexpand>
-                 <xshrink>False</xshrink>
-                 <yshrink>False</yshrink>
-                 <xfill>False</xfill>
-                 <yfill>False</yfill>
-               </child>
-             </widget>
-
-             <widget>
-               <class>GtkLabel</class>
-               <name>dpms_standby_label</name>
-               <label>Standby After:</label>
-               <justify>GTK_JUSTIFY_RIGHT</justify>
-               <wrap>False</wrap>
-               <xalign>1</xalign>
-               <yalign>0.5</yalign>
+             <label>Image Manipulation:</label>
+             <label_xalign>0</label_xalign>
+             <shadow_type>GTK_SHADOW_ETCHED_IN</shadow_type>
+             <child>
+               <left_attach>0</left_attach>
+               <right_attach>1</right_attach>
+               <top_attach>1</top_attach>
+               <bottom_attach>2</bottom_attach>
                <xpad>0</xpad>
                <ypad>0</ypad>
-               <child>
-                 <left_attach>0</left_attach>
-                 <right_attach>1</right_attach>
-                 <top_attach>1</top_attach>
-                 <bottom_attach>2</bottom_attach>
-                 <xpad>0</xpad>
-                 <ypad>0</ypad>
-                 <xexpand>False</xexpand>
-                 <yexpand>False</yexpand>
-                 <xshrink>False</xshrink>
-                 <yshrink>False</yshrink>
-                 <xfill>True</xfill>
-                 <yfill>False</yfill>
-               </child>
-             </widget>
+               <xexpand>True</xexpand>
+               <yexpand>False</yexpand>
+               <xshrink>False</xshrink>
+               <yshrink>False</yshrink>
+               <xfill>True</xfill>
+               <yfill>True</yfill>
+             </child>
 
              <widget>
-               <class>GtkLabel</class>
-               <name>dpms_off_label</name>
-               <label>Off After:</label>
-               <justify>GTK_JUSTIFY_RIGHT</justify>
-               <wrap>False</wrap>
-               <xalign>1</xalign>
-               <yalign>0.5</yalign>
-               <xpad>0</xpad>
-               <ypad>0</ypad>
-               <child>
-                 <left_attach>0</left_attach>
-                 <right_attach>1</right_attach>
-                 <top_attach>3</top_attach>
-                 <bottom_attach>4</bottom_attach>
-                 <xpad>0</xpad>
-                 <ypad>0</ypad>
-                 <xexpand>False</xexpand>
-                 <yexpand>False</yexpand>
-                 <xshrink>False</xshrink>
-                 <yshrink>False</yshrink>
-                 <xfill>True</xfill>
-                 <yfill>False</yfill>
-               </child>
-             </widget>
+               <class>GtkTable</class>
+               <name>grab_table</name>
+               <border_width>10</border_width>
+               <rows>4</rows>
+               <columns>3</columns>
+               <homogeneous>False</homogeneous>
+               <row_spacing>0</row_spacing>
+               <column_spacing>0</column_spacing>
 
-             <widget>
-               <class>GtkLabel</class>
-               <name>dpms_suspend_label</name>
-               <label>Suspend After:</label>
-               <justify>GTK_JUSTIFY_RIGHT</justify>
-               <wrap>False</wrap>
-               <xalign>1</xalign>
-               <yalign>0.5</yalign>
-               <xpad>0</xpad>
-               <ypad>0</ypad>
-               <child>
-                 <left_attach>0</left_attach>
-                 <right_attach>1</right_attach>
-                 <top_attach>2</top_attach>
-                 <bottom_attach>3</bottom_attach>
-                 <xpad>0</xpad>
-                 <ypad>0</ypad>
-                 <xexpand>False</xexpand>
-                 <yexpand>False</yexpand>
-                 <xshrink>False</xshrink>
-                 <yshrink>False</yshrink>
-                 <xfill>True</xfill>
-                 <yfill>False</yfill>
-               </child>
-             </widget>
+               <widget>
+                 <class>GtkEventBox</class>
+                 <name>grab_image_eventbox</name>
+                 <tooltip>Whether the image-manipulating modes should operate on random images loaded from disk.</tooltip>
+                 <child>
+                   <left_attach>0</left_attach>
+                   <right_attach>3</right_attach>
+                   <top_attach>2</top_attach>
+                   <bottom_attach>3</bottom_attach>
+                   <xpad>0</xpad>
+                   <ypad>0</ypad>
+                   <xexpand>True</xexpand>
+                   <yexpand>False</yexpand>
+                   <xshrink>False</xshrink>
+                   <yshrink>False</yshrink>
+                   <xfill>True</xfill>
+                   <yfill>True</yfill>
+                 </child>
+
+                 <widget>
+                   <class>GtkCheckButton</class>
+                   <name>grab_image_button</name>
+                   <can_focus>True</can_focus>
+                   <signal>
+                     <name>toggled</name>
+                     <handler>pref_changed_cb</handler>
+                     <last_modification_time>Thu, 12 Apr 2001 23:40:53 GMT</last_modification_time>
+                   </signal>
+                   <label>Choose Random Image:</label>
+                   <active>False</active>
+                   <draw_indicator>True</draw_indicator>
+                 </widget>
+               </widget>
 
-             <widget>
-               <class>GtkLabel</class>
-               <name>dpms_dummy</name>
-               <label></label>
-               <justify>GTK_JUSTIFY_LEFT</justify>
-               <wrap>False</wrap>
-               <xalign>0.5</xalign>
-               <yalign>0.5</yalign>
-               <xpad>0</xpad>
-               <ypad>0</ypad>
-               <child>
-                 <left_attach>2</left_attach>
-                 <right_attach>3</right_attach>
-                 <top_attach>3</top_attach>
-                 <bottom_attach>4</bottom_attach>
-                 <xpad>0</xpad>
-                 <ypad>0</ypad>
-                 <xexpand>True</xexpand>
-                 <yexpand>False</yexpand>
-                 <xshrink>False</xshrink>
-                 <yshrink>False</yshrink>
-                 <xfill>True</xfill>
-                 <yfill>False</yfill>
-               </child>
-             </widget>
+               <widget>
+                 <class>GtkButton</class>
+                 <name>image_browse_button</name>
+                 <can_focus>True</can_focus>
+                 <signal>
+                   <name>clicked</name>
+                   <handler>browse_image_dir_cb</handler>
+                   <last_modification_time>Thu, 12 Apr 2001 00:35:43 GMT</last_modification_time>
+                 </signal>
+                 <label>Browse</label>
+                 <child>
+                   <left_attach>2</left_attach>
+                   <right_attach>3</right_attach>
+                   <top_attach>3</top_attach>
+                   <bottom_attach>4</bottom_attach>
+                   <xpad>4</xpad>
+                   <ypad>0</ypad>
+                   <xexpand>False</xexpand>
+                   <yexpand>False</yexpand>
+                   <xshrink>False</xshrink>
+                   <yshrink>False</yshrink>
+                   <xfill>False</xfill>
+                   <yfill>False</yfill>
+                 </child>
+               </widget>
 
-             <widget>
-               <class>GtkEventBox</class>
-               <name>dpms_button_eventbox</name>
-               <tooltip>Whether the monitor should be powered down after a while.</tooltip>
-               <child>
-                 <left_attach>0</left_attach>
-                 <right_attach>3</right_attach>
-                 <top_attach>0</top_attach>
-                 <bottom_attach>1</bottom_attach>
-                 <xpad>0</xpad>
+               <widget>
+                 <class>GtkEventBox</class>
+                 <name>grab_video_eventbox</name>
+                 <tooltip>Whether the image-manipulating modes should operate on images captured from the system's video input (if there is one).</tooltip>
+                 <child>
+                   <left_attach>0</left_attach>
+                   <right_attach>3</right_attach>
+                   <top_attach>1</top_attach>
+                   <bottom_attach>2</bottom_attach>
+                   <xpad>0</xpad>
+                   <ypad>0</ypad>
+                   <xexpand>True</xexpand>
+                   <yexpand>False</yexpand>
+                   <xshrink>False</xshrink>
+                   <yshrink>False</yshrink>
+                   <xfill>True</xfill>
+                   <yfill>True</yfill>
+                 </child>
+
+                 <widget>
+                   <class>GtkCheckButton</class>
+                   <name>grab_video_button</name>
+                   <can_focus>True</can_focus>
+                   <signal>
+                     <name>toggled</name>
+                     <handler>pref_changed_cb</handler>
+                     <last_modification_time>Thu, 12 Apr 2001 23:40:40 GMT</last_modification_time>
+                   </signal>
+                   <label>Grab Video Frames</label>
+                   <active>False</active>
+                   <draw_indicator>True</draw_indicator>
+                 </widget>
+               </widget>
+
+               <widget>
+                 <class>GtkEventBox</class>
+                 <name>grab_desk_eventbox</name>
+                 <tooltip>Whether the image-manipulating modes should be allowed to operate on an image of your desktop.</tooltip>
+                 <child>
+                   <left_attach>0</left_attach>
+                   <right_attach>3</right_attach>
+                   <top_attach>0</top_attach>
+                   <bottom_attach>1</bottom_attach>
+                   <xpad>0</xpad>
+                   <ypad>0</ypad>
+                   <xexpand>True</xexpand>
+                   <yexpand>False</yexpand>
+                   <xshrink>False</xshrink>
+                   <yshrink>False</yshrink>
+                   <xfill>True</xfill>
+                   <yfill>True</yfill>
+                 </child>
+
+                 <widget>
+                   <class>GtkCheckButton</class>
+                   <name>grab_desk_button</name>
+                   <can_focus>True</can_focus>
+                   <signal>
+                     <name>toggled</name>
+                     <handler>pref_changed_cb</handler>
+                     <last_modification_time>Thu, 12 Apr 2001 23:40:27 GMT</last_modification_time>
+                   </signal>
+                   <label>Grab Desktop Images</label>
+                   <active>False</active>
+                   <draw_indicator>True</draw_indicator>
+                 </widget>
+               </widget>
+
+               <widget>
+                 <class>GtkLabel</class>
+                 <name>grab_dummy</name>
+                 <label></label>
+                 <justify>GTK_JUSTIFY_LEFT</justify>
+                 <wrap>False</wrap>
+                 <xalign>0.5</xalign>
+                 <yalign>0.5</yalign>
+                 <xpad>8</xpad>
                  <ypad>0</ypad>
-                 <xexpand>False</xexpand>
-                 <yexpand>False</yexpand>
-                 <xshrink>False</xshrink>
-                 <yshrink>False</yshrink>
-                 <xfill>True</xfill>
-                 <yfill>True</yfill>
-               </child>
+                 <child>
+                   <left_attach>0</left_attach>
+                   <right_attach>1</right_attach>
+                   <top_attach>3</top_attach>
+                   <bottom_attach>4</bottom_attach>
+                   <xpad>0</xpad>
+                   <ypad>0</ypad>
+                   <xexpand>False</xexpand>
+                   <yexpand>False</yexpand>
+                   <xshrink>True</xshrink>
+                   <yshrink>True</yshrink>
+                   <xfill>True</xfill>
+                   <yfill>False</yfill>
+                 </child>
+               </widget>
 
                <widget>
-                 <class>GtkCheckButton</class>
-                 <name>dpms_button</name>
+                 <class>GtkEntry</class>
+                 <name>image_text</name>
+                 <tooltip>The directory from which images will be randomly chosen.</tooltip>
                  <can_focus>True</can_focus>
                  <signal>
-                   <name>toggled</name>
+                   <name>activate</name>
                    <handler>pref_changed_cb</handler>
-                   <last_modification_time>Mon, 03 Apr 2000 02:33:01 GMT</last_modification_time>
+                   <last_modification_time>Thu, 12 Apr 2001 00:34:49 GMT</last_modification_time>
                  </signal>
-                 <label>Power Management Enabled</label>
-                 <active>True</active>
-                 <draw_indicator>True</draw_indicator>
+                 <signal>
+                   <name>focus_out_event</name>
+                   <handler>pref_changed_cb</handler>
+                   <last_modification_time>Thu, 12 Apr 2001 00:35:17 GMT</last_modification_time>
+                 </signal>
+                 <editable>True</editable>
+                 <text_visible>True</text_visible>
+                 <text_max_length>0</text_max_length>
+                 <text></text>
+                 <child>
+                   <left_attach>1</left_attach>
+                   <right_attach>2</right_attach>
+                   <top_attach>3</top_attach>
+                   <bottom_attach>4</bottom_attach>
+                   <xpad>0</xpad>
+                   <ypad>0</ypad>
+                   <xexpand>False</xexpand>
+                   <yexpand>False</yexpand>
+                   <xshrink>True</xshrink>
+                   <yshrink>False</yshrink>
+                   <xfill>True</xfill>
+                   <yfill>False</yfill>
+                 </child>
                </widget>
              </widget>
            </widget>
-         </widget>
-
-         <widget>
-           <class>GtkFrame</class>
-           <name>diag_frame</name>
-           <border_width>10</border_width>
-           <label>Diagnostics:</label>
-           <label_xalign>0</label_xalign>
-           <shadow_type>GTK_SHADOW_ETCHED_IN</shadow_type>
-           <child>
-             <left_attach>0</left_attach>
-             <right_attach>1</right_attach>
-             <top_attach>1</top_attach>
-             <bottom_attach>2</bottom_attach>
-             <xpad>0</xpad>
-             <ypad>0</ypad>
-             <xexpand>False</xexpand>
-             <yexpand>False</yexpand>
-             <xshrink>False</xshrink>
-             <yshrink>False</yshrink>
-             <xfill>True</xfill>
-             <yfill>True</yfill>
-           </child>
 
            <widget>
-             <class>GtkTable</class>
-             <name>diag_table</name>
+             <class>GtkFrame</class>
+             <name>blanking_frame</name>
              <border_width>10</border_width>
-             <rows>3</rows>
-             <columns>1</columns>
-             <homogeneous>False</homogeneous>
-             <row_spacing>2</row_spacing>
-             <column_spacing>10</column_spacing>
+             <label>Blanking and Locking:</label>
+             <label_xalign>0</label_xalign>
+             <shadow_type>GTK_SHADOW_ETCHED_IN</shadow_type>
+             <child>
+               <left_attach>0</left_attach>
+               <right_attach>1</right_attach>
+               <top_attach>0</top_attach>
+               <bottom_attach>1</bottom_attach>
+               <xpad>0</xpad>
+               <ypad>0</ypad>
+               <xexpand>True</xexpand>
+               <yexpand>False</yexpand>
+               <xshrink>False</xshrink>
+               <yshrink>False</yshrink>
+               <xfill>True</xfill>
+               <yfill>True</yfill>
+             </child>
 
              <widget>
-               <class>GtkEventBox</class>
-               <name>verbose_button_eventbox</name>
-               <tooltip>Whether the daemon should print lots of debugging information.</tooltip>
-               <child>
-                 <left_attach>0</left_attach>
-                 <right_attach>1</right_attach>
-                 <top_attach>0</top_attach>
-                 <bottom_attach>1</bottom_attach>
-                 <xpad>0</xpad>
-                 <ypad>0</ypad>
-                 <xexpand>True</xexpand>
-                 <yexpand>False</yexpand>
-                 <xshrink>False</xshrink>
-                 <yshrink>False</yshrink>
-                 <xfill>True</xfill>
-                 <yfill>True</yfill>
-               </child>
+               <class>GtkTable</class>
+               <name>blanking_table</name>
+               <border_width>10</border_width>
+               <rows>5</rows>
+               <columns>3</columns>
+               <homogeneous>False</homogeneous>
+               <row_spacing>2</row_spacing>
+               <column_spacing>10</column_spacing>
 
                <widget>
-                 <class>GtkCheckButton</class>
-                 <name>verbose_button</name>
+                 <class>GtkEntry</class>
+                 <name>lock_text</name>
+                 <tooltip>How long after the screen saver has activated until a password will be required (if  `Require Password' is also set.)</tooltip>
                  <can_focus>True</can_focus>
                  <signal>
-                   <name>toggled</name>
+                   <name>activate</name>
                    <handler>pref_changed_cb</handler>
-                   <last_modification_time>Mon, 03 Apr 2000 02:32:25 GMT</last_modification_time>
+                   <last_modification_time>Mon, 03 Apr 2000 02:28:29 GMT</last_modification_time>
                  </signal>
-                 <label>Verbose Diagnostics</label>
-                 <active>False</active>
-                 <draw_indicator>True</draw_indicator>
+                 <signal>
+                   <name>focus_out_event</name>
+                   <handler>pref_changed_cb</handler>
+                   <last_modification_time>Mon, 03 Apr 2000 02:35:28 GMT</last_modification_time>
+                 </signal>
+                 <editable>True</editable>
+                 <text_visible>True</text_visible>
+                 <text_max_length>8</text_max_length>
+                 <text></text>
+                 <child>
+                   <left_attach>1</left_attach>
+                   <right_attach>2</right_attach>
+                   <top_attach>4</top_attach>
+                   <bottom_attach>5</bottom_attach>
+                   <xpad>0</xpad>
+                   <ypad>0</ypad>
+                   <xexpand>False</xexpand>
+                   <yexpand>False</yexpand>
+                   <xshrink>False</xshrink>
+                   <yshrink>False</yshrink>
+                   <xfill>False</xfill>
+                   <yfill>False</yfill>
+                 </child>
                </widget>
-             </widget>
-
-             <widget>
-               <class>GtkEventBox</class>
-               <name>capture_button_eventbox</name>
-               <tooltip>Whether the stdout and stderr streams of graphics demos should be displayed on the xscreensaver window.</tooltip>
-               <child>
-                 <left_attach>0</left_attach>
-                 <right_attach>1</right_attach>
-                 <top_attach>1</top_attach>
-                 <bottom_attach>2</bottom_attach>
-                 <xpad>0</xpad>
-                 <ypad>0</ypad>
-                 <xexpand>True</xexpand>
-                 <yexpand>False</yexpand>
-                 <xshrink>False</xshrink>
-                 <yshrink>False</yshrink>
-                 <xfill>True</xfill>
-                 <yfill>True</yfill>
-               </child>
 
                <widget>
-                 <class>GtkCheckButton</class>
-                 <name>capture_button</name>
+                 <class>GtkEntry</class>
+                 <name>cycle_text</name>
+                 <tooltip>How long each demo will be run before moving on to another.</tooltip>
                  <can_focus>True</can_focus>
                  <signal>
-                   <name>toggled</name>
+                   <name>activate</name>
+                   <handler>pref_changed_cb</handler>
+                   <last_modification_time>Mon, 03 Apr 2000 02:28:29 GMT</last_modification_time>
+                 </signal>
+                 <signal>
+                   <name>focus_out_event</name>
                    <handler>pref_changed_cb</handler>
-                   <last_modification_time>Mon, 03 Apr 2000 02:32:25 GMT</last_modification_time>
+                   <last_modification_time>Mon, 03 Apr 2000 02:35:28 GMT</last_modification_time>
                  </signal>
-                 <label>Display Subprocess Errors</label>
-                 <active>False</active>
-                 <draw_indicator>True</draw_indicator>
+                 <editable>True</editable>
+                 <text_visible>True</text_visible>
+                 <text_max_length>8</text_max_length>
+                 <text></text>
+                 <child>
+                   <left_attach>1</left_attach>
+                   <right_attach>2</right_attach>
+                   <top_attach>1</top_attach>
+                   <bottom_attach>2</bottom_attach>
+                   <xpad>0</xpad>
+                   <ypad>0</ypad>
+                   <xexpand>False</xexpand>
+                   <yexpand>False</yexpand>
+                   <xshrink>False</xshrink>
+                   <yshrink>False</yshrink>
+                   <xfill>False</xfill>
+                   <yfill>False</yfill>
+                 </child>
                </widget>
-             </widget>
-
-             <widget>
-               <class>GtkEventBox</class>
-               <name>splash_button_eventbox</name>
-               <tooltip>Whether the splash screen (with the version number and `Help' button) should be momentarily displayed when the daemon first starts up.</tooltip>
-               <child>
-                 <left_attach>0</left_attach>
-                 <right_attach>1</right_attach>
-                 <top_attach>2</top_attach>
-                 <bottom_attach>3</bottom_attach>
-                 <xpad>0</xpad>
-                 <ypad>0</ypad>
-                 <xexpand>True</xexpand>
-                 <yexpand>False</yexpand>
-                 <xshrink>False</xshrink>
-                 <yshrink>False</yshrink>
-                 <xfill>True</xfill>
-                 <yfill>False</yfill>
-               </child>
 
                <widget>
-                 <class>GtkCheckButton</class>
-                 <name>splash_button</name>
+                 <class>GtkEntry</class>
+                 <name>timeout_text</name>
+                 <tooltip>How long until the screen saver activates and begins running demos.</tooltip>
                  <can_focus>True</can_focus>
                  <signal>
-                   <name>toggled</name>
+                   <name>activate</name>
                    <handler>pref_changed_cb</handler>
-                   <last_modification_time>Mon, 03 Apr 2000 02:32:39 GMT</last_modification_time>
+                   <last_modification_time>Mon, 03 Apr 2000 02:28:10 GMT</last_modification_time>
                  </signal>
-                 <label>Display Splash Screen at Startup</label>
-                 <active>True</active>
-                 <draw_indicator>True</draw_indicator>
+                 <signal>
+                   <name>focus_out_event</name>
+                   <handler>pref_changed_cb</handler>
+                   <last_modification_time>Mon, 03 Apr 2000 02:34:26 GMT</last_modification_time>
+                 </signal>
+                 <editable>True</editable>
+                 <text_visible>True</text_visible>
+                 <text_max_length>8</text_max_length>
+                 <text></text>
+                 <child>
+                   <left_attach>1</left_attach>
+                   <right_attach>2</right_attach>
+                   <top_attach>0</top_attach>
+                   <bottom_attach>1</bottom_attach>
+                   <xpad>0</xpad>
+                   <ypad>0</ypad>
+                   <xexpand>False</xexpand>
+                   <yexpand>False</yexpand>
+                   <xshrink>False</xshrink>
+                   <yshrink>False</yshrink>
+                   <xfill>False</xfill>
+                   <yfill>False</yfill>
+                 </child>
                </widget>
-             </widget>
-           </widget>
-         </widget>
 
-         <widget>
-           <class>GtkFrame</class>
-           <name>cmap_frame</name>
-           <border_width>10</border_width>
-           <label>Colormaps: (8-bit displays only)</label>
-           <label_xalign>0</label_xalign>
-           <shadow_type>GTK_SHADOW_ETCHED_IN</shadow_type>
-           <child>
-             <left_attach>1</left_attach>
-             <right_attach>2</right_attach>
-             <top_attach>1</top_attach>
-             <bottom_attach>2</bottom_attach>
-             <xpad>0</xpad>
-             <ypad>0</ypad>
-             <xexpand>False</xexpand>
-             <yexpand>False</yexpand>
-             <xshrink>False</xshrink>
-             <yshrink>False</yshrink>
-             <xfill>True</xfill>
-             <yfill>True</yfill>
-           </child>
-
-           <widget>
-             <class>GtkTable</class>
-             <name>cmap_table</name>
-             <border_width>10</border_width>
-             <rows>5</rows>
-             <columns>3</columns>
-             <homogeneous>False</homogeneous>
-             <row_spacing>2</row_spacing>
-             <column_spacing>10</column_spacing>
-
-             <widget>
-               <class>GtkEntry</class>
-               <name>fade_text</name>
-               <tooltip>How long it should take for the screen to fade in and out.</tooltip>
-               <can_focus>True</can_focus>
-               <signal>
-                 <name>activate</name>
-                 <handler>pref_changed_cb</handler>
-                 <last_modification_time>Mon, 03 Apr 2000 02:28:29 GMT</last_modification_time>
-               </signal>
-               <signal>
-                 <name>focus_out_event</name>
-                 <handler>pref_changed_cb</handler>
-                 <last_modification_time>Mon, 03 Apr 2000 02:35:28 GMT</last_modification_time>
-               </signal>
-               <editable>True</editable>
-               <text_visible>True</text_visible>
-               <text_max_length>8</text_max_length>
-               <text></text>
-               <child>
-                 <left_attach>1</left_attach>
-                 <right_attach>2</right_attach>
-                 <top_attach>4</top_attach>
-                 <bottom_attach>5</bottom_attach>
+               <widget>
+                 <class>GtkLabel</class>
+                 <name>timeout_label</name>
+                 <label>Blank After:</label>
+                 <justify>GTK_JUSTIFY_RIGHT</justify>
+                 <wrap>False</wrap>
+                 <xalign>1</xalign>
+                 <yalign>0.5</yalign>
                  <xpad>0</xpad>
                  <ypad>0</ypad>
-                 <xexpand>False</xexpand>
-                 <yexpand>False</yexpand>
-                 <xshrink>False</xshrink>
-                 <yshrink>False</yshrink>
-                 <xfill>False</xfill>
-                 <yfill>False</yfill>
-               </child>
-             </widget>
+                 <child>
+                   <left_attach>0</left_attach>
+                   <right_attach>1</right_attach>
+                   <top_attach>0</top_attach>
+                   <bottom_attach>1</bottom_attach>
+                   <xpad>0</xpad>
+                   <ypad>0</ypad>
+                   <xexpand>False</xexpand>
+                   <yexpand>False</yexpand>
+                   <xshrink>False</xshrink>
+                   <yshrink>False</yshrink>
+                   <xfill>True</xfill>
+                   <yfill>False</yfill>
+                 </child>
+               </widget>
 
-             <widget>
-               <class>GtkLabel</class>
-               <name>cmap_dummy</name>
-               <label></label>
-               <justify>GTK_JUSTIFY_LEFT</justify>
-               <wrap>False</wrap>
-               <xalign>0.5</xalign>
-               <yalign>0.5</yalign>
-               <xpad>0</xpad>
-               <ypad>0</ypad>
-               <child>
-                 <left_attach>2</left_attach>
-                 <right_attach>3</right_attach>
-                 <top_attach>4</top_attach>
-                 <bottom_attach>5</bottom_attach>
+               <widget>
+                 <class>GtkLabel</class>
+                 <name>cycle_label</name>
+                 <label>Cycle After:</label>
+                 <justify>GTK_JUSTIFY_RIGHT</justify>
+                 <wrap>False</wrap>
+                 <xalign>1</xalign>
+                 <yalign>0.5</yalign>
                  <xpad>0</xpad>
                  <ypad>0</ypad>
-                 <xexpand>True</xexpand>
-                 <yexpand>False</yexpand>
-                 <xshrink>False</xshrink>
-                 <yshrink>False</yshrink>
-                 <xfill>True</xfill>
-                 <yfill>False</yfill>
-               </child>
-             </widget>
+                 <child>
+                   <left_attach>0</left_attach>
+                   <right_attach>1</right_attach>
+                   <top_attach>1</top_attach>
+                   <bottom_attach>2</bottom_attach>
+                   <xpad>0</xpad>
+                   <ypad>0</ypad>
+                   <xexpand>False</xexpand>
+                   <yexpand>False</yexpand>
+                   <xshrink>False</xshrink>
+                   <yshrink>False</yshrink>
+                   <xfill>True</xfill>
+                   <yfill>False</yfill>
+                 </child>
+               </widget>
 
-             <widget>
-               <class>GtkLabel</class>
-               <name>fade_label</name>
-               <label>Fade Duration:</label>
-               <justify>GTK_JUSTIFY_RIGHT</justify>
-               <wrap>False</wrap>
-               <xalign>1</xalign>
-               <yalign>0.5</yalign>
-               <xpad>0</xpad>
-               <ypad>0</ypad>
-               <child>
-                 <left_attach>0</left_attach>
-                 <right_attach>1</right_attach>
-                 <top_attach>4</top_attach>
-                 <bottom_attach>5</bottom_attach>
+               <widget>
+                 <class>GtkLabel</class>
+                 <name>lock_label</name>
+                 <label>Lock After:</label>
+                 <justify>GTK_JUSTIFY_RIGHT</justify>
+                 <wrap>False</wrap>
+                 <xalign>1</xalign>
+                 <yalign>0.5</yalign>
                  <xpad>0</xpad>
                  <ypad>0</ypad>
-                 <xexpand>False</xexpand>
-                 <yexpand>False</yexpand>
-                 <xshrink>False</xshrink>
-                 <yshrink>False</yshrink>
-                 <xfill>True</xfill>
-                 <yfill>False</yfill>
-               </child>
-             </widget>
+                 <child>
+                   <left_attach>0</left_attach>
+                   <right_attach>1</right_attach>
+                   <top_attach>4</top_attach>
+                   <bottom_attach>5</bottom_attach>
+                   <xpad>0</xpad>
+                   <ypad>0</ypad>
+                   <xexpand>False</xexpand>
+                   <yexpand>False</yexpand>
+                   <xshrink>False</xshrink>
+                   <yshrink>False</yshrink>
+                   <xfill>True</xfill>
+                   <yfill>False</yfill>
+                 </child>
+               </widget>
 
-             <widget>
-               <class>GtkHSeparator</class>
-               <name>cmap_hr</name>
-               <child>
-                 <left_attach>0</left_attach>
-                 <right_attach>3</right_attach>
-                 <top_attach>1</top_attach>
-                 <bottom_attach>2</bottom_attach>
+               <widget>
+                 <class>GtkLabel</class>
+                 <name>blanking_dummy</name>
+                 <label></label>
+                 <justify>GTK_JUSTIFY_LEFT</justify>
+                 <wrap>False</wrap>
+                 <xalign>0.5</xalign>
+                 <yalign>0.5</yalign>
                  <xpad>0</xpad>
                  <ypad>0</ypad>
-                 <xexpand>True</xexpand>
-                 <yexpand>True</yexpand>
-                 <xshrink>False</xshrink>
-                 <yshrink>False</yshrink>
-                 <xfill>True</xfill>
-                 <yfill>True</yfill>
-               </child>
-             </widget>
+                 <child>
+                   <left_attach>2</left_attach>
+                   <right_attach>3</right_attach>
+                   <top_attach>4</top_attach>
+                   <bottom_attach>5</bottom_attach>
+                   <xpad>0</xpad>
+                   <ypad>0</ypad>
+                   <xexpand>True</xexpand>
+                   <yexpand>False</yexpand>
+                   <xshrink>False</xshrink>
+                   <yshrink>False</yshrink>
+                   <xfill>True</xfill>
+                   <yfill>False</yfill>
+                 </child>
+               </widget>
 
-             <widget>
-               <class>GtkEventBox</class>
-               <name>install_button_eventbox</name>
-               <tooltip>Whether to install a private colormap when running in 8-bit mode on the default Visual.</tooltip>
-               <child>
-                 <left_attach>0</left_attach>
-                 <right_attach>3</right_attach>
-                 <top_attach>0</top_attach>
-                 <bottom_attach>1</bottom_attach>
-                 <xpad>0</xpad>
-                 <ypad>0</ypad>
-                 <xexpand>False</xexpand>
-                 <yexpand>False</yexpand>
-                 <xshrink>False</xshrink>
-                 <yshrink>False</yshrink>
-                 <xfill>True</xfill>
-                 <yfill>True</yfill>
-               </child>
+               <widget>
+                 <class>GtkEventBox</class>
+                 <name>lock_button_eventbox</name>
+                 <tooltip>Whether a password should be required to unblank the screen.</tooltip>
+                 <child>
+                   <left_attach>0</left_attach>
+                   <right_attach>3</right_attach>
+                   <top_attach>3</top_attach>
+                   <bottom_attach>4</bottom_attach>
+                   <xpad>0</xpad>
+                   <ypad>0</ypad>
+                   <xexpand>False</xexpand>
+                   <yexpand>False</yexpand>
+                   <xshrink>False</xshrink>
+                   <yshrink>False</yshrink>
+                   <xfill>True</xfill>
+                   <yfill>True</yfill>
+                 </child>
+
+                 <widget>
+                   <class>GtkCheckButton</class>
+                   <name>lock_button</name>
+                   <can_focus>True</can_focus>
+                   <signal>
+                     <name>toggled</name>
+                     <handler>pref_changed_cb</handler>
+                     <last_modification_time>Mon, 03 Apr 2000 02:31:53 GMT</last_modification_time>
+                   </signal>
+                   <label>Require Password</label>
+                   <active>False</active>
+                   <draw_indicator>True</draw_indicator>
+                 </widget>
+               </widget>
 
                <widget>
-                 <class>GtkCheckButton</class>
-                 <name>install_button</name>
-                 <can_focus>True</can_focus>
-                 <signal>
-                   <name>toggled</name>
-                   <handler>pref_changed_cb</handler>
-                   <last_modification_time>Mon, 03 Apr 2000 02:32:25 GMT</last_modification_time>
-                 </signal>
-                 <label>Install Colormap</label>
-                 <active>False</active>
-                 <draw_indicator>True</draw_indicator>
+                 <class>GtkHSeparator</class>
+                 <name>blanking_hr</name>
+                 <child>
+                   <left_attach>0</left_attach>
+                   <right_attach>3</right_attach>
+                   <top_attach>2</top_attach>
+                   <bottom_attach>3</bottom_attach>
+                   <xpad>0</xpad>
+                   <ypad>2</ypad>
+                   <xexpand>True</xexpand>
+                   <yexpand>True</yexpand>
+                   <xshrink>False</xshrink>
+                   <yshrink>False</yshrink>
+                   <xfill>True</xfill>
+                   <yfill>True</yfill>
+                 </child>
                </widget>
              </widget>
+           </widget>
+
+           <widget>
+             <class>GtkFrame</class>
+             <name>diag_frame</name>
+             <border_width>10</border_width>
+             <label>Diagnostics:</label>
+             <label_xalign>0</label_xalign>
+             <shadow_type>GTK_SHADOW_ETCHED_IN</shadow_type>
+             <child>
+               <left_attach>0</left_attach>
+               <right_attach>1</right_attach>
+               <top_attach>2</top_attach>
+               <bottom_attach>3</bottom_attach>
+               <xpad>0</xpad>
+               <ypad>0</ypad>
+               <xexpand>True</xexpand>
+               <yexpand>False</yexpand>
+               <xshrink>False</xshrink>
+               <yshrink>False</yshrink>
+               <xfill>True</xfill>
+               <yfill>True</yfill>
+             </child>
 
              <widget>
-               <class>GtkEventBox</class>
-               <name>fade_button_eventbox</name>
-               <tooltip>Whether the screen should slowly fade to black when the screen saver activates.</tooltip>
-               <child>
-                 <left_attach>0</left_attach>
-                 <right_attach>3</right_attach>
-                 <top_attach>2</top_attach>
-                 <bottom_attach>3</bottom_attach>
-                 <xpad>0</xpad>
-                 <ypad>0</ypad>
-                 <xexpand>False</xexpand>
-                 <yexpand>False</yexpand>
-                 <xshrink>False</xshrink>
-                 <yshrink>False</yshrink>
-                 <xfill>True</xfill>
-                 <yfill>True</yfill>
-               </child>
+               <class>GtkTable</class>
+               <name>diag_table</name>
+               <border_width>10</border_width>
+               <rows>3</rows>
+               <columns>1</columns>
+               <homogeneous>False</homogeneous>
+               <row_spacing>2</row_spacing>
+               <column_spacing>10</column_spacing>
 
                <widget>
-                 <class>GtkCheckButton</class>
-                 <name>fade_button</name>
-                 <can_focus>True</can_focus>
-                 <signal>
-                   <name>toggled</name>
-                   <handler>pref_changed_cb</handler>
-                   <last_modification_time>Mon, 03 Apr 2000 02:32:39 GMT</last_modification_time>
-                 </signal>
-                 <label>Fade To Black When Blanking</label>
-                 <active>False</active>
-                 <draw_indicator>True</draw_indicator>
+                 <class>GtkEventBox</class>
+                 <name>splash_button_eventbox</name>
+                 <tooltip>Whether the splash screen (with the version number and `Help' button) should be momentarily displayed when the daemon first starts up.</tooltip>
+                 <child>
+                   <left_attach>0</left_attach>
+                   <right_attach>1</right_attach>
+                   <top_attach>2</top_attach>
+                   <bottom_attach>3</bottom_attach>
+                   <xpad>0</xpad>
+                   <ypad>0</ypad>
+                   <xexpand>True</xexpand>
+                   <yexpand>False</yexpand>
+                   <xshrink>False</xshrink>
+                   <yshrink>False</yshrink>
+                   <xfill>True</xfill>
+                   <yfill>False</yfill>
+                 </child>
+
+                 <widget>
+                   <class>GtkCheckButton</class>
+                   <name>splash_button</name>
+                   <can_focus>True</can_focus>
+                   <signal>
+                     <name>toggled</name>
+                     <handler>pref_changed_cb</handler>
+                     <last_modification_time>Mon, 03 Apr 2000 02:32:39 GMT</last_modification_time>
+                   </signal>
+                   <label>Display Splash Screen at Startup</label>
+                   <active>True</active>
+                   <draw_indicator>True</draw_indicator>
+                 </widget>
                </widget>
-             </widget>
 
-             <widget>
-               <class>GtkEventBox</class>
-               <name>unfade_button_eventbox</name>
-               <tooltip>Whether the screen should slowly fade in from black when the screen saver deactivates.</tooltip>
-               <child>
-                 <left_attach>0</left_attach>
-                 <right_attach>3</right_attach>
-                 <top_attach>3</top_attach>
-                 <bottom_attach>4</bottom_attach>
-                 <xpad>0</xpad>
-                 <ypad>0</ypad>
-                 <xexpand>False</xexpand>
-                 <yexpand>False</yexpand>
-                 <xshrink>False</xshrink>
-                 <yshrink>False</yshrink>
-                 <xfill>True</xfill>
-                 <yfill>True</yfill>
-               </child>
+               <widget>
+                 <class>GtkEventBox</class>
+                 <name>capture_button_eventbox</name>
+                 <tooltip>Whether the stdout and stderr streams of graphics demos should be displayed on the xscreensaver window.</tooltip>
+                 <child>
+                   <left_attach>0</left_attach>
+                   <right_attach>1</right_attach>
+                   <top_attach>1</top_attach>
+                   <bottom_attach>2</bottom_attach>
+                   <xpad>0</xpad>
+                   <ypad>0</ypad>
+                   <xexpand>True</xexpand>
+                   <yexpand>False</yexpand>
+                   <xshrink>False</xshrink>
+                   <yshrink>False</yshrink>
+                   <xfill>True</xfill>
+                   <yfill>False</yfill>
+                 </child>
+
+                 <widget>
+                   <class>GtkCheckButton</class>
+                   <name>capture_button</name>
+                   <can_focus>True</can_focus>
+                   <signal>
+                     <name>toggled</name>
+                     <handler>pref_changed_cb</handler>
+                     <last_modification_time>Mon, 03 Apr 2000 02:32:25 GMT</last_modification_time>
+                   </signal>
+                   <label>Display Subprocess Errors</label>
+                   <active>False</active>
+                   <draw_indicator>True</draw_indicator>
+                 </widget>
+               </widget>
 
                <widget>
-                 <class>GtkCheckButton</class>
-                 <name>unfade_button</name>
-                 <can_focus>True</can_focus>
-                 <signal>
-                   <name>toggled</name>
-                   <handler>pref_changed_cb</handler>
-                   <last_modification_time>Mon, 03 Apr 2000 02:32:51 GMT</last_modification_time>
-                 </signal>
-                 <label>Fade From Black When Unblanking</label>
-                 <active>False</active>
-                 <draw_indicator>True</draw_indicator>
+                 <class>GtkEventBox</class>
+                 <name>verbose_button_eventbox</name>
+                 <tooltip>Whether the daemon should print lots of debugging information.</tooltip>
+                 <child>
+                   <left_attach>0</left_attach>
+                   <right_attach>1</right_attach>
+                   <top_attach>0</top_attach>
+                   <bottom_attach>1</bottom_attach>
+                   <xpad>0</xpad>
+                   <ypad>0</ypad>
+                   <xexpand>True</xexpand>
+                   <yexpand>False</yexpand>
+                   <xshrink>False</xshrink>
+                   <yshrink>False</yshrink>
+                   <xfill>True</xfill>
+                   <yfill>False</yfill>
+                 </child>
+
+                 <widget>
+                   <class>GtkCheckButton</class>
+                   <name>verbose_button</name>
+                   <can_focus>True</can_focus>
+                   <signal>
+                     <name>toggled</name>
+                     <handler>pref_changed_cb</handler>
+                     <last_modification_time>Mon, 03 Apr 2000 02:32:25 GMT</last_modification_time>
+                   </signal>
+                   <label>Verbose Diagnostics</label>
+                   <active>False</active>
+                   <draw_indicator>True</draw_indicator>
+                 </widget>
                </widget>
              </widget>
            </widget>
index bedb20812eb6e7b659584d06d9da05fac7edcc62..01767bfbf8be746527eef42519e395f439185c70 100644 (file)
@@ -11,7 +11,7 @@
 .if n .sp 1
 .if t .sp .5
 ..
-.TH XScreenSaver 1 "29-Mar-2001 (3.31)" "X Version 11"
+.TH XScreenSaver 1 "15-Apr-2001 (3.32)" "X Version 11"
 .SH NAME
 xscreensaver-demo - interactively control the background xscreensaver daemon
 .SH SYNOPSIS
@@ -162,6 +162,34 @@ activation) then a password would be required.  The default is 0, meaning
 that if locking is enabled, then a password will be required as soon as the 
 screen blanks.
 .TP 4
+.B Grab Desktop Images
+Some of the graphics hacks manipulate images.  If this option is selected,
+then they are allowed to manipulate the desktop image, that is, a display
+mode might draw a picture of your desktop melting, or being distorted in
+some way.  The security-paranoid might want to disable this option, because
+if it is set, it means that the windows on your desktop will occasionally
+be visible while your screen is locked.  Others will not be able 
+to \fIdo\fP anything, but they may be able to \fIsee\fP whatever you
+left on your screen.
+.TP 4
+.B Grab Video Frames
+If your system has a video capture card, selecting this option will allow
+the image-manipulating modes to capture a frame of video to operate on.
+.TP 4
+.B Choose Random Image
+If this option is set, then the image-manipulating modes will select a
+random image file from disk, from the directory you specify in the text
+entry field.  That directory will be recursively searched for files,
+and it is assumed that all the files under that directory are images.
+
+If more than one of these options are selected, then one will be chosen at
+random.  If none of them are selected, then an image of video colorbars will
+be used instead.  
+
+(All three of these options work by invoking the
+.BR xscreensaver\-getimage (1)
+program, which is what actually does the work.)
+.TP 4
 .B Verbose Diagnostics
 Whether to print lots of debugging information.
 .TP 4
@@ -215,16 +243,15 @@ on a per-demo basis.
 .TP 4
 .B Fade To Black When Blanking
 If selected, then when the screensaver activates, the current contents
-of the screen will fade to black instead of simply winking out.  This only
-works on displays with writable colormaps, that is, if the screen's default
-visual is a PseudoColor visual.  A fade will also be done when
+of the screen will fade to black instead of simply winking out.  (Note:
+this doesn't work with all X servers.)  A fade will also be done when
 switching graphics hacks (when the \fICycle After\fP expires.)
 .TP 4
 .B Unfade From Black When Unblanking
 The complement to \fIFade Colormap\fP: if selected, then when the screensaver
 deactivates, the original contents of the screen will fade in from black
-instead of appearing immediately.  This only works on displays with writable
-colormaps, and when \fIFade Colormap\fP is also selected.
+instead of appearing immediately.  This is only done if \fIFade Colormap\fP
+is also selected.
 .TP 4
 .B Fade Duration
 When fading or unfading are selected, this controls how long the fade will
@@ -278,7 +305,8 @@ http://www.jwz.org/xscreensaver/
 .SH SEE ALSO
 .BR X (1),
 .BR xscreensaver (1),
-.BR xscreensaver\-command (1)
+.BR xscreensaver\-command (1),
+.BR xscreensaver\-getimage (1)
 .SH COPYRIGHT
 Copyright \(co 1992, 1993, 1997, 1998, 1999, 2000, 2001
 by Jamie Zawinski.  Permission to use, copy, modify, distribute, and sell
diff --git a/driver/xscreensaver-getimage-file b/driver/xscreensaver-getimage-file
new file mode 100755 (executable)
index 0000000..0766d9e
--- /dev/null
@@ -0,0 +1,203 @@
+#!/usr/bin/perl -w
+# Copyright Â© 2001 Jamie Zawinski <jwz@jwz.org>, all rights reserved.
+#
+# Permission to use, copy, modify, distribute, and sell this software and its
+# documentation for any purpose is hereby granted without fee, provided that
+# the above copyright notice appear in all copies and that both that
+# copyright notice and this permission notice appear in supporting
+# documentation.  No representations are made about the suitability of this
+# software for any purpose.  It is provided "as is" without express or 
+# implied warranty.
+#
+# This program attempts to locate a random image from the specified directory,
+# and load it on to the root window, using some other program that can decode
+# image files.  (It attempts to find such a program.)
+#
+# The various xscreensaver hacks that manipulate images ("slidescreen",
+# "jigsaw", etc.) get the image to manipulate by running the
+# "xscreensaver-getimage" program.
+#
+# "xscreensaver-getimage" will invoke this program, depending on the
+# value of the "chooseRandomImages" and "imageDirectory" settings in
+# the ~/.xscreensaver file (or /usr/lib/X11/app-defaults/XScreenSaver).
+#
+# Created: 12-Apr-01.
+
+require 5;
+use diagnostics;
+use strict;
+
+use POSIX;
+use Fcntl;
+
+
+my $progname = $0; $progname =~ s@.*/@@g;
+my $version = q{ $Revision: 1.4 $ }; $version =~ s/^[^0-9]+([0-9.]+).*$/$1/;
+
+my $verbose = 0;
+
+# These are programs that can be used to put an image file on the root
+# window (including virtual root windows.)  The first one of these programs
+# that exists on $PATH will be used (with the file name as the last arg.)
+#
+# If you add other programs to this list, please let me know!
+#
+my @programs = (
+  "xv         -root -quit -viewonly -maxpect -noresetroot -quick24 -rmode 5" .
+  "           -rfg black -rbg black",
+  "xli        -quiet -fullscreen -onroot -center -border black",
+  "xloadimage -quiet -fullscreen -onroot -center -border black",
+  "chbg       -once -xscreensaver -max_grow 4",
+
+# this lame program wasn't built with vroot.h:
+# "xsri       -scale -keep-aspect -center-horizontal -center-vertical",
+);
+
+sub pick_displayer {
+  my @names = ();
+
+  foreach my $cmd (@programs) {
+    $_ = $cmd;
+    my ($name) = m/^([^ ]+)/;
+    push @names, "\"$name\"";
+    print STDERR "$progname: looking for $name...\n" if ($verbose > 2);
+    foreach my $dir (split (/:/, $ENV{PATH})) {
+      print STDERR "$progname:   checking $dir/$name\n" if ($verbose > 3);
+      return $cmd if (-x "$dir/$name");
+    }
+  }
+
+  $names[$#names] = "or " . $names[$#names];
+  printf STDERR "$progname: none of: " . join (", ", @names) .
+                " were found on \$PATH.\n";
+  exit 1;
+}
+
+
+my @all_files = ();
+my %seen_inodes;
+
+sub find_all_files {
+  my ($dir) = @_;
+
+  print STDERR "$progname: reading dir $dir/...\n" if ($verbose > 2);
+
+  local *DIR;
+  if (! opendir (DIR, $dir)) {
+    print STDERR "$progname: couldn't open $dir: $!\n";
+    return;
+  }
+  my @files = readdir (DIR);
+  closedir (DIR);
+
+  my @dirs = ();
+
+  foreach my $file (@files) {
+    next if ($file =~ m/^\./);      # ignore dot files
+    next if ($file =~ m/[~%\#]$/);  # ignore backup files
+    next if ($file =~ m/\.(BAK|bak|tmp|orig|rej|rpmsave)$/);
+    next if ($file eq "core");
+
+    $file = "$dir/$file";
+    my ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,
+        $atime,$mtime,$ctime,$blksize,$blocks) = stat($file);
+
+    next if ($seen_inodes{$ino}); # break symlink loops
+    $seen_inodes{$ino} = 1;
+
+    if (S_ISDIR($mode)) {
+      push @dirs, $file;
+      print STDERR "$progname:   found dir  $file\n" if ($verbose > 2);
+    } elsif (S_ISREG($mode) || S_ISLNK($mode)) {
+      push @all_files, $file;
+      print STDERR "$progname:   found file $file\n" if ($verbose > 2);
+    } elsif ($verbose > 2) {
+      print STDERR "$progname:   nonreg $file\n";
+    }
+  }
+
+  foreach (@dirs) {
+    find_all_files ($_);
+  }
+}
+
+
+sub find_random_file {
+  my ($dir) = @_;
+
+  $dir =~ s@/+$@@g;
+
+  print STDERR "$progname: recursively reading $dir...\n" if ($verbose > 1);
+  find_all_files ($dir);
+  print STDERR "$progname: found $#all_files files\n" if ($verbose > 1);
+
+  @all_files = sort(@all_files);
+
+  my $n = int (rand ($#all_files));
+  my $file = $all_files[$n];
+
+  print STDERR "$progname: chose file $n: $file\n" if ($verbose > 1);
+  return $file;
+}
+
+
+
+sub display_file {
+  my ($file, $displayer) = @_;
+
+  if (!defined($displayer)) {
+    print STDOUT "$file\n";
+  }  else {
+    my @cmd = split (/ +/, $displayer);
+    push @cmd, $file;   # do it this way to allow file names with spaces.
+    print STDERR "$progname: executing \"" . join(" ", @cmd) . "\"\n"
+      if ($verbose);
+    exec (@cmd) || die;
+  }
+}
+
+
+sub find_and_display {
+  my ($dir, $displayer) = @_;
+  my $file = find_random_file ($dir);
+  display_file ($file, $displayer);
+}
+
+
+sub usage {
+  print STDERR "usage: $progname [--verbose] [--name] directory\n";
+  print STDERR "Puts a randomly selected image on the root window.\n";
+  print STDERR "With --name, merely prints the filename to stdout.\n";
+  exit 1;
+}
+
+sub main {
+  my $dir = undef;
+  my $do_name = 0;
+
+  while ($_ = $ARGV[0]) {
+    shift @ARGV;
+    if ($_ eq "--verbose") { $verbose++; }
+    elsif (m/^-v+$/) { $verbose += length($_)-1; }
+    elsif ($_ eq "--name") { $do_name++; }
+    elsif (m/^-./) { usage; }
+    elsif (!defined($dir)) { $dir = $_; }
+    else { usage; }
+  }
+
+  usage unless (defined($dir));
+  my $displayer = undef;
+
+  $displayer = pick_displayer() unless $do_name;
+
+  if (-d $dir) {
+    find_and_display ($dir, $displayer);
+  } elsif (-f $dir) {
+    display_file ($dir, $displayer);
+  } else {
+    usage();
+  }
+}
+
+main;
+exit 0;
diff --git a/driver/xscreensaver-getimage-file.man b/driver/xscreensaver-getimage-file.man
new file mode 100644 (file)
index 0000000..beaf7b1
--- /dev/null
@@ -0,0 +1,49 @@
+.TH XScreenSaver 1 "15-Apr-2001 (3.32)" "X Version 11"
+.SH NAME
+xscreensaver-getimage-file - put a randomly-selected image on the root window
+.SH SYNOPSIS
+.B xscreensaver-getimage-file
+[\-display \fIhost:display.screen\fP] [\--verbose] [\--name] directory
+.SH DESCRIPTION
+The \fIxscreensaver\-getimage\-file\fP program is a helper program
+for the xscreensaver hacks that manipulate images.  Specifically, it
+is invoked by
+.BR xscreensaver\-getimage (1)
+as needed.  This is not a user-level command.
+
+This program selects a random image from disk, and loads it on the root
+window.  It does this by figuring out which image-loading programs are
+installed on the system, and invoking the first one it finds.
+.SH OPTIONS
+.I xscreensaver-getimage-file
+accepts the following options:
+.TP 4
+.B --verbose
+Print diagnostics.
+.TP 4
+.B --name
+Don't load an image: instead just print the file name to stdout.
+.TP 4
+.I directory
+The directory to search.   The directory will be searched recursively,
+and all files in it are assumed to be images.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1),
+.BR xscreensaver\-demo (1),
+.BR xscreensaver\-getimage (1),
+.BR xv (1),
+.BR xli (1),
+.BR xloadimage (1),
+.BR chbg (1)
+.SH COPYRIGHT
+Copyright \(co 2001 by Jamie Zawinski.  Permission to use, copy,
+modify, distribute, and sell this software and its documentation for
+any purpose is hereby granted without fee, provided that the above
+copyright notice appear in all copies and that both that copyright
+notice and this permission notice appear in supporting documentation.
+No representations are made about the suitability of this software for
+any purpose.  It is provided "as is" without express or implied
+warranty.
+.SH AUTHOR
+Jamie Zawinski <jwz@jwz.org>, 14-Apr-01
diff --git a/driver/xscreensaver-getimage-video b/driver/xscreensaver-getimage-video
new file mode 100755 (executable)
index 0000000..d79bc47
--- /dev/null
@@ -0,0 +1,161 @@
+#!/usr/bin/perl -w
+# Copyright Â© 2001 Jamie Zawinski <jwz@jwz.org>, all rights reserved.
+#
+# Permission to use, copy, modify, distribute, and sell this software and its
+# documentation for any purpose is hereby granted without fee, provided that
+# the above copyright notice appear in all copies and that both that
+# copyright notice and this permission notice appear in supporting
+# documentation.  No representations are made about the suitability of this
+# software for any purpose.  It is provided "as is" without express or 
+# implied warranty.
+#
+# This program attempts to grab a single frame of video from the system's
+# video capture card, and then load it on to the root window using the
+# "xscreensaver-getimage-file" program.  Various frame-grabbing programs
+# are known, and the first one found is used.
+#
+# The various xscreensaver hacks that manipulate images ("slidescreen",
+# "jigsaw", etc.) get the image to manipulate by running the
+# "xscreensaver-getimage" program.
+#
+# "xscreensaver-getimage" will invoke this program, depending on the
+# value of the "grabVideoFrames" setting in the ~/.xscreensaver file
+# (or in /usr/lib/X11/app-defaults/XScreenSaver).
+#
+# Created: 13-Apr-01.
+
+require 5;
+use diagnostics;
+use strict;
+
+my $progname = $0; $progname =~ s@.*/@@g;
+my $version = q{ $Revision: 1.4 $ }; $version =~ s/^[^0-9]+([0-9.]+).*$/$1/;
+
+my $verbose = 0;
+
+# These are programs that can be used to grab a video frame.  The first one
+# of these programs that exists on $PATH will be used, and the image file
+# is assumed to be written to stdout (in some image format acceptable to
+# "xscreensaver-getimage-file", e.g., PPM or JPEG.)
+#
+# If you add other programs to this list, please let me know!
+#
+
+my $tmpdir = $ENV{TMPDIR};
+$tmpdir = "/tmp" unless $tmpdir;
+
+my $tmpfile = "$tmpdir/xssgv.$$";
+
+# this crap is because "vidtomem" can only write to a file, and uses
+# a stupid, non-overridable file name format.
+my $sgi_bogosity = "$tmpfile-00000.rgb";
+
+my @programs = (
+
+  "bttvgrab -d q -Q -l 1 -o jpg -f $tmpfile",  # BTTV
+  "qcam > $tmpfile",                           # Connectix Qcam
+  "streamer -o $tmpfile",                      # XawTV
+  "atitv snap $tmpfile",                       # ATI video capture card
+
+  "vidtomem -f $tmpfile 2>- && mv $sgi_bogosity $tmpfile",  # Silicon Graphics
+);
+
+
+sub error {
+  ($_) = @_;
+  print STDERR "$progname: $_\n";
+  exit 1;
+}
+
+my $displayer = undef;
+
+sub pick_grabber {
+  my @names = ();
+
+  foreach my $cmd (@programs) {
+    $_ = $cmd;
+    my ($name) = m/^([^ ]+)/;
+    push @names, "\"$name\"";
+    print STDERR "$progname: looking for $name...\n" if ($verbose > 2);
+    foreach my $dir (split (/:/, $ENV{PATH})) {
+      print STDERR "$progname:   checking $dir/$name\n" if ($verbose > 3);
+      if (-x "$dir/$name") {
+        $displayer = $name;
+        return $cmd;
+      }
+    }
+  }
+
+  $names[$#names] = "or " . $names[$#names];
+  error "none of: " . join (", ", @names) . " were found on \$PATH.";
+}
+
+
+my $use_stdout = 0;
+
+sub grab_image {
+  my $cmd = pick_grabber();
+  unlink $tmpfile;
+
+  print STDERR "$progname: executing \"$cmd\"\n" if ($verbose);
+  system ($cmd);
+
+  if (-z $tmpfile)
+    {
+      unlink $tmpfile;
+      error "\"$cmd\" produced no data.";
+    }
+
+  if ($use_stdout) {
+    local *IN;
+    my $ppm = "";
+    my $reader  = "<$tmpfile";
+
+    # horrid kludge for SGIs, since they don't use PPM...
+    if ($displayer eq "vidtomem") {
+      $reader = "sgitopnm $tmpfile";
+      $reader .= " 2>/dev/null" if ($verbose <= 1);
+      $reader .= " |";
+    }
+
+    open(IN, $reader) || error "reading $tmpfile: $!";
+    print STDERR "$progname: reading $tmpfile\n" if ($verbose > 1);
+    while (<IN>) { $ppm .= $_; }
+    close IN;
+    unlink $tmpfile;
+    print STDOUT $ppm;
+
+  } else {
+
+    $cmd = "xscreensaver-getimage-file";
+    $cmd .= " --verbose" if ($verbose);
+    $cmd .= " $tmpfile";
+
+    print STDERR "$progname: executing \"$cmd\"\n" if ($verbose);
+    system ($cmd);
+
+    unlink $tmpfile;
+  }
+}
+
+
+sub usage {
+  print STDERR "usage: $progname [--verbose] [--stdout]\n";
+  exit 1;
+}
+
+sub main {
+  while ($_ = $ARGV[0]) {
+    shift @ARGV;
+    if ($_ eq "--verbose") { $verbose++; }
+    elsif (m/^-v+$/) { $verbose += length($_)-1; }
+    elsif (m/^--?stdout$/) { $use_stdout = 1; }
+    elsif (m/^-./) { usage; }
+    else { usage; }
+  }
+
+  grab_image();
+}
+
+main;
+exit 0;
diff --git a/driver/xscreensaver-getimage-video.man b/driver/xscreensaver-getimage-video.man
new file mode 100644 (file)
index 0000000..8539b4d
--- /dev/null
@@ -0,0 +1,51 @@
+.TH XScreenSaver 1 "15-Apr-2001 (3.32)" "X Version 11"
+.SH NAME
+xscreensaver-getimage-video - put a video frame on the root window
+.SH SYNOPSIS
+.B xscreensaver-getimage-video
+[\-display \fIhost:display.screen\fP] [\--verbose] [\--stdout]
+.SH DESCRIPTION
+The \fIxscreensaver\-getimage\-video\fP program is a helper program
+for the xscreensaver hacks that manipulate images.  Specifically, it
+is invoked by
+.BR xscreensaver\-getimage (1)
+as needed.  This is not a user-level command.
+
+This program grabs a random frame of video from the system's video input,
+and then loads it on the root window.  It does this by figuring out which
+frame-grabbing programs are installed on the system, and invoking the
+first one it finds.   Then it runs
+.BR xscreensaver\-getimage\-file (1)
+to load that image onto the root window.
+.SH OPTIONS
+.I xscreensaver-getimage-video
+accepts the following options:
+.TP 4
+.B --verbose
+Print diagnostics.
+.TP 4
+.B --stdout
+Instead of loading the image onto the root window, write it to stdout
+as a PBM file.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1),
+.BR xscreensaver\-demo (1),
+.BR xscreensaver\-getimage (1),
+.BR xscreensaver\-getimage\-file (1),
+.BR bttvgrab (1),
+.BR qcam (1),
+.BR streamer (1),
+.BR atitv (1),
+.BR vidtomem (1)
+.SH COPYRIGHT
+Copyright \(co 2001 by Jamie Zawinski.  Permission to use, copy,
+modify, distribute, and sell this software and its documentation for
+any purpose is hereby granted without fee, provided that the above
+copyright notice appear in all copies and that both that copyright
+notice and this permission notice appear in supporting documentation.
+No representations are made about the suitability of this software for
+any purpose.  It is provided "as is" without express or implied
+warranty.
+.SH AUTHOR
+Jamie Zawinski <jwz@jwz.org>, 14-Apr-01
diff --git a/driver/xscreensaver-getimage.c b/driver/xscreensaver-getimage.c
new file mode 100644 (file)
index 0000000..c8e8228
--- /dev/null
@@ -0,0 +1,377 @@
+/* xscreensaver, Copyright (c) 2001 by Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation.  No representations are made about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or 
+ * implied warranty.
+ */
+
+/* xscreensaver-getimage -- helper program that puts an image
+   (e.g., a snapshot of the desktop) onto the given window.
+ */
+
+#include "utils.h"
+
+#include <X11/Intrinsic.h>
+#include <errno.h>
+
+#include "yarandom.h"
+#include "grabscreen.h"
+#include "resources.h"
+#include "colorbars.h"
+#include "prefs.h"
+#include "vroot.h"
+
+
+static char *defaults[] = {
+#include "../driver/XScreenSaver_ad.h"
+ 0
+};
+
+
+
+char *progname = 0;
+char *progclass = "XScreenSaver";
+XrmDatabase db;
+XtAppContext app;
+
+extern void grabscreen_verbose (void);
+
+
+#define GETIMAGE_VIDEO_PROGRAM "xscreensaver-getimage-video"
+#define GETIMAGE_FILE_PROGRAM  "xscreensaver-getimage-file"
+
+
+const char *
+blurb (void)
+{
+  return progname;
+}
+
+
+static void
+exec_error (char **av)
+{
+  char buf [512];
+  char *token;
+
+  sprintf (buf, "%s: could not execute \"%s\"", progname, av[0]);
+  perror (buf);
+
+  if (errno == ENOENT &&
+      (token = getenv("PATH")))
+    {
+# ifndef PATH_MAX
+#  ifdef MAXPATHLEN
+#   define PATH_MAX MAXPATHLEN
+#  else
+#   define PATH_MAX 2048
+#  endif
+# endif
+      char path[PATH_MAX];
+      fprintf (stderr, "\n");
+      *path = 0;
+# if defined(HAVE_GETCWD)
+      getcwd (path, sizeof(path));
+# elif defined(HAVE_GETWD)
+      getwd (path);
+# endif
+      if (*path)
+        fprintf (stderr, "    Current directory is: %s\n", path);
+      fprintf (stderr, "    PATH is:\n");
+      token = strtok (strdup(token), ":");
+      while (token)
+        {
+          fprintf (stderr, "        %s\n", token);
+          token = strtok(0, ":");
+        }
+      fprintf (stderr, "\n");
+    }
+
+  exit (1);
+}
+
+
+static void
+get_image (Screen *screen, Window window, Bool verbose_p)
+{
+  Display *dpy = DisplayOfScreen (screen);
+  Bool desk_p  = get_boolean_resource ("grabDesktopImages",  "Boolean");
+  Bool video_p = get_boolean_resource ("grabVideoFrames",    "Boolean");
+  Bool image_p = get_boolean_resource ("chooseRandomImages", "Boolean");
+  char *dir    = get_string_resource ("imageDirectory", "ImageDirectory");
+
+  enum { do_desk, do_video, do_image, do_bars } which = do_bars;
+  int count = 0;
+  if (desk_p) count++;
+  if (video_p) count++;
+  if (image_p) count++;
+
+  if (verbose_p)
+    {
+      fprintf (stderr, "%s: grabDesktopImages:  %s\n",
+               progname, desk_p ? "True" : "False");
+      fprintf (stderr, "%s: grabVideoFrames:    %s\n",
+               progname, video_p ? "True" : "False");
+      fprintf (stderr, "%s: chooseRandomImages: %s\n",
+               progname, image_p ? "True" : "False");
+      fprintf (stderr, "%s: imageDirectory:     %s\n",
+               progname, (dir ? dir : ""));
+    }
+
+  if (!dir || !*dir)
+    {
+      if (verbose_p && image_p)
+        fprintf (stderr,
+                 "%s: no imageDirectory: turning off chooseRandomImages.\n",
+                 progname);
+      image_p = False;
+    }
+
+# ifndef _VROOT_H_
+#  error Error!  This file definitely needs vroot.h!
+# endif
+
+  /* If the window is not the root window (real or virtual!) then the hack
+     that called this program is running in "-window" mode instead of in
+     "-root" mode.
+
+     If the window is not the root window, then it's not possible to grab
+     video or images onto it (the contract with those programs is to draw on
+     the root.)  So turn off those options in that case, and turn on desktop
+     grabbing.  (Since we're running in a window on the desktop already, we
+     know it's not a security problem to expose desktop bits.)
+   */
+
+  if (window != VirtualRootWindowOfScreen (screen))
+    {
+      Bool changed_p = False;
+      if (!desk_p) desk_p  = True,  changed_p = True;
+      if (video_p) video_p = False, changed_p = True;
+      if (image_p) image_p = False, changed_p = True;
+      if (changed_p && verbose_p)
+        fprintf (stderr,
+                 "%s: not running on root window: grabbing desktop.\n",
+                 progname);
+    }
+
+  if (count == 0)
+    which = do_bars;
+  else
+    while (1)  /* loop until we get one that's permitted */
+      {
+        which = (random() % 3);
+        if (which == do_desk  && desk_p)  break;
+        if (which == do_video && video_p) break;
+        if (which == do_image && image_p) break;
+      }
+
+  if (which == do_desk)
+    {
+      if (verbose_p)
+        {
+          fprintf (stderr, "%s: grabbing desktop image\n", progname);
+          grabscreen_verbose();
+        }
+      grab_screen_image (screen, window);
+      XSync (dpy, False);
+    }
+  else if (which == do_bars)
+    {
+      XWindowAttributes xgwa;
+      XGetWindowAttributes (dpy, window, &xgwa);
+      if (verbose_p)
+        fprintf (stderr, "%s: drawing colorbars\n", progname);
+      draw_colorbars (dpy, window, 0, 0, xgwa.width, xgwa.height);
+      XSync (dpy, False);
+    }
+  else
+    {
+      char *av[10];
+      memset (av, 0, sizeof(av));
+      switch (which)
+        {
+        case do_video:
+          if (verbose_p)
+            fprintf (stderr, "%s: grabbing video\n", progname);
+          av[0] = GETIMAGE_VIDEO_PROGRAM;
+          break;
+        case do_image:
+          if (verbose_p)
+            fprintf (stderr, "%s: loading random image file\n", progname);
+          av[0] = GETIMAGE_FILE_PROGRAM;
+          av[1] = dir;
+          break;
+        default:
+          abort();
+          break;
+        }
+
+      if (verbose_p)
+        {
+          int i;
+          for (i = (sizeof(av)/sizeof(*av))-1; i > 1; i--)
+            av[i] = av[i-1];
+          av[1] = strdup ("--verbose");
+        }
+
+      if (verbose_p)
+        {
+          int i = 0;
+          fprintf (stderr, "%s: executing \"", progname);
+          while (av[i])
+            {
+              fprintf (stderr, "%s", av[i]);
+              if (av[++i]) fprintf (stderr, " ");
+            }
+          fprintf (stderr, "\"\n");
+        }
+
+# ifdef HAVE_PUTENV
+      /* Store our "-display" argument into the $DISPLAY variable,
+         so that the subprocess gets the right display if the
+         prevailing $DISPLAY is different. */
+      {
+        const char *odpy = DisplayString (dpy);
+        char *ndpy = (char *) malloc(strlen(odpy) + 20);
+        strcpy (ndpy, "DISPLAY=");
+        strcat (ndpy, odpy);
+        if (putenv (ndpy))
+          abort ();
+      }
+# endif /* HAVE_PUTENV */
+
+      close (ConnectionNumber (dpy));  /* close display fd */
+
+      execvp (av[0], av);              /* shouldn't return */
+      exec_error (av);
+    }
+}
+
+
+#if 0
+static Bool
+mapper (XrmDatabase *db, XrmBindingList bindings, XrmQuarkList quarks,
+       XrmRepresentation *type, XrmValue *value, XPointer closure)
+{
+  int i;
+  for (i = 0; quarks[i]; i++)
+    {
+      if (bindings[i] == XrmBindTightly)
+       fprintf (stderr, (i == 0 ? "" : "."));
+      else if (bindings[i] == XrmBindLoosely)
+       fprintf (stderr, "*");
+      else
+       fprintf (stderr, " ??? ");
+      fprintf(stderr, "%s", XrmQuarkToString (quarks[i]));
+    }
+
+  fprintf (stderr, ": %s\n", (char *) value->addr);
+
+  return False;
+}
+#endif
+
+
+int
+main (int argc, char **argv)
+{
+  saver_preferences P;
+  Widget toplevel;
+  Display *dpy;
+  Screen *screen;
+  Window window = (Window) 0;
+  Bool verbose_p = False;
+  char *s;
+  int i;
+
+  progname = argv[0];
+  s = strrchr (progname, '/');
+  if (s) progname = s+1;
+
+  /* We must read exactly the same resources as xscreensaver.
+     That means we must have both the same progclass *and* progname,
+     at least as far as the resource database is concerned.  So,
+     put "xscreensaver" in argv[0] while initializing Xt.
+   */
+  argv[0] = "xscreensaver";
+  toplevel = XtAppInitialize (&app, progclass, 0, 0, &argc, argv,
+                             defaults, 0, 0);
+  argv[0] = progname;
+  dpy = XtDisplay (toplevel);
+  screen = XtScreen (toplevel);
+  db = XtDatabase (dpy);
+
+  XtGetApplicationNameAndClass (dpy, &s, &progclass);
+
+  /* half-assed way of avoiding buffer-overrun attacks. */
+  if (strlen (progname) >= 100) progname[100] = 0;
+
+  for (i = 1; i < argc; i++)
+    {
+      if (argv[i][0] == '-' && argv[i][1] == '-') argv[i]++;
+      if (!strcmp (argv[i], "-v") ||
+          !strcmp (argv[i], "-verbose"))
+        verbose_p = True;
+      else if (window == 0)
+        {
+          unsigned long w;
+          char dummy;
+
+          if (!strcmp (argv[i], "root") ||
+              !strcmp (argv[i], "-root") ||
+              !strcmp (argv[i], "--root"))
+            window = RootWindowOfScreen (screen);
+
+          else if ((1 == sscanf (argv[i], " 0x%x %c", &w, &dummy) ||
+                    1 == sscanf (argv[i], " %d %c",   &w, &dummy)) &&
+                   w != 0)
+            window = (Window) w;
+          else
+            goto LOSE;
+        }
+      else
+        {
+         LOSE:
+          fprintf (stderr,
+            "usage: %s [ -display host:dpy.screen ] [ -v ] window-id\n",
+                   progname);
+          fprintf (stderr, "\n"
+       "\tThis program puts an image of the desktop on the given window.\n"
+       "\tIt is used by those xscreensaver demos that operate on images.\n"
+       "\n");
+          exit (1);
+        }
+    }
+
+  if (window == 0) goto LOSE;
+
+  /* Randomize -- only need to do this here because this program
+     doesn't use the `screenhack.h' or `lockmore.h' APIs. */
+# undef ya_rand_init
+  ya_rand_init (0);
+
+  memset (&P, 0, sizeof(P));
+  P.db = db;
+  load_init_file (&P);
+
+  if (P.verbose_p)
+    verbose_p = True;
+
+#if 0
+  /* Print out all the resources we read. */
+  {
+    XrmName name = { 0 };
+    XrmClass class = { 0 };
+    int count = 0;
+    XrmEnumerateDatabase (db, &name, &class, XrmEnumAllLevels, mapper,
+                         (XtPointer) &count);
+  }
+#endif
+
+  get_image (screen, window, verbose_p);
+  exit (0);
+}
diff --git a/driver/xscreensaver-getimage.man b/driver/xscreensaver-getimage.man
new file mode 100644 (file)
index 0000000..04232ee
--- /dev/null
@@ -0,0 +1,68 @@
+.TH XScreenSaver 1 "15-Apr-2001 (3.32)" "X Version 11"
+.SH NAME
+xscreensaver-getimage - put some randomly-selected image on the root window
+.SH SYNOPSIS
+.B xscreensaver-getimage
+[\-display \fIhost:display.screen\fP] [\--verbose] window-id
+.SH DESCRIPTION
+The \fIxscreensaver\-getimage\fP program is a helper program for the
+xscreensaver hacks that manipulate images.  This is not a user-level
+command.
+
+This program selects a random image, and puts it on the specified
+window.  This image might be a snapshot of the desktop; or a frame
+captured from the system's video input; or a randomly-selected image
+from disk.
+.SH OPTIONS
+.I xscreensaver-getimage
+reads the \fI~/.xscreensaver\fP file for configuration information.
+It uses these settings:
+.TP 4
+.B grabDesktopImages
+Whether it is acceptable to grab snapshots of the desktop.
+The security paranoid might want to turn this off, to avoid letting
+people see (but not touch!) your desktop while the screen is locked.
+.TP 4
+.B grabVideoFrames
+Whether it is acceptable to grab frames of video from the system's video
+input.  Grabbing of video is done by invoking the
+.BR xscreensaver-getimage-video (1)
+program.
+.TP 4
+.B chooseRandomImages
+Whether it is acceptable to display random images found on disk.
+Selection and loading of images is done by invoking the
+.BR xscreensaver-getimage-file (1)
+program.
+.TP 4
+.B imageDirectory
+When loading images from disk, this is the directory to search.
+The directory will be searched recursively, and all files in it are 
+assumed to be images.
+.PP
+If none of the three options are set to True, then video
+colorbars will be displayed instead.
+.SH BUGS
+If the target window is not the root window, then this program 
+will \fIalways\fP grab a desktop image.  This means that if an 
+image-manipulating xscreensaver mode is run in a normal window,
+it will always operate on a desktop image; it's only when it is
+run in \fI-root\fP mode (or when invoked by xscreensaver) that
+it will load image files or grab video.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.BR xscreensaver\-demo (1)
+.BR xscreensaver\-getimage\-file (1)
+.BR xscreensaver\-getimage\-video (1)
+.SH COPYRIGHT
+Copyright \(co 2001 by Jamie Zawinski.  Permission to use, copy,
+modify, distribute, and sell this software and its documentation for
+any purpose is hereby granted without fee, provided that the above
+copyright notice appear in all copies and that both that copyright
+notice and this permission notice appear in supporting documentation.
+No representations are made about the suitability of this software for
+any purpose.  It is provided "as is" without express or implied
+warranty.
+.SH AUTHOR
+Jamie Zawinski <jwz@jwz.org>, 14-Apr-01
index 641ccddace6851da837c3e13e478a7aaaaf9a165..08838dfa90d2b3c7b97677d1da02945635c3d413 100644 (file)
@@ -740,6 +740,10 @@ initialize_per_screen_info (saver_info *si, Widget toplevel_shell)
     }
 
   si->fading_possible_p = found_any_writable_cells;
+
+#ifdef HAVE_XF86VMODE_GAMMA
+  si->fading_possible_p = True;  /* if we can gamma fade, go for it */
+#endif
 }
 
 
index 3b8b059d423ec7cbf4a54ad58f5a654eab0df199..9d33a72ec955d6a459ee4fb61faa3abe2cac482c 100644 (file)
@@ -11,7 +11,7 @@
 .if n .sp 1
 .if t .sp .5
 ..
-.TH XScreenSaver 1 "29-Mar-2001 (3.31)" "X Version 11"
+.TH XScreenSaver 1 "15-Apr-2001 (3.32)" "X Version 11"
 .SH NAME
 xscreensaver - graphics hack and screen locker, launched when the user is idle
 .SH SYNOPSIS
index 7dd7ad3f379364dd5754b19a490bbd040b0a9927..e0586ed011604726701a634d002bc8e37e6144d4 100644 (file)
@@ -41,35 +41,34 @@ X_CFLAGS    = @X_CFLAGS@
 X_LIBS         = @X_LIBS@
 X_PRE_LIBS     = @X_PRE_LIBS@
 X_EXTRA_LIBS   = @X_EXTRA_LIBS@
+XMU_LIBS       = @XMU_LIBS@
 
 # Note: see comment in ../driver/Makefile.in for explanation of X_LIBS, etc.
 #
 HACK_PRE       = $(LIBS) $(X_LIBS)
-HACK_POST      = $(X_PRE_LIBS) -lXt -lX11 -lXext $(X_EXTRA_LIBS) -lm
+HACK_POST     = $(X_PRE_LIBS) -lXt -lX11 $(XMU_LIBS) -lXext $(X_EXTRA_LIBS) -lm
 HACK_LIBS      = $(HACK_PRE)            @HACK_LIBS@ $(HACK_POST)
 XPM_LIBS       = $(HACK_PRE) @XPM_LIBS@ @HACK_LIBS@ $(HACK_POST)
 XLOCK_LIBS     = $(HACK_LIBS)
-SGI_VIDEO_OBJS  = @SGI_VIDEO_OBJS@
-SGI_VIDEO_LIBS  = @SGI_VIDEO_LIBS@
 
 UTILS_SRC      = $(srcdir)/../utils
 UTILS_BIN      = ../utils
 
-INCLUDES       = -I$(srcdir) -I$(UTILS_SRC) -I.. @INCLUDES@
+INCLUDES       = -I. -I$(srcdir) -I$(UTILS_SRC) -I.. @INCLUDES@
 
 UTIL_SRCS      = $(UTILS_SRC)/alpha.c $(UTILS_SRC)/colors.c \
-                 $(UTILS_SRC)/grabscreen.c $(UTILS_SRC)/hsv.c \
-                 $(UTILS_SRC)/resources.c $(UTILS_SRC)/spline.c \
-                 $(UTILS_SRC)/usleep.c $(UTILS_SRC)/visual.c \
-                 $(UTILS_SRC)/logo.c $(UTILS_SRC)/yarandom.c \
-                 $(UTILS_SRC)/erase.c $(UTILS_SRC)/sgivideo.c \
+                 $(UTILS_SRC)/grabscreen.c $(UTILS_SRC)/grabclient.c \
+                 $(UTILS_SRC)/hsv.c $(UTILS_SRC)/resources.c \
+                 $(UTILS_SRC)/spline.c $(UTILS_SRC)/usleep.c \
+                 $(UTILS_SRC)/visual.c $(UTILS_SRC)/logo.c \
+                 $(UTILS_SRC)/yarandom.c $(UTILS_SRC)/erase.c \
                  $(UTILS_SRC)/xshm.c $(UTILS_SRC)/xdbe.c
 UTIL_OBJS      = $(UTILS_BIN)/alpha.o $(UTILS_BIN)/colors.o \
-                 $(UTILS_BIN)/grabscreen.o $(UTILS_BIN)/hsv.o \
-                 $(UTILS_BIN)/resources.o $(UTILS_BIN)/spline.o \
-                 $(UTILS_BIN)/usleep.o $(UTILS_BIN)/visual.o \
-                 $(UTILS_BIN)/logo.o $(UTILS_BIN)/yarandom.o \
-                 $(UTILS_BIN)/erase.o $(UTILS_BIN)/sgivideo.o \
+                 $(UTILS_BIN)/grabscreen.o $(UTILS_BIN)/grabclient.o \
+                 $(UTILS_BIN)/hsv.o $(UTILS_BIN)/resources.o \
+                 $(UTILS_BIN)/spline.o $(UTILS_BIN)/usleep.o \
+                 $(UTILS_BIN)/visual.o $(UTILS_BIN)/logo.o \
+                 $(UTILS_BIN)/yarandom.o $(UTILS_BIN)/erase.o \
                  $(UTILS_SRC)/xshm.o $(UTILS_SRC)/xdbe.o
 
 SRCS           = attraction.c blitspin.c bouboule.c braid.c bubbles.c \
@@ -134,11 +133,9 @@ HACK_OBJS_1        = $(UTILS_BIN)/resources.o $(UTILS_BIN)/visual.o \
 HACK_OBJS      = screenhack.o $(HACK_OBJS_1)
 XLOCK_OBJS     = screenhack-xlock.o xlockmore.o $(COLOR_OBJS) $(HACK_OBJS_1)
 COLOR_OBJS     = $(UTILS_BIN)/hsv.o $(UTILS_BIN)/colors.o
-GRAB_OBJS_1    = $(UTILS_BIN)/grabscreen.o $(SGI_VIDEO_OBJS)
-GRAB_OBJS      = $(GRAB_OBJS_1) $(COLOR_OBJS)
+GRAB_OBJS      = $(UTILS_BIN)/grabclient.o
 XSHM_OBJS      = $(UTILS_BIN)/xshm.o
 XDBE_OBJS      = $(UTILS_BIN)/xdbe.o
-GRAB_LIBS      = $(SGI_VIDEO_LIBS)
 
 HDRS           = bubbles.h screenhack.h xlockmore.h xlockmoreI.h automata.h \
                  bumps.h
@@ -151,7 +148,7 @@ MEN         = attraction.man blitspin.man bouboule.man braid.man \
                  noseguy.man pedal.man penrose.man pyro.man qix.man \
                  rocks.man rorschach.man sierpinski.man slidescreen.man \
                  slip.man sphere.man spiral.man strange.man swirl.man \
-                 goop.man starfish.man munch.man rd-bomb.man \
+                 goop.man starfish.man munch.man rd-bomb.man bumps.man \
                  xjack.man xlyap.man jigsaw.man epicycle.man bsod.man \
                  sonar.man t3d.man squiral.man spotlight.man critical.man \
                  vidwhacker.man webcollage.man xsublim.man distort.man \
@@ -183,10 +180,10 @@ uninstall: uninstall-program uninstall-man
 
 install-strip:
        $(MAKE) INSTALL_PROGRAM='$(INSTALL_PROGRAM) -s' \
-               INSTALL_SETUID='$(INSTALL_SETUID) -s' \
                install
 
-install-program: $(EXES)
+# the hacks, in $HACKDIR
+install-program:: $(EXES)
        @if [ ! -d $(install_prefix)$(HACKDIR) ]; then                  \
          $(INSTALL_DIRS) $(install_prefix)$(HACKDIR) ;                 \
         fi ;                                                           \
@@ -360,8 +357,7 @@ distdepend:: $(srcdir)/../setup.com
 #
 $(UTILS_BIN)/alpha.o:          $(UTILS_SRC)/alpha.c
 $(UTILS_BIN)/colors.o:         $(UTILS_SRC)/colors.c
-$(UTILS_BIN)/grabscreen.o:     $(UTILS_SRC)/grabscreen.c
-$(UTILS_BIN)/sgivideo.o:       $(UTILS_SRC)/sgivideo.c
+$(UTILS_BIN)/grabclient.o:     $(UTILS_SRC)/grabclient.c
 $(UTILS_BIN)/hsv.o:            $(UTILS_SRC)/hsv.c
 $(UTILS_BIN)/resources.o:      $(UTILS_SRC)/resources.c
 $(UTILS_BIN)/spline.o:         $(UTILS_SRC)/spline.c
@@ -393,18 +389,19 @@ screenhack-xlock.o: screenhack.c
 ALP            = $(UTILS_BIN)/alpha.o
 HSV            = $(UTILS_BIN)/hsv.o
 SPL            = $(UTILS_BIN)/spline.o
-LOGO           = $(UTILS_BIN)/logo.o $(SPL)
+LOGO           = $(UTILS_BIN)/logo.o
 GRAB           = $(GRAB_OBJS)
 ERASE          = $(UTILS_BIN)/erase.o
 COL            = $(COLOR_OBJS)
 SHM            = $(XSHM_OBJS)
 DBE            = $(XDBE_OBJS)
+BARS           = $(UTILS_BIN)/colorbars.o $(LOGO)
 
 CC_HACK                = $(CC) $(LDFLAGS)
 
 xscreensaver-sgigl: xscreensaver-sgigl.c
        $(CC) $(LDFLAGS) -o $@ $< -I$(UTILS_SRC) $(HACK_PRE) \
-               -lXmu -lX11 -lXext $(X_EXTRA_LIBS) -lm
+               $(XMU_LIBS) -lX11 -lXext $(X_EXTRA_LIBS) -lm
 
 
 # The rules for those hacks which follow the `screenhack.c' API.
@@ -417,13 +414,13 @@ attraction:       attraction.o    $(HACK_OBJS) $(COL) $(SPL)
        $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(COL) $(SPL) $(HACK_LIBS)
 
 blitspin:      blitspin.o      $(HACK_OBJS) $(GRAB)
-       $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(GRAB) $(XPM_LIBS) $(GRAB_LIBS)
+       $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(GRAB) $(XPM_LIBS)
 
 bubbles:       bubbles.o       $(HACK_OBJS) bubbles-default.o 
        $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) bubbles-default.o $(XPM_LIBS)
 
 decayscreen:   decayscreen.o   $(HACK_OBJS) $(GRAB)
-       $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(GRAB) $(HACK_LIBS) $(GRAB_LIBS)
+       $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(GRAB) $(HACK_LIBS)
 
 deco:          deco.o          $(HACK_OBJS) $(COL)
        $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(COL) $(HACK_LIBS)
@@ -480,7 +477,7 @@ rorschach:  rorschach.o     $(HACK_OBJS) $(HSV) $(ERASE)
        $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(HSV) $(ERASE) $(HACK_LIBS)
 
 slidescreen:   slidescreen.o   $(HACK_OBJS) $(GRAB)
-       $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(GRAB) $(HACK_LIBS) $(GRAB_LIBS)
+       $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(GRAB) $(HACK_LIBS)
 
 goop:          goop.o          $(HACK_OBJS) $(HSV) $(ALP) $(SPL)
        $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(HSV) $(ALP) $(SPL) $(HACK_LIBS)
@@ -504,7 +501,7 @@ xlyap:              xlyap.o         $(HACK_OBJS) $(COL)
        $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(COL) $(HACK_LIBS)
 
 jigsaw:                jigsaw.o        $(HACK_OBJS) $(GRAB)
-       $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(GRAB) $(HACK_LIBS) $(GRAB_LIBS)
+       $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(GRAB) $(HACK_LIBS)
 
 cynosure:      cynosure.o      $(HACK_OBJS) $(COL)
        $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(COL) $(HACK_LIBS)
@@ -519,10 +516,10 @@ truchet:   truchet.o      $(HACK_OBJS) $(COL)
        $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(COL) $(HACK_LIBS)
 
 bsod:          bsod.o          $(HACK_OBJS) $(GRAB)
-       $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(GRAB) $(HACK_LIBS) $(XPM_LIBS) $(GRAB_LIBS)
+       $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(GRAB) $(HACK_LIBS) $(XPM_LIBS)
 
 distort:       distort.o       $(HACK_OBJS) $(GRAB) $(SHM)
-       $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(GRAB) $(SHM) $(HACK_LIBS) $(GRAB_LIBS)
+       $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(GRAB) $(SHM) $(HACK_LIBS)
 
 kumppa:                kumppa.o        $(HACK_OBJS) $(DBE)
        $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(DBE) $(HACK_LIBS)
@@ -552,7 +549,7 @@ wander:             wander.o        $(HACK_OBJS) $(COL) $(ERASE)
        $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(COL) $(ERASE) $(HACK_LIBS)
 
 spotlight:     spotlight.o     $(HACK_OBJS) $(GRAB)
-       $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(GRAB) $(HACK_LIBS) $(GRAB_LIBS)
+       $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(GRAB) $(HACK_LIBS)
 
 critical:      critical.o      $(HACK_OBJS) $(COL) $(ERASE)
        $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(COL) $(ERASE) $(HACK_LIBS)
@@ -576,13 +573,13 @@ blaster:  blaster.o       $(HACK_OBJS)
        $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(HACK_LIBS)
 
 bumps:         bumps.o         $(HACK_OBJS) $(GRAB)
-       $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(GRAB) $(HACK_LIBS) $(GRAB_LIBS)
+       $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(GRAB) $(HACK_LIBS)
 
-ripples:       ripples.o       $(HACK_OBJS) $(SHM) $(GRAB)
-       $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(SHM) $(GRAB) $(HACK_LIBS) $(GRAB_LIBS)
+ripples:       ripples.o       $(HACK_OBJS) $(SHM) $(COL) $(GRAB)
+       $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(SHM) $(COL) $(GRAB) $(HACK_LIBS)
 
-xteevee:       xteevee.o       $(HACK_OBJS) $(GRAB)
-       $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(GRAB) $(HACK_LIBS) $(GRAB_LIBS)
+xteevee:       xteevee.o       $(BARS) $(HACK_OBJS) $(GRAB)
+       $(CC_HACK) -o $@ $@.o   $(BARS) $(HACK_OBJS) $(GRAB) $(HACK_LIBS)
 
 xspirograph:   xspirograph.o   $(HACK_OBJS) $(COL) $(ERASE)
        $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(COL) $(ERASE) $(HACK_LIBS)
@@ -597,13 +594,13 @@ hyperball:        hyperball.o     $(HACK_OBJS)
        $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(HACK_LIBS)
 
 zoom:  zoom.o  $(HACK_OBJS) $(GRAB)
-       $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(GRAB) $(HACK_LIBS) $(GRAB_LIBS)
+       $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(GRAB) $(HACK_LIBS)
 
 whirlwindwarp: whirlwindwarp.o $(HACK_OBJS) $(COL)
        $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(COL) $(HACK_LIBS)
 
 rotzoomer:     rotzoomer.o     $(HACK_OBJS) $(GRAB) $(SHM)
-       $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(GRAB) $(SHM) $(HACK_LIBS) $(GRAB_LIBS)
+       $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(GRAB) $(SHM) $(HACK_LIBS)
 
 
 # The rules for those hacks which follow the `xlockmore' API.
@@ -661,7 +658,7 @@ sierpinski: sierpinski.o    $(XLOCK_OBJS)
        $(CC_HACK) -o $@ $@.o   $(XLOCK_OBJS) $(HACK_LIBS)
 
 slip:          slip.o          $(XLOCK_OBJS) $(GRAB)
-       $(CC_HACK) -o $@ $@.o   $(XLOCK_OBJS) $(GRAB_OBJS_1) $(HACK_LIBS) $(GRAB_LIBS)
+       $(CC_HACK) -o $@ $@.o   $(XLOCK_OBJS) $(GRAB) $(HACK_LIBS)
 
 sphere:                sphere.o        $(XLOCK_OBJS)
        $(CC_HACK) -o $@ $@.o   $(XLOCK_OBJS) $(HACK_LIBS)
@@ -723,62 +720,22 @@ xsublim:  xsublim.o       $(HACK_OBJS_1)
 
 attraction.o: $(srcdir)/screenhack.h
 attraction.o: ../config.h
-attraction.o: $(UTILS_SRC)/yarandom.h
-attraction.o: $(UTILS_SRC)/usleep.h
-attraction.o: $(UTILS_SRC)/resources.h
-attraction.o: $(UTILS_SRC)/hsv.h
-attraction.o: $(UTILS_SRC)/colors.h
-attraction.o: $(UTILS_SRC)/grabscreen.h
-attraction.o: $(UTILS_SRC)/visual.h
-attraction.o: $(UTILS_SRC)/spline.h
 blitspin.o: $(srcdir)/screenhack.h
 blitspin.o: ../config.h
-blitspin.o: $(UTILS_SRC)/yarandom.h
-blitspin.o: $(UTILS_SRC)/usleep.h
-blitspin.o: $(UTILS_SRC)/resources.h
-blitspin.o: $(UTILS_SRC)/hsv.h
-blitspin.o: $(UTILS_SRC)/colors.h
-blitspin.o: $(UTILS_SRC)/grabscreen.h
-blitspin.o: $(UTILS_SRC)/visual.h
 blitspin.o: $(srcdir)/images/som.xbm
 bouboule.o: $(srcdir)/xlockmore.h
 bouboule.o: ../config.h
 bouboule.o: $(srcdir)/xlockmoreI.h
 bouboule.o: $(srcdir)/screenhack.h
-bouboule.o: $(UTILS_SRC)/yarandom.h
-bouboule.o: $(UTILS_SRC)/usleep.h
-bouboule.o: $(UTILS_SRC)/resources.h
-bouboule.o: $(UTILS_SRC)/hsv.h
-bouboule.o: $(UTILS_SRC)/colors.h
-bouboule.o: $(UTILS_SRC)/grabscreen.h
-bouboule.o: $(UTILS_SRC)/visual.h
-bouboule.o: $(UTILS_SRC)/xshm.h
 braid.o: $(srcdir)/xlockmore.h
 braid.o: ../config.h
 braid.o: $(srcdir)/xlockmoreI.h
 braid.o: $(srcdir)/screenhack.h
-braid.o: $(UTILS_SRC)/yarandom.h
-braid.o: $(UTILS_SRC)/usleep.h
-braid.o: $(UTILS_SRC)/resources.h
-braid.o: $(UTILS_SRC)/hsv.h
-braid.o: $(UTILS_SRC)/colors.h
-braid.o: $(UTILS_SRC)/grabscreen.h
-braid.o: $(UTILS_SRC)/visual.h
-braid.o: $(UTILS_SRC)/xshm.h
-braid.o: $(UTILS_SRC)/erase.h
 bubbles.o: $(srcdir)/screenhack.h
 bubbles.o: ../config.h
-bubbles.o: $(UTILS_SRC)/yarandom.h
-bubbles.o: $(UTILS_SRC)/usleep.h
-bubbles.o: $(UTILS_SRC)/resources.h
-bubbles.o: $(UTILS_SRC)/hsv.h
-bubbles.o: $(UTILS_SRC)/colors.h
-bubbles.o: $(UTILS_SRC)/grabscreen.h
-bubbles.o: $(UTILS_SRC)/visual.h
 bubbles.o: $(srcdir)/bubbles.h
 bubbles-default.o: ../config.h
 bubbles-default.o: $(srcdir)/bubbles.h
-bubbles-default.o: $(UTILS_SRC)/yarandom.h
 bubbles-default.o: $(srcdir)/images/bubbles/blood1.xpm
 bubbles-default.o: $(srcdir)/images/bubbles/blood2.xpm
 bubbles-default.o: $(srcdir)/images/bubbles/blood3.xpm
@@ -825,273 +782,79 @@ bubbles-default.o: $(srcdir)/images/bubbles/jade10.xpm
 bubbles-default.o: $(srcdir)/images/bubbles/jade11.xpm
 decayscreen.o: $(srcdir)/screenhack.h
 decayscreen.o: ../config.h
-decayscreen.o: $(UTILS_SRC)/yarandom.h
-decayscreen.o: $(UTILS_SRC)/usleep.h
-decayscreen.o: $(UTILS_SRC)/resources.h
-decayscreen.o: $(UTILS_SRC)/hsv.h
-decayscreen.o: $(UTILS_SRC)/colors.h
-decayscreen.o: $(UTILS_SRC)/grabscreen.h
-decayscreen.o: $(UTILS_SRC)/visual.h
 deco.o: $(srcdir)/screenhack.h
 deco.o: ../config.h
-deco.o: $(UTILS_SRC)/yarandom.h
-deco.o: $(UTILS_SRC)/usleep.h
-deco.o: $(UTILS_SRC)/resources.h
-deco.o: $(UTILS_SRC)/hsv.h
-deco.o: $(UTILS_SRC)/colors.h
-deco.o: $(UTILS_SRC)/grabscreen.h
-deco.o: $(UTILS_SRC)/visual.h
 drift.o: $(srcdir)/xlockmore.h
 drift.o: ../config.h
 drift.o: $(srcdir)/xlockmoreI.h
 drift.o: $(srcdir)/screenhack.h
-drift.o: $(UTILS_SRC)/yarandom.h
-drift.o: $(UTILS_SRC)/usleep.h
-drift.o: $(UTILS_SRC)/resources.h
-drift.o: $(UTILS_SRC)/hsv.h
-drift.o: $(UTILS_SRC)/colors.h
-drift.o: $(UTILS_SRC)/grabscreen.h
-drift.o: $(UTILS_SRC)/visual.h
-drift.o: $(UTILS_SRC)/xshm.h
-drift.o: $(UTILS_SRC)/erase.h
 flag.o: $(srcdir)/xlockmore.h
 flag.o: ../config.h
 flag.o: $(srcdir)/xlockmoreI.h
 flag.o: $(srcdir)/screenhack.h
-flag.o: $(UTILS_SRC)/yarandom.h
-flag.o: $(UTILS_SRC)/usleep.h
-flag.o: $(UTILS_SRC)/resources.h
-flag.o: $(UTILS_SRC)/hsv.h
-flag.o: $(UTILS_SRC)/colors.h
-flag.o: $(UTILS_SRC)/grabscreen.h
-flag.o: $(UTILS_SRC)/visual.h
-flag.o: $(UTILS_SRC)/xshm.h
 flag.o: $(srcdir)/images/bob.xbm
 flame.o: $(srcdir)/screenhack.h
 flame.o: ../config.h
-flame.o: $(UTILS_SRC)/yarandom.h
-flame.o: $(UTILS_SRC)/usleep.h
-flame.o: $(UTILS_SRC)/resources.h
-flame.o: $(UTILS_SRC)/hsv.h
-flame.o: $(UTILS_SRC)/colors.h
-flame.o: $(UTILS_SRC)/grabscreen.h
-flame.o: $(UTILS_SRC)/visual.h
 forest.o: ../config.h
 forest.o: $(srcdir)/xlockmore.h
 forest.o: $(srcdir)/xlockmoreI.h
 forest.o: $(srcdir)/screenhack.h
-forest.o: $(UTILS_SRC)/yarandom.h
-forest.o: $(UTILS_SRC)/usleep.h
-forest.o: $(UTILS_SRC)/resources.h
-forest.o: $(UTILS_SRC)/hsv.h
-forest.o: $(UTILS_SRC)/colors.h
-forest.o: $(UTILS_SRC)/grabscreen.h
-forest.o: $(UTILS_SRC)/visual.h
-forest.o: $(UTILS_SRC)/xshm.h
 vines.o: $(srcdir)/xlockmore.h
 vines.o: ../config.h
 vines.o: $(srcdir)/xlockmoreI.h
 vines.o: $(srcdir)/screenhack.h
-vines.o: $(UTILS_SRC)/yarandom.h
-vines.o: $(UTILS_SRC)/usleep.h
-vines.o: $(UTILS_SRC)/resources.h
-vines.o: $(UTILS_SRC)/hsv.h
-vines.o: $(UTILS_SRC)/colors.h
-vines.o: $(UTILS_SRC)/grabscreen.h
-vines.o: $(UTILS_SRC)/visual.h
-vines.o: $(UTILS_SRC)/xshm.h
-vines.o: $(UTILS_SRC)/erase.h
 galaxy.o: $(srcdir)/xlockmore.h
 galaxy.o: ../config.h
 galaxy.o: $(srcdir)/xlockmoreI.h
 galaxy.o: $(srcdir)/screenhack.h
-galaxy.o: $(UTILS_SRC)/yarandom.h
-galaxy.o: $(UTILS_SRC)/usleep.h
-galaxy.o: $(UTILS_SRC)/resources.h
-galaxy.o: $(UTILS_SRC)/hsv.h
-galaxy.o: $(UTILS_SRC)/colors.h
-galaxy.o: $(UTILS_SRC)/grabscreen.h
-galaxy.o: $(UTILS_SRC)/visual.h
-galaxy.o: $(UTILS_SRC)/xshm.h
 grav.o: $(srcdir)/xlockmore.h
 grav.o: ../config.h
 grav.o: $(srcdir)/xlockmoreI.h
 grav.o: $(srcdir)/screenhack.h
-grav.o: $(UTILS_SRC)/yarandom.h
-grav.o: $(UTILS_SRC)/usleep.h
-grav.o: $(UTILS_SRC)/resources.h
-grav.o: $(UTILS_SRC)/hsv.h
-grav.o: $(UTILS_SRC)/colors.h
-grav.o: $(UTILS_SRC)/grabscreen.h
-grav.o: $(UTILS_SRC)/visual.h
-grav.o: $(UTILS_SRC)/xshm.h
 greynetic.o: $(srcdir)/screenhack.h
 greynetic.o: ../config.h
-greynetic.o: $(UTILS_SRC)/yarandom.h
-greynetic.o: $(UTILS_SRC)/usleep.h
-greynetic.o: $(UTILS_SRC)/resources.h
-greynetic.o: $(UTILS_SRC)/hsv.h
-greynetic.o: $(UTILS_SRC)/colors.h
-greynetic.o: $(UTILS_SRC)/grabscreen.h
-greynetic.o: $(UTILS_SRC)/visual.h
 halo.o: $(srcdir)/screenhack.h
 halo.o: ../config.h
-halo.o: $(UTILS_SRC)/yarandom.h
-halo.o: $(UTILS_SRC)/usleep.h
-halo.o: $(UTILS_SRC)/resources.h
-halo.o: $(UTILS_SRC)/hsv.h
-halo.o: $(UTILS_SRC)/colors.h
-halo.o: $(UTILS_SRC)/grabscreen.h
-halo.o: $(UTILS_SRC)/visual.h
 helix.o: $(srcdir)/screenhack.h
 helix.o: ../config.h
-helix.o: $(UTILS_SRC)/yarandom.h
-helix.o: $(UTILS_SRC)/usleep.h
-helix.o: $(UTILS_SRC)/resources.h
-helix.o: $(UTILS_SRC)/hsv.h
-helix.o: $(UTILS_SRC)/colors.h
-helix.o: $(UTILS_SRC)/grabscreen.h
-helix.o: $(UTILS_SRC)/visual.h
-helix.o: $(UTILS_SRC)/erase.h
 hopalong.o: $(srcdir)/xlockmore.h
 hopalong.o: ../config.h
 hopalong.o: $(srcdir)/xlockmoreI.h
 hopalong.o: $(srcdir)/screenhack.h
-hopalong.o: $(UTILS_SRC)/yarandom.h
-hopalong.o: $(UTILS_SRC)/usleep.h
-hopalong.o: $(UTILS_SRC)/resources.h
-hopalong.o: $(UTILS_SRC)/hsv.h
-hopalong.o: $(UTILS_SRC)/colors.h
-hopalong.o: $(UTILS_SRC)/grabscreen.h
-hopalong.o: $(UTILS_SRC)/visual.h
-hopalong.o: $(UTILS_SRC)/xshm.h
-hopalong.o: $(UTILS_SRC)/erase.h
 hypercube.o: $(srcdir)/screenhack.h
 hypercube.o: ../config.h
-hypercube.o: $(UTILS_SRC)/yarandom.h
-hypercube.o: $(UTILS_SRC)/usleep.h
-hypercube.o: $(UTILS_SRC)/resources.h
-hypercube.o: $(UTILS_SRC)/hsv.h
-hypercube.o: $(UTILS_SRC)/colors.h
-hypercube.o: $(UTILS_SRC)/grabscreen.h
-hypercube.o: $(UTILS_SRC)/visual.h
 ifs.o: $(srcdir)/xlockmore.h
 ifs.o: ../config.h
 ifs.o: $(srcdir)/xlockmoreI.h
 ifs.o: $(srcdir)/screenhack.h
-ifs.o: $(UTILS_SRC)/yarandom.h
-ifs.o: $(UTILS_SRC)/usleep.h
-ifs.o: $(UTILS_SRC)/resources.h
-ifs.o: $(UTILS_SRC)/hsv.h
-ifs.o: $(UTILS_SRC)/colors.h
-ifs.o: $(UTILS_SRC)/grabscreen.h
-ifs.o: $(UTILS_SRC)/visual.h
-ifs.o: $(UTILS_SRC)/xshm.h
 imsmap.o: $(srcdir)/screenhack.h
 imsmap.o: ../config.h
-imsmap.o: $(UTILS_SRC)/yarandom.h
-imsmap.o: $(UTILS_SRC)/usleep.h
-imsmap.o: $(UTILS_SRC)/resources.h
-imsmap.o: $(UTILS_SRC)/hsv.h
-imsmap.o: $(UTILS_SRC)/colors.h
-imsmap.o: $(UTILS_SRC)/grabscreen.h
-imsmap.o: $(UTILS_SRC)/visual.h
 julia.o: $(srcdir)/xlockmore.h
 julia.o: ../config.h
 julia.o: $(srcdir)/xlockmoreI.h
 julia.o: $(srcdir)/screenhack.h
-julia.o: $(UTILS_SRC)/yarandom.h
-julia.o: $(UTILS_SRC)/usleep.h
-julia.o: $(UTILS_SRC)/resources.h
-julia.o: $(UTILS_SRC)/hsv.h
-julia.o: $(UTILS_SRC)/colors.h
-julia.o: $(UTILS_SRC)/grabscreen.h
-julia.o: $(UTILS_SRC)/visual.h
-julia.o: $(UTILS_SRC)/xshm.h
-kaleidescope.o: $(UTILS_SRC)/spline.h
 kaleidescope.o: $(srcdir)/screenhack.h
 kaleidescope.o: ../config.h
-kaleidescope.o: $(UTILS_SRC)/yarandom.h
-kaleidescope.o: $(UTILS_SRC)/usleep.h
-kaleidescope.o: $(UTILS_SRC)/resources.h
-kaleidescope.o: $(UTILS_SRC)/hsv.h
-kaleidescope.o: $(UTILS_SRC)/colors.h
-kaleidescope.o: $(UTILS_SRC)/grabscreen.h
-kaleidescope.o: $(UTILS_SRC)/visual.h
 laser.o: $(srcdir)/xlockmore.h
 laser.o: ../config.h
 laser.o: $(srcdir)/xlockmoreI.h
 laser.o: $(srcdir)/screenhack.h
-laser.o: $(UTILS_SRC)/yarandom.h
-laser.o: $(UTILS_SRC)/usleep.h
-laser.o: $(UTILS_SRC)/resources.h
-laser.o: $(UTILS_SRC)/hsv.h
-laser.o: $(UTILS_SRC)/colors.h
-laser.o: $(UTILS_SRC)/grabscreen.h
-laser.o: $(UTILS_SRC)/visual.h
-laser.o: $(UTILS_SRC)/xshm.h
 lightning.o: $(srcdir)/xlockmore.h
 lightning.o: ../config.h
 lightning.o: $(srcdir)/xlockmoreI.h
 lightning.o: $(srcdir)/screenhack.h
-lightning.o: $(UTILS_SRC)/yarandom.h
-lightning.o: $(UTILS_SRC)/usleep.h
-lightning.o: $(UTILS_SRC)/resources.h
-lightning.o: $(UTILS_SRC)/hsv.h
-lightning.o: $(UTILS_SRC)/colors.h
-lightning.o: $(UTILS_SRC)/grabscreen.h
-lightning.o: $(UTILS_SRC)/visual.h
-lightning.o: $(UTILS_SRC)/xshm.h
 lisa.o: $(srcdir)/xlockmore.h
 lisa.o: ../config.h
 lisa.o: $(srcdir)/xlockmoreI.h
 lisa.o: $(srcdir)/screenhack.h
-lisa.o: $(UTILS_SRC)/yarandom.h
-lisa.o: $(UTILS_SRC)/usleep.h
-lisa.o: $(UTILS_SRC)/resources.h
-lisa.o: $(UTILS_SRC)/hsv.h
-lisa.o: $(UTILS_SRC)/colors.h
-lisa.o: $(UTILS_SRC)/grabscreen.h
-lisa.o: $(UTILS_SRC)/visual.h
-lisa.o: $(UTILS_SRC)/xshm.h
 lmorph.o: $(srcdir)/screenhack.h
 lmorph.o: ../config.h
-lmorph.o: $(UTILS_SRC)/yarandom.h
-lmorph.o: $(UTILS_SRC)/usleep.h
-lmorph.o: $(UTILS_SRC)/resources.h
-lmorph.o: $(UTILS_SRC)/hsv.h
-lmorph.o: $(UTILS_SRC)/colors.h
-lmorph.o: $(UTILS_SRC)/grabscreen.h
-lmorph.o: $(UTILS_SRC)/visual.h
 maze.o: $(srcdir)/screenhack.h
 maze.o: ../config.h
-maze.o: $(UTILS_SRC)/yarandom.h
-maze.o: $(UTILS_SRC)/usleep.h
-maze.o: $(UTILS_SRC)/resources.h
-maze.o: $(UTILS_SRC)/hsv.h
-maze.o: $(UTILS_SRC)/colors.h
-maze.o: $(UTILS_SRC)/grabscreen.h
-maze.o: $(UTILS_SRC)/visual.h
-maze.o: $(UTILS_SRC)/erase.h
 moire.o: $(srcdir)/screenhack.h
 moire.o: ../config.h
-moire.o: $(UTILS_SRC)/yarandom.h
-moire.o: $(UTILS_SRC)/usleep.h
-moire.o: $(UTILS_SRC)/resources.h
-moire.o: $(UTILS_SRC)/hsv.h
-moire.o: $(UTILS_SRC)/colors.h
-moire.o: $(UTILS_SRC)/grabscreen.h
-moire.o: $(UTILS_SRC)/visual.h
-moire.o: $(UTILS_SRC)/xshm.h
 noseguy.o: $(srcdir)/screenhack.h
 noseguy.o: ../config.h
-noseguy.o: $(UTILS_SRC)/yarandom.h
-noseguy.o: $(UTILS_SRC)/usleep.h
-noseguy.o: $(UTILS_SRC)/resources.h
-noseguy.o: $(UTILS_SRC)/hsv.h
-noseguy.o: $(UTILS_SRC)/colors.h
-noseguy.o: $(UTILS_SRC)/grabscreen.h
-noseguy.o: $(UTILS_SRC)/visual.h
 noseguy.o: $(srcdir)/images/noseguy/nose-f1.xpm
 noseguy.o: $(srcdir)/images/noseguy/nose-f2.xpm
 noseguy.o: $(srcdir)/images/noseguy/nose-f3.xpm
@@ -1102,331 +865,94 @@ noseguy.o: $(srcdir)/images/noseguy/nose-r1.xpm
 noseguy.o: $(srcdir)/images/noseguy/nose-r2.xpm
 pedal.o: $(srcdir)/screenhack.h
 pedal.o: ../config.h
-pedal.o: $(UTILS_SRC)/yarandom.h
-pedal.o: $(UTILS_SRC)/usleep.h
-pedal.o: $(UTILS_SRC)/resources.h
-pedal.o: $(UTILS_SRC)/hsv.h
-pedal.o: $(UTILS_SRC)/colors.h
-pedal.o: $(UTILS_SRC)/grabscreen.h
-pedal.o: $(UTILS_SRC)/visual.h
 penrose.o: $(srcdir)/xlockmore.h
 penrose.o: ../config.h
 penrose.o: $(srcdir)/xlockmoreI.h
 penrose.o: $(srcdir)/screenhack.h
-penrose.o: $(UTILS_SRC)/yarandom.h
-penrose.o: $(UTILS_SRC)/usleep.h
-penrose.o: $(UTILS_SRC)/resources.h
-penrose.o: $(UTILS_SRC)/hsv.h
-penrose.o: $(UTILS_SRC)/colors.h
-penrose.o: $(UTILS_SRC)/grabscreen.h
-penrose.o: $(UTILS_SRC)/visual.h
-penrose.o: $(UTILS_SRC)/xshm.h
 pyro.o: $(srcdir)/screenhack.h
 pyro.o: ../config.h
-pyro.o: $(UTILS_SRC)/yarandom.h
-pyro.o: $(UTILS_SRC)/usleep.h
-pyro.o: $(UTILS_SRC)/resources.h
-pyro.o: $(UTILS_SRC)/hsv.h
-pyro.o: $(UTILS_SRC)/colors.h
-pyro.o: $(UTILS_SRC)/grabscreen.h
-pyro.o: $(UTILS_SRC)/visual.h
 qix.o: $(srcdir)/screenhack.h
 qix.o: ../config.h
-qix.o: $(UTILS_SRC)/yarandom.h
-qix.o: $(UTILS_SRC)/usleep.h
-qix.o: $(UTILS_SRC)/resources.h
-qix.o: $(UTILS_SRC)/hsv.h
-qix.o: $(UTILS_SRC)/colors.h
-qix.o: $(UTILS_SRC)/grabscreen.h
-qix.o: $(UTILS_SRC)/visual.h
-qix.o: $(UTILS_SRC)/alpha.h
 rocks.o: $(srcdir)/screenhack.h
 rocks.o: ../config.h
-rocks.o: $(UTILS_SRC)/yarandom.h
-rocks.o: $(UTILS_SRC)/usleep.h
-rocks.o: $(UTILS_SRC)/resources.h
-rocks.o: $(UTILS_SRC)/hsv.h
-rocks.o: $(UTILS_SRC)/colors.h
-rocks.o: $(UTILS_SRC)/grabscreen.h
-rocks.o: $(UTILS_SRC)/visual.h
 rorschach.o: $(srcdir)/screenhack.h
 rorschach.o: ../config.h
-rorschach.o: $(UTILS_SRC)/yarandom.h
-rorschach.o: $(UTILS_SRC)/usleep.h
-rorschach.o: $(UTILS_SRC)/resources.h
-rorschach.o: $(UTILS_SRC)/hsv.h
-rorschach.o: $(UTILS_SRC)/colors.h
-rorschach.o: $(UTILS_SRC)/grabscreen.h
-rorschach.o: $(UTILS_SRC)/visual.h
-rorschach.o: $(UTILS_SRC)/erase.h
-screenhack.o: $(UTILS_SRC)/xmu.h
 screenhack.o: $(srcdir)/screenhack.h
 screenhack.o: ../config.h
-screenhack.o: $(UTILS_SRC)/yarandom.h
-screenhack.o: $(UTILS_SRC)/usleep.h
-screenhack.o: $(UTILS_SRC)/resources.h
-screenhack.o: $(UTILS_SRC)/hsv.h
-screenhack.o: $(UTILS_SRC)/colors.h
-screenhack.o: $(UTILS_SRC)/grabscreen.h
-screenhack.o: $(UTILS_SRC)/visual.h
-screenhack.o: $(UTILS_SRC)/version.h
-screenhack.o: $(UTILS_SRC)/vroot.h
 sierpinski.o: $(srcdir)/xlockmore.h
 sierpinski.o: ../config.h
 sierpinski.o: $(srcdir)/xlockmoreI.h
 sierpinski.o: $(srcdir)/screenhack.h
-sierpinski.o: $(UTILS_SRC)/yarandom.h
-sierpinski.o: $(UTILS_SRC)/usleep.h
-sierpinski.o: $(UTILS_SRC)/resources.h
-sierpinski.o: $(UTILS_SRC)/hsv.h
-sierpinski.o: $(UTILS_SRC)/colors.h
-sierpinski.o: $(UTILS_SRC)/grabscreen.h
-sierpinski.o: $(UTILS_SRC)/visual.h
-sierpinski.o: $(UTILS_SRC)/xshm.h
 slidescreen.o: $(srcdir)/screenhack.h
 slidescreen.o: ../config.h
-slidescreen.o: $(UTILS_SRC)/yarandom.h
-slidescreen.o: $(UTILS_SRC)/usleep.h
-slidescreen.o: $(UTILS_SRC)/resources.h
-slidescreen.o: $(UTILS_SRC)/hsv.h
-slidescreen.o: $(UTILS_SRC)/colors.h
-slidescreen.o: $(UTILS_SRC)/grabscreen.h
-slidescreen.o: $(UTILS_SRC)/visual.h
 slip.o: $(srcdir)/xlockmore.h
 slip.o: ../config.h
 slip.o: $(srcdir)/xlockmoreI.h
 slip.o: $(srcdir)/screenhack.h
-slip.o: $(UTILS_SRC)/yarandom.h
-slip.o: $(UTILS_SRC)/usleep.h
-slip.o: $(UTILS_SRC)/resources.h
-slip.o: $(UTILS_SRC)/hsv.h
-slip.o: $(UTILS_SRC)/colors.h
-slip.o: $(UTILS_SRC)/grabscreen.h
-slip.o: $(UTILS_SRC)/visual.h
-slip.o: $(UTILS_SRC)/xshm.h
 sphere.o: $(srcdir)/xlockmore.h
 sphere.o: ../config.h
 sphere.o: $(srcdir)/xlockmoreI.h
 sphere.o: $(srcdir)/screenhack.h
-sphere.o: $(UTILS_SRC)/yarandom.h
-sphere.o: $(UTILS_SRC)/usleep.h
-sphere.o: $(UTILS_SRC)/resources.h
-sphere.o: $(UTILS_SRC)/hsv.h
-sphere.o: $(UTILS_SRC)/colors.h
-sphere.o: $(UTILS_SRC)/grabscreen.h
-sphere.o: $(UTILS_SRC)/visual.h
-sphere.o: $(UTILS_SRC)/xshm.h
 spiral.o: $(srcdir)/xlockmore.h
 spiral.o: ../config.h
 spiral.o: $(srcdir)/xlockmoreI.h
 spiral.o: $(srcdir)/screenhack.h
-spiral.o: $(UTILS_SRC)/yarandom.h
-spiral.o: $(UTILS_SRC)/usleep.h
-spiral.o: $(UTILS_SRC)/resources.h
-spiral.o: $(UTILS_SRC)/hsv.h
-spiral.o: $(UTILS_SRC)/colors.h
-spiral.o: $(UTILS_SRC)/grabscreen.h
-spiral.o: $(UTILS_SRC)/visual.h
-spiral.o: $(UTILS_SRC)/xshm.h
 strange.o: $(srcdir)/xlockmore.h
 strange.o: ../config.h
 strange.o: $(srcdir)/xlockmoreI.h
 strange.o: $(srcdir)/screenhack.h
-strange.o: $(UTILS_SRC)/yarandom.h
-strange.o: $(UTILS_SRC)/usleep.h
-strange.o: $(UTILS_SRC)/resources.h
-strange.o: $(UTILS_SRC)/hsv.h
-strange.o: $(UTILS_SRC)/colors.h
-strange.o: $(UTILS_SRC)/grabscreen.h
-strange.o: $(UTILS_SRC)/visual.h
-strange.o: $(UTILS_SRC)/xshm.h
 swirl.o: $(srcdir)/xlockmore.h
 swirl.o: ../config.h
 swirl.o: $(srcdir)/xlockmoreI.h
 swirl.o: $(srcdir)/screenhack.h
-swirl.o: $(UTILS_SRC)/yarandom.h
-swirl.o: $(UTILS_SRC)/usleep.h
-swirl.o: $(UTILS_SRC)/resources.h
-swirl.o: $(UTILS_SRC)/hsv.h
-swirl.o: $(UTILS_SRC)/colors.h
-swirl.o: $(UTILS_SRC)/grabscreen.h
-swirl.o: $(UTILS_SRC)/visual.h
-swirl.o: $(UTILS_SRC)/xshm.h
 xlockmore.o: $(srcdir)/screenhack.h
 xlockmore.o: ../config.h
-xlockmore.o: $(UTILS_SRC)/yarandom.h
-xlockmore.o: $(UTILS_SRC)/usleep.h
-xlockmore.o: $(UTILS_SRC)/resources.h
-xlockmore.o: $(UTILS_SRC)/hsv.h
-xlockmore.o: $(UTILS_SRC)/colors.h
-xlockmore.o: $(UTILS_SRC)/grabscreen.h
-xlockmore.o: $(UTILS_SRC)/visual.h
 xlockmore.o: $(srcdir)/xlockmoreI.h
-xlockmore.o: $(UTILS_SRC)/xshm.h
 goop.o: $(srcdir)/screenhack.h
 goop.o: ../config.h
-goop.o: $(UTILS_SRC)/yarandom.h
-goop.o: $(UTILS_SRC)/usleep.h
-goop.o: $(UTILS_SRC)/resources.h
-goop.o: $(UTILS_SRC)/hsv.h
-goop.o: $(UTILS_SRC)/colors.h
-goop.o: $(UTILS_SRC)/grabscreen.h
-goop.o: $(UTILS_SRC)/visual.h
-goop.o: $(UTILS_SRC)/spline.h
-goop.o: $(UTILS_SRC)/alpha.h
 starfish.o: $(srcdir)/screenhack.h
 starfish.o: ../config.h
-starfish.o: $(UTILS_SRC)/yarandom.h
-starfish.o: $(UTILS_SRC)/usleep.h
-starfish.o: $(UTILS_SRC)/resources.h
-starfish.o: $(UTILS_SRC)/hsv.h
-starfish.o: $(UTILS_SRC)/colors.h
-starfish.o: $(UTILS_SRC)/grabscreen.h
-starfish.o: $(UTILS_SRC)/visual.h
-starfish.o: $(UTILS_SRC)/spline.h
 munch.o: $(srcdir)/screenhack.h
 munch.o: ../config.h
-munch.o: $(UTILS_SRC)/yarandom.h
-munch.o: $(UTILS_SRC)/usleep.h
-munch.o: $(UTILS_SRC)/resources.h
-munch.o: $(UTILS_SRC)/hsv.h
-munch.o: $(UTILS_SRC)/colors.h
-munch.o: $(UTILS_SRC)/grabscreen.h
-munch.o: $(UTILS_SRC)/visual.h
 fadeplot.o: $(srcdir)/xlockmore.h
 fadeplot.o: ../config.h
 fadeplot.o: $(srcdir)/xlockmoreI.h
 fadeplot.o: $(srcdir)/screenhack.h
-fadeplot.o: $(UTILS_SRC)/yarandom.h
-fadeplot.o: $(UTILS_SRC)/usleep.h
-fadeplot.o: $(UTILS_SRC)/resources.h
-fadeplot.o: $(UTILS_SRC)/hsv.h
-fadeplot.o: $(UTILS_SRC)/colors.h
-fadeplot.o: $(UTILS_SRC)/grabscreen.h
-fadeplot.o: $(UTILS_SRC)/visual.h
-fadeplot.o: $(UTILS_SRC)/xshm.h
 rd-bomb.o: $(srcdir)/screenhack.h
 rd-bomb.o: ../config.h
-rd-bomb.o: $(UTILS_SRC)/yarandom.h
-rd-bomb.o: $(UTILS_SRC)/usleep.h
-rd-bomb.o: $(UTILS_SRC)/resources.h
-rd-bomb.o: $(UTILS_SRC)/hsv.h
-rd-bomb.o: $(UTILS_SRC)/colors.h
-rd-bomb.o: $(UTILS_SRC)/grabscreen.h
-rd-bomb.o: $(UTILS_SRC)/visual.h
-rd-bomb.o: $(UTILS_SRC)/xshm.h
 coral.o: $(srcdir)/screenhack.h
 coral.o: ../config.h
-coral.o: $(UTILS_SRC)/yarandom.h
-coral.o: $(UTILS_SRC)/usleep.h
-coral.o: $(UTILS_SRC)/resources.h
-coral.o: $(UTILS_SRC)/hsv.h
-coral.o: $(UTILS_SRC)/colors.h
-coral.o: $(UTILS_SRC)/grabscreen.h
-coral.o: $(UTILS_SRC)/visual.h
-coral.o: $(UTILS_SRC)/erase.h
 mountain.o: $(srcdir)/xlockmore.h
 mountain.o: ../config.h
 mountain.o: $(srcdir)/xlockmoreI.h
 mountain.o: $(srcdir)/screenhack.h
-mountain.o: $(UTILS_SRC)/yarandom.h
-mountain.o: $(UTILS_SRC)/usleep.h
-mountain.o: $(UTILS_SRC)/resources.h
-mountain.o: $(UTILS_SRC)/hsv.h
-mountain.o: $(UTILS_SRC)/colors.h
-mountain.o: $(UTILS_SRC)/grabscreen.h
-mountain.o: $(UTILS_SRC)/visual.h
-mountain.o: $(UTILS_SRC)/xshm.h
 triangle.o: $(srcdir)/xlockmore.h
 triangle.o: ../config.h
 triangle.o: $(srcdir)/xlockmoreI.h
 triangle.o: $(srcdir)/screenhack.h
-triangle.o: $(UTILS_SRC)/yarandom.h
-triangle.o: $(UTILS_SRC)/usleep.h
-triangle.o: $(UTILS_SRC)/resources.h
-triangle.o: $(UTILS_SRC)/hsv.h
-triangle.o: $(UTILS_SRC)/colors.h
-triangle.o: $(UTILS_SRC)/grabscreen.h
-triangle.o: $(UTILS_SRC)/visual.h
-triangle.o: $(UTILS_SRC)/xshm.h
 lissie.o: $(srcdir)/xlockmore.h
 lissie.o: ../config.h
 lissie.o: $(srcdir)/xlockmoreI.h
 lissie.o: $(srcdir)/screenhack.h
-lissie.o: $(UTILS_SRC)/yarandom.h
-lissie.o: $(UTILS_SRC)/usleep.h
-lissie.o: $(UTILS_SRC)/resources.h
-lissie.o: $(UTILS_SRC)/hsv.h
-lissie.o: $(UTILS_SRC)/colors.h
-lissie.o: $(UTILS_SRC)/grabscreen.h
-lissie.o: $(UTILS_SRC)/visual.h
-lissie.o: $(UTILS_SRC)/xshm.h
 worm.o: $(srcdir)/xlockmore.h
 worm.o: ../config.h
 worm.o: $(srcdir)/xlockmoreI.h
 worm.o: $(srcdir)/screenhack.h
-worm.o: $(UTILS_SRC)/yarandom.h
-worm.o: $(UTILS_SRC)/usleep.h
-worm.o: $(UTILS_SRC)/resources.h
-worm.o: $(UTILS_SRC)/hsv.h
-worm.o: $(UTILS_SRC)/colors.h
-worm.o: $(UTILS_SRC)/grabscreen.h
-worm.o: $(UTILS_SRC)/visual.h
-worm.o: $(UTILS_SRC)/xshm.h
 rotor.o: $(srcdir)/xlockmore.h
 rotor.o: ../config.h
 rotor.o: $(srcdir)/xlockmoreI.h
 rotor.o: $(srcdir)/screenhack.h
-rotor.o: $(UTILS_SRC)/yarandom.h
-rotor.o: $(UTILS_SRC)/usleep.h
-rotor.o: $(UTILS_SRC)/resources.h
-rotor.o: $(UTILS_SRC)/hsv.h
-rotor.o: $(UTILS_SRC)/colors.h
-rotor.o: $(UTILS_SRC)/grabscreen.h
-rotor.o: $(UTILS_SRC)/visual.h
-rotor.o: $(UTILS_SRC)/xshm.h
 ant.o: $(srcdir)/xlockmore.h
 ant.o: ../config.h
 ant.o: $(srcdir)/xlockmoreI.h
 ant.o: $(srcdir)/screenhack.h
-ant.o: $(UTILS_SRC)/yarandom.h
-ant.o: $(UTILS_SRC)/usleep.h
-ant.o: $(UTILS_SRC)/resources.h
-ant.o: $(UTILS_SRC)/hsv.h
-ant.o: $(UTILS_SRC)/colors.h
-ant.o: $(UTILS_SRC)/grabscreen.h
-ant.o: $(UTILS_SRC)/visual.h
-ant.o: $(UTILS_SRC)/xshm.h
-ant.o: $(UTILS_SRC)/erase.h
 ant.o: $(srcdir)/automata.h
 xjack.o: $(srcdir)/screenhack.h
 xjack.o: ../config.h
-xjack.o: $(UTILS_SRC)/yarandom.h
-xjack.o: $(UTILS_SRC)/usleep.h
-xjack.o: $(UTILS_SRC)/resources.h
-xjack.o: $(UTILS_SRC)/hsv.h
-xjack.o: $(UTILS_SRC)/colors.h
-xjack.o: $(UTILS_SRC)/grabscreen.h
-xjack.o: $(UTILS_SRC)/visual.h
 xlyap.o: $(srcdir)/screenhack.h
 xlyap.o: ../config.h
-xlyap.o: $(UTILS_SRC)/yarandom.h
-xlyap.o: $(UTILS_SRC)/usleep.h
-xlyap.o: $(UTILS_SRC)/resources.h
-xlyap.o: $(UTILS_SRC)/hsv.h
-xlyap.o: $(UTILS_SRC)/colors.h
-xlyap.o: $(UTILS_SRC)/grabscreen.h
-xlyap.o: $(UTILS_SRC)/visual.h
-xlyap.o: $(UTILS_SRC)/vroot.h
 jigsaw.o: $(srcdir)/screenhack.h
 jigsaw.o: ../config.h
-jigsaw.o: $(UTILS_SRC)/yarandom.h
-jigsaw.o: $(UTILS_SRC)/usleep.h
-jigsaw.o: $(UTILS_SRC)/resources.h
-jigsaw.o: $(UTILS_SRC)/hsv.h
-jigsaw.o: $(UTILS_SRC)/colors.h
-jigsaw.o: $(UTILS_SRC)/grabscreen.h
-jigsaw.o: $(UTILS_SRC)/visual.h
 jigsaw.o: $(srcdir)/images/jigsaw/jigsaw_a_h.xbm
 jigsaw.o: $(srcdir)/images/jigsaw/jigsaw_a_n_h.xbm
 jigsaw.o: $(srcdir)/images/jigsaw/jigsaw_a_ne_h.xbm
@@ -1463,77 +989,22 @@ jigsaw.o: $(srcdir)/images/jigsaw/jigsaw_b_s_f.xbm
 jigsaw.o: $(srcdir)/images/jigsaw/jigsaw_b_sw_f.xbm
 jigsaw.o: $(srcdir)/images/jigsaw/jigsaw_b_w_f.xbm
 jigsaw.o: $(srcdir)/images/jigsaw/jigsaw_b_nw_f.xbm
-xscreensaver-sgigl.o: $(UTILS_SRC)/vroot.h
 cynosure.o: $(srcdir)/screenhack.h
 cynosure.o: ../config.h
-cynosure.o: $(UTILS_SRC)/yarandom.h
-cynosure.o: $(UTILS_SRC)/usleep.h
-cynosure.o: $(UTILS_SRC)/resources.h
-cynosure.o: $(UTILS_SRC)/hsv.h
-cynosure.o: $(UTILS_SRC)/colors.h
-cynosure.o: $(UTILS_SRC)/grabscreen.h
-cynosure.o: $(UTILS_SRC)/visual.h
 moire2.o: $(srcdir)/screenhack.h
 moire2.o: ../config.h
-moire2.o: $(UTILS_SRC)/yarandom.h
-moire2.o: $(UTILS_SRC)/usleep.h
-moire2.o: $(UTILS_SRC)/resources.h
-moire2.o: $(UTILS_SRC)/hsv.h
-moire2.o: $(UTILS_SRC)/colors.h
-moire2.o: $(UTILS_SRC)/grabscreen.h
-moire2.o: $(UTILS_SRC)/visual.h
-moire2.o: $(UTILS_SRC)/xdbe.h
 flow.o: $(srcdir)/xlockmore.h
 flow.o: ../config.h
 flow.o: $(srcdir)/xlockmoreI.h
 flow.o: $(srcdir)/screenhack.h
-flow.o: $(UTILS_SRC)/yarandom.h
-flow.o: $(UTILS_SRC)/usleep.h
-flow.o: $(UTILS_SRC)/resources.h
-flow.o: $(UTILS_SRC)/hsv.h
-flow.o: $(UTILS_SRC)/colors.h
-flow.o: $(UTILS_SRC)/grabscreen.h
-flow.o: $(UTILS_SRC)/visual.h
-flow.o: $(UTILS_SRC)/xshm.h
-flow.o: $(UTILS_SRC)/erase.h
 epicycle.o: $(srcdir)/screenhack.h
 epicycle.o: ../config.h
-epicycle.o: $(UTILS_SRC)/yarandom.h
-epicycle.o: $(UTILS_SRC)/usleep.h
-epicycle.o: $(UTILS_SRC)/resources.h
-epicycle.o: $(UTILS_SRC)/hsv.h
-epicycle.o: $(UTILS_SRC)/colors.h
-epicycle.o: $(UTILS_SRC)/grabscreen.h
-epicycle.o: $(UTILS_SRC)/visual.h
-epicycle.o: $(UTILS_SRC)/erase.h
 interference.o: $(srcdir)/screenhack.h
 interference.o: ../config.h
-interference.o: $(UTILS_SRC)/yarandom.h
-interference.o: $(UTILS_SRC)/usleep.h
-interference.o: $(UTILS_SRC)/resources.h
-interference.o: $(UTILS_SRC)/hsv.h
-interference.o: $(UTILS_SRC)/colors.h
-interference.o: $(UTILS_SRC)/grabscreen.h
-interference.o: $(UTILS_SRC)/visual.h
-interference.o: $(UTILS_SRC)/xdbe.h
 truchet.o: $(srcdir)/screenhack.h
 truchet.o: ../config.h
-truchet.o: $(UTILS_SRC)/yarandom.h
-truchet.o: $(UTILS_SRC)/usleep.h
-truchet.o: $(UTILS_SRC)/resources.h
-truchet.o: $(UTILS_SRC)/hsv.h
-truchet.o: $(UTILS_SRC)/colors.h
-truchet.o: $(UTILS_SRC)/grabscreen.h
-truchet.o: $(UTILS_SRC)/visual.h
 bsod.o: $(srcdir)/screenhack.h
 bsod.o: ../config.h
-bsod.o: $(UTILS_SRC)/yarandom.h
-bsod.o: $(UTILS_SRC)/usleep.h
-bsod.o: $(UTILS_SRC)/resources.h
-bsod.o: $(UTILS_SRC)/hsv.h
-bsod.o: $(UTILS_SRC)/colors.h
-bsod.o: $(UTILS_SRC)/grabscreen.h
-bsod.o: $(UTILS_SRC)/visual.h
 bsod.o: $(srcdir)/images/amiga.xpm
 bsod.o: $(srcdir)/images/atari.xbm
 bsod.o: $(srcdir)/images/mac.xbm
@@ -1541,327 +1012,80 @@ crystal.o: $(srcdir)/xlockmore.h
 crystal.o: ../config.h
 crystal.o: $(srcdir)/xlockmoreI.h
 crystal.o: $(srcdir)/screenhack.h
-crystal.o: $(UTILS_SRC)/yarandom.h
-crystal.o: $(UTILS_SRC)/usleep.h
-crystal.o: $(UTILS_SRC)/resources.h
-crystal.o: $(UTILS_SRC)/hsv.h
-crystal.o: $(UTILS_SRC)/colors.h
-crystal.o: $(UTILS_SRC)/grabscreen.h
-crystal.o: $(UTILS_SRC)/visual.h
-crystal.o: $(UTILS_SRC)/xshm.h
 discrete.o: $(srcdir)/xlockmore.h
 discrete.o: ../config.h
 discrete.o: $(srcdir)/xlockmoreI.h
 discrete.o: $(srcdir)/screenhack.h
-discrete.o: $(UTILS_SRC)/yarandom.h
-discrete.o: $(UTILS_SRC)/usleep.h
-discrete.o: $(UTILS_SRC)/resources.h
-discrete.o: $(UTILS_SRC)/hsv.h
-discrete.o: $(UTILS_SRC)/colors.h
-discrete.o: $(UTILS_SRC)/grabscreen.h
-discrete.o: $(UTILS_SRC)/visual.h
-discrete.o: $(UTILS_SRC)/xshm.h
-discrete.o: $(UTILS_SRC)/erase.h
 distort.o: $(srcdir)/screenhack.h
 distort.o: ../config.h
-distort.o: $(UTILS_SRC)/yarandom.h
-distort.o: $(UTILS_SRC)/usleep.h
-distort.o: $(UTILS_SRC)/resources.h
-distort.o: $(UTILS_SRC)/hsv.h
-distort.o: $(UTILS_SRC)/colors.h
-distort.o: $(UTILS_SRC)/grabscreen.h
-distort.o: $(UTILS_SRC)/visual.h
-distort.o: $(UTILS_SRC)/xshm.h
 kumppa.o: $(srcdir)/screenhack.h
 kumppa.o: ../config.h
-kumppa.o: $(UTILS_SRC)/yarandom.h
-kumppa.o: $(UTILS_SRC)/usleep.h
-kumppa.o: $(UTILS_SRC)/resources.h
-kumppa.o: $(UTILS_SRC)/hsv.h
-kumppa.o: $(UTILS_SRC)/colors.h
-kumppa.o: $(UTILS_SRC)/grabscreen.h
-kumppa.o: $(UTILS_SRC)/visual.h
-kumppa.o: $(UTILS_SRC)/xdbe.h
 sonar.o: $(srcdir)/screenhack.h
 sonar.o: ../config.h
-sonar.o: $(UTILS_SRC)/yarandom.h
-sonar.o: $(UTILS_SRC)/usleep.h
-sonar.o: $(UTILS_SRC)/resources.h
-sonar.o: $(UTILS_SRC)/hsv.h
-sonar.o: $(UTILS_SRC)/colors.h
-sonar.o: $(UTILS_SRC)/grabscreen.h
-sonar.o: $(UTILS_SRC)/visual.h
 demon.o: $(srcdir)/xlockmore.h
 demon.o: ../config.h
 demon.o: $(srcdir)/xlockmoreI.h
 demon.o: $(srcdir)/screenhack.h
-demon.o: $(UTILS_SRC)/yarandom.h
-demon.o: $(UTILS_SRC)/usleep.h
-demon.o: $(UTILS_SRC)/resources.h
-demon.o: $(UTILS_SRC)/hsv.h
-demon.o: $(UTILS_SRC)/colors.h
-demon.o: $(UTILS_SRC)/grabscreen.h
-demon.o: $(UTILS_SRC)/visual.h
-demon.o: $(UTILS_SRC)/xshm.h
 demon.o: $(srcdir)/automata.h
 loop.o: $(srcdir)/xlockmore.h
 loop.o: ../config.h
 loop.o: $(srcdir)/xlockmoreI.h
 loop.o: $(srcdir)/screenhack.h
-loop.o: $(UTILS_SRC)/yarandom.h
-loop.o: $(UTILS_SRC)/usleep.h
-loop.o: $(UTILS_SRC)/resources.h
-loop.o: $(UTILS_SRC)/hsv.h
-loop.o: $(UTILS_SRC)/colors.h
-loop.o: $(UTILS_SRC)/grabscreen.h
-loop.o: $(UTILS_SRC)/visual.h
-loop.o: $(UTILS_SRC)/xshm.h
 loop.o: $(srcdir)/automata.h
 t3d.o: $(srcdir)/screenhack.h
 t3d.o: ../config.h
-t3d.o: $(UTILS_SRC)/yarandom.h
-t3d.o: $(UTILS_SRC)/usleep.h
-t3d.o: $(UTILS_SRC)/resources.h
-t3d.o: $(UTILS_SRC)/hsv.h
-t3d.o: $(UTILS_SRC)/colors.h
-t3d.o: $(UTILS_SRC)/grabscreen.h
-t3d.o: $(UTILS_SRC)/visual.h
 penetrate.o: $(srcdir)/screenhack.h
 penetrate.o: ../config.h
-penetrate.o: $(UTILS_SRC)/yarandom.h
-penetrate.o: $(UTILS_SRC)/usleep.h
-penetrate.o: $(UTILS_SRC)/resources.h
-penetrate.o: $(UTILS_SRC)/hsv.h
-penetrate.o: $(UTILS_SRC)/colors.h
-penetrate.o: $(UTILS_SRC)/grabscreen.h
-penetrate.o: $(UTILS_SRC)/visual.h
 deluxe.o: $(srcdir)/screenhack.h
 deluxe.o: ../config.h
-deluxe.o: $(UTILS_SRC)/yarandom.h
-deluxe.o: $(UTILS_SRC)/usleep.h
-deluxe.o: $(UTILS_SRC)/resources.h
-deluxe.o: $(UTILS_SRC)/hsv.h
-deluxe.o: $(UTILS_SRC)/colors.h
-deluxe.o: $(UTILS_SRC)/grabscreen.h
-deluxe.o: $(UTILS_SRC)/visual.h
-deluxe.o: $(UTILS_SRC)/alpha.h
-deluxe.o: $(UTILS_SRC)/xdbe.h
 compass.o: $(srcdir)/screenhack.h
 compass.o: ../config.h
-compass.o: $(UTILS_SRC)/yarandom.h
-compass.o: $(UTILS_SRC)/usleep.h
-compass.o: $(UTILS_SRC)/resources.h
-compass.o: $(UTILS_SRC)/hsv.h
-compass.o: $(UTILS_SRC)/colors.h
-compass.o: $(UTILS_SRC)/grabscreen.h
-compass.o: $(UTILS_SRC)/visual.h
-compass.o: $(UTILS_SRC)/xdbe.h
 squiral.o: $(srcdir)/screenhack.h
 squiral.o: ../config.h
-squiral.o: $(UTILS_SRC)/yarandom.h
-squiral.o: $(UTILS_SRC)/usleep.h
-squiral.o: $(UTILS_SRC)/resources.h
-squiral.o: $(UTILS_SRC)/hsv.h
-squiral.o: $(UTILS_SRC)/colors.h
-squiral.o: $(UTILS_SRC)/grabscreen.h
-squiral.o: $(UTILS_SRC)/visual.h
-squiral.o: $(UTILS_SRC)/erase.h
 xflame.o: $(srcdir)/screenhack.h
 xflame.o: ../config.h
-xflame.o: $(UTILS_SRC)/yarandom.h
-xflame.o: $(UTILS_SRC)/usleep.h
-xflame.o: $(UTILS_SRC)/resources.h
-xflame.o: $(UTILS_SRC)/hsv.h
-xflame.o: $(UTILS_SRC)/colors.h
-xflame.o: $(UTILS_SRC)/grabscreen.h
-xflame.o: $(UTILS_SRC)/visual.h
-xflame.o: $(UTILS_SRC)/xshm.h
 xflame.o: $(srcdir)/images/bob.xbm
 wander.o: $(srcdir)/screenhack.h
 wander.o: ../config.h
-wander.o: $(UTILS_SRC)/yarandom.h
-wander.o: $(UTILS_SRC)/usleep.h
-wander.o: $(UTILS_SRC)/resources.h
-wander.o: $(UTILS_SRC)/hsv.h
-wander.o: $(UTILS_SRC)/colors.h
-wander.o: $(UTILS_SRC)/grabscreen.h
-wander.o: $(UTILS_SRC)/visual.h
-wander.o: $(UTILS_SRC)/erase.h
 spotlight.o: $(srcdir)/screenhack.h
 spotlight.o: ../config.h
-spotlight.o: $(UTILS_SRC)/yarandom.h
-spotlight.o: $(UTILS_SRC)/usleep.h
-spotlight.o: $(UTILS_SRC)/resources.h
-spotlight.o: $(UTILS_SRC)/hsv.h
-spotlight.o: $(UTILS_SRC)/colors.h
-spotlight.o: $(UTILS_SRC)/grabscreen.h
-spotlight.o: $(UTILS_SRC)/visual.h
 critical.o: $(srcdir)/screenhack.h
 critical.o: ../config.h
-critical.o: $(UTILS_SRC)/yarandom.h
-critical.o: $(UTILS_SRC)/usleep.h
-critical.o: $(UTILS_SRC)/resources.h
-critical.o: $(UTILS_SRC)/hsv.h
-critical.o: $(UTILS_SRC)/colors.h
-critical.o: $(UTILS_SRC)/grabscreen.h
-critical.o: $(UTILS_SRC)/visual.h
-critical.o: $(UTILS_SRC)/erase.h
 phosphor.o: $(srcdir)/screenhack.h
 phosphor.o: ../config.h
-phosphor.o: $(UTILS_SRC)/yarandom.h
-phosphor.o: $(UTILS_SRC)/usleep.h
-phosphor.o: $(UTILS_SRC)/resources.h
-phosphor.o: $(UTILS_SRC)/hsv.h
-phosphor.o: $(UTILS_SRC)/colors.h
-phosphor.o: $(UTILS_SRC)/grabscreen.h
-phosphor.o: $(UTILS_SRC)/visual.h
 xmatrix.o: $(srcdir)/screenhack.h
 xmatrix.o: ../config.h
-xmatrix.o: $(UTILS_SRC)/yarandom.h
-xmatrix.o: $(UTILS_SRC)/usleep.h
-xmatrix.o: $(UTILS_SRC)/resources.h
-xmatrix.o: $(UTILS_SRC)/hsv.h
-xmatrix.o: $(UTILS_SRC)/colors.h
-xmatrix.o: $(UTILS_SRC)/grabscreen.h
-xmatrix.o: $(UTILS_SRC)/visual.h
 xmatrix.o: $(srcdir)/images/matrix.xpm
 xmatrix.o: $(srcdir)/images/matrix2.xpm
 xmatrix.o: $(srcdir)/images/matrix.xbm
 xmatrix.o: $(srcdir)/images/matrix2.xbm
 petri.o: $(srcdir)/screenhack.h
 petri.o: ../config.h
-petri.o: $(UTILS_SRC)/yarandom.h
-petri.o: $(UTILS_SRC)/usleep.h
-petri.o: $(UTILS_SRC)/resources.h
-petri.o: $(UTILS_SRC)/hsv.h
-petri.o: $(UTILS_SRC)/colors.h
-petri.o: $(UTILS_SRC)/grabscreen.h
-petri.o: $(UTILS_SRC)/visual.h
-petri.o: $(UTILS_SRC)/spline.h
 shadebobs.o: $(srcdir)/screenhack.h
 shadebobs.o: ../config.h
-shadebobs.o: $(UTILS_SRC)/yarandom.h
-shadebobs.o: $(UTILS_SRC)/usleep.h
-shadebobs.o: $(UTILS_SRC)/resources.h
-shadebobs.o: $(UTILS_SRC)/hsv.h
-shadebobs.o: $(UTILS_SRC)/colors.h
-shadebobs.o: $(UTILS_SRC)/grabscreen.h
-shadebobs.o: $(UTILS_SRC)/visual.h
-xsublim.o: $(UTILS_SRC)/usleep.h
-xsublim.o: $(UTILS_SRC)/yarandom.h
-xsublim.o: $(UTILS_SRC)/resources.h
 ccurve.o: $(srcdir)/screenhack.h
 ccurve.o: ../config.h
-ccurve.o: $(UTILS_SRC)/yarandom.h
-ccurve.o: $(UTILS_SRC)/usleep.h
-ccurve.o: $(UTILS_SRC)/resources.h
-ccurve.o: $(UTILS_SRC)/hsv.h
-ccurve.o: $(UTILS_SRC)/colors.h
-ccurve.o: $(UTILS_SRC)/grabscreen.h
-ccurve.o: $(UTILS_SRC)/visual.h
-ccurve.o: $(UTILS_SRC)/erase.h
 blaster.o: $(srcdir)/screenhack.h
 blaster.o: ../config.h
-blaster.o: $(UTILS_SRC)/yarandom.h
-blaster.o: $(UTILS_SRC)/usleep.h
-blaster.o: $(UTILS_SRC)/resources.h
-blaster.o: $(UTILS_SRC)/hsv.h
-blaster.o: $(UTILS_SRC)/colors.h
-blaster.o: $(UTILS_SRC)/grabscreen.h
-blaster.o: $(UTILS_SRC)/visual.h
 bumps.o: $(srcdir)/bumps.h
 bumps.o: $(srcdir)/screenhack.h
 bumps.o: ../config.h
-bumps.o: $(UTILS_SRC)/yarandom.h
-bumps.o: $(UTILS_SRC)/usleep.h
-bumps.o: $(UTILS_SRC)/resources.h
-bumps.o: $(UTILS_SRC)/hsv.h
-bumps.o: $(UTILS_SRC)/colors.h
-bumps.o: $(UTILS_SRC)/grabscreen.h
-bumps.o: $(UTILS_SRC)/visual.h
 ripples.o: $(srcdir)/screenhack.h
 ripples.o: ../config.h
-ripples.o: $(UTILS_SRC)/yarandom.h
-ripples.o: $(UTILS_SRC)/usleep.h
-ripples.o: $(UTILS_SRC)/resources.h
-ripples.o: $(UTILS_SRC)/hsv.h
-ripples.o: $(UTILS_SRC)/colors.h
-ripples.o: $(UTILS_SRC)/grabscreen.h
-ripples.o: $(UTILS_SRC)/visual.h
-ripples.o: $(UTILS_SRC)/xshm.h
 xteevee.o: $(srcdir)/screenhack.h
 xteevee.o: ../config.h
-xteevee.o: $(UTILS_SRC)/yarandom.h
-xteevee.o: $(UTILS_SRC)/usleep.h
-xteevee.o: $(UTILS_SRC)/resources.h
-xteevee.o: $(UTILS_SRC)/hsv.h
-xteevee.o: $(UTILS_SRC)/colors.h
-xteevee.o: $(UTILS_SRC)/grabscreen.h
-xteevee.o: $(UTILS_SRC)/visual.h
 xspirograph.o: $(srcdir)/screenhack.h
 xspirograph.o: ../config.h
-xspirograph.o: $(UTILS_SRC)/yarandom.h
-xspirograph.o: $(UTILS_SRC)/usleep.h
-xspirograph.o: $(UTILS_SRC)/resources.h
-xspirograph.o: $(UTILS_SRC)/hsv.h
-xspirograph.o: $(UTILS_SRC)/colors.h
-xspirograph.o: $(UTILS_SRC)/grabscreen.h
-xspirograph.o: $(UTILS_SRC)/visual.h
-xspirograph.o: $(UTILS_SRC)/erase.h
 nerverot.o: $(srcdir)/screenhack.h
 nerverot.o: ../config.h
-nerverot.o: $(UTILS_SRC)/yarandom.h
-nerverot.o: $(UTILS_SRC)/usleep.h
-nerverot.o: $(UTILS_SRC)/resources.h
-nerverot.o: $(UTILS_SRC)/hsv.h
-nerverot.o: $(UTILS_SRC)/colors.h
-nerverot.o: $(UTILS_SRC)/grabscreen.h
-nerverot.o: $(UTILS_SRC)/visual.h
 xrayswarm.o: $(srcdir)/screenhack.h
 xrayswarm.o: ../config.h
-xrayswarm.o: $(UTILS_SRC)/yarandom.h
-xrayswarm.o: $(UTILS_SRC)/usleep.h
-xrayswarm.o: $(UTILS_SRC)/resources.h
-xrayswarm.o: $(UTILS_SRC)/hsv.h
-xrayswarm.o: $(UTILS_SRC)/colors.h
-xrayswarm.o: $(UTILS_SRC)/grabscreen.h
-xrayswarm.o: $(UTILS_SRC)/visual.h
 hyperball.o: $(srcdir)/screenhack.h
 hyperball.o: ../config.h
-hyperball.o: $(UTILS_SRC)/yarandom.h
-hyperball.o: $(UTILS_SRC)/usleep.h
-hyperball.o: $(UTILS_SRC)/resources.h
-hyperball.o: $(UTILS_SRC)/hsv.h
-hyperball.o: $(UTILS_SRC)/colors.h
-hyperball.o: $(UTILS_SRC)/grabscreen.h
-hyperball.o: $(UTILS_SRC)/visual.h
 zoom.o: $(srcdir)/screenhack.h
 zoom.o: ../config.h
-zoom.o: $(UTILS_SRC)/yarandom.h
-zoom.o: $(UTILS_SRC)/usleep.h
-zoom.o: $(UTILS_SRC)/resources.h
-zoom.o: $(UTILS_SRC)/hsv.h
-zoom.o: $(UTILS_SRC)/colors.h
-zoom.o: $(UTILS_SRC)/grabscreen.h
-zoom.o: $(UTILS_SRC)/visual.h
 whirlwindwarp.o: $(srcdir)/screenhack.h
 whirlwindwarp.o: ../config.h
-whirlwindwarp.o: $(UTILS_SRC)/yarandom.h
-whirlwindwarp.o: $(UTILS_SRC)/usleep.h
-whirlwindwarp.o: $(UTILS_SRC)/resources.h
-whirlwindwarp.o: $(UTILS_SRC)/hsv.h
-whirlwindwarp.o: $(UTILS_SRC)/colors.h
-whirlwindwarp.o: $(UTILS_SRC)/grabscreen.h
-whirlwindwarp.o: $(UTILS_SRC)/visual.h
-whirlwindwarp.o: $(UTILS_SRC)/erase.h
 rotzoomer.o: $(srcdir)/screenhack.h
 rotzoomer.o: ../config.h
-rotzoomer.o: $(UTILS_SRC)/yarandom.h
-rotzoomer.o: $(UTILS_SRC)/usleep.h
-rotzoomer.o: $(UTILS_SRC)/resources.h
-rotzoomer.o: $(UTILS_SRC)/hsv.h
-rotzoomer.o: $(UTILS_SRC)/colors.h
-rotzoomer.o: $(UTILS_SRC)/grabscreen.h
-rotzoomer.o: $(UTILS_SRC)/visual.h
-rotzoomer.o: $(UTILS_SRC)/xshm.h
 
index f374666ee8b876a48fb79f1c9429d86ace79218e..0d2b9fbbbee17538f036857d45b8422f18539d84 100644 (file)
@@ -3,7 +3,10 @@
 blitspin - rotate a bitmap in an interesting way
 .SH SYNOPSIS
 .B blitspin
-[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-bitmap \fIfilename\fP] [\-delay \fIusecs\fP] [\-delay2 \fIusecs\fP]
+[\-display \fIhost:display.screen\fP]
+[\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root]
+[\-mono] [\-install] [\-visual \fIvisual\fP] [\-bitmap \fIfilename\fP]
+[\-delay \fIusecs\fP] [\-delay2 \fIusecs\fP]
 .SH DESCRIPTION
 The \fIblitspin\fP program repeatedly rotates a bitmap by 90 degrees by
 using logical operations: the bitmap is divided into quadrants, and the
@@ -46,8 +49,13 @@ name is not a fully-qualified pathname.
 .TP 8
 .B \-grab\-screen
 If this option is specified, then the image which is spun will be grabbed
-from the portion of the screen underlying the blitspin window.  (Or, it
-may come from an external video source: see below.)
+from the portion of the screen underlying the blitspin window, or from
+the system's video input, or from a random file on disk, as indicated by
+the \fIgrabDesktopImages\fP, \fIgrabVideoFrames\fP, 
+and \fIchooseRandomImages\fP options in the \fI~/.xscreensaver\fP file;
+see
+.BR xscreensaver-demo (1)
+for more details.
 .PP
 .TP 8
 .B \-delay \fImicroseconds\fP
@@ -60,39 +68,17 @@ How long to delay between each 90-degree rotation, in microseconds.
 Default is 500000, one-half second.
 .B DISPLAY
 to get the default host and display number.
-.SH RESOURCES
-On some systems (currently, only SGIs), this program can, instead of grabbing
-a desktop image, grab a frame of video from an external camera and manipulate
-that instead.  The following resources control that.
-.PP
-.TP 8
-.B grabVideoProbability \fR(Float)\fP
-What portion of the time to grab video rather than a screen image, 
-between 0.0 and 1.0.  Defaults to 0.5, or half the time.
-.TP 8
-.B videoDevice \fR(Integer)\fP
-The number of the default video input device to check first.  If unspecified, 
-the default camera (from videopanel(1)) will be checked first.  After that, all
-other available video input devices will be checked in order.  
-
-The first one which produces a non-black image will be used.  If all images
-are black, the others will be re-checked a few times before giving up and
-falling back to simply grabbing a desktop image (but note that this takes a
-few seconds, so if you don't actually have any video sources hooked up, you
-should consider turning off video grabbing by setting
-\fBgrabVideoProbability\fP to 0.0.)
-.TP 8
-.B videoGain \fR(Float)\fP
-The amount by which to brighten the grabbed image.  This defaults to 2.2.
 .SH ENVIRONMENT
 .B XENVIRONMENT
 to get the name of a resource file that overrides the global resources
 stored in the RESOURCE_MANAGER property.
 .SH SEE ALSO
 .BR X (1),
-.BR xscreensaver (1)
+.BR xscreensaver (1),
+.BR xscreensaver-demo (1),
+.BR xscreensaver-getimage (1)
 .SH COPYRIGHT
-Copyright \(co 1992, 1993, 1997 by Jamie Zawinski.
+Copyright \(co 1992, 1993, 1997, 2001 by Jamie Zawinski.
 Permission to use, copy, modify, distribute, and sell this software and its
 documentation for any purpose is hereby granted without fee, provided that
 the above copyright notice appear in all copies and that both that copyright
index 219bffc6bb8ed66f04ab7a56d15eaaad1e7d9d2e..d5601ec789564f551b7b40dfc0ae3b8dc5d01e17 100644 (file)
@@ -53,6 +53,9 @@ char *defaults [] = {
   "*delay:             50000",
   "*soften:            1",
   "*invert:            FALSE",
+#ifdef __sgi    /* really, HAVE_READ_DISPLAY_EXTENSION */
+   "*visualID:         Best",
+#endif
   0
 };
 
diff --git a/hacks/bumps.man b/hacks/bumps.man
new file mode 100644 (file)
index 0000000..35f6814
--- /dev/null
@@ -0,0 +1,69 @@
+.TH XScreenSaver 1 "05-Apr-1999" "X Version 11"
+.SH NAME
+bumps - move distorting spotlight around desktop
+.SH SYNOPSIS
+.B bumps
+[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP]
+[\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install]
+[\-visual \fIvisual\fP] [\-delay \fIusecs\fP] [\-radius \fIpixels\fP]
+.SH DESCRIPTION
+The \fIbumps\fP program takes an image and exposes small, distorted
+sections of it as if through an odd wandering spotlight beam.
+
+The image that it manipulates will be grabbed from the portion of
+the screen underlying the window, or from the system's video input,
+or from a random file on disk, as indicated by
+the \fIgrabDesktopImages\fP, \fIgrabVideoFrames\fP,
+and \fIchooseRandomImages\fP options in the \fI~/.xscreensaver\fP
+file; see
+.BR xscreensaver-demo (1)
+for more details.
+.SH OPTIONS
+.I bumps
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window.  This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-mono 
+If on a color display, pretend we're on a monochrome display.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use.  Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-delay \fImicroseconds\fP
+Slow it down.
+.TP 8
+.B \-radius \fIpixels\fP
+Radius of the spotlight in pixels.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1),
+.BR xscreensaver\-demo (1),
+.BR xscreensaver\-getimage (1)
+.SH COPYRIGHT
+Copyright \(co 1999 by Shane Smit.  Permission to use, copy, modify, 
+distribute, and sell this software and its documentation for any purpose is 
+hereby granted without fee, provided that the above copyright notice appear 
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation.  No representations are made about the 
+suitability of this software for any purpose.  It is provided "as is" without
+express or implied warranty.
+.SH CREDITS
+Shane Smit <blackend@inconnect.com>, 8-Oct-1999.
index 8dc0a0e7aaee8e820e64f4c005049b644fe643c8..8f1aea7c128f458a5cc6248b0356a609aea7c2a2 100644 (file)
@@ -3,10 +3,20 @@
 decayscreen - make a screen meltdown.
 .SH SYNOPSIS
 .B decayscreen
-[\-display \fIhost:display.screen\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-delay \fIusecs\fP] [\-mode \fImode\fP]
+[\-display \fIhost:display.screen\fP] [\-window] [\-root] [\-mono] [\-install]
+[\-visual \fIvisual\fP] [\-delay \fIusecs\fP] [\-mode \fImode\fP]
 .SH DESCRIPTION
 The \fIdecayscreen\fP program creates a melting effect by randomly
 shifting rectangles around the screen.
+
+The image that it manipulates will be grabbed from the portion of
+the screen underlying the window, or from the system's video input, 
+or from a random file on disk, as indicated by 
+the \fIgrabDesktopImages\fP, \fIgrabVideoFrames\fP, 
+and \fIchooseRandomImages\fP options in the \fI~/.xscreensaver\fP
+file; see
+.BR xscreensaver-demo (1)
+for more details.
 .SH OPTIONS
 .I decayscreen
 accepts the following options:
@@ -36,32 +46,8 @@ The direction in which the image should tend to slide.  Legal values are
 \fIdown\fP, \fIupleft\fP, \fIdownleft\fP, \fIupright\fP, \fIdownright\fP, 
 \fIshuffle\fP (meaning perfer no particular direction), \fIin\fP (meaning
 move things toward the center), \fIout\fP (meaning move things away
-from the center), \fImelt\fP (meaning melt straight downward), and \fIstretch\fP 
-(meaning stretch the screen downward).
-.SH RESOURCES
-On some systems (currently, only SGIs), this program can, instead of grabbing
-a desktop image, grab a frame of video from an external camera and manipulate
-that instead.  The following resources control that.
-.PP
-.TP 8
-.B grabVideoProbability \fR(Float)\fP
-What portion of the time to grab video rather than a screen image, 
-between 0.0 and 1.0.  Defaults to 0.5, or half the time.
-.TP 8
-.B videoDevice \fR(Integer)\fP
-The number of the default video input device to check first.  If unspecified, 
-the default camera (from videopanel(1)) will be checked first.  After that, all
-other available video input devices will be checked in order.  
-
-The first one which produces a non-black image will be used.  If all images
-are black, the others will be re-checked a few times before giving up and
-falling back to simply grabbing a desktop image (but note that this takes a
-few seconds, so if you don't actually have any video sources hooked up, you
-should consider turning off video grabbing by setting
-\fBgrabVideoProbability\fP to 0.0.)
-.TP 8
-.B videoGain \fR(Float)\fP
-The amount by which to brighten the grabbed image.  This defaults to 2.2.
+from the center), \fImelt\fP (meaning melt straight downward), 
+and \fIstretch\fP (meaning stretch the screen downward).
 .SH ENVIRONMENT
 .PP
 .TP 8
@@ -72,8 +58,10 @@ to get the default host and display number.
 to get the name of a resource file that overrides the global resources
 stored in the RESOURCE_MANAGER property.
 .SH "SEE ALSO"
-X(1),
-xscreensaver(1)
+.BR X (1),
+.BR xscreensaver (1),
+.BR xscreensaver\-demo (1),
+.BR xscreensaver\-getimage (1)
 .SH COPYRIGHT
 Copyright 1992 by Vivek Khera.  Permission to use, copy, modify, distribute, 
 and sell this software and its documentation for any purpose is hereby granted
@@ -84,5 +72,5 @@ of this software for any purpose.  It is provided "as is" without express or
 implied warranty.
 .SH AUTHOR
 Vivek Khera <khera@cs.duke.edu>, 05-Aug-93; based on code by David Wald, 1988.
-Modified by jwz, 28-Nov-97.  Modified by Rick Schultz <rick@skapunx.net> 05-Apr-1999.
-
+Modified by jwz, 28-Nov-97.  
+Modified by Rick Schultz <rick@skapunx.net> 05-Apr-1999.
index 92facfc38d8ecc4dbf9cdc485e8fed172ae1447c..178febd311035b3cdde2557afaef0f0e8310a1fb 100644 (file)
@@ -3,12 +3,24 @@
 distort \- distort the content of the screen in interesting ways
 .SH SYNOPSIS
 .B distort
-[\-root] [\-window] [\-mono] [\-install] [\-noinstall] [\-visual \fIvisual\fP] [\-window\-id \fIwindow\-id\fP] [\-delay \fIusecs\fP] [\-radius \fIpixels\fP] [\-speed \fIint\fP] [\-number \fIint\fP] [\-swamp] [\-bounce] [\-reflect] [\-vortex] [\-magnify] [\-blackhole] [\-slow] [\-shm] [\-no\-shm]
+[\-root] [\-window] [\-mono] [\-install] [\-noinstall] [\-visual \fIvisual\fP]
+[\-window\-id \fIwindow\-id\fP] [\-delay \fIusecs\fP] [\-radius \fIpixels\fP]
+[\-speed \fIint\fP] [\-number \fIint\fP] [\-swamp] [\-bounce] [\-reflect]
+[\-vortex] [\-magnify] [\-blackhole] [\-slow] [\-shm] [\-no\-shm]
 .SH DESCRIPTION
-The \fIdistort\fP program lets circular zones of distortion wander
-randomly around its window, apparently distorting what is under them
-due to the window's pseudo-transparency. The mode of distortion and
-the overall behaviour of the zones can be influenced in various ways.
+The \fIdistort\fP program takes an image and lets circular zones of
+distortion wander randomly around it, distorting what is under them.
+The mode of distortion and the overall behaviour of the zones can be
+influenced in various ways.
+
+The image that it manipulates will be grabbed from the portion of
+the screen underlying the window, or from the system's video input,
+or from a random file on disk, as indicated by
+the \fIgrabDesktopImages\fP, \fIgrabVideoFrames\fP,
+and \fIchooseRandomImages\fP options in the \fI~/.xscreensaver\fP
+file; see
+.BR xscreensaver-demo (1)
+for more details.
 .SH OPTIONS
 .I distort
 accepts the following options:
@@ -88,7 +100,9 @@ to get the name of a resource file that overrides the global resources
 stored in the RESOURCE_MANAGER property.
 .SH SEE ALSO
 .BR X (1),
-.BR xscreensaver (1)
+.BR xscreensaver (1),
+.BR xscreensaver\-demo (1),
+.BR xscreensaver\-getimage (1)
 .SH COPYRIGHT
 Copyright \(co 1998 by Jonas Munsin and Jamie Zawinski.  Permission to use, 
 copy, modify, distribute, and sell this software and its documentation for
index 06b84f7884a33a714801900254ba738cff00440d..650894822935a922fa1db0bfcfa9367266164cb0 100644 (file)
@@ -38,11 +38,12 @@ X_CFLAGS    = @X_CFLAGS@
 X_LIBS         = @X_LIBS@
 X_PRE_LIBS     = @X_PRE_LIBS@
 X_EXTRA_LIBS   = @X_EXTRA_LIBS@
+XMU_LIBS       = @XMU_LIBS@
 
 # Note: see comment in ../../driver/Makefile.in for explanation of X_LIBS, etc.
 #
 HACK_PRE       = $(LIBS) $(X_LIBS)
-HACK_POST      = $(X_PRE_LIBS) -lXt -lX11 -lXext $(X_EXTRA_LIBS) -lm
+HACK_POST     = $(X_PRE_LIBS) -lXt -lX11 $(XMU_LIBS) -lXext $(X_EXTRA_LIBS) -lm
 HACK_POST2     = @GL_LIBS@ @HACK_LIBS@ $(HACK_POST)
 HACK_LIBS      = $(HACK_PRE)                       $(HACK_POST2)
 XPM_LIBS       = $(HACK_PRE)            @XPM_LIBS@ $(HACK_POST2)
@@ -53,7 +54,7 @@ HACK_BIN      = ..
 UTILS_SRC      = $(HACK_SRC)/../utils
 UTILS_BIN      = $(HACK_BIN)/../utils
 
-INCLUDES       = -I$(srcdir) -I$(UTILS_SRC) -I$(HACK_SRC) -I../.. @INCLUDES@
+INCLUDES       = -I. -I$(srcdir) -I$(UTILS_SRC) -I$(HACK_SRC) -I../.. @INCLUDES@
 
 UTIL_SRCS      = $(UTILS_SRC)/colors.c $(UTILS_SRC)/hsv.c \
                  $(UTILS_SRC)/resources.c $(UTILS_SRC)/usleep.c \
@@ -282,9 +283,9 @@ screenhack-gl.o: $(HACK_SRC)/screenhack.c
 
 CC_HACK                = $(CC) $(LDFLAGS)
 
-atlantis:      atlantis.o      $(HACK_OBJS) dolphin.o shark.o swim.o whale.o
-       $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) dolphin.o shark.o swim.o whale.o \
-                               $(HACK_LIBS)
+ATLANTIS_OBJS = $(HACK_OBJS) dolphin.o shark.o swim.o whale.o xpm-ximage.o
+atlantis:      atlantis.o      $(ATLANTIS_OBJS)
+       $(CC_HACK) -o $@ $@.o   $(ATLANTIS_OBJS) $(HACK_LIBS) $(XPM_LIBS)
 
 cage:          cage.o          $(HACK_OBJS)
        $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(HACK_LIBS)
@@ -379,163 +380,34 @@ molecule:        molecule.o      sphere.o tube.o $(HACK_OBJS)
 # DO NOT DELETE: updated by make distdepend
 # $(srcdir)/DO $(srcdir)/NOT $(srcdir)/DELETE: $(srcdir)/updated $(srcdir)/by $(srcdir)/make $(srcdir)/distdepend
 
-xscreensaver-gl-helper.o: $(UTILS_SRC)/utils.h
 xscreensaver-gl-helper.o: ../../config.h
-xscreensaver-gl-helper.o: $(UTILS_SRC)/visual.h
-atlantis.o: $(HACK_SRC)/xlockmore.h
 atlantis.o: ../../config.h
-atlantis.o: $(HACK_SRC)/xlockmoreI.h
-atlantis.o: $(HACK_SRC)/screenhack.h
-atlantis.o: $(UTILS_SRC)/yarandom.h
-atlantis.o: $(UTILS_SRC)/usleep.h
-atlantis.o: $(UTILS_SRC)/resources.h
-atlantis.o: $(UTILS_SRC)/hsv.h
-atlantis.o: $(UTILS_SRC)/colors.h
-atlantis.o: $(UTILS_SRC)/grabscreen.h
-atlantis.o: $(UTILS_SRC)/visual.h
-atlantis.o: $(UTILS_SRC)/xshm.h
 atlantis.o: $(srcdir)/atlantis.h
+atlantis.o: $(srcdir)/xpm-ximage.h
+atlantis.o: $(HACK_SRC)/images/sea-texture.xpm
 b_draw.o: $(srcdir)/bubble3d.h
-b_draw.o: $(HACK_SRC)/xlockmoreI.h
-b_draw.o: $(HACK_SRC)/screenhack.h
 b_draw.o: ../../config.h
-b_draw.o: $(UTILS_SRC)/yarandom.h
-b_draw.o: $(UTILS_SRC)/usleep.h
-b_draw.o: $(UTILS_SRC)/resources.h
-b_draw.o: $(UTILS_SRC)/hsv.h
-b_draw.o: $(UTILS_SRC)/colors.h
-b_draw.o: $(UTILS_SRC)/grabscreen.h
-b_draw.o: $(UTILS_SRC)/visual.h
-b_draw.o: $(UTILS_SRC)/xshm.h
 b_lockglue.o: $(srcdir)/bubble3d.h
-b_lockglue.o: $(HACK_SRC)/xlockmoreI.h
-b_lockglue.o: $(HACK_SRC)/screenhack.h
 b_lockglue.o: ../../config.h
-b_lockglue.o: $(UTILS_SRC)/yarandom.h
-b_lockglue.o: $(UTILS_SRC)/usleep.h
-b_lockglue.o: $(UTILS_SRC)/resources.h
-b_lockglue.o: $(UTILS_SRC)/hsv.h
-b_lockglue.o: $(UTILS_SRC)/colors.h
-b_lockglue.o: $(UTILS_SRC)/grabscreen.h
-b_lockglue.o: $(UTILS_SRC)/visual.h
-b_lockglue.o: $(UTILS_SRC)/xshm.h
-b_lockglue.o: $(HACK_SRC)/xlockmore.h
 b_sphere.o: $(srcdir)/bubble3d.h
-b_sphere.o: $(HACK_SRC)/xlockmoreI.h
-b_sphere.o: $(HACK_SRC)/screenhack.h
 b_sphere.o: ../../config.h
-b_sphere.o: $(UTILS_SRC)/yarandom.h
-b_sphere.o: $(UTILS_SRC)/usleep.h
-b_sphere.o: $(UTILS_SRC)/resources.h
-b_sphere.o: $(UTILS_SRC)/hsv.h
-b_sphere.o: $(UTILS_SRC)/colors.h
-b_sphere.o: $(UTILS_SRC)/grabscreen.h
-b_sphere.o: $(UTILS_SRC)/visual.h
-b_sphere.o: $(UTILS_SRC)/xshm.h
 bubble3d.o: $(srcdir)/bubble3d.h
-bubble3d.o: $(HACK_SRC)/xlockmoreI.h
-bubble3d.o: $(HACK_SRC)/screenhack.h
 bubble3d.o: ../../config.h
-bubble3d.o: $(UTILS_SRC)/yarandom.h
-bubble3d.o: $(UTILS_SRC)/usleep.h
-bubble3d.o: $(UTILS_SRC)/resources.h
-bubble3d.o: $(UTILS_SRC)/hsv.h
-bubble3d.o: $(UTILS_SRC)/colors.h
-bubble3d.o: $(UTILS_SRC)/grabscreen.h
-bubble3d.o: $(UTILS_SRC)/visual.h
-bubble3d.o: $(UTILS_SRC)/xshm.h
 buildlwo.o: $(srcdir)/buildlwo.h
-cage.o: $(HACK_SRC)/xlockmore.h
 cage.o: ../../config.h
-cage.o: $(HACK_SRC)/xlockmoreI.h
-cage.o: $(HACK_SRC)/screenhack.h
-cage.o: $(UTILS_SRC)/yarandom.h
-cage.o: $(UTILS_SRC)/usleep.h
-cage.o: $(UTILS_SRC)/resources.h
-cage.o: $(UTILS_SRC)/hsv.h
-cage.o: $(UTILS_SRC)/colors.h
-cage.o: $(UTILS_SRC)/grabscreen.h
-cage.o: $(UTILS_SRC)/visual.h
-cage.o: $(UTILS_SRC)/xshm.h
 cage.o: $(srcdir)/e_textures.h
 dolphin.o: $(srcdir)/atlantis.h
-gears.o: $(HACK_SRC)/xlockmore.h
 gears.o: ../../config.h
-gears.o: $(HACK_SRC)/xlockmoreI.h
-gears.o: $(HACK_SRC)/screenhack.h
-gears.o: $(UTILS_SRC)/yarandom.h
-gears.o: $(UTILS_SRC)/usleep.h
-gears.o: $(UTILS_SRC)/resources.h
-gears.o: $(UTILS_SRC)/hsv.h
-gears.o: $(UTILS_SRC)/colors.h
-gears.o: $(UTILS_SRC)/grabscreen.h
-gears.o: $(UTILS_SRC)/visual.h
-gears.o: $(UTILS_SRC)/xshm.h
-lament.o: $(HACK_SRC)/xlockmore.h
 lament.o: ../../config.h
-lament.o: $(HACK_SRC)/xlockmoreI.h
-lament.o: $(HACK_SRC)/screenhack.h
-lament.o: $(UTILS_SRC)/yarandom.h
-lament.o: $(UTILS_SRC)/usleep.h
-lament.o: $(UTILS_SRC)/resources.h
-lament.o: $(UTILS_SRC)/hsv.h
-lament.o: $(UTILS_SRC)/colors.h
-lament.o: $(UTILS_SRC)/grabscreen.h
-lament.o: $(UTILS_SRC)/visual.h
-lament.o: $(UTILS_SRC)/xshm.h
 lament.o: $(srcdir)/xpm-ximage.h
 lament.o: $(HACK_SRC)/images/lament.xpm
-moebius.o: $(HACK_SRC)/xlockmore.h
 moebius.o: ../../config.h
-moebius.o: $(HACK_SRC)/xlockmoreI.h
-moebius.o: $(HACK_SRC)/screenhack.h
-moebius.o: $(UTILS_SRC)/yarandom.h
-moebius.o: $(UTILS_SRC)/usleep.h
-moebius.o: $(UTILS_SRC)/resources.h
-moebius.o: $(UTILS_SRC)/hsv.h
-moebius.o: $(UTILS_SRC)/colors.h
-moebius.o: $(UTILS_SRC)/grabscreen.h
-moebius.o: $(UTILS_SRC)/visual.h
-moebius.o: $(UTILS_SRC)/xshm.h
 moebius.o: $(srcdir)/e_textures.h
-morph3d.o: $(HACK_SRC)/xlockmore.h
 morph3d.o: ../../config.h
-morph3d.o: $(HACK_SRC)/xlockmoreI.h
-morph3d.o: $(HACK_SRC)/screenhack.h
-morph3d.o: $(UTILS_SRC)/yarandom.h
-morph3d.o: $(UTILS_SRC)/usleep.h
-morph3d.o: $(UTILS_SRC)/resources.h
-morph3d.o: $(UTILS_SRC)/hsv.h
-morph3d.o: $(UTILS_SRC)/colors.h
-morph3d.o: $(UTILS_SRC)/grabscreen.h
-morph3d.o: $(UTILS_SRC)/visual.h
-morph3d.o: $(UTILS_SRC)/xshm.h
 pipeobjs.o: $(srcdir)/buildlwo.h
-pipes.o: $(HACK_SRC)/xlockmore.h
 pipes.o: ../../config.h
-pipes.o: $(HACK_SRC)/xlockmoreI.h
-pipes.o: $(HACK_SRC)/screenhack.h
-pipes.o: $(UTILS_SRC)/yarandom.h
-pipes.o: $(UTILS_SRC)/usleep.h
-pipes.o: $(UTILS_SRC)/resources.h
-pipes.o: $(UTILS_SRC)/hsv.h
-pipes.o: $(UTILS_SRC)/colors.h
-pipes.o: $(UTILS_SRC)/grabscreen.h
-pipes.o: $(UTILS_SRC)/visual.h
-pipes.o: $(UTILS_SRC)/xshm.h
 pipes.o: $(srcdir)/buildlwo.h
-rubik.o: $(HACK_SRC)/xlockmore.h
 rubik.o: ../../config.h
-rubik.o: $(HACK_SRC)/xlockmoreI.h
-rubik.o: $(HACK_SRC)/screenhack.h
-rubik.o: $(UTILS_SRC)/yarandom.h
-rubik.o: $(UTILS_SRC)/usleep.h
-rubik.o: $(UTILS_SRC)/resources.h
-rubik.o: $(UTILS_SRC)/hsv.h
-rubik.o: $(UTILS_SRC)/colors.h
-rubik.o: $(UTILS_SRC)/grabscreen.h
-rubik.o: $(UTILS_SRC)/visual.h
-rubik.o: $(UTILS_SRC)/xshm.h
 s1_1.o: $(srcdir)/buildlwo.h
 s1_2.o: $(srcdir)/buildlwo.h
 s1_3.o: $(srcdir)/buildlwo.h
@@ -544,130 +416,24 @@ s1_5.o: $(srcdir)/buildlwo.h
 s1_6.o: $(srcdir)/buildlwo.h
 s1_b.o: $(srcdir)/buildlwo.h
 shark.o: $(srcdir)/atlantis.h
-sproingies.o: $(HACK_SRC)/xlockmoreI.h
-sproingies.o: $(HACK_SRC)/screenhack.h
 sproingies.o: ../../config.h
-sproingies.o: $(UTILS_SRC)/yarandom.h
-sproingies.o: $(UTILS_SRC)/usleep.h
-sproingies.o: $(UTILS_SRC)/resources.h
-sproingies.o: $(UTILS_SRC)/hsv.h
-sproingies.o: $(UTILS_SRC)/colors.h
-sproingies.o: $(UTILS_SRC)/grabscreen.h
-sproingies.o: $(UTILS_SRC)/visual.h
-sproingies.o: $(UTILS_SRC)/xshm.h
 sproingies.o: $(srcdir)/buildlwo.h
-sproingiewrap.o: $(HACK_SRC)/xlockmore.h
 sproingiewrap.o: ../../config.h
-sproingiewrap.o: $(HACK_SRC)/xlockmoreI.h
-sproingiewrap.o: $(HACK_SRC)/screenhack.h
-sproingiewrap.o: $(UTILS_SRC)/yarandom.h
-sproingiewrap.o: $(UTILS_SRC)/usleep.h
-sproingiewrap.o: $(UTILS_SRC)/resources.h
-sproingiewrap.o: $(UTILS_SRC)/hsv.h
-sproingiewrap.o: $(UTILS_SRC)/colors.h
-sproingiewrap.o: $(UTILS_SRC)/grabscreen.h
-sproingiewrap.o: $(UTILS_SRC)/visual.h
-sproingiewrap.o: $(UTILS_SRC)/xshm.h
-stairs.o: $(HACK_SRC)/xlockmore.h
 stairs.o: ../../config.h
-stairs.o: $(HACK_SRC)/xlockmoreI.h
-stairs.o: $(HACK_SRC)/screenhack.h
-stairs.o: $(UTILS_SRC)/yarandom.h
-stairs.o: $(UTILS_SRC)/usleep.h
-stairs.o: $(UTILS_SRC)/resources.h
-stairs.o: $(UTILS_SRC)/hsv.h
-stairs.o: $(UTILS_SRC)/colors.h
-stairs.o: $(UTILS_SRC)/grabscreen.h
-stairs.o: $(UTILS_SRC)/visual.h
-stairs.o: $(UTILS_SRC)/xshm.h
 stairs.o: $(srcdir)/e_textures.h
-superquadrics.o: $(HACK_SRC)/xlockmore.h
 superquadrics.o: ../../config.h
-superquadrics.o: $(HACK_SRC)/xlockmoreI.h
-superquadrics.o: $(HACK_SRC)/screenhack.h
-superquadrics.o: $(UTILS_SRC)/yarandom.h
-superquadrics.o: $(UTILS_SRC)/usleep.h
-superquadrics.o: $(UTILS_SRC)/resources.h
-superquadrics.o: $(UTILS_SRC)/hsv.h
-superquadrics.o: $(UTILS_SRC)/colors.h
-superquadrics.o: $(UTILS_SRC)/grabscreen.h
-superquadrics.o: $(UTILS_SRC)/visual.h
-superquadrics.o: $(UTILS_SRC)/xshm.h
-swim.o: $(HACK_SRC)/xlockmoreI.h
-swim.o: $(HACK_SRC)/screenhack.h
 swim.o: ../../config.h
-swim.o: $(UTILS_SRC)/yarandom.h
-swim.o: $(UTILS_SRC)/usleep.h
-swim.o: $(UTILS_SRC)/resources.h
-swim.o: $(UTILS_SRC)/hsv.h
-swim.o: $(UTILS_SRC)/colors.h
-swim.o: $(UTILS_SRC)/grabscreen.h
-swim.o: $(UTILS_SRC)/visual.h
-swim.o: $(UTILS_SRC)/xshm.h
 swim.o: $(srcdir)/atlantis.h
 whale.o: $(srcdir)/atlantis.h
-xlock-gl.o: $(HACK_SRC)/screenhack.h
 xlock-gl.o: ../../config.h
-xlock-gl.o: $(UTILS_SRC)/yarandom.h
-xlock-gl.o: $(UTILS_SRC)/usleep.h
-xlock-gl.o: $(UTILS_SRC)/resources.h
-xlock-gl.o: $(UTILS_SRC)/hsv.h
-xlock-gl.o: $(UTILS_SRC)/colors.h
-xlock-gl.o: $(UTILS_SRC)/grabscreen.h
-xlock-gl.o: $(UTILS_SRC)/visual.h
-xlock-gl.o: $(HACK_SRC)/xlockmoreI.h
-xlock-gl.o: $(UTILS_SRC)/xshm.h
 fps.o: ../../config.h
-fps.o: $(HACK_SRC)/screenhack.h
-fps.o: $(UTILS_SRC)/yarandom.h
-fps.o: $(UTILS_SRC)/usleep.h
-fps.o: $(UTILS_SRC)/resources.h
-fps.o: $(UTILS_SRC)/hsv.h
-fps.o: $(UTILS_SRC)/colors.h
-fps.o: $(UTILS_SRC)/grabscreen.h
-fps.o: $(UTILS_SRC)/visual.h
-fps.o: $(HACK_SRC)/xlockmoreI.h
-fps.o: $(UTILS_SRC)/xshm.h
 xpm-ximage.o: ../../config.h
-glplanet.o: $(HACK_SRC)/xlockmore.h
 glplanet.o: ../../config.h
-glplanet.o: $(HACK_SRC)/xlockmoreI.h
-glplanet.o: $(HACK_SRC)/screenhack.h
-glplanet.o: $(UTILS_SRC)/yarandom.h
-glplanet.o: $(UTILS_SRC)/usleep.h
-glplanet.o: $(UTILS_SRC)/resources.h
-glplanet.o: $(UTILS_SRC)/hsv.h
-glplanet.o: $(UTILS_SRC)/colors.h
-glplanet.o: $(UTILS_SRC)/grabscreen.h
-glplanet.o: $(UTILS_SRC)/visual.h
-glplanet.o: $(UTILS_SRC)/xshm.h
 glplanet.o: $(srcdir)/sphere.h
 glplanet.o: $(HACK_SRC)/images/earth.xbm
 glplanet.o: $(srcdir)/xpm-ximage.h
-pulsar.o: $(HACK_SRC)/xlockmore.h
 pulsar.o: ../../config.h
-pulsar.o: $(HACK_SRC)/xlockmoreI.h
-pulsar.o: $(HACK_SRC)/screenhack.h
-pulsar.o: $(UTILS_SRC)/yarandom.h
-pulsar.o: $(UTILS_SRC)/usleep.h
-pulsar.o: $(UTILS_SRC)/resources.h
-pulsar.o: $(UTILS_SRC)/hsv.h
-pulsar.o: $(UTILS_SRC)/colors.h
-pulsar.o: $(UTILS_SRC)/grabscreen.h
-pulsar.o: $(UTILS_SRC)/visual.h
-pulsar.o: $(UTILS_SRC)/xshm.h
 extrusion.o: ../../config.h
-extrusion.o: $(HACK_SRC)/xlockmore.h
-extrusion.o: $(HACK_SRC)/xlockmoreI.h
-extrusion.o: $(HACK_SRC)/screenhack.h
-extrusion.o: $(UTILS_SRC)/yarandom.h
-extrusion.o: $(UTILS_SRC)/usleep.h
-extrusion.o: $(UTILS_SRC)/resources.h
-extrusion.o: $(UTILS_SRC)/hsv.h
-extrusion.o: $(UTILS_SRC)/colors.h
-extrusion.o: $(UTILS_SRC)/grabscreen.h
-extrusion.o: $(UTILS_SRC)/visual.h
-extrusion.o: $(UTILS_SRC)/xshm.h
 extrusion-helix2.o: ../../config.h
 extrusion-helix3.o: ../../config.h
 extrusion-helix4.o: ../../config.h
@@ -675,110 +441,36 @@ extrusion-joinoffset.o: ../../config.h
 extrusion-screw.o: ../../config.h
 extrusion-taper.o: ../../config.h
 extrusion-twistoid.o: ../../config.h
-sierpinski3d.o: $(HACK_SRC)/xlockmore.h
 sierpinski3d.o: ../../config.h
-sierpinski3d.o: $(HACK_SRC)/xlockmoreI.h
-sierpinski3d.o: $(HACK_SRC)/screenhack.h
-sierpinski3d.o: $(UTILS_SRC)/yarandom.h
-sierpinski3d.o: $(UTILS_SRC)/usleep.h
-sierpinski3d.o: $(UTILS_SRC)/resources.h
-sierpinski3d.o: $(UTILS_SRC)/hsv.h
-sierpinski3d.o: $(UTILS_SRC)/colors.h
-sierpinski3d.o: $(UTILS_SRC)/grabscreen.h
-sierpinski3d.o: $(UTILS_SRC)/visual.h
-sierpinski3d.o: $(UTILS_SRC)/xshm.h
-gflux.o: $(HACK_SRC)/xlockmore.h
 gflux.o: ../../config.h
-gflux.o: $(HACK_SRC)/xlockmoreI.h
-gflux.o: $(HACK_SRC)/screenhack.h
-gflux.o: $(UTILS_SRC)/yarandom.h
-gflux.o: $(UTILS_SRC)/usleep.h
-gflux.o: $(UTILS_SRC)/resources.h
-gflux.o: $(UTILS_SRC)/hsv.h
-gflux.o: $(UTILS_SRC)/colors.h
-gflux.o: $(UTILS_SRC)/grabscreen.h
-gflux.o: $(UTILS_SRC)/visual.h
-gflux.o: $(UTILS_SRC)/xshm.h
 stonerview.o: ../../config.h
-stonerview.o: $(UTILS_SRC)/yarandom.h
 stonerview.o: $(srcdir)/stonerview-move.h
 stonerview-move.o: ../../config.h
-stonerview-move.o: $(UTILS_SRC)/yarandom.h
 stonerview-move.o: $(srcdir)/stonerview-osc.h
 stonerview-move.o: $(srcdir)/stonerview-move.h
 stonerview-osc.o: ../../config.h
-stonerview-osc.o: $(UTILS_SRC)/yarandom.h
 stonerview-osc.o: $(srcdir)/stonerview-osc.h
 stonerview-view.o: ../../config.h
-stonerview-view.o: $(UTILS_SRC)/vroot.h
-stonerview-view.o: $(UTILS_SRC)/version.h
-stonerview-view.o: $(UTILS_SRC)/yarandom.h
 stonerview-view.o: $(srcdir)/stonerview-osc.h
 stonerview-view.o: $(srcdir)/stonerview-move.h
-starwars.o: $(HACK_SRC)/xlockmore.h
 starwars.o: ../../config.h
-starwars.o: $(HACK_SRC)/xlockmoreI.h
-starwars.o: $(HACK_SRC)/screenhack.h
-starwars.o: $(UTILS_SRC)/yarandom.h
-starwars.o: $(UTILS_SRC)/usleep.h
-starwars.o: $(UTILS_SRC)/resources.h
-starwars.o: $(UTILS_SRC)/hsv.h
-starwars.o: $(UTILS_SRC)/colors.h
-starwars.o: $(UTILS_SRC)/grabscreen.h
-starwars.o: $(UTILS_SRC)/visual.h
-starwars.o: $(UTILS_SRC)/xshm.h
 starwars.o: $(srcdir)/glutstroke.h
 starwars.o: $(srcdir)/glut_roman.h
 glut_stroke.o: ../../config.h
 glut_stroke.o: $(srcdir)/glutstroke.h
 glut_swidth.o: ../../config.h
 glut_swidth.o: $(srcdir)/glutstroke.h
-gltext.o: $(HACK_SRC)/xlockmore.h
 gltext.o: ../../config.h
-gltext.o: $(HACK_SRC)/xlockmoreI.h
-gltext.o: $(HACK_SRC)/screenhack.h
-gltext.o: $(UTILS_SRC)/yarandom.h
-gltext.o: $(UTILS_SRC)/usleep.h
-gltext.o: $(UTILS_SRC)/resources.h
-gltext.o: $(UTILS_SRC)/hsv.h
-gltext.o: $(UTILS_SRC)/colors.h
-gltext.o: $(UTILS_SRC)/grabscreen.h
-gltext.o: $(UTILS_SRC)/visual.h
-gltext.o: $(UTILS_SRC)/xshm.h
 gltext.o: $(srcdir)/tube.h
 gltext.o: $(srcdir)/glutstroke.h
 gltext.o: $(srcdir)/glut_roman.h
-molecule.o: $(HACK_SRC)/xlockmore.h
 molecule.o: ../../config.h
-molecule.o: $(HACK_SRC)/xlockmoreI.h
-molecule.o: $(HACK_SRC)/screenhack.h
-molecule.o: $(UTILS_SRC)/yarandom.h
-molecule.o: $(UTILS_SRC)/usleep.h
-molecule.o: $(UTILS_SRC)/resources.h
-molecule.o: $(UTILS_SRC)/hsv.h
-molecule.o: $(UTILS_SRC)/colors.h
-molecule.o: $(UTILS_SRC)/grabscreen.h
-molecule.o: $(UTILS_SRC)/visual.h
-molecule.o: $(UTILS_SRC)/xshm.h
 molecule.o: $(srcdir)/sphere.h
 molecule.o: $(srcdir)/tube.h
 molecule.o: molecules.h
-dangerball.o: $(HACK_SRC)/xlockmore.h
 dangerball.o: ../../config.h
-dangerball.o: $(HACK_SRC)/xlockmoreI.h
-dangerball.o: $(HACK_SRC)/screenhack.h
-dangerball.o: $(UTILS_SRC)/yarandom.h
-dangerball.o: $(UTILS_SRC)/usleep.h
-dangerball.o: $(UTILS_SRC)/resources.h
-dangerball.o: $(UTILS_SRC)/hsv.h
-dangerball.o: $(UTILS_SRC)/colors.h
-dangerball.o: $(UTILS_SRC)/grabscreen.h
-dangerball.o: $(UTILS_SRC)/visual.h
-dangerball.o: $(UTILS_SRC)/xshm.h
 dangerball.o: $(srcdir)/sphere.h
 dangerball.o: $(srcdir)/tube.h
-dangerball.o: $(srcdir)/glutstroke.h
-dangerball.o: $(srcdir)/glut_roman.h
 sphere.o: ../../config.h
 sphere.o: $(srcdir)/tube.h
 tube.o: ../../config.h
index 00853dc6a09b81b86192bb1b9a39493795b58630..f1844a5b212abb7b30c20288578c297a4fdb8abf 100644 (file)
@@ -36,6 +36,11 @@ static const char sccsid[] = "@(#)atlantis.c 1.3 98/06/18 xlockmore";
  *
  * REVISION HISTORY:
  * 
+ * Jamie Zawinski, 2-Apr-01:  - The fishies were inside out!  The back faces
+ *                              were being drawn, not the front faces.
+ *                            - Added a texture to simulate light from the
+ *                              surface, like in the SGI version.
+ *
  * David A. Bagley - 98/06/17 : Add whalespeed option. Global options to
  *                              initialize local variables are now:
  *                              XLock.atlantis.cycles: 100      ! SharkSpeed
@@ -109,6 +114,7 @@ static const char sccsid[] = "@(#)atlantis.c        1.3 98/06/18 xlockmore";
                         "*showFPS:    False \n" \
                         "*cycles:       100 \n" \
                         "*size:        6000 \n" \
+                        "*wireframe:  False \n" \
                         "*whalespeed:   250 \n"
 # include "xlockmore.h"                /* from the xscreensaver distribution */
 #else  /* !STANDALONE */
@@ -122,21 +128,28 @@ static const char sccsid[] = "@(#)atlantis.c      1.3 98/06/18 xlockmore";
 #include <GL/glu.h>
 
 
+#define DEF_TEXTURE "True"
+
 #define DEF_WHALESPEED  "250"
 static int  whalespeed;
+static int do_texture;
 static XrmOptionDescRec opts[] =
 {
-     {"-whalespeed", ".atlantis.whalespeed", XrmoptionSepArg, (caddr_t) NULL}
+     {"-whalespeed", ".atlantis.whalespeed", XrmoptionSepArg, (caddr_t) NULL},
+     {"-texture",    ".atlantis.texture",    XrmoptionNoArg, (caddr_t)"true"},
+     {"+texture",    ".atlantis.texture",    XrmoptionNoArg, (caddr_t)"false"},
 };
 
 static argtype vars[] =
 {
-{(caddr_t *) & whalespeed, "whalespeed", "WhaleSpeed", DEF_WHALESPEED, t_Int}
+ {(caddr_t *) & whalespeed, "whalespeed", "WhaleSpeed", DEF_WHALESPEED, t_Int},
+ {(caddr_t *) &do_texture,  "texture",    "Texture",    DEF_TEXTURE,   t_Bool},
 };
 
 static OptionStruct desc[] =
 {
-       {"-whalespeed num", "speed of whales and the dolphin"}
+       {"-whalespeed num", "speed of whales and the dolphin"},
+       {"-texture num",    "whether to introduce water-like distortion"}
 };
 
 ModeSpecOpt atlantis_opts =
@@ -153,6 +166,19 @@ ModStruct   atlantis_description =
 
 static atlantisstruct *atlantis = NULL;
 
+#include "xpm-ximage.h"
+#include "../images/sea-texture.xpm"
+
+static void
+parse_image_data(ModeInfo *mi)
+{
+  atlantisstruct *ap = &atlantis[MI_SCREEN(mi)];
+  ap->texture = xpm_to_ximage (mi->dpy,
+                              mi->xgwa.visual,
+                              mi->xgwa.colormap,
+                              sea_texture);
+}
+
 static void
 InitFishs(atlantisstruct * ap)
 {
@@ -192,8 +218,10 @@ InitFishs(atlantisstruct * ap)
 }
 
 static void
-Init(atlantisstruct * ap)
+Init(ModeInfo *mi)
 {
+       atlantisstruct *ap = &atlantis[MI_SCREEN(mi)];
+
        static float ambient[] =
        {0.1, 0.1, 0.1, 1.0};
        static float diffuse[] =
@@ -214,23 +242,78 @@ Init(atlantisstruct * ap)
        {0.0};
        float       fblue = 0.0, fgreen;
 
-       glFrontFace(GL_CW);
-
-       glDepthFunc(GL_LEQUAL);
-       glEnable(GL_DEPTH_TEST);
-
-       glLightfv(GL_LIGHT0, GL_AMBIENT, ambient);
-       glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse);
-       glLightfv(GL_LIGHT0, GL_POSITION, position);
-       glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient);
-       glLightModelfv(GL_LIGHT_MODEL_LOCAL_VIEWER, lmodel_localviewer);
-       glEnable(GL_LIGHTING);
-       glEnable(GL_LIGHT0);
-
-       glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, mat_shininess);
-       glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, mat_specular);
-       glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mat_diffuse);
-       glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, mat_ambient);
+       glFrontFace(GL_CCW);
+
+        if (ap->wire)
+          {
+            glDisable(GL_DEPTH_TEST);
+            glDisable(GL_CULL_FACE);
+            glDisable(GL_LIGHTING);
+            glDisable(GL_NORMALIZE);
+          }
+        else
+          {
+            glDepthFunc(GL_LEQUAL);
+            glEnable(GL_DEPTH_TEST);
+            glEnable(GL_CULL_FACE);
+            glEnable(GL_NORMALIZE);
+            glShadeModel(GL_SMOOTH);
+
+            glLightfv(GL_LIGHT0, GL_AMBIENT, ambient);
+            glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse);
+            glLightfv(GL_LIGHT0, GL_POSITION, position);
+            glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient);
+            glLightModelfv(GL_LIGHT_MODEL_LOCAL_VIEWER, lmodel_localviewer);
+            glEnable(GL_LIGHTING);
+            glEnable(GL_LIGHT0);
+
+            glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, mat_shininess);
+            glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, mat_specular);
+            glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mat_diffuse);
+            glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, mat_ambient);
+          }
+
+        if (ap->wire || !do_texture)
+          {
+            glDisable(GL_TEXTURE_2D);
+          }
+        else
+          {
+            GLfloat s_plane[] = { 1, 0, 0, 0 };
+            GLfloat t_plane[] = { 0, 0, 1, 0 };
+            GLfloat scale = 0.0005;
+
+            if (!ap->texture)
+              parse_image_data (mi);
+
+            clear_gl_error();
+            glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA,
+                         ap->texture->width, ap->texture->height, 0,
+                         GL_RGBA, GL_UNSIGNED_BYTE,
+                         ap->texture->data);
+            check_gl_error("texture");
+
+            glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
+            glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
+            glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+            glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+
+            glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
+
+            glTexGeni (GL_S, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR);
+            glTexGeni (GL_T, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR);
+            glTexGenfv(GL_S, GL_EYE_PLANE, s_plane);
+            glTexGenfv(GL_T, GL_EYE_PLANE, t_plane);
+
+            glEnable(GL_TEXTURE_GEN_S);
+            glEnable(GL_TEXTURE_GEN_T);
+            glEnable(GL_TEXTURE_2D);
+
+            glMatrixMode(GL_TEXTURE);
+            glLoadIdentity();
+            glScalef(scale, scale, 1);
+            glMatrixMode(GL_MODELVIEW);
+          }
 
        InitFishs(ap);
 
@@ -361,7 +444,7 @@ init_atlantis(ModeInfo * mi)
 
                reshape_atlantis(mi, MI_WIDTH(mi), MI_HEIGHT(mi));
                glDrawBuffer(GL_BACK);
-               Init(ap);
+               Init(mi);
                AllDisplay(ap);
                glXSwapBuffers(display, window);
 
@@ -392,12 +475,8 @@ draw_atlantis(ModeInfo * mi)
 
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
 
-       glPushMatrix();
-
-       AllDisplay(ap);
-       Animate(ap);
-
-        glPopMatrix();
+        AllDisplay(ap);
+        Animate(ap);
 
         if (mi->fps_p) do_fps (mi);
        glXSwapBuffers(display, window);
@@ -444,7 +523,7 @@ change_atlantis(ModeInfo * mi)
                return;
 
        glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(ap->glx_context));
-       Init(ap);
+       Init(mi);
 }
 
 #endif /* USE_GL */
index 413b48b853448a4ee4518baaec420f07b7c10e80..be07c963367a1e03ca53eb90682f6484c183d2f6 100644 (file)
@@ -98,6 +98,8 @@ typedef struct {
        fishRec     momWhale;
        fishRec     babyWhale;
        fishRec     dolph;
+
+        XImage     *texture;      /* water distortion overlay bits */
 } atlantisstruct;
 
 extern void FishTransform(fishRec *);
index 8aa2f9cf5c0416296f1dd3ee7ba87b7c2983689a..d189602aaa7d8ffe3bda68a875e978f009f8f930 100644 (file)
@@ -49,16 +49,7 @@ extern XtAppContext app;
 
 #ifdef USE_GL /* whole file */
 
-#ifdef HAVE_UNAME
-# include <sys/utsname.h>
-#endif /* HAVE_UNAME */
-
-
 #include <GL/glu.h>
-#include "glutstroke.h"
-#include "glut_roman.h"
-#define GLUT_FONT (&glutStrokeRoman)
-
 
 typedef struct {
   GLXContext *glx_context;
index 447605c62dad08dd40289e9be9ba90bb5f393690..954b98101dc03014adca815b485e016d06499597 100644 (file)
@@ -622,6 +622,19 @@ build_molecule (ModeInfo *mi)
       glEnable(GL_CULL_FACE);
     }
 
+  if (do_labels && !wire)
+    {
+      /* This is so all polygons are drawn slightly farther back in the depth
+         buffer, so that when we render text directly on top of the spheres,
+         it still shows up. */
+      glEnable (GL_POLYGON_OFFSET_FILL);
+      glPolygonOffset (1.0, (do_bonds ? 10.0 : 35.0));
+    }
+  else
+    {
+      glDisable (GL_POLYGON_OFFSET_FILL);
+    }
+
   if (!wire)
     set_atom_color (mi, 0, False);
 
@@ -659,55 +672,44 @@ build_molecule (ModeInfo *mi)
           }
       }
 
-  for (i = 0; i < m->natoms; i++)
-    {
-      molecule_atom *a = &m->atoms[i];
-      int i;
+  if (!wire && do_atoms)
+    for (i = 0; i < m->natoms; i++)
+      {
+        molecule_atom *a = &m->atoms[i];
+        GLfloat size = atom_size (a);
+        set_atom_color (mi, a, False);
+        sphere (a->x, a->y, a->z, size, wire);
+      }
 
-      if (!wire && do_atoms)
-        {
-          GLfloat size = atom_size (a);
-          set_atom_color (mi, a, False);
-          sphere (a->x, a->y, a->z, size, wire);
-        }
+  /* Second pass to draw labels, after all atoms and bonds are in place
+   */
+  if (do_labels)
+    for (i = 0; i < m->natoms; i++)
+      {
+        molecule_atom *a = &m->atoms[i];
+        int j;
 
-      if (do_labels)
-        {
-          glPushAttrib (GL_LIGHTING | GL_DEPTH_TEST);
-          glDisable (GL_LIGHTING);
-          glDisable (GL_DEPTH_TEST);
+        glPushAttrib (GL_LIGHTING | GL_DEPTH_TEST);
+        glDisable (GL_LIGHTING);
+/*        glDisable (GL_DEPTH_TEST);*/
 
-          if (!wire)
-            set_atom_color (mi, a, True);
+        if (!wire)
+          set_atom_color (mi, a, True);
 
-          glRasterPos3f (a->x, a->y, a->z);
+        glRasterPos3f (a->x, a->y, a->z);
 
-          {
-            GLdouble mm[17], pm[17];
-            GLint vp[5];
-            GLdouble wx=-1, wy=-1, wz=-1;
-            glGetDoublev (GL_MODELVIEW_MATRIX, mm);
-            glGetDoublev (GL_PROJECTION_MATRIX, pm);
-            glGetIntegerv (GL_VIEWPORT, vp);
-
-            /* Convert 3D coordinates to window coordinates */
-            gluProject (a->x, a->y, a->z, mm, pm, vp, &wx, &wy, &wz);
-
-            /* Fudge the window coordinates to center the string */
-            wx -= string_width (mc->xfont1, a->label) / 2;
-            wy -= mc->xfont1->descent;
-
-            /* Convert new window coordinates back to 3D coordinates */
-            gluUnProject (wx, wy, wz, mm, pm, vp, &wx, &wy, &wz);
-            glRasterPos3f (wx, wy, wz);
-          }
+        /* Before drawing the string, shift the origin  to center
+           the text over the origin of the sphere. */
+        glBitmap (0, 0, 0, 0,
+                  -string_width (mc->xfont1, a->label) / 2,
+                  -mc->xfont1->descent,
+                  NULL);
 
-          for (i = 0; i < strlen(a->label); i++)
-            glCallList (mc->font1_dlist + (int)(a->label[i]));
+        for (j = 0; j < strlen(a->label); j++)
+          glCallList (mc->font1_dlist + (int)(a->label[j]));
 
-          glPopAttrib();
-        }
-    }
+        glPopAttrib();
+      }
 
   if (do_bbox)
     draw_bounding_box (mi);
@@ -1100,6 +1102,7 @@ reshape_molecule (ModeInfo *mi, int width, int height)
   gluLookAt( 0.0, 0.0, 15.0,
              0.0, 0.0, 0.0,
              0.0, 1.0, 0.0);
+
   glMatrixMode(GL_MODELVIEW);
   glLoadIdentity();
   glTranslatef(0.0, 0.0, -15.0);
diff --git a/hacks/images/sea-texture.xpm b/hacks/images/sea-texture.xpm
new file mode 100644 (file)
index 0000000..2f7206c
--- /dev/null
@@ -0,0 +1,199 @@
+/* XPM */
+static char *sea_texture[] = {
+/* width height num_colors chars_per_pixel */
+"   128   128       64            1",
+/* colors */
+". c #b1b1b1",
+"# c #afafaf",
+"a c #adadad",
+"b c #ababab",
+"c c #a7a7a7",
+"d c #a5a5a5",
+"e c #a3a3a3",
+"f c #f0f0f0",
+"g c #e0e0e0",
+"h c #dedede",
+"i c #dadada",
+"j c #d8d8d8",
+"k c #d6d6d6",
+"l c #d4d4d4",
+"m c #d2d2d2",
+"n c #d0d0d0",
+"o c #cecece",
+"p c #cccccc",
+"q c #cacaca",
+"r c #c8c8c8",
+"s c #c6c6c6",
+"t c #c4c4c4",
+"u c #c2c2c2",
+"v c #c0c0c0",
+"w c #bebebe",
+"x c #bcbcbc",
+"y c #bababa",
+"z c #b8b8b8",
+"A c #b6b6b6",
+"B c #b4b4b4",
+"C c #b2b2b2",
+"D c #b0b0b0",
+"E c #aeaeae",
+"F c #acacac",
+"G c #aaaaaa",
+"H c #a8a8a8",
+"I c #a0a0a0",
+"J c #9c9c9c",
+"K c #929292",
+"L c #e9e9e9",
+"M c #e5e5e5",
+"N c #e3e3e3",
+"O c #dddddd",
+"P c #dbdbdb",
+"Q c #d9d9d9",
+"R c #d7d7d7",
+"S c #d5d5d5",
+"T c #d3d3d3",
+"U c #d1d1d1",
+"V c #cfcfcf",
+"W c #cdcdcd",
+"X c #cbcbcb",
+"Y c #c9c9c9",
+"Z c #c7c7c7",
+"0 c #c5c5c5",
+"1 c #c3c3c3",
+"2 c #c1c1c1",
+"3 c #bfbfbf",
+"4 c #bdbdbd",
+"5 c #bbbbbb",
+"6 c #b9b9b9",
+"7 c #b7b7b7",
+"8 c #b5b5b5",
+"9 c #b3b3b3",
+/* pixels */
+"PPilW0w65w2tZYpoUTlkRQQQjRRjPhNMLMMNNOTY38B7y42sWlPgPUZ4B.#abGGGbbFaE#D.A5v0qVljOhQTWZsoSONLMMNghOPQRkkkkkkjQPPPPiQQjRRkSWt5.HHH",
+"PPilW0w65w2tZYpoUTlkRQQQjRRjPhNMLMMNNOTY38B7y42sWlPgPUZ4B.#abGGGbbFaE#D.A5v0qVljOhQTWZsoSONLMMNghOPQRkkkkkkjQPPPPiQQjRRkSWt5.HHH",
+"PPQTp0w6y4v1srXWnmTSkjjjRkkRihgMMMNNNPmrwB97y42sWlihinsx9DEabGGGbbFaE#D.A5v0YoTRPhjmps0WlPNLMNNghPijkSSSSlSRjiPPiQQQjRRkSWt5.HHH",
+"iijmp0w6yxwvutZYponTlRkSmnooUSjPhhhggPUZ499z4uZXnljPkW1yC#EaFbaED.9BB88Ay420YWmkPOkVYuvZoSPhhOPiQklmnooWpppVUlkRjjQiQQQjRVsxCGHH",
+"jjRUX0w6yy5x4vu0rqpVmSlUWY00rpVTSRiPhQV05.9y2rVmTSkRUYvzDEEaaaD9A6xxxxx5wv10rpnlQPTp0452ZWTkkSllmnWqrs0t1u1sqWUTSRQPPPPPPmrwBbGG",
+"RRSnX03y66z665wv1sYpVTmWZu45wu0YpnlRPRW1yDCxtokjRklmWt48EaaEE#97xvtt11u2u1t0ZqVTjQnYv685v0qWWoWopYs123456z6wusXomSQOOOhhhSXvAFbb",
+"SSlVq03y67A8B76x3u0YpUnYu5B.Bz531roTjkpuzEC4rlhhiRmorv6CaFaE#.7xurWpXYrZsss0sYWUkRo0xBDB64ut0ssZsuvx67BCDaD8yv0qVlQhhggggjou7aFF",
+"TTmWYt3y6A9CD98z5wusqVo04BFHb#CA52YVklqv7aC3XQNNORnY1xADbba#D9yvrVlTUVopqrZt0rpnSSXuzDbECAyxww32vx68C#aGcdca96vspTjhgNNNNPnt6Eaa",
+"YYr01v4y678B9A6xv10ZYpqu59bHbE.86vZWlmr3Aa.wYkghQmq1w6B#bF#.9Ax2rWmnWqZ0t1uv2tZXVVZ3AEGECA54w3v2vxzB.EFGHdH#8y20qVlQPOhgNin0yDDD",
+"xx5555y6y6zzzxvtZqYYYYsvyBabaD9AyvspmnZwAE.xsUijUXt468C#aE.B7yw2sYpY024yy55543u0YYu58EbD86w2uuu12468.#EaaF#B6w1sYpoUlkiPhjo0x9CC",
+"###D9876yy54wusXVUoprs246BDED98z5vsXVWs4AE.6uXTUqt47BC.#EDB7y43210su4z9#DCBAzy4vu14z9EF.7xu000001wy8.DDD..B642sZZrrYpnljPSW04888",
+"eeedbDBz5xw21rWmRQTor14yz8C.9876xv0YWXt4A#.7wspY147.#####CAy422222v58EHdcGaDBAzyx468CEa963srrrZZtvyA.DC9A7yw2trZstu2tYVTjTp0w777",
+"KKKJeG.z5wu0YoTQhgjnrv6778BBA7654v0rXY1x8#D85v0uxA.bGFa#DB64vt1v34yBadIJIecbD.9B8ABCDEE8xuYpXqqYs25A..BAy4v10ZXrt2x641YVSUX03yyy",
+"KKKJebBxvtrXVlQhNNPTqu5y67887765xwutst3z9aEC75347CEHHbFEDB6xvt2w57BEHeIJJedGE#DDD.D##E#AxurXYrs0uw68..9A6xw2u1s1v4y752ZWmVY14zzz",
+"KKKJdD61ZXVmkQOgNMhkVZ2wx6A877zyyxw3vw6B#GbE97568DaHHbFED9z5w2wyA.aGcdIIedHbEEEaFFFaEEDA5v0stuvw5z8C#DCBAzy55x4x5y6zx2ZpnWs2y888",
+"KKKJHB3qomkQOhNNLLgQTps135zA777zz66yyzB#GdcGECA8CEbHHbFE#CA6x358DbcddddddHGaEFbHccHba#CA642u3x67B9.#EED.9B888BBBA7zy4usqoqtw7CCC",
+"KKKIbz0UkQOgNMLLLLNORUpZ146A7777AA88BCEGdeecGEC.#FGHHbFE#C8zyx7.bdIIedcHGFFEEbHdeedHFD9Az54wy79#aaaFFaE#D..DEFFa.Bz5wu0Ypr25B#EE",
+"KKKIE4XjOgNLLLLLLLMgPkUpsvyAA7AAB9.DEFHdeIIedHaaFGHHHbFE#.BAzyBadIJJIdGE####EGceIJIdbDBA7zy68.FHdHHGbFFaaaFGcdedF.7x3u0rq03z.Fbb",
+"KKJdC3WQhNMLLLLLLLNgPjlWswz99999.DEaFGcdeIIecGEEaFbbFaED.9876y8#HeIIdFDB9CD#aGHdeIdHECAA77z7CEGddcGFE#EEaFbHdIIeHD74v10rqt48EHHH",
+"IIebA2pkPhNLLLLMNghPijlp159EEEEEaaFFFGHddIedGEC9.D##D.C9BAzy5x68.Eba.B7y78.#FbbbbbaD9Az7777ACEGcdGE.8ABCDEbHdIJIHD7w2tsrqtxBFddd",
+"GGbCy1qmRPgMLMNghPiQjRlq27EHHHHHHGGbFbHcdddGEC77A8B9B8A7zy54w34xy676543vx7CEGa#.B8A7z6y6z7AB.EbHHaC7xx6AC#FHeIJIHDzv10ZYq1yCHeII",
+"BBB6wtYVlihNLNgPjSkkRRlYw9HedddddcHGFFGHcdHaCA5xy6z77z65x4w3v22u1ttt0ss0vy9aHE9z4v3w4x5yz789DEbHGDAxu1w68DFHeIJIHD62tsZYqu6DcIII",
+"44wvusrpURONMgPRTVUmSRlrx#dJIIIIedcHFFbGHHbDAy3vw4x55x43v22uu10rpVUnVVoXtxBaH#7wsqr01v45z7BCDEbHF9yuYY147CFHeIJIHD6u0ZrYquzEdJJJ",
+"222uuttZpmQhNOjToqWVmSmZyEeJJJIIedHF#D#EEF#9z42uv3w443vu1t1tt0rpmkijkSmVZwAEH.y1XnWY02w5zA9.D#EaD7wsWp03zCaHeIJIH.y1srrYY27EdJJJ",
+"333wwww30pmQOjTVqZqpoUV06EdIIIedcb#97z78B9B7y4vvww4x43utsss0t0YoSihOiRlUY2z.FBx0omoY0vx6AB.D.9BA6w1rWp03zCaHdIJIb9xtZrrrZv7EdJJJ",
+"xxxy6z77w0pljlVqs1srXop16#dIeddHFD8y3vwx5665x4ww4x554v1ZqYrZ00qnjhNgOikmX15BD73ZnlVY035z8C#D97yw2tZqWX03zCaHdeIda8wsZrZZ03AEdIJJ",
+"yy67BCD#A3somVXs1v10ZqY2zDcedHGFDA52Zrstuv3www4x55y6x20YWpqrs0XmPNLMgOjlW0w79yuqmknqtw6A9Da#ByvZqXXWoqtwzCaGHdecD7vZrrs0148EdIII",
+"77A9DFHH#zvrWqsu34vutZs37DHdHbE.8x2roVWXYstuvw55y6zzx2spnVpqs0plhMfLNgiSoZ2yA40plRUqt4z8C#FEAwZVmUnVoqtwzCabHcdGC62YYrstux8EcIII",
+"88B.aGdda84sXZtv45wvu0t3zCFGa#C8yvspmTUopYs13xz7777z52ZpUVWqs0WkgLfLMgiSorux63ZokQmXt47BC#F#72XSjkTUVqtw69#abHcFB51qqrstu4ADHddd",
+"99C.#abbCy2YWqsuwx321ss2xzC.98zy4usXnnopqZ1w68##.B8z5v0YWpXYZsoRgLfLNhknX02xy2YnjPlWs367BC#Cy1pSjRlTUpZ2xAC#EbHa8xtXXqrZ0vy8#GGG",
+"......DCz3sWnprtv4vu0rrt246z654w2tZqWWXYZt369acHFD9z53usYYrrZZVjNLfLNPmXZ1vxx1XmiOkVr2x678984sokQRSlTVYt368CDab#A4tXpXXYrt3yBDDD",
+"DD#.CB8zwtqnTVq02w21sYqZ0u3w3vu10sZYqYrst2xBadIIdFCz5wv10ssZZrnQNLfLgjos12344tplPhjUq1wxyzA6vrVkQjkklUXZu468C#FD7w0pWWWpXZ13yAAA",
+"EEE.Bz5wtYolkmpZuvu0ZqpqYZ00ssZrYrrrrs0123z#cIKJIHDz5xwvu1t0ZYUiNffLhSqv3ww4wsokhgiTp0v345yxuqnRiQjRkToY0vxz8.E.6vsWVoVVoXZt3xxx",
+"###C7xv0YWmRQloYtutZqWVWWpXqqqXXXYrZst123w7adJKKIH.y4w3v21tsrqmiNLfLOms444wwvrnjgNPlp0v3w4xwtXUkQjRRkToXZuwyA9D9y2ZonnUUnWqZ1vvv",
+"777ywu0qomkPPRmWrsrXoUTUnopXXXXXXYrZstt1u25CGIJJdD6u0sZrYqXppolPNLfNQn04w32utXmQgNiUrvyyyyyxurWmSlTmUVXr0uw579D9y2ZonnUUUWqs2444",
+"33320rXVmkihhiSUpqpVTkjSTnWXXXXqqYrZs0000037DHIdEz2qWVnUmmmmUmkPhNLhkWt43v10roSPNNjotyB8A7z530qoUVoWXqZ012w579.B5urVUUUUUWYt3555",
+"ZZZYpVUlRiOgNhQlnonljPOjSmopXXqqYrZss0sZZrtxA#HaAvYmkRQiPiQjkSjPOggimX14vusYpmRONNRpv8EDC9A642sqpqYrs0t12vw57B.B5urVUUmmUWru4zzz",
+"VVVUmSkQPhgMMgPjlmSjPggPjlVpXXqYrrZsssZYqprux8D8wrUihgNNNNghPQiPPPPkVYu42trpnSQhNNkYx#HbED975w1srstuvvvv33w57BC8x1YnmmmmUWZ25AAA",
+"kkkRjiPOhNNLLNhPRSjPgNMhikUWpXXqYYrZZrYXWVps25Ax0VjgMLLLLLMNhPiijRkUpZ2wusXnljPhNNls6becbECA6xv1tuv455x443w5z8B74tqnmTTTmWZvyBBB",
+"QQQQQiiPOgNMMNhiRSjPhNNhPRTnnUUUUUnVVoVVVUWr1w6wZnjgNMLLLLNhQkSlTTmVqs23troTRQPhghUt7bdHFDBz5wut02wy7765xw34x5yx2ZXUmTTlTVYuxAAA",
+"PPPiiiQQPhgNNgOQklRiOgNhPjSTSkRjQQjRRklTmmoYtv5vrnjhNNMLLMhilVVVVVVpYsu2sXUkiPPPhiouAbdHEC75wvtss2xz99A65wvvvvv1sqWUmTlSSUXtw666",
+"hhOPiQjRQPhgNhPjSTkQPhghPQRkQPOgggghhOiRlToqsuwuYnRhgNMMLNPkVYYqqXXqZ011rWlQOPPPikXv8bdG#B64v1srZ258##97yw2ut0ZYqWoUmlSkRTWZ2555",
+"gghOPQRSRiOhghPRlmSjiOhOPiQQOgNLLLLLLNgPRlVXZtvtqnROggNMMgjUY11t0ZZZs0t0qnRPghPQRmrwBbcb.Axv10rqr26CbbD86wu0rXoVVnnUmlkRQSVY1www",
+"gggOPjSTSjPhgOikTUlRQPOPPPPPgMLffffffLNhQlVpr0u0qnkPhhgNNhSW0wwv21t0000ZpmQhNhPjlo04BbHa963u0ZqpY26.HHEBy3trpUlSTTmUmSRQPRUps222",
+"iiQklUoWnljPhPjSmnTSRiPPPQQQOgNLLLLLLMgPRTVprt21sXVmkjPhgPSoZ2v22uu1t0sYVlPgMgOikUYuyC#9z4u0rqpopsvy9B6wtrpnTRiijkSTlRQPOikmWYYY",
+"mmUopYZsqnSQPiRlUVmlkQiQQRkkQPhgNNggghPjlmoXZ1vvu0ZYWUkihiSnqst1u2vutsrXUkONMNhPQlWZv67y420rXponVprtv2sqVlRQPhggPijkRiPhghPjSUmm",
+"YYrstuv30XURPjSmnoUTSjQjRSlTSkRQiiQQQRSlmnWqsu3www3vtYVkPQSmoXr01vw2tZqWTjhNLNghPRUps2wv1srXWonmmUnoWVTRPhgNNMMMghPQiOhgNNghPiPP",
+"vv3wxy6z3ZoSQRlUVWnmlRjkSTUnnUUUmmUUUnnnVVpY02w5yz7AxuYURRSTUnprt34vtrXnSigMLMNghPkUprsZrqpWnUTSkRjQiPgNMLLLLLLLMNhPPhgNMMMNNNNN",
+"zz7A89CCy1qTjkTnopVUTkRSTUVWWpXqqqqqqqXpWoprtv46A9Da95tplkSSllVqtw531rWmRPgMLLMNgOQkmVWWWVVnmTSRjPgNMLLfffffffffLMghhNNMLLLLLLLL",
+"666z7A88xtqmkSTUnVmlkQijklmnWXr00ssZrYXoVUVq024z8.EbD62qmTTmUnX0vy7xuroljOgMLMNhPikTVpqpWVnUmUmmlQhNLLfffffffffLMNhPPhhNNNMMMMLL",
+"44xxx5y5vsXUlllTTTkjiOhOPQRlVXs2vutsrqWnTSTWZu4zBDaG#zvYUUVWXYtvy8CzvZoSQOgNMNhPRlnWqZ0rXoUmUoWXWlPgLLfffffffLLNgOQkkjQPPOhhhhgg",
+"vvvvv3vvtrpnmllSkRiPhgNghOPjUXt4x3u0rXVTkQRnY147BDFHE73rnVpY01wy8.E8wsVkiOgNNgPRTVXrt220YomTnpY0ZnRhLfffffffLLNhPRlUUmTSSkRRjjQQ",
+"111ttt0srXWVUTSRQPhgNMMMNNgPTXu67x3trpnSQOPTXt479#bHaAwZopYtvxzB#FGCx0VjPOgNNhQToY0u3xxuZWTlVYt32XlhLfffffffLNOjSmVppWWooVnnUUmm",
+"ZZZZrYqXpWWoVTSQPhgNMLLLLMNhSqv89z4uZWmRPghkW0479#bcF84sWq0vy8.EGcdEy0VQPOgggPSVYtv4y77w0WTlosvzysUPLffffffLMhRmnWqZZZZZZZrrYYqq",
+"XXqXppWWWpXqXVmkQPhgNMMNghOjotyDF.8ywtqnkPPlWZvyACEGEAxtqs2yB#bHddeFztVQiPOhhjmXt3x67BBxuqnUXtw7ysUPLffffffLNPknWY02vvvv3v2utt00",
+"VVoooooopqrssqWUSRQiPhOPRlnX1yCHdHbE.A40pllnprt357CE.7xusux8EHddeIIb7uoRQiPPiloZv5zABCC63spWr1w6xZmhLfffffLMgPknXsv5y6zz765x3v22",
+"TTmmUnVoXr0u20rpnTllSkSUWYt3z.GeIIIedH.yuXWpXqrtv579Bz5vu47DHeIIIIIGA2WkRjjjRnq1x789CD.7xurY0uwy4YThLfLLLLMghiknqux89C.D#.BAyx44",
+"RRkSlmUVXs1wxv1ZpooVVVWr1wz9aceJJJKKKJd#zuZrqXWY0v577y5436CGeJJJJJIHBvpSkSSSTWs3z9..#E#By3101vw53qSgLfLLMNghPQknr37#FGHHcGa.87zz",
+"PPijklmVqtvy7ywuZYYYrZ03z9FceIJKKKKKKKJdEyvtYWUVq0vxy5555BadJKKKJJJc93XllTTmnYu5B#EEFFa.7532v3wx2pkgLfLMNhPiQjknsxCHdeIIIedbD9BB",
+"PPiRSUVXs2x78z42srZs01v58#HdIJJKKKKKKKKea6v0XnklVq0u3wx5y9FdIJJJJJIHB3qmmnVWXtw7.FbbGbFDAy3233wx2pSgLLLgORSlSlTWty.HdeIIJIdGD8AA",
+"jjRTnprtvx68Bz4uZqZs1v468.FHdIJJKKKKKKJd.4tYVSiQSnpr0u34y8#HeIIIeedE7vYnopqr0369aHHHHHbDA5212vwxvqlhLLNORUoooooY2yCbcdIIJecEB655",
+"SSlnXZuw5zA9C741rXr02w5z8C#FHdIJJKKKKKIG8vrolihhikmoqsu35ACaHddcHGF9yurWXr0u3y8#GcccccH#741012w53YmPMMhjUqrrrrr036BEGceIIeG.zwvv",
+"TTUpZ2x789C..741Yprtv5z789.#FHdIJJJKKJeE6tpmjhNNgPjSnq0v57B.EFaE#.9741rXrt246BDbcdddddH#7w0Zt2w5wrniNNPTX122uu12xz8.aHdeIdFBx100",
+"nnoruxAD####D74tqortw6A888B9DFHdIIJJJJcC4rnkPNLLMNhPkoru5678B9B8A76xvtZY0vx79#Fcdeeeedc#73ZYsuw54sojghRo04y5xx44yzABDbceIdE7vrqq",
+"ppX0369aE#D.963sXor1xA9B8A77BDaHddIIJeb83qUjhMLLLMghjnYuxy6666y5x43v10ssu47CEGHdeIeeddG.6vZqs1vxwsokhPmYvz8Az6556z7ACaHdIH.y1XWW",
+"rrZu469#.987y31rpWZ2y9D98z55zB.aGHdeIdE7vqURPNLLMNghjnYux55x4w3vu1tt000t369aHddeIIedHFD85v0rstuvuroliRo0xBCBA6556z7A9#bHdbBx0WVV",
+"tt1vxzB.B75w2tZqpWs3zDEC8y3vxz8.EFHHdG.62qnkPgMLNNgOjnYux54321tsZYqrZst2x8#HeeIIIIdHaCA64vtss00tsqomkmq2zD#C8z55y6z7B.EbH#73Zonn",
+"vv34y7897xvtrqqpWpt48abDAxut2468CDEFGEB5uqVlihNMNghPRnYuxx3u0rYXWoVpYZ136CGeIJIIIIdbC7xwv21t0sZrYponmo04BFF#B75x5y6zA9DEFCy2YVUU",
+"xx5yz7885v0qVVoooX159GH#AwsY0246ABC.#Cz41qVTjhNNghhPRnYux420YponmllnXZux8EdIJJJJJIcEA4uuu2210ZqpWWoooY26DHHaC75x5y6z7B9CD84tXUTT",
+"66z6z77zwtqVlTnVWY26.Hc#A3rXr02w5yz78zxv0qomRPhghhhPRUq1431sXonmlkkUpr14A#cIJJJJIIHDz3t1122u0ZXoVoWWpZvz#cHEB6w3w4x5yz7A8yvZWmll",
+"zzz666652ZpmkTVpY0w7DHH#73ZXYrs01u22v21srXoUljPPPOhhilWZuutsrqXWVUUVpqZ1wzCbddddedGDA53vvv2u0ZqpWWWWWYu5Cba9630s0t1u23w4xv0Xnlkk",
+"zz76y5xwtYVSjTVqsv58#HH#7wsqqqXXXqqqqqqXXXWVUlkQiPhgPkUXs000ssZrqpppppXqsvx7CDEFHHFDBzyxw3210ZYqXpWoVX04A#.z3spopXqYrs01u0qoTkRR",
+"7776543uZpmRQlorux79EHHD7w0qXWnmTTlllTUnopWoVUmSjPhghQlVXrs0tuutsZrqpWVnWYsuwy79#aEDCBA6xwu10srYqXWonWZv69A40pTSTmUnVWpqYXomSRQQ",
+"AAA6x320qVliPlW0wzB.aHGD741YWnSQPPOOhPjSUWpWpWoUSihNgPjTVXrt2ww32u1ZpVTRSmnoX0vyB.DDDD.864ut0ssZrqWVUVq147y1qTiPiQjRSlmUnUTkjQii",
+"zzzywu0YWUkiPTptxA9.EFaCz41roTQhgNNMMNhQlopXqqqomjhNgPQSUpr1v5x432urWmjPPQjRlWZ2y89CD##B6wtsZZZrrXWVmVqtw6x0WSOhOPPiQjklTlkjQiPP",
+"www2tZqWVmlkknXtwyz78997531roligNNMMLNhQlopXqYrXVTRPQkmVpYs1v43u0rqVljOghPijSnX0vx6z8BBz4uZqXpWooVVVnpZ258zvZVkjRkSlTmUnnUlkQPPP",
+"000rqWVUmmmmUWY02w4x5yy4321ZoSPNMMLLLMgiSVpXYrZrXonTUVpYZ0tu2v1ZXVTRPhNNNhPiRmoqs1vw5664usXonmTSSTUVWY147.952rVUnVooWWpXpoUSjPPP",
+"ppponmlSlmnoXYZ01u2u2u2u111ZokONLLLLLMgPSVpqrZ0sZrqXqrs1u2uuuuZpURPhgNMLMghPjSmVpYstvw4usqVmSRQPPRTVXs369a#85urYYrrrZZZZrXVTRPPP",
+"TTTSkjQikmoYssss0ssrrYrrs01soRhLLLLLLLNPknpqZs111111u23w4w321tqURhNMLLLLLNgPQRSTUnpYs1usXVTRQOhNgPSVYuxA#HGDA52uu22222uutZWUkPPP",
+"QQQiPPOOQTWZ1tsZrqqpWoWXr0utWkOMLLLLLLgPSoqZtu3ww4xx55yyyx3u0rokONLLffffLLNhPiQjRkmVqZsqoTRPhgNLMhkos3zCbdcF.A5555555x4wvtqVSiPP",
+"PPPPOOhOQSUXrYqXpWppXXYs13x40WlPggNNNhjmp0246A999BB87654v1sYpoligLLffffffLLNghhOPiSUprsXnlQOgNMLMOlXu58#HddG#9z66zz77z6yxvZWTjii",
+"hhOOhOhOiRlnooVnnnWpYrt2468A4tXmkRjQiRnYux7CEGdcHGF#9z4uZqWnTSihNLffffffffLLMNNNghjTWrsXUkPgNNMLMPUZ4A.aHedHaCAAA8BBB88A741qURjj",
+"gghhhhhOPQjSlllllTVXZtv579##852ZXWonUoZv6CaceIJJIIdH#AwsWUlRiPhNLLfffffffffLLLLMMNPSor0XmRONNMLLMiVt6CEGdeeHFDBBBC.DD..C96vrVSRR",
+"NNggghhOPPPPiQQjjknX0v5A.aHHaC742u0ZYsw7DHeJKKKKKJJeb8vqljPhgNMLLfffffffffffffLLLMhRVr0XTQhNMMLLNjW28EbcdIecGECC.#EaaaaE#840WTSS",
+"NNNNghOPPPOOOPPiQknYuxA.Fceedb#Bzy4vu37DHIJKKKKKKKKJcB2oihgNLLLLffffffffffffffffLLhRVs1qmQgMMMLLNkqw.GHdeIedHaDD#abGGGbbF95tpmll",
+"MMMNghPijRSlTmnVopsvyBDFHdeecFD86x310uyCHIJKKKKKKKKJcBuVPgNMLLLffffffffffffLLMNNhPSWs3xuYVkiOhgNhmZ5DHcdeIedGECC.#abFa#DC6vYnRQQ",
+"LLLMNhiRTnpYs01u23yA.FHccdddG#97531ZqZw8FeJKKKKKKKKJcBuVPgNMLLfffffffffffLMgOiRlUWruxAB63tqomSjPjW16#HcdeIecbD88B.#a#.BA6vZVkOhh",
+"LLLLNOQloY1wyz7A8C#bHdeeddcHa.8ywuZXVpu6#dJKKKKKKKKJH8uVPgNMLLfffffffffLLNPkUWqZtv5ACaFD86w1ZXnlmYv7EHdeIIecaCzzAB.#.86xvZoSPNNN",
+"fffLNORUquy9abGHHdeIIJJIedHFDBzxv0qVlnsx.cIKKKKKKKKJH8uVPgNLLfffffffffLLNiTp0246ACEbHddcb#C7xurWptx8aHdeIIeHEByy6A9.B6w1rolPNLLL",
+"fffLNPSW05CHeIIJJJJJKKKJIdG#9AywuroTjlq3BHIJKKKKKKKJH82oigNLLffffffffLLNPTXuy8.aHdeIIJJIIdcbC6vZZv69FHdeIIeH#A445zA9741YoligLfff",
+"fffLgjVswAEdIIJJJJJKKKJJeHaCA6420YWUkmr38FeJKKKKKKKIGA2WQhgNMLLffffffLNhRoswA.FceIJJJJJJIIdH#7wssv6CbcdeIIeHD7w3wx56xuZpUkPgMLLL",
+"fffMPmrwz.GdIIJJJJJJJJJIdb#BzxvtZqpVUoswAEdJKKKKKKJIbA2pRPPOhgNLLfffLNhjUqu59EHeIJJJJKKJJIIdEAwsZv6CbcdeIIeG.z3222vvuZXomkihNLLL",
+"fffNjW2A.FceIIJJJJJJJJIdHaCA5w1ZYqXpWqt47.GIJKKKKKJeFAvXSRRjjQONLffLMhQTp0w7.bdIJKKKKKKJJJIda8wZZv6CGddeIIebC6v1t0sZYpoUTkQOgNNN",
+"fffglZ6EGcdIIIJJJJJIIIdHFDB642sqpXqqYs2xz9adJKKKKJJeaAvqTlTmmmRONLfLgilWZvyBEHeJKKKKKKKKJJJebBwZrv6CGddeIIdF9y2tZYpoVUmTSkjPOhgg",
+"ffLhnuCdeeIIIIJJJJIIedHFD975vtYWoXYZ0u3x6ADcIKKKKJIdEAvYUUoWXqnjhMLMOkVZuxA.bdIJKKKKKKKKKJJIGBwZrv6CGddeIIdF9y2sqWUSSSkkkkjQiPPP",
+"LLLQX4EeIIIIIIeeddcHHbaD9A6xvtrpWqrstv4y79adJKKKKJId#Aw0pXr0uvZVkhNhjUXt3y8DbdIJKKKKKKKJJIIdE7vYq26CGddeeIdF96v0qoTRRkkSSSRjQiPP",
+"NNhT0zGIIIIeedHFED...C987zy4v1ZqXYZ0tvxzB#GeJKKKKJeH#B52Z0246Ax0pSPRmpru4zB#bdeJJKJJJJIeddHaBxtpX1yCGddeeedFCzw1rWTjjkSlTTSRQiPP",
+"iiRpv9cJIIeedb#B6x55yy6y55x4vusrYZs0t35ADbdIJKKKKJeH#9z4u36B#FC51XmVpZtvx79EbcdIIJIIedcGFEDBy2ZoWt5CGdddeedb.AxuZWTQjklmUmlkjiPP",
+"mmn0y#eJJIedH#A41Zstu2333w4wvutsss0tt369aceJJKKKJIdG#CA64zCFdIH.6uYrs12wyACEbHddeIdcHFE.9875v0Xno05CGddddedbD8yvspTQQklUonTkjiPP",
+"qqr3BGIJJIecFB40omnWXr0tu23wv21tttttt3z.GeIJKKKKJIdb#.987CbeJKIcD6vvvwwxz8.abHHcccGaD9A6543usqoTnsx9Gddddddb#9zw0pTiQkTVpomSjiPP",
+"tt15CHIJJedG#72qmRlUVprs1v4x4321tt00026CHeJJJKKKJeH#CBA769beJKJd#62uuuu2468.EaFGHHa#C87yxwv1Zqomnrv7DbGHHHHbE.ByuYUjjlmopWnTSRjj",
+"vvwz.HeJIdHaCy1XTjSTnWqs2467yxvut0sZrt59GeIJJKKJIdaB76x43z#dIKIHBwZYYYqY02x7B.#abHa#.9Azyx4vtrpnVqtwy89.#FFFaED840WSSTUopWVnUmTT",
+"55y8#GdIdHFD840WSQRlmVXsvy89Ayw2tsrqXZw8FeIJJJKJeG.64321049HIJIaztWVnUmUWr1wyA9#FGaEDCBA7654u0qoopYstvxz8.#EFFb.62qmTUnoWpWWWWWW",
+"AA8CEGddcFDB6vZokijkTUWsw7DE97x2tZYpoqv7adIIJJJId#AwutZYquzaeJdDxYTkRjiiSnqt35ACEbaa#DCB87zy31rpoooWWq0v5AC#FHdF84sonVVoWpXqrrrr",
+"CC.#aGHcb#97xuqnRPQRSTos48FG#8yvtrXoUWu6EdIIIIJeG9y1ZYpVnZxDdJdB2oiPhgNNORUX03yB#baaE#D.98Az420YWnmlRlWZ2y8DbcecD6uXoWooWpYZt111",
+"EEaFbHHHFDBz4urWlRSlmnp1y.HdF9y2sqomSmZx.ceeIIIdEAwsqWnTSp28beb71ViPhhggOjToY14zCE#E#DDC98Az42sqoUlkQSVr2yBEHeJebB40rrYYYrstu222",
+"bbGGHccdG#9753trpVoWXqsw8adeG9y1YomRPRpu7FHHccdbC6vZXVmkQUZxCG.y1WSkRRjRkTUoXs2x7B9CCCCBAzyx20qonUmmTVYux8#GdIJJdE84vv22uuuuu111",
+"HHHccdddHECAy4vu0Zss0t26DHIIHC5tpUkPgOmZx.aaFFFD852ZpnSQPkp1yC74tXnnnVVoVVVoWY0vx67A8BBAz54v0YWUTmUVoqt47DbdIJKJIcE87z66yxwvut00",
+"ddddddedHFD86y5xw333ww5BbdJJc.xsVSPgMNjp2ACCCCC86w1rWmROgPmq25420rXqYZs0rqponpY02wxyzAAz5w2tYWUSSTnpYtwzCbdIJKKKJIcF##D.9Aywu0ZZ",
+"eeeeeeeedb#B7777777z7zAEdIJJd.xrmjhMLLOUsxz7777y420YoligNgjUY11t0sstu34x20qomVpYs1v45z7yw2tZpnljjTortw69FdIJKKKKKJIddcHHbDAxuZrr",
+"eeeeeIIedb#B77AA88A77zA#cIJJdC4qTQgMLLhTYw5555542trXnkPgMgPlors0t1u3x6A8yvsXnopqZs1vw5542trqoUlRknXt368#HdIJKKKKKKJIedddHaByvsZZ",
+"ddddddedHa.Ayy555x4w3vwzDGeea7vqmRPgMNinZw5xxx4v1ZXVmRPhNhQTorstuv4yz8C.Ay31rZs0001u2vvu0ZqXWooVWYt3yACEHdIJKKKKKJIeddHHb#Bz42uu",
+"HHHHcdddG#9zxw3vu1tsZrZv69Fb95uqnlQPgOkWsw5x4wwusqVmSjiOhPRmoYs13x6AB.#E.Bzx3322u111tt0ZYXWppqYZ024yACDFHdIJJKKKKJIdcHba#.B76x44",
+"aaFbGHcHF.8y321srqXoVUVYuxABy30qVmSRiRUqtwx4w3vtrWmkjQQPPjSUoqs24z8C#abGFE.B7z543u10ZYqpWoVoqs13x67BC#abHdeIJKKKJIecGbEDC9B8A7zz",
+"DD#EabHHaC7x2trXoUmSRQjmX034vtZqWVUmlmWr1wxw322sXVSiPiQQjkTnoqsvy8DabHcdcHGFE.8zxv1sYWVnUUmVY1479CD#aFbHHcdIJJKJJIdHFED988BB9999",
+"AA89.#FFDB64usYWnTSQPOPknqt2utsZYqXXXqs13x5w3u1rWURPPijRSTmnoXsv69abHcddddcHGECA5vtZXnUTTTTVr2yCEaFbGHHHHHdeIJJJIecbE#CBA89.#EEE",
+"vv3x6AC.97y4v10rXWnlRiiTWsvxxx44wwwwwwxyzA75w1sqWnljjRkSlTmnVWZv6CabGHHcHHGba.8642tZqWVnUUmVr2y9#abGHHHHHGHcdeeedHGE##D..DEFGHHH",
+"qqYs24zA76543vu10sqVTkRnYu5AA89CCCC.....DD96wtrponmllllllTmUnor26CFbGGGGbFE#.Bz53utsrXpoVnUVr2y9#abHccHHGFbbbGGbFaED#EEaFGHcdddd",
+"SSTVqtw555x444ww3vtqoTlW0w7.#aGHdddddddHHG#A40XooVnnUUmmTTmUUnY26CFbbFFaE#.CB754210sZrYXWonor25BDabHddHGbaEDD.CCCCCCDEbHcdeeIIII",
+"hhOjmX0vww44x5yyz6w0qVUYuyCFHdIJJJJJKJJIedbBxsWnVoWWWVnUmTmmmUqu6CbbFa#D.98Azy4v1000sssYXWVor258.abcddHGa#.BAzy6z788.aHdeIIJJJJJ",
+"LLMhjnruvwx56zA8996vspos37DHdIJKKKKKKKKJJIHCxZVUVWXYqponmTTTTTXt59FFEDCB876yxw210ss0011sYXWpsvyBDaGcddHF#C8z54v34yzA.aHeIJJJJKKK",
+"LLMhkW0wxyzAB9..#DA41YXsvyBEHeJKKKKKKKKJIda8wZVnWXr0ZqonlSSkkkVrv6998765432100ZZYrZ0t1ut0sYZ258#FGHcdHaDBzyxw3v3xy78.aHdIIIJJJJJ",
+"LLMOlX2y78C.#EaaFa9630Y02469adIJKKKKKKJIdb.6vrVVpr0u0YWUSRjjQQTW036yxw210ZqpWWWppXYstuv2uu12xADGHHHHHF.Ay3vvvvvw56AB.EbHdeeIIIII",
+"LLMPmrw89DaFGHHHHGDAxustuvw6CGeJKKKKKJIdGDAxuYVoqsuwuZWmRQiPPPRUX0v210rqpVmlklTUnWqZt23wwww5ADbdedcHb#85vss01234yz89.EFGHcddeeee",
+"LLMPn0y.EbHdddddddF96311111wAadJJJJJJJeH#8y3tqVWrt3530pTQPPhhgPknpZYXWnmlRPOhPQkTVprtv4x5y6A.bdIIedGa96vsppYsu3x67BC.#EFbGHHcddd",
+"LLMPV17aGcdeIIIIedGDAx2110Z1yDcJJJJJJIda96wusqVWZu4z4tpTiOhggNhiSUWVUTkjPhNMMNhikUWrtvxyzA8.FdIJJIdG#A4tXmUpr13x67BC.##EEaFbGHHH",
+"LLMPV17aGcdeIIIIedGDAx21tsrt5.HIJJJJJIcEBy31ZXVWZu4z4tplPhhgNNhPkmonmlRQPhNMLNhPRmoYtvxyzA8.FdIJJIdbD7w0pTmWYt3x67BC.DD##EaFbGGG",
+"LLMPV17aGcdeIIIIedGDAx21tsrt5.HIJJJJJIcEBy31ZXVWZu4z4tplPhhgNNhPkmonmlRQPhNMLNhPRmoYtvxyzA8.FdIJJIdbD7w0pTmWYt3x67BC.DD##EaFbGGG"
+};
index 246c9da77402f70df1b9a94b8b47705a36f77c8d..afeefc86899b57462b8366590e9929d33e3fd919 100644 (file)
@@ -537,6 +537,9 @@ char *defaults [] = {
   ".foreground:                Gray40",
   "*delay:             70000",
   "*delay2:            5",
+#ifdef __sgi    /* really, HAVE_READ_DISPLAY_EXTENSION */
+  "*visualID:          Best",
+#endif
   0
 };
 
index ae9f7a0ec472fd92af43f307e3936822bf034ae6..36b28e416f687e0823825f850a0af0aed2d2a73c 100644 (file)
@@ -3,10 +3,20 @@
 jigsaw - permute the screen image like a jigsaw puzzle
 .SH SYNOPSIS
 .B jigsaw
-[\-display \fIhost:display.screen\fP] [\-background \fIcolor\fP] [\-delay \fIusecs\fP] [\-window] [\-root] [\-install] [\-visual \fIvisual\fP]
+[\-display \fIhost:display.screen\fP] [\-background \fIcolor\fP]
+[\-delay \fIusecs\fP] [\-window] [\-root] [\-install] [\-visual \fIvisual\fP]
 .SH DESCRIPTION
-The \fIjigsaw\fP program takes an image of the screen, carves it up into
+The \fIjigsaw\fP program takes an image, carves it up into
 a jigsaw puzzle, shuffles it, and then solves it.
+
+The image that it manipulates will be grabbed from the portion of
+the screen underlying the window, or from the system's video input,
+or from a random file on disk, as indicated by
+the \fIgrabDesktopImages\fP, \fIgrabVideoFrames\fP,
+and \fIchooseRandomImages\fP options in the \fI~/.xscreensaver\fP
+file; see
+.BR xscreensaver-demo (1)
+for more details.
 .SH OPTIONS
 .I jigsaw
 accepts the following options:
@@ -26,30 +36,6 @@ or the id number (decimal or hex) of a specific visual.
 .TP 8
 .B \-delay \fImicroseconds\fP
 How long to wait between shuffling pieces; default 700000, or 0.7 seconds.
-.SH RESOURCES
-On some systems (currently, only SGIs), this program can, instead of grabbing
-a desktop image, grab a frame of video from an external camera and manipulate
-that instead.  The following resources control that.
-.PP
-.TP 8
-.B grabVideoProbability \fR(Float)\fP
-What portion of the time to grab video rather than a screen image, 
-between 0.0 and 1.0.  Defaults to 0.5, or half the time.
-.TP 8
-.B videoDevice \fR(Integer)\fP
-The number of the default video input device to check first.  If unspecified, 
-the default camera (from videopanel(1)) will be checked first.  After that, all
-other available video input devices will be checked in order.  
-
-The first one which produces a non-black image will be used.  If all images
-are black, the others will be re-checked a few times before giving up and
-falling back to simply grabbing a desktop image (but note that this takes a
-few seconds, so if you don't actually have any video sources hooked up, you
-should consider turning off video grabbing by setting
-\fBgrabVideoProbability\fP to 0.0.)
-.TP 8
-.B videoGain \fR(Float)\fP
-The amount by which to brighten the grabbed image.  This defaults to 2.2.
 .SH ENVIRONMENT
 .PP
 .TP 8
@@ -61,7 +47,9 @@ to get the name of a resource file that overrides the global resources
 stored in the RESOURCE_MANAGER property.
 .SH SEE ALSO
 .BR X (1),
-.BR xscreensaver (1)
+.BR xscreensaver (1),
+.BR xscreensaver\-demo (1),
+.BR xscreensaver\-getimage (1)
 .SH COPYRIGHT
 Copyright \(co 1997 by Jamie Zawinski.  Permission to use, copy, modify, 
 distribute, and sell this software and its documentation for any purpose is 
index 10a46f73cb24b24200aff39b83bd875e74367319..7c692204b41c7950d9822ceda842470dc3acfbc1 100644 (file)
@@ -1695,7 +1695,7 @@ screenhack(Display *display, Window window)
     unsigned long *pixels; /* ignored - unfreed */
     int npixels;
     logo_map = xscreensaver_logo (dpy, win, xgwa.colormap, bg,
-                                  &pixels, &npixels,
+                                  &pixels, &npixels, 0,
                                   logo_width > 150);
   }
 #else
index 03a02453e013bee70cb12ebc11711cb90f2863bb..27dde18c40e7ff38fe19133565c3ac2d05cd6cdd 100644 (file)
@@ -10,9 +10,18 @@ rotzoomer - animated rotations and scalings of portions of the screen
 [\-shm | \-no\-shm]
 [\-window] [\-root] [\-install] [\-visual \fIvisual\fP]
 .SH DESCRIPTION
-The \fIrotzoomer\fP program grabs an image of the screen, then picks
-rectangles and draws scaled and rotated animations of that part of
-the screen.
+The \fIrotzoomer\fP program grabs an image, then picks
+rectangles and draws scaled and rotated animations of that 
+section.
+
+The image that it manipulates will be grabbed from the portion of
+the screen underlying the window, or from the system's video input,
+or from a random file on disk, as indicated by
+the \fIgrabDesktopImages\fP, \fIgrabVideoFrames\fP,
+and \fIchooseRandomImages\fP options in the \fI~/.xscreensaver\fP
+file; see
+.BR xscreensaver-demo (1)
+for more details.
 .SH OPTIONS
 .I rotzoomer
 accepts the following options:
@@ -56,7 +65,9 @@ to get the name of a resource file that overrides the global resources
 stored in the RESOURCE_MANAGER property.
 .SH SEE ALSO
 .BR X (1),
-.BR xscreensaver (1)
+.BR xscreensaver (1),
+.BR xscreensaver\-demo (1),
+.BR xscreensaver\-getimage (1)
 .SH COPYRIGHT
 Copyright \(co 2001 by Claudio Matsuoka.  Permission to use, copy, modify, 
 distribute, and sell this software and its documentation for any purpose is 
index be5c19befc6aad8defb6eaab1fed1274d6dec039..e2becbe4b4ac652b34cf20aaa4667bac4e8403ac 100644 (file)
@@ -86,6 +86,7 @@ static char *default_defaults[] = {
   "*mono:              false",
   "*installColormap:   false",
   "*visualID:          default",
+  "*desktopGrabber:    xscreensaver-getimage %s",
   0
 };
 
index c2fc03324b2900ac3e11113018ceb80737587f4e..69f67df6a51174671f943ebf83cd3ab3c58e6f82 100644 (file)
@@ -37,8 +37,6 @@ init_slide (Display *dpy, Window window)
 
   XGetWindowAttributes (dpy, window, &xgwa);
   grab_screen_image (xgwa.screen, window);
-
-  XGetWindowAttributes (dpy, window, &xgwa);  /* re-retrieve colormap */
   cmap = xgwa.colormap;
   visual = xgwa.visual;
   max_width = xgwa.width;
index a3e9d902f5fc65aeff5ad9a978dc1c443d8c0251..67520d2f92c6d3973faf1bc0e9a4a8db2f6b48c7 100644 (file)
@@ -3,11 +3,23 @@
 slidescreen - permute the screen image like an 8-puzzle
 .SH SYNOPSIS
 .B slidescreen
-[\-display \fIhost:display.screen\fP] [\-background \fIcolor\fP] [\-grid-size \fIpixels\fP] [\-ibw \fIpixels\fP] [\-increment \fIpixels\fP] [\-delay \fIusecs\fP] [\-delay2 \fIusecs\fP] [\-window] [\-root] [\-install] [\-visual \fIvisual\fP]
+[\-display \fIhost:display.screen\fP] [\-background \fIcolor\fP]
+[\-grid-size \fIpixels\fP] [\-ibw \fIpixels\fP] [\-increment \fIpixels\fP]
+[\-delay \fIusecs\fP] [\-delay2 \fIusecs\fP]
+[\-window] [\-root] [\-install] [\-visual \fIvisual\fP]
 .SH DESCRIPTION
-The \fIslidescreen\fP program takes an image of the screen, divides it into
+The \fIslidescreen\fP program takes an image, divides it into
 a grid, deletes a random square of that grid, and then randomly slides 
 one of the neighbors of this "hole" into the hole (and repeat.)
+
+The image that it manipulates will be grabbed from the portion of
+the screen underlying the window, or from the system's video input,
+or from a random file on disk, as indicated by
+the \fIgrabDesktopImages\fP, \fIgrabVideoFrames\fP,
+and \fIchooseRandomImages\fP options in the \fI~/.xscreensaver\fP
+file; see
+.BR xscreensaver-demo (1)
+for more details.
 .SH OPTIONS
 .I slidescreen
 accepts the following options:
@@ -44,30 +56,6 @@ is closely related to the \fI\-increment\fP parameter.
 How much of a delay should be introduced between the end of the motion of
 one segment and the beginning of the motion of another.  Default 1000000,
 which is one second.
-.SH RESOURCES
-On some systems (currently, only SGIs), this program can, instead of grabbing
-a desktop image, grab a frame of video from an external camera and manipulate
-that instead.  The following resources control that.
-.PP
-.TP 8
-.B grabVideoProbability \fR(Float)\fP
-What portion of the time to grab video rather than a screen image, 
-between 0.0 and 1.0.  Defaults to 0.5, or half the time.
-.TP 8
-.B videoDevice \fR(Integer)\fP
-The number of the default video input device to check first.  If unspecified, 
-the default camera (from videopanel(1)) will be checked first.  After that, all
-other available video input devices will be checked in order.  
-
-The first one which produces a non-black image will be used.  If all images
-are black, the others will be re-checked a few times before giving up and
-falling back to simply grabbing a desktop image (but note that this takes a
-few seconds, so if you don't actually have any video sources hooked up, you
-should consider turning off video grabbing by setting
-\fBgrabVideoProbability\fP to 0.0.)
-.TP 8
-.B videoGain \fR(Float)\fP
-The amount by which to brighten the grabbed image.  This defaults to 2.2.
 .SH ENVIRONMENT
 .PP
 .TP 8
@@ -79,7 +67,9 @@ to get the name of a resource file that overrides the global resources
 stored in the RESOURCE_MANAGER property.
 .SH SEE ALSO
 .BR X (1),
-.BR xscreensaver (1)
+.BR xscreensaver (1),
+.BR xscreensaver\-demo (1),
+.BR xscreensaver\-getimage (1)
 .SH COPYRIGHT
 Copyright \(co 1992 by Jamie Zawinski.  Permission to use, copy, modify, 
 distribute, and sell this software and its documentation for any purpose is 
index d513654c2e61cda72963fe95b4dba1e19d769462..25a552575cd9154cb3adaf75c6ce3db403223150 100644 (file)
@@ -3,9 +3,22 @@
 slip - sucks your screen into a jet engine
 .SH SYNOPSIS
 .B slip
-[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-ncolors \fIinteger\fP] [\-iterations \fIinteger\fP] [\-points \fIinteger\fP] [\-delay \fImicroseconds\fP] [\-delay2 \fImicroseconds\fP]
+[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP]
+[\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install]
+[\-visual \fIvisual\fP] [\-ncolors \fIinteger\fP]
+[\-iterations \fIinteger\fP] [\-points \fIinteger\fP]
+[\-delay \fImicroseconds\fP] [\-delay2 \fImicroseconds\fP]
 .SH DESCRIPTION
-The \fIslip\fP program does lots of blits and chews up your screen image.
+The \fIslip\fP program does lots of blits and chews up an image.
+
+The image that it manipulates will be grabbed from the portion of
+the screen underlying the window, or from the system's video input,
+or from a random file on disk, as indicated by
+the \fIgrabDesktopImages\fP, \fIgrabVideoFrames\fP,
+and \fIchooseRandomImages\fP options in the \fI~/.xscreensaver\fP
+file; see
+.BR xscreensaver-demo (1)
+for more details.
 .SH OPTIONS
 .I slip
 accepts the following options:
@@ -40,31 +53,6 @@ How long to frobnicate.  Default 50.
 .B \-delay \fImicroseconds\fP
 How long we should wait between drawing each step.  Default 50000,
 or about 1/20th second.
-
-.SH RESOURCES
-On some systems (currently, only SGIs), this program can, instead of grabbing
-a desktop image, grab a frame of video from an external camera and manipulate
-that instead.  The following resources control that.
-.PP
-.TP 8
-.B grabVideoProbability \fR(Float)\fP
-What portion of the time to grab video rather than a screen image, 
-between 0.0 and 1.0.  Defaults to 0.5, or half the time.
-.TP 8
-.B videoDevice \fR(Integer)\fP
-The number of the default video input device to check first.  If unspecified, 
-the default camera (from videopanel(1)) will be checked first.  After that, all
-other available video input devices will be checked in order.  
-
-The first one which produces a non-black image will be used.  If all images
-are black, the others will be re-checked a few times before giving up and
-falling back to simply grabbing a desktop image (but note that this takes a
-few seconds, so if you don't actually have any video sources hooked up, you
-should consider turning off video grabbing by setting
-\fBgrabVideoProbability\fP to 0.0.)
-.TP 8
-.B videoGain \fR(Float)\fP
-The amount by which to brighten the grabbed image.  This defaults to 2.2.
 .SH ENVIRONMENT
 .PP
 .TP 8
@@ -77,7 +65,8 @@ stored in the RESOURCE_MANAGER property.
 .SH SEE ALSO
 .BR X (1),
 .BR xscreensaver (1),
-.BR xlock (1)
+.BR xscreensaver\-demo (1),
+.BR xscreensaver\-getimage (1)
 .SH COPYRIGHT
 Copyright \(co 1992 by Scott Draves.
 
index 31e9f71b9a6b9c71d87d94f0f816441a473532f1..0af60b7bee258214974a139f73e5bfd5b27f459b 100644 (file)
@@ -3,9 +3,21 @@
 spotlight - move spotlight around desktop
 .SH SYNOPSIS
 .B spotlight
-[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-delay \fIusecs\fP] [\-radius \fIpixels\fP]
+[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP]
+[\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install]
+[\-visual \fIvisual\fP] [\-delay \fIusecs\fP] [\-radius \fIpixels\fP]
 .SH DESCRIPTION
-The \fIspotlight\fP program draws random rectangles.
+The \fIspotlight\fP program takes an image and exposes small sections
+of it as if through a wandering spotlight beam.
+
+The image that it manipulates will be grabbed from the portion of
+the screen underlying the window, or from the system's video input,
+or from a random file on disk, as indicated by
+the \fIgrabDesktopImages\fP, \fIgrabVideoFrames\fP,
+and \fIchooseRandomImages\fP options in the \fI~/.xscreensaver\fP
+file; see
+.BR xscreensaver-demo (1)
+for more details.
 .SH OPTIONS
 .I spotlight
 accepts the following options:
@@ -42,7 +54,9 @@ to get the name of a resource file that overrides the global resources
 stored in the RESOURCE_MANAGER property.
 .SH SEE ALSO
 .BR X (1),
-.BR xscreensaver (1)
+.BR xscreensaver (1),
+.BR xscreensaver\-demo (1),
+.BR xscreensaver\-getimage (1)
 .SH COPYRIGHT
 Copyright \(co 1999 by Rick Schultz.  Permission to use, copy, modify, 
 distribute, and sell this software and its documentation for any purpose is 
@@ -54,4 +68,3 @@ express or implied warranty.
 .SH CREDITS
 Hacked together by Rick Schultz <rick@skapunx.net>, based on StefView for
 BackSpace by Darcy Brockbank and on several other xscreensaver hacks.
-
index 5d9fe9cd1592bda5623a10c5408445aa8cdc9a11..5dc85b67b0a9e2025701bcb64abf5f7aaa4e1df6 100755 (executable)
@@ -1,6 +1,5 @@
-#!/bin/sh
-#
-# vidwhacker, for xscreensaver.  Copyright (c) 1998, 1999 Jamie Zawinski.
+#!/usr/bin/perl -w
+# vidwhacker, for xscreensaver.  Copyright (c) 1998-2001 Jamie Zawinski.
 #
 # Permission to use, copy, modify, distribute, and sell this software and its
 # documentation for any purpose is hereby granted without fee, provided that
 # software for any purpose.  It is provided "as is" without express or 
 # implied warranty.
 #
-#
-# This script grabs a frame of video, then uses various pbm filters to
+# This program grabs a frame of video, then uses various pbm filters to
 # munge the image in random nefarious ways, then uses xloadimage, xli, or xv
 # to put it on the root window.  This works out really nicely if you just
 # feed some random TV station into it...
 #
-# The video grabbing part is SGI-specific -- if you want to use this on
-# another system, add a new clause to the grab() procedure.
-
-
-# need perl to generate random numbers -- I don't know another way to do
-# that from a shell script.
-perl=perl
-
-
-onroot=false
-verbose=false
-delay=3
-use_stdin=false
-use_stdout=false
-
-pid=""
-tmp=${TMPDIR:-/tmp}/vidwhacker.$$
-tmp_rgb=$tmp-00000.rgb
-tmp_ppm0=$tmp-0.ppm
-tmp_ppm1=$tmp-1.ppm
-tmp_ppm2=$tmp-2.ppm
-tmp_ppm3=$tmp-3.ppm
-tmp_ppm4=$tmp-4.ppm
-tmp_ppmS=$tmp-S.ppm
-
-
-# Figure out whether to use xloadimage, xli, or xv.
-pick_displayer() {
-  displayer=
-  for prog in xloadimage xli xv ; do
-    IFS=:
-    for p in $PATH; do
-      IFS=
-      if [ "$p" = "" ]; then p=. ; fi
-      if [ -x $p/$prog ]; then
-        displayer=$prog
-        break 2
-      fi
-    done
-  done
-
-  if [ "$displayer" = "xloadimage" ]; then
-    displayer_args="-quiet"
-    displayer_win_args=""
-    displayer_root_args="-onroot"
-  elif [ "$displayer" = "xli" ]; then
-    displayer_args="-quiet"
-    displayer_win_args=""
-    displayer_root_args="-onroot -center -border black"
-  elif [ "$displayer" = "xv" ]; then
-    displayer_args="-quick24"
-    displayer_win_args="-geom +0+0"
-    displayer_root_args="-root -rmode 5 -noresetroot -rfg black -rbg black -viewonly"
-  else
-    echo "$0: neither xli nor xv found on \$PATH"
-    exit -1
-  fi
-}
+# Created: 14-Apr-01.
 
-# Process command-line args
-getargs() {
-
-  while [ $# != 0 ]; do
-    case "$1" in
-    -display | -disp | -dis | -dpy | -d )
-      shift
-      DISPLAY="$1"
-      export DISPLAY
-      ;;
-    -root )
-      onroot=true
-      ;;
-    -window )
-      onroot=false
-      ;;
-    -verbose )
-      verbose=true
-      ;;
-    -stdin )
-      use_stdin=true
-      ;;
-    -stdout )
-      use_stdout=true
-      ;;
-    -delay)
-      shift
-      delay="$1"
-      ;;
-    * )
-      echo "VidWhacker, Copyright (c) 1999 Jamie Zawinski <jwz@jwz.org>" >&2
-      echo "            http://www.jwz.org/xscreensaver/" >&2
-      echo "" >&2
-      echo "usage: $0 [-display dpy] [-verbose] [-root | -window]" >&2
-      echo "                  [-stdin] [-stdout] [-delay secs]" >&2
-      exit 1
-      ;;
-    esac
-    shift
-  done
-
-  pick_displayer
-
-  if [ "$onroot" = true ]; then
-    displayer_args="$displayer_args $displayer_root_args"
-  else
-    displayer_args="$displayer_args $displayer_win_args"
-  fi
-
-
-  screen_width=''
-  if [ "$use_stdout" = false ]; then
-    screen_width=`xdpyinfo 2>/dev/null | 
-        sed -n 's/.* dimensions: *\([0-9]*\).*/\1/p'`
-    if [ "$screen_width" = "" ]; then
-      screen_width=800
-    fi
-  fi
-}
+require 5;
+use diagnostics;
+use strict;
 
+my $progname = $0; $progname =~ s@.*/@@g;
+my $version = q{ $Revision: 1.17 $ }; $version =~ s/^[^0-9]+([0-9.]+).*$/$1/;
 
-clean() {
-  rm -f $tmp_rgb $tmp_ppm1 $tmp_ppm2 $tmp_ppm3 $tmp_ppm4
-}
+my $verbose = 0;
+my $use_stdin = 0;
+my $use_stdout = 0;
+my $video_p = 0;
+my $file_p = 1;
+my $delay = 5;
+my $imagedir;
 
-clean2() {
-  clean
-  rm -f $tmp_ppm0 $tmp_ppmS
-}
+my $screen_width = -1;
 
 
-# Grab a frame of video.  leaves it in $tmp_ppm1.
+
+# ####  This list was lifted from driver/xscreensaver-getimage-file
 #
-grab() {
-  uname=`uname`
-  if [ $uname = IRIX ]; then
-    #
-    # SGI's "vidtomem" returns an SGI RGB image of the default video input,
-    # and has stupid non-overridable ouput-file-naming conventions.  So, let 
-    # it write its file; and then convert it to a pgm.
-    #
-    
-    vidtomem -f $tmp
-    sgitopnm $tmp_rgb > $tmp_ppm1
-
-    # Cut off the close-captioning blips in the NTSC overscan region.  YMMV.
-    #  | pnmcut 12 7 695 477 
-
-  elif [ $uname = Linux ]; then
-
-    # Marcus Herbert says the following works with his Connectix Qcam.
-    # Don't have qcam?  Well, do something else then...  and send me a patch.
-
-    qcam > $tmp_ppm1
-
-    # Friedrich Delgado Friedrichs says the following works if you have
-    # XawTV installed:
-    #
-    #   streamer -o $tmp_ppm1
-    #
-
-    # James Isaacs says this works for the ATI video capture card:
-    #
-    #   atitv snap $tmp_ppm1
-    #
-
-  else
-    echo "$0: don't know how to grab video on this OS." >&2
-    clean2
-    exit 1
-  fi
-}
+# These are programs that can be used to put an image file on the root
+# window (including virtual root windows.)  The first one of these programs
+# that exists on $PATH will be used (with the file name as the last arg.)
+#
+# If you add other programs to this list, please let me know!
+#
+my @displayer_programs = (
+  "xv         -root -quit -viewonly -maxpect -noresetroot -quick24 -rmode 5" .
+  "           -rfg black -rbg black",
+  "xli        -quiet -fullscreen -onroot -center -border black",
+  "xloadimage -quiet -fullscreen -onroot -center -border black",
+  "chbg       -once -xscreensaver -max_grow 4",
+
+# this lame program wasn't built with vroot.h:
+# "xsri       -scale -keep-aspect -center-horizontal -center-vertical",
+);
 
 
-# Use perl to pick a random foreground/background color in pbm's syntax.
+# List of interesting PPM filter pipelines.
+# In this list, the following magic words may be used:
 #
-randcolor() {
-  $perl -e 'srand(time ^ $$);
-            printf("#%02x%02x%02x-#%02x%02x%02x",
-                   int(rand()*60),
-                   int(rand()*60),
-                   int(rand()*60),
-                   120+int(rand()*135),
-                   120+int(rand()*135),
-                   120+int(rand()*135))'
-}
+#  COLORS       a randomly-selected pair of RGB foreground/background colors.
+#  FILE1        the (already-existing) input PPM file (ok to overwrite it).
+#  FILE2-FILE4  names of other tmp files you can use.
+#
+# These commands should read from FILE1, and write to stdout.
+# All tmp files will be deleted afterward.
+#
+my @filters = (
+  "ppmtopgm FILE1 | pgmedge | pgmtoppm COLORS | ppmnorm",
+  "ppmtopgm FILE1 | pgmenhance | pgmtoppm COLORS",
+  "ppmtopgm FILE1 | pgmoil | pgmtoppm COLORS",
+  "ppmtopgm FILE1 | pgmbentley | pgmtoppm COLORS",
 
-rand() {
-  $perl -e "srand(time ^ $$); print int(rand() * $1)"
-}
+  "ppmrelief FILE1 | ppmtopgm | pgmedge | ppmrelief | ppmtopgm |" .
+   " pgmedge | pnminvert | pgmtoppm COLORS",
 
+  "ppmspread 71 FILE1 > FILE2 ; " .
+  " pnmarith -add FILE1 FILE2 ; ",
 
+  "pnmflip -lr < FILE1 > FILE2 ; " .
+  " pnmarith -multiply FILE1 FILE2 > FILE3 ; " .
+  " pnmflip -tb FILE3 | ppmnorm > FILE2 ; " .
+  " pnmarith -multiply FILE1 FILE2",
 
-# Frobnicate the image in some random way.
+  "pnmflip -lr FILE1 > FILE2 ; " .
+  " pnmarith -difference FILE1 FILE2",
+
+  "pnmflip -tb FILE1 > FILE2 ; " .
+  " pnmarith -difference FILE1 FILE2",
+
+  "pnmflip -lr FILE1 | pnmflip -tb > FILE2 ; " .
+  " pnmarith -difference FILE1 FILE2",
+
+  "ppmtopgm < FILE1 | pgmedge > FILE2 ; " .
+  " pnmarith -difference FILE1 FILE2 > FILE3 ; " .
+  " cp FILE3 FILE1 ; " .
+  " ppmtopgm < FILE1 | pgmedge > FILE2 ; " .
+  " pnmarith -difference FILE1 FILE2 > FILE3 ; " .
+  " ppmnorm < FILE1",
+
+  "pnmflip -lr < FILE1 > FILE2 ; " .
+  " pnmarith -multiply FILE1 FILE2 | ppmrelief | ppmnorm | pnminvert",
+
+  "pnmflip -lr FILE1 > FILE2 ; " .
+  " pnmarith -subtract FILE1 FILE2 | ppmrelief | ppmtopgm | pgmedge",
+
+  "pgmcrater -number 20000 -width WIDTH -height HEIGHT FILE1 | " .
+  "   pgmtoppm COLORS > FILE2 ; " .
+  " pnmarith -difference FILE1 FILE2 > FILE3 ; " .
+  " pnmflip -tb FILE3 | ppmnorm > FILE2 ; " .
+  " pnmarith -multiply FILE1 FILE2",
+
+  "ppmshift 30 FILE1 | ppmtopgm | pgmoil | pgmedge | " .
+  "   pgmtoppm COLORS > FILE2 ; " .
+  " pnmarith -difference FILE1 FILE2",
+
+  "ppmpat -madras WIDTH HEIGHT | pnmdepth 255 > FILE2 ; " .
+  " pnmarith -difference FILE1 FILE2",
+
+  "ppmpat -tartan WIDTH HEIGHT | pnmdepth 255 > FILE2 ; " .
+  " pnmarith -difference FILE1 FILE2",
+
+  "ppmpat -camo WIDTH HEIGHT | pnmdepth 255 | ppmshift 50 > FILE2 ; " .
+  " pnmarith -multiply FILE1 FILE2",
+
+  "pgmnoise WIDTH HEIGHT | pgmedge | pgmtoppm COLORS > FILE2 ; " .
+  " pnmarith -difference FILE1 FILE2 | pnmdepth 255 | pnmsmooth",
+);
+
+
+sub error {
+  ($_) = @_;
+  print STDERR "$progname: $_\n";
+  exit 1;
+}
+
+# ####  Lifted from driver/xscreensaver-getimage-file
 #
-frob() {
-
-  w_h=`head -2 $tmp_ppm1 | tail -1`
-  width=`echo $w_h | awk '{print $1}'`
-  height=`echo $w_h | awk '{print $2}'`
-
-  N=`rand 17`
-
-  if [ "$verbose" = true ]; then
-    echo "mode $N..." >&2
-  fi
-
-  if   [ $N = 0 ]; then
-    ppmtopgm $tmp_ppm1 | pgmedge | pgmtoppm `randcolor` | ppmnorm
-
-  elif [ $N = 1 ]; then
-    ppmtopgm $tmp_ppm1 | 
-    pgmenhance | 
-    pgmtoppm `randcolor`
-
-  elif [ $N = 2 ]; then
-    ppmtopgm $tmp_ppm1 | pgmoil | pgmtoppm `randcolor`
-
-  elif [ $N = 3 ]; then 
-    ppmrelief $tmp_ppm1 | ppmtopgm | pgmedge | ppmrelief | ppmtopgm |
-      pgmedge | pnminvert | pgmtoppm `randcolor`
-
-  elif [ $N = 4 ]; then
-    ppmspread 71 $tmp_ppm1 > $tmp_ppm2
-    pnmarith -add $tmp_ppm1 $tmp_ppm2
-
-  elif [ $N = 5 ]; then
-    pnmflip -lr $tmp_ppm1 > $tmp_ppm2
-    pnmarith -multiply $tmp_ppm1 $tmp_ppm2 > $tmp_ppm3
-    pnmflip -tb $tmp_ppm3 | ppmnorm > $tmp_ppm2
-    pnmarith -multiply $tmp_ppm1 $tmp_ppm2
-
-  elif [ $N = 6 ]; then
-    N2=`rand 3`
-    if [ $N2 = 0 ]; then
-      pnmflip -lr $tmp_ppm1 > $tmp_ppm2
-    elif [ $N2 = 1 ]; then
-      pnmflip -tb $tmp_ppm1 > $tmp_ppm2
-    else
-      pnmflip -lr $tmp_ppm1 > $tmp_ppm2
-      pnmflip -tb $tmp_ppm2 > $tmp_ppm3
-      cp $tmp_ppm3 $tmp_ppm2
-    fi
-
-    pnmarith -difference $tmp_ppm1 $tmp_ppm2
-
-  elif [ $N = 7 ]; then
-
-    for i in 1 2 3 ; do
-      ppmtopgm $tmp_ppm1 | pgmedge > $tmp_ppm2
-      pnmarith -difference $tmp_ppm1 $tmp_ppm2 > $tmp_ppm3
-      cp $tmp_ppm3 $tmp_ppm1
-    done
-    ppmnorm < $tmp_ppm1
-
-  elif [ $N = 8 ]; then
-    pnmflip -lr $tmp_ppm1 > $tmp_ppm2
-    pnmarith -multiply $tmp_ppm1 $tmp_ppm2 | ppmrelief | ppmnorm | pnminvert
-
-  elif [ $N = 9 ]; then
-    pnmflip -lr $tmp_ppm1 > $tmp_ppm2
-    pnmarith -subtract $tmp_ppm1 $tmp_ppm2 | ppmrelief | ppmtopgm | pgmedge
-
-  elif [ $N = 10 ]; then
-    ppmtopgm $tmp_ppm1 | pgmbentley | pgmtoppm `randcolor`
-
-  elif [ $N = 11 ]; then
-    pgmcrater -number 20000 -height $height -width $width | pgmtoppm `randcolor` > $tmp_ppm2
-    pnmarith -difference $tmp_ppm1 $tmp_ppm2 > $tmp_ppm3
-    pnmflip -tb $tmp_ppm3 | ppmnorm > $tmp_ppm2
-    pnmarith -multiply $tmp_ppm1 $tmp_ppm2
-
-  elif [ $N = 12 ]; then
-    ppmshift 30 $tmp_ppm1 | ppmtopgm | pgmoil | pgmedge |  pgmtoppm `randcolor` > $tmp_ppm2
-    pnmarith -difference $tmp_ppm1 $tmp_ppm2 
-
- elif [ $N = 13 ]; then
-    ppmpat -madras $width $height | pnmdepth 255 > $tmp_ppm2
-    pnmarith -difference $tmp_ppm1 $tmp_ppm2
-  elif [ $N = 14 ]; then
-    ppmpat -tartan $width $height | pnmdepth 255 > $tmp_ppm2
-    pnmarith -difference  $tmp_ppm1 $tmp_ppm2 
-  
-  elif [ $N = 15 ]; then
-    ppmpat -camo $width $height | pnmdepth 255 | ppmshift 50 > $tmp_ppm2
-    pnmarith -multiply $tmp_ppm1 $tmp_ppm2
-  
-  elif [ $N = 16 ]; then
-    pgmnoise $width $height | pgmedge | pgmtoppm `randcolor` > $tmp_ppm2
-    pnmarith -difference $tmp_ppm1 $tmp_ppm2 | pnmdepth 255 | pnmsmooth
-
-  else cat $tmp_ppm1
-  fi
+sub pick_displayer {
+  my @names = ();
+
+  foreach my $cmd (@displayer_programs) {
+    $_ = $cmd;
+    my ($name) = m/^([^ ]+)/;
+    push @names, "\"$name\"";
+    print STDERR "$progname: looking for $name...\n" if ($verbose > 2);
+    foreach my $dir (split (/:/, $ENV{PATH})) {
+      print STDERR "$progname:   checking $dir/$name\n" if ($verbose > 3);
+      return $cmd if (-x "$dir/$name");
+    }
+  }
+
+  $names[$#names] = "or " . $names[$#names];
+  printf STDERR "$progname: none of: " . join (", ", @names) .
+                " were found on \$PATH.\n";
+  exit 1;
 }
 
 
-# Grab a frame and frob it.  leave it in $tmp_ppm3.
+# Choose random foreground and background colors
 #
-whack() {
-  clean
-
-  while [ ! -f $tmp_ppm1 ]; do
-    if [ "$use_stdin" != true ]; then
-      grab
-    else
-      cp $tmp_ppmS $tmp_ppm0
-      cp $tmp_ppm0 $tmp_ppm1
-    fi
-  done
-
-  rm -f $tmp_rgb
-
-  if [ "$screen_width" != "" ]; then
-    frob | pnmscale -width $screen_width > $tmp_ppm3
-  else
-    frob > $tmp_ppm3
-  fi
-
-  rm -f $tmp_ppm1 $tmp_ppm2
+sub randcolors {
+  return sprintf ("#%02x%02x%02x-#%02x%02x%02x",
+                  int(rand()*60),
+                  int(rand()*60),
+                  int(rand()*60),
+                  120+int(rand()*135),
+                  120+int(rand()*135),
+                  120+int(rand()*135));
 }
 
 
-# Kill off the xli or xv subprocess, if it's running
+sub filter_subst {
+  my ($filter, $width, $height, @tmpfiles) = @_;
+  my $colors = randcolors();
+  $filter =~ s/\bWIDTH\b/$width/g;
+  $filter =~ s/\bHEIGHT\b/$height/g;
+  $filter =~ s/\bCOLORS\b/'$colors'/g;
+  my $i = 1;
+  foreach my $t (@tmpfiles) {
+    $filter =~ s/\bFILE$i\b/$t/g;
+    $i++;
+  }
+  if ($filter =~ m/([A-Z]+)/) {
+    error "internal error: what is \"$1\"?";
+  }
+  $filter =~ s/  +/ /g;
+  return $filter;
+}
+
+# Frobnicate the image in some random way.
 #
-kill_pid() {
-  if [ "$pid" != "" ]; then
+sub frob_ppm {
+  my ($ppm_data) = @_;
+  $_ = $ppm_data;
+
+  error "0-length data" if (!defined($ppm_data) || $ppm_data eq  "");
+  error "not a PPM file" unless (m/^P\d\n/s);
+  my ($width, $height) = m/^P\d\n(\d+) (\d+)\n/s;
+  error "got a bogus PPM" unless ($width && $height);
+
+  my $tmpdir = $ENV{TMPDIR};
+  $tmpdir = "/tmp" unless $tmpdir;
+  my $fn = sprintf("$tmpdir/vw.%04x", $$);
+  my @files = ( "$fn", "$fn.1", "$fn.2", "$fn.3" );
+
+  my $n = int(rand($#filters+1));
+  my $filter = $filters[$n];
+
+  if ($verbose == 1) {
+    printf STDERR "$progname: running filter $n\n";
+  } elsif ($verbose > 1) {
+    my $f = $filter;
+    $f =~ s/  +/ /g;
+    $f =~ s/^ */\t/;
+    $f =~ s/ *\|/\n\t|/g;
+    $f =~ s/ *\; */ ;\n\t/g;
+    print STDERR "$progname: filter $n:\n\n$f\n\n" if $verbose;
+  }
+
+  $filter = filter_subst ($filter, $width, $height, @files);
+
+  unlink @files;
+
+  local *OUT;
+  open (OUT, ">$files[0]") || error ("writing $files[0]: $!");
+  print OUT $ppm_data;
+  close OUT;
+
+  $filter = "( $filter )";
+  $filter .= "2>/dev/null" unless ($verbose > 1);
+
+  local *IN;
+  open (IN, "$filter |") || error ("opening pipe: $!");
+  $ppm_data = "";
+  while (<IN>) { $ppm_data .= $_; }
+  close IN;
+
+  unlink @files;
+  return $ppm_data;
+}
 
-    if [ "$verbose" = true ]; then
-      echo "killing pid $pid..." >&2
-    fi
 
-    # need to do this to avoid "6898 Terminated" messages!
-    # apparently one can't redirect the output of the builtin `kill' command.
-#    ( sh -c "kill $pid" ) >/dev/null 2>/dev/null </dev/null
+sub read_config {
+  my $conf = "$ENV{HOME}/.xscreensaver";
 
-    # wtf?  that doesn't work either.  Is it writing to /dev/tty??
-    kill $pid >/dev/null 2>&1
+  my $had_dir = defined($imagedir);
 
-    pid=""
-  fi
-}
+  local *IN;
+  open (IN, "<$conf") ||  error "reading $conf: $!";
+  while (<IN>) {
+    if (!$imagedir && m/^imageDirectory:\s+([^\s]+)\s*$/i) { $imagedir = $1; }
+    elsif (m/^grabVideoFrames:\s+true\s*$/i)     { $video_p = 1; }
+    elsif (m/^grabVideoFrames:\s+false\s*$/i)    { $video_p = 0; }
+    elsif (m/^chooseRandomImages:\s+true\s*$/i)  { $file_p  = 1; }
+    elsif (m/^chooseRandomImages:\s+false\s*$/i) { $file_p  = 0; }
+  }
+  close IN;
 
-# called when this process is signalled (for cleanup)
-#
-my_trap() {
-  if [ "$verbose" = true ]; then
-    echo "trapped signal!" >&2
-  fi
-  kill_pid
-  clean2
-  exit 1
-}
+  $file_p = 1 if $had_dir;
 
-main() {
 
-  getargs $@
+  if (!$file_p && !$video_p) {
+#    error "neither grabVideoFrames nor chooseRandomImages are set\n\t" .
+#      "in $conf; $progname requires one or both."
+    $file_p = 1;
+  }
 
-  trap my_trap 1 2 3 6 9 13 15
+  if ($file_p) {
+    error "no imageDirectory set in $conf" unless $imagedir;
+    error "imageDirectory $imagedir doesn't exist" unless (-d $imagedir);
+  }
 
-  if [ "$use_stdin" = true ]; then
-   cat > $tmp_ppmS
-  fi
+  if ($verbose > 1) {
+    printf STDERR "$progname: grab video: $video_p\n";
+    printf STDERR "$progname: grab images: $file_p\n";
+    printf STDERR "$progname: directory: $imagedir\n";
+  }
 
-  while true; do
+}
 
-    # Loop grabbing and frobbing images.
-    #
-    # If we're running on the root, run xv or xli in the foreground
-    # (with -exit, if xv) and then wait.
-    #
-    # If we're running in a window, spawn xv or xli in the background; then
-    # when it's time to put up the new image, kill off the currently-running
-    # xv or xli.
 
-    if [ "$verbose" = true ]; then
-      whack
-    else
-      whack >/dev/null 2>&1
-    fi
+sub get_ppm {
+  if ($use_stdin) {
+    print STDERR "$progname: reading from stdin\n" if ($verbose > 1);
+    my $ppm = "";
+    while (<STDIN>) { $ppm .= $_; }
+    return $ppm;
+
+  } else {
+
+    my $do_file_p;
+
+    if ($file_p && $video_p) {
+      $do_file_p = (int(rand(2)) == 0);
+      print STDERR "$progname: doing " . ($do_file_p ? "files" : "video") ."\n"
+        if ($verbose);
+    }
+    elsif ($file_p)  { $do_file_p = 1; }
+    elsif ($video_p) { $do_file_p = 0; }
+    else {
+      error "internal error: not grabbing files or video?";
+    }
+
+    my $v = ($verbose <= 1 ? "" : "-" . ("v" x ($verbose-1)));
+    my $cmd;
+    if ($do_file_p) {
+      $cmd = "xscreensaver-getimage-file  $v --name $imagedir";
+    } else {
+      $cmd = "xscreensaver-getimage-video $v --stdout";
+    }
+
+    my $ppm;
+
+    if ($do_file_p) {
+
+      print STDERR "$progname: running \"$cmd\"\n" if ($verbose > 1);
+      my $fn = `$cmd`;
+      $fn =~ s/\n$//s;
+      error "didn't get a file?" if ($fn eq "");
+
+      print STDERR "$progname: selected file $fn\n" if ($verbose > 1);
+
+      if    ($fn =~ m/\.gif/i)   { $cmd = "giftopnm < $fn"; }
+      elsif ($fn =~ m/\.jpe?g/i) { $cmd = "djpeg < $fn"; }
+      else {
+        error "unrecognized file extension on $fn";
+      }
+
+      print STDERR "$progname: converting with \"$cmd\"\n" if ($verbose > 1);
+      $cmd .= " 2>/dev/null" unless ($verbose > 1);
+      $ppm = `$cmd`;
+
+    } else {
+
+      print STDERR "$progname: running \"$cmd\"\n" if ($verbose > 1);
+      $ppm = `$cmd`;
+      error "no data?" if ($ppm eq "");
+      error "not a PPM file" unless ($ppm =~ m/^P\d\n/s);
+
+      $_ = $ppm;
+      my ($width, $height) = m/^P\d\n(\d+) (\d+)\n/s;
+      error "got a bogus PPM" unless ($width && $height);
+      print STDERR "$progname: grabbed ${width}x$height PPM\n"
+        if ($verbose > 1);
+      $_ = 0;
+    }
+
+    return $ppm;
+  }
+}
 
-    kill_pid
+sub dispose_ppm {
+  my ($ppm) = @_;
 
-    if [ ! -s $tmp_ppm3 ]; then
-      echo "$0: no image grabbed" >&2
+  error "0-length data" if (!defined($ppm) || $ppm eq  "");
+  error "not a PPM file" unless ($ppm =~ m/^P\d\n/s);
 
-    elif [ "$use_stdout" = true ]; then
+  if ($use_stdout) {
+    print STDERR "$progname: writing to stdout\n" if ($verbose > 1);
+    print $ppm;
 
-      cat $tmp_ppm3
-      clean2
-      exit 0
+  } else {
+    my $displayer = pick_displayer();
 
-    else
+    my $tmpdir = $ENV{TMPDIR};
+    $tmpdir = "/tmp" unless $tmpdir;
+    my $fn = sprintf("$tmpdir/vw.%04x", $$);
+    local *OUT;
+    unlink $fn;
+    open (OUT, ">$fn") || error "writing $fn: $!";
+    print OUT $ppm;
+    close OUT;
 
-#      pnmtosgi < $tmp_ppm3 > $tmp_ppm2
-#      rm -f $tmp_ppm3
-       mv $tmp_ppm3 $tmp_ppm2
+    my @cmd = split (/ +/, $displayer);
+    push @cmd, $fn;
+    print STDERR "$progname: executing \"" . join(" ", @cmd) . "\"\n"
+      if ($verbose);
+    system (@cmd);
 
-      if [ -s $tmp_ppm2 ]; then
-        if [ "$verbose" = true ]; then
-          echo "launching $displayer $displayer_args $tmp_ppm2" >&2
-         ls -lF $tmp_ppm2
-        fi
+    unlink $fn;
+  }
+}
 
-       mv $tmp_ppm2 $tmp_ppm0
-        eval "$displayer $displayer_args $tmp_ppm0 &"
 
-# this doesn't work -- leaves xv processes around, instead of stray xset
-# data.  Sigh.
-#
-#      # cat the file so that we can nuke it without racing against xv.
-#        cat $tmp_ppm2 | $displayer $displayer_args - &
+my $stdin_ppm = undef;
 
-        pid=$!
-      fi
-    fi
+sub vidwhack {
+  my $ppm;
+  if ($use_stdin) {
+    if (!defined($stdin_ppm)) {
+      $stdin_ppm = get_ppm();
+    }
+    $ppm = $stdin_ppm;
+  } else {
+    $ppm = get_ppm();
+  }
 
-    clean
-    sleep $delay
+  $ppm = frob_ppm ($ppm);
+  dispose_ppm ($ppm);
+  $ppm = undef;
+}
 
-  done
-  exit 1
+
+sub usage {
+  print STDERR "VidWhacker, Copyright (c) 2001 Jamie Zawinski <jwz\@jwz.org>\n";
+  print STDERR "            http://www.jwz.org/xscreensaver/";
+  print STDERR "\n";
+  print STDERR "usage: $0 [-display dpy] [-verbose] [-root | -window]\n";
+  print STDERR "                  [-stdin] [-stdout] [-delay secs]\n";
+  print STDERR "                  [-directory image_directory]\n";
+  exit 1;
 }
 
-main $@
+sub main {
+  while ($_ = $ARGV[0]) {
+    shift @ARGV;
+    if ($_ eq "--verbose") { $verbose++; }
+    elsif (m/^-v+$/) { $verbose += length($_)-1; }
+    elsif (m/^(-display|-disp|-dis|-dpy|-d)$/) { $ENV{DISPLAY} = shift @ARGV; }
+    elsif (m/^--?stdin$/) { $use_stdin = 1; }
+    elsif (m/^--?stdout$/) { $use_stdout = 1; }
+    elsif (m/^--?delay$/) { $delay = shift @ARGV; }
+    elsif (m/^--?dir(ectory)?$/) { $imagedir = shift @ARGV; }
+    elsif (m/^--?root$/) { }
+    elsif (m/^--?window$/) {
+      print STDERR "$progname: sorry, \"-window\" is unimplemented.\n";
+      print STDERR "$progname: use \"-stdout\" and pipe to a displayer.\n";
+      exit 1;
+    }
+    elsif (m/^-./) { usage; }
+    else { usage; }
+  }
+
+  read_config;
+
+  if (!$use_stdout) {
+    $_ = `xdpyinfo 2>-`;
+    ($screen_width) =~ m/ dimensions: +(\d+)x(\d+) pixels/;
+    $screen_width = 800 unless $screen_width > 0;
+  }
+
+  if ($use_stdout) {
+    vidwhack();
+  } else {
+    while (1) {
+      vidwhack();
+      sleep $delay;
+    }
+  }
+}
 
-# to find stray xv data:
-# xwininfo -root -children|grep 'xv image comments' | awk '{print "xkill -id ", $1}'
+main;
+exit 0;
index b1f1c96ba2ce3ee826e003f02e9dc9afc0f91774..5461ac318582609d279dca92e65b5feeb7b9c21e 100755 (executable)
@@ -28,7 +28,7 @@ use Fcntl ':flock'; # import LOCK_* constants
 use POSIX qw(strftime);
 
 
-my $version = q{ $Revision: 1.63 $ }; $version =~ s/^[^0-9]+([0-9.]+).*$/$1/;
+my $version = q{ $Revision: 1.65 $ }; $version =~ s/^[^0-9]+([0-9.]+).*$/$1/;
 my $copyright = "WebCollage $version, Copyright (c) 1999" .
     " Jamie Zawinski <jwz\@jwz.org>\n" .
     "            http://www.jwz.org/xscreensaver/\n";
index 4d838bfd4e61de09c7dc10603a44706f7e4c66fc..df4ce24ad772f7f544040967f3492d9fdfe9a7d6 100644 (file)
@@ -24,6 +24,7 @@
 
 /* Includes ******************************************************************/
 #include "screenhack.h"
+#include "colorbars.h"
 #include <X11/Xutil.h>
 
 
@@ -41,8 +42,6 @@
 #define XTEEVEE_ARG_DELAY_BETWEEN       "delayBetween"
 #define XTEEVEE_STATIC_COLOR_COUNT      6
 #define XTEEVEE_STATIC_TILE_COUNT       16
-#define XTEEVEE_BARS_COLOR_TOP_COUNT    7
-#define XTEEVEE_BARS_COLOR_BOTTOM_COUNT 5
 
 
 /* Globals *******************************************************************/
@@ -119,7 +118,8 @@ void xteevee_Static(Display* x_Disp,Window x_Win,XWindowAttributes* x_WinAttr,
        {
                color_Color.red = color_Color.green = color_Color.blue =
                 (((double)color_Index+1)/XTEEVEE_STATIC_COLOR_COUNT)*65535;
-               if (XAllocColor(x_Disp,x_WinAttr->colormap,&color_Color) == 0)
+               if (!x_WinAttr->colormap ||
+                    !XAllocColor(x_Disp,x_WinAttr->colormap,&color_Color))
                {
                        /* NOTE: I have no idea what to do here.  Why would
                                 this fail? */
@@ -301,7 +301,7 @@ void xteevee_Roll(Display* x_Disp,Window x_Win,XWindowAttributes* x_WinAttr,
                }
 
                XSync(x_Disp,0);
-               sleep(0);
+                usleep(50000);
                screenhack_handle_events(x_Disp);
        }
 
@@ -313,115 +313,21 @@ void xteevee_Roll(Display* x_Disp,Window x_Win,XWindowAttributes* x_WinAttr,
 void xteevee_Bars(Display* x_Disp,Window x_Win,XWindowAttributes* x_WinAttr,
       time_t hack_Time,Pixmap hack_Pm)
 {
-       GC        x_GcTop[XTEEVEE_BARS_COLOR_TOP_COUNT];
-       GC        x_GcBottom[XTEEVEE_BARS_COLOR_BOTTOM_COUNT];
-       XGCValues x_GcVal;
-       int       color_Index;
-       XColor    color_Color;
-       char*     color_ColorTop[] =
-       {
-               "grey",
-               "yellow",
-               "light blue",
-               "green",
-               "orange",
-               "red",
-               "purple"
-       };
-       char*     color_ColorBottom[] =
-       {
-               "black",
-               "white",
-               "black",
-               "black",
-               "black"
-       };
-
-       /* Build the GCs */
-       for (color_Index = 0;color_Index < XTEEVEE_BARS_COLOR_TOP_COUNT;
-        color_Index++)
-       {
-               if (XParseColor(x_Disp,x_WinAttr->colormap,
-                color_ColorTop[color_Index],&color_Color) == 0)
-               {
-                       /* NOTE: Um, badness? */
-               }
-               if (XAllocColor(x_Disp,x_WinAttr->colormap,&color_Color) == 0)
-               {
-                       /* NOTE: More badness? */
-               }
-               x_GcVal.foreground = color_Color.pixel;
-               x_GcTop[color_Index] =
-                XCreateGC(x_Disp,x_Win,GCForeground,&x_GcVal);
-       }
-       for (color_Index = 0;color_Index < XTEEVEE_BARS_COLOR_BOTTOM_COUNT;
-        color_Index++)
-       {
-               if (XParseColor(x_Disp,x_WinAttr->colormap,
-                color_ColorBottom[color_Index],&color_Color) == 0)
-               {
-                       /* NOTE: Um, badness? */
-               }
-               if (XAllocColor(x_Disp,x_WinAttr->colormap,&color_Color) == 0)
-               {
-                       /* NOTE: More badness? */
-               }
-               x_GcVal.foreground = color_Color.pixel;
-               x_GcBottom[color_Index] =
-                XCreateGC(x_Disp,x_Win,GCForeground,&x_GcVal);
-       }
-
-       /* Draw color-bar test pattern */
-       XClearWindow(x_Disp,x_Win);
-       for (color_Index = 0;color_Index < XTEEVEE_BARS_COLOR_TOP_COUNT;
-        color_Index++)
-       {
-               XFillRectangle(x_Disp,x_Win,x_GcTop[color_Index],
-                ((x_WinAttr->width/XTEEVEE_BARS_COLOR_TOP_COUNT)+1)*
-                color_Index,
-                0,
-                (x_WinAttr->width/XTEEVEE_BARS_COLOR_TOP_COUNT)+1,
-                (x_WinAttr->height/5)*4);
-       }
-       for (color_Index = 0;color_Index < XTEEVEE_BARS_COLOR_BOTTOM_COUNT;
-        color_Index++)
-       {
-               XFillRectangle(x_Disp,x_Win,x_GcBottom[color_Index],
-                ((x_WinAttr->width/XTEEVEE_BARS_COLOR_BOTTOM_COUNT)+1)*
-                color_Index,
-                (x_WinAttr->height/5)*4,
-                (x_WinAttr->width/XTEEVEE_BARS_COLOR_BOTTOM_COUNT)+1,
-                x_WinAttr->height-(x_WinAttr->height/5)*4);
-       }
-
-       /* Go! */
-       if (hack_Time > 0)
-       {
-               hack_Time += time(NULL);
-       }
-       while ((time(NULL) < hack_Time) || (hack_Time == 0))
-       {
-               screenhack_handle_events(x_Disp);
-               usleep(100000);
-       }
-
-       /* Free everything */
-       for (color_Index = 0;color_Index < XTEEVEE_BARS_COLOR_TOP_COUNT;
-        color_Index++)
-       {
-               xteevee_FreeColorForeground(x_Disp,x_WinAttr,
-                x_GcTop[color_Index]);
-               XFreeGC(x_Disp,x_GcTop[color_Index]);
-       }
-       for (color_Index = 0;color_Index < XTEEVEE_BARS_COLOR_BOTTOM_COUNT;
-        color_Index++)
-       {
-               xteevee_FreeColorForeground(x_Disp,x_WinAttr,
-                x_GcBottom[color_Index]);
-               XFreeGC(x_Disp,x_GcBottom[color_Index]);
-       }
+  draw_colorbars (x_Disp, x_Win, 0, 0, x_WinAttr->width, x_WinAttr->height);
+
+  /* Go! */
+  if (hack_Time > 0)
+    {
+      hack_Time += time(NULL);
+    }
+  while ((time(NULL) < hack_Time) || (hack_Time == 0))
+    {
+      screenhack_handle_events(x_Disp);
+      usleep(100000);
+    }
 }
 
+
 /* Standard XScreenSaver entry point ======================================= */
 void screenhack(Display* x_Disp,Window x_Win)
 {
@@ -455,6 +361,7 @@ void screenhack(Display* x_Disp,Window x_Win)
        /* Grab the screen to give us time to do whatever we want */
        XGetWindowAttributes(x_Disp,x_Win,&x_WinAttr);
        grab_screen_image(x_WinAttr.screen,x_Win);
+
        x_GcVal.subwindow_mode = IncludeInferiors;
        x_Gc = XCreateGC(x_Disp,x_Win,GCSubwindowMode,&x_GcVal);
        screen_Pm = XCreatePixmap(x_Disp,x_Win,x_WinAttr.width,
index 11e01e76e34f0cf4912cf00698b3da9dcb85baef..39b502486f28261a964817f6d004e61460c699a6 100644 (file)
@@ -19,6 +19,15 @@ picks a mode to display from the available options.  If modes are explicitly
 set on the command-line, they over-ride the implicit options and will be
 choosen among exclusively.  If modes are explicitly excluded from the
 command-line, the they are simply removed from contention.
+
+The image that it manipulates will be grabbed from the portion of
+the screen underlying the window, or from the system's video input,
+or from a random file on disk, as indicated by
+the \fIgrabDesktopImages\fP, \fIgrabVideoFrames\fP,
+and \fIchooseRandomImages\fP options in the \fI~/.xscreensaver\fP
+file; see
+.BR xscreensaver-demo (1)
+for more details.
 .PP
 .SH OPTIONS
 .I xteevee
@@ -98,7 +107,9 @@ mode, as a percentage.
 should simulate more TV problems.
 .SH SEE ALSO
 .BR X (1),
-.BR xscreensaver (1)
+.BR xscreensaver (1),
+.BR xscreensaver\-demo (1),
+.BR xscreensaver\-getimage (1)
 .SH COPYRIGHT
 Copyright \(co 1999 by Greg Knauss.  Permission to use, copy, modify, 
 distribute, and sell this software and its documentation for any purpose is 
index ec21d3c2bdcad43dcf8f6b1b18ae4ecdb825a40f..791f61b671d2de769540c8b4c6c1dd3bea021658 100644 (file)
@@ -3,9 +3,24 @@
 zoom - wander around magified desktop
 .SH SYNOPSIS
 .B zoom
-[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-delay \fIusecs\fP] [\-lenses] [\-pixwidth \fIpixels\fP] [\-pixheight \fIpixels\fP] [\-pixspacex \fIpixels\fP] [\-pixspacey \fIpixels\fP] [\-lensoffsetx \fIpixels\fP] [\-lensoffsety \fIpixels\fP]
+[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP]
+[\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install]
+[\-visual \fIvisual\fP] [\-delay \fIusecs\fP] [\-lenses]
+[\-pixwidth \fIpixels\fP] [\-pixheight \fIpixels\fP]
+[\-pixspacex \fIpixels\fP] [\-pixspacey \fIpixels\fP]
+[\-lensoffsetx \fIpixels\fP] [\-lensoffsety \fIpixels\fP]
 .SH DESCRIPTION
-The \fIzoom\fP program magnifies a portion of the desktop and moves around.
+The \fIzoom\fP program takes an image, magnifies it, and scrolls around
+it, fatbits-style.
+
+The image that it manipulates will be grabbed from the portion of
+the screen underlying the window, or from the system's video input,
+or from a random file on disk, as indicated by
+the \fIgrabDesktopImages\fP, \fIgrabVideoFrames\fP,
+and \fIchooseRandomImages\fP options in the \fI~/.xscreensaver\fP
+file; see
+.BR xscreensaver-demo (1)
+for more details.
 .SH OPTIONS
 .I zoom
 accepts the following options:
@@ -70,7 +85,9 @@ to get the name of a resource file that overrides the global resources
 stored in the RESOURCE_MANAGER property.
 .SH SEE ALSO
 .BR X (1),
-.BR xscreensaver (1)
+.BR xscreensaver (1),
+.BR xscreensaver\-demo (1),
+.BR xscreensaver\-getimage (1)
 .SH COPYRIGHT
 Copyright \(co 2000 by James Macnicol.  Permission to use, copy, modify, 
 distribute, and sell this software and its documentation for any purpose is 
index a8dae1383ec8ef3b5410050f3a9139fa42a833a0..b711c56f1762905887809da505c46a8c1400d2bf 100644 (file)
@@ -100,15 +100,17 @@ X_CFLAGS  = @X_CFLAGS@
 
 INCLUDES       = -I$(srcdir) -I.. @INCLUDES@
 
-SRCS           = alpha.c colors.c fade.c grabscreen.c hsv.c overlay.c \
-                 resources.c spline.c usleep.c visual.c visual-gl.c xmu.c \
-                 logo.c yarandom.c erase.c sgivideo.c xshm.c xdbe.c
-OBJS           = alpha.o colors.o fade.o grabscreen.o hsv.o overlay.o \
-                 resources.o spline.o usleep.o visual.o visual-gl.o xmu.o \
-                 logo.o yarandom.o erase.o sgivideo.o xshm.o xdbe.o
+SRCS           = alpha.c colors.c fade.c grabscreen.c grabclient.c hsv.c \
+                 overlay.c resources.c spline.c usleep.c visual.c \
+                 visual-gl.c xmu.c logo.c yarandom.c erase.c \
+                 xshm.c xdbe.c colorbars.c
+OBJS           = alpha.o colors.o fade.o grabscreen.o grabclient.o hsv.o \
+                 overlay.o resources.o spline.o usleep.o visual.o \
+                 visual-gl.o xmu.o logo.o yarandom.o erase.o \
+                 xshm.o xdbe.o colorbars.o
 HDRS           = alpha.h colors.h fade.h grabscreen.h hsv.h resources.h \
                  spline.h usleep.h utils.h version.h visual.h vroot.h xmu.h \
-                 yarandom.h erase.h sgivideo.h xshm.h xdbe.h
+                 yarandom.h erase.h xshm.h xdbe.h colorbars.h
 LOGOS          = logo-180.gif logo-180.xpm logo-50.gif logo-50.xpm \
                  logo-big.gif logo.eps
 EXTRAS         = README Makefile.in ad2c
@@ -231,10 +233,14 @@ grabscreen.o: $(srcdir)/yarandom.h
 grabscreen.o: $(srcdir)/usleep.h
 grabscreen.o: $(srcdir)/colors.h
 grabscreen.o: $(srcdir)/grabscreen.h
-grabscreen.o: $(srcdir)/sgivideo.h
 grabscreen.o: $(srcdir)/visual.h
 grabscreen.o: $(srcdir)/resources.h
 grabscreen.o: $(srcdir)/vroot.h
+grabclient.o: $(srcdir)/utils.h
+grabclient.o: ../config.h
+grabclient.o: $(srcdir)/grabscreen.h
+grabclient.o: $(srcdir)/resources.h
+grabclient.o: $(srcdir)/vroot.h
 hsv.o: $(srcdir)/utils.h
 hsv.o: ../config.h
 hsv.o: $(srcdir)/hsv.h
@@ -268,11 +274,6 @@ erase.o: ../config.h
 erase.o: $(srcdir)/yarandom.h
 erase.o: $(srcdir)/usleep.h
 erase.o: $(srcdir)/resources.h
-sgivideo.o: $(srcdir)/utils.h
-sgivideo.o: ../config.h
-sgivideo.o: $(srcdir)/sgivideo.h
-sgivideo.o: $(srcdir)/resources.h
-sgivideo.o: $(srcdir)/visual.h
 xshm.o: $(srcdir)/utils.h
 xshm.o: ../config.h
 xshm.o: $(srcdir)/xshm.h
@@ -281,4 +282,8 @@ xdbe.o: $(srcdir)/utils.h
 xdbe.o: ../config.h
 xdbe.o: $(srcdir)/xdbe.h
 xdbe.o: $(srcdir)/resources.h
+colorbars.o: $(srcdir)/utils.h
+colorbars.o: ../config.h
+colorbars.o: $(srcdir)/resources.h
+colorbars.o: $(srcdir)/colorbars.h
 
diff --git a/utils/colorbars.c b/utils/colorbars.c
new file mode 100644 (file)
index 0000000..fc29526
--- /dev/null
@@ -0,0 +1,133 @@
+/* xscreensaver, Copyright (c) 2001 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation.  No representations are made about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or 
+ * implied warranty.
+ */
+
+/* This file contains code for drawing NTSC colorbars.
+   A couple of things use this.
+ */
+
+#include "utils.h"
+#include "resources.h"
+#include "colorbars.h"
+
+static const char * const colors[7][18] = {
+  { "#CCCCCC", "#FFFF00", "#00FFFF", "#00FF00",                /* tall bars */
+    "#FF00FF", "#FF0000", "#0000FF", "#000000",
+    0
+  }, {
+    "#000000", "#0000FF", "#FF0000", "#FF00FF",                /* short rev bars */
+    "#00FF00", "#00FFFF", "#FFFF00", "#CCCCCC",
+    0
+  }, {
+    "#000000", 0                                       /* blank */
+  }, {
+    "#FFFFFF", "#EEEEEE", "#DDDDDD", "#CCCCCC",                /* gray ramp */
+    "#BBBBBB", "#AAAAAA", "#999999", "#888888",
+    "#777777", "#666666", "#555555", "#444444",
+    "#333333", "#222222", "#111111", "#000000"
+  }, {
+    "#000000", "#111111", "#222222", "#333333",                /* gray rev ramp */
+    "#444444", "#555555", "#666666", "#777777",
+    "#888888", "#999999", "#AAAAAA", "#BBBBBB",
+    "#CCCCCC", "#DDDDDD", "#EEEEEE", "#FFFFFF"
+  }, {
+    "#000000", 0                                       /* blank */
+  }, {
+    "#FF00FF", "#FF00FF", "#FF00FF",                   /* blacklevel row */
+    "#FFFFFF", "#FFFFFF", "#FFFFFF",
+    "#0000AD", "#0000AD", "#0000AD",
+    "#131313", "#131313", "#131313",
+    "#000000", "#000000", "#262626",
+    "#000000", "#000000", "#000000"
+  }
+};
+
+static const int heights[7] = { 63, 10, 1, 5, 5, 1, 15 };   /* percentages */
+
+
+void
+draw_colorbars (Display *dpy, Window window,
+                int x, int y, int width, int height)
+{
+  int oy = y;
+  int ypct = 0;
+  int j;
+  XGCValues gcv;
+  GC gc = XCreateGC (dpy, window, 0, &gcv);
+  Colormap cmap;
+  XWindowAttributes xgwa;
+  XGetWindowAttributes (dpy, window, &xgwa);
+  cmap = xgwa.colormap;
+
+  for (j = 0; j < sizeof(colors) / sizeof(*colors); j++)
+    {
+      int i, h, ncols;
+      int x1 = 0;
+      int y2;
+      for (ncols = 0; ncols < sizeof(*colors) / sizeof(**colors); ncols++)
+        if (!colors[j][ncols]) break;
+      ypct += heights[j];
+      y2 = height * ypct / 100;
+      h = y2 - y; /* avoid roundoff fencepost */
+      for (i = 0; i < ncols; i++)
+        {
+          XColor xcolor;
+          const char *color = colors[j][i];
+          int x2 = x + (width * (i+1) / ncols);
+          int w = x2 - x1; /* avoid roundoff fencepost */
+          if (! XParseColor (dpy, cmap, color, &xcolor))
+            abort();
+          xcolor.flags = DoRed|DoGreen|DoBlue;
+          if (!XAllocColor (dpy, cmap, &xcolor))
+            continue;
+          XSetForeground (dpy, gc, xcolor.pixel);
+          XFillRectangle (dpy, window, gc, x1, y, w, h);
+          x1 = x2;
+       }
+      y = y2;
+    }
+
+  y = oy;
+
+  /* Add in the xscreensaver logo */
+  {
+    unsigned long *pixels; /* ignored - unfreed */
+    int npixels;
+    unsigned long bg = ~0;
+    Pixmap logo_mask = 0;
+    Pixmap logo_map = xscreensaver_logo (dpy, window, cmap, bg,
+                                         &pixels, &npixels, &logo_mask,
+                                         True);
+    if (logo_map)
+      {
+        Window root;
+        int logo_width, logo_height;
+        int w = width;
+        int h = height * heights[0] / 100;
+        int x1, y1, bw, d;
+        XGetGeometry (dpy, logo_map, &root, &x1, &y1,
+                      &logo_width, &logo_height, &bw, &d);
+        x1 = x + (w - logo_width) / 2;
+        y1 = y + (h - logo_height) / 2;
+        if (logo_mask)
+          {
+            XSetClipMask (dpy, gc, logo_mask);
+            XSetClipOrigin (dpy, gc, x1, y1);
+          }
+        XCopyArea (dpy, logo_map, window, gc,
+                   0, 0, logo_width, logo_height, x1, y1);
+        XFreePixmap (dpy, logo_map);
+        if (logo_mask)
+          XFreePixmap (dpy, logo_mask);
+      }
+  }
+
+  XFreeGC(dpy, gc);
+}
diff --git a/utils/colorbars.h b/utils/colorbars.h
new file mode 100644 (file)
index 0000000..93661a8
--- /dev/null
@@ -0,0 +1,18 @@
+/* xscreensaver, Copyright (c) 2001 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation.  No representations are made about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or 
+ * implied warranty.
+ */
+
+#ifndef __COLORBARS_H__
+#define __COLORBARS_H__
+
+extern void draw_colorbars (Display *dpy, Window window,
+                            int x, int y, int width, int height);
+
+#endif /* __COLORBARS_H__ */
index dba6ccdf6f99cc09a4539b9be2f9886a48a55dae..1fadffd597b14b597aa2b0695555ec6ad60ad70d 100644 (file)
@@ -1,13 +1,14 @@
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-]) ALPHA.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-]) COLORBARS.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-]) COLORS.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-]) ERASE.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-]) FADE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-]) GRABCLIENT.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-]) GRABSCREEN.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-]) HSV.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-]) LOGO.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-]) OVERLAY.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-]) RESOURCES.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-]) SGIVIDEO.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-]) SPLINE.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-]) USLEEP.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-]) VISUAL-GL.C
index f12daa227f81227b9ffa8c4962689895e97c7f76..fe09afa10f1cfdaa6a6967515c67c72e3ebcd2c2 100644 (file)
@@ -1,13 +1,14 @@
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-]) ALPHA.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-]) COLORBARS.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-]) COLORS.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-]) ERASE.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-]) FADE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-]) GRABCLIENT.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-]) GRABSCREEN.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-]) HSV.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-]) LOGO.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-]) OVERLAY.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-]) RESOURCES.C
-$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-]) SGIVIDEO.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-]) SPLINE.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-]) USLEEP.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-]) VISUAL-GL.C
index 186bc89cda88b8b158cb0ede47f61290b9bbe464..1b975f681ca403d93354b983e6dce635d3a1dff8 100644 (file)
@@ -1,4 +1,4 @@
-/* xscreensaver, Copyright (c) 1992-1998 Jamie Zawinski <jwz@jwz.org>
+/* xscreensaver, Copyright (c) 1992-2001 Jamie Zawinski <jwz@jwz.org>
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
  * documentation for any purpose is hereby granted without fee, provided that
@@ -21,7 +21,6 @@
 #include "usleep.h"
 #include "fade.h"
 
-
 Colormap
 copy_colormap (Screen *screen, Visual *visual,
               Colormap cmap, Colormap into_cmap)
@@ -76,12 +75,18 @@ blacken_colormap (Screen *screen, Colormap cmap)
 static void fade_screens_1 (Display *dpy, Colormap *cmaps,
                            Window *black_windows, int seconds, int ticks,
                            Bool out_p, Bool clear_windows);
+
 #ifdef HAVE_SGI_VC_EXTENSION
 static int sgi_gamma_fade (Display *dpy,
                           Window *black_windows, int seconds, int ticks,
                           Bool out_p, Bool clear_windows);
 #endif /* HAVE_SGI_VC_EXTENSION */
 
+#ifdef HAVE_XF86VMODE_GAMMA
+static int xf86_gamma_fade (Display *dpy,
+                            Window *black_windows, int seconds, int ticks,
+                            Bool out_p, Bool clear_windows);
+#endif /* HAVE_XF86VMODE_GAMMA */
 
 
 void
@@ -107,11 +112,24 @@ fade_screens (Display *dpy, Colormap *cmaps, Window *black_windows,
 
  AGAIN:
 
+/* #### printf("\n\nfade_screens %d %d %d\n", seconds, ticks, out_p); */
+
 #ifdef HAVE_SGI_VC_EXTENSION
   /* First try to do it by fading the gamma in an SGI-specific way... */
-  if (0 != sgi_gamma_fade(dpy, black_windows, seconds, ticks, out_p,
+  if (0 == sgi_gamma_fade(dpy, black_windows, seconds, ticks, out_p,
                          clear_windows))
+    ;
+  else
 #endif /* HAVE_SGI_VC_EXTENSION */
+
+#ifdef HAVE_XF86VMODE_GAMMA
+  /* Then try to do it by fading the gamma in an XFree86-specific way... */
+  if (0 == xf86_gamma_fade(dpy, black_windows, seconds, ticks, out_p,
+                           clear_windows))
+    ;
+  else
+#endif /* HAVE_XF86VMODE_GAMMA */
+
     /* Else, do it the old-fashioned way, which (somewhat) loses if
        there are TrueColor windows visible. */
     fade_screens_1 (dpy, cmaps, black_windows, seconds, ticks,
@@ -359,11 +377,14 @@ fade_screens_1 (Display *dpy, Colormap *cmaps, Window *black_windows,
 }
 
 
+\f
+/* SGI Gamma fading */
+
 #ifdef HAVE_SGI_VC_EXTENSION
 
 # include <X11/extensions/XSGIvc.h>
 
-struct screen_gamma_info {
+struct screen_sgi_gamma_info {
   int gamma_map;  /* ??? always using 0 */
   int nred, ngreen, nblue;
   unsigned short *red1, *green1, *blue1;
@@ -374,8 +395,8 @@ struct screen_gamma_info {
 };
 
 
-static void whack_gamma(Display *dpy, int screen,
-                       struct screen_gamma_info *info, float ratio);
+static void sgi_whack_gamma(Display *dpy, int screen,
+                            struct screen_sgi_gamma_info *info, float ratio);
 
 static int
 sgi_gamma_fade (Display *dpy,
@@ -392,7 +413,7 @@ sgi_gamma_fade (Display *dpy,
 #endif
   int i, screen;
   int status = -1;
-  struct screen_gamma_info *info = (struct screen_gamma_info *)
+  struct screen_sgi_gamma_info *info = (struct screen_sgi_gamma_info *)
     calloc(nscreens, sizeof(*info));
 
   /* Get the current gamma maps for all screens.
@@ -453,7 +474,7 @@ sgi_gamma_fade (Display *dpy,
   if (!out_p)
     for (screen = 0; screen < nscreens; screen++)
       {
-       whack_gamma(dpy, screen, &info[screen], 0.0);
+       sgi_whack_gamma(dpy, screen, &info[screen], 0.0);
        if (black_windows && black_windows[screen])
          {
            XUnmapWindow (dpy, black_windows[screen]);
@@ -470,8 +491,8 @@ sgi_gamma_fade (Display *dpy,
     {
       for (screen = 0; screen < nscreens; screen++)
        {
-         whack_gamma(dpy, screen, &info[screen],
-                     (((float)i) / ((float)steps)));
+         sgi_whack_gamma(dpy, screen, &info[screen],
+                          (((float)i) / ((float)steps)));
 
          /* If there is user activity, bug out.  (Bug out on keypresses or
             mouse presses, but not motion, and not release events.  Bugging
@@ -531,7 +552,7 @@ sgi_gamma_fade (Display *dpy,
   usleep(100000);  /* 1/10th second */
 
   for (screen = 0; screen < nscreens; screen++)
-    whack_gamma(dpy, screen, &info[screen], 1.0);
+    sgi_whack_gamma(dpy, screen, &info[screen], 1.0);
   XSync(dpy, False);
 
   status = 0;
@@ -552,8 +573,8 @@ sgi_gamma_fade (Display *dpy,
 }
 
 static void
-whack_gamma(Display *dpy, int screen, struct screen_gamma_info *info,
-           float ratio)
+sgi_whack_gamma(Display *dpy, int screen, struct screen_sgi_gamma_info *info,
+                float ratio)
 {
   int k;
 
@@ -578,44 +599,214 @@ whack_gamma(Display *dpy, int screen, struct screen_gamma_info *info,
 #endif /* HAVE_SGI_VC_EXTENSION */
 
 
-
 \f
-#if 0
-#include "screenhack.h"
+/* XFree86 4.x+ Gamma fading */
 
-char *progclass = "foo";
-char *defaults [] = {
-  0
-};
+#ifdef HAVE_XF86VMODE_GAMMA
 
-XrmOptionDescRec options [] = {0};
-int options_size = 0;
+#include <X11/extensions/xf86vmode.h>
 
-void
-screenhack (dpy, w)
-     Display *dpy;
-     Window w;
+static Bool xf86_whack_gamma(Display *dpy, int screen,
+                             XF86VidModeGamma *info, float ratio);
+static Bool xf86_check_gamma_extension (Display *dpy);
+
+static int
+xf86_gamma_fade (Display *dpy,
+                 Window *black_windows, int seconds, int ticks,
+                 Bool out_p, Bool clear_windows)
 {
-  int seconds = 3;
-  int ticks = 20;
-  int delay = 1;
+  int steps = seconds * ticks;
+  long usecs_per_step = (long)(seconds * 1000000) / (long)steps;
+  XEvent dummy_event;
+  int nscreens = ScreenCount(dpy);
+  struct timeval then, now;
+#ifdef GETTIMEOFDAY_TWO_ARGS
+  struct timezone tzp;
+#endif
+  int i, screen;
+  int status = -1;
+  XF86VidModeGamma *info = 0;
+
+  static int ext_ok = -1;
+
+  /* Only probe the extension once: the answer isn't going to change. */
+  if (ext_ok == -1)
+    ext_ok = (xf86_check_gamma_extension (dpy) ? 1 : 0);
 
-  while (1)
+  /* If this server doesn't have the gamma extension, bug out. */
+  if (ext_ok == 0)
+    goto FAIL;
+
+  info = (XF86VidModeGamma *) calloc(nscreens, sizeof(*info));
+
+  /* Get the current gamma maps for all screens.
+     Bug out and return -1 if we can't get them for some screen.
+   */
+  for (screen = 0; screen < nscreens; screen++)
     {
-      XSync (dpy, False);
+      if (!XF86VidModeGetGamma(dpy, screen, &info[screen]))
+       goto FAIL;
+    }
 
-      fprintf(stderr,"out..."); fflush(stderr);
-      fade_screens (dpy, 0, seconds, ticks, True);
-      fprintf(stderr, "done.\n"); fflush(stderr);
+#ifdef GETTIMEOFDAY_TWO_ARGS
+  gettimeofday(&then, &tzp);
+#else
+  gettimeofday(&then);
+#endif
 
-      if (delay) sleep (delay);
+  /* If we're fading in (from black), then first crank the gamma all the
+     way down to 0, then take the windows off the screen.
+   */
+  if (!out_p)
+    for (screen = 0; screen < nscreens; screen++)
+      {
+       xf86_whack_gamma(dpy, screen, &info[screen], 0.0);
+       if (black_windows && black_windows[screen])
+         {
+           XUnmapWindow (dpy, black_windows[screen]);
+           XClearWindow (dpy, black_windows[screen]);
+           XSync(dpy, False);
+         }
+      }
 
-      fprintf(stderr,"in..."); fflush(stderr);
-      fade_screens (dpy, 0, seconds, ticks, False);
-      fprintf(stderr, "done.\n"); fflush(stderr);
 
-      if (delay) sleep (delay);
+  /* Iterate by steps of the animation... */
+  for (i = (out_p ? steps : 0);
+       (out_p ? i > 0 : i < steps);
+       (out_p ? i-- : i++))
+    {
+      for (screen = 0; screen < nscreens; screen++)
+       {
+         xf86_whack_gamma(dpy, screen, &info[screen],
+                           (((float)i) / ((float)steps)));
+
+         /* If there is user activity, bug out.  (Bug out on keypresses or
+            mouse presses, but not motion, and not release events.  Bugging
+            out on motion made the unfade hack be totally useless, I think.)
+
+            We put the event back so that the calling code can notice it too.
+            It would be better to not remove it at all, but that's harder
+            because Xlib has such a non-design for this kind of crap, and
+            in this application it doesn't matter if the events end up out
+            of order, so in the grand unix tradition we say "fuck it" and
+            do something that mostly works for the time being.
+          */
+         if (XCheckMaskEvent (dpy, (KeyPressMask|ButtonPressMask),
+                              &dummy_event))
+           {
+             XPutBackEvent (dpy, &dummy_event);
+             goto DONE;
+           }
+
+#ifdef GETTIMEOFDAY_TWO_ARGS
+         gettimeofday(&now, &tzp);
+#else
+         gettimeofday(&now);
+#endif
+
+         /* If we haven't already used up our alotted time, sleep to avoid
+            changing the colormap too fast. */
+         {
+           long diff = (((now.tv_sec - then.tv_sec) * 1000000) +
+                        now.tv_usec - then.tv_usec);
+           then.tv_sec = now.tv_sec;
+           then.tv_usec = now.tv_usec;
+           if (usecs_per_step > diff)
+             usleep (usecs_per_step - diff);
+         }
+       }
     }
+  
+
+ DONE:
+
+  if (out_p && black_windows)
+    {
+      for (screen = 0; screen < nscreens; screen++)
+       {
+         if (clear_windows)
+           XClearWindow (dpy, black_windows[screen]);
+         XMapRaised (dpy, black_windows[screen]);
+       }
+      XSync(dpy, False);
+    }
+
+  /* I can't explain this; without this delay, we get a flicker.
+     I suppose there's some lossage with stale bits being in the
+     hardware frame buffer or something, and this delay gives it
+     time to flush out.  This sucks! */
+  usleep(100000);  /* 1/10th second */
+
+  for (screen = 0; screen < nscreens; screen++)
+    xf86_whack_gamma(dpy, screen, &info[screen], 1.0);
+  XSync(dpy, False);
+
+  status = 0;
+
+ FAIL:
+  if (info) free(info);
+
+  return status;
 }
 
-#endif
+
+/* VidModeExtension version 2.0 or better is needed to do gamma. */
+# define XF86_VIDMODE_NAME "XFree86-VidModeExtension"
+# define XF86_VIDMODE_MIN_MAJOR 2
+# define XF86_VIDMODE_MIN_MINOR 0
+
+static Bool
+xf86_check_gamma_extension (Display *dpy)
+{
+  int op, event, error, major, minor;
+
+  if (!XQueryExtension (dpy, XF86_VIDMODE_NAME, &op, &event, &error))
+    return False;  /* display doesn't have the extension. */
+
+  if (!XF86VidModeQueryVersion (dpy, &major, &minor))
+    return False;  /* unable to get version number? */
+
+  if (major < XF86_VIDMODE_MIN_MAJOR || 
+      (major == XF86_VIDMODE_MIN_MAJOR &&
+       minor < XF86_VIDMODE_MIN_MINOR))
+    return False;  /* extension is too old. */
+
+  /* Copacetic */
+  return True;
+}
+
+
+/* XFree doesn't let you set gamma to a value smaller than this.
+   Apparently they didn't anticipate the trick I'm doing here...
+ */
+#define XF86_MIN_GAMMA  0.1
+
+
+static Bool
+xf86_whack_gamma(Display *dpy, int screen, XF86VidModeGamma *info,
+                 float ratio)
+{
+  Bool status;
+  XF86VidModeGamma g2;
+
+  if (ratio < 0) ratio = 0;
+  if (ratio > 1) ratio = 1;
+
+  g2.red   = info->red   * ratio;
+  g2.green = info->green * ratio;
+  g2.blue  = info->blue  * ratio;
+
+# ifdef XF86_MIN_GAMMA
+  if (g2.red   < XF86_MIN_GAMMA) g2.red   = XF86_MIN_GAMMA;
+  if (g2.green < XF86_MIN_GAMMA) g2.green = XF86_MIN_GAMMA;
+  if (g2.blue  < XF86_MIN_GAMMA) g2.blue  = XF86_MIN_GAMMA;
+# endif
+
+/* #### printf("  G %4.2f %4.2f\n", ratio, g2.red); */
+
+  status = XF86VidModeSetGamma (dpy, screen, &g2);
+  XSync(dpy, False);
+  return status;
+}
+
+#endif /* HAVE_XF86VMODE_GAMMA */
diff --git a/utils/grabclient.c b/utils/grabclient.c
new file mode 100644 (file)
index 0000000..0a1d2ac
--- /dev/null
@@ -0,0 +1,140 @@
+/* xscreensaver, Copyright (c) 1992, 1993, 1994, 1997, 1998, 2001
+ *  Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation.  No representations are made about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or 
+ * implied warranty.
+ */
+
+/* This file contains code for running an external program to grab an image
+   onto the given window.  The external program in question must take a
+   window ID as its argument, e.g., the "xscreensaver-getimage" program
+   in the hacks/ directory.
+
+   That program links against utils/grabimage.c, which happens to export the
+   same API as this program (utils/grabclient.c).
+ */
+
+#include "utils.h"
+#include "grabscreen.h"
+#include "resources.h"
+
+#include "vroot.h"
+#include <X11/Xatom.h>
+
+extern char *progname;
+
+
+static Bool
+xscreensaver_window_p (Display *dpy, Window window)
+{
+  Atom type;
+  int format;
+  unsigned long nitems, bytesafter;
+  char *version;
+  if (XGetWindowProperty (dpy, window,
+                         XInternAtom (dpy, "_SCREENSAVER_VERSION", False),
+                         0, 1, False, XA_STRING,
+                         &type, &format, &nitems, &bytesafter,
+                         (unsigned char **) &version)
+      == Success
+      && type != None)
+    return True;
+  return False;
+}
+
+
+/* XCopyArea seems not to work right on SGI O2s if you draw in SubwindowMode
+   on a window whose depth is not the maximal depth of the screen?  Or
+   something.  Anyway, things don't work unless we: use SubwindowMode for
+   the real root window (or a legitimate virtual root window); but do not
+   use SubwindowMode for the xscreensaver window.  I make no attempt to
+   explain.
+ */
+Bool
+use_subwindow_mode_p(Screen *screen, Window window)
+{
+  if (window != VirtualRootWindowOfScreen(screen))
+    return False;
+  else if (xscreensaver_window_p(DisplayOfScreen(screen), window))
+    return False;
+  else
+    return True;
+}
+
+
+static void
+checkerboard (Screen *screen, Window window)
+{
+  Display *dpy = DisplayOfScreen (screen);
+  int x, y;
+  int size = 24;
+  XColor fg, bg;
+  XGCValues gcv;
+  GC gc = XCreateGC (dpy, window, 0, &gcv);
+  XWindowAttributes xgwa;
+  XGetWindowAttributes (dpy, window, &xgwa);
+  fg.flags = bg.flags = DoRed|DoGreen|DoBlue;
+  fg.red = fg.green = fg.blue = 0x0000;
+  bg.red = bg.green = bg.blue = 0x4444;
+  fg.pixel = 0;
+  bg.pixel = 1;
+
+  /* Allocate black and gray, but don't hold them locked. */
+  if (XAllocColor (dpy, xgwa.colormap, &fg))
+    XFreeColors (dpy, xgwa.colormap, &fg.pixel, 1, 0);
+  if (XAllocColor (dpy, xgwa.colormap, &bg))
+    XFreeColors (dpy, xgwa.colormap, &bg.pixel, 1, 0);
+
+  XSetForeground (dpy, gc, bg.pixel);
+  XFillRectangle (dpy, window, gc, 0, 0, xgwa.width, xgwa.height);
+  XSetForeground (dpy, gc, fg.pixel);
+  for (y = 0; y < xgwa.height; y += size+size)
+    for (x = 0; x < xgwa.width; x += size+size)
+      {
+        XFillRectangle (dpy, window, gc, x,      y,      size, size);
+        XFillRectangle (dpy, window, gc, x+size, y+size, size, size);
+      }
+}
+
+void
+grab_screen_image (Screen *screen, Window window)
+{
+  Display *dpy = DisplayOfScreen (screen);
+  char *grabber = get_string_resource ("desktopGrabber", "DesktopGrabber");
+  char *cmd;
+  char id[20];
+
+  if (!grabber || !*grabber)
+    {
+      fprintf (stderr,
+         "%s: resources installed incorrectly: \"desktopGrabber\" is unset!\n",
+               progname);
+      exit (1);
+    }
+
+  sprintf (id, "0x%x", (unsigned long) window);
+  cmd = (char *) malloc (strlen(grabber) + strlen(id) + 1);
+
+  /* Needn't worry about buffer overflows here, because the buffer is
+     longer than the length of the format string, and the length of what
+     we're putting into it.  So the only way to crash would be if the
+     format string itself was corrupted, but that comes from the
+     resource database, and if hostile forces have access to that,
+     then the game is already over.
+   */
+  sprintf (cmd, grabber, id);
+
+  /* In case "cmd" fails, leave some random image on the screen, not just
+     black or white, so that it's more obvious what went wrong. */
+  checkerboard (screen, window);
+
+  XSync (dpy, True);
+  system (cmd);
+  free (cmd);
+  XSync (dpy, True);
+}
index 6f88e5a10dc4ad9772c8a9874cf44d41a5968a65..328029e33eb2d785753cdf97e33ec5d30fb6ca2a 100644 (file)
@@ -34,7 +34,6 @@
 #include "usleep.h"
 #include "colors.h"
 #include "grabscreen.h"
-#include "sgivideo.h"
 #include "visual.h"
 #include "resources.h"
 
@@ -52,8 +51,9 @@
 
 static void copy_default_colormap_contents (Screen *, Colormap, Visual *);
 
-#if defined(HAVE_READ_DISPLAY_EXTENSION) || defined(HAVE_SGI_VIDEO)
-static void make_cubic_colormap (Screen *, Window, Visual *);
+#ifdef HAVE_READ_DISPLAY_EXTENSION
+static void allocate_cubic_colormap (Screen *, Window, Visual *);
+void remap_image (Screen *, Window, Colormap, XImage *);
 #endif
 
 
@@ -64,19 +64,23 @@ MapNotify_event_p (Display *dpy, XEvent *event, XPointer window)
          event->xvisibility.window == (Window) window);
 }
 
-#ifdef DEBUG
 extern char *progname;
-#endif /* DEBUG */
+Bool grab_verbose_p = False;
+
+void
+grabscreen_verbose(void)
+{
+  grab_verbose_p = True;
+}
 
 
 static void
 raise_window(Display *dpy, Window window, Bool dont_wait)
 {
-#ifdef DEBUG
-  fprintf(stderr, "%s: raising window 0x%08lX (%s)\n",
-         progname, (unsigned long) window,
-         (dont_wait ? "not waiting" : "waiting"));
-#endif /* DEBUG */
+  if (grab_verbose_p)
+    fprintf(stderr, "%s: raising window 0x%08lX (%s)\n",
+            progname, (unsigned long) window,
+            (dont_wait ? "not waiting" : "waiting"));
 
   if (! dont_wait)
     {
@@ -92,6 +96,8 @@ raise_window(Display *dpy, Window window, Bool dont_wait)
       hints.height = xgwa.height;
       hints.flags |= (PPosition|USPosition|PSize|USSize);
       XSetWMNormalHints(dpy, window, &hints);
+
+      XSelectInput (dpy, window, (xgwa.your_event_mask | StructureNotifyMask));
     }
 
   XMapRaised(dpy, window);
@@ -203,8 +209,8 @@ install_screen_colormaps (Screen *screen)
 }
 
 
-static void
-grab_screen_image_1 (Screen *screen, Window window)
+void
+grab_screen_image (Screen *screen, Window window)
 {
   Display *dpy = DisplayOfScreen (screen);
   XWindowAttributes xgwa;
@@ -239,19 +245,19 @@ grab_screen_image_1 (Screen *screen, Window window)
       unmap_time = unmap * 100000;
     }
 
-#ifdef DEBUG
-  fprintf(stderr,
-         "\n%s: window 0x%08lX root: %d saver: %d grab: %d wait: %.1f\n",
-         progname, (unsigned long) window,
-         root_p, saver_p, grab_mouse_p, ((double)unmap_time)/1000000.0);
-  {
-    XWindowAttributes xgwa2;
-    XGetWindowAttributes (dpy, window, &xgwa2);
-    fprintf(stderr, "%s: ", progname);
-    describe_visual(stderr, screen, xgwa2.visual, ####);
-    fprintf (stderr, "\n");
-  }
-#endif /* DEBUG */
+  if (grab_verbose_p)
+    {
+      XWindowAttributes xgwa2;
+      fprintf(stderr,
+              "\n%s: window 0x%08lX root: %d saver: %d grab: %d wait: %.1f\n",
+              progname, (unsigned long) window,
+              root_p, saver_p, grab_mouse_p, ((double)unmap_time)/1000000.0);
+
+      XGetWindowAttributes (dpy, window, &xgwa2);
+      fprintf(stderr, "%s: ", progname);
+      describe_visual(stderr, screen, xgwa2.visual, False);
+      fprintf (stderr, "\n");
+    }
 
   if (!root_p)
     XSetWindowBackgroundPixmap (dpy, window, None);
@@ -283,9 +289,11 @@ grab_screen_image_1 (Screen *screen, Window window)
       if (! read_display(screen, window, 0, saver_p))
 #endif /* HAVE_READ_DISPLAY_EXTENSION */
        {
-#if defined(HAVE_READ_DISPLAY_EXTENSION) && defined(DEBUG)
-         fprintf(stderr, "%s: read_display() failed\n", progname);
-#endif /* DEBUG */
+#ifdef HAVE_READ_DISPLAY_EXTENSION
+          if (grab_verbose_p)
+            fprintf(stderr, "%s: read_display() failed\n", progname);
+#endif /* HAVE_READ_DISPLAY_EXTENSION */
+
          copy_default_colormap_contents (screen, xgwa.colormap, xgwa.visual);
          raise_window(dpy, window, saver_p);
 
@@ -312,9 +320,10 @@ grab_screen_image_1 (Screen *screen, Window window)
          XGCValues gcv;
          GC gc;
 
-#if defined(HAVE_READ_DISPLAY_EXTENSION) && defined(DEBUG)
-         fprintf(stderr, "%s: read_display() failed\n", progname);
-#endif /* DEBUG */
+#ifdef HAVE_READ_DISPLAY_EXTENSION
+          if  (grab_verbose_p)
+            fprintf(stderr, "%s: read_display() failed\n", progname);
+#endif /* HAVE_READ_DISPLAY_EXTENSION */
 
          copy_default_colormap_contents (screen, xgwa.colormap, xgwa.visual);
 
@@ -329,6 +338,11 @@ grab_screen_image_1 (Screen *screen, Window window)
       XFreePixmap (dpy, pixmap);
     }
 
+  if (grab_verbose_p)
+    fprintf (stderr, "%s: grabbed %d bit screen image to %swindow.\n",
+             progname, xgwa.depth,
+             (root_p ? "real root " : ""));
+
   if (grab_mouse_p)
     {
       XUngrabPointer (dpy, CurrentTime);
@@ -338,42 +352,6 @@ grab_screen_image_1 (Screen *screen, Window window)
   XSync (dpy, True);
 }
 
-void
-grab_screen_image (Screen *screen, Window window)
-{
-#ifdef HAVE_SGI_VIDEO
-  char c, *s = get_string_resource("grabVideoProbability", "Float");
-  double prob = -1;
-  if (!s ||
-      (1 != sscanf (s, " %lf %c", &prob, &c)) ||
-      prob < 0 ||
-      prob > 1)
-    prob = 0.5;
-
-  if ((random() % 100) < ((int) (100 * prob)))
-    {
-      XWindowAttributes xgwa;
-      Display *dpy = DisplayOfScreen (screen);
-      XGetWindowAttributes (dpy, window, &xgwa);
-# ifdef DEBUG
-      fprintf(stderr, "%s: trying to grab from video...\n", progname);
-# endif /* DEBUG */
-      if (grab_video_frame (screen, xgwa.visual, window))
-       {
-         if (xgwa.depth < 24)
-           {
-             int class = visual_class (screen, xgwa.visual);
-             if (class == PseudoColor || class == DirectColor)
-               make_cubic_colormap (screen, window, xgwa.visual);
-           }
-         return;
-       }
-    }
-#endif /* HAVE_SGI_VIDEO */
-
-  grab_screen_image_1 (screen, window);
-}
-
 
 /* When we are grabbing and manipulating a screen image, it's important that
    we use the same colormap it originally had.  So, if the screensaver was
@@ -427,11 +405,9 @@ copy_default_colormap_contents (Screen *screen,
   got_cells = max_cells;
   allocate_writable_colors (dpy, to_cmap, pixels, &got_cells);
 
-#ifdef DEBUG
-  if (got_cells != max_cells)
+  if (grab_verbose_p && got_cells != max_cells)
     fprintf(stderr, "%s: got only %d of %d cells\n", progname,
            got_cells, max_cells);
-#endif /* DEBUG */
 
   if (got_cells <= 0)                                   /* we're screwed */
     ;
@@ -456,9 +432,8 @@ copy_default_colormap_contents (Screen *screen,
     }
 
 
-#ifdef DEBUG
-  fprintf(stderr, "%s: installing copy of default colormap\n", progname);
-#endif /* DEBUG */
+  if (grab_verbose_p)
+    fprintf(stderr, "%s: installing copy of default colormap\n", progname);
 
   free (old_colors);
   free (new_colors);
@@ -490,7 +465,7 @@ read_display (Screen *screen, Window window, Pixmap into_pixmap,
   XGCValues gcv;
   int class;
   GC gc;
-  Bool install_p = False;
+  Bool remap_p = False;
 
   /* Check to see if the server supports the extension, and bug out if not.
    */
@@ -514,9 +489,8 @@ read_display (Screen *screen, Window window, Pixmap into_pixmap,
       if (xgwa.depth != 8 && xgwa.depth != 12)
        return False;
       else
-       /* Install a colormap that makes this visual behave like
-          a TrueColor visual of the same depth. */
-       install_p = True;
+       /* Allocate a TrueColor-like spread of colors for the image. */
+       remap_p = True;
     }
 
 
@@ -571,10 +545,9 @@ read_display (Screen *screen, Window window, Pixmap into_pixmap,
       if (!image2)
        return False;
 
-#ifdef DEBUG
-      fprintf(stderr, "%s: converting from depth %d to depth %d\n",
-             progname, image->depth, xgwa.depth);
-#endif /* DEBUG */
+      if (grab_verbose_p)
+        fprintf(stderr, "%s: converting from depth %d to depth %d\n",
+                progname, image->depth, xgwa.depth);
 
       for (y = 0; y < image->height; y++)
        for (x = 0; x < image->width; x++)
@@ -604,6 +577,11 @@ read_display (Screen *screen, Window window, Pixmap into_pixmap,
       image = image2;
     }
 
+  if (remap_p)
+    {
+      allocate_cubic_colormap (screen, window, xgwa.visual);
+      remap_image (screen, window, xgwa.colormap, image);
+    }
 
   /* Now actually put the bits into the window or pixmap -- note the design
      bogosity of this extension, where we've been forced to take 24 bit data
@@ -644,31 +622,32 @@ read_display (Screen *screen, Window window, Pixmap into_pixmap,
     }
   XDestroyImage(image);
 
-  if (install_p)
-    make_cubic_colormap (screen, window, xgwa.visual);
-
   return True;
 }
 #endif /* HAVE_READ_DISPLAY_EXTENSION */
 
 
-#if defined(HAVE_READ_DISPLAY_EXTENSION) || defined(HAVE_SGI_VIDEO)
+#ifdef HAVE_READ_DISPLAY_EXTENSION
 
 /* Makes and installs a colormap that makes a PseudoColor or DirectColor
    visual behave like a TrueColor visual of the same depth.
  */
 static void
-make_cubic_colormap (Screen *screen, Window window, Visual *visual)
+allocate_cubic_colormap (Screen *screen, Window window, Visual *visual)
 {
   Display *dpy = DisplayOfScreen (screen);
-  Colormap cmap = XCreateColormap(dpy, window, visual, AllocAll);
+  XWindowAttributes xgwa;
+  Colormap cmap;
   int nr, ng, nb, cells;
   int r, g, b;
   int depth;
   XColor colors[4097];
   int i;
 
+  XGetWindowAttributes (dpy, window, &xgwa);
+  cmap = xgwa.colormap;
   depth = visual_depth(screen, visual);
+
   switch (depth)
     {
     case 8:  nr = 3; ng = 3; nb = 2; cells = 256;  break;
@@ -677,18 +656,13 @@ make_cubic_colormap (Screen *screen, Window window, Visual *visual)
     }
 
   memset(colors, 0, sizeof(colors));
-  for (i = 0; i < cells; i++)
-    {
-      colors[i].flags = DoRed|DoGreen|DoBlue;
-      colors[i].red = colors[i].green = colors[i].blue = 0;
-    }
-
   for (r = 0; r < (1 << nr); r++)
     for (g = 0; g < (1 << ng); g++)
       for (b = 0; b < (1 << nb); b++)
        {
          i = (r | (g << nr) | (b << (nr + ng)));
          colors[i].pixel = i;
+          colors[i].flags = DoRed|DoGreen|DoBlue;
          if (depth == 8)
            {
              colors[i].red   = ((r << 13) | (r << 10) | (r << 7) |
@@ -707,27 +681,132 @@ make_cubic_colormap (Screen *screen, Window window, Visual *visual)
            }
        }
 
-#ifdef DEBUG
-  fprintf(stderr, "%s: installing cubic colormap\n", progname);
-#endif /* DEBUG */
-
-  XStoreColors (dpy, cmap, colors, cells);
-  XSetWindowColormap (dpy, window, cmap);
-
-  /* Gag, install the colormap.
-     This is definitely right in the `if xscreensaver_window_p' case, since
-     it will never get installed otherwise.  But, if we don't do it
-     unconditionally, then the new colormap won't get installed until the
-     window (re-)gains focus.  It's generally very antisocial to install
-     the colormap of a non-OverrideRedirect window (that task belongs to
-     the WM) and if we were being kosher, we would only install this cmap
-     if the old cmap was already installed (or perhaps, if the window had
-     focus.)  But, since this extension only exists on SGIs, and since SGIs
-     can handle four colormaps at once, let's go ahead and install it all
-     the time, so that even if the window pops up and has never had focus,
-     it will still display in the proper colors.
-   */
-  XInstallColormap (dpy, cmap);
+  {
+    int j;
+    int allocated = 0;
+    int interleave = cells / 8;  /* skip around, rather than allocating in
+                                    order, so that we get better coverage if
+                                    we can't allocated all of them. */
+    for (j = 0; j < interleave; j++)
+      for (i = 0; i < cells; i += interleave)
+        if (XAllocColor (dpy, cmap, &colors[i + j]))
+          allocated++;
+
+    if (grab_verbose_p)
+      fprintf (stderr, "%s: allocated %d of %d colors for cubic map\n",
+               progname, allocated, cells);
+  }
+}
+
+static unsigned long
+find_closest_pixel (XColor *colors, int ncolors,
+                    unsigned long r, unsigned long g, unsigned long b)
+{
+  unsigned long distance = ~0;
+  int i, found = 0;
+
+  if (ncolors == 0)
+    abort();
+  for (i = 0; i < ncolors; i++)
+    {
+      unsigned long d;
+      int rd, gd, bd;
+
+      rd = r - colors[i].red;
+      gd = g - colors[i].green;
+      bd = b - colors[i].blue;
+      if (rd < 0) rd = -rd;
+      if (gd < 0) gd = -gd;
+      if (bd < 0) bd = -bd;
+      d = (rd << 1) + (gd << 2) + bd;
+      
+      if (d < distance)
+       {
+         distance = d;
+         found = i;
+          if (distance == 0)
+              break;
+       }
+    }
+
+  return found;
+}
+
+
+void
+remap_image (Screen *screen, Window window, Colormap cmap, XImage *image)
+{
+  Display *dpy = DisplayOfScreen (screen);
+  unsigned long map[4097];
+  int x, y, i;
+  int cells;
+  XColor colors[4097];
+
+  if (image->depth == 8)
+    cells = 256;
+  else if (image->depth == 12)
+    cells = 4096;
+  else
+    abort();
+
+  memset(map,    -1, sizeof(*map));
+  memset(colors, -1, sizeof(*colors));
+
+  for (i = 0; i < cells; i++)
+    colors[i].pixel = i;
+  XQueryColors (dpy, cmap, colors, cells);
+
+  if (grab_verbose_p)
+    fprintf(stderr, "%s: building table for %d bit image\n",
+            progname, image->depth);
+
+  for (i = 0; i < cells; i++)
+    {
+      unsigned short r, g, b;
+
+      if (cells == 256)
+        {
+          /* "RRR GGG BB" In an 8 bit map.  Convert that to
+             "RRR RRR RR" "GGG GGG GG" "BB BB BB BB" to give
+             an even spread. */
+          r = (i & 0x07);
+          g = (i & 0x38) >> 3;
+          b = (i & 0xC0) >> 6;
+
+          r = ((r << 13) | (r << 10) | (r << 7) | (r <<  4) | (r <<  1));
+          g = ((g << 13) | (g << 10) | (g << 7) | (g <<  4) | (g <<  1));
+          b = ((b << 14) | (b << 12) | (b << 10) | (b <<  8) |
+               (b <<  6) | (b <<  4) | (b <<  2) | b);
+        }
+      else
+        {
+          /* "RRRR GGGG BBBB" In a 12 bit map.  Convert that to
+             "RRRR RRRR" "GGGG GGGG" "BBBB BBBB" to give an even
+             spread. */
+          r = (i & 0x00F);
+          g = (i & 0x0F0) >> 4;
+          b = (i & 0xF00) >> 8;
+
+          r = (r << 12) | (r << 8) | (r << 4) | r;
+          g = (g << 12) | (g << 8) | (g << 4) | g;
+          b = (b << 12) | (b << 8) | (b << 4) | b;
+        }
+
+      map[i] = find_closest_pixel (colors, cells, r, g, b);
+    }
+
+  if (grab_verbose_p)
+    fprintf(stderr, "%s: remapping colors in %d bit image\n",
+            progname, image->depth);
+
+  for (y = 0; y < image->height; y++)
+    for (x = 0; x < image->width; x++)
+      {
+        unsigned long pixel = XGetPixel(image, x, y);
+        if (pixel >= cells) abort();
+        XPutPixel(image, x, y, map[pixel]);
+      }
 }
 
-#endif /* HAVE_READ_DISPLAY_EXTENSION || HAVE_SGI_VIDEO */
+
+#endif /* HAVE_READ_DISPLAY_EXTENSION */
index f8d8e5d86cb62bd9ccdb93540f41ce68d9afbe19..befb349a1aef3ed4917d213cacdc5defe4d9c77a 100644 (file)
@@ -50,9 +50,10 @@ parse_xpm_data (Display *dpy, Visual *visual, Colormap colormap, int depth,
                 unsigned long transparent_color,
                 unsigned const char * const * data,
                 int *width_ret, int *height_ret,
-                unsigned long **pixels_ret, int *npixels_ret)
+                unsigned long **pixels_ret, int *npixels_ret,
+                unsigned char **mask_ret)
 {
-  int w, h, ncolors, nbytes;
+  int w, w8, h, ncolors, nbytes;
   char c;
   int i;
   struct {
@@ -72,6 +73,19 @@ parse_xpm_data (Display *dpy, Visual *visual, Colormap colormap, int depth,
   if (nbytes != 1)
     abort();
   data++;
+
+  w8 = (w + 8) / 8;
+
+  if (mask_ret)
+    {
+      int s = (w8 * h) + 1;
+      *mask_ret = (char *) malloc (s);
+      if (!*mask_ret)
+        mask_ret = 0;
+      else
+        memset (*mask_ret, 255, s);
+    }
+
   for (i = 0; i < ncolors; i++)
     {
       const unsigned char *line = *data;
@@ -160,6 +174,9 @@ parse_xpm_data (Display *dpy, Visual *visual, Colormap colormap, int depth,
               int p = rmap[*line++];
               XPutPixel (ximage, x, y,
                          (p == 255 ? transparent_color : pixels[p]));
+
+              if (p == 255 && mask_ret)
+                (*mask_ret)[(y * w8) + (x >> 3)] &= (~(1 << (x % 8)));
             }
         }
     }
@@ -180,6 +197,7 @@ Pixmap
 xscreensaver_logo (Display *dpy, Window window, Colormap cmap,
                    unsigned long background_color,
                    unsigned long **pixels_ret, int *npixels_ret,
+                   Pixmap *mask_ret,
                    Bool big_p)
 {
   int npixels, iw, ih;
@@ -187,12 +205,15 @@ xscreensaver_logo (Display *dpy, Window window, Colormap cmap,
   XImage *image;
   Pixmap p = 0;
   XWindowAttributes xgwa;
+  unsigned char *mask = 0;
+
   XGetWindowAttributes (dpy, window, &xgwa);
 
   image = parse_xpm_data (dpy, xgwa.visual, xgwa.colormap, xgwa.depth,
                           background_color,
                           (big_p ? logo_180_xpm : logo_50_xpm),
-                          &iw, &ih, &pixels, &npixels);
+                          &iw, &ih, &pixels, &npixels,
+                          (mask_ret ? &mask : 0));
   if (image)
     {
       XGCValues gcv;
@@ -202,6 +223,13 @@ xscreensaver_logo (Display *dpy, Window window, Colormap cmap,
       XPutImage (dpy, p, gc, image, 0, 0, 0, 0, iw, ih);
       XDestroyImage (image);
       XFreeGC (dpy, gc);
+
+      if (mask_ret && mask)
+        {
+          *mask_ret = XCreatePixmapFromBitmapData (dpy, window, mask,
+                                                   iw, ih, 1L, 0L, 1);
+          free (mask);
+        }
     }
   return p;
 }
index 661475964a997b289ee790867250ee123f344aab..9e1f6cebc5099166720e1ff1e996c49bdc6811b2 100644 (file)
@@ -25,6 +25,7 @@ extern Pixmap
 xscreensaver_logo (Display *dpy, Window window, Colormap cmap,
                    unsigned long background_color,
                    unsigned long **pixels_ret, int *npixels_ret,
+                   Pixmap *mask_ret,
                    Bool big_p);
 
 #endif /* __XSCREENSAVER_RESOURCES_H__ */
diff --git a/utils/sgivideo.c b/utils/sgivideo.c
deleted file mode 100644 (file)
index 38b0c66..0000000
+++ /dev/null
@@ -1,508 +0,0 @@
-/* xscreensaver, Copyright (c) 1997, 1998 Jamie Zawinski <jwz@jwz.org>
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation.  No representations are made about the suitability of this
- * software for any purpose.  It is provided "as is" without express or 
- * implied warranty.
- */
-
-/* This file contains code for grabbing a frame from one of the video inputs
-   on an SGI.  It returns it on a Drawable where it can be hacked at will.
-   This code checks all available video devices for the first one with a
-   non-blank signal.
-
-   It checks the deviced whose number comes from the `videoDevice' resource
-   first, then the default video device, then all the devices in order.
-
-   The intensity of the video signal is increased by the value of the
-   `videoGain' resource (a float) defaulting to 2.2, since NTSC video tends
-   to appear kind of dim on computer screens.
-
-   The video image is expanded to fit the window (while preserving the aspect
-   ratio.)  This is done by simply replicating pixels, not dithering.  That
-   turns out to look good enough most of the time.
-
-   If the target window is not TrueColor, the grabbed image will be quantized
-   to fit.  This also is done without dithering, but in this case, dithering
-   would help a lot, because it looks like crap.  So use TrueColor if you care.
- */
-
-#include "utils.h"
-#include "sgivideo.h"
-#include "resources.h"
-#include "visual.h"
-
-#ifdef HAVE_SGI_VIDEO  /* whole file */
-
-#include "usleep.h"
-
-#include <X11/Xutil.h>
-
-#ifdef DEBUG
-extern char *progname;
-#endif /* DEBUG */
-
-
-# include <dmedia/vl.h>
-
-static Bool dark_image_p(unsigned long *image, int width, int height);
-static Bool install_video_frame(unsigned long *image, int width, int height,
-                               Screen *screen, Visual *visual, Drawable dest);
-
-#ifdef DEBUG
-static void
-describe_input(const char *prefix, VLServer server, int camera)
-{
-  VLDevList dl;
-  int i, j;
-
-  if (camera == VL_ANY)
-    {
-      printf("%s: %s VL_ANY\n", progname, prefix);
-      return;
-    }
-
-  vlGetDeviceList(server, &dl);
-  for (i = 0; i < dl.numDevices; i++)
-    {
-      VLDevice *d = &dl.devices[i];
-      for (j = 0; j < d->numNodes; j++)
-       if (d->nodes[j].number == camera)
-         {
-           printf("%s: %s %d, \"%s\"\n", progname, prefix,
-                  d->nodes[j].number,
-                  d->nodes[j].name);
-           return;
-         }
-    }
-
-  /* else... */
-  printf("%s: %s %d (???)\n", progname, prefix, camera);
-}
-#endif /* DEBUG */
-
-
-static Bool
-grab_frame_1(Screen *screen, Visual *visual, Drawable dest, int camera)
-{
-  Bool status = False;
-  int width = 0;
-  int height = 0;
-  VLServer server = 0;
-  VLNode input = -1;
-  VLNode output = -1;
-  VLPath path = 0;
-  VLBuffer buffer = 0;
-  VLControlValue ctl;
-  VLInfoPtr info;
-  VLTransferDescriptor trans;
-  unsigned long *image = 0;
-
-  server = vlOpenVideo (NULL);
-  if (!server)
-    {
-#ifdef DEBUG
-      fprintf (stderr, "%s: unable to open video server\n", progname);
-#endif /* DEBUG */
-      goto DONE;
-    }
-
-#ifdef DEBUG
-  describe_input("trying device", server, camera);
-#endif /* DEBUG */
-
-  input  = vlGetNode (server, VL_SRC, VL_VIDEO, camera);
-  output = vlGetNode (server, VL_DRN, VL_MEM, VL_ANY);
-
-  if (input == -1 || output == -1)
-    {
-#ifdef DEBUG
-      fprintf (stderr, "%s: unable to get video I/O nodes: %d\n",
-              progname, vlErrno);
-#endif /* DEBUG */
-      goto DONE;
-    }
-
-  path = vlCreatePath (server, VL_ANY, input, output);
-  if (path == -1)
-    {
-#ifdef DEBUG
-      fprintf (stderr, "%s: unable to get video path: %d\n",
-              progname, vlErrno);
-#endif /* DEBUG */
-      goto DONE;
-    }
-
-  if (vlSetupPaths (server, (VLPathList) &path, 1, VL_SHARE, VL_SHARE) == -1)
-    {
-#ifdef DEBUG
-      fprintf (stderr, "%s: unable to set up video path: %d\n",
-              progname, vlErrno);
-#endif /* DEBUG */
-      goto DONE;
-    }
-
-  ctl.intVal = VL_CAPTURE_INTERLEAVED;
-  if (vlSetControl (server, path, output, VL_CAP_TYPE, &ctl) == -1)
-    {
-#ifdef DEBUG
-      fprintf (stderr,
-              "%s: unable to set video capture type to interleaved: %d\n",
-              progname, vlErrno);
-#endif /* DEBUG */
-      goto DONE;
-    }
-
-  ctl.intVal = VL_PACKING_RGBA_8;
-  if (vlSetControl (server, path, output, VL_PACKING, &ctl) == -1)
-    {
-#ifdef DEBUG
-      fprintf (stderr, "%s: unable to set video packing to RGB8: %d\n",
-              progname, vlErrno);
-#endif /* DEBUG */
-      goto DONE;
-    }
-
-  buffer = vlCreateBuffer (server, path, output, 3);
-  if (!buffer)
-    {
-#ifdef DEBUG
-      fprintf (stderr, "%s: unable to create video buffer: %d\n",
-              progname, vlErrno);
-#endif /* DEBUG */
-      goto DONE;
-    }
-
-  vlRegisterBuffer (server, path, output, buffer);
-
-  memset(&trans, 0, sizeof(trans));
-  trans.trigger = VLTriggerImmediate;
-  trans.mode = VL_TRANSFER_MODE_DISCRETE;
-  trans.delay = 0;
-  trans.count = 1;
-  if (vlBeginTransfer (server, path, 1, &trans) == -1)
-    {
-#ifdef DEBUG
-      fprintf (stderr, "%s: unable to begin video transfer: %d\n",
-              progname, vlErrno);
-#endif /* DEBUG */
-      goto DONE;
-    }
-    
-  
-  /* try to get a frame; don't try more than a zillion times.
-     I strongly suspect this isn't the best way to do this...
-   */
-  {
-    int i;
-    for (i = 0; i < 1000; i++)
-      {
-       info = vlGetLatestValid (server, buffer);
-       if (info) break;
-       usleep(10000);  /* 1/100th second (a bit more than half a field) */
-      }
-  }
-
-  if (!info)
-    {
-#ifdef DEBUG
-      fprintf (stderr, "%s: unable to get video info: %d\n",
-              progname, vlErrno);
-#endif /* DEBUG */
-      goto DONE;
-    }
-
-  image = vlGetActiveRegion (server, buffer, info);
-  if (!image)
-    {
-#ifdef DEBUG
-      fprintf (stderr, "%s: unable to grab video frame: %d\n",
-              progname, vlErrno);
-#endif /* DEBUG */
-      goto DONE;
-    }
-
-  if (vlGetControl (server, path, input, VL_SIZE, &ctl) != -1)
-    {
-      width  = ctl.xyVal.x;
-      height = ctl.xyVal.y;
-    }
-  else
-    {
-#ifdef DEBUG
-      fprintf (stderr, "%s: unable to get video image size: %d\n",
-              progname, vlErrno);
-#endif /* DEBUG */
-      goto DONE;
-    }
-
-#ifdef DEBUG
-  describe_input("read device", server, camera);
-#endif /* DEBUG */
-
-  if (dark_image_p(image, width, height))
-    goto DONE;
-
-  status = install_video_frame(image, width, height, screen, visual, dest);
-
- DONE:
-
-  /* I think `image' is freed as a result of destroying buffer. */
-
-  if (buffer)
-    vlDestroyBuffer(server, buffer);
-  if (path)
-    vlDestroyPath(server, path);
-  if (server)
-    vlCloseVideo (server);
-
-  return status;
-}
-
-
-static Bool
-dark_image_p(unsigned long *image, int width, int height)
-{
-  double max = 0.02;
-  double total = 0.0;
-  int i;
-  int pixels = (width * height);
-#ifdef DEBUG
-  int mr = 0, mg = 0, mb = 0;
-#endif /* DEBUG */
-  for (i = pixels-1; i >= 0; i--)
-    {
-      unsigned long pixel = image[i];
-      unsigned int r = (pixel & 0x0000FF);
-      unsigned int g = (pixel & 0x00FF00) >> 8;
-      unsigned int b = (pixel & 0xFF0000) >> 16;
-#ifdef DEBUG
-      if (r > mr) mr = r;
-      if (g > mg) mg = g;
-      if (b > mb) mb = b;
-#endif /* DEBUG */
-      total += ((r * (0.3086 / 0xFF)) +       /* gamma 1.0 intensity values */
-               (g * (0.6094 / 0xFF)) +
-               (b * (0.0820 / 0xFF)));
-    }
-  total /= pixels;
-#ifdef DEBUG
-  fprintf(stderr, "%s: %sdark %f (max rgb: %d %d %d)\n", progname,
-         (total < max ? "" : "not "),
-         total, mr, mg, mb);
-#endif /* DEBUG */
-  return (total < max);
-}
-
-
-Bool
-grab_video_frame(Screen *screen, Visual *visual, Drawable dest)
-{
-  char *def_camera = get_string_resource("videoDevice", "Integer");
-  if (def_camera && *def_camera)
-    {
-      int cam;
-      char c;
-      int ok = (1 == sscanf(def_camera, " %d %c", &cam, &c));
-      free (def_camera);
-      if (ok && grab_frame_1(screen, visual, dest, cam))
-       return True;
-    }
-
-  if (grab_frame_1(screen, visual, dest, VL_ANY))
-    return True;
-  else
-    {
-      int i;
-      VLServer server = vlOpenVideo (NULL);
-
-      if (!server) return False;
-
-      for (i = 0; i < 5; i++)  /* if we get all black images, retry up to
-                                  five times. */
-       {
-         VLDevList dl;
-         int j;
-
-          j = vlGetDeviceList(server, &dl);
-          vlCloseVideo(server);
-          if (j < 0) return False;
-
-         for (j = 0; j < dl.numDevices; j++)
-           {
-             VLDevice *d = &dl.devices[j];
-             int k;
-             for (k = 0; k < d->numNodes; k++)
-               if (d->nodes[k].type == VL_SRC &&
-                   d->nodes[k].kind == VL_VIDEO)
-                 if (grab_frame_1(screen, visual, dest, d->nodes[k].number))
-                   return True;
-             /* nothing yet?  go around and try again... */
-           }
-       }
-    }
-#ifdef DEBUG
-  fprintf (stderr, "%s: images on all video feeds are too dark.\n",
-          progname);
-#endif /* DEBUG */
-  return False;
-}
-
-
-static Bool
-install_video_frame(unsigned long *image, int width, int height,
-                   Screen *screen, Visual *visual, Drawable dest)
-{
-  Display *dpy = DisplayOfScreen(screen);
-  int x, y;
-  unsigned int w, h, b, d;
-  Window root;
-  XGCValues gcv;
-  GC gc;
-  XImage *ximage = 0;
-  int image_depth;
-  Bool free_data = False;
-  int vblank_kludge = 3;       /* lose the closed-captioning blips... */
-
-  double gain;
-  char c, *G = get_string_resource("videoGain", "Float");
-  if (!G || (1 != sscanf (G, " %lf %c", &gain, &c)))
-    /* default to the usual NTSC gamma value.  Is this the right thing to do?
-       (Yeah, "gain" isn't quite "gamma", but it's close enough...) */
-    gain = 2.2;
-  if (G) free (G);
-
-  XGetGeometry(dpy, dest, &root, &x, &y, &w, &h, &b, &d);
-  
-  gcv.function = GXcopy;
-  gcv.foreground = BlackPixelOfScreen(screen);
-  gc = XCreateGC (dpy, dest, GCFunction|GCForeground, &gcv);
-
-  image_depth = visual_depth(screen, visual);
-  if (image_depth < 24)
-    image_depth = 24;  /* We'll dither */
-
-  ximage = XCreateImage (dpy, visual, image_depth, ZPixmap, 0, (char *) image,
-                        width, height, 8, 0);
-  XInitImage(ximage);
-  if (!ximage)
-    return False;
-
-  if (gain > 0.0)      /* Pump up the volume */
-    {
-      unsigned char *end = (unsigned char *) (image + (width * height));
-      unsigned char *s = (unsigned char *) image;
-      while (s < end)
-       {
-         unsigned int r = s[1] * gain;
-         unsigned int g = s[2] * gain;
-         unsigned int b = s[3] * gain;
-         s[1] = (r > 255 ? 255 : r);
-         s[2] = (g > 255 ? 255 : g);
-         s[3] = (b > 255 ? 255 : b);
-         s += 4;
-       }
-    }
-
-  /* If the drawable is not of truecolor depth, we need to convert the
-     grabbed bits to match the depth by clipping off the less significant
-     bit-planes of each color component.
-  */
-  if (d != 24 && d != 32)
-    {
-      int x, y;
-      /* We use the same ximage->data in both images -- that's ok, because
-        since we're reading from B and writing to A, and B uses more bytes
-        per pixel than A, the write pointer won't overrun the read pointer.
-      */
-      XImage *ximage2 = XCreateImage (dpy, visual, d, ZPixmap, 0,
-                                     (char *) image,
-                                     width, height, 8, 0);
-      XInitImage(ximage2);
-      if (!ximage2)
-       {
-         XDestroyImage(ximage);
-         return False;
-       }
-
-#ifdef DEBUG
-      fprintf(stderr, "%s: converting from depth %d to depth %d\n",
-             progname, ximage->depth, ximage2->depth);
-#endif /* DEBUG */
-
-      for (y = 0; y < ximage->height; y++)
-       for (x = 0; x < ximage->width; x++)
-         {
-           unsigned long pixel = XGetPixel(ximage, x, y);
-           unsigned int r = (pixel & 0x0000FF);
-           unsigned int g = (pixel & 0x00FF00) >> 8;
-           unsigned int b = (pixel & 0xFF0000) >> 16;
-
-           if (d == 8)
-             pixel = ((r >> 5) | ((g >> 5) << 3) | ((b >> 6) << 6));
-           else if (d == 12)
-             pixel = ((r >> 4) | ((g >> 4) << 4) | ((b >> 4) << 8));
-           else if (d == 16)
-             pixel = ((r >> 3) | ((g >> 3) << 5) | ((b >> 3) << 10));
-           else
-             abort();
-
-           XPutPixel(ximage2, x, y, pixel);
-         }
-      ximage->data = 0;
-      XDestroyImage(ximage);
-      ximage = ximage2;
-    }
-
-  if (width < w && height < h)      /* Stretch the image to fit the window. */
-    {
-      double dw = (((double) w) / ((double) width));
-      double dh = (((double) h) / ((double) height));
-      double d = (dw > dh ? dh : dw);
-      int width2  = d * width;
-      int height2 = d * height;
-      int x, y;
-      XImage *ximage2 = XCreateImage (dpy, visual, ximage->depth, ZPixmap,
-                                     0, NULL,
-                                     width2, height2, 8, 0);
-      if (!ximage2->data)
-       ximage2->data = (char *) malloc(width2 * height2 * 4);
-      free_data = True;
-      XInitImage(ximage2);
-#ifdef DEBUG
-      fprintf(stderr, "%s: stretching video image by %f (%d %d -> %d %d)\n",
-             progname, d, width, height, width2, height2);
-#endif /* DEBUG */
-      for (y = 0; y < height2; y++)
-       {
-         int y2 = (int) (y / d);
-         for (x = 0; x < width2; x++)
-           XPutPixel(ximage2, x, y, XGetPixel(ximage, (int) (x / d), y2));
-       }
-      ximage->data = 0;
-      XDestroyImage(ximage);
-      ximage = ximage2;
-      width = width2;
-      height = height2;
-      vblank_kludge *= d;
-    }
-
-  XFillRectangle(dpy, dest, gc, 0, 0, w, h);
-  XPutImage(dpy, dest, gc, ximage, 0, vblank_kludge,
-           (w - width) / 2,
-           (h - height) / 2,
-           width, height - vblank_kludge);
-  XSync(dpy, False);
-
-  if (free_data)
-    free(ximage->data);
-  ximage->data = 0;
-  XDestroyImage(ximage);
-  XFreeGC (dpy, gc);
-  return True;
-}
-
-#endif /* HAVE_SGI_VIDEO */
diff --git a/utils/sgivideo.h b/utils/sgivideo.h
deleted file mode 100644 (file)
index 794fde6..0000000
+++ /dev/null
@@ -1,18 +0,0 @@
-/* xscreensaver, Copyright (c) 1997 Jamie Zawinski <jwz@jwz.org>
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation.  No representations are made about the suitability of this
- * software for any purpose.  It is provided "as is" without express or 
- * implied warranty.
- */
-
-#ifndef __SGIVIDEO_H__
-# ifdef HAVE_SGI_VIDEO
-
-Bool grab_video_frame(Screen *screen, Visual *visual, Drawable dest);
-
-# endif /* HAVE_SGI_VIDEO */
-#endif /* __SGIVIDEO_H__ */
index c51e6646a5da5f861b07125d8442cc1187951883..4de0984d902af17bc877c23ba7459d70f46544a7 100644 (file)
@@ -1,2 +1,2 @@
 static const char screensaver_id[] =
-       "@(#)xscreensaver 3.31 (28-Mar-2001), by Jamie Zawinski (jwz@jwz.org)";
+       "@(#)xscreensaver 3.32 (14-Apr-2001), by Jamie Zawinski (jwz@jwz.org)";
index b0bcfd3b891a8faf61e0a8c8a7ebb4462968493a..debc1baee77211cabf76edfe4ad7048d55f8b944 100644 (file)
@@ -1,7 +1,7 @@
 Begin3
 Title:          xscreensaver
-Version:        3.31
-Entered-date:   29MAR01
+Version:        3.32
+Entered-date:   15APR01
 Description:    A modular screen saver and locker for the X Window System.
                 Highly customizable: allows the use of any program that
                 can draw on the root window as a display mode.
@@ -10,16 +10,16 @@ Keywords:       screen saver, screen lock, lock, xlock, X11
 Author:         jwz@jwz.org (Jamie Zawinski)
 Maintained-by:  jwz@jwz.org (Jamie Zawinski)
 Primary-site:   http://www.jwz.org/xscreensaver/
-                1581K xscreensaver-3.31.tar.gz
-                46K  xscreensaver.README
+                1602K xscreensaver-3.32.tar.gz
+                47K  xscreensaver.README
                 1K   xscreensaver.lsm
 Alternate-site: sunsite.unc.edu /pub/Linux/X11/screensavers/
-                1581K xscreensaver-3.31.tar.gz
-                46K  xscreensaver.README
+                1602K xscreensaver-3.32.tar.gz
+                47K  xscreensaver.README
                 1K   xscreensaver.lsm
 Alternate-site: ftp.x.org /contrib/applications/
-                1581K xscreensaver-3.31.tar.gz
-                46K  xscreensaver.README
+                1602K xscreensaver-3.32.tar.gz
+                47K  xscreensaver.README
                 1K   xscreensaver.lsm
 Platforms:      Linux, Irix, SunOS, Solaris, HPUX, AIX, FreeBSD, NetBSD,
                 BSDI, SCO, OSF1, Ultrix, VMS.
index bc8a81b1c739136dfcf2137e062bdf2b6b0020b8..fd75dbe02199977a82aec41f5584694685644704 100644 (file)
@@ -1,5 +1,5 @@
 %define        name            xscreensaver
-%define        version         3.31
+%define        version         3.32
 %define        release         1
 %define        serial          1
 %define        x11_prefix      /usr/X11R6