http://ftp.ussg.iu.edu/linux/slackware/slackware-9.0/source/xap/xscreensaver/xscreens...
authorZygo Blaxell <zblaxell@hungrycats.org>
Mon, 2 Mar 2009 05:43:02 +0000 (00:43 -0500)
committerZygo Blaxell <zblaxell@faye.furryterror.org>
Fri, 8 Feb 2013 17:53:58 +0000 (12:53 -0500)
-rw-r--r-- 1 zblaxell zblaxell 2423819 Feb 19  2003 xscreensaver-4.08.tar.bz2
0f6f407fa15d6a1b268fa1c92d31e8eeaa08cf35  xscreensaver-4.08.tar.bz2

68 files changed:
Makefile.in
README
configure
configure.in
driver/Makefile.in
driver/XScreenSaver.ad.in
driver/XScreenSaver_ad.h
driver/demo-Gtk.c
driver/passwd-kerberos.c
driver/passwd.c
driver/test-passwd.c
driver/xscreensaver-command.man
driver/xscreensaver-demo.man
driver/xscreensaver-getimage-file.man
driver/xscreensaver-getimage-video.man
driver/xscreensaver-getimage.man
driver/xscreensaver.c
driver/xscreensaver.man
hacks/Makefile.in
hacks/barcode.c
hacks/barcode.man
hacks/compile_axp.com
hacks/compile_decc.com
hacks/config/README
hacks/config/atunnel.xml [new file with mode: 0644]
hacks/config/barcode.xml
hacks/config/decayscreen.xml
hacks/config/fluidballs.xml
hacks/config/piecewise.xml [new file with mode: 0644]
hacks/config/qix.xml
hacks/config/ssystem.xml
hacks/decayscreen.man
hacks/fluidballs.c
hacks/fluidballs.man
hacks/glx/Makefile.in
hacks/glx/atunnel.c [new file with mode: 0644]
hacks/glx/atunnel.man [new file with mode: 0644]
hacks/glx/chessmodels.c
hacks/glx/endgame.c
hacks/glx/extrusion.c
hacks/glx/flurry-smoke.c
hacks/glx/flurry.c
hacks/glx/flurry.h
hacks/glx/glblur.c
hacks/glx/glforestfire.c
hacks/glx/glplanet.c
hacks/glx/gltext.c
hacks/glx/grab-ximage.c
hacks/glx/lament.c
hacks/glx/sballs.c
hacks/glx/starwars.c
hacks/glx/tunnel_draw.c [new file with mode: 0644]
hacks/glx/tunnel_draw.h [new file with mode: 0644]
hacks/images/tunnel0.xpm [new file with mode: 0644]
hacks/images/tunnel1.xpm [new file with mode: 0644]
hacks/images/tunnel2.xpm [new file with mode: 0644]
hacks/piecewise.c [new file with mode: 0644]
hacks/piecewise.man [new file with mode: 0644]
po/ChangeLog
po/POTFILES.in
po/fr.po
setup.com
utils/version.h
utils/visual-gl.c
utils/yarandom.c
utils/yarandom.h
xscreensaver.lsm
xscreensaver.spec

index 58ea0c344eacd5148ffb49024a8e26630bb64f23..5711b06321b6a5e1e60fdb2db8bdebcda4069c4b 100644 (file)
@@ -22,38 +22,38 @@ default::
        @$(MAKE_SUBDIR)
 all::
        @$(MAKE_SUBDIR)
        @$(MAKE_SUBDIR)
 all::
        @$(MAKE_SUBDIR)
-install:
+install::
        @$(MAKE_SUBDIR)
        @$(MAKE_SUBDIR)
-install-program:
+install-program::
        @$(MAKE_SUBDIR)
        @$(MAKE_SUBDIR)
-install-man:
+install-man::
        @$(MAKE_SUBDIR)
        @$(MAKE_SUBDIR)
-install-strip:
+install-strip::
        @$(MAKE_SUBDIR)
        @$(MAKE_SUBDIR)
-uninstall:
+uninstall::
        @$(MAKE_SUBDIR)
        @$(MAKE_SUBDIR)
-uninstall-program:
+uninstall-program::
        @$(MAKE_SUBDIR)
        @$(MAKE_SUBDIR)
-uninstall-man:
+uninstall-man::
        @$(MAKE_SUBDIR)
        @$(MAKE_SUBDIR)
-depend:
+depend::
        @$(MAKE_SUBDIR)
        @$(MAKE_SUBDIR)
-distdepend:
+distdepend::
        @$(MAKE) update_spec_version
        @$(MAKE_SUBDIR)
        @$(MAKE) update_spec_version
        @$(MAKE_SUBDIR)
-TAGS: tags
-tags:
+TAGS:: tags
+tags::
        @$(MAKE_SUBDIR)
        @$(MAKE_SUBDIR)
-clean:
+clean::
        @$(MAKE_SUBDIR)
        @$(MAKE_SUBDIR)
-distclean: clean
+distclean:: clean
        -rm -f config.h Makefile config.status config.cache config.log TAGS *~ "#"* intltool-extract intltool-merge intltool-update
        @$(MAKE_SUBDIR)
 
        -rm -f config.h Makefile config.status config.cache config.log TAGS *~ "#"* intltool-extract intltool-merge intltool-update
        @$(MAKE_SUBDIR)
 
-dist: tar
+dist:: tar
 
 # This really makes me sick...
 
 # This really makes me sick...
-tar:
+tar::
        @                                                                   \
   sh config.status ;                                                       \
   rm -f configure ;                                                        \
        @                                                                   \
   sh config.status ;                                                       \
   rm -f configure ;                                                        \
diff --git a/README b/README
index c68b7d0c4f02756f0dde74cc0700bfeb8ae3eedb..339c03f0e29c2c5043b8f6e76c0f565a29e3f73b 100644 (file)
--- a/README
+++ b/README
@@ -70,6 +70,12 @@ the XScreenSaver FAQ about that: http://www.jwz.org/xscreensaver/faq.html
 
                               ============
 
 
                               ============
 
+Changes since 4.07:   * New hacks, `atunnels' and `piecewise'.
+                      * Physics improvement in `fluidballs'.
+                      * Various fixes for XDarwin systems (X11 on MacOS X.)
+                      * Added -clock option to `barcode'.
+                      * Minor fixes to `endgame', `flurry', `flipscreen3d',
+                        and `gflux'.
 Changes since 4.06:   * New hacks, `flurry', `metaballs', `eruption',
                         `popsquares', and `barcode'.
                       * Minor updates to `maze' for high density mazes.
 Changes since 4.06:   * New hacks, `flurry', `metaballs', `eruption',
                         `popsquares', and `barcode'.
                       * Minor updates to `maze' for high density mazes.
index f38b7fc7e284b89dd7ca4c3615dbcdb1b43ae80a..be20bf3026375cc0a641ecbe73cebeeef1a482eb 100755 (executable)
--- a/configure
+++ b/configure
@@ -1315,6 +1315,18 @@ done
 
 
 
 
 
 
+###############################################################################
+#
+#       Function to figure out how to turn off Objective C on MacOS X.
+#       (We have to do this to work around an Apple-specific gcc bug.)
+#
+###############################################################################
+
+
+
+
+
+
 ###############################################################################
 #
 #       Function to figure out how to create directory trees.
 ###############################################################################
 #
 #       Function to figure out how to create directory trees.
@@ -2425,6 +2437,32 @@ echo "${ECHO_T}Disabling C++ comments in ANSI C code." >&6
    fi
   fi
 
    fi
   fi
 
+if test -n "$GCC"; then
+   if test -n "$GCC"; then
+   echo "$as_me:$LINENO: checking whether gcc accepts -no-cpp-precomp" >&5
+echo $ECHO_N "checking whether gcc accepts -no-cpp-precomp... $ECHO_C" >&6
+if test "${ac_cv_gcc_accepts_no_cpp_precomp+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if ( ( gcc -E -no-cpp-precomp - </dev/null >/dev/null ) 2>&1 | \
+          grep unrecognized >/dev/null ); then
+       ac_cv_gcc_accepts_no_cpp_precomp=no
+     else
+       ac_cv_gcc_accepts_no_cpp_precomp=yes
+     fi
+fi
+echo "$as_me:$LINENO: result: $ac_cv_gcc_accepts_no_cpp_precomp" >&5
+echo "${ECHO_T}$ac_cv_gcc_accepts_no_cpp_precomp" >&6
+   ac_gcc_accepts_no_cpp_precomp="$ac_cv_gcc_accepts_no_cpp_precomp"
+  fi
+
+   if test "$ac_gcc_accepts_no_cpp_precomp" = yes ; then
+     echo "$as_me:$LINENO: result: Disabling Objective C extensions in ANSI C code." >&5
+echo "${ECHO_T}Disabling Objective C extensions in ANSI C code." >&6
+     CC="$CC -no-cpp-precomp"
+   fi
+  fi
+
 ac_ext=c
 ac_cpp='$CPP $CPPFLAGS'
 ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
 ac_ext=c
 ac_cpp='$CPP $CPPFLAGS'
 ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
@@ -6077,6 +6115,16 @@ if test $ac_cv_lib_gen_regcmp = yes; then
 fi
 
       fi
 fi
 
       fi
+
+    ;;
+    *-darwin*)
+
+      # On MacOS X (10.x with "fink"), many things are under /sw/.
+      #
+      if test -d /sw/include ; then
+        X_CFLAGS="-I/sw/include $X_CFLAGS"
+        X_LIBS="-L/sw/lib $X_LIBS"
+      fi
     ;;
   esac
 echo "$as_me:$LINENO: checking for XPointer" >&5
     ;;
   esac
 echo "$as_me:$LINENO: checking for XPointer" >&5
@@ -11012,7 +11060,91 @@ _ACEOF
   if test "$have_kerberos5" = yes ; then
     # from Matt Knopp <mhat@infocalypse.netlag.com>
     # (who got it from amu@mit.edu)
   if test "$have_kerberos5" = yes ; then
     # from Matt Knopp <mhat@infocalypse.netlag.com>
     # (who got it from amu@mit.edu)
-    PASSWD_LIBS="$PASSWD_LIBS -lkrb4 -ldes425 -lkrb5 -lk5crypto -lcrypt -lcom_err"
+
+    PASSWD_LIBS="$PASSWD_LIBS -lkrb4 -ldes425 -lkrb5 -lk5crypto -lcom_err"
+
+    # jwz: MacOS X uses -lkrb5, but not -lcrypt
+
+  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 "$as_me:$LINENO: checking for crypt in -lcrypt" >&5
+echo $ECHO_N "checking for crypt in -lcrypt... $ECHO_C" >&6
+if test "${ac_cv_lib_crypt_crypt+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lcrypt  $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+
+/* Override any gcc2 internal prototype to avoid an error.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char crypt ();
+#ifdef F77_DUMMY_MAIN
+#  ifdef __cplusplus
+     extern "C"
+#  endif
+   int F77_DUMMY_MAIN() { return 1; }
+#endif
+int
+main ()
+{
+crypt ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+         { ac_try='test -s conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_lib_crypt_crypt=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+ac_cv_lib_crypt_crypt=no
+fi
+rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:$LINENO: result: $ac_cv_lib_crypt_crypt" >&5
+echo "${ECHO_T}$ac_cv_lib_crypt_crypt" >&6
+if test $ac_cv_lib_crypt_crypt = yes; then
+  PASSWD_LIBS="$PASSWD_LIBS -lcrypt"
+fi
+
+  CPPFLAGS="$ac_save_CPPFLAGS"
+  LDFLAGS="$ac_save_LDFLAGS"
+#  LIBS="$ac_save_LIBS"
+
+
   elif test "$have_kerberos" = yes ; then
     # from Tim Showalter <tjs@psaux.com> for FreeBSD 4.2
     PASSWD_LIBS="$PASSWD_LIBS -lkrb -ldes -lcom_err"
   elif test "$have_kerberos" = yes ; then
     # from Tim Showalter <tjs@psaux.com> for FreeBSD 4.2
     PASSWD_LIBS="$PASSWD_LIBS -lkrb -ldes -lcom_err"
 echo "$as_me:$LINENO: result: $ac_cv_gtk_version_string" >&5
 echo "${ECHO_T}$ac_cv_gtk_version_string" >&6
       ac_gtk_version_string=$ac_cv_gtk_version_string
 echo "$as_me:$LINENO: result: $ac_cv_gtk_version_string" >&5
 echo "${ECHO_T}$ac_cv_gtk_version_string" >&6
       ac_gtk_version_string=$ac_cv_gtk_version_string
+      parse_gtk_version_string
     fi
 
     fi
 
-    parse_gtk_version_string
-
-    if test "$ac_gtk_version" = "unknown" || test "$ac_gtk_version" -lt 1002
-    then
-      have_gtk=no
-      have_gnome=no
-      jurassic_gtk=yes
+    if test "$have_gtk" = yes; then
+      if test "$ac_gtk_version" = "unknown" || test "$ac_gtk_version" -lt 1002
+      then
+        have_gtk=no
+        have_gnome=no
+        jurassic_gtk=yes
+      fi
     fi
 
     if test "$have_gtk" = yes; then
     fi
 
     if test "$have_gtk" = yes; then
@@ -12768,7 +12901,7 @@ echo $ECHO_N "checking for Gnome capplet includes... $ECHO_C" >&6
       if test "${ac_cv_gnome_config_cflags+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
       if test "${ac_cv_gnome_config_cflags+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  if ( $gnome_config --cflags $gnome_config_libs >/dev/null 2>&1 | \
+  if ( $gnome_config --cflags $gnome_config_libs 2>&1 | \
               grep Unknown >/dev/null ) ; then
            ac_cv_gnome_config_cflags=''
          else
               grep Unknown >/dev/null ) ; then
            ac_cv_gnome_config_cflags=''
          else
@@ -12793,7 +12926,7 @@ echo $ECHO_N "checking for Gnome capplet libs... $ECHO_C" >&6
       if test "${ac_cv_gnome_config_libs+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
       if test "${ac_cv_gnome_config_libs+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  if ( $gnome_config --libs $gnome_config_libs >/dev/null 2>&1 |
+  if ( $gnome_config --libs $gnome_config_libs 2>&1 |
               grep Unknown >/dev/null ) ; then
            ac_cv_gnome_config_libs=''
          else
               grep Unknown >/dev/null ) ; then
            ac_cv_gnome_config_libs=''
          else
@@ -14521,7 +14654,7 @@ if test "${ac_cv_mesagl_version_string+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat > conftest.$ac_ext <<EOF
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 14530 "configure"
+#line 14663 "configure"
 #include "confdefs.h"
 #include <GL/gl.h>
 #ifndef MESA_MAJOR_VERSION
 #include "confdefs.h"
 #include <GL/gl.h>
 #ifndef MESA_MAJOR_VERSION
@@ -14564,7 +14697,7 @@ EOF
          # M4 sucks!!
 
           mglv=`echo "$mglv" | sed -n \
          # M4 sucks!!
 
           mglv=`echo "$mglv" | sed -n \
-             's/^configure: *\([0-9][0-9]*\) \([0-9].*\)$/\1.\2/p'`
+             's/^configure: *\([0-9][0-9]*\)  *\([0-9].*\)$/\1.\2/p'`
 
 
          rm -f conftest.$ac_ext
 
 
          rm -f conftest.$ac_ext
 
 
 if test "$have_gl" = yes -a "$have_gle" = no ; then
 
 
 if test "$have_gl" = yes -a "$have_gle" = no ; then
+
+ # nobody cares about this; don't print the warning unless it was
+ # requested and not found, or halfway-found.
+ if test "$with_gle_req" = yes -o "$gle_halfassed" = yes ; then
+
   if test "$with_gle_req" = yes ; then
     noteL 'Use of the GLE (GL Extrusion) library was requested, but'
     warn2 'it was not found (though the OpenGL library was found, and'
   if test "$with_gle_req" = yes ; then
     noteL 'Use of the GLE (GL Extrusion) library was requested, but'
     warn2 'it was not found (though the OpenGL library was found, and'
@@ -19263,6 +19401,7 @@ if test "$have_gl" = yes -a "$have_gle" = no ; then
   warn2 'GLE library at <http://www.linas.org/gle/>.  For general'
   warn2 'OpenGL info, see <http://www.opengl.org/>.'
 
   warn2 'GLE library at <http://www.linas.org/gle/>.  For general'
   warn2 'OpenGL info, see <http://www.opengl.org/>.'
 
+ fi
 fi
 
 
 fi
 
 
index 76ccf0f9f11af1584b2842d877133dac910e4e95..dc100ebccc3c4e4a0df0ba2f12ca1cd7b5ae6903 100644 (file)
@@ -1,4 +1,4 @@
-# configure.in --- xscreensaver, Copyright (c) 1997-2002 Jamie Zawinski.
+# configure.in --- xscreensaver, Copyright (c) 1997-2003 Jamie Zawinski.
 #
 
 AC_PREREQ(2.52)
 #
 
 AC_PREREQ(2.52)
@@ -140,6 +140,38 @@ AC_DEFUN(AC_NO_CPLUSPLUS_COMMENTS_IN_C_CODE,
 ])
 
 
 ])
 
 
+###############################################################################
+#
+#       Function to figure out how to turn off Objective C on MacOS X.
+#       (We have to do this to work around an Apple-specific gcc bug.)
+#
+###############################################################################
+
+AC_DEFUN(AC_GCC_ACCEPTS_NO_CPP_PRECOMP,
+ [if test -n "$GCC"; then
+   AC_CACHE_CHECK([whether gcc accepts -no-cpp-precomp],
+     ac_cv_gcc_accepts_no_cpp_precomp,
+    [if ( ( gcc -E -no-cpp-precomp - </dev/null >/dev/null ) 2>&1 | \
+          grep unrecognized >/dev/null ); then
+       ac_cv_gcc_accepts_no_cpp_precomp=no
+     else
+       ac_cv_gcc_accepts_no_cpp_precomp=yes
+     fi])
+   ac_gcc_accepts_no_cpp_precomp="$ac_cv_gcc_accepts_no_cpp_precomp"
+  fi
+])
+
+AC_DEFUN(AC_NO_OBJECTIVE_C,
+ [if test -n "$GCC"; then
+   AC_GCC_ACCEPTS_NO_CPP_PRECOMP
+   if test "$ac_gcc_accepts_no_cpp_precomp" = yes ; then
+     AC_MSG_RESULT(Disabling Objective C extensions in ANSI C code.)
+     CC="$CC -no-cpp-precomp"
+   fi
+  fi
+])
+
+
 ###############################################################################
 #
 #       Function to figure out how to create directory trees.
 ###############################################################################
 #
 #       Function to figure out how to create directory trees.
@@ -590,6 +622,16 @@ AC_DEFUN(AC_X_RANDOM_PATHS,
         # Some versions of Slowlaris Motif require -lgen.  But not all.  Why?
         AC_CHECK_LIB(gen, regcmp, [X_LIBS="$X_LIBS -lgen"])
       fi
         # Some versions of Slowlaris Motif require -lgen.  But not all.  Why?
         AC_CHECK_LIB(gen, regcmp, [X_LIBS="$X_LIBS -lgen"])
       fi
+
+    ;;
+    *-darwin*)
+
+      # On MacOS X (10.x with "fink"), many things are under /sw/.
+      #
+      if test -d /sw/include ; then
+        X_CFLAGS="-I/sw/include $X_CFLAGS"
+        X_LIBS="-L/sw/lib $X_LIBS"
+      fi
     ;;
   esac])
 
     ;;
   esac])
 
@@ -743,6 +785,7 @@ AC_DEFUN(HANDLE_X_PATH_ARG, [
 AC_CANONICAL_HOST
 AC_PROG_CC_ANSI
 AC_NO_CPLUSPLUS_COMMENTS_IN_C_CODE
 AC_CANONICAL_HOST
 AC_PROG_CC_ANSI
 AC_NO_CPLUSPLUS_COMMENTS_IN_C_CODE
+AC_NO_OBJECTIVE_C
 AC_PROG_CPP
 AC_C_CONST
 AC_C_INLINE
 AC_PROG_CPP
 AC_C_CONST
 AC_C_INLINE
@@ -1535,7 +1578,12 @@ if test "$enable_locking" = yes -a "$with_kerberos" = yes; then
   if test "$have_kerberos5" = yes ; then
     # from Matt Knopp <mhat@infocalypse.netlag.com>
     # (who got it from amu@mit.edu)
   if test "$have_kerberos5" = yes ; then
     # from Matt Knopp <mhat@infocalypse.netlag.com>
     # (who got it from amu@mit.edu)
-    PASSWD_LIBS="$PASSWD_LIBS -lkrb4 -ldes425 -lkrb5 -lk5crypto -lcrypt -lcom_err"
+
+    PASSWD_LIBS="$PASSWD_LIBS -lkrb4 -ldes425 -lkrb5 -lk5crypto -lcom_err"
+
+    # jwz: MacOS X uses -lkrb5, but not -lcrypt
+    AC_CHECK_X_LIB(crypt, crypt, [PASSWD_LIBS="$PASSWD_LIBS -lcrypt"])
+
   elif test "$have_kerberos" = yes ; then
     # from Tim Showalter <tjs@psaux.com> for FreeBSD 4.2
     PASSWD_LIBS="$PASSWD_LIBS -lkrb -ldes -lcom_err"
   elif test "$have_kerberos" = yes ; then
     # from Tim Showalter <tjs@psaux.com> for FreeBSD 4.2
     PASSWD_LIBS="$PASSWD_LIBS -lkrb -ldes -lcom_err"
@@ -2023,15 +2071,16 @@ if test "$with_gtk" = yes; then
       AC_CACHE_CHECK([Gtk version number], ac_cv_gtk_version_string,
                      [ac_cv_gtk_version_string=`$gtk_config --version`])
       ac_gtk_version_string=$ac_cv_gtk_version_string
       AC_CACHE_CHECK([Gtk version number], ac_cv_gtk_version_string,
                      [ac_cv_gtk_version_string=`$gtk_config --version`])
       ac_gtk_version_string=$ac_cv_gtk_version_string
+      parse_gtk_version_string
     fi
 
     fi
 
-    parse_gtk_version_string
-
-    if test "$ac_gtk_version" = "unknown" || test "$ac_gtk_version" -lt 1002
-    then
-      have_gtk=no
-      have_gnome=no
-      jurassic_gtk=yes
+    if test "$have_gtk" = yes; then
+      if test "$ac_gtk_version" = "unknown" || test "$ac_gtk_version" -lt 1002
+      then
+        have_gtk=no
+        have_gnome=no
+        jurassic_gtk=yes
+      fi
     fi
 
     if test "$have_gtk" = yes; then
     fi
 
     if test "$have_gtk" = yes; then
@@ -2054,7 +2103,7 @@ if test "$with_gtk" = yes; then
       gnome_config_libs="gtk capplet gnomeui gdk_pixbuf"
       AC_MSG_CHECKING(for Gnome capplet includes)
       AC_CACHE_VAL(ac_cv_gnome_config_cflags,
       gnome_config_libs="gtk capplet gnomeui gdk_pixbuf"
       AC_MSG_CHECKING(for Gnome capplet includes)
       AC_CACHE_VAL(ac_cv_gnome_config_cflags,
-        [if ( $gnome_config --cflags $gnome_config_libs >/dev/null 2>&1 | \
+        [if ( $gnome_config --cflags $gnome_config_libs 2>&1 | \
               grep Unknown >/dev/null ) ; then
            ac_cv_gnome_config_cflags=''
          else
               grep Unknown >/dev/null ) ; then
            ac_cv_gnome_config_cflags=''
          else
@@ -2072,7 +2121,7 @@ if test "$with_gtk" = yes; then
     if test "$have_gnome" = yes -a "$have_gtk" = yes; then
       AC_MSG_CHECKING(for Gnome capplet libs)
       AC_CACHE_VAL(ac_cv_gnome_config_libs,
     if test "$have_gnome" = yes -a "$have_gtk" = yes; then
       AC_MSG_CHECKING(for Gnome capplet libs)
       AC_CACHE_VAL(ac_cv_gnome_config_libs,
-        [if ( $gnome_config --libs $gnome_config_libs >/dev/null 2>&1 |
+        [if ( $gnome_config --libs $gnome_config_libs 2>&1 |
               grep Unknown >/dev/null ) ; then
            ac_cv_gnome_config_libs=''
          else
               grep Unknown >/dev/null ) ; then
            ac_cv_gnome_config_libs=''
          else
@@ -2603,7 +2652,7 @@ EOF
          # M4 sucks!!
          changequote(X,Y)
           mglv=`echo "$mglv" | sed -n \
          # M4 sucks!!
          changequote(X,Y)
           mglv=`echo "$mglv" | sed -n \
-             's/^configure: *\([0-9][0-9]*\) \([0-9].*\)$/\1.\2/p'`
+             's/^configure: *\([0-9][0-9]*\)  *\([0-9].*\)$/\1.\2/p'`
          changequote([,])
 
          rm -f conftest.$ac_ext
          changequote([,])
 
          rm -f conftest.$ac_ext
@@ -3834,6 +3883,11 @@ fi
 
 
 if test "$have_gl" = yes -a "$have_gle" = no ; then
 
 
 if test "$have_gl" = yes -a "$have_gle" = no ; then
+
+ # nobody cares about this; don't print the warning unless it was
+ # requested and not found, or halfway-found.
+ if test "$with_gle_req" = yes -o "$gle_halfassed" = yes ; then
+
   if test "$with_gle_req" = yes ; then
     noteL 'Use of the GLE (GL Extrusion) library was requested, but'
     warn2 'it was not found (though the OpenGL library was found, and'
   if test "$with_gle_req" = yes ; then
     noteL 'Use of the GLE (GL Extrusion) library was requested, but'
     warn2 'it was not found (though the OpenGL library was found, and'
@@ -3861,6 +3915,7 @@ if test "$have_gl" = yes -a "$have_gle" = no ; then
   warn2 'GLE library at <http://www.linas.org/gle/>.  For general'
   warn2 'OpenGL info, see <http://www.opengl.org/>.'
 
   warn2 'GLE library at <http://www.linas.org/gle/>.  For general'
   warn2 'OpenGL info, see <http://www.opengl.org/>.'
 
+ fi
 fi
 
 
 fi
 
 
index 8dfbe6a3fd8456e2ded7309e97a39a993cf07feb..c4d9c5d59e2df10d8097388d79a530f15529e355 100644 (file)
@@ -14,7 +14,8 @@ install_prefix        =
 prefix         = @prefix@
 exec_prefix    = @exec_prefix@
 bindir         = @bindir@
 prefix         = @prefix@
 exec_prefix    = @exec_prefix@
 bindir         = @bindir@
-datadir                = @datadir@
+#datadir       = @datadir@
+datadir                = $(GNOME_DATADIR)
 localedir      = $(datadir)/locale
 mandir         = @mandir@
 mansuffix      = 1
 localedir      = $(datadir)/locale
 mandir         = @mandir@
 mansuffix      = 1
index 8431d1446d0fa3c63c089c8debb95322bd3b2b04..00afdb0641a6b7ac26ab5c82b3d604f8ed176f61 100644 (file)
@@ -4,8 +4,8 @@
 !            a screen saver and locker for the X window system
 !                            by Jamie Zawinski
 !
 !            a screen saver and locker for the X window system
 !                            by Jamie Zawinski
 !
-!                              version 4.07
-!                              03-Feb-2003
+!                              version 4.08
+!                              18-Feb-2003
 !
 ! See "man xscreensaver" for more info.  The latest version is always
 ! available at http://www.jwz.org/xscreensaver/
 !
 ! See "man xscreensaver" for more info.  The latest version is always
 ! available at http://www.jwz.org/xscreensaver/
                                eruption -root                              \n\
                                popsquares -root                            \n\
                                barcode -root                               \n\
                                eruption -root                              \n\
                                popsquares -root                            \n\
                                barcode -root                               \n\
+                               piecewise -root                             \n\
   color:                       bubbles -root                               \n\
 - default-n:                   webcollage -root                            \n\
 - default-n:  "WebCollage (whacked)"                                         \
   color:                       bubbles -root                               \n\
 - default-n:                   webcollage -root                            \n\
 - default-n:  "WebCollage (whacked)"                                         \
 @GL_KLUDGE@ GL:                        glsnake -root                               \n\
 @GL_KLUDGE@ GL:                        boxed -root                                 \n\
 @GL_KLUDGE@ GL:                        glforestfire -root                          \n\
 @GL_KLUDGE@ GL:                        glsnake -root                               \n\
 @GL_KLUDGE@ GL:                        boxed -root                                 \n\
 @GL_KLUDGE@ GL:                        glforestfire -root                          \n\
+-         GL:                  glforestfire -root -rain                    \n\
 @GL_KLUDGE@ GL:                        sballs -root                                \n\
 @GL_KLUDGE@ GL:                        cubenetic -root                             \n\
 @GL_KLUDGE@ GL:                        spheremonics -root                          \n\
 @GL_KLUDGE@ GL:                        lavalite -root                              \n\
 @GL_KLUDGE@ GL:                        queens -root                                \n\
 @GL_KLUDGE@ GL:                        endgame -root                               \n\
 @GL_KLUDGE@ GL:                        sballs -root                                \n\
 @GL_KLUDGE@ GL:                        cubenetic -root                             \n\
 @GL_KLUDGE@ GL:                        spheremonics -root                          \n\
 @GL_KLUDGE@ GL:                        lavalite -root                              \n\
 @GL_KLUDGE@ GL:                        queens -root                                \n\
 @GL_KLUDGE@ GL:                        endgame -root                               \n\
+@GL_KLUDGE@ GL:                        atunnel -root                               \n\
 -         GL:                  glblur -root                                \n\
                                                                              \
 -                              xdaliclock -root -builtin3 -cycle           \n\
 -         GL:                  glblur -root                                \n\
                                                                              \
 -                              xdaliclock -root -builtin3 -cycle           \n\
index 564aa5da20ab0dfb3a57863c80b3e989f8b5ec78..eb21a2f577899ffabbac476ef2132f88acea468f 100644 (file)
                                eruption -root                              \\n\
                                popsquares -root                            \\n\
                                barcode -root                               \\n\
                                eruption -root                              \\n\
                                popsquares -root                            \\n\
                                barcode -root                               \\n\
+                               piecewise -root                             \\n\
   color:                       bubbles -root                               \\n\
 - default-n:                   webcollage -root                            \\n\
 - default-n:  \"WebCollage (whacked)\"                                       \
   color:                       bubbles -root                               \\n\
 - default-n:                   webcollage -root                            \\n\
 - default-n:  \"WebCollage (whacked)\"                                       \
           GL:                  glsnake -root                               \\n\
           GL:                  boxed -root                                 \\n\
           GL:                  glforestfire -root                          \\n\
           GL:                  glsnake -root                               \\n\
           GL:                  boxed -root                                 \\n\
           GL:                  glforestfire -root                          \\n\
+-         GL:                  glforestfire -root -rain                    \\n\
           GL:                  sballs -root                                \\n\
           GL:                  cubenetic -root                             \\n\
           GL:                  spheremonics -root                          \\n\
           GL:                  lavalite -root                              \\n\
           GL:                  queens -root                                \\n\
           GL:                  endgame -root                               \\n\
           GL:                  sballs -root                                \\n\
           GL:                  cubenetic -root                             \\n\
           GL:                  spheremonics -root                          \\n\
           GL:                  lavalite -root                              \\n\
           GL:                  queens -root                                \\n\
           GL:                  endgame -root                               \\n\
+          GL:                  atunnel -root                               \\n\
 -         GL:                  glblur -root                                \\n\
                                                                              \
 -                              xdaliclock -root -builtin3 -cycle           \\n\
 -         GL:                  glblur -root                                \\n\
                                                                              \
 -                              xdaliclock -root -builtin3 -cycle           \\n\
index a1d05ca89273a439ce78e065c73a21698cd5631f..159595b35090721699472e5ff7dcaf3bf57fc34d 100644 (file)
@@ -1,5 +1,5 @@
 /* demo-Gtk.c --- implements the interactive demo-mode and options dialogs.
 /* demo-Gtk.c --- implements the interactive demo-mode and options dialogs.
- * xscreensaver, Copyright (c) 1993-2002 Jamie Zawinski <jwz@jwz.org>
+ * xscreensaver, Copyright (c) 1993-2003 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
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
  * documentation for any purpose is hereby granted without fee, provided that
@@ -2345,6 +2345,15 @@ populate_prefs_page (state *s)
 {
   saver_preferences *p = &s->prefs;
 
 {
   saver_preferences *p = &s->prefs;
 
+  Bool can_lock_p = True;
+
+  /* Disable all the "lock" controls if locking support was not provided
+     at compile-time, or if running on MacOS. */
+# if defined(NO_LOCKING) || defined(__APPLE__)
+  can_lock_p = False;
+# endif
+
+
   /* The file supports timeouts of less than a minute, but the GUI does
      not, so throttle the values to be at least one minute (since "0" is
      a bad rounding choice...)
   /* The file supports timeouts of less than a minute, but the GUI does
      not, so throttle the values to be at least one minute (since "0" is
      a bad rounding choice...)
@@ -2444,8 +2453,9 @@ populate_prefs_page (state *s)
 
     /* Blanking and Locking
      */
 
     /* Blanking and Locking
      */
-    SENSITIZE ("lock_spinbutton", p->lock_p);
-    SENSITIZE ("lock_mlabel",     p->lock_p);
+    SENSITIZE ("lock_button",     can_lock_p);
+    SENSITIZE ("lock_spinbutton", can_lock_p && p->lock_p);
+    SENSITIZE ("lock_mlabel",     can_lock_p && p->lock_p);
 
     /* DPMS
      */
 
     /* DPMS
      */
@@ -3252,7 +3262,14 @@ get_best_gl_visual (state *s)
             sprintf (buf, "%s: running %s", blurb(), av[0]);
             perror (buf);
           }
             sprintf (buf, "%s: running %s", blurb(), av[0]);
             perror (buf);
           }
-        exit (1);                               /* exits fork */
+
+        /* Note that one must use _exit() instead of exit() in procs forked
+           off of Gtk programs -- Gtk installs an atexit handler that has a
+           copy of the X connection (which we've already closed, for safety.)
+           If one uses exit() instead of _exit(), then one sometimes gets a
+           spurious "Gdk-ERROR: Fatal IO error on X server" error message.
+        */
+        _exit (1);                              /* exits fork */
         break;
       }
     default:
         break;
       }
     default:
@@ -3418,8 +3435,15 @@ launch_preview_subproc (state *s)
 
         exec_command (p->shell, new_cmd, p->nice_inferior);
         /* Don't bother printing an error message when we are unable to
 
         exec_command (p->shell, new_cmd, p->nice_inferior);
         /* Don't bother printing an error message when we are unable to
-           exec subprocesses; we handle that by polling the pid later. */
-        exit (1);  /* exits child fork */
+           exec subprocesses; we handle that by polling the pid later.
+
+           Note that one must use _exit() instead of exit() in procs forked
+           off of Gtk programs -- Gtk installs an atexit handler that has a
+           copy of the X connection (which we've already closed, for safety.)
+           If one uses exit() instead of _exit(), then one sometimes gets a
+           spurious "Gdk-ERROR: Fatal IO error on X server" error message.
+        */
+        _exit (1);  /* exits child fork */
         break;
 
       default:
         break;
 
       default:
index ca3f13ea889d35b913a6def81b17bfb92ed4eeab..1fbe2af9576930004241b858b0a850f60a05e4a9 100644 (file)
@@ -1,6 +1,6 @@
 /* kpasswd.c --- verify kerberos passwords.
  * written by Nat Lanza (magus@cs.cmu.edu) for
 /* kpasswd.c --- verify kerberos passwords.
  * written by Nat Lanza (magus@cs.cmu.edu) for
- * xscreensaver, Copyright (c) 1993-1997, 1998, 2000
+ * xscreensaver, Copyright (c) 1993-1997, 1998, 2000, 2003
  *  Jamie Zawinski <jwz@jwz.org>
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
  *  Jamie Zawinski <jwz@jwz.org>
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
 #include <string.h>
 #include <sys/types.h>
 
 #include <string.h>
 #include <sys/types.h>
 
-#ifdef HAVE_KERBEROS5
+/* I'm not sure if this is exactly the right test...
+   Might __APPLE__ be defined if this is apple hardware, but not
+   an Apple OS?
+
+   Thanks to Jan Kujawa <kujawa@ultranet.com> for the MacOS X code.
+ */
+#ifdef __APPLE__
+# define HAVE_DARWIN
+#endif
+
+
+#if defined(HAVE_DARWIN)
+# include <Kerberos/Kerberos.h>
+#elif defined(HAVE_KERBEROS5)
 # include <kerberosIV/krb.h>
 # include <kerberosIV/des.h>
 #else /* !HAVE_KERBEROS5 (meaning Kerberos 4) */
 # include <kerberosIV/krb.h>
 # include <kerberosIV/des.h>
 #else /* !HAVE_KERBEROS5 (meaning Kerberos 4) */
 #define False 0
 
 /* The user information we need to store */
 #define False 0
 
 /* The user information we need to store */
-static char realm[REALM_SZ];
-static char  name[ANAME_SZ];
-static char  inst[INST_SZ];
-static char *tk_file;
+#ifdef HAVE_DARWIN
+ static KLPrincipal princ;
+#else /* !HAVE_DARWIN */
+ static char realm[REALM_SZ];
+ static char  name[ANAME_SZ];
+ static char  inst[INST_SZ];
+ static char *tk_file;
+#endif /* !HAVE_DARWIN */
 
 
 /* Called at startup to grab user, instance, and realm information
 
 
 /* Called at startup to grab user, instance, and realm information
@@ -83,6 +100,20 @@ static char *tk_file;
 Bool
 kerberos_lock_init (int argc, char **argv, Bool verbose_p)
 {
 Bool
 kerberos_lock_init (int argc, char **argv, Bool verbose_p)
 {
+# ifdef HAVE_DARWIN
+
+    KLBoolean found;
+    return ((klNoErr == (KLCacheHasValidTickets (NULL, kerberosVersion_Any,
+                                                 &found, &princ, NULL)))
+            && found);
+
+# else /* !HAVE_DARWIN */
+
+    /* Perhaps we should be doing it the Mac way (above) all the time?
+       The following code assumes Unix-style file-based Kerberos credentials
+       cache, which Mac OS X doesn't use.  But is there any real reason to
+       do it this way at all, even on other Unixen?
+     */
     int k_errno;
     
     memset(name, 0, sizeof(name));
     int k_errno;
     
     memset(name, 0, sizeof(name));
@@ -120,6 +151,8 @@ kerberos_lock_init (int argc, char **argv, Bool verbose_p)
 
     /* success */
     return True;
 
     /* success */
     return True;
+
+# endif /* !HAVE_DARWIN */
 }
 
 
 }
 
 
@@ -145,6 +178,15 @@ key_to_key(char *user, char *instance, char *realm, char *passwd, C_Block key)
 Bool
 kerberos_passwd_valid_p (const char *typed_passwd, Bool verbose_p)
 {
 Bool
 kerberos_passwd_valid_p (const char *typed_passwd, Bool verbose_p)
 {
+# ifdef HAVE_DARWIN
+    return (klNoErr ==
+            KLAcquireNewInitialTicketsWithPassword (princ, NULL,
+                                                    typed_passwd, NULL));
+# else /* !HAVE_DARWIN */
+
+    /* See comments in kerberos_lock_init -- should we do it the Mac Way
+       on all systems?
+     */
     C_Block mitkey;
     Bool success;
     char *newtkfile;
     C_Block mitkey;
     Bool success;
     char *newtkfile;
@@ -182,6 +224,8 @@ kerberos_passwd_valid_p (const char *typed_passwd, Bool verbose_p)
 
     /* Did we verify successfully? */
     return success;
 
     /* Did we verify successfully? */
     return success;
+
+# endif /* !HAVE_DARWIN */
 }
 
 #endif /* NO_LOCKING -- whole file */
 }
 
 #endif /* NO_LOCKING -- whole file */
index 9a9a4b8863b4efe628970853eaa0f4088f3e3d69..fa7d4178a5798896032f29b776bf0271a34f5bc2 100644 (file)
@@ -1,5 +1,5 @@
 /* passwd.c --- verifying typed passwords with the OS.
 /* passwd.c --- verifying typed passwords with the OS.
- * xscreensaver, Copyright (c) 1993-2002 Jamie Zawinski <jwz@jwz.org>
+ * xscreensaver, Copyright (c) 1993-2003 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
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
  * documentation for any purpose is hereby granted without fee, provided that
@@ -153,7 +153,7 @@ passwd_valid_p (const char *typed_passwd, Bool verbose_p)
                            "%s: authentication via %s passwords failed.\n",
                            blurb(), methods[j].name);
               fprintf (stderr,
                            "%s: authentication via %s passwords failed.\n",
                            blurb(), methods[j].name);
               fprintf (stderr,
-                       "%s: but authentication via %s passwords succeeded.\n",
+                       "%s: authentication via %s passwords succeeded.\n",
                        blurb(), methods[i].name);
             }
 
                        blurb(), methods[i].name);
             }
 
index 9ef2cfe190daeb7fd488bffc989975b5819b85f2..22ae01eb7664ed3b4d3e8e1ca53671a3f73e7dd8 100644 (file)
@@ -1,4 +1,4 @@
-/* xscreensaver, Copyright (c) 1998, 2001 Jamie Zawinski <jwz@jwz.org>
+/* xscreensaver, Copyright (c) 1998, 2001, 2003 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
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
  * documentation for any purpose is hereby granted without fee, provided that
@@ -140,7 +140,7 @@ main (int argc, char **argv)
 
   hack_uid (si);
 
 
   hack_uid (si);
 
-  if (! lock_init (argc, argv, si->prefs.verbose_p))
+  if (! lock_init (argc, argv, True))
     {
       si->locking_disabled_p = True;
       si->nolock_reason = "error getting password";
     {
       si->locking_disabled_p = True;
       si->nolock_reason = "error getting password";
@@ -171,7 +171,6 @@ main (int argc, char **argv)
       XtGetApplicationNameAndClass (si->dpy, &progname, &progclass);
 
       load_init_file (&si->prefs);
       XtGetApplicationNameAndClass (si->dpy, &progname, &progclass);
 
       load_init_file (&si->prefs);
-
     }
 
   p->verbose_p = True;
     }
 
   p->verbose_p = True;
index 51bee28ab9209c55f8eb3287acb8d4223c08df04..0ecf8336e070858580f68c303f08ccac831fb112 100644 (file)
@@ -11,7 +11,7 @@
 .if n .sp 1
 .if t .sp .5
 ..
 .if n .sp 1
 .if t .sp .5
 ..
-.TH XScreenSaver 1 "03-Feb-2003 (4.07)" "X Version 11"
+.TH XScreenSaver 1 "18-Feb-2003 (4.08)" "X Version 11"
 .SH NAME
 xscreensaver-command - control a running xscreensaver process
 .SH SYNOPSIS
 .SH NAME
 xscreensaver-command - control a running xscreensaver process
 .SH SYNOPSIS
index 381786b91ffe2cee3df2b687f7b73a68807f4f79..b4a73a0d941dbeeb2be68a97608ec65b9cbac891 100644 (file)
@@ -11,7 +11,7 @@
 .if n .sp 1
 .if t .sp .5
 ..
 .if n .sp 1
 .if t .sp .5
 ..
-.TH XScreenSaver 1 "03-Feb-2003 (4.07)" "X Version 11"
+.TH XScreenSaver 1 "18-Feb-2003 (4.08)" "X Version 11"
 .SH NAME
 xscreensaver-demo - interactively control the background xscreensaver daemon
 .SH SYNOPSIS
 .SH NAME
 xscreensaver-demo - interactively control the background xscreensaver daemon
 .SH SYNOPSIS
index f93fc3ab01ba0b543394d1b03d2104affa465a53..5a67d6d9acfd5c6af346033817f0357ecbe5e897 100644 (file)
@@ -1,4 +1,4 @@
-.TH XScreenSaver 1 "03-Feb-2003 (4.07)" "X Version 11"
+.TH XScreenSaver 1 "18-Feb-2003 (4.08)" "X Version 11"
 .SH NAME
 xscreensaver-getimage-file - put a randomly-selected image on the root window
 .SH SYNOPSIS
 .SH NAME
 xscreensaver-getimage-file - put a randomly-selected image on the root window
 .SH SYNOPSIS
index add058facfd1944106eb35ff7d18d0267e1c4d5e..7d81c2cfe4df3599cb3ea745b38cff09acadbea3 100644 (file)
@@ -1,4 +1,4 @@
-.TH XScreenSaver 1 "03-Feb-2003 (4.07)" "X Version 11"
+.TH XScreenSaver 1 "18-Feb-2003 (4.08)" "X Version 11"
 .SH NAME
 xscreensaver-getimage-video - put a video frame on the root window
 .SH SYNOPSIS
 .SH NAME
 xscreensaver-getimage-video - put a video frame on the root window
 .SH SYNOPSIS
index c70afeb4b52a49c9ce97c90ddae02bc4605f3ac1..c630decb70d68205726078cdb7eb619135e6cc8f 100644 (file)
@@ -1,4 +1,4 @@
-.TH XScreenSaver 1 "03-Feb-2003 (4.07)" "X Version 11"
+.TH XScreenSaver 1 "18-Feb-2003 (4.08)" "X Version 11"
 .SH NAME
 xscreensaver-getimage - put some randomly-selected image on the root window
 .SH SYNOPSIS
 .SH NAME
 xscreensaver-getimage - put some randomly-selected image on the root window
 .SH SYNOPSIS
index 57cc234d760cd13ca05e6c102fb909a4c3a0b7cb..bc20b12d6846b037c185b10c1dbbe8203d8d35fc 100644 (file)
@@ -493,6 +493,37 @@ lock_initialization (saver_info *si, int *argc, char **argv)
       si->locking_disabled_p = True;
       si->nolock_reason = "running under GDM";
     }
       si->locking_disabled_p = True;
       si->nolock_reason = "running under GDM";
     }
+
+  /* If the server is XDarwin (MacOS X) then disable locking.
+     (X grabs only affect X programs, so you can use Command-Tab
+     to bring any other Mac program to the front, e.g., Terminal.)
+   */
+  if (!si->locking_disabled_p)
+    {
+      int op = 0, event = 0, error = 0;
+      Bool macos_p = False;
+
+#ifdef __APPLE__
+      /* Disable locking if *running* on Apple hardware, since we have no
+         reliable way to determine whether the server is running on MacOS.
+         Hopefully __APPLE__ means "MacOS" and not "Linux on Mac hardware"
+         but I'm not really sure about that.
+       */
+      macos_p = True;
+#endif
+
+      if (!macos_p)
+        /* This extension exists on the Apple X11 server, but not
+           on earlier versions of the XDarwin server. */
+        macos_p = XQueryExtension (si->dpy, "Apple-DRI", &op, &event, &error);
+
+      if (macos_p)
+        {
+          si->locking_disabled_p = True;
+          si->nolock_reason = "Cannot lock securely on MacOS X";
+        }
+    }
+
 #endif /* NO_LOCKING */
 }
 
 #endif /* NO_LOCKING */
 }
 
@@ -688,11 +719,17 @@ print_banner (saver_info *si)
       fprintf (stderr, "%s: in process %lu.\n", blurb(),
               (unsigned long) getpid());
     }
       fprintf (stderr, "%s: in process %lu.\n", blurb(),
               (unsigned long) getpid());
     }
+}
+
+static void
+print_lock_failure_banner (saver_info *si)
+{
+  saver_preferences *p = &si->prefs;
 
   /* If locking was not able to be initalized for some reason, explain why.
      (This has to be done after we've read the lock_p resource.)
    */
 
   /* If locking was not able to be initalized for some reason, explain why.
      (This has to be done after we've read the lock_p resource.)
    */
-  if (p->lock_p && si->locking_disabled_p)
+  if (si->locking_disabled_p)
     {
       p->lock_p = False;
       fprintf (stderr, "%s: locking is disabled (%s).\n", blurb(),
     {
       p->lock_p = False;
       fprintf (stderr, "%s: locking is disabled (%s).\n", blurb(),
@@ -707,6 +744,7 @@ print_banner (saver_info *si)
                 "\t See the manual for details.\n",
                 blurb());
     }
                 "\t See the manual for details.\n",
                 blurb());
     }
+
 }
 
 
 }
 
 
@@ -1250,6 +1288,7 @@ main (int argc, char **argv)
       exit (1);
 
   lock_initialization (si, &argc, argv);
       exit (1);
 
   lock_initialization (si, &argc, argv);
+  print_lock_failure_banner (si);
 
   if (p->xsync_p) XSynchronize (si->dpy, True);
 
 
   if (p->xsync_p) XSynchronize (si->dpy, True);
 
@@ -1893,6 +1932,8 @@ analyze_display (saver_info *si)
 #     endif
    }, { "XINERAMA",                             "Xinerama",
         True
 #     endif
    }, { "XINERAMA",                             "Xinerama",
         True
+   }, { "Apple-DRI",                            "Apple-DRI (XDarwin)",
+        True
    },
   };
 
    },
   };
 
index 1fd6edbe6540f133f82153f54aa0ee3957bb8603..a6e1ef6c95fec79d031c88ac30cfa0f918bf5e3d 100644 (file)
@@ -11,7 +11,7 @@
 .if n .sp 1
 .if t .sp .5
 ..
 .if n .sp 1
 .if t .sp .5
 ..
-.TH XScreenSaver 1 "03-Feb-2003 (4.07)" "X Version 11"
+.TH XScreenSaver 1 "18-Feb-2003 (4.08)" "X Version 11"
 .SH NAME
 xscreensaver - extensible screen saver framework, plus locking
 .SH SYNOPSIS
 .SH NAME
 xscreensaver - extensible screen saver framework, plus locking
 .SH SYNOPSIS
@@ -57,6 +57,16 @@ The easiest way to configure \fIxscreensaver\fP is to simply run the
 program, and change the settings through the GUI.  The rest of this
 manual page describes lower level ways of changing settings.
 
 program, and change the settings through the GUI.  The rest of this
 manual page describes lower level ways of changing settings.
 
+I'll repeat that because it's important:
+
+.RS 4
+The easy way to configure xscreensaver is to run the 
+.BR xscreensaver-demo (1)
+program.  You shouldn't need to know any of the stuff described 
+in \fIthis\fP manual unless you are trying to do something tricky,
+like customize xscreensaver for site-wide use or something.
+.RE
+
 Options to \fIxscreensaver\fP are stored in one of two places: in 
 a \fI.xscreensaver\fP file in your home directory; or in the X resource
 database.  If the \fI.xscreensaver\fP file exists, it overrides any settings
 Options to \fIxscreensaver\fP are stored in one of two places: in 
 a \fI.xscreensaver\fP file in your home directory; or in the X resource
 database.  If the \fI.xscreensaver\fP file exists, it overrides any settings
@@ -79,15 +89,11 @@ blanking or unblanking the screen, or picking a new graphics mode.)
 
 If you change a setting in your X resource database, or if you want
 xscreensaver to notice your changes immediately instead of the next time
 
 If you change a setting in your X resource database, or if you want
 xscreensaver to notice your changes immediately instead of the next time
-it wakes up, then you will need to tell the running xscreensaver process
-to re-initialize itself, like so:
-.EX
-xscreensaver-command -restart
-.EE
-Note that if you changed the \fI.Xdefaults\fP file, you might also need to run
-.BR xrdb (1):
+it wakes up, then you will need to reload your \fI.Xdefaults\fP file,
+and then tell the running xscreensaver process to restart itself, like so:
 .EX
 xrdb < ~/.Xdefaults
 .EX
 xrdb < ~/.Xdefaults
+xscreensaver-command -restart
 .EE
 If you want to set the system-wide defaults, then make your edits to
 the xscreensaver app-defaults file, which should have been installed
 .EE
 If you want to set the system-wide defaults, then make your edits to
 the xscreensaver app-defaults file, which should have been installed
@@ -210,12 +216,15 @@ See the description of the \fBprograms\fP resource, below.
 .RE
 .TP 8
 .B installColormap\fP (class \fBBoolean\fP)
 .RE
 .TP 8
 .B installColormap\fP (class \fBBoolean\fP)
-Install a private colormap while the screensaver is active, so that the
-graphics hacks can get as many colors as possible.  This is the 
-default.  (This only applies when the screen's default visual is being
-used, since non-default visuals get their own colormaps automatically.)
-This can also be overridden on a per-hack basis: see the discussion of
-the \fBdefault\-n\fP name in the section about the \fBprograms\fP resource.
+On PseudoColor (8-bit) displays, install a private colormap while the
+screensaver is active, so that the graphics hacks can get as many
+colors as possible.  This is the default.  (This only applies when the
+screen's default visual is being used, since non-default visuals get
+their own colormaps automatically.)  This can also be overridden on a
+per-hack basis: see the discussion of the \fBdefault\-n\fP name in the
+section about the \fBprograms\fP resource.
+
+This does nothing if you have a TrueColor (16-bit or deeper) display.
 .TP 8
 .B verbose\fP (class \fBBoolean\fP)
 Whether to print diagnostics.  Default false.
 .TP 8
 .B verbose\fP (class \fBBoolean\fP)
 Whether to print diagnostics.  Default false.
@@ -236,12 +245,13 @@ display the web page indicated here in your web browser.
 .TP 8
 .B loadURL\fP (class \fBLoadURL\fP)
 This is the shell command used to load a URL into your web browser.
 .TP 8
 .B loadURL\fP (class \fBLoadURL\fP)
 This is the shell command used to load a URL into your web browser.
-The default setting will load it into Netscape if it is already running,
-otherwise, will launch a new Netscape looking at the \fIhelpURL\fP.
+The default setting will load it into Mozilla/Netscape if it is already
+running, otherwise, will launch a new browser looking at the \fIhelpURL\fP.
 .TP 8
 .B demoCommand\fP (class \fBDemoCommand\fP)
 This is the shell command run when the \fIDemo\fP button on the splash window
 .TP 8
 .B demoCommand\fP (class \fBDemoCommand\fP)
 This is the shell command run when the \fIDemo\fP button on the splash window
-is pressed.  It defaults to \fIxscreensaver\-demo\fP.
+is pressed.  It defaults to
+.BR xscreensaver\-demo (1).
 .TP 8
 .B prefsCommand\fP (class \fBPrefsCommand\fP)
 This is the shell command run when the \fIPrefs\fP button on the splash window
 .TP 8
 .B prefsCommand\fP (class \fBPrefsCommand\fP)
 This is the shell command run when the \fIPrefs\fP button on the splash window
@@ -345,12 +355,13 @@ do it for you!
 .TP 8
 .B programs\fP (class \fBPrograms\fP)
 The graphics hacks which \fIxscreensaver\fP runs when the user is idle.
 .TP 8
 .B programs\fP (class \fBPrograms\fP)
 The graphics hacks which \fIxscreensaver\fP runs when the user is idle.
-The value of this resource is a string, one \fIsh\fP-syntax command per line.  
-Each line must contain exactly one command: no semicolons, no ampersands.
+The value of this resource is a multi-line string, one \fIsh\fP-syntax
+command per line.  Each line must contain exactly one command: no
+semicolons, no ampersands.
 
 
-When the screensaver starts up, one of these is selected at random, and
-run.  After the \fIcycle\fP period expires, it is killed, and another
-is selected and run.
+When the screensaver starts up, one of these is selected (according to
+the \fBmode\fP setting), and run.  After the \fIcycle\fP period
+expires, it is killed, and another is selected and run.
 
 If a line begins with a dash (-) then that particular program is
 disabled: it won't be selected at random (though you can still select
 
 If a line begins with a dash (-) then that particular program is
 disabled: it won't be selected at random (though you can still select
@@ -442,7 +453,7 @@ run on one, and hacks that only look good in color will show up on the other.
 .RE
 .PP
 .PP
 .RE
 .PP
 .PP
-Normally you won't need to change the following resources:
+You shouldn't ever need to change the following resources:
 .PP
 .TP 8
 .B pointerPollTime\fP (class \fBTime\fP)
 .PP
 .TP 8
 .B pointerPollTime\fP (class \fBTime\fP)
@@ -583,7 +594,7 @@ notice this (after a few minutes), and will not waste CPU by drawing
 graphics demos on a black screen.  An attempt will also be made to
 explicitly power the monitor back up as soon as user activity is detected.
 
 graphics demos on a black screen.  An attempt will also be made to
 explicitly power the monitor back up as soon as user activity is detected.
 
-As of version 3.28, the \fI~/.xscreensaver\fP file controls the
+As of version 3.28 (Feb 2001), the \fI~/.xscreensaver\fP file controls the
 configuration of your display's power management settings: if you have
 used
 .BR xset (1)
 configuration of your display's power management settings: if you have
 used
 .BR xset (1)
@@ -739,10 +750,51 @@ while nobody is logged in, and kill it as soon as someone does log in.
 (The user will then be responsible for starting xscreensaver on their
 own, if they want.)
 
 (The user will then be responsible for starting xscreensaver on their
 own, if they want.)
 
+Another way to accomplish the same thing is to edit the
+file \fI/etc/X11/gdm/gdm.conf\fP to include:
+.EX
+BackgroundProgram=xscreensaver -nosplash
+RunBackgroundProgramAlways=true
+.EE
 In this situation, the \fIxscreensaver\fP process will probably be running
 as user \fIgdm\fP instead of \fIroot\fP.  You can configure the settings
 for this nobody-logged-in state (timeouts, DPMS, etc.) by editing
 the \fI~gdm/.xscreensaver\fP file.
 In this situation, the \fIxscreensaver\fP process will probably be running
 as user \fIgdm\fP instead of \fIroot\fP.  You can configure the settings
 for this nobody-logged-in state (timeouts, DPMS, etc.) by editing
 the \fI~gdm/.xscreensaver\fP file.
+.SH USING KDE (K DESKTOP ENVIRONMENT)
+I understand that KDE has invented their own wrapper around xscreensaver,
+that is inferior to 
+.BR xscreensaver-demo (1)
+in any number of ways.  I've never actually seen it, but I'm told that
+this is the way you disable it:
+.RS 4
+.TP 3
+\fB1: Switch off KDE's screen saver.\fP
+Open the ``\fIControl Center\fP'' and
+select the ``\fILook and Feel / Screensaver\fP'' page.
+Turn off the ``\fIEnable Screensaver\fP'' checkbox.
+.TP 3
+\fB2: Find your Autostart directory.\fP
+Open the ``\fILook and Feel / Desktop / Paths\fP'' page,
+and see what your ``Autostart'' directory is set to: it will
+probably be \fI~/.kde3/Autostart/\fP or something similar.
+.TP 3
+\fB3: Make xscreensaver be an Autostart program.\fP
+Create a file in your autostart directory 
+called \fIxscreensaver.desktop\fP that contains the following five lines:
+.EX
+[Desktop Entry]
+Exec=xscreensaver
+Name=XScreensaver
+Type=Application
+X-KDE-StartupNotify=false
+.EE
+.RE
+.PP
+Now use xscreensaver normally, controlling it via the usual
+.BR xscreensaver-demo (1)
+and
+.BR xscreensaver-command (1)
+mechanisms.
 .SH USING CDE (COMMON DESKTOP ENVIRONMENT)
 The easiest way to use \fIxscreensaver\fP on a system with CDE is to simply
 switch off the built-in CDE screensaver, and use \fIxscreensaver\fP instead;
 .SH USING CDE (COMMON DESKTOP ENVIRONMENT)
 The easiest way to use \fIxscreensaver\fP on a system with CDE is to simply
 switch off the built-in CDE screensaver, and use \fIxscreensaver\fP instead;
@@ -850,133 +902,6 @@ This associates the VUE front panel ``Lock'' icon with the xscreensaver
 lock command.
 .RE
 .PP
 lock command.
 .RE
 .PP
-.SH USING KDE (K DESKTOP ENVIRONMENT)
-I understand that KDE has invented their own wrapper around xscreensaver,
-that is inferior to 
-.BR xscreensaver-demo (1)
-in any number of ways.  I've never actually seen it, but I'm told that
-this is the way you disable it:
-.RS 4
-.TP 3
-\fB1: Switch off KDE's screen saver.\fP
-Open the ``\fIControl Center\fP'' and
-select the ``\fILook and Feel / Screensaver\fP'' page.
-Turn off the ``\fIEnable Screensaver\fP'' checkbox.
-.TP 3
-\fB2: Find your Autostart directory.\fP
-Open the ``\fILook and Feel / Desktop / Paths\fP'' page,
-and see what your ``Autostart'' directory is set to: it will
-probably be \fI~/.kde3/Autostart/\fP or something similar.
-.TP 3
-\fB3: Make xscreensaver be an Autostart program.\fP
-Create a file in your autostart directory 
-called \fIxscreensaver.desktop\fP that contains the following five lines:
-.EX
-[Desktop Entry]
-Exec=xscreensaver
-Name=XScreensaver
-Type=Application
-X-KDE-StartupNotify=false
-.EE
-.RE
-.PP
-Now use xscreensaver normally, controlling it via the usual
-.BR xscreensaver-demo (1)
-and
-.BR xscreensaver-command (1)
-mechanisms.
-.SH ADDING TO MENUS
-The
-.BR xscreensaver-command (1)
-program is a perfect candidate for something to add to your window manager's
-popup menus.  If you use 
-.BR mwm (1),
-.BR 4Dwm (1),
-.BR twm (1),
-or (probably) any of \fItwm\fP's many descendants, you can do it like this:
-.RS 0
-.TP 3
-\fB1. Create ~/.mwmrc (or ~/.twmrc or ...)\fP
-If you don't have a \fI~/.mwmrc\fP file (or, on SGIs, a \fI~/.4Dwmrc\fP file;
-or, with twm, a \fI~/.twmrc\fP file) then create one by making a copy of
-the \fI/usr/lib/X11/system.mwmrc\fP 
-file (or \fI/usr/lib/X11/twm/system.twmrc\fP, and so on.)
-.TP 3
-\fB2. Add a menu definition.\fP
-Something like this:
-.EX
-menu XScreenSaver
-{
- "Blank Screen Now" !"sleep 3; xscreensaver-command -activate"
- "Lock Screen Now"  !"sleep 3; xscreensaver-command -lock"
- "Screen Saver Demo"         !"xscreensaver-demo"
- "Screen Saver Preferences"  !"xscreensaver-demo -prefs"
- "Reinitialize Screen Saver" !"xscreensaver-command -restart"
- "Kill Screen Saver"         !"xscreensaver-command -exit"
- "Launch Screen Saver"       !"xscreensaver &"
-}
-.EE
-.TP 3
-\fB3. Add the menu\fP
-For
-.BR mwm (1)
-and
-.BR 4Dwm (1),
-find the section of the file that says \fIMenu DefaultRootMenu\fP.
-For
-.BR twm (1),
-it will probably be \fImenu "defops"\fP.  If you add a line somewhere 
-in that menu definition that reads
-.EX
-  "XScreenSaver"        f.menu XScreenSaver
-.EE
-then this will add an XScreenSaver sub-menu to your default root-window
-popup menu.  Alternately, you could just put the xscreensaver menu items
-directly into the root menu.
-.RE
-
-For Fvwm2, the process is similar: first create a \fI~/.fvwm2rc\fP file
-if you don't already have one, by making a copy of
-the \fI/etc/X11/fvwm2/system.fvwm2rc\fP file.  Then, add a menu definition
-to it:
-.EX
-AddToMenu XScreenSaver "XScreenSaver" Title
-+ "Blank Screen Now"          Exec xscreensaver-command -activate
-+ "Lock Screen Now"           Exec xscreensaver-command -lock
-+ "Screen Saver Demo"         Exec xscreensaver-command -demo
-+ "Screen Saver Preferences"  Exec xscreensaver-command -prefs
-+ "Reinitialize Screen Saver" Exec xscreensaver-command -restart
-+ "Kill Screen Saver"         Exec xscreensaver-command -exit
-+ "Launch Screen Saver"       Exec xscreensaver
-+ "Run Next Demo"             Exec xscreensaver-command -next
-+ "Run Previous Demo"         Exec xscreensaver-command -prev
-
-# To put the XScreenSaver sub-menu at the end of the root menu:
-AddToMenu RootMenu "XScreenSaver" Popup XScreenSaver
-.EE
-The Enlightenment window manager keeps each of its menus in a separate
-file. So, you need to create a file 
-named \fI~/.enlightenment/xscreensaver.menu\fP with the contents:
-.EX
-"XScreenSaver Commands"
- "Blank Screen Now"    NULL exec "xscreensaver-command -activate"
- "Lock Screen Now"     NULL exec "xscreensaver-command -lock"
- "Screen Saver Demo"   NULL exec "xscreensaver-command -demo"
- "Screen Saver Prefs"  NULL exec "xscreensaver-command -prefs"
- "Reinitialize Saver"  NULL exec "xscreensaver-command -restart"
- "Kill Screen Saver"   NULL exec "xscreensaver-command -exit"
- "Launch Screen Saver" NULL exec "xscreensaver"
-.EE
-then add
-.EX
- "XScreenSaver"        NULL menu "xscreensaver.menu"
-.EE
-to \fI~/.enlightenment/file.menu\fP to put the XScreenSaver submenu on 
-your left-button root-window menu.
-
-As you see, every window manager does this stuff gratuitously differently,
-just to make your life difficult.  You are in a maze of twisty menu
-configuration languages, all alike.
 .SH BUGS
 Bugs?  There are no bugs.  Ok, well, maybe.  If you find one, please let
 me know.  http://www.jwz.org/xscreensaver/bugs.html explains how to
 .SH BUGS
 Bugs?  There are no bugs.  Ok, well, maybe.  If you find one, please let
 me know.  http://www.jwz.org/xscreensaver/bugs.html explains how to
@@ -1039,11 +964,6 @@ in to the local machine to connect to the display.)
 You should be sure that this is an acceptable thing to do in your
 environment before doing it.  See the ``\fIUsing XDM(1)\fP'' section, 
 above, for more details.
 You should be sure that this is an acceptable thing to do in your
 environment before doing it.  See the ``\fIUsing XDM(1)\fP'' section, 
 above, for more details.
-
-If anyone has suggestions on how xscreensaver could be made to work with
-.BR xdm (1)
-without first turning off \fI.Xauthority\fP-based access control, please
-let me know.
 .TP 8
 .B Passwords
 If you get an error message at startup like ``couldn't get password
 .TP 8
 .B Passwords
 If you get an error message at startup like ``couldn't get password
@@ -1061,7 +981,8 @@ with \fIconfigure\fP and recompile.
 
 If you change your password after xscreensaver has been launched, it will
 continue using your old password to unlock the screen until xscreensaver
 
 If you change your password after xscreensaver has been launched, it will
 continue using your old password to unlock the screen until xscreensaver
-is restarted.  So, after you change your password, you'll have to do
+is restarted.  On some systems, it may accept \fIboth\fP your old and new
+passwords.  So, after you change your password, you'll have to do
 .EX
 xscreensaver-command -restart
 .EE
 .EX
 xscreensaver-command -restart
 .EE
@@ -1088,7 +1009,7 @@ configured correctly!
 .B Colormap lossage: TWM
 The \fBinstallColormap\fP option doesn't work very well with the
 .BR twm (1)
 .B Colormap lossage: TWM
 The \fBinstallColormap\fP option doesn't work very well with the
 .BR twm (1)
-window manager and its descendants.  
+window manager and its descendants, on 8-bit screens.
 
 There is a race condition between the screensaver and this window manager,
 which can result in the screensaver's colormap not getting installed
 
 There is a race condition between the screensaver and this window manager,
 which can result in the screensaver's colormap not getting installed
@@ -1141,36 +1062,21 @@ advantage of them.
 .B Machine Load
 Although this program ``nices'' the subprocesses that it starts, 
 graphics-intensive subprograms can still overload the machine by causing
 .B Machine Load
 Although this program ``nices'' the subprocesses that it starts, 
 graphics-intensive subprograms can still overload the machine by causing
-the X server process itself (which is not ``niced'') to suck a lot of 
-cycles.  Care should be taken to slow down programs intended for use as 
-screensavers by inserting strategic calls to
-.BR sleep (3)
-or
-.BR usleep (3)
-(or making liberal use of any \fI\-delay\fP options which the programs 
-may provide.)
-
-Note that the OpenGL-based graphics demos are real pigs on machines that
-don't have texture hardware.
-
-Also, an active screensaver will cause your X server to be pretty much 
-permanently swapped in; but the same is true of any program that draws
-periodically, like 
-.BR xclock (1)
-or
-.BR xload (1).
-.TP 8
-.B Latency and Responsiveness
-If the subprocess is drawing too quickly and the connection to the X
-server is a slow one (such as an X terminal running over a phone line) then 
-the screensaver might not turn off right away when the user becomes active
-again (the
-.BR ico (1)
-demo has this problem if being run in full-speed mode).  This can be
-alleviated by inserting strategic calls to
-.BR XSync (3)
-in code intended for use as a screensaver.  This prevents too much graphics
-activity from being buffered up.
+the X server process itself (which is not ``niced'') to consume many
+cycles.  Care has been taken in all the modules shipped with xscreensaver
+to sleep periodically, and not run full tilt, so as not to cause
+appreciable load.
+
+However, if you are running the OpenGL-based screen savers on a machine
+that does not have a video card with 3D acceleration, they \fIwill\fP
+make your machine slow, despite
+.BR nice (1).
+
+Your options are: don't use the OpenGL display modes; or, collect the
+spare change hidden under the cushions of your couch, and use it to
+buy a video card manufactured after 1998.  (It doesn't even need to be
+\fIfast\fP 3D hardware: the problem will be fixed if there is any
+3D hardware \fIat all.\fP)
 .TP 8
 .B XFree86's Magic Keystrokes
 The XFree86 X server traps certain magic keystrokes before client programs ever
 .TP 8
 .B XFree86's Magic Keystrokes
 The XFree86 X server traps certain magic keystrokes before client programs ever
@@ -1186,24 +1092,6 @@ your \fI/etc/X11/XF86Config\fP file.  To globally disable VT switching,
 you can set the \fIDontVTSwitch\fP flag.  See the
 .BR XF86Config (5)
 manual for details.
 you can set the \fIDontVTSwitch\fP flag.  See the
 .BR XF86Config (5)
 manual for details.
-
-Some Linux systems come with a VT_LOCKSWITCH ioctl, that one could 
-theoretically use to prevent VT-switching while the screen is locked; 
-but unfortunately, this ioctl can only be used by root, which means
-that xscreensaver can't use it (since xscreensaver disavows its privileges
-shortly after startup, for security reasons.)
-
-Any suggestions for other solutions to this problem are welcome.
-.TP 8
-.B XView Clients
-Apparently there are some problems with XView programs getting confused
-and thinking that the screensaver window is the real root window even when
-the screensaver is not active: ClientMessages intended for the window manager
-are sent to the screensaver window instead.  This could be solved by making
-xscreensaver forward all unrecognised ClientMessages to the real root window,
-but there may be other problems as well.  If anyone has any insight on the
-cause of this problem, please let me know.  (XView is an X11 toolkit that 
-implements the (quite abominable) Sun OpenLook look-and-feel.)
 .TP 8
 .B MIT Extension and Fading
 The \fBMIT-SCREEN-SAVER\fP extension is junk.  Don't use it.
 .TP 8
 .B MIT Extension and Fading
 The \fBMIT-SCREEN-SAVER\fP extension is junk.  Don't use it.
@@ -1220,42 +1108,6 @@ It sure would be nice if someone would implement the \fBSGI SCREEN_SAVER\fP
 extension in XFree86; it's dead simple, and works far better than the
 overengineered and broken \fBMIT-SCREEN-SAVER\fP extension.
 .TP 8
 extension in XFree86; it's dead simple, and works far better than the
 overengineered and broken \fBMIT-SCREEN-SAVER\fP extension.
 .TP 8
-.B SGI Power Saver
-If you're running Irix 6.3, you might find that your monitor is powering down
-after an hour or two even if you've told it not to.  This is fixed by SGI
-patches 2447 and 2537.
-
-If you're running Irix 6.5, this bug is back.  I don't know a fix.
-.TP 8
-.B MesaGL and Voodoo Cards
-If you have a 3Dfx/Voodoo card, the default settings for xscreensaver will
-run the GL-based graphics demos in such a way that they will not take 
-advantage of the 3D acceleration hardware.  The solution is to change
-the \fBprograms\fP entries for the GL hacks from this:
-.EX
-       gears -root                        \\n\\
-.EE
-to this:
-.EX
-       MESA_GLX_FX=fullscreen  gears      \\n\\
-.EE
-That is, make sure that \fB$MESA_GLX_FX\fP is set to \fIfullscreen\fP, and
-don't tell the program to draw on the root window.  This may seem strange,
-but the setup used by Mesa and these kinds of cards \fIis\fP strange!
-
-For those who don't know, these cards work by sitting between your normal
-video card and the monitor, and seizing control of the monitor when it's 
-time to do 3D.  But this means that accelerated 3D only happens in full-screen
-mode (you can't do it in a window, and you can't see the output of 3D and 2D
-programs simultaniously), and that 3D will probably drive your monitor at a
-lower resolution, as well.  It's bizarre.
-
-This probably isn't ever necessary on more modern cards; I'm not sure.
-
-If you find that GL programs only work properly when run as root, and not
-as normal users, then the problem is that your \fI/dev/3dfx\fP file is not
-configured properly.  Check the Linux 3Dfx FAQ.
-.TP 8
 .B Keyboard LEDs
 If \fIprocInterrupts\fP is on (which is the default on Linux systems) and
 you're using some program that toggles the state of your keyboard LEDs,
 .B Keyboard LEDs
 If \fIprocInterrupts\fP is on (which is the default on Linux systems) and
 you're using some program that toggles the state of your keyboard LEDs,
@@ -1301,29 +1153,42 @@ The latest version of xscreensaver, an online version of this manual,
 and a FAQ can always be found at http://www.jwz.org/xscreensaver/
 .SH SEE ALSO
 .BR X (1),
 and a FAQ can always be found at http://www.jwz.org/xscreensaver/
 .SH SEE ALSO
 .BR X (1),
+.BR Xsecurity (1),
+.BR xauth (1),
 .BR xscreensaver\-demo (1),
 .BR xscreensaver\-command (1),
 .BR xscreensaver\-gl\-helper (1),
 .BR xscreensaver\-demo (1),
 .BR xscreensaver\-command (1),
 .BR xscreensaver\-gl\-helper (1),
+.BR xscreensaver\-getimage (1),
 .BR xdm (1),
 .BR xdm (1),
+.BR gdm (1),
 .BR xset (1),
 .BR xset (1),
-.BR Xsecurity (1),
-.BR xauth (1),
 .BR xhost (1).
 .BR xhost (1).
+.BR anemone (1),
 .BR ant (1),
 .BR ant (1),
+.BR apollonian (1),
 .BR atlantis (1),
 .BR attraction (1),
 .BR atlantis (1),
 .BR attraction (1),
+.BR barcode (1),
+.BR blaster (1),
 .BR blitspin (1),
 .BR bouboule (1),
 .BR blitspin (1),
 .BR bouboule (1),
+.BR boxed (1),
 .BR braid (1),
 .BR bsod (1),
 .BR bubble3d (1),
 .BR bubbles (1),
 .BR braid (1),
 .BR bsod (1),
 .BR bubble3d (1),
 .BR bubbles (1),
+.BR bumps (1),
 .BR cage (1),
 .BR cage (1),
+.BR ccurve (1),
+.BR circuit (1),
 .BR compass (1),
 .BR coral (1),
 .BR compass (1),
 .BR coral (1),
+.BR cosmos (1),
 .BR critical (1),
 .BR crystal (1),
 .BR critical (1),
 .BR crystal (1),
+.BR cubenetic (1),
 .BR cynosure (1),
 .BR cynosure (1),
+.BR dangerball (1),
 .BR decayscreen (1),
 .BR deco (1),
 .BR deluxe (1),
 .BR decayscreen (1),
 .BR deco (1),
 .BR deluxe (1),
@@ -1331,43 +1196,66 @@ and a FAQ can always be found at http://www.jwz.org/xscreensaver/
 .BR discrete (1),
 .BR distort (1),
 .BR drift (1),
 .BR discrete (1),
 .BR distort (1),
 .BR drift (1),
+.BR electricsheep (1),
+.BR endgame (1),
+.BR engine (1),
 .BR epicycle (1),
 .BR epicycle (1),
+.BR eruption (1),*
+.BR euler2d (1),
+.BR extrusion (1),
 .BR fadeplot (1),
 .BR flag (1),
 .BR flame (1),
 .BR fadeplot (1),
 .BR flag (1),
 .BR flame (1),
+.BR flipscreen3d (1),
 .BR flow (1),
 .BR flow (1),
+.BR fluidballs (1),
+.BR flurry (1),
 .BR forest (1),
 .BR galaxy (1),
 .BR gears (1),
 .BR forest (1),
 .BR galaxy (1),
 .BR gears (1),
+.BR gflux (1),
+.BR glblur (1),
+.BR glforestfire (1),
 .BR glplanet (1),
 .BR glplanet (1),
+.BR glsnake (1),
+.BR gltext (1),
+.BR goban (1),
 .BR goop (1),
 .BR grav (1),
 .BR greynetic (1),
 .BR goop (1),
 .BR grav (1),
 .BR greynetic (1),
+.BR halftone (1),
 .BR halo (1),
 .BR helix (1),
 .BR hopalong (1),
 .BR halo (1),
 .BR helix (1),
 .BR hopalong (1),
+.BR hyperball (1),
 .BR hypercube (1),
 .BR ifs (1),
 .BR imsmap (1),
 .BR interference (1),
 .BR jigsaw (1),
 .BR hypercube (1),
 .BR ifs (1),
 .BR imsmap (1),
 .BR interference (1),
 .BR jigsaw (1),
+.BR juggle (1),
 .BR julia (1),
 .BR kaleidescope (1),
 .BR kumppa (1),
 .BR lament (1),
 .BR laser (1),
 .BR julia (1),
 .BR kaleidescope (1),
 .BR kumppa (1),
 .BR lament (1),
 .BR laser (1),
+.BR lavalite (1),
 .BR lightning (1),
 .BR lisa (1),
 .BR lissie (1),
 .BR lmorph (1),
 .BR loop (1),
 .BR maze (1),
 .BR lightning (1),
 .BR lisa (1),
 .BR lissie (1),
 .BR lmorph (1),
 .BR loop (1),
 .BR maze (1),
+.BR menger (1),
+.BR metaballs (1),
 .BR moebius (1),
 .BR moire (1),
 .BR moire2 (1),
 .BR moebius (1),
 .BR moire (1),
 .BR moire2 (1),
+.BR molecule (1),
 .BR morph3d (1),
 .BR mountain (1),
 .BR munch (1),
 .BR morph3d (1),
 .BR mountain (1),
 .BR munch (1),
+.BR nerverot (1),
 .BR noseguy (1),
 .BR pedal (1),
 .BR penetrate (1),
 .BR noseguy (1),
 .BR pedal (1),
 .BR penetrate (1),
@@ -1375,57 +1263,74 @@ and a FAQ can always be found at http://www.jwz.org/xscreensaver/
 .BR petri (1),
 .BR phosphor (1),
 .BR pipes (1),
 .BR petri (1),
 .BR phosphor (1),
 .BR pipes (1),
+.BR polyominoes (1),
+.BR popsquares (1),
 .BR pulsar (1),
 .BR pyro (1),
 .BR qix (1),
 .BR pulsar (1),
 .BR pyro (1),
 .BR qix (1),
+.BR queens (1),
 .BR rd-bomb (1),
 .BR rd-bomb (1),
+.BR ripples (1),
 .BR rocks (1),
 .BR rorschach (1),
 .BR rotor (1),
 .BR rocks (1),
 .BR rorschach (1),
 .BR rotor (1),
+.BR rotzoomer (1),
 .BR rubik (1),
 .BR rubik (1),
+.BR sballs (1),
+.BR shadebobs (1),
 .BR sierpinski (1),
 .BR sierpinski (1),
+.BR sierpinski3d (1),
 .BR slidescreen (1),
 .BR slip (1),
 .BR sonar (1),
 .BR slidescreen (1),
 .BR slip (1),
 .BR sonar (1),
+.BR speedmine (1),
 .BR sphere (1),
 .BR sphere (1),
+.BR sphereEversion (1),
+.BR spheremonics (1),
 .BR spiral (1),
 .BR spotlight (1),
 .BR sproingies (1),
 .BR squiral (1),
 .BR spiral (1),
 .BR spotlight (1),
 .BR sproingies (1),
 .BR squiral (1),
+.BR ssystem (1),
 .BR stairs (1),
 .BR starfish (1),
 .BR stairs (1),
 .BR starfish (1),
+.BR starwars (1),
+.BR stonerview (1),
 .BR strange (1),
 .BR superquadrics (1),
 .BR swirl (1),
 .BR t3d (1),
 .BR strange (1),
 .BR superquadrics (1),
 .BR swirl (1),
 .BR t3d (1),
+.BR thornbird (1),
 .BR triangle (1),
 .BR truchet (1),
 .BR triangle (1),
 .BR truchet (1),
+.BR twang (1),
+.BR vermiculate (1),
+.BR vidwhacker (1),
 .BR vines (1),
 .BR wander (1),
 .BR vines (1),
 .BR wander (1),
+.BR webcollage (1),
+.BR whirlwindwarp (1),
+.BR whirlygig (1),
 .BR worm (1),
 .BR worm (1),
+.BR xaos (1),
+.BR xdaliclock (1),
+.BR xearth (1),
+.BR xfishtank (1),
 .BR xflame (1),
 .BR xjack (1),
 .BR xlyap (1),
 .BR xmatrix (1),
 .BR xflame (1),
 .BR xjack (1),
 .BR xlyap (1),
 .BR xmatrix (1),
-.BR bongo (1),
-.BR ico (1),
-.BR xaos (1),
-.BR xbouncebits (1),
-.BR xcthugha (1),
-.BR xdaliclock (1),
-.BR xfishtank (1),
 .BR xmountains (1),
 .BR xmountains (1),
-.BR xsplinefun (1),
-.BR xswarm (1),
-.BR xtacy (1),
-.BR xv (1),
-.BR chbg (1),
-.BR xwave (1).
+.BR xrayswarm (1),
+.BR xsnow (1),
+.BR xspirograph (1),
+.BR xteevee (1),
+.BR zoom (1)
 .SH COPYRIGHT
 Copyright \(co 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
 .SH COPYRIGHT
 Copyright \(co 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
-2000, 2001, 2002 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
+2000, 2001, 2002, 2003 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
 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
@@ -1448,8 +1353,6 @@ locking-disabled diagnostics.
 
 Thanks to Patrick Moreau for the VMS port.
 
 
 Thanks to Patrick Moreau for the VMS port.
 
-Thanks to Mark Bowyer for figuring out how to hook it up to CDE.
-
 Thanks to Nat Lanza for the Kerberos support.
 
 Thanks to Bill Nottingham for the initial PAM support.
 Thanks to Nat Lanza for the Kerberos support.
 
 Thanks to Bill Nottingham for the initial PAM support.
index 691e6b3b1723a777abcac6d4c12cd7b404252862..770db8316e645281a32adcee33b01ea606b0c5b1 100644 (file)
@@ -97,7 +97,7 @@ SRCS          = attraction.c blitspin.c bouboule.c braid.c bubbles.c \
                  xpm-pixmap.c webcollage-helper.c twang.c apollonian.c \
                  euler2d.c juggle.c polyominoes.c thornbird.c fluidballs.c \
                  anemone.c halftone.c metaballs.c eruption.c popsquares.c \
                  xpm-pixmap.c webcollage-helper.c twang.c apollonian.c \
                  euler2d.c juggle.c polyominoes.c thornbird.c fluidballs.c \
                  anemone.c halftone.c metaballs.c eruption.c popsquares.c \
-                 barcode.c
+                 barcode.c piecewise.c
 SCRIPTS                = vidwhacker webcollage
 
 OBJS           = attraction.o blitspin.o bouboule.o braid.o bubbles.o \
 SCRIPTS                = vidwhacker webcollage
 
 OBJS           = attraction.o blitspin.o bouboule.o braid.o bubbles.o \
@@ -122,7 +122,7 @@ OBJS                = attraction.o blitspin.o bouboule.o braid.o bubbles.o \
                  xpm-pixmap.o webcollage-helper.o twang.o apollonian.o \
                  euler2d.o juggle.o polyominoes.o thornbird.o fluidballs.o \
                  anemone.o halftone.o metaballs.o eruption.o popsquares.o \
                  xpm-pixmap.o webcollage-helper.o twang.o apollonian.o \
                  euler2d.o juggle.o polyominoes.o thornbird.o fluidballs.o \
                  anemone.o halftone.o metaballs.o eruption.o popsquares.o \
-                 barcode.o
+                 barcode.o piecewise.o
 
 NEXES          = attraction blitspin bouboule braid bubbles decayscreen deco \
                  drift flag flame forest vines galaxy grav greynetic halo \
 
 NEXES          = attraction blitspin bouboule braid bubbles decayscreen deco \
                  drift flag flame forest vines galaxy grav greynetic halo \
@@ -139,7 +139,7 @@ NEXES               = attraction blitspin bouboule braid bubbles decayscreen deco \
                  nerverot xrayswarm hyperball zoom whirlwindwarp rotzoomer \
                  whirlygig speedmine vermiculate twang apollonian euler2d \
                  juggle polyominoes thornbird  fluidballs anemone halftone \
                  nerverot xrayswarm hyperball zoom whirlwindwarp rotzoomer \
                  whirlygig speedmine vermiculate twang apollonian euler2d \
                  juggle polyominoes thornbird  fluidballs anemone halftone \
-                 metaballs eruption popsquares barcode \
+                 metaballs eruption popsquares barcode piecewise \
                  @JPEG_EXES@
 SEXES          = sonar
 JPEG_EXES      = webcollage-helper
                  @JPEG_EXES@
 SEXES          = sonar
 JPEG_EXES      = webcollage-helper
@@ -180,7 +180,8 @@ MEN         = anemone.man ant.man apollonian.man attraction.man \
                  wander.man webcollage.man whirlwindwarp.man whirlygig.man \
                  worm.man xflame.man xjack.man xlyap.man xmatrix.man \
                  xrayswarm.man xspirograph.man xsublim.man xteevee.man \
                  wander.man webcollage.man whirlwindwarp.man whirlygig.man \
                  worm.man xflame.man xjack.man xlyap.man xmatrix.man \
                  xrayswarm.man xspirograph.man xsublim.man xteevee.man \
-                 zoom.man halftone.man eruption.man metaballs.man barcode.man
+                 zoom.man halftone.man eruption.man metaballs.man \
+                 barcode.man piecewise.man
 STAR           = *
 EXTRAS         = README Makefile.in xlock_23.h xml2man.pl .gdbinit \
                  config/README \
 STAR           = *
 EXTRAS         = README Makefile.in xlock_23.h xml2man.pl .gdbinit \
                  config/README \
@@ -741,6 +742,9 @@ popsquares: popsquares.o    $(HACK_OBJS) $(DBE) $(COL)
 barcode:       barcode.o       $(HACK_OBJS) $(HSV)
        $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(HSV) $(HACK_LIBS)
 
 barcode:       barcode.o       $(HACK_OBJS) $(HSV)
        $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(HSV) $(HACK_LIBS)
 
+piecewise:     piecewise.o     $(HACK_OBJS) $(COL) $(DBE)
+       $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(COL) $(DBE) $(HACK_LIBS)
+
 
 # The rules for those hacks which follow the `xlockmore' API.
 #
 
 # The rules for those hacks which follow the `xlockmore' API.
 #
@@ -1174,6 +1178,8 @@ petri.o: ../config.h
 petri.o: $(srcdir)/screenhack.h
 phosphor.o: ../config.h
 phosphor.o: $(srcdir)/screenhack.h
 petri.o: $(srcdir)/screenhack.h
 phosphor.o: ../config.h
 phosphor.o: $(srcdir)/screenhack.h
+piecewise.o: ../config.h
+piecewise.o: $(srcdir)/screenhack.h
 polyominoes.o: ../config.h
 polyominoes.o: $(srcdir)/screenhack.h
 polyominoes.o: $(srcdir)/xlockmoreI.h
 polyominoes.o: ../config.h
 polyominoes.o: $(srcdir)/screenhack.h
 polyominoes.o: $(srcdir)/xlockmoreI.h
index 218e3a1db679c3d5feb7d722760ad03daeb7c716..f6b19eb8cabd993feb7674120e40a9b6441f5147 100644 (file)
@@ -21,6 +21,9 @@
 #include "screenhack.h"
 #include <X11/Xutil.h>
 
 #include "screenhack.h"
 #include <X11/Xutil.h>
 
+#include <time.h>
+#include <sys/time.h>
+#include <ctype.h>
 
 
 /* parameters that are user configurable */
 
 
 /* parameters that are user configurable */
@@ -28,9 +31,6 @@
 /* delay (usec) between iterations */
 static int delay;
 
 /* delay (usec) between iterations */
 static int delay;
 
-static int scroll_p;
-
-
 
 /* non-user-modifiable immutable definitions */
 
 
 /* non-user-modifiable immutable definitions */
 
@@ -42,7 +42,7 @@ static int scroll_p;
 
 #define BARCODE_WIDTH (164)
 #define BARCODE_HEIGHT (69)
 
 #define BARCODE_WIDTH (164)
 #define BARCODE_HEIGHT (69)
-#define MAX_MAG (6)
+#define MAX_MAG (7)
 
 /* width and height of the window */
 static int windowWidth;
 
 /* width and height of the window */
 static int windowWidth;
@@ -55,6 +55,8 @@ static Screen *screen;          /* the screen to draw on */
 static Colormap cmap;           /* the colormap of the window */
 
 static GC theGC;                /* GC for drawing */
 static Colormap cmap;           /* the colormap of the window */
 
 static GC theGC;                /* GC for drawing */
+unsigned long fg_pixel;
+static Bool button_down_p;
 
 
 
 
 
 
@@ -91,247 +93,281 @@ static int barcode_max;   /* the maximum number of active barcodes */
 static XImage *theImage;  /* ginormo image for drawing */
 static Bitmap *theBitmap; /* ginormo bitmap for drawing */
 
 static XImage *theImage;  /* ginormo image for drawing */
 static Bitmap *theBitmap; /* ginormo bitmap for drawing */
 
+static enum { BC_SCROLL, BC_GRID, BC_CLOCK12, BC_CLOCK24 } mode;
+
 /* a bunch of words */
 static char *words[] = 
 {
 /* a bunch of words */
 static char *words[] = 
 {
-    "abdomen",
-    "abeyance",
-    "abhorrent",
-    "abrasive",
-    "abstract",
-    "acid",
-    "addiction",
-    "alertness",
-    "Algeria",
-    "anxiety",
-    "aorta",
-    "argyle socks",
-    "attrition",
-    "bamboo",
-    "bangle",
-    "bankruptcy",
-    "baptism",
-    "beer",
-    "bellicose",
-    "bells",
-    "belly",
-    "bread",
-    "bubba",
-    "burrito",
-    "California",
-    "capybara",
-    "cardinality",
-    "caribou",
-    "carnage",
-    "chocolate",
-    "constriction",
-    "contrition",
-    "corpse",
-    "cowboy",
-    "cozy",
-    "crabapple",
-    "craziness",
-    "Death",
-    "Decker",
-    "decoded",
-    "decoy",
-    "defenestration",
-    "dependency",
-    "despair",
-    "desperation",
-    "disease",
-    "doberman",
-    "dreams",
-    "drench",
-    "drugs",
-    "easy",
-    "ebony",
-    "elliptic",
-    "eloquence",
-    "emergency",
-    "eureka",
-    "excommunicate",
-    "fat",
-    "fatherland",
-    "Faust",
-    "fear",
-    "fever",
-    "flatulence",
-    "fluff",
-    "fnord",
-    "freedom",
-    "fruit",
-    "fruit",
-    "gauche",
-    "gawk",
-    "gaze",
-    "gerbils",
-    "GOD",
-    "goggles",
-    "goobers",
-    "gorilla",
-    "halibut",
-    "handmaid",
-    "hapless",
-    "happiness",
-    "hate",
-    "helplessness",
-    "hermaphrodite",
-    "Hindi",
-    "hope",
-    "hysteria",
-    "icepick",
-    "ignorance",
-    "importance",
-    "impossibility",
-    "inkling",
-    "insurrection",
-    "intoxicant",
-    "ire",
-    "irritant",
-    "jade",
-    "jaundice",
-    "Joyce",
-    "kaput",
-    "kitchenette",
-    "kiwi",
-    "lathe",
-    "lattice",
-    "lemming",
-    "liquidation",
-    "love",
-    "lozenge",
-    "magazine",
-    "magnesium",
-    "malfunction",
-    "marmot",
-    "marshmallow",
-    "merit",
-    "mescaline",
-    "milk",
-    "mischief",
-    "mistrust",
-    "money",
-    "monkey",
-    "monkeybutter",
-    "multiple",
-    "nature",
-    "neuron",
-    "noise",
-    "nomenclature",
-    "nutria",
-    "obey",
-    "ocelot",
-    "offspring",
-    "overseer",
-    "pain",
-    "pajamas",
-    "passenger",
-    "passion",
-    "Passover",
-    "Prozac",
-    "peace",
-    "penance",
-    "persimmon",
-    "petticoat",
-    "pharmacist",
-    "pitchfork",
-    "plague",
-    "Poindexter",
-    "precept",
-    "prison",
-    "prophecy",
-    "quadratic",
-    "quagmire",
-    "quarantine",
-    "quartz",
-    "rabies",
-    "radish",
-    "rage",
-    "readout",
-    "reality",
-    "reject",
-    "rejection",
-    "respect",
-    "revolution",
-    "roadrunner",
-    "rule",
-    "sanguine",
-    "savor",
-    "scab",
-    "scalar",
-    "Scandinavia",
-    "security",
-    "sediment",
-    "sickness",
-    "silicone",
-    "slack",
-    "slander",
-    "slavery",
-    "sledgehammer",
-    "smelly socks",
-    "sorrow",
-    "stamen",
-    "standardization",
-    "subversion",
-    "suffering",
-    "surrender",
-    "surveilance",
-    "synthesis",
-    "tenant",
-    "tendril",
-    "terror",
-    "terrorism",
-    "terrorist",
-    "the unknown",
-    "toast",
-    "topography",
-    "truism",
-    "turgid",
-    "underbrush",
-    "underling",
-    "unguent",
-    "unusual",
-    "unworthy",
-    "uplink",
-    "urge",
-    "valor",
-    "variance",
-    "vastness",
-    "vaudeville",
-    "vegetarian",
-    "venom",
-    "verifiability",
-    "viagra",
-    "vibrator",
-    "victim",
-    "vignette",
-    "villainy",
-    "W.A.S.T.E.",
-    "wagon",
-    "waiver",
-    "warehouse",
-    "waste",
-    "waveform",
-    "whiffle ball",
-    "whorl",
-    "windmill",
-    "wistful",
-    "worm",
-    "worship",
-    "worship",
-    "Xanax",
-    "Xerxes",
-    "Xhosa",
-    "xylophone",
-    "yellow",
-    "yesterday",
-    "your nose",
-    "Zanzibar",
-    "zeal",
-    "zebra",
-    "zest",
-    "zinc"
+  "abdomen",
+  "abeyance",
+  "abhorrence",
+  "abrasion",
+  "abstraction",
+  "acid",
+  "addiction",
+  "alertness",
+  "Algeria",
+  "anxiety",
+  "aorta",
+  "argyle socks",
+  "attrition",
+  "axis of evil",
+  "bamboo",
+  "bangle",
+  "bankruptcy",
+  "baptism",
+  "beer",
+  "bellicosity",
+  "bells",
+  "belly",
+  "bliss",
+  "bogosity",
+  "boobies",
+  "boobs",
+  "booty",
+  "bread",
+  "bubba",
+  "burrito",
+  "California",
+  "capybara",
+  "cardinality",
+  "caribou",
+  "carnage",
+  "children",
+  "chocolate",
+  "CLONE",
+  "cock",
+  "constriction",
+  "contrition",
+  "cop",
+  "corpse",
+  "cowboy",
+  "crabapple",
+  "craziness",
+  "cthulhu",
+  "Death",
+  "decepticon",
+  "deception",
+  "Decker",
+  "decoder",
+  "decoy",
+  "defenestration",
+  "democracy",
+  "dependency",
+  "despair",
+  "desperation",
+  "disease",
+  "disease",
+  "doberman",
+  "DOOM",
+  "dreams",
+  "dreams",
+  "drugs",
+  "easy",
+  "ebony",
+  "election",
+  "eloquence",
+  "emergency",
+  "eureka",
+  "excommunication",
+  "fat",
+  "fatherland",
+  "Faust",
+  "fear",
+  "fever",
+  "filth",
+  "flatulence",
+  "fluff",
+  "fnord",
+  "freedom",
+  "fruit",
+  "fruit",
+  "futility",
+  "gerbils",
+  "GOD",
+  "goggles",
+  "goobers",
+  "gorilla",
+  "halibut",
+  "handmaid",
+  "happiness",
+  "hate",
+  "helplessness",
+  "hemorrhoid",
+  "hermaphrodite",
+  "heroin",
+  "heroine",
+  "hope",
+  "hysteria",
+  "icepick",
+  "identity",
+  "ignorance",
+  "importance",
+  "individuality",
+  "inkling",
+  "insurrection",
+  "intoxicant",
+  "ire",
+  "irritant",
+  "jade",
+  "jaundice",
+  "Joyce",
+  "kidney stone",
+  "kitchenette",
+  "kiwi",
+  "lathe",
+  "lattice",
+  "lawyer",
+  "lemming",
+  "liquidation",
+  "lobbyist",
+  "love",
+  "lozenge",
+  "magazine",
+  "magnesium",
+  "malfunction",
+  "marmot",
+  "marshmallow",
+  "merit",
+  "merkin",
+  "mescaline",
+  "milk",
+  "mischief",
+  "mistrust",
+  "money",
+  "monkey",
+  "monkeybutter",
+  "nationalism",
+  "nature",
+  "neuron",
+  "noise",
+  "nomenclature",
+  "nutria",
+  "OBEY",
+  "ocelot",
+  "offspring",
+  "overseer",
+  "pain",
+  "pajamas",
+  "passenger",
+  "passion",
+  "Passover",
+  "peace",
+  "penance",
+  "persimmon",
+  "petticoat",
+  "pharmacist",
+  "PhD",
+  "pitchfork",
+  "plague",
+  "Poindexter",
+  "politician",
+  "pony",
+  "presidency",
+  "prison",
+  "prophecy",
+  "Prozac",
+  "punishment",
+  "punk rock",
+  "punk",
+  "pussy",
+  "quagmire",
+  "quarantine",
+  "quartz",
+  "rabies",
+  "radish",
+  "rage",
+  "readout",
+  "reality",
+  "rectum",
+  "reject",
+  "rejection",
+  "respect",
+  "revolution",
+  "roadrunner",
+  "rule",
+  "savor",
+  "scab",
+  "scalar",
+  "Scandinavia",
+  "schadenfreude",
+  "security",
+  "sediment",
+  "self worth",
+  "sickness",
+  "silicone",
+  "slack",
+  "slander",
+  "slavery",
+  "sledgehammer",
+  "smegma",
+  "smelly socks",
+  "sorrow",
+  "space program",
+  "stamen",
+  "standardization",
+  "stench",
+  "subculture",
+  "subversion",
+  "suffering",
+  "surrender",
+  "surveillance",
+  "synthesis",
+  "television",
+  "tenant",
+  "tendril",
+  "terror",
+  "terrorism",
+  "terrorist",
+  "the impossible",
+  "the unknown",
+  "toast",
+  "topography",
+  "truism",
+  "turgid",
+  "underbrush",
+  "underling",
+  "unguent",
+  "unusual",
+  "uplink",
+  "urge",
+  "valor",
+  "variance",
+  "vaudeville",
+  "vector",
+  "vegetarian",
+  "venom",
+  "verifiability",
+  "viagra",
+  "vibrator",
+  "victim",
+  "vignette",
+  "villainy",
+  "W.A.S.T.E.",
+  "wagon",
+  "waiver",
+  "warehouse",
+  "waste",
+  "waveform",
+  "whiffle ball",
+  "whorl",
+  "windmill",
+  "words",
+  "worm",
+  "worship",
+  "worship",
+  "Xanax",
+  "Xerxes",
+  "Xhosa",
+  "xylophone",
+  "yellow",
+  "yesterday",
+  "your nose",
+  "Zanzibar",
+  "zeal",
+  "zebra",
+  "zest",
+  "zinc"
 };
 
 #define WORD_COUNT (sizeof(words) / sizeof(char *))
 };
 
 #define WORD_COUNT (sizeof(words) / sizeof(char *))
@@ -785,10 +821,10 @@ int charToDigit (char c)
  * used in place of any non-digit character */
 void drawDigitChar (Bitmap *b, int x, int y, char c)
 {
  * used in place of any non-digit character */
 void drawDigitChar (Bitmap *b, int x, int y, char c)
 {
+  if (mode != BC_CLOCK24 &&
+      mode != BC_CLOCK12)
     if ((c < '0') || (c > '9'))
     if ((c < '0') || (c > '9'))
-    {
-       c = '0';
-    }
+      c = '0';
 
     bitmapDrawChar5x8 (b, x, y, c);
 }
 
     bitmapDrawChar5x8 (b, x, y, c);
 }
@@ -881,7 +917,8 @@ void drawUpcEanSupplementalBars (Bitmap *upcBitmap, char *digits,
        }
        default:
        {
        }
        default:
        {
-           printf("Bad supplement\n");
+           fprintf (stderr, "%s: bad supplement (%d digits)\n",
+                     progname, len);
            exit(1);
            break;
        }
            exit(1);
            break;
        }
@@ -1004,27 +1041,46 @@ void drawUpcEBars (Bitmap *upcBitmap, char *digits, int x, int y,
     int i;
     int parityPattern = upcELastDigit[charToDigit(digits[7])];
 
     int i;
     int parityPattern = upcELastDigit[charToDigit(digits[7])];
 
+    int clockp = (mode == BC_CLOCK12 || mode == BC_CLOCK24);
+
     if (digits[0] == '1')
     {
        parityPattern = ~parityPattern;
     }
 
     /* header */
     if (digits[0] == '1')
     {
        parityPattern = ~parityPattern;
     }
 
     /* header */
-    bitmapVlin (upcBitmap, x, y, guardY2);
+    bitmapVlin (upcBitmap, x,     y, guardY2);
     bitmapVlin (upcBitmap, x + 2, y, guardY2);
 
     /* trailer */
     bitmapVlin (upcBitmap, x + 2, y, guardY2);
 
     /* trailer */
-    bitmapVlin (upcBitmap, x + 46, y, guardY2);
-    bitmapVlin (upcBitmap, x + 48, y, guardY2);
-    bitmapVlin (upcBitmap, x + 50, y, guardY2);
+    bitmapVlin (upcBitmap, x + 46 + (clockp?8:0), y, guardY2);
+    bitmapVlin (upcBitmap, x + 48 + (clockp?8:0), y, guardY2);
+    bitmapVlin (upcBitmap, x + 50 + (clockp?8:0), y, guardY2);
+
+    /* clock kludge -- this draws an extra set of dividers after
+       digits 2 and 4.  This makes this *not* be a valid bar code,
+       but, it looks pretty for the clock display.
+     */
+    if (clockp)
+      {
+        bitmapVlin (upcBitmap, x + 18,     y, guardY2);
+        bitmapVlin (upcBitmap, x + 18 + 2, y, guardY2);
+
+        bitmapVlin (upcBitmap, x + 36,     y, guardY2);
+        bitmapVlin (upcBitmap, x + 36 + 2, y, guardY2);
+      }
 
     for (i = 0; i < 6; i++)
     {
        UpcSet lset = 
            (parityPattern & (1 << (5 - i))) ? UPC_LEFT_B : UPC_LEFT_A;
 
     for (i = 0; i < 6; i++)
     {
        UpcSet lset = 
            (parityPattern & (1 << (5 - i))) ? UPC_LEFT_B : UPC_LEFT_A;
-
+        int off = (clockp
+                   ? (i < 2 ? 0 :
+                      i < 4 ? 4 :      /* extra spacing for clock bars */
+                              8)
+                   : 0);
         drawUpcEanDigit (upcBitmap,
         drawUpcEanDigit (upcBitmap,
-                        x + 3 + i*7
+                        x + 3 + i*7 + off,
                         y,
                         barY2,
                         digits[i + 1], 
                         y,
                         barY2,
                         digits[i + 1], 
@@ -1381,7 +1437,8 @@ void processUpcEan (char *str, Bitmap *dest)
     }
     else
     {
     }
     else
     {
-       printf ("Invalid supplement (must be 2 or 5 digits)\n");
+       fprintf (stderr, "%s: invalid supplement (must be 2 or 5 digits)\n",
+                 progname);
        exit (1);
     }
 
        exit (1);
     }
 
@@ -1414,7 +1471,8 @@ void processUpcEan (char *str, Bitmap *dest)
        }
        default:
        {
        }
        default:
        {
-           printf("Bad barcode\n");
+           fprintf (stderr, "%s: bad barcode (%d digits)\n",
+                     progname, digitCount);
            exit(1);
        }
     }
            exit(1);
        }
     }
@@ -1464,6 +1522,7 @@ static void setup (void)
                                         display, xgwa.colormap);
     gcv.foreground = get_pixel_resource ("foreground", "Foreground",
                                         display, xgwa.colormap);
                                         display, xgwa.colormap);
     gcv.foreground = get_pixel_resource ("foreground", "Foreground",
                                         display, xgwa.colormap);
+    fg_pixel = gcv.foreground;
     theGC = XCreateGC (display, window, GCForeground|GCBackground, &gcv);
 
     theBitmap = makeBitmap(BARCODE_WIDTH * MAX_MAG, BARCODE_HEIGHT * MAX_MAG);
     theGC = XCreateGC (display, window, GCForeground|GCBackground, &gcv);
 
     theBitmap = makeBitmap(BARCODE_WIDTH * MAX_MAG, BARCODE_HEIGHT * MAX_MAG);
@@ -1687,6 +1746,100 @@ static void updateGrid (void)
 }
 
 
 }
 
 
+/* update the model for one iteration.
+   This one draws a clock.  By jwz.  */
+static void updateClock (void)
+{
+  Barcode *b = &barcodes[0];
+  int BW = 76 /* BARCODE_WIDTH  */;
+  int BH = BARCODE_HEIGHT;
+  int mag_x, mag_y;
+  int i;
+  time_t now = time ((time_t *) 0);
+  struct tm *tm = localtime (&now);
+  XWindowAttributes xgwa;
+  int ow = windowWidth;
+  int oh = windowHeight;
+
+  XGetWindowAttributes (display, window, &xgwa);
+  windowWidth = xgwa.width;
+  windowHeight = xgwa.height;
+
+  mag_x  = windowWidth  / BW;
+  mag_y  = windowHeight / BH;
+
+  barcode_count = 1;
+
+  b->mag = (mag_x < mag_y ? mag_x : mag_y);
+
+  if (b->mag > MAX_MAG) b->mag = MAX_MAG;
+  if (b->mag < 1) b->mag = 1;
+
+  b->x = (windowWidth  - (b->mag * BW      )) / 2;
+  b->y = (windowHeight - (b->mag * (BH + 9))) / 2;
+  b->pixel = fg_pixel;
+
+  if (!button_down_p)
+    sprintf (b->code, "0%02d%02d%02d?:",
+             (mode == BC_CLOCK24
+              ? tm->tm_hour
+              : (tm->tm_hour > 12
+                 ? tm->tm_hour - 12
+                 : (tm->tm_hour == 0
+                    ? 12
+                    : tm->tm_hour))),
+             tm->tm_min,
+             tm->tm_sec);
+  else
+    sprintf (b->code, "0%02d%02d%02d?:",
+             tm->tm_year % 100, tm->tm_mon+1, tm->tm_mday);
+
+  {
+    int vstart = 9;
+    int hh = BH + vstart;
+    char expandedDigits[13];
+
+    expandedDigits[0] = '\0';
+
+    expandToUpcADigits (b->code, expandedDigits);
+    if (expandedDigits[0] != '\0')
+      b->code[7] = expandedDigits[11];
+
+    bitmapClear (theBitmap);
+    drawUpcEBars (theBitmap, b->code, 6, 9, 59, 65);
+    for (i = 0; i < 6; i++)
+      {
+        int off = (i < 2 ? 0 :
+                   i < 4 ? 4 :
+                   8);
+        drawDigitChar (theBitmap, 11 + i*7 + off, hh - 16, b->code[i+1]);
+      }
+
+    if (!button_down_p)
+      {
+#if 0
+        char *days[] = { "SUN", "MON", "TUE", "WED", "THU", "FRI", "SAT" };
+        char *s = days[tm->tm_wday];
+        bitmapDrawString5x8 (theBitmap, (BW - strlen (s)*5) / 2, 0, s);
+#endif
+        drawDigitChar (theBitmap,  0, hh - 23, (tm->tm_hour < 12 ? 'A' : 'P'));
+        drawDigitChar (theBitmap, 68, hh - 23, 'M');
+      }
+    else
+      {
+        char s[20];
+        sprintf (s, "%03d", tm->tm_yday);
+        bitmapDrawString5x8 (theBitmap, (BW - strlen (s)*5) / 2, 0, s);
+      }
+  }
+
+  bitmapScale (b->bitmap, theBitmap, b->mag);
+
+  if (ow != windowWidth || oh != windowHeight)
+    XClearWindow (display, window);
+}
+
+
 
 /* render and display the current model */
 static void renderFrame (void)
 
 /* render and display the current model */
 static void renderFrame (void)
@@ -1715,14 +1868,35 @@ static void renderFrame (void)
 /* do one iteration */
 static void oneIteration (void)
 {
 /* do one iteration */
 static void oneIteration (void)
 {
-    if (scroll_p)
+    if (mode == BC_SCROLL)
       scrollModel ();
       scrollModel ();
-    else
+    else if (mode == BC_GRID)
       updateGrid ();
       updateGrid ();
+    else if (mode == BC_CLOCK12 || mode == BC_CLOCK24)
+      updateClock ();
+    else
+      abort();
+
     renderFrame ();
 }
 
 
     renderFrame ();
 }
 
 
+static void barcode_handle_events (Display *dpy)
+{
+  int clockp = (mode == BC_CLOCK12 || mode == BC_CLOCK24);
+  while (XPending (dpy))
+    {
+      XEvent event;
+      XNextEvent (dpy, &event);
+      if (clockp && event.xany.type == ButtonPress)
+        button_down_p = True;
+      else if (clockp && event.xany.type == ButtonRelease)
+        button_down_p = False;
+      else
+        screenhack_handle_event (dpy, &event);
+    }
+}
+
 
 /* main and options and stuff */
 
 
 /* main and options and stuff */
 
@@ -1730,13 +1904,18 @@ char *progclass = "Barcode";
 
 char *defaults [] = {
     ".background:      black",
 
 char *defaults [] = {
     ".background:      black",
-    ".foreground:      white",
+    ".foreground:      green",
     "*delay:           10000",
     0
 };
 
 XrmOptionDescRec options [] = {
   { "-delay",            ".delay",          XrmoptionSepArg, 0 },
     "*delay:           10000",
     0
 };
 
 XrmOptionDescRec options [] = {
   { "-delay",            ".delay",          XrmoptionSepArg, 0 },
+  { "-scroll",           ".mode",           XrmoptionNoArg, "scroll"  },
+  { "-grid",             ".mode",           XrmoptionNoArg, "grid"    },
+  { "-clock",            ".mode",           XrmoptionNoArg, "clock"   },
+  { "-clock12",          ".mode",           XrmoptionNoArg, "clock12" },
+  { "-clock24",          ".mode",           XrmoptionNoArg, "clock24" },
   { 0, 0, 0, 0 }
 };
 
   { 0, 0, 0, 0 }
 };
 
@@ -1744,15 +1923,34 @@ XrmOptionDescRec options [] = {
 static void initParams (void)
 {
     int problems = 0;
 static void initParams (void)
 {
     int problems = 0;
+    char *s;
 
     delay = get_integer_resource ("delay", "Delay");
     if (delay < 0)
     {
 
     delay = get_integer_resource ("delay", "Delay");
     if (delay < 0)
     {
-       fprintf (stderr, "error: delay must be at least 0\n");
+       fprintf (stderr, "%s: delay must be at least 0\n", progname);
        problems = 1;
     }
 
        problems = 1;
     }
 
-    scroll_p = 1;
+    s = get_string_resource ("mode", "Mode");
+    if (!s || !*s || !strcasecmp (s, "scroll"))
+      mode = BC_SCROLL;
+    else if (!strcasecmp (s, "grid"))
+      mode = BC_GRID;
+    else if (!strcasecmp (s, "clock") ||
+             !strcasecmp (s, "clock12"))
+      mode = BC_CLOCK12;
+    else if (!strcasecmp (s, "clock24"))
+      mode = BC_CLOCK24;
+    else
+      {
+       fprintf (stderr, "%s: unknown mode \"%s\"\n", progname, s);
+       problems = 1;
+      }
+    free (s);
+
+    if (mode == BC_CLOCK12 || mode == BC_CLOCK24)
+      delay = 10000;  /* only update every 1/10th second */
 
     if (problems)
     {
 
     if (problems)
     {
@@ -1774,7 +1972,7 @@ void screenhack (Display *dpy, Window win)
     {
        oneIteration ();
         XSync (dpy, False);
     {
        oneIteration ();
         XSync (dpy, False);
-        screenhack_handle_events (dpy);
+        barcode_handle_events (dpy);
        usleep (delay);
     }
 }
        usleep (delay);
     }
 }
index f5e3f37bdc38d9bf8ec7a80c27fa55cb76a0dde2..4c3c4762addcfd6fe8a40467ada07847f64c0536 100644 (file)
@@ -8,6 +8,8 @@ barcode - draws a random sequence of barcodes for the products you enjoy
 [\-window]
 [\-root]
 [\-delay \fInumber\fP]
 [\-window]
 [\-root]
 [\-delay \fInumber\fP]
+[\-clock]
+[\-clock24]
 .SH DESCRIPTION
 This draws a random sequence of colorful barcodes scrolling across your
 screen.
 .SH DESCRIPTION
 This draws a random sequence of colorful barcodes scrolling across your
 screen.
@@ -25,6 +27,12 @@ Draw on the root window.
 .TP 8
 .B \-delay \fInumber\fP
 Per-frame delay, in microseconds.  Default: 10000 (0.02 seconds.).
 .TP 8
 .B \-delay \fInumber\fP
 Per-frame delay, in microseconds.  Default: 10000 (0.02 seconds.).
+.TP 8
+.B \-clock
+Instead of drawing a stream of barcodes, draw a barcode-based digital clock.
+.TP 8
+.B \-clock24
+Same as \fI\-clock\fP, but display 24-hour time instead of 12-hour time.
 .SH ENVIRONMENT
 .PP
 .TP 8
 .SH ENVIRONMENT
 .PP
 .TP 8
index 137c2c3b691ff3739dac57f988e75179e9ae701e..cd28741c4c0870b23051883aed120e62aa609da7 100644 (file)
@@ -70,6 +70,7 @@ $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) PENROSE.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) PETRI.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) PHOSPHOR.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) PENROSE.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) PETRI.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) PHOSPHOR.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) PIECEWISE.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) POLYOMINOES.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) POPSQUARES.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) PYRO.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) POLYOMINOES.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) POPSQUARES.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) PYRO.C
index 137c2c3b691ff3739dac57f988e75179e9ae701e..cd28741c4c0870b23051883aed120e62aa609da7 100644 (file)
@@ -70,6 +70,7 @@ $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) PENROSE.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) PETRI.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) PHOSPHOR.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) PENROSE.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) PETRI.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) PHOSPHOR.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) PIECEWISE.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) POLYOMINOES.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) POPSQUARES.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) PYRO.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) POLYOMINOES.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) POPSQUARES.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) PYRO.C
index 00b5c31b5ce74ca0db7462cb9b6070048e214146..ed40340c2c262cd2d2366e1d0a88bfc36d06eebb 100644 (file)
@@ -4,8 +4,8 @@
             a screen saver and locker for the X window system
                             by Jamie Zawinski
 
             a screen saver and locker for the X window system
                             by Jamie Zawinski
 
-                              version 4.07
-                               03-Feb-2003
+                              version 4.08
+                               18-Feb-2003
 
                      http://www.jwz.org/xscreensaver/
 
 
                      http://www.jwz.org/xscreensaver/
 
diff --git a/hacks/config/atunnel.xml b/hacks/config/atunnel.xml
new file mode 100644 (file)
index 0000000..55f31f0
--- /dev/null
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="atunnel" _label="Atunnel">
+
+  <command arg="-root"/>
+
+  <number id="speed" type="slider" arg="-delay %"
+          _label="Speed" _low-label="Slow" _high-label="Fast"
+          low="0" high="20000" default="10000"
+          convert="invert"/>
+
+  <select id="render">
+    <option id="normal" _label="Normal"/>
+    <option id="solid" _label="Untextured" arg-set="-no-texture"/>
+    <option id="wire"  _label="Wireframe" arg-set="-wire"/>
+  </select>
+
+  <boolean id="light" _label="Use light" arg-set="-light"/>
+
+  <boolean id="showfps" _label="Show Frames-per-Second" arg-set="-fps"/>
+
+  <_description>
+Draws an animation of a textured tunnel in GL.
+Requires OpenGL, and a machine with fast hardware support for texture maps.
+
+Written by Eric Lassauge and Roman Podobedov.
+  </_description>
+</screensaver>
index ef40693129ad92b3684344837b5aa4d0d404c03b..f568131e0fe1e8c1fc386bcd2f4e2aa7559880f2 100644 (file)
@@ -4,6 +4,12 @@
 
   <command arg="-root"/>
 
 
   <command arg="-root"/>
 
+  <select id="mode">
+    <option id="scroll"  _label="Scrolling Barcodes"/>
+    <option id="clock12" _label="Barcode Clock (AM/PM)"   arg-set="-clock12"/>
+    <option id="clock24" _label="Barcode Clock (24 Hour)" arg-set="-clock24"/>
+  </select>
+
   <number id="speed" type="slider" arg="-delay %"
           _label="Speed" _low-label="Slow" _high-label="Fast"
           low="0" high="20000" default="10000"
   <number id="speed" type="slider" arg="-delay %"
           _label="Speed" _low-label="Slow" _high-label="Fast"
           low="0" high="20000" default="10000"
index 2a9afe7028fe445d4b75e9d5a3540019ab6d93bc..1510e99d8d32b1ae929d9661d583010a80cee3d9 100644 (file)
@@ -32,6 +32,6 @@ This takes an image and makes it melt.  You've no doubt seen this
 effect before, but no screensaver would really be complete without it.
 It works best if there's something colorful visible.  Warning, if the
 effect continues after the screen saver is off, seek medical attention.
 effect before, but no screensaver would really be complete without it.
 It works best if there's something colorful visible.  Warning, if the
 effect continues after the screen saver is off, seek medical attention.
-Written by David Wald and Vivek Khera.
+Written by David Wald, Vivek Khera, Jamie Zawinski, and Vince Levey.
   </_description>
 </screensaver>
   </_description>
 </screensaver>
index fb01c2f6420f4afb6b3d258939b9ba219e24bd96..77e555c578f2e2798aff96703495d0d2b45462fe 100644 (file)
           low="3" high="200" default="25"/>
 
   <number id="gravity" type="slider" arg="-gravity %"
           low="3" high="200" default="25"/>
 
   <number id="gravity" type="slider" arg="-gravity %"
-           _label="Gravity" _low-label="Freefall" _high-label="Jupiter"
+           _label="Gravity" _low-label="      Freefall" _high-label="Jupiter"
           low="0.0" high="0.1" default="0.01"/>
 
   <number id="wind" type="slider" arg="-wind %"
            _label="Wind" _low-label="Still" _high-label="Hurricane"
           low="0.0" high="0.1" default="0.00"/>
 
           low="0.0" high="0.1" default="0.01"/>
 
   <number id="wind" type="slider" arg="-wind %"
            _label="Wind" _low-label="Still" _high-label="Hurricane"
           low="0.0" high="0.1" default="0.00"/>
 
-  <number id="friction" type="slider" arg="-friction %"
-           _label="Friction" _low-label="Glass" _high-label="Sandpaper"
-          low="0.0" high="4.0" default="0.8"/>
+  <number id="elasticity" type="slider" arg="-elasticity %"
+           _label="Friction" _low-label="Clay" _high-label="Rubber"
+          low="0.2" high="1.0" default="0.97"/>
 
   <number id="speed" type="slider" arg="-delay %"
           _label="Speed" _low-label="Slow" _high-label="Fast"
 
   <number id="speed" type="slider" arg="-delay %"
           _label="Speed" _low-label="Slow" _high-label="Fast"
diff --git a/hacks/config/piecewise.xml b/hacks/config/piecewise.xml
new file mode 100644 (file)
index 0000000..8475295
--- /dev/null
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="piecewise" _label="Piecewise">
+
+  <command arg="-root"/>
+
+  <number id="speed" type="slider" arg="-delay %"
+          _label="Speed" _low-label="Slow" _high-label="Fast"
+          low="0" high="20000" default="5000"
+          convert="invert"/>
+
+  <number id="count" type="spinbutton" arg="-count %"
+          _label="Count" low="4" high="100" default="32"/>
+
+  <number id="colorspeed" type="slider" arg="-colorspeed %"
+          _label="Color shifting speed" _low-label="Slow" _high-label="Fast"
+          low="0" high="100" default="10"/>
+
+  <number id="minradius" type="slider" arg="-minradius %"
+          _label="Minimum radius" _low-label="Small" _high-label="Large"
+          low="0.01" high="0.5" default="0.05"/>
+
+  <number id="maxradius" type="slider" arg="-maxradius %"
+          _label="Maximum radius" _low-label="Small" _high-label="Large"
+          low="0.01" high="0.5" default="0.2"/>
+
+  <boolean id="db" _label="Double Buffer" arg-unset="-no-db"/>
+
+  <_description>
+This draws a bunch of moving circles which switch from visibility to
+invisibility at intersection points.  Written by Geoffrey Irving.
+  </_description>
+</screensaver>
index b72311ecb9f4e81e73c77934f81b83edd8e56228..15db088e41d21295fc26bf02f41b93ab0ca306ac 100644 (file)
@@ -14,8 +14,7 @@
 
   <number id="segments" type="slider" arg="-segments %"
           _label="Segments" _low-label="Few" _high-label="Many"
 
   <number id="segments" type="slider" arg="-segments %"
           _label="Segments" _low-label="Few" _high-label="Many"
-          low="10" high="500" default="50"
-          convert="invert"/>
+          low="10" high="500" default="50"/>
 
   <number id="spread" type="slider" arg="-spread %"
           _label="Density" _low-label="Sparse" _high-label="Dense"
 
   <number id="spread" type="slider" arg="-spread %"
           _label="Density" _low-label="Sparse" _high-label="Dense"
index c99344778abe10b7ccddb2708ee0ba770c40e797..4f9c1e69d7ef456209d62b18c123c0224f0baa2c 100644 (file)
@@ -18,10 +18,9 @@ vary.
 SSystem was once available at &lt;http://www1.las.es/~amil/ssystem/&gt;,
 but is now gone.  You may still be able to find copies elsewhere.
 
 SSystem was once available at &lt;http://www1.las.es/~amil/ssystem/&gt;,
 but is now gone.  You may still be able to find copies elsewhere.
 
-SSystem has since evolved into two different programs: OpenUniverse
-(http://openuniverse.sourceforge.net/) and Celestia
-(http://www.shatters.net/celestia/).  Sadly, neither of these programs
-work with xscreensaver at all.  You are encouraged to nag their authors
-into adding xscreensaver support!
+SSystem has since evolved into Celestia, found at
+&lt;http://www.shatters.net/celestia/&gt;.  Sadly, Celestia does not work
+with xscreensaver at all.  You are encouraged to nag the authors into
+adding xscreensaver support!
   </_description>
 </screensaver>
   </_description>
 </screensaver>
index 2c9af43639e8a534afa28b7d1be695df85b8bd6b..fe1477bd5ef98895b7fa7ebe4c70e5fe941a0a40 100644 (file)
@@ -73,5 +73,6 @@ 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.
 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 jwz, 28-Nov-1997.
 Modified by Rick Schultz <rick@skapunx.net> 05-Apr-1999.
 Modified by Rick Schultz <rick@skapunx.net> 05-Apr-1999.
+Modified by Vince Levey <vincel@vincel.org> 25-Oct-2001.
index b60e4395788b756ff44596461c4010cb83d0d1ff..3413a945d510145763c9bbe59f1f15f51bbcf8b8 100644 (file)
  * Ported to X11 and xscreensaver by jwz, 27-Feb-2002.
  *
  * http://astronomy.swin.edu.au/~pbourke/modelling/fluid/
  * Ported to X11 and xscreensaver by jwz, 27-Feb-2002.
  *
  * http://astronomy.swin.edu.au/~pbourke/modelling/fluid/
+ *
+ * Some physics improvements by Steven Barker <steve@blckknght.org>
  */
 
  */
 
-/* cjb notes
- *
- * Future ideas:
+/* Future ideas:
  * Specifying a distribution in the ball sizes (with a gamma curve, possibly).
  * Brownian motion, for that extra touch of realism.
  * Specifying a distribution in the ball sizes (with a gamma curve, possibly).
  * Brownian motion, for that extra touch of realism.
+ *
+ * It would be nice to detect when there are more balls than fit in
+ * the window, and scale the number of balls back.  Useful for the
+ * xscreensaver-demo preview, which is often too tight by default.
  */
 
 #include <math.h>
  */
 
 #include <math.h>
@@ -60,7 +64,7 @@ typedef struct {
   float *r;            /* ball radiuses */
 
   float *m;            /* ball mass, precalculated */
   float *r;            /* ball radiuses */
 
   float *m;            /* ball mass, precalculated */
-  float e;             /* coefficient of friction, I think? */
+  float e;             /* coeficient of elasticity */
   float max_radius;    /* largest radius of any ball */
 
   Bool random_sizes_p;  /* Whether balls should be various sizes up to max. */
   float max_radius;    /* largest radius of any ball */
 
   Bool random_sizes_p;  /* Whether balls should be various sizes up to max. */
@@ -312,7 +316,7 @@ init_balls (Display *dpy, Window window)
   state->accy = get_float_resource ("gravity", "Gravity");
   if (state->accy < -1.0 || state->accy > 1.0) state->accy = 0.01;
 
   state->accy = get_float_resource ("gravity", "Gravity");
   if (state->accy < -1.0 || state->accy > 1.0) state->accy = 0.01;
 
-  state->e = get_float_resource ("friction", "Friction");
+  state->e = get_float_resource ("elasticity", "Elacitcity");
   if (state->e < 0.2 || state->e > 1.0) state->e = 0.97;
 
   state->tc = get_float_resource ("timeScale", "TimeScale");
   if (state->e < 0.2 || state->e > 1.0) state->e = 0.97;
 
   state->tc = get_float_resource ("timeScale", "TimeScale");
@@ -556,7 +560,7 @@ update_balls (b_state *state)
 {
   int a, b;
   float d, vxa, vya, vxb, vyb, dd, cdx, cdy;
 {
   int a, b;
   float d, vxa, vya, vxb, vyb, dd, cdx, cdy;
-  float ma, mb, vela, velb, vela1, velb1;
+  float ma, mb, vca, vcb, dva, dvb;
   float dee2;
 
   check_window_moved (state);
   float dee2;
 
   check_window_moved (state);
@@ -580,71 +584,69 @@ update_balls (b_state *state)
     }
 
   /* For each ball, compute the influence of every other ball. */
     }
 
   /* For each ball, compute the influence of every other ball. */
-  for (a=1; a <= state->count; a++)
-    if (a != state->mouse_ball)
-      for (b=1; b <= state->count; b++)
-        if (a != b)
-          {
-            d = ((state->px[a] - state->px[b]) *
-                 (state->px[a] - state->px[b]) +
-                 (state->py[a] - state->py[b]) *
-                 (state->py[a] - state->py[b]));
-           dee2 = (state->r[a] + state->r[b]) *
-                  (state->r[a] + state->r[b]);
-            if (d < dee2)
-              {
-                state->collision_count++;
-                d = sqrt(d);
-               dd = state->r[a] + state->r[b] - d;
-               /* A pair of balls that have already collided in this
-                * current frame (and therefore touching each other)
-                * should not have another collision calculated, hence
-                * the fallthru if "dd ~= 0.0".
-                */
-               if ((dd < -0.01) || (dd > 0.01))
-                 {
-                    cdx = (state->px[b] - state->px[a]) / d;
-                    cdy = (state->py[b] - state->py[a]) / d;
-
-                   /* Move each ball apart from the other by half the
-                    * 'collision' distance.
-                    */
-                    state->px[a] -= 0.5 * dd * cdx;
-                    state->py[a] -= 0.5 * dd * cdy;
-                    state->px[b] += 0.5 * dd * cdx;
-                    state->py[b] += 0.5 * dd * cdy;
-
-                   ma = state->m[a];
-                   mb = state->m[b];
-                   vxa = state->vx[a];
-                   vya = state->vy[a];
-                   vxb = state->vx[b];
-                   vyb = state->vy[b];
-
-                   vela = sqrt((vxa * vxa) + (vya * vya));
-                   velb = sqrt((vxb * vxb) + (vyb * vyb));
-
-                   vela1 = vela * ((ma - mb) / (ma + mb)) +
-                           velb * ((2 * mb) / (ma + mb));
-                   velb1 = vela * ((2 * ma) / (ma + mb)) +
-                           velb * ((mb - ma) / (ma + mb));
-
-                   vela1 *= state->e; /* "air resistance" */
-                   velb1 *= state->e;
+  for (a=1; a <= state->count -  1; a++)
+    for (b=a + 1; b <= state->count; b++)
+      {
+         d = ((state->px[a] - state->px[b]) *
+              (state->px[a] - state->px[b]) +
+              (state->py[a] - state->py[b]) *
+              (state->py[a] - state->py[b]));
+         dee2 = (state->r[a] + state->r[b]) *
+                (state->r[a] + state->r[b]);
+         if (d < dee2)
+         {
+            state->collision_count++;
+            d = sqrt(d);
+            dd = state->r[a] + state->r[b] - d;
+
+            cdx = (state->px[b] - state->px[a]) / d;
+            cdy = (state->py[b] - state->py[a]) / d;
+
+            /* Move each ball apart from the other by half the
+             * 'collision' distance.
+             */
+            state->px[a] -= 0.5 * dd * cdx;
+            state->py[a] -= 0.5 * dd * cdy;
+            state->px[b] += 0.5 * dd * cdx;
+            state->py[b] += 0.5 * dd * cdy;
+
+            ma = state->m[a];
+            mb = state->m[b];
+
+            vxa = state->vx[a];
+            vya = state->vy[a];
+            vxb = state->vx[b];
+            vyb = state->vy[b];
+
+            vca = vxa * cdx + vya * cdy; /* the component of each velocity */
+            vcb = vxb * cdx + vyb * cdy; /* along the axis of the collision */
+
+            /* elastic collison */
+            dva = (vca * (ma - mb) + vcb * 2 * mb) / (ma + mb) - vca;
+            dvb = (vcb * (mb - ma) + vca * 2 * ma) / (ma + mb) - vcb;
+
+            dva *= state->e; /* some energy lost to inelasticity */
+            dvb *= state->e;
+
 #if 0
 #if 0
-                   vela1 += (frand (50) - 25) / ma; /* brownian motion */
-                   velb1 += (frand (50) - 25) / mb;
+            dva += (frand (50) - 25) / ma;   /* q: why are elves so chaotic? */
+            dvb += (frand (50) - 25) / mb;   /* a: brownian motion. */
 #endif
 #endif
-                   state->vx[a] = -cdx * vela1;
-                   state->vy[a] = -cdy * vela1;
-                   state->vx[b] = cdx * velb1;
-                   state->vy[b] = cdy * velb1;
-                  }
-              }
-          }
 
 
-  /* Force all balls to be on screen.
-   */
+            vxa += dva * cdx;
+            vya += dva * cdy;
+            vxb += dvb * cdx;
+            vyb += dvb * cdy;
+
+            state->vx[a] = vxa;
+            state->vy[a] = vya;
+            state->vx[b] = vxb;
+            state->vy[b] = vyb;
+         }
+      }
+
+   /* Force all balls to be on screen.
+    */
   for (a=1; a <= state->count; a++)
     {
       if (state->px[a] <= (state->xmin + state->r[a]))
   for (a=1; a <= state->count; a++)
     {
       if (state->px[a] <= (state->xmin + state->r[a]))
@@ -743,7 +745,7 @@ char *defaults [] = {
   "*random:            True",
   "*gravity:           0.01",
   "*wind:              0.00",
   "*random:            True",
   "*gravity:           0.01",
   "*wind:              0.00",
-  "*friction:          0.8",
+  "*elasticity:                0.97",
   "*timeScale:         1.0",
   "*doFPS:             False",
   "*shake:             True",
   "*timeScale:         1.0",
   "*doFPS:             False",
   "*shake:             True",
@@ -763,7 +765,7 @@ XrmOptionDescRec options [] = {
   { "-count",          ".count",       XrmoptionSepArg, 0 },
   { "-gravity",                ".gravity",     XrmoptionSepArg, 0 },
   { "-wind",           ".wind",        XrmoptionSepArg, 0 },
   { "-count",          ".count",       XrmoptionSepArg, 0 },
   { "-gravity",                ".gravity",     XrmoptionSepArg, 0 },
   { "-wind",           ".wind",        XrmoptionSepArg, 0 },
-  { "-friction",       ".friction",    XrmoptionSepArg, 0 },
+  { "-elasticity",     ".elasticity",  XrmoptionSepArg, 0 },
   { "-fps",            ".doFPS",       XrmoptionNoArg, "True" },
   { "-no-fps",         ".doFPS",       XrmoptionNoArg, "False" },
   { "-shake",          ".shake",       XrmoptionNoArg, "True" },
   { "-fps",            ".doFPS",       XrmoptionNoArg, "True" },
   { "-no-fps",         ".doFPS",       XrmoptionNoArg, "False" },
   { "-shake",          ".shake",       XrmoptionNoArg, "True" },
index 5e06b89f0dc17d60c79ee82ac490d6df212a1a65..b5bd25217e339163a60114b28f3afe7dc8fe3bd3 100644 (file)
@@ -11,7 +11,7 @@ fluidballs - the physics of bouncing balls.
 [\-size \fInumber\fP]
 [\-gravity \fInumber\fP]
 [\-wind \fInumber\fP]
 [\-size \fInumber\fP]
 [\-gravity \fInumber\fP]
 [\-wind \fInumber\fP]
-[\-friction \fInumber\fP]
+[\-elasticity \fInumber\fP]
 [\-delay \fInumber\fP]
 [\-nonrandom]
 [\-no-shake]
 [\-delay \fInumber\fP]
 [\-nonrandom]
 [\-no-shake]
@@ -45,8 +45,9 @@ Coefficient of gravity.  Useful values are < 0.1.  Default: 0.01.
 .B \-wind \fInumber\fP
 Wind.  Useful values are < 0.1.  Default: 0.00.
 .TP 8
 .B \-wind \fInumber\fP
 Wind.  Useful values are < 0.1.  Default: 0.00.
 .TP 8
-.B \-friction \fInumber\fP
-Coefficient of friction (or viscosity.)  Useful values are < 4.  Default: 0.8.
+.B \-elasticity \fInumber\fP
+Coefficient of elasticity.  Useful values are 0.2 to 1.0.  Default: 0.97.
+Lower numbers make less bouncy balls.
 .TP 8
 .B \-delay \fInumber\fP
 Per-frame delay, in microseconds.  Default: 10000 (0.01 seconds.).
 .TP 8
 .B \-delay \fInumber\fP
 Per-frame delay, in microseconds.  Default: 10000 (0.01 seconds.).
@@ -85,5 +86,5 @@ 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
 this software for any purpose.  It is provided "as is" without express
 or implied warranty.
 .SH AUTHOR
-Peter Birtles and Jamie Zawinski.
+Peter Birtles, Jamie Zawinski, and Steven Barker.
 
 
index 48382559afb98773cbe580eac8d45e0402fbf239..0412501597b4f658cde142bbee2523b6420c5d68 100644 (file)
@@ -87,7 +87,7 @@ SRCS          = xscreensaver-gl-helper.c \
                  cubenetic.c spheremonics.c marching.c lavalite.c rotator.c \
                  trackball.c gltrackball.c queens.c endgame.c chessmodels.c \
                  glblur.c gllist.c flurry.c flurry-smoke.c flurry-spark.c \
                  cubenetic.c spheremonics.c marching.c lavalite.c rotator.c \
                  trackball.c gltrackball.c queens.c endgame.c chessmodels.c \
                  glblur.c gllist.c flurry.c flurry-smoke.c flurry-spark.c \
-                 flurry-star.c flurry-texture.c
+                 flurry-star.c flurry-texture.c atunnel.c tunnel_draw.c
 
 OBJS           = xscreensaver-gl-helper.o \
                  atlantis.o b_draw.o b_lockglue.o b_sphere.o bubble3d.o \
 
 OBJS           = xscreensaver-gl-helper.o \
                  atlantis.o b_draw.o b_lockglue.o b_sphere.o bubble3d.o \
@@ -107,14 +107,14 @@ OBJS              = xscreensaver-gl-helper.o \
                  cubenetic.o spheremonics.o marching.o lavalite.o rotator.o \
                  trackball.o gltrackball.o queens.o endgame.o chessmodels.o \
                  glblur.o gllist.o flurry.o flurry-smoke.o flurry-spark.o \
                  cubenetic.o spheremonics.o marching.o lavalite.o rotator.o \
                  trackball.o gltrackball.o queens.o endgame.o chessmodels.o \
                  glblur.o gllist.o flurry.o flurry-smoke.o flurry-spark.o \
-                 flurry-star.o flurry-texture.o
+                 flurry-star.o flurry-texture.o atunnel.o tunnel_draw.o
 
 GL_EXES                = cage gears moebius pipes sproingies stairs superquadrics \
                  morph3d rubik atlantis lament bubble3d glplanet pulsar \
                  sierpinski3d gflux stonerview starwars gltext molecule \
                  dangerball circuit menger engine flipscreen3d glsnake boxed \
                  glforestfire sballs cubenetic spheremonics lavalite queens \
 
 GL_EXES                = cage gears moebius pipes sproingies stairs superquadrics \
                  morph3d rubik atlantis lament bubble3d glplanet pulsar \
                  sierpinski3d gflux stonerview starwars gltext molecule \
                  dangerball circuit menger engine flipscreen3d glsnake boxed \
                  glforestfire sballs cubenetic spheremonics lavalite queens \
-                 endgame glblur flurry
+                 endgame glblur flurry atunnel
 GLE_EXES       = extrusion
 GL_UTIL_EXES   = xscreensaver-gl-helper
 HACK_EXES      = @GL_EXES@ @GLE_EXES@
 GLE_EXES       = extrusion
 GL_UTIL_EXES   = xscreensaver-gl-helper
 HACK_EXES      = @GL_EXES@ @GLE_EXES@
@@ -131,7 +131,7 @@ HDRS                = atlantis.h bubble3d.h buildlwo.h e_textures.h xpm-ximage.h \
                  grab-ximage.h font-ximage.h tube.h sphere.h boxed.h \
                  stonerview-move.h stonerview-osc.h glutstroke.h \
                  glut_roman.h marching.h rotator.h trackball.h gltrackball.h \
                  grab-ximage.h font-ximage.h tube.h sphere.h boxed.h \
                  stonerview-move.h stonerview-osc.h glutstroke.h \
                  glut_roman.h marching.h rotator.h trackball.h gltrackball.h \
-                 chessmodels.h chessgames.h gllist.h flurry.h
+                 chessmodels.h chessgames.h gllist.h flurry.h tunnel_draw.h
 GL_MEN         = atlantis.man boxed.man bubble3d.man cage.man circuit.man \
                  cubenetic.man dangerball.man engine.man extrusion.man \
                  flipscreen3d.man gears.man gflux.man glforestfire.man \
 GL_MEN         = atlantis.man boxed.man bubble3d.man cage.man circuit.man \
                  cubenetic.man dangerball.man engine.man extrusion.man \
                  flipscreen3d.man gears.man gflux.man glforestfire.man \
@@ -140,7 +140,7 @@ GL_MEN              = atlantis.man boxed.man bubble3d.man cage.man circuit.man \
                  pulsar.man queens.man rubik.man sballs.man sierpinski3d.man \
                  spheremonics.man sproingies.man stairs.man starwars.man \
                  stonerview.man superquadrics.man xscreensaver-gl-helper.man \
                  pulsar.man queens.man rubik.man sballs.man sierpinski3d.man \
                  spheremonics.man sproingies.man stairs.man starwars.man \
                  stonerview.man superquadrics.man xscreensaver-gl-helper.man \
-                 endgame.man flurry.man glblur.man
+                 endgame.man flurry.man glblur.man atunnel.man
 MEN            = @GL_MEN@
 EXTRAS         = README Makefile.in
 
 MEN            = @GL_MEN@
 EXTRAS         = README Makefile.in
 
@@ -359,11 +359,15 @@ 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)
 
 atlantis:      atlantis.o      $(ATLANTIS_OBJS)
        $(CC_HACK) -o $@ $@.o   $(ATLANTIS_OBJS) $(HACK_LIBS) $(XPM_LIBS)
 
+ATUNNEL_OBJS = $(HACK_OBJS) tunnel_draw.o xpm-ximage.o
+atunnel:       atunnel.o $(ATUNNEL_OBJS)
+       $(CC_HACK) -o $@ $@.o   $(ATUNNEL_OBJS) $(HACK_LIBS) $(XPM_LIBS)
+
 cage:          cage.o          $(HACK_OBJS)
        $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(HACK_LIBS)
 
 FLURRY_OBJS_1 = flurry-smoke.o flurry-spark.o flurry-star.o flurry-texture.o
 cage:          cage.o          $(HACK_OBJS)
        $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(HACK_LIBS)
 
 FLURRY_OBJS_1 = flurry-smoke.o flurry-spark.o flurry-star.o flurry-texture.o
-FLURRY_OBJS = $(FLURRY_OBJS_1) $(HACK_OBJS) $(TRACK_OBJS)
+FLURRY_OBJS = $(FLURRY_OBJS_1) $(HACK_OBJS)
 
 flurry:                flurry.o $(FLURRY_OBJS)
        $(CC_HACK) -o $@ $@.o   $(FLURRY_OBJS) $(HACK_LIBS) -lm
 
 flurry:                flurry.o $(FLURRY_OBJS)
        $(CC_HACK) -o $@ $@.o   $(FLURRY_OBJS) $(HACK_LIBS) -lm
@@ -511,6 +515,12 @@ atlantis.o: $(srcdir)/atlantis.h
 atlantis.o: ../../config.h
 atlantis.o: $(HACK_SRC)/images/sea-texture.xpm
 atlantis.o: $(srcdir)/xpm-ximage.h
 atlantis.o: ../../config.h
 atlantis.o: $(HACK_SRC)/images/sea-texture.xpm
 atlantis.o: $(srcdir)/xpm-ximage.h
+atunnel.o: ../../config.h
+atunnel.o: $(HACK_SRC)/images/tunnel0.xpm
+atunnel.o: $(HACK_SRC)/images/tunnel1.xpm
+atunnel.o: $(HACK_SRC)/images/tunnel2.xpm
+atunnel.o: $(srcdir)/tunnel_draw.h
+atunnel.o: $(srcdir)/xpm-ximage.h
 b_draw.o: $(srcdir)/bubble3d.h
 b_draw.o: ../../config.h
 b_lockglue.o: $(srcdir)/bubble3d.h
 b_draw.o: $(srcdir)/bubble3d.h
 b_draw.o: ../../config.h
 b_lockglue.o: $(srcdir)/bubble3d.h
@@ -687,6 +697,8 @@ trackball.o: ../../config.h
 trackball.o: $(srcdir)/trackball.h
 tube.o: ../../config.h
 tube.o: $(srcdir)/tube.h
 trackball.o: $(srcdir)/trackball.h
 tube.o: ../../config.h
 tube.o: $(srcdir)/tube.h
+tunnel_draw.o: ../../config.h
+tunnel_draw.o: $(srcdir)/tunnel_draw.h
 whale.o: $(srcdir)/atlantis.h
 xlock-gl.o: ../../config.h
 xpm-ximage.o: ../../config.h
 whale.o: $(srcdir)/atlantis.h
 xlock-gl.o: ../../config.h
 xpm-ximage.o: ../../config.h
diff --git a/hacks/glx/atunnel.c b/hacks/glx/atunnel.c
new file mode 100644 (file)
index 0000000..74a64b5
--- /dev/null
@@ -0,0 +1,308 @@
+/* -*- Mode: C; tab-width: 4 -*- */
+/* atunnels --- OpenGL Advanced Tunnel Screensaver */
+
+#if !defined( lint ) && !defined( SABER )
+static const char sccsid[] = "@(#)atunnels.c   5.07 2003/02/12 xlockmore";
+#endif
+
+/* Copyright (c) E. Lassauge, 2003. */
+
+/*
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation.
+ *
+ * This file is provided AS IS with no warranties of any kind.  The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof.  In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * The original code for this mode was written by Roman Podobedov
+ * Email: romka@ut.ee
+ * WEB: http://romka.demonews.com
+ *
+ * Eric Lassauge  (March-16-2002) <lassauge@mail.dotcom.fr>
+ *                                 http://lassauge.free.fr/linux.html
+ *
+ * REVISION HISTORY:
+ *
+ * E.Lassauge - 16-Mar-2002:
+ *     - created based on the Roman demo.
+ *     - deleted all external file stuff to use xpm textures and
+ *       hardcoded path point values.
+ *
+ */
+
+#ifdef STANDALONE              /* xscreensaver mode */
+# define PROGCLASS             "Atunnels"
+# define HACK_INIT             init_atunnels
+# define HACK_DRAW             draw_atunnels
+# define HACK_RESHAPE          reshape_atunnels
+# define atunnels_opts         xlockmore_opts
+#define        DEFAULTS                "*delay:        10000   \n" \
+                               "*showFPS:      False   \n" \
+                                "*light:       True    \n" \
+                                "*wire:                False   \n" \
+                                "*texture:     True    \n"
+
+#define MODE_atunnels
+# include "xlockmore.h"                /* from the xscreensaver distribution */
+#else                          /* !STANDALONE */
+# include "xlock.h"            /* from the xlockmore distribution */
+#endif                                 /* !STANDALONE */
+
+#ifdef MODE_atunnels /* whole file */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <math.h>
+#include "tunnel_draw.h"
+
+#if defined( USE_XPM ) || defined( USE_XPMINC ) || defined( HAVE_XPM )
+/* USE_XPM & USE_XPMINC in xlock mode ; HAVE_XPM in xscreensaver mode */
+#include "xpm-ximage.h"
+#define I_HAVE_XPM
+
+#ifdef STANDALONE
+#include "../images/tunnel0.xpm"
+#include "../images/tunnel1.xpm"
+#include "../images/tunnel2.xpm"
+#else /* !STANDALONE */
+#include "pixmaps/tunnel0.xpm"
+#include "pixmaps/tunnel1.xpm"
+#include "pixmaps/tunnel2.xpm"
+#endif /* !STANDALONE */
+#endif /* HAVE_XPM */
+
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+#define DEF_LIGHT      "True"
+#define DEF_WIRE       "False"
+#define DEF_TEXTURE    "True"
+
+static Bool do_light;
+static Bool do_wire;
+static Bool do_texture;
+
+static XrmOptionDescRec opts[] = {
+  {(char *)"-light",   (char *)".atunnels.light",      XrmoptionNoArg, (caddr_t) "true" },
+  {(char *)"+light",   (char *)".atunnels.light",      XrmoptionNoArg, (caddr_t) "false" },
+  {(char *)"-wire",    (char *)".atunnels.wire",       XrmoptionNoArg, (caddr_t) "true" },
+  {(char *)"+wire",    (char *)".atunnels.wire",       XrmoptionNoArg, (caddr_t) "false" },
+  {(char *)"-texture", (char *)".atunnels.texture",    XrmoptionNoArg, (caddr_t) "true" },
+  {(char *)"+texture", (char *)".atunnels.texture",    XrmoptionNoArg, (caddr_t) "false" },
+};
+
+static argtype vars[] = {
+  {(caddr_t *) &do_light,   (char *)"light",  (char *)"Light",   DEF_LIGHT,   t_Bool},
+  {(caddr_t *) &do_wire,    (char *)"wire",   (char *)"Wire",    DEF_WIRE,    t_Bool},
+  {(caddr_t *) &do_texture, (char *)"texture",(char *)"Texture", DEF_TEXTURE, t_Bool},
+};
+
+static OptionStruct desc[] =
+{
+  {(char *)"-/+ light",   (char *)"whether to do enable lighting (slower)"},
+  {(char *)"-/+ wire",    (char *)"whether to do use wireframe instead of filled (faster)"},
+  {(char *)"-/+ texture", (char *)"whether to apply a texture (slower)"},
+};
+
+ModeSpecOpt atunnels_opts = {countof(opts), opts, countof(vars), vars, desc};
+
+#ifdef USE_MODULES
+ModStruct   atunnels_description =
+{"atunnels", "init_atunnels", "draw_atunnels", "release_atunnels",
+ "draw_atunnels", "init_atunnels", NULL, &atunnels_opts,
+ 1000, 1, 2, 1, 4, 1.0, "",
+ "OpenGL advanced tunnel screensaver", 0, NULL};
+#endif
+
+/* structure for holding the screensaver data */
+typedef struct {
+  int screen_width, screen_height;
+  GLXContext *glx_context;
+  Window window;
+} atunnelsstruct;
+
+static atunnelsstruct *Atunnels = NULL;
+static GLuint texture[3]; /* texture id: GL world */
+
+/*=================== Load Texture =========================================*/
+static void LoadTexture(ModeInfo * mi, char **fn, int t_num)
+{
+#if defined( I_HAVE_XPM )
+       XImage *teximage;    /* Texture data */
+        if ((teximage = xpm_to_ximage(MI_DISPLAY(mi), MI_VISUAL(mi),
+                        MI_COLORMAP(mi), fn)) == None) {
+           (void) fprintf(stderr, "Error reading the texture.\n");
+           glDeleteTextures(1, &texture[t_num]);
+            do_texture = False;
+#ifdef STANDALONE
+           exit(0);
+#else
+           return;
+#endif
+       }
+
+#ifdef HAVE_GLBINDTEXTURE
+       glBindTexture(GL_TEXTURE_2D, texture[t_num]);
+#endif /* HAVE_GLBINDTEXTURE */
+       glPixelStorei(GL_UNPACK_ALIGNMENT, 4);
+       clear_gl_error();
+       glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, teximage->width, teximage->height, 
+                       0, GL_RGBA, GL_UNSIGNED_BYTE, teximage->data);
+       check_gl_error("texture");
+
+       /* Texture parameters, LINEAR scaling for better texture quality */
+       glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
+       glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
+
+       XDestroyImage(teximage);
+#else /* !I_HAVE_XPM */
+       do_texture = False;
+#endif /* !I_HAVE_XPM */
+} 
+
+/*=================== Main Initialization ==================================*/
+static void Init(ModeInfo * mi)
+{
+       GLfloat light_ambient[] = {1.0, 1.0, 1.0, 1.0};
+       GLfloat light_diffuse[] = {1.0, 1.0, 1.0, 1.0};
+       GLfloat light_specular[] = {1.0, 1.0, 1.0, 1.0};
+       GLfloat light_position[] = {0.0, 0.0, 1.0, 0.0};
+       GLfloat fogColor[4] = {0.8, 0.8, 0.8, 1.0};
+
+       glClearColor(0, 0, 0, 0);
+       if (do_texture)
+       {
+               glGenTextures(3, texture);
+               LoadTexture(mi, texture0,0);
+               LoadTexture(mi, texture1,1);
+               LoadTexture(mi, texture2,2);
+               glEnable(GL_TEXTURE_2D);
+       }
+       InitTunnel();
+       
+       /* Set lighting parameters */
+       if (do_light)
+       {
+               glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient);
+               glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);
+               glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);
+               glLightfv(GL_LIGHT0, GL_POSITION, light_position);
+
+               /* Enable light 0 */
+               glEnable(GL_LIGHT0);
+               glDepthFunc(GL_LESS);
+       
+               glEnable(GL_LIGHTING);
+       }
+       if (do_wire) {
+               glDisable(GL_NORMALIZE);
+               glDisable(GL_CULL_FACE);
+               glDisable(GL_DEPTH_TEST);
+               glDisable(GL_TEXTURE_2D);
+               glPolygonMode(GL_FRONT,GL_LINE);
+               glPolygonMode(GL_BACK,GL_LINE);
+       }
+       else
+       {
+               glEnable(GL_DEPTH_TEST);
+               glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
+
+               /* Enable fog */
+               glFogi(GL_FOG_MODE, GL_EXP);
+               glFogfv(GL_FOG_COLOR, fogColor);
+               glFogf(GL_FOG_DENSITY, 0.3);
+               glEnable(GL_FOG);
+       
+               /* Cull face */
+               glCullFace(GL_FRONT);
+               glEnable(GL_CULL_FACE);
+       }
+       
+       glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
+}
+
+
+/* Standard reshape function */
+void
+reshape_atunnels(ModeInfo *mi, int width, int height)
+{
+       float a;
+
+       glViewport(0, 0, width, height);
+       glMatrixMode(GL_PROJECTION);
+       glLoadIdentity();
+       a = (float)width/(float)height;
+       glFrustum(-0.1*a, 0.1*a, -0.1, 0.1, 0.1, 10);
+       glMatrixMode(GL_MODELVIEW);
+}
+
+/* draw the screensaver once */
+void draw_atunnels(ModeInfo * mi)
+{
+       atunnelsstruct *sa = &Atunnels[MI_SCREEN(mi)];
+       Display    *display = MI_DISPLAY(mi);
+       Window      window = MI_WINDOW(mi);
+
+       if (!sa->glx_context)
+               return;
+
+       glXMakeCurrent(display, window, *(sa->glx_context));
+
+       glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+       glLoadIdentity();
+
+       DrawTunnel(do_texture, do_light, texture);
+       SplashScreen(do_wire, do_texture, do_light);
+
+       glFlush();  
+       /* manage framerate display */
+       if (MI_IS_FPS(mi)) do_fps (mi);
+       glXSwapBuffers(display, window);
+
+}
+
+
+/* xscreensaver initialization routine */
+void init_atunnels(ModeInfo * mi)
+{
+  int screen = MI_SCREEN(mi);
+  atunnelsstruct *sa;
+
+  if (Atunnels == NULL) {
+       if ((Atunnels = (atunnelsstruct *) calloc(MI_NUM_SCREENS(mi), sizeof (atunnelsstruct))) == NULL)
+         return;
+  }
+  sa = &Atunnels[screen];
+
+  sa->window = MI_WINDOW(mi);
+  if ((sa->glx_context = init_GL(mi)) != NULL) {
+       reshape_atunnels(mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+       Init(mi);
+  } else {
+       MI_CLEARWINDOW(mi);
+  }
+
+}
+
+/* all sorts of nice cleanup code should go here! */
+void release_atunnels(ModeInfo * mi)
+{
+  int screen;
+  if (Atunnels != NULL) {
+       for (screen = 0; screen < MI_NUM_SCREENS(mi); screen++) {
+         /*      atunnelsstruct *sa = &Atunnels[screen];*/
+       }
+       (void) free((void *) Atunnels);
+       Atunnels = NULL;
+  }
+  FreeAllGL(mi);
+}
+#endif
diff --git a/hacks/glx/atunnel.man b/hacks/glx/atunnel.man
new file mode 100644 (file)
index 0000000..1baa491
--- /dev/null
@@ -0,0 +1,85 @@
+.de EX         \"Begin example
+.ne 5
+.if n .sp 1
+.if t .sp .5
+.nf
+.in +.5i
+..
+.de EE
+.fi
+.in -.5i
+.if n .sp 1
+.if t .sp .5
+..
+.TH XScreenSaver 1 "12-Feb-03" "X Version 11"
+.SH NAME
+atunnel - hypnotic GL tunnel journey
+.SH SYNOPSIS
+.B sballs
+[\-display \fIhost:display.screen\fP] [\-window] [\-root]
+[\-visual \fIvisual\fP] [\-delay \fImicroseconds\fP]
+[\-light] [\-no-light]
+[\-wire] [\-no-wire]
+[\-texture] [\-no-texture]
+[\-fps] [\-no-fps]
+.SH DESCRIPTION
+The \fIatunnel\fP program draws an animation of a journey in a GL tunnel.
+.SH OPTIONS
+.I sballs
+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 \-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 \-fps
+Display a running tally of how many frames per second are being rendered.
+In conjunction with \fB\-delay 0\fP, this can be a useful benchmark of 
+your GL performance.
+.TP 8
+.B \-texture
+Show a textured tunnel. This is the default.
+.TP 8
+.B \-no\-texture
+Disables texturing the animation.
+.TP 8
+.B \-wire
+Draw a wireframe rendition of the tunnel.
+.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)
+.SH COPYRIGHT
+Copyright \(co 2003 by Eric Lassauge.
+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.
+
+The original code for this mode was written by 
+Roman Podobedov <romka@ut.ee>
+and can be found at http://romka.demonews.com
+
+.SH AUTHOR
+Roman Podobedov <romka@ut.ee> 
+Eric Lassauge <lassauge@mail.dotcom.fr>
index 4ef0595d8465c018e29117cbd2cb62b4eed8bec1..903d2790f846226bb2dc5ea62556b6485d4217ca 100644 (file)
@@ -69,7 +69,7 @@ void revolve_line(double *trace_r, double *trace_h, double max_ih, int rot) {
     pradius = trace_r[0] * piece_size;
     pheight = trace_h[0] * piece_size;
     
     pradius = trace_r[0] * piece_size;
     pheight = trace_h[0] * piece_size;
     
-    for(p = 0; p < npoints; ++p) {
+    for(p = 1; p < npoints; ++p) {
       radius = trace_r[p] * piece_size;
       height = trace_h[p] * piece_size;
 
       radius = trace_r[p] * piece_size;
       height = trace_h[p] * piece_size;
 
index ecc58b52740eeca5c722cd5b0f128e942dd57e3d..79e86c1dd3fb34893b2b9ac7e8ce135750e450b7 100644 (file)
@@ -468,7 +468,7 @@ void draw_chess(ModeInfo *mi) {
 
   if(done)
     glLightf(GL_LIGHT0, GL_CONSTANT_ATTENUATION, 
 
   if(done)
     glLightf(GL_LIGHT0, GL_CONSTANT_ATTENUATION, 
-            done == 1 ? 1.0+0.1*count : 99.0/count);
+            ( done == 1 || count == 0 ) ? 1.0+0.1*count : 99.0/count);
 
   if(++count == 100) {
     if(!done) {
 
   if(++count == 100) {
     if(!done) {
index fd9f0f4891b5bcf084c3da5308ff07b6398a0d31..683486518f98155b1654cfe669557d461d5fdb87 100644 (file)
@@ -69,7 +69,6 @@
 #include <string.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 #include <stdio.h>
 #include <stdlib.h>
-#include <malloc.h>
 #include <GL/gl.h>
 #include <GL/glu.h>
 #ifdef HAVE_GLE3
 #include <GL/gl.h>
 #include <GL/glu.h>
 #ifdef HAVE_GLE3
index 4b8745103be8634396e21fb94658e3e76dfe4f1e..c89fe7d1f93aa815f1fc464d88e62ee80da20c4a 100644 (file)
@@ -194,6 +194,7 @@ void UpdateSmoke_ScalarBase(global_info_t *global, flurry_info_t *flurry, SmokeV
     }
 }
 
     }
 }
 
+#if 0
 #ifdef __ppc__
 
 void UpdateSmoke_ScalarFrsqrte(global_info_t *global, flurry_info_t *flurry, SmokeV *s)
 #ifdef __ppc__
 
 void UpdateSmoke_ScalarFrsqrte(global_info_t *global, flurry_info_t *flurry, SmokeV *s)
@@ -242,11 +243,13 @@ void UpdateSmoke_ScalarFrsqrte(global_info_t *global, flurry_info_t *flurry, Smo
                 rsquared = (dx*dx+dy*dy+dz*dz);
                 f = streamSpeed * streamSpeedCoherenceFactor;
 
                 rsquared = (dx*dx+dy*dy+dz*dz);
                 f = streamSpeed * streamSpeedCoherenceFactor;
 
-                /* mag = f / (float) sqrt(rsquared); */
-
-                /* reciprocal square-root estimate replaced above divide and call to system sqrt() */
-                asm("frsqrte %0, %1" : "=f" (mag) : "f" (rsquared));
-                mag *= f;
+                mag = f / (float) sqrt(rsquared);
+                /*
+                    reciprocal square-root estimate replaced above divide and call to system sqrt()
+                
+                    asm("frsqrte %0, %1" : "=f" (mag) : "f" (rsquared));
+                    mag *= f;
+                */
 
                 s->p[s->nextParticle].delta[0].f[s->nextSubParticle] -= (dx * mag);
                 s->p[s->nextParticle].delta[1].f[s->nextSubParticle] -= (dy * mag);
 
                 s->p[s->nextParticle].delta[0].f[s->nextSubParticle] -= (dx * mag);
                 s->p[s->nextParticle].delta[1].f[s->nextSubParticle] -= (dy * mag);
@@ -307,18 +310,19 @@ void UpdateSmoke_ScalarFrsqrte(global_info_t *global, flurry_info_t *flurry, Smo
                 dz = s->p[i].position[2].f[k] - flurry->spark[j]->position[2];
                 rsquared = (dx*dx+dy*dy+dz*dz);
 
                 dz = s->p[i].position[2].f[k] - flurry->spark[j]->position[2];
                 rsquared = (dx*dx+dy*dy+dz*dz);
 
-                asm("fres %0, %1" : "=f" (f) : "f" (rsquared));
-                f *= gravity*frameRateModifier;
-
+                /*
+                    asm("fres %0, %1" : "=f" (f) : "f" (rsquared)); 
+                    f *= gravity*frameRateModifier;
+                */
+                f = ( gravity  * frameRateModifier ) / rsquared;
+                
                 if((((i*4)+k) % flurry->numStreams) == j) {
                     f *= 1.0f + streamBias;
                 }
 
                 if((((i*4)+k) % flurry->numStreams) == j) {
                     f *= 1.0f + streamBias;
                 }
 
-                /* mag = f / (float) sqrt(rsquared); */
+                mag = f / (float) sqrt(rsquared); 
 
                 /* reciprocal square-root estimate replaced above divide and call to system sqrt() */
 
                 /* reciprocal square-root estimate replaced above divide and call to system sqrt() */
-                asm("frsqrte %0, %1" : "=f" (mag) : "f" (rsquared));
-                mag *= f;
                 
                 deltax -= (dx * mag);
                 deltay -= (dy * mag);
                 
                 deltax -= (dx * mag);
                 deltay -= (dy * mag);
@@ -411,8 +415,11 @@ void UpdateSmoke_VectorBase(global_info_t *global, flurry_info_t *flurry, SmokeV
                 rsquared = (dx*dx+dy*dy+dz*dz);
                 f = streamSpeed * streamSpeedCoherenceFactor;
 
                 rsquared = (dx*dx+dy*dy+dz*dz);
                 f = streamSpeed * streamSpeedCoherenceFactor;
 
-                asm("frsqrte %0, %1" : "=f" (mag) : "f" (rsquared));
-                mag *= f;
+                mag = f / (float) sqrt(rsquared);
+                /*
+                    asm("frsqrte %0, %1" : "=f" (mag) : "f" (rsquared));
+                    mag *= f;
+                */
 
                 s->p[s->nextParticle].delta[0].f[s->nextSubParticle] -= (dx * mag);
                 s->p[s->nextParticle].delta[1].f[s->nextSubParticle] -= (dy * mag);
 
                 s->p[s->nextParticle].delta[0].f[s->nextSubParticle] -= (dx * mag);
                 s->p[s->nextParticle].delta[1].f[s->nextSubParticle] -= (dy * mag);
@@ -623,8 +630,11 @@ void UpdateSmoke_VectorUnrolled(global_info_t *info, SmokeV *s)
                 rsquared = (dx*dx+dy*dy+dz*dz);
                 f = streamSpeed * streamSpeedCoherenceFactor;
 
                 rsquared = (dx*dx+dy*dy+dz*dz);
                 f = streamSpeed * streamSpeedCoherenceFactor;
 
-                asm("frsqrte %0, %1" : "=f" (mag) : "f" (rsquared));
-                mag *= f;
+                mag = f / (float) sqrt(rsquared);
+                /*
+                    asm("frsqrte %0, %1" : "=f" (mag) : "f" (rsquared));
+                    mag *= f;
+                */
 
                 s->p[s->nextParticle].delta[0].f[s->nextSubParticle] -= (dx * mag);
                 s->p[s->nextParticle].delta[1].f[s->nextSubParticle] -= (dy * mag);
 
                 s->p[s->nextParticle].delta[0].f[s->nextSubParticle] -= (dx * mag);
                 s->p[s->nextParticle].delta[1].f[s->nextSubParticle] -= (dy * mag);
@@ -918,6 +928,7 @@ void UpdateSmoke_VectorUnrolled(global_info_t *info, SmokeV *s)
 }
 
 #endif
 }
 
 #endif
+#endif /* 0 */
 
 void DrawSmoke_Scalar(global_info_t *global, flurry_info_t *flurry, SmokeV *s, float brightness)
 {
 
 void DrawSmoke_Scalar(global_info_t *global, flurry_info_t *flurry, SmokeV *s, float brightness)
 {
@@ -1076,6 +1087,7 @@ void DrawSmoke_Scalar(global_info_t *global, flurry_info_t *flurry, SmokeV *s, f
        glDrawArrays(GL_QUADS,0,si*4);
 }
 
        glDrawArrays(GL_QUADS,0,si*4);
 }
 
+#if 0
 #ifdef __VEC__
 
 void DrawSmoke_Vector(global_info_t *global, flurry_info_t *flurry, SmokeV *s, float brightness)
 #ifdef __VEC__
 
 void DrawSmoke_Vector(global_info_t *global, flurry_info_t *flurry, SmokeV *s, float brightness)
@@ -1425,3 +1437,4 @@ void DrawSmoke_Vector(global_info_t *global, flurry_info_t *flurry, SmokeV *s, f
 }
 
 #endif
 }
 
 #endif
+#endif /* 0 */
index 0014cd818e7589535dc5f1abb3fa0a59083cd3bd..63b89f666a83b42b49d62fa14a66e14e4a44325d 100644 (file)
@@ -56,8 +56,6 @@ static const char sccsid[] = "@(#)flurry.c    4.07 97/11/24 xlockmore";
 # define HACK_INIT             init_flurry
 # define HACK_DRAW             draw_flurry
 # define HACK_RESHAPE          reshape_flurry
 # define HACK_INIT             init_flurry
 # define HACK_DRAW             draw_flurry
 # define HACK_RESHAPE          reshape_flurry
-# define HACK_HANDLE_EVENT     flurry_handle_event
-# define EVENT_MASK            PointerMotionMask
 # define flurry_opts           xlockmore_opts
 # define DEFAULTS              "*showFPS:      False   \n" \
                                "*preset:       " DEF_PRESET "   \n"
 # define flurry_opts           xlockmore_opts
 # define DEFAULTS              "*showFPS:      False   \n" \
                                "*preset:       " DEF_PRESET "   \n"
@@ -66,9 +64,6 @@ static const char sccsid[] = "@(#)flurry.c    4.07 97/11/24 xlockmore";
 
 #ifdef USE_GL
 
 
 #ifdef USE_GL
 
-#include "rotator.h"
-#include "gltrackball.h"
-
 static char *preset_str;
 
 static XrmOptionDescRec opts[] = {
 static char *preset_str;
 
 static XrmOptionDescRec opts[] = {
@@ -103,7 +98,6 @@ ModStruct   flurry_description = {
 #endif
 
 #include <sys/time.h>
 #endif
 
 #include <sys/time.h>
-#include <sys/sysctl.h>
 
 #include "flurry.h"
 
 
 #include "flurry.h"
 
@@ -129,12 +123,14 @@ double TimeInSecondsSinceStart (void) {
     return currentTime() - gTimeCounter;
 }
 
     return currentTime() - gTimeCounter;
 }
 
+#if 0
 #ifdef __ppc__
 static int IsAltiVecAvailable(void)
 {
     return 0;
 }
 #endif
 #ifdef __ppc__
 static int IsAltiVecAvailable(void)
 {
     return 0;
 }
 #endif
+#endif
 
 void delete_flurry_info(flurry_info_t *flurry)
 {
 
 void delete_flurry_info(flurry_info_t *flurry)
 {
@@ -158,7 +154,9 @@ flurry_info_t *new_flurry_info(global_info_t *global, int streams, ColorModes co
 
     flurry->flurryRandomSeed = RandFlt(0.0, 300.0);
 
 
     flurry->flurryRandomSeed = RandFlt(0.0, 300.0);
 
-    flurry->fOldTime = TimeInSecondsSinceStart() + flurry->flurryRandomSeed;
+       flurry->fOldTime = 0;
+       flurry->fTime = TimeInSecondsSinceStart() + flurry->flurryRandomSeed;
+       flurry->fDeltaTime = flurry->fTime - flurry->fOldTime;
 
     flurry->numStreams = streams;
     flurry->streamExpansion = thickness;
 
     flurry->numStreams = streams;
     flurry->streamExpansion = thickness;
@@ -216,6 +214,7 @@ void GLSetupRC(global_info_t *global)
     glEnableClientState(GL_VERTEX_ARRAY);      
     glEnableClientState(GL_TEXTURE_COORD_ARRAY);
     
     glEnableClientState(GL_VERTEX_ARRAY);      
     glEnableClientState(GL_TEXTURE_COORD_ARRAY);
     
+#if 0
 #ifdef __ppc__
     global->optMode = OPT_MODE_SCALAR_FRSQRTE;
 
 #ifdef __ppc__
     global->optMode = OPT_MODE_SCALAR_FRSQRTE;
 
@@ -226,6 +225,7 @@ void GLSetupRC(global_info_t *global)
 #else
     global->optMode = OPT_MODE_SCALAR_BASE;
 #endif
 #else
     global->optMode = OPT_MODE_SCALAR_BASE;
 #endif
+#endif /* 0 */
 }
 
 void GLRenderScene(global_info_t *global, flurry_info_t *flurry, double b)
 }
 
 void GLRenderScene(global_info_t *global, flurry_info_t *flurry, double b)
@@ -263,6 +263,7 @@ void GLRenderScene(global_info_t *global, flurry_info_t *flurry, double b)
        case OPT_MODE_SCALAR_BASE:
            UpdateSmoke_ScalarBase(global, flurry, flurry->s);
            break;
        case OPT_MODE_SCALAR_BASE:
            UpdateSmoke_ScalarBase(global, flurry, flurry->s);
            break;
+#if 0
 #ifdef __ppc__
        case OPT_MODE_SCALAR_FRSQRTE:
            UpdateSmoke_ScalarFrsqrte(global, flurry, flurry->s);
 #ifdef __ppc__
        case OPT_MODE_SCALAR_FRSQRTE:
            UpdateSmoke_ScalarFrsqrte(global, flurry, flurry->s);
@@ -276,6 +277,8 @@ void GLRenderScene(global_info_t *global, flurry_info_t *flurry, double b)
            UpdateSmoke_VectorUnrolled(global, flurry, flurry->s);
            break;
 #endif
            UpdateSmoke_VectorUnrolled(global, flurry, flurry->s);
            break;
 #endif
+#endif /* 0 */
+
        default:
            break;
     }
        default:
            break;
     }
@@ -287,17 +290,21 @@ void GLRenderScene(global_info_t *global, flurry_info_t *flurry, double b)
 
     switch(global->optMode) {
        case OPT_MODE_SCALAR_BASE:
 
     switch(global->optMode) {
        case OPT_MODE_SCALAR_BASE:
+#if 0
 #ifdef __ppc__
        case OPT_MODE_SCALAR_FRSQRTE:
 #endif
 #ifdef __ppc__
        case OPT_MODE_SCALAR_FRSQRTE:
 #endif
+#endif /* 0 */
            DrawSmoke_Scalar(global, flurry, flurry->s, b);
            break;
            DrawSmoke_Scalar(global, flurry, flurry->s, b);
            break;
+#if 0
 #ifdef __VEC__
        case OPT_MODE_VECTOR_SIMPLE:
        case OPT_MODE_VECTOR_UNROLLED:
            DrawSmoke_Vector(global, flurry, flurry->s, b);
            break;
 #endif
 #ifdef __VEC__
        case OPT_MODE_VECTOR_SIMPLE:
        case OPT_MODE_VECTOR_UNROLLED:
            DrawSmoke_Vector(global, flurry, flurry->s, b);
            break;
 #endif
+#endif /* 0 */
        default:
            break;
     }    
        default:
            break;
     }    
@@ -332,32 +339,6 @@ void reshape_flurry(ModeInfo *mi, int width, int height)
     GLResize(global, (float)width, (float)height);
 }
 
     GLResize(global, (float)width, (float)height);
 }
 
-Bool
-flurry_handle_event (ModeInfo *mi, XEvent *event)
-{
-    global_info_t *global = flurry_info + MI_SCREEN(mi);
-
-    if (event->xany.type == ButtonPress && event->xbutton.button & Button1) {
-       global->button_down_p = True;
-       gltrackball_start (global->trackball,
-               event->xbutton.x, event->xbutton.y,
-               MI_WIDTH (mi), MI_HEIGHT (mi));
-       return True;
-    }
-    else if (event->xany.type == ButtonRelease && event->xbutton.button & Button1) {
-       global->button_down_p = False;
-       return True;
-    }
-    else if (event->xany.type == MotionNotify && global->button_down_p) {
-       gltrackball_track (global->trackball,
-               event->xmotion.x, event->xmotion.y,
-               MI_WIDTH (mi), MI_HEIGHT (mi));
-       return True;
-    }
-
-    return False;
-}
-
 void
 init_flurry(ModeInfo * mi)
 {
 void
 init_flurry(ModeInfo * mi)
 {
@@ -386,9 +367,6 @@ init_flurry(ModeInfo * mi)
 
     global->window = MI_WINDOW(mi);
 
 
     global->window = MI_WINDOW(mi);
 
-    global->rot = make_rotator(1, 1, 1, 1, 0, True);
-    global->trackball = gltrackball_init();
-
     global->flurry = NULL;
 
     if (!preset_str || !*preset_str) preset_str = DEF_PRESET;
     global->flurry = NULL;
 
     if (!preset_str || !*preset_str) preset_str = DEF_PRESET;
index 3221006482c2cc6d51476f127dda682baf698db0..ead856e3fd194485a9bfda07ae1a2d928c77cac8 100644 (file)
@@ -259,9 +259,6 @@ struct _global_info_t {
   /* system values */
        GLXContext *glx_context;
        Window window;
   /* system values */
        GLXContext *glx_context;
        Window window;
-       rotator *rot;
-       trackball_state *trackball;
-       Bool button_down_p;
         int optMode;
 
        float sys_glWidth;
         int optMode;
 
        float sys_glWidth;
index 5504e39b92d0d47de88f3538f448d14ffb76cf7c..f34776b39e97ccaaee061547c176e78a2d96fb73 100644 (file)
@@ -258,7 +258,10 @@ init_texture (ModeInfo *mi)
   glGenTextures (1, &bp->texture);
   glBindTexture (GL_TEXTURE_2D, bp->texture);
   glTexImage2D (GL_TEXTURE_2D, 0, 4, 128, 128, 0,
   glGenTextures (1, &bp->texture);
   glBindTexture (GL_TEXTURE_2D, bp->texture);
   glTexImage2D (GL_TEXTURE_2D, 0, 4, 128, 128, 0,
-               GL_RGBA, GL_UNSIGNED_BYTE, bp->tex_data);
+               GL_RGBA,
+                /* GL_UNSIGNED_BYTE, */
+                GL_UNSIGNED_INT_8_8_8_8_REV,
+                bp->tex_data);
   glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
   glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
 }
   glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
   glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
 }
index dee6a56670c86a7027c41cc82d8a555110af54ea..2f4846d04e6b5c7e447d4e6096aa90525a35d440 100644 (file)
@@ -191,6 +191,7 @@ static XrmOptionDescRec opts[] = {
     {(char *) "-wander", (char *) ".fire.wander", XrmoptionNoArg, (caddr_t) "on"},
     {(char *) "+wander", (char *) ".fire.wander", XrmoptionNoArg, (caddr_t) "off"},
     {(char *) "-trees", (char *) ".fire.trees", XrmoptionSepArg, (caddr_t) NULL},
     {(char *) "-wander", (char *) ".fire.wander", XrmoptionNoArg, (caddr_t) "on"},
     {(char *) "+wander", (char *) ".fire.wander", XrmoptionNoArg, (caddr_t) "off"},
     {(char *) "-trees", (char *) ".fire.trees", XrmoptionSepArg, (caddr_t) NULL},
+    {(char *) "-rain", (char *) ".fire.count", XrmoptionNoArg, (caddr_t) "0"},
 
 };
 
 
 };
 
@@ -338,8 +339,13 @@ static float gettimerain(void)
 {
 #if 0
   /* Oh yeah, *that's* portable!  WTF. */
 {
 #if 0
   /* Oh yeah, *that's* portable!  WTF. */
+  /* 
+   * I really thought clock() was standard ... EL
+   * I found this on the net:
+   * The clock() function conforms to ISO/IEC 9899:1990 (``ISO C89'') 
+   * */
 
 
-  static clock_t told=0;
+  static clock_t told= (clock_t)0;
   clock_t tnew,ris;
 
   tnew=clock();
   clock_t tnew,ris;
 
   tnew=clock();
@@ -348,9 +354,9 @@ static float gettimerain(void)
 
   told=tnew;
 
 
   told=tnew;
 
-  return (ris/(float)CLOCKS_PER_SEC);
+  return (0.0125 + ris/(float)CLOCKS_PER_SEC);
 #else
 #else
-  return 0;
+  return 0.0150;
 #endif
 }
 
 #endif
 }
 
@@ -590,8 +596,11 @@ static void inittextures(ModeInfo * mi)
        glPixelStorei(GL_UNPACK_ALIGNMENT, 4);
     clear_gl_error();
        glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA,
        glPixelStorei(GL_UNPACK_ALIGNMENT, 4);
     clear_gl_error();
        glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA,
-                    fs->gtexture->width, fs->gtexture->height, 0,
-                    GL_RGBA, GL_UNSIGNED_BYTE, fs->gtexture->data);
+                 fs->gtexture->width, fs->gtexture->height, 0,
+                 GL_RGBA,
+                 /* GL_UNSIGNED_BYTE, */
+                 GL_UNSIGNED_INT_8_8_8_8_REV,
+                 fs->gtexture->data);
     check_gl_error("texture");
 
        glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
     check_gl_error("texture");
 
        glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
@@ -619,8 +628,11 @@ static void inittextures(ModeInfo * mi)
 
         clear_gl_error();
            glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA,
 
         clear_gl_error();
            glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA,
-                       fs->ttexture->width, fs->ttexture->height, 0,
-                       GL_RGBA, GL_UNSIGNED_BYTE, fs->ttexture->data);
+                     fs->ttexture->width, fs->ttexture->height, 0,
+                     GL_RGBA,
+                     /* GL_UNSIGNED_BYTE, */
+                     GL_UNSIGNED_INT_8_8_8_8_REV,
+                     fs->ttexture->data);
         check_gl_error("texture");
 
            glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT);
         check_gl_error("texture");
 
            glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT);
index 19523a59d91c1a71f08d578402131897e6de0da3..f2080b303af96aa6b258f2b46bd5419745cc0c61 100644 (file)
@@ -213,7 +213,10 @@ setup_xpm_texture (ModeInfo *mi, char **xpm_data)
   clear_gl_error();
   glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA,
                image->width, image->height, 0,
   clear_gl_error();
   glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA,
                image->width, image->height, 0,
-               GL_RGBA, GL_UNSIGNED_BYTE, image->data);
+               GL_RGBA,
+               /* GL_UNSIGNED_BYTE, */
+               GL_UNSIGNED_INT_8_8_8_8_REV,
+               image->data);
   sprintf (buf, "builtin texture (%dx%d)", image->width, image->height);
   check_gl_error(buf);
 
   sprintf (buf, "builtin texture (%dx%d)", image->width, image->height);
   check_gl_error(buf);
 
@@ -240,7 +243,10 @@ setup_file_texture (ModeInfo *mi, char *filename)
   clear_gl_error();
   glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA,
                image->width, image->height, 0,
   clear_gl_error();
   glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA,
                image->width, image->height, 0,
-               GL_RGBA, GL_UNSIGNED_BYTE, image->data);
+               GL_RGBA,
+               /* GL_UNSIGNED_BYTE, */
+               GL_UNSIGNED_INT_8_8_8_8_REV,
+               image->data);
   sprintf (buf, "texture: %.100s (%dx%d)",
            filename, image->width, image->height);
   check_gl_error(buf);
   sprintf (buf, "texture: %.100s (%dx%d)",
            filename, image->width, image->height);
   check_gl_error(buf);
index 5b80d76c68b5aad9cb6183b64515b79a67044e58..bb3e9db3a9268fa5da7fc066a80002c0c6f4f9f6 100644 (file)
@@ -177,13 +177,16 @@ parse_text (ModeInfo *mi)
                                      strlen(uts.sysname) +
                                      strlen(uts.version) +
                                      strlen(uts.release) + 10);
                                      strlen(uts.sysname) +
                                      strlen(uts.version) +
                                      strlen(uts.release) + 10);
-#  ifdef _AIX
+#  if defined(_AIX)
           sprintf(tp->text, "%s\n%s %s.%s",
                   uts.nodename, uts.sysname, uts.version, uts.release);
           sprintf(tp->text, "%s\n%s %s.%s",
                   uts.nodename, uts.sysname, uts.version, uts.release);
-#  else  /* !_AIX */
+#  elif defined(__APPLE__)  /* MacOS X + XDarwin */
+          sprintf(tp->text, "%s\n%s %s\n%s",
+                  uts.nodename, uts.sysname, uts.release, uts.machine);
+#  else
           sprintf(tp->text, "%s\n%s %s",
                   uts.nodename, uts.sysname, uts.release);
           sprintf(tp->text, "%s\n%s %s",
                   uts.nodename, uts.sysname, uts.release);
-#  endif /* !_AIX */
+#  endif /* special system types */
         }
 # else /* !HAVE_UNAME */
 #  ifdef VMS
         }
 # else /* !HAVE_UNAME */
 #  ifdef VMS
index 6a5b1fa2daa2e6474c4202c2ee525895997dacbf..e199c4a4c9beb16f31ac45251e63082ed0fd08f1 100644 (file)
@@ -1,5 +1,5 @@
 /* grab-ximage.c --- grab the screen to an XImage for use with OpenGL.
 /* grab-ximage.c --- grab the screen to an XImage for use with OpenGL.
- * xscreensaver, Copyright (c) 2001 Jamie Zawinski <jwz@jwz.org>
+ * xscreensaver, Copyright (c) 2001, 2003 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
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
  * documentation for any purpose is hereby granted without fee, provided that
@@ -149,13 +149,16 @@ screen_to_ximage (Screen *screen, Window window)
 
       unsigned char spread_map[3][256];
 
 
       unsigned char spread_map[3][256];
 
-      srmsk = ximage1->red_mask;
-      sgmsk = ximage1->green_mask;
-      sbmsk = ximage1->blue_mask;
+      if (colors == 0)  /* truecolor */
+        {
+          srmsk = ximage1->red_mask;
+          sgmsk = ximage1->green_mask;
+          sbmsk = ximage1->blue_mask;
 
 
-      decode_mask (srmsk, &srpos, &srsiz);
-      decode_mask (sgmsk, &sgpos, &sgsiz);
-      decode_mask (sbmsk, &sbpos, &sbsiz);
+          decode_mask (srmsk, &srpos, &srsiz);
+          decode_mask (sgmsk, &sgpos, &sgsiz);
+          decode_mask (sbmsk, &sbpos, &sbsiz);
+        }
 
       /* Note that unlike X, which is endianness-agnostic (since any XImage
          can have its own specific bit ordering, with the server reversing
 
       /* Note that unlike X, which is endianness-agnostic (since any XImage
          can have its own specific bit ordering, with the server reversing
@@ -165,11 +168,14 @@ screen_to_ximage (Screen *screen, Window window)
        */
       crpos =  0, cgpos =  8, cbpos = 16, capos = 24;
 
        */
       crpos =  0, cgpos =  8, cbpos = 16, capos = 24;
 
-      for (i = 0; i < 256; i++)
+      if (colors == 0)  /* truecolor */
         {
         {
-          spread_map[0][i] = spread_bits (i, srsiz);
-          spread_map[1][i] = spread_bits (i, sgsiz);
-          spread_map[2][i] = spread_bits (i, sbsiz);
+          for (i = 0; i < 256; i++)
+            {
+              spread_map[0][i] = spread_bits (i, srsiz);
+              spread_map[1][i] = spread_bits (i, sgsiz);
+              spread_map[2][i] = spread_bits (i, sbsiz);
+            }
         }
 
       for (y = 0; y < win_height; y++)
         }
 
       for (y = 0; y < win_height; y++)
index cf5c5ba095bcb15c63417975f922171d0ea51a43..eb75dd6d8ac81c509c604a87b2cde344fab0ad0c 100644 (file)
@@ -1936,7 +1936,9 @@ gl_init(ModeInfo *mi)
           clear_gl_error();
          glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA,
                       lc->texture->width, height, 0,
           clear_gl_error();
          glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA,
                       lc->texture->width, height, 0,
-                      GL_RGBA, GL_UNSIGNED_BYTE,
+                      GL_RGBA,
+                       /* GL_UNSIGNED_BYTE, */
+                       GL_UNSIGNED_INT_8_8_8_8_REV,
                       (lc->texture->data +
                        (lc->texture->bytes_per_line * height * i)));
           check_gl_error("texture");
                       (lc->texture->data +
                        (lc->texture->bytes_per_line * height * i)));
           check_gl_error("texture");
index 9e9b2e3d880a3ed2bda9ab2bfc9a8a971b46c3c8..ad77d8c4d5b118060d79227da130f90cfbaed100 100644 (file)
@@ -441,7 +441,10 @@ static void inittextures(ModeInfo * mi)
         clear_gl_error();
        glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA,
                     sb->btexture->width, sb->btexture->height, 0,
         clear_gl_error();
        glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA,
                     sb->btexture->width, sb->btexture->height, 0,
-                    GL_RGBA, GL_UNSIGNED_BYTE, sb->btexture->data);
+                    GL_RGBA,
+                     /* GL_UNSIGNED_BYTE, */
+                     GL_UNSIGNED_INT_8_8_8_8_REV,
+                     sb->btexture->data);
         check_gl_error("texture");
 
        glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
         check_gl_error("texture");
 
        glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
@@ -472,7 +475,10 @@ static void inittextures(ModeInfo * mi)
         clear_gl_error();
        glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA,
                     sb->ftexture->width, sb->ftexture->height, 0,
         clear_gl_error();
        glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA,
                     sb->ftexture->width, sb->ftexture->height, 0,
-                    GL_RGBA, GL_UNSIGNED_BYTE, sb->ftexture->data);
+                    GL_RGBA,
+                     /* GL_UNSIGNED_BYTE, */
+                     GL_UNSIGNED_INT_8_8_8_8_REV,
+                     sb->ftexture->data);
         check_gl_error("texture");
 
        glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
         check_gl_error("texture");
 
        glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
index 5772d1ebf150c7492097bdf0a009a95d18ab5953..1f27a7ebf26e1e67d635dd573b616974a3ede196 100644 (file)
@@ -289,9 +289,22 @@ launch_text_generator (sws_configuration *sc)
           }
       }
 #endif /* __linux__ */
           }
       }
 #endif /* __linux__ */
+
+#ifdef __APPLE__   /* MacOS X + XDarwin */
+      {
+        static int done_once = 0;
+        if (!done_once)
+          {
+            struct stat st;
+            static char *cmd = "cat /usr/X11R6/README";
+            if (!stat (cmd+4, &st))
+              oprogram = cmd;
+          }
+      }
+#endif /* __APPLE__ */
     }
 
     }
 
- program = (char *) malloc (strlen (oprogram) + 10);
 program = (char *) malloc (strlen (oprogram) + 10);
   strcpy (program, "( ");
   strcat (program, oprogram);
   strcat (program, " ) 2>&1");
   strcpy (program, "( ");
   strcat (program, oprogram);
   strcat (program, " ) 2>&1");
diff --git a/hacks/glx/tunnel_draw.c b/hacks/glx/tunnel_draw.c
new file mode 100644 (file)
index 0000000..7195410
--- /dev/null
@@ -0,0 +1,472 @@
+/* -*- Mode: C; tab-width: 4 -*- */
+/* atunnels --- OpenGL Advanced Tunnel Demo */
+
+#if !defined( lint ) && !defined( SABER )
+static const char sccsid[] = "@(#)tunnel_draw.c        5.02 2002/03/16 xlockmore";
+#endif
+
+/* Copyright (c) E. Lassauge, 2002. */
+
+/*
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation.
+ *
+ * This file is provided AS IS with no warranties of any kind.  The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof.  In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * The original code for this mode was written by Roman Podobedov
+ * Email: romka@ut.ee
+ * WEB: http://romka.demonews.com
+ *
+ * Eric Lassauge  (March-16-2002) <lassauge@mail.dotcom.fr>
+ *                                 http://lassauge.free.fr/linux.html
+ *
+ * REVISION HISTORY:
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#ifdef USE_GL /* whole file */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <math.h>
+
+#include <GL/gl.h>
+#include <GL/glu.h>
+
+#include "tunnel_draw.h"
+
+typedef struct 
+{
+  float x, y, z; /* Point coordinates */
+} cvPoint;
+
+typedef struct _tnPath
+{
+       cvPoint p;
+       struct _tnPath *next;
+} tnPath;
+
+
+tnPath *path = NULL;
+
+const cvPoint initpath[]={
+{0.000000, 0.000000, 0.000000},
+{2.000000, 1.000000, 0.000000},
+{4.000000, 0.000000, 0.000000},
+{6.000000, 1.000000, 0.000000},
+{8.000000, 0.000000, 1.000000},
+{10.000000, 1.000000, 1.000000},
+{12.000000, 1.500000, 0.000000},
+{14.000000, 0.000000, 0.000000},
+{16.000000, 1.000000, 0.000000},
+{18.000000, 0.000000, 0.000000},
+{20.000000, 0.000000, 1.000000},
+{22.000000, 1.000000, 0.000000},
+{24.000000, 0.000000, 1.000000},
+{26.000000, 0.000000, 1.000000},
+{28.000000, 1.000000, 0.000000},
+{30.000000, 0.000000, 2.000000},
+{32.000000, 1.000000, 0.000000},
+{34.000000, 0.000000, 2.000000},
+{-1.000000, -1.000000, -1.000000}
+};
+
+/* Camera variables */
+static float cam_t=0;
+static tnPath *cam_pos;
+static float alpha=0;
+
+/* Tunnel Drawing Variables */
+static int tFlag=0;
+static cvPoint prev_points[10];
+static int current_texture;
+
+/* Modes */
+static float ModeX=0;
+static int ModeXFlag=0;
+
+/*=================== Vector normalization ==================================*/
+void normalize(cvPoint *V)
+{
+  float d;
+
+  /* Vector length */
+  d = (float)sqrt(V->x*V->x + V->y*V->y + V->z*V->z);
+
+  /* Normalization */
+  V->x /= d; 
+  V->y /= d; 
+  V->z /= d; 
+}
+/*=================== C = A x B  (Vector multiply) ==========================*/
+void vect_mult(cvPoint *A, cvPoint *B, cvPoint *C)
+{
+       /* Vector multiply */
+       C->x = A->y*B->z - A->z*B->y;
+       C->y = A->z*B->x - A->x*B->z;
+       C->z = A->x*B->y - A->y*B->x;
+}
+
+/* Catmull-Rom Curve calculations */
+void cvCatmullRom(cvPoint *p, float t, cvPoint *outp)
+{
+       float t2, t3, t1;
+
+       t2 = t*t;
+       t3 = t*t*t;
+       t1 = (1-t)*(1-t);
+
+       outp->x = (-t*t1*p[0].x + (2-5*t2+3*t3)*p[1].x + t*(1+4*t-3*t2)*p[2].x - t2*(1-t)*p[3].x)/2;
+       outp->y = (-t*t1*p[0].y + (2-5*t2+3*t3)*p[1].y + t*(1+4*t-3*t2)*p[2].y - t2*(1-t)*p[3].y)/2;
+       outp->z = (-t*t1*p[0].z + (2-5*t2+3*t3)*p[1].z + t*(1+4*t-3*t2)*p[2].z - t2*(1-t)*p[3].z)/2;
+}
+
+/*=================== Point Rotating Around Line ===========================
+// p   - original point
+// pp  - pivot point
+// pl  - pivot line (vector)
+// a   - angle to rotate in radians
+// outp - output point
+//==========================================================================
+*/
+void RotateAroundLine(cvPoint *p, cvPoint *pp, cvPoint *pl, float a, cvPoint *outp)
+{
+       cvPoint p1, p2;
+       float l, m, n, ca, sa;
+
+       p1.x = p->x - pp->x;
+       p1.y = p->y - pp->y;
+       p1.z = p->z - pp->z;
+
+       l = pl->x;
+       m = pl->y;
+       n = pl->z;
+
+       ca = cos(a);
+       sa = sin(a);
+
+       p2.x = p1.x*((l*l)+ca*(1-l*l)) + p1.y*(l*(1-ca)*m+n*sa) + p1.z*(l*(1-ca)*n-m*sa);
+       p2.y = p1.x*(l*(1-ca)*m-n*sa) + p1.y*(m*m+ca*(1-m*m)) + p1.z*(m*(1-ca)*n+l*sa);
+       p2.z = p1.x*(l*(1-ca)*n+m*sa) + p1.y*(m*(1-ca)*n-l*sa) + p1.z*(n*n+ca*(1-n*n));
+
+       outp->x = p2.x + pp->x;
+       outp->y = p2.y + pp->y;
+       outp->z = p2.z + pp->z;
+}
+
+
+/*=================== Load camera and tunnel path ==========================*/
+static void LoadPath(void)
+{
+       float x, y, z;
+       tnPath *path1=NULL, *path2=NULL;
+
+       cvPoint *f = (cvPoint *)initpath;
+       
+       while (f->x != -1.0)
+       {
+               x = f->x;
+               y = f->y;
+               z = f->z;
+               f++;
+
+               if (path == NULL)
+               {
+                       path = (tnPath *)malloc(sizeof(tnPath));
+                       path1 = path;
+               }
+               else
+               {
+                       path2 = (tnPath *)malloc(sizeof(tnPath));
+                       path1->next = path2;
+                       path1 = path2;
+               }
+               
+               path1->next = NULL;
+               path1->p.x = x;
+               path1->p.y = y;
+               path1->p.z = z;
+       }
+
+       cam_pos = path;
+       cam_t = 0;
+}
+
+/*=================== Tunnel Initialization ================================*/
+void InitTunnel(void)
+{
+       LoadPath();
+       current_texture = 0;
+}
+
+void DrawTunnel(int do_texture, int do_light, GLuint *textures)
+{
+       tnPath *p, *p1, *cmpos;
+       cvPoint op, p4[4], T, ppp, ppp1, op1, op2;
+       float t;
+       int i, j, k, flag;
+       cvPoint points[10];
+       GLfloat light_position[4];
+
+
+       /* Select current tunnel texture */
+       if (do_texture)
+               glBindTexture(GL_TEXTURE_2D, textures[current_texture]);
+       
+       cmpos = cam_pos;
+       /* Get current curve */
+       if (cam_pos->next->next->next)
+       {
+               p1 = cam_pos;
+               for (i=0; i<4; i++)
+               {
+                       p4[i].x = p1->p.x;
+                       p4[i].y = p1->p.y;
+                       p4[i].z = p1->p.z;
+                       p1 = p1->next;
+               }
+       }
+       else 
+       {
+               /* End of tunnel */
+               ModeX = 1.0;
+               ModeXFlag = 0;
+               return;
+       };
+               
+       /* Get current camera position */
+       cvCatmullRom(p4, cam_t, &op);
+
+       /* Next camera position */
+       cam_t += 0.02f;
+       if (cam_t >= 1)
+       {
+               cam_t = cam_t - 1;
+               cmpos = cam_pos->next;
+       }
+               
+       /* Get curve for next camera position */
+       if (cmpos->next->next->next)
+       {
+               p1 = cmpos;
+               for (i=0; i<4; i++)
+               {
+                       p4[i].x = p1->p.x;
+                       p4[i].y = p1->p.y;
+                       p4[i].z = p1->p.z;
+                       p1 = p1->next;
+               }
+       }
+       else 
+       {       
+               /*  End of tunnel */
+               ModeX = 1.0;
+               ModeXFlag = 0;
+               return;
+       }
+       
+       /*  Get next camera position */
+       cvCatmullRom(p4, cam_t, &op1);
+       
+       /*  Rotate camera */
+       glRotatef(alpha, 0, 0, -1);
+       alpha += 1;
+       /*  Set camera position */
+       gluLookAt(op.x, op.y, op.z, op1.x, op1.y, op1.z, 0, 1, 0);
+
+       /*  Set light position */
+       if (do_light)
+       {
+               light_position[0] = op.x;
+               light_position[1] = op.y;
+               light_position[2] = op.z;
+               light_position[3] = 1;
+               glLightfv(GL_LIGHT0, GL_POSITION, light_position);
+       }
+       
+       p = cam_pos;
+       flag = 0;
+       t = 0;
+       k = 0;
+       /*  Draw tunnel from current curve and next 2 curves */
+       glBegin(GL_QUADS);
+       while (k < 3)
+       {
+               if (p->next->next->next)
+               {
+                       p1 = p;
+                       for (i=0; i<4; i++)
+                       {
+                               p4[i].x = p1->p.x;
+                               p4[i].y = p1->p.y;
+                               p4[i].z = p1->p.z;
+                               p1 = p1->next;
+                       }
+               }
+               else
+               {
+                       /*  End of tunnel */
+                       ModeX = 1.0;
+                       ModeXFlag = 0;
+                       return;
+               }
+               cvCatmullRom(p4, t, &op);
+
+               ppp.x = op.x;
+               ppp.y = op.y;
+               ppp.z = op.z + 0.25;
+
+               t += 0.1;
+               if (t >= 1.0)
+               {
+                       t = t - 1;
+                       k++;
+                       p = p->next;
+               }
+       
+               if (p->next->next->next)
+               {
+                       p1 = p;
+                       for (i=0; i<4; i++)
+                       {
+                               p4[i].x = p1->p.x;
+                               p4[i].y = p1->p.y;
+                               p4[i].z = p1->p.z;
+                               p1 = p1->next;
+                       }
+               } 
+               else
+               {
+                       /*  End of tunnel */
+                       ModeX = 1.0;
+                       ModeXFlag = 0;
+                       return;
+               }
+                       
+               cvCatmullRom(p4, t, &op1);
+
+               ppp1.x = op1.x;
+               ppp1.y = op1.y;
+               ppp1.z = op1.z + 0.25;
+
+               T.x = op1.x - op.x;
+               T.y = op1.y - op.y;
+               T.z = op1.z - op.z;
+                       
+               normalize(&T);
+
+               for (i=0; i<10; i++)
+               {
+                       RotateAroundLine(&ppp, &op, &T, ((float)i*36.0*M_PI/180.0), &op2);
+                       points[i].x = op2.x;
+                       points[i].y = op2.y;
+                       points[i].z = op2.z;
+                       if (!flag)
+                       {
+                               prev_points[i].x = op2.x;
+                               prev_points[i].y = op2.y;
+                               prev_points[i].z = op2.z;
+                       }
+               }
+       
+               if (!flag)
+               {
+                       flag = 1;
+                       continue;
+               }
+               
+               /*  Draw 10 polygons for current point */
+               for (i=0; i<10; i++)
+               {
+                       j = i+1;
+                       if (j > 9) j = 0;
+                       glNormal3f(0, 0, 1); /*  Normal for lighting */
+                       glTexCoord2f(0, 0); glVertex3f(prev_points[i].x, prev_points[i].y, prev_points[i].z);
+                       glNormal3f(0, 0, 1);
+                       glTexCoord2f(1, 0); glVertex3f(points[i].x, points[i].y, points[i].z);
+                       glNormal3f(0, 0, 1);
+                       glTexCoord2f(1, 1); glVertex3f(points[j].x, points[j].y, points[j].z);
+                       glNormal3f(0, 0, 1);
+                       glTexCoord2f(0, 1); glVertex3f(prev_points[j].x, prev_points[j].y, prev_points[j].z);
+               }
+               /*  Save current polygon coordinates for next position */
+               for (i=0; i<10; i++)
+               {
+                       prev_points[i].x = points[i].x;
+                       prev_points[i].y = points[i].y;
+                       prev_points[i].z = points[i].z;
+               }
+       }
+       glEnd();
+       cam_pos = cmpos;
+}
+
+/* =================== Show splash screen =================================== */
+void SplashScreen(int do_wire, int do_texture, int do_light)
+{
+       if (ModeX > 0)
+       {
+               /*  Reset tunnel and camera position */
+               if (!ModeXFlag)
+               {
+                       cam_pos = path;                 
+                       cam_t = 0;
+                       tFlag = 0;
+                       ModeXFlag = 1;
+                       current_texture++;
+                       if (current_texture > 2) current_texture = 0;
+               }
+               /*  Now we want to draw splash screen */
+               glLoadIdentity();
+               /*  Disable all unused features */
+               glDisable(GL_DEPTH_TEST);
+               glDisable(GL_LIGHTING);
+               glDisable(GL_FOG);
+               glDisable(GL_CULL_FACE);
+
+               glBlendFunc(GL_SRC_ALPHA, GL_DST_ALPHA);
+               glEnable(GL_BLEND);
+               glDisable(GL_TEXTURE_2D);
+               glColor4f(1, 1, 1, ModeX);
+               
+               /*  Draw splash screen (simply quad) */
+               glBegin(GL_QUADS);
+               glVertex3f(-10, -10, -1);
+               glVertex3f(10, -10, -1);
+               glVertex3f(10, 10, -1);
+               glVertex3f(-10, 10, -1);
+               glEnd();
+
+               ModeX -= 0.05;
+               if (ModeX <= 0) ModeX = 0;
+
+               if (!do_wire)
+               {
+                       glEnable(GL_CULL_FACE);
+                       glEnable(GL_DEPTH_TEST);
+               }
+               if (do_light)
+               {
+                       glEnable(GL_LIGHTING);
+                       glEnable(GL_FOG);
+               }
+               if (do_texture)
+               {
+                       glEnable(GL_TEXTURE_2D);
+               }
+               glDisable(GL_BLEND);
+               glColor4f(1, 1, 1, 1);
+       }
+}
+#endif
diff --git a/hacks/glx/tunnel_draw.h b/hacks/glx/tunnel_draw.h
new file mode 100644 (file)
index 0000000..0441925
--- /dev/null
@@ -0,0 +1,3 @@
+extern void DrawTunnel(int do_texture, int do_light, GLuint *textures);
+extern void SplashScreen(int do_wire, int do_texture, int do_light);
+extern void InitTunnel(void);
diff --git a/hacks/images/tunnel0.xpm b/hacks/images/tunnel0.xpm
new file mode 100644 (file)
index 0000000..d3238a2
--- /dev/null
@@ -0,0 +1,198 @@
+/* XPM */
+static char *texture0[] = {
+/* columns rows colors chars-per-pixel */
+"128 128 64 1",
+"  c #020202",
+". c gray2",
+"X c #090909",
+"o c gray5",
+"O c gray7",
+"+ c #151515",
+"@ c #191919",
+"# c #1d1d1d",
+"$ c #222222",
+"% c gray15",
+"& c #2a2a2a",
+"* c #2d2d2d",
+"= c #323232",
+"- c gray21",
+"; c #3a3a3a",
+": c gray24",
+"> c gray26",
+", c gray27",
+"< c #494949",
+"1 c #4e4e4e",
+"2 c gray32",
+"3 c #565656",
+"4 c gray35",
+"5 c #5d5d5d",
+"6 c gray38",
+"7 c gray40",
+"8 c #6a6a6a",
+"9 c gray43",
+"0 c #727272",
+"q c gray46",
+"w c gray48",
+"e c gray49",
+"r c #818181",
+"t c gray52",
+"y c #898989",
+"u c #8e8e8e",
+"i c #929292",
+"p c #959595",
+"a c #9a9a9a",
+"s c gray62",
+"d c gray63",
+"f c #a5a5a5",
+"g c darkgray",
+"h c #aeaeae",
+"j c #b1b1b1",
+"k c gray71",
+"l c gray73",
+"z c #bebebe",
+"x c #c1c1c1",
+"c c #c5c5c5",
+"v c #cacaca",
+"b c #cdcdcd",
+"n c gray82",
+"m c #d5d5d5",
+"M c gray85",
+"N c gray87",
+"B c #e1e1e1",
+"V c gray90",
+"C c #e9e9e9",
+"Z c gray93",
+"A c #f1f1f1",
+"S c #f6f6f6",
+"D c gray98",
+"F c #fdfdfd",
+/* pixels */
+"FFFFDDSAAZVNMnzg,ihzvvvbbvcxxkgp;eahllzzzzlkjhau-qpfhjkklkkjhdpw-tagjkkllllkjgau-wpgjklzzzzlljfi;rdjzxcvbbvvvxlf,pkvMNBCZASSDDFF",
+"FFFDFDSSZZVBMbxg,ihzcvvbbvvxzkgp;eahkkllzllkjgay-qifhhjkkjhgdae-epfhklzzzzlkkhdu-wagkklzxxzzljfi;rdjzxcvbbbvvxlf>pkbmMVCZASDDDFF",
+"FFFFDDSAACVNMnzg,ihzvcvbvvcxzkfi;eahkkllzllkjgat-0udgghhhhgape-rafhklzxxzxzlkhdu-wahkllzxxzzlkfi;rdkxxvvbbbvvclf,pkbMNVCZASDDDFF",
+"FFFDDDSAACVNMbxg>uhzccvvvvcxzjfi;wagkkllllkjhfar=9yaffgggfaiw-eafjlzxxccxxxzljfu;wahklzxxxxzljgp;rdkzxcbbbbbvxkf,pkvmNVCZASDDDFF",
+"FFFDDDSAZCVNMbzf>ihzccvvvvczljfu;wpgjjkllkkjhdpr=9tadfffdauw=epfhkzxccccvcxzlkfi;eahllzxxxxzlkgp:rdkxxcbbbbvvxlf,pkbMNVCZASSDDFF",
+"FFDDDSSAZCVNmbzf>ugzcccvvcxzljdu;wpfjjkkkkjhgdpe*8tpaadapuq-wpdhklxccvvvvcczljfi;eajllxxxcxzlkfp:rdkxxvvbbbvvxlf,pkvmMVCZASSDDDF",
+"FDDDDSAAZCBNmbzf>uglxcccccxzlhdu-qpfhjjkkjhggaiw*7riappiyq=wpdhkzxccvvbbvvcxzkfi;rahllxxccxzzkgp;rdkxxvvbbbvvxlf,pkvMNBCZASSDDDF",
+"DDDDDSAZZCBMmblf>uglxxcccxxlkhdy-qidhhjjjjhgfauq*5wyiuyr9*qidhkzxcvvbbbbbvcxzkgp;rajllxxcxxxlkfp;tdkzxvvbbbvvxkf>pkvmMBCZAASSDDD",
+"FDDDSSAZCCBMmvld>uflxxcccxzlkhay-qudghhjjhgfday0&5qryte8*0uagjlxcvvbbnnnbvcxxkgp;rajlzxxccxzzkgp:rdkzxvbbbbvvxkf,pkvmMBCCZASSDDD",
+"DDDSSSAZCVBMnvld>ufkxzxxcxzljgay=0uagghhhhgfapt9&30eeq7&8yafjkzccvbnnnnnbbvczlgp:rdjlzxcccxxlkgp;rdkzxcvbbbvvxkf>ikvmMBVZZASSSSD",
+"DSSSSAZZCVNMnvld:yfkzzxxxzlkjgat-0uaffgggffaair8%17095&8tpfhkzxvvbnnnnnnnbvcxlgp:rajlzzxcxxzzkgp:rdkzxcvvbvvvxkd>ijvmMBVCZASSSSD",
+"SSSSSAZZVVNmnckd:tfjlzzzzzlkhgat=9yadfffffaapyw6$<563%6riahjlzcvbbnnmmmnnbvczlgp:rajllxxccxzljfp;rdjzzcvvvvvcxkd,ijvnmNVCZASASSS",
+"SSSAAAZCVBNmbcka:tdjllzzzlljhfpr=8tpdddfddaaitq5#:1<$4wuafjkzxcvbnnmmmmnnbvcxlgp;rajlzxxxcxzljgp:rdjzxcvvvvvczkd>ijcnmNVCZZAASSS",
+"ASSAAACCVBMnbxja:tdjllllllkjgdpe*8tpaaddaaaiye93@-;@29tpdgjlxcvbnnmmmmnnnbvcxkgp;rdjllxxxxxzljfi;rdkzzccvvvcczjd>ihcnmNVVCZAASSA",
+"AAAAZZCVBNMnvxja:rajkklllkjhgdiw*7riaaaaapiytw7<+$+<8wuafjkzxcvbnnmmmmmmnnvcxlgp:rahllxxxxxzljfi;eajlzxcvvvcxzjd>uhcnmMBVCZZAAAA",
+"AAAZZCVVBNmbvzhp;rahjjkkkjjgfauq*6eupppppiute94:oX;5qtpdgjlxccbnnnmmmmmnnnvczlgp;rahllzxxxzlljdi;eajlzxccccxxzja:uhxbnMBVCCZZAAA",
+"ZAZZCCVBNMmbczhp;eagjjjjkjhgdayq*5wyiiiiiute07<& #18euafhjlxcvbbnmmmmmmmnbvcxkgi;eahklzzxzzlkjdi;eahllzccccxzlja:yhxbnMNBVCCZZZZ",
+"ZZZCCCBBNMnvclgi;wpfhhjjjhgfdpy0&4qtyuuuuteq84-oX*30ruaghklxcvbnnmmmmmmnnbvxzkgi;eahlllzzzzlkhdu;eahklzxcccxzlha>ygzvnmNBVVCZZZZ",
+"ZCCCVVBNMmbvxkfi-wifghhhhgfdair9%30rttttreq84:O%O-5qyiagjklxcvbnnmmmmmnnnbvxzkfi;eahkklzzzzkkhdu-wahklzxxxxzzkha:ygzvbmMNBVVCCCZ",
+"CVVVBBNMmnbczkfu-0idgggggfdapue8%28wrrrew074:+=-O:6eypdgjkzxcvbnnnnmmmnnbbcxzkfi;wagjklllzlkjhau-qpgjklzxxzzlkgp:tflcvnmNNBVVVVC",
+"VVVBBNMmmnvxljdy-0uaffgffdaapye7$17qwewq084>+-,>@>7eupdgjkzxcvbbnnnmnmnnbvcxzjfu;wagjjllllkkjgay-qpfjklzzzzlljfi;rflcvbmMNNBVVVV",
+"BBBBNNMmnbczlhat=9yaddddddaputq5$<60qq0974>+;11<@,7eupdgjkzxcvvbnnnnnnnbbvczljdu-qpfjjkklkkjhgat-0ifjjklzlllkjfi;rdkxcbnmMNNBBBB",
+"NNNMMMmnbvxlkgar=8tpaaaaaapuyr04#,5798763:@:233<@,8ruadgjklxccvvbbnbnbbvvcxlkhdy-qidhhjkkkjhhfpr-0udghkkllkkjhdu;eajzxvbnmMNNNNB",
+"MMMMmnbbcxzkhfpe*7eupaaaapuytw82@:266541;+:24541#,8rupdghklzxccvbbbbbbvvcczlkhay-0udggjjjjhhgdpr=9uaggjjkkkjjgay;wahlzcvnnmmMMMM",
+"mmmnnbbvcxljgdiw*6wyiiiiiiyteq71+-1342<-+;146642#,8rupaghklzzxcvvvbvvvvccxzkjgat=0yafghhhhhgfaie*8yaffhhjjjhgfat-qpgklxcvbnmmmmm",
+"mnnbbvcxzljhfay0&5qtuuuuuyteq95,+=><<,=O-<356652#<8eyiafghklzxxcccvvvccxxzljhfpr=8yadfgggggfdauw*7tpdfgghhhgfdpr-0pfjkzxcvbbnnnn",
+"bbvvcxxzlkhfapr9&39ertttrreq972:O&-:;&O=,2466641@,7wyiafghjklzzxxxxxxxxzzlkhgdie*8tpadffgfdaaiy0*6riaadfgfffdaie=9uahjkzxccvvvbb",
+"cxxxzzlkjhfaaue7$18qeeeewq0874<=o#&*$o&:1356664<@>6wtupadfhhkkllzzzzzzllkjhgdayq*6euaaaaddaapur9&4wypaaddddaapyq*7tafgjklzzxxccc",
+"xxxzlkkjhfaaitq5$,690qqq008641:&X+#@X$-,1355653<@:5qryiadfghjkkkllzzllkkjhgfapt0&5wyipaaaaapuye8%30tiipaaaaapur0&6epafhjjllzxxxx",
+"kkjjhhgddaputw83@:36788876531>=$.Xo.@&;,1244442>+;38weyipadffghhhhjjjhhggfdapue8%29ryyuiiiuyte05$18wtyuuiiiuytw7%3qypadfghjjjkkk",
+"daaaappiutew084>+*,2333321<>;*$O   o#%-:,,<1<<>-O*<579wetyuipaaaaaaaaaaapiutrw93#,59qweeeewwq961@:480qweereww083#,7qrtuipaaaddad",
+"rreewqq997642<:%X+&--;---=&%#+o.  .X+@$&*=---=*$X@=>1356890qqwwerrrrreeww008751;O&>24456665432,=o%:<3455665543<;O*,46790qweerrrr",
+";;;-;--=**&%$#@o XO++++++OooX.     .XooO++++@+Oo.X+#$%&**==--;;;;;;;;;;;--=**&$@.O#$%&&&&&&%%$#+.o@$%&&&*&&&%%$+.O#%&*=----;;;;;",
+"iiiuuutrew0864<-o$-:>>>>:;=&#+X   O#&=;:,,<<<,:=o%>3680wertyuiiippppiiiuuytew961@;36890q0009863,+=1578900009974<@;480wrtyyuiiiii",
+"ffddaaapuyteq84>+*>132211,:=%O.. o$=:,134555643,+;49qetippaddfggggggggffdaaiutq6$18wrrtyyttreq83#,60werttyttew95$19eyupaadffffgf",
+"kjjhggfdaaiyrq71@-1455442<:=#.O+.@*>146899000862#,7wtupadggjjjkklllllkkjhhgdait9%4qtuipappiuurq6%29eyyippppiuye8%4wypadfghjjjkkk",
+"llkkkjhffapite83@:2566543<;%X#%$X$:14780qwwwwq85$19tiadfhjkllzzxxxxxxxzllkjgfauq*6eiaaaadaaapue8%4qyipaaaaaapit0&6rpafghjkllzlzz",
+"xzzllkjhgfaiyr93#:3676541,*o%=-&o%,4780werrrre06%3qyaafhjklzxxcccvvvvccxzlkjgdie*7tpaddffdfaait0&5eupaadddfdapyq*7tadghjkllzzxxz",
+"ccxxzlkjhgaair04#>367652<-O*:,>-O=169qertyyyttw8%5eiafhklzxcvvvbnbbbbbvvcxzkjgar=9yadfgggggfaauq*7rpadfgfggfdaue*8yaghklzzxccccc",
+"vccxxzljjgdaitq4#>466531-O-,221>+;39qetyuiuiiyr0&6rafhjlxccvbnnmmmnmnnnbvcxzkhay-0udgghhhhhgfaie*7tadfgghhhgfair=0udhjlzxcccvvvv",
+"vvvcxzlkjhfaptq5#>35642;O;14543<@:50eryiippaputq*8yagjkzccbbnmmMMMMmMmmnnbcxzjdu-qifhhjjjjjhfdpe=9yafghhjjhhgdpt=0ifjklxccvvbbbb",
+"bvvccxzljhfaiyq4#>2442:+:2567751@,7qttipaaaaapyw*8udhkzcvbnmmMMMMNNNMMmmnbvxzkfu;wpgjjkkkkjjhdar=9uagghjjkjhhfat-qigkkzccvbbbbbb",
+"bbbvcxzlkhfaiyq4#:131:@>36890973#<8eyupaaaddaaue=9ifjlzcvnmMMNNBBNBBNNNMMmbcxlgi;eagjkllllkjhfat=0idhhjkkkkjjgay-qpgklxcvbbnnnnn",
+"nnbvvczlkhfait04@;<<;+>489qqw095$20ruiaddffffapr=0pgkzcvbmMNNBBBVVVBBBNNMmnvclhp;rahkllzzzlkjgay-qifhjkllllkjhay;wahlzxcvbbnnnnn",
+"nnbbcczlkhfait03@-:;+:480wweew06$30tiaaffggffdat-qahlzvbnMNNBBVVCVCVVVBBNMnbczja:rajllzzxzzkkhay-qpfjjkllllkjhdu-wahlzcvbbnnmnmn",
+"nnbvvczljhfair91+&*+:38qerrttrq7%4wyaadfgghggfay-wahzxvnmMNBVVCCCCCCCVVBNMmnvxja:tdkzzzxxxzlkhdu-wpgjkklzzzkkhdu;eahlzcvbnnmmmmn",
+"mnbbvxzljhdaue7<O@O;38qettyyyte8&5wuadfghhhhhgau;eakxcbmmNBVVCCZZZZCCCVVBNMnbxka:ydkzzxxxxzlkjdu;wagkklzzzzlkhfi;rajzzcvnnnmmmmm",
+"nnbvvxzkjgaiyq5:oX=37qetuuiiuyr9&5riafghjjjjjgdu;rdkxcnmMBBVCCZZZZZZZCCVBNMmbcla>yfkzxxcccxzljfu;eahklzzzzzlljfi;rakzxvbnnmmmmmm",
+"mnbvcxzkjfair03* #,60etuippiiut0&6rpdfhjkkkkjhdi;rdlcvnMNBVCCZZZAAAZZZCCVBNmbckd>yfkxxccvcxzljfi;eahklzzxxzlljfi;rakzxvbbnmmmmmm",
+"nnbvcxlkhfayw7:OX*39eruiaaaapitq*7tafghjkkkkkhfi;tflcbmMBVVZZZAAAAAAAZZCVBNmnvld>uglxxccvccxlkgi;rahllzxxxxzljfp:rdkxxvbnnnmmmmn",
+"nbbcxzkjgair91@*+;5qtyipaaaaapyw*8taggjkllllkjfp:tfzvbmNBVCZZAAAAAASAAZCCVBMnvld>uglcccvvvcxzkgi;eajllzxxxxzljgi;rdkxxvbnnmmmmmm",
+"nbvcxlkhdatq3#>,@,7eyuaadddddauw=9uaghklllzllkga:ygzvnMNBVZZAASSSSSSSAAZCVBMmvlf>uglccvvvvcxzkgp:rahllxxxcxzlkfi;rdjzxcbnnmmmmmn",
+"nbcxxljgaie5$142#19rupaddffffaie=9udhjklzzzzlkha:ygxbnMBVCZZAASSSSSSSAAZZVBMmvzf>uhzcvvvvvcxxkhp;rajllxxccxzlkfi:rdkzxcbnnnmmmnn",
+"bvcxzkhdpt7%4774$20yiaaffggffapr=0idhjkzxzzzzkha>yhxbnNBVCZZASSSSDSSSSAZZCBMmbzf>uhzccvbbvvxzlgp;rdjlzxxcxxzlkgp:rdkxxvbnnnmnnnn",
+"vcxzkhday8&60q06%4wuaafgghgggdpr=0ifjjlzxxxxzlja>uhxnmNBVZZASSSDDDDSSSAAZCBNMbzf>ihzvvvbbvvxxkgp:rdjlzxcccxzlkfp;rdkzxcbbnnnnnnb",
+"cczljgay9*7wrrw8%5eiadgghhhhgdat-qpgjkzxxccxxlja:uhcnmNVCZAASSDDDDDSSSAAZCVNMbzg,ihzcvbbbvvcxlgp;tajlzxxccxzlkgp;rdjzxcbbbnnnbbv",
+"cxzkgdu0*8eyyyr0&6rpdfghhjjhhfat-qpgklzxcccxxzjd>ujcnMNVCZASSSDDDFDDDSSAZCVNMnxg,ihzvvvbbvvcxlga:rdjzzxxcxxzlkfp:rdjzxcvbbbnbbvv",
+"xzkhdpw=0ruiiutq*7tpdghjjjjjhgay-qphklzxccccxzja>ujcnMNVCZASSDDDDDDDDSSAZZVNMbzg,ihxvvbbbvvcxlhp:rdjlzxxccxzljfi;rajzzcvvbbbbbvc",
+"zkhdpw-qupaaapyw*8yafghkkkkjjgay-wahkzxcccccczkd>ijvmMBVZZASSDDFFFDDDSSAAZVNMnzg,ihxvvbbbbvxxlgp:rdjlzxxcxxzlkfi;rajlzccvvvvvccz",
+"khfiw=wiaaaddaue=9uaghjklkkkjhdu;wahkzxcvvvvczkd>ijvmMBCZASSDDDFFFDDDDSAZZVBMnxg,ihxvcbbbbvcxlhp;rajlzxxxxzzljfi;eahllxccvvccczz",
+"hfpe-wiadffffapr=9udghjklllkjhdu;wajzzxvvvvccxkf>ikvmMBCZZSSDDDFFFFFDDSSAZVBMnxg,ijxvvbbbbvcxlgp:rdjlzzxxxxzljdi;eahllxxccccxxzk",
+"fae-wiafghhggdpr=0idhjkllllkkhdu;eajlzxcvvvvcxkd>pkvmMBCZASSDDFFFFDFDDSAAZVBMnxg,ijxvvbbbbvcxkgp;rajllzxxxzlkjdi;wahklzxxxxxxzkh",
+"pr;epdghjjjhhfat=qifhjkllzlkkhfu;eajzzcvvvvvvxkf,pkvmMBCZASSDDFFFFFFDDSSAZVBMnxg,ihxcvvbbbvxxlgp:rajllzxxxzlkjdu-wpgkklzxxzzlkhf",
+"q-radhjkkkkjjgay-qifjklzzzzlkjfi;rdjzzcvbbbvvxkf,pkvMNVCZASSDDFFFFFFDDSAZZVNMnxg,ihzvvvbbvvxxkgp;eahklzzzzllkhau-wpgjjlllzlkkhfa",
+"-epfhjkllllkjgay-qpgjklzzzzlljfi;rdjzxcvbbbvvckf,pkvmMVCZASSDFFFFFFFDDSSAZVBMnxg,ihzvvbbbvcxzkgi;eahklzzzzlkkhdy-qpfhjkllkkjhfpe",
+"tafhkkzzzzlkkhdu;wpgkklzxzzzljfi;rdjzxcvbbbvvxlf,pkvMNVCZASDDDFFFFFDDDSAZCVNMnxg>ihzccvbbvvxzkgp;eahklllzllkjgay-qidhhjkkjhgdae;",
+"afhlzzxxxxzlkhdu;wahklzzxxxzljfp;rdkzxvvbbbvvxkf,pkbMNVCZASSDDFFFFFDDDSAACVBMbzg,ihzvvvvvvcxzjfi;eahkkllzllkjfat-0idgghjhhfdpe-r",
+"gjkzxxcccxzzljfi;wahklzxxxxzljfp:rdkxxcvbbbvvxlf,pkvMMVCZASDDDFFFFFDDDSAACVNMbzg>uhzccvvvvcxzkfi;eagjjllllkjhfar=9uaffgggfaiw-ea",
+"jkzxccccccxzljfi;eahllzxxxxzlkgp;rdkzxvvbbbvvxlf,pkvMNVCZASSDDFFFFFDDDSAZCBNMbzg>ihzccvvvcczlkfu;wagjkkllkkjhfpr=8yaddffdauw-epf",
+"klxccvvvvccxzjfi;eahklzxcxxzlkfp;rdkxxvvbbbvvxlf,pkvmNBCZASSDDDFFFDDDSSAZCVNmbzf>igzcccvvcxzljdu-wpfjjkkkkjhgdie*8tpaaaapuq-wpdh",
+"zzcvvvbbbvcxzkfi;eajllxxccxxlkgp;tdkxxvvbbbvvxlf,pkvMMBCZASSSDDDFDDDDSSAZCVNmbzf>uglccccvcxzlhdu-qpfhhjkkjhhfaiw*7eiappiy0=wpdhk",
+"xcvvbbbbbvcxzkgp;rajlzxxcxxxzkfi;tdkzxvbbbbvvxkf,pkvmMBCZAASDDDDDFDDSSAZZCBMmvlf>uglxxcccxxzkhdy-qidhhjjjjhgfauq*6wyiuyr9*qpdgkz",
+"ccvbbnnbbvvxxkgp:rdjlzxxcxxzzkgp:rdkzxvvbbvvvxlf>pkvmMBCZAASSDDDDDDDSSAZCCBMmvld>yflxxcccxzlkhay-qidghhhjhgfday0&5qryrw8*0uahjlx",
+"vvbnnnnnnbvxzlgp;rajlzxxccxxzkgp:rdkzxcvbbbvvxkf>ijvmMBVCZASSSDDDDSDSSAZCVBMnvld>yflzzxxxxzlkhay-0uagghhhgfdait9%40eeq7*9yafjlzx",
+"vbbnnnnnnbvcxkgp;rajllxxcxxzlkgp;rdkzxcvbbvvcxkd>ijvmMBVCZASSSSSDSSSSAAZCVNMncld>yfkzzxxxzlkjgat=0uaffggggfaair8%27095&8tpfhklxv",
+"bbnmmmmnnbvcxlgp;rdjlzxcccxzlkfp;rdkzxcvvvvvcxkd,ijvnmNVCZZSSSSSSSSSAAZCCVNmnvka>tfjzlzzzzlkjfar=9yadfffffdapyw6$,463%6riagkzzcv",
+"bnnmmmmnnbvczlgp:rajlzxxxcxzljfi:rdkzxcvvvvcczkd>ijcnmNVCCZAASSSSSSAAAZCVBNmbcka:tdjllzzzlkjhfpr=8tpdddfddapitq5#:1<$4wuafjkzxcb",
+"nnnmmmmnnbvcxlgp:rajllzxcxxzlkfi;rajzzccvvvcczjd>ijcnmNVCCZAAAASSSAAAACCVBMnbxka:tdjllllllkjhdpe=8tiaadddapiyr93@-;#29tpdgjlzcvb",
+"nnmmmmmmnnvcxlgp:rajlzzxxxxzljfi;rajlzxcvvvcxzjd>ujcnmMBVCZZAAASSAAAZZCVBNMnvxja:rahkklllkjhgaiw*7riaaaaapiutw7<O$+<8eiafhkzxcvb",
+"nmmmmmmnnbvcxkgp;eahllzxxxzlljfi;eajlzxcccccxzja:uhxbnMBVCCZZAAAAAAZZCVVBNmbvzha:rahjjkkkkjgfauw&6euppappiyte04;oX;5qtpdgjlxccbb",
+"nmmmmmmnnnvczkgp;eahklzzxxzlkjfu;eahllxccccxxlha>yhxbnMNBVCCZZZZZAZZZCVBNMmbczhp;eagjjkjkjhfdayq*5wyuiiiiute071% #18euafhjlxcvvn",
+"mnmmmmmnnbvczkgi;eahklzzzzzlkhdu;wahklzxcccxzlha:ygzvnmNBVVCZZZZZZZCCVBBNMnvclgi;wpfhhjjjhgfdpt0&4qtuuuuyteq73-oX*30ruafhklxcvbn",
+"nnmmmmmnbbvczkfi;eahkklzzzlkkhdu-wagklzxxxxzzkha:yfzvbmMNBVVCCCZCCCCVVBNMmbvxkfi;widhghhhggdair9%40ettytreq84:O%O-5qyiagjkzxcvbb",
+"nnmmmmnnbbcxzkfi;wagkklllzlkkgdu-wpgjklzxxzzlkgp:tflcvnMNNBVVVVCCVVVVBNMmnbczkfu-0udfggggfdaaue8%29wrrrewq84:+=;O:6eupdgjklxcvbb",
+"nnmmnmnbbvczljdu-wpgjjllllljjgay-qpgjklzzzzlljfi;rflcvnmMNNBBVVVVVVBBNNmnnvxzjdy-0uaffffffaapyw7$17qewwq084>+;,>@>7eupdgjkzxcvbb",
+"nnnnnnnbvvczljdu-qpfjjkklkkjhgat-qifhjklllllkhfi;rdkxcbnmMNBBBBBBBBBNMMmnbczlhat=9yaddddddaputq5$<69qq0974>+:<1,@,8eupdgjkzxcvbb",
+"bbnbnbbvvcxzlhdy-qidhhjkkjjhgfpr=0udghjllklkjhdu;eajzxvbnmMMNNNBNNNMMmmnbcxlkgar=8tpaaaaaapuyr94#>5798763:+:233<@<8euadgjkzxccvb",
+"bbbbbbvvcczlkhat-0idgghjjjhhgdpr=9yaghjjkkkjhgay-wahlzcvbnmMMMMMMMMMmnnvvczkhfpe*7riaaaappuytw82@:356541:+;24541#,8rupdghklzxccv",
+"vvvvbvvccxzkjgat=0yafghhhhhgfaie=8yafghhjjjhgfat-qpgklxcbbnnmmmmmmmmnbbvcxljhdiw&6eyiiiiiuyte071@-1342<-O-146652#,8rupaghjlzzxcv",
+"vcvvvccxxzljhfpr=9yadfggggffdauw*7tpddghhhhggdpr=0ifjkzxcvbnnnnnmnnbbvcczlkgfayq&5qtuuuuyyteq95,+=>1<,=O-<356651#,8eupafhjklzxxc",
+"xxxxxxxzllkhgdie*7tpaddfffddapy0&6eiaaffffffdaie*9udhjkzxccvvbbbbvvvccxllkhfapt9%30etrtttrwq973:O%-:;&O=,2466651@,7eyiadfhjklzzx",
+"zzzzzzllkjhgfayq*6euaaadddaapur9&5wypaaadddaapyq*7tafgjklzzxcxxccxxxzllkjhfapye7$18qeeewwq0964<-o#&*$o&:13566641@>6qtypadghhjkll",
+"lllllllkjhgfapy0&4wyippaaaapiyw8%30tuipaaaaapir0&6rpadgjkklzzxxxxzxzlkkjhfaaitq5$,690qqqq98641:&X+#@X$-,2346653<@:5qryiadfghjkkl",
+"jjhjjjhggfdapue8%29ryyuiiiuyte05$18wttuuiiiuytw7%4qypadfghhjkkkkkjjjhhgddaputw83@:36888886531>=#.oo.@&;,1334432>+;39wryipadffghh",
+"aaaaaaaapiutrw93#,59qweeeeww0961@:480qweereew073#,7qrtuipaaaaddddadaappiytrw084>+*,2333321<>;=$O   o#&-:,,<<1<>-O*<579wetyuippaa",
+"rrrreeewwq98751;O*>24456655432,-o%:<3455665543<;O*,4689qqweeerrrreeewwq997642<;%X@&---;--=&$#+o.  .XO@$&*=---=*$.@=>1356890qqwee",
+"::;;;;;;--=**&$@.O#$%&&&&&&&%$@+.o@$%&&&&&&&%%#@.O#%&*=---;;;;;;;;;;--==**&%$#@o .O++++++OooX.     .XXoO++++@+Oo X+#$%&**==--;;;",
+"pppppiiuuytew061@;369900q099863>+=1578900009974<@;48qwetyuuuiipiiiiuuytrew0864<-o$-:,>>>:;=&#+.   O#&=;>,<<<<,:=o&>3680qertyuuii",
+"ggggggfddaaiutq6$18wrrtyyttreq83#,60wertyttrrw95$18eyupaaddfffgffffdaaapiyreq84>+*,132211,:=%O.. o$=:,134555642,+;48weyuipaddfff",
+"lllllkkjhhgdait9&4qtuipappiiurw6$29eyuiipppiute8%4qupadfghjjjkkkjjjhhgfdaaiyrq71@-1455542<:=#.O+.+=>246789009962#,7wtupadghjjkkk",
+"xxcxxxzzlkjgfauw&6euaaaadaaapye9%4qyipaaaaaaait0&6rpadgjjklllllzlllkkjhffaaiye83@:2566543<;%X#%$X$:14690qwwwwq85$10tipdfhjjlzzzx",
+"vcvvcccxzlkjgdie*7tpaadfffdaait0&5euaaaddfdaapyq*7tafghjklzzzzxxzzzlkkjhgdaiyr93#:3676542>*o%=-&o%,4780werrrre06%3qyaafhjklzxxcc",
+"bbbbbbvvcxzkjfar=9yaffgghgfdaayq*7riadffggffdaue*9yafhklzzxccccccxxzzlkjhgaaur04#>367652<-O*:,>-O=169qertyyyyrw8%5eiafhklzxcvvbb",
+"mmmmnnbbbcxzkhay-qudghhhjhhgfaie*8tadfgghhggfdpr=0udhjlzxccvvvvvvvcxxzlkjgdaitq5#>366531-O-<221>+;48qetyuuiiiyr0&6rafhjlxcvvbnnm",
+"MMMmMmmnnbcxljdu-qifhhjjkjjhfdpe*9yafghhjjhhgdat=0ifjklxcvvvbbbbvvvcxxlkjhfaptq4#>36641;+;14553,@:50eryippppputq*8yagjlxxvbbnmmM",
+"NNNNNMmmnbvczkfu;wpgjjkklkjhgfar=9uagghjjkjhhfat-qpfjkzxcvvbbbnbbbvccxzljhfaiyq4#:2442:+:2567751@,7wryipaaaaapyw*8udhjzxvvnmmMMM",
+"NBNBNNMMmnbcxlgi;eahjkklllkjhgat=0idhhjkkkjjhgay-qpgklxcvbbnnnnnbbbvcxzlkhfaptq4#:132:+>36899973#<8eyupaaddaaaue=9ufjlxcvbmmMNNB",
+"VVVBBBBNMmnbclhp;rahkllzzzlkjgay-qifhjkllllkjgdy;wahlzxcvbbnnnnnnnbvvxzlkhfaitq4@;<<;+>479qww085$19rupadfffffapr=qpgkzcvnmMNNBBB",
+"VVVVVVBNNMmbczja:rajllzzzzzkkhay-qpfjjklzllkjhdu-wahlzcvbbnnmmmnnnbvvczlkhfait93@=:-+>480weeew06%30yiaaffggffdat-qahlzvbmmNNBBVV",
+"CCCCCVVBNMmbvxja:tdklzzxxxzlkhdu-wagjjllzzlkkhdu;eajlxcvbnnmnmmnnnbbcczlkhfaur92@**+:380errttrq7%3qupadfgghggfay-wahzxvnmMNBVVVC",
+"ZZZZCCVVBNMnbxka:tfkzzxcxxzlkjdu-wagkklzzzzlkhdi;eajzxcbnnmmmmmnmnbbvczlkgdpue7<O@O;370ertyyyte8&4wuadfghhjhhfay;eakxcbmMNBVVCCZ",
+"ZZZZZZCVVNMmbckd>yfkxxxcccxzljfu;wahklzzxzzlljfi;edjzxcbbnmmmmmmmnbvcxzkjgdiyq6:oX=37qrtuuiiuyr9&5epafghjjjjjgdi;rdkxcnmMNVVCCZZ",
+"AAAZZZCCVBNmbcld>yflxxccccxzljfi;eahklzzxxzzljfi;rdjzxvbnnmmmmmmnnbvvxzkjfair93* #,60etuiippiut0&7rpdfhjkkkkjhdi;rdlcvnMNBVCCZZZ",
+"AAAAAZZCVBNmncld>yglxxcvvvxxzkfi;eajllzxxxxlljfp;rdkxxcbnnnmmmmnnnbvcxljhfayw7>oX*39eruipaaaaptq*7tafghjkkkkkjfi;rflcbmMNVCCZZAA",
+"SAASAAZZCVBMnvld>uglxccvvccxzkgi;eahllzxxxxzljfp;rdjzxcbnnmmmmmmnnbcczkjgair91@*+:5qryiaaaaaapyw*8yafgjklllkkjfp:tfzvbmNBVCZZZAS",
+"SSSSAAAZCVBMmvlf>ugzccvvvvcxzkgp:rdjllxxcxxzzjgi;rdkxxvbnnmmmmmnnbvcxlkgdayq3#>,@,7eyipaddddaauw*9udghkklzzzljgp:ygzvnMNBVZZAASS",
+"SSSSAAAZCCBMmbzf>ugzccvvbvvxzlgp;rajllxxcxxzzkgi:rdkzxvbnnnmmmnnbbcczljgaie5$142#19ripadfffddaie=9udhhklzzzzlkga:ygxbnMBVCZAASSS",
+"SDSSSSAZZVBNmbzf>ihzcvvbbvcxxkgp;rdjlzxccxxzlkfi;rdkxxvbnnnmnnnnbvcxzkhdpt7%3774$20yiaaffggffdir=0idhjlzzzzzzkha>yhxbmNBVCZAASSS",
+"DDSSSSAAZCBNmbzf,uhzvcvbbvcczlgp:rajlzxxccxzlkfp;rdkzxcbbnnnnnbbvcxlkhfay8&60q06%3wuaafgghgggdpt-0ifjklzxxxxxlha>uhxnmNBVCZAASSD",
+"DDDDDSAAZCVNMbzg,ihzvvbbbvvcxlhp:rdjlzxcccxzlkgp;rdjzxcbbbnnnnbvvczljgay9*7wrrw9&5eiadfghhhhgdat-qpfjkzxxccxxljd:uhcnmNBCZAASSDD",
+"DDDDDSSAZCVNMbxg,ihzvvvbbbvcxlgp:rajzzxxccxzzkfi;rdjzxcvbbbbnbvvcxlkhai0*8rtuyr0&6rpafghjjjhhfat-qpgklzxcccxxzja>ujcnmBVCZASSSDD",
+"DDDDDSSAACVBMbxg,ihxvvbbbbvcxlgp:rdjlzxccxxzljfi;rajzxxvvvbbbvccxzkhdpw=0tuiiut0&7taffhjjkjjhgay-wpgklzcccccxzjd>ijvmMNVCZASSDDD",
+"FFDDDSSAZZVNMnzg,ihxvvbbbbvcxlhp:rajlzzxcxxzljfi;rajlzxvvvvvvccxzkhdpw=qypaaapyw*8yafghkkkkjjgdu-wahklxccvvcczjd>ijcmMBVZZASDDDD",
+"FFFDDDSAAZVNMnxg,ihzvcbbbbvcxlgp:rdjlzxxcxzzljfi;eajlzxccvvvccxzkhdpw-wiaaaddaue*9uaghjklkkkjgau-wahlzxccvvcczkd>ijvmMBCZASSDDDF",
+"FFFDDDSAAZVBMnxg,ijxvvbbbvvcxkgp:rajlzxxxxxzljfi;eahklxxccccxxzkjfpe=wiadffffapr=9udghkklllkjhdu;eajlzxvvvvccxkf>ikvmMBCZZSSDDDF",
+"FFFFDDSAZZVBMnxg,ijxcvvbbvvcxlhp;rdjllzxxxzlkjdu;wahklzxxxxxxzkhfar-eiafghhgfdpr=0idhjkllllkkhdu;rajlzxcvvvvcxkd>pjvmMVCZASSDDDF",
+"FFFFDDSSAZVBMnxg,ihxvvvbbbvcxlgp:rahllzxxxzlkjdu-wagkklzxxzzlkhfar-epdghjjjhhfat-qifjjklllllkhdi;rajzzcvvvvvvxkf>pkvmNBCZAASDDFF",
+"FFFFDDSAAZVBMnxg,ihzvvbbbvvxzkgp;rahklzzxzllkhau-qpgjjlllllkkhfpe-radhjkkkkjhgay-qpfjkkzzzzlkjfi;rajzxcvvbbvvxkf,pkvmNVCZASDDFFF"
+};
diff --git a/hacks/images/tunnel1.xpm b/hacks/images/tunnel1.xpm
new file mode 100644 (file)
index 0000000..ba1e71f
--- /dev/null
@@ -0,0 +1,134 @@
+/* XPM */
+static char *texture1[] = {
+/* columns rows colors chars-per-pixel */
+"64 64 64 1",
+"  c #1b0b06",
+". c #2a160c",
+"X c #2b1c15",
+"o c #34180e",
+"O c #361d16",
+"+ c #280d07",
+"@ c #382718",
+"# c #2b2416",
+"$ c #392925",
+"% c #3b3426",
+"& c #4a2918",
+"* c #472c24",
+"= c #483728",
+"- c #573729",
+"; c #573c36",
+": c #493a35",
+"> c #643e1c",
+", c #4a1b15",
+"< c #584738",
+"1 c #4e4431",
+"2 c #674d38",
+"3 c #605c28",
+"4 c #595248",
+"5 c #5f4a46",
+"6 c #655448",
+"7 c #675c52",
+"8 c #6e4f46",
+"9 c #6a6457",
+"0 c #766b55",
+"q c #797065",
+"w c #3c4e24",
+"e c #867a6e",
+"r c #907155",
+"t c #958a76",
+"y c #8e8a75",
+"u c #b5a27e",
+"i c #a59a71",
+"p c #9b9787",
+"a c #978c81",
+"s c #9ca68e",
+"d c #a69b88",
+"f c #b49c8d",
+"g c #a9a286",
+"h c #aca693",
+"j c #b5ac98",
+"k c #bbb499",
+"l c #b9ae8d",
+"z c #b9b5a7",
+"x c #acadac",
+"c c #c4ba9a",
+"v c #c8b18d",
+"b c #c5bba7",
+"n c #c3bcb6",
+"m c #cac3ab",
+"M c #cac8b8",
+"N c #d4c5ad",
+"B c #d7ccb4",
+"V c #d8d3ba",
+"C c #e8d8b9",
+"Z c #e4da9c",
+"A c #d6d5cb",
+"S c #e8dcc8",
+"D c #f0e9d2",
+"F c #f4f4e9",
+/* pixels */
+".:&=<5<:::<=<0evnBDSSSVbdaivnbCFj=*47$=:78ti0eetqAbBgbhMNBvldhkh",
+"*$@@$oOO@O#:%**:eMzbbMBbfhdhfbBAh=@15:#X%287=-&<qzbbMMVbgzbMmbbh",
+"@$$*@.*;:;=$%$;=evvcBCAbbnABABDb0#@=****1-5<=<==ezAbAASCbbvvMhjx",
+"@*$O.@=:*:*@##=$qkmvNMDbNcCbDSBmq=X@X*::=4&$O,@%ennNBSBbmBmnnvbj",
+"5=***=4;**1@$ #%qvkbmcSSBNNSFDAAt@$$:@&*-=,@@$=:7AAbBvmbmMBANnbk",
+"r-*;*=<=;-1%+ X.7zbjsznbSSVDFFSAa;1<*<<:;2-,-:<$9AAndpsjzSAFBjdj",
+"e*&4-5;<:$*+o#  <hhdhjMAFANASSAny02;5-<,-*2-85;*5AABjdjjzAAAmjjh",
+"8*@::;;5*$*@X$:.7pgsyggkSAmNVSnze-;2*,&*.,22685;qznBglbbmzBzcbzh",
+"8*#XO+o1===@@&@@9jjjjkckBbkhkbbMe*O*@*,&&22r8846yASVBBBkkmzcMMBV",
+"7=@.#XO@--6<=-*.<aljhcMVBmchkhhby<-82O1oy3<>*r80sDDMcBCmbbkbbkVm",
+"5O*  X$.$%1<:$..4xzkkkxVVBttdhhhe<;&&&;02<2&&-8esFFSBlmcmzkjmszk",
+"*.$@@=##@X@:%#O@9jghbbskBjdadkhhp2*o=@><-<488:5ehFFSBkBmzmbzbszp",
+"=@*O.@$=O@#oo&X$9zmkBmkmVMmgpxjxq1. X&;2<<<@2=2raFFFBulBcbcckhhg",
+":#XX@#@@o.@X#$$$7kzhcMbmMzziaspp9@$%=X*:1=,*52&8aFFFFCSSCvuccxhh",
+"X#X##X#@@&=:+#%@7mBdgbASzAppqeep4%:@=$*---&&<--6eFAFDSDCDCbckAhh",
+" .#@@$@%==:60@XX1gkkhmAAnzsaeeasq#@@#$OO=@$=;=@qjAADDCCCDNbjxhxp",
+"149900tyfeyuht976@=97eetqaqq9q9999qe0ihkhyghjpilaq7:6evbbfvdtteq",
+"<pjygdkkNNZbNNbty#.X+@*5*:*$$$X.9sshgcBSDBSCDVVVe5;;*<0e02*@$1@2",
+"#phpiukVBDDcSlbi0%%o@o$=-*<;X$X 4xxnmskMVVCCCBNCu1=*<;*<;;;,1<:<",
+"%phaetlmBCCCDCcl0#<2%==**:4-X#@$qszmclmVDDCZVmlBg*:$@@=<;;@*<2=2",
+"@tjdahfkNSDNNjule%=*1:1<**%=*%  %asxkilVBDCZSljNt.#O&=.*-@&26<,&",
+"<bftdujccBCCNcbvq=@:<7<*&+#X@.#X:phhzlbBNDDSSBNmy=@X*==<=,*511*$",
+"1hbvcNNbCSSSNBZBy184-::=*O@*:%=4qzzzlmlmmDFDFVMMy-@*-2*<:@@*@$@=",
+"<dfnbbNNCCCBmCFCi2>*=15<2@@#=@X=4szzMmlVhSCclkNAe=$*228*62&.@#.@",
+"1fNNNABvbkcbFCDDi<262:-7;*:$=#=<qxzhgzgmtlcmjkkAe=@&:68*282$#O..",
+"<hNCSVBbuuBCSCCCt22=%:;;;,=*4<==9AAMbkmkhshkyphMa=%:*82-*<8;=$$O",
+"=cScSDBvjjbmBDFDy &o%*=::*<12%@#7zAAmhssptptshkcy=541<<-2<<;;%$$",
+"2NSmmDSkjvcBZCFF0.#.OX$$1&*$.O*=9zzzgyqpttdpdjhmy*:<&=111-**-o#@",
+"6kNBcSSbBkjSDDDDt*o.+#O$*@oX+,&@9xxlhattcuighihct<o.o=<88;-<*O.$",
+"0kNbbBMklgbSSSVCto.o .$*:$o@.X+@1czkkhuphthjghuce-1o*1%;85*1%$$#",
+"<dhcbNkjdhnASDCBy1X.X#@OX:#@@, *7kmlhggugytfksllt&@&@=-<O&**@@@X",
+"#gNvvldappxASSVB0@@*.*<@.$O%**1%0glgytdgy0yppivc01%o.@==;-&@%$$.",
+"=<79ee9q4947edtyeqeteeyy09tsyyytq949611<<<9427ry0reqtjhdaaq0eq74",
+"X.@=.O O+O+*<2@3ibcbAzchiglvmmzmew@# @%@@@#%=#12tvBcnAAznddhhpaa",
+"X+$:X@$$O$$<15%oekhczhcftiigBVNme11oo..X%*@==$<8iSCmhhkMhtdjhigs",
+"<*=*+@$:#X-&&%&%0tudytcBhcyjmVAVy:%@# ..+$*:<47ytCBBSBbNkjhvkhhz",
+"#=@oX$oOX+&*.Oo%qhgggyackNvkbNAbt2=X##...@1*,@*5tDSNBNAjdhzpdjjv",
+"#@@.$%*:o @@+o$*9ghgddhdlimbmkSNa%o@#%#O$=&;;=-8eCbcNAmbvcbgiagh",
+"o#.oO==1:$XXO:$-9ddiclkdhllmABMbe=oO+*@o@;::,-82eVdccmgbNSbikjmj",
+"@o#o@@##@X@.X#*<eduhighgiuzkfhphyo@#oo@%Xo%7:<6<enNbcjmbcbVcAABb",
+"<$X,XO**OXooo$*:qhhddetigdhshxxhq,.*@#,Ooo&*:<<-0ABmNbNgjgbkkBSm",
+"#$$+X#@$$oo o$;-7hlpitetsghppahhq*@oo&#X+,**<<<<7hbbDklhlhkVkzhb",
+"=&=*#:@$OoO&*%;:5pcvhatdkmhypgpze..*-:@=&@*&5:=2qABBBzhhuhgmlhyl",
+"6:=@$@***:@-=*-;7kvfdghhzhzpppgh7=%=1-1=-&O@$=%60nNcMmjlvjhhkiyu",
+"4=%%=**&*-*-$.<=6uvvlhkhhxzhhpdy0@.&-*<%-X#o*1:-5blcMmjjuhjjhcgj",
+"7:*@#@*25<22@,*%<uvvlbzkxzhzhypd4@&1<**+o&*#O#$%6mkfjlbkklglkBzh",
+"q41 .*%;222<&**$=ivvhmzmbzzphsjbe=11&&+++@=..X#$1zchbmcmckjzbzMm",
+"%$@  O@:=-561<;1<yyidssajxpsshzmp42--<&@ $%@.@X#2yghjBbNmbzBbxjh",
+"19996yystanjjfrt0<1270q9476q9q49eaeteeyeqe6qeq072w=<2ytt931yr0qq",
+"qxzshjpAAAFSASccq%@=:-$==14%%<+*ebbzzxpddphzxdbd4  #@;<=%@@=+$7O",
+"7shspxMAnAFADBbb9@*:=1X%%41#+5*=axhxAnjjxjnbjday7#.%=-<==&=;*:5X",
+"4xxhznnASDFDSbvk7X=%1@1:152@.*<-qzhxMbnAMxjbVzdp7%#. ,,><=7-*4;%",
+"3hfjlubBABSMAbuv9X*=15*,<**@@*O19nbzzMSmbjzAbdpd4$@#. ,@-2-2=:->",
+"1pdhjhtkbBSNbdph7..@o:5:%::<+.@*4ABAMCzndhxzldhgqX.o,,&2-;*&-&-<",
+"1yadgjmBNcvbjpdh7XOO*::%@@,@O.OO0MBVVVBbjznzfhdd9.X#O*<2-,;-2226",
+"wyyydhbBANbjsfph7..XO=-1:$OX.+..9MmbVCBkhbhmhjdd5 .o.118-<,*0338",
+"wipddjfbBNAzhdpd4X O$*$;4%X++.OX5mBSmSmblimbjhdiq@o@&*22>2,>2>2-",
+"&tkdtdjzbMzhsihp7# .O#@:$XX@O.+X6bbBmAzztcjjhhhjy*2<**->*&o-2212",
+"%pdtptpzhbhhhxhpq.@X..@%$  X +X.4xghzjbbphtlzjndy@o-=ooo,=*<<2--",
+":ggdatddzbjfpaye7 X  +$X...  .$X4jhhhbpapphdbjzAd=o,Xo  o&,&<8<<",
+"1hhzjfnvvzaysdye1. $..$  #. X XX;dpbNbhddgtkjghxq=Xoo&#.o+,@13<-",
+"%jhlnbMnnhpaddey4 .X  #$+   .+X#<sccBjyislcjgfzh9:O=&11&o&O+.-&2",
+"%pzhxbMkbxnhdhdh9O$XX.##  ++.XXO4hbbkhdphzjkzhsja%@=-=:@&-*1&,&=",
+"%fzbMxppxdfapzxhq=:::X#$      O$7dbbzdyahnAhhshp4%#O,;1@=&$=2-1&"
+};
diff --git a/hacks/images/tunnel2.xpm b/hacks/images/tunnel2.xpm
new file mode 100644 (file)
index 0000000..e038fd8
--- /dev/null
@@ -0,0 +1,206 @@
+/* XPM */
+static char *texture2[] = {
+/* columns rows colors chars-per-pixel */
+"128 128 72 1",
+"  c #1c2a23",
+". c #29352c",
+"X c #2b3c33",
+"o c #2f352b",
+"O c #2c433a",
+"+ c #344034",
+"@ c #38453a",
+"# c #394b45",
+"$ c #364f4a",
+"% c #474a3b",
+"& c #554e3c",
+"* c #645539",
+"= c #444d43",
+"- c #495448",
+"; c #575847",
+": c #545d54",
+"> c #495956",
+", c #5b635a",
+"< c #586965",
+"1 c #675a45",
+"2 c #67604b",
+"3 c #686857",
+"4 c #75654e",
+"5 c #776b55",
+"6 c #7c7059",
+"7 c #797666",
+"8 c #6d736b",
+"9 c #445e64",
+"0 c #74807c",
+"q c #7c8882",
+"w c #84745d",
+"e c #8c765e",
+"r c #846a54",
+"t c #8a7c65",
+"y c #947d65",
+"u c #847e74",
+"i c #8b826b",
+"p c #898675",
+"a c #98856b",
+"s c #948974",
+"d c #9b8c76",
+"f c #9c927b",
+"g c #a58d75",
+"h c #a8957a",
+"j c #b4997c",
+"k c #a4866b",
+"l c #9a9686",
+"z c #90948a",
+"x c #9ca09c",
+"c c #a99984",
+"v c #b49e83",
+"b c #bc9e83",
+"n c #aca08c",
+"m c #aaa397",
+"M c #b4a38c",
+"N c #bca68b",
+"B c #bca284",
+"V c #baa995",
+"C c #bcb29b",
+"Z c #b8b3a6",
+"A c #c5aa8b",
+"S c #c3ad95",
+"D c #c9b498",
+"F c #d4b99a",
+"G c #c8b8a4",
+"H c #d4bea4",
+"J c #c4bfb0",
+"K c #d9c4a9",
+"L c #d7c8b4",
+"P c #e6cdb0",
+"I c #f3e8d1",
+"U c #e1d4c3",
+/* pixels */
+"XXOOXXXXoXX#XO@#XO#OOO$#O$##$$OOO@:0ip8O$$OOOO$OOOOOOOOX+.+++++O.+XXX+XXX.XXXXXXO+++OX.XXXXX.OXXXX,8-XXXXXXXX.XXX...X.XX.Xoo@X.X",
+"OOO#$==>>::,:,<,,,:,,:,:,<8<<8,,:80s00p3:::>==#--$;:-$->$$$$@@$O#$#O#$O@OOOOOO##@+O+OO@OOX.#XXXXO>888;@@O+@XOX+O@#@X@@@@=@#====#",
+"XOO$:=@>->-:=;=,::::<8838738838u63706:3,;3,,3,<8338<368833838833,3<3873<8833888<<88<3<883,<<,>,,88783383,,,,,,,,,,,:>:>>>-;>->#O",
+"OX@8mJz7:,<:,<833888z7878<877uz8,3%200l0p03070888833<,,<08,23,-83,,,,,,>,$,,:3:,,,,,,:---:::-,33,,33:--:,;:,,,,,3,83383888838<>X",
+"<3slcmllllmxmmmmGmVSmVGJCCCSJCx;--,0JFLLKKDDPVDCKKLLKDKGDCCnVCCKfnCZGGCmGCZVJZxmCZlllzlmmzxlzx0:=-,8pxlzl0nlllzxxzpzulzzzcxusuu8",
+":,sccllulvcSccGHHSSHSHbGM3-37:;%-;:8fDDSDDFFZHHKKCMKGPKKPKCLLUKFLLHLKLnKKSLScHGSDCGVmLCNVscSs&=+++OlV5lhVnCMGVVVmGGVVcVmmMnSGcuu",
+"qslluyscCcvcVSVDcMgclcMASt;3-%8=#%#7Vc4nfMghhndMlhMst6lsn0isis207;fNcawdVCMChsasVSCDnfidMKMhfs@@+@+laKSnDcDhjNccdvallheySMMyccuw",
+"ulVulzcyytacttdauycuySVcggGatcdX$-#zKMFslnMediahfhc6clfaf36nipff3iddinnaisitMsf7iwuiMs8dGcdu62@X@@@fNadjdcydhdttlslcvhchyyyyuwuu",
+"uwu5zsdhVglswccccMadcdf6tt7DsclX@#$zKhhhagjjjchnNhhViaasfMMnhdhiMdchaNdhh6cMdvhhNsicaicChSdSin-XX@XchggggsnanacccNchslffdlcgluz7",
+"wullnycctuhccSdscscehfhjds7ttp6X+@@mSAdjDAhbABcienddDdhDniiaNwgjfiaawdhhlcsaDggcchMapfDVFcssa6XXOXOmVjchMggdccNhcyvcccvcvuglynly",
+"cyctsdcsfgyygircwiiinHhMSadn2ipX@$$LNjhhgjDbjheMNDSaaaDwaNjheVaf4gh6hhi1iwhaBhhh6addiwihntiiNt.XXO%nhjjghjhjhfVhMtahfsahcngdgsgs",
+"VugyftftgVclhhsccGhnM5nhawr3o58XO@#LadAASAAgghMShNnhjNhgDdhaMiaFAhMFSBSSDaBSjhgAhnjMwiiapliyttX.++:ZBBNvhgcgvMcvccvscccdcglgydly",
+"ulttslscMctsudldafyacnihwsM3Vi:O@$@ZhHjjagADgBkjjgjghBaiaahgnhhjveid6adahghkjjkjgaygjc7d7icDS;o.+O8GSjgjaccdchdhhddckihddcfhlugd",
+"lylgddtd5tcasdyCditah1MMdnncd&-X@@#ZMDBAMAgkjBAAaDajjaihCgajCADg5iAihhaNhBBhBagjwgaMDscMMnchg;XXX@3GSjhjaggcghtvyhgscccsSylctnsc",
+"gnluwgcdfhcmvMvhtclhMjhid&s7c>-X+@@ZLAhghjjgDgjeMaNMMDgh6haMjj5;6ahidjNjrjNAjhyhSgt5a4sVGscat2X.+O,DMgjNghvvgchhshhvvidtacgsdtyd",
+"dt6tactfVtdhssdasfansicincfth1;oX@=DDjhDagAjyhjVajjjBahaNhn62hsMDji5hh6iNjgkjkDrghVKNcsNw7ihd3X.+#,nhgdhcdddadpiahghvdhccfcffhvd",
+"2sdflhss6dcwtdtsdcMhanwc6iahDn2X@@@GGycggcNgbjjhgvFjaeMAhhaA4udgiadNMgMggyjghBaAjk6*2csstdmcd8Xoo@>SMbggedihMassgcgktcdndaisseud",
+"sfcsdiwsncdaasgtcddMlhMMamthh2=XO@@GFbgygbbbgbjkvMaakahgB4dtSMrhVehgcs6HDaihhajhjkaKjaGMKstp53XXX@=GNgygMcjhtghdcf65cdaahhcciufw",
+"tdcaiMfwtdsaVatdifdjahCaM6nsdf@O@#XJGcygMgyvahjSSgdhNBNd&aMttrvkiFFcwwV4;1VNkBrgjhNiaM66tut3t%.XX@XVbycjavgNcccdtsfffsddacapadhM",
+"diahdhijnatcians6Mi3indadfhiht3O@#@GAyHygdMttbggaavjagggfVdcSMhthi6hPh4npiSahhasa5aha63ivNlvt;X.XOXmgchhvchghagvcthcgdddchhftsg5",
+"cisahhldhdidVMhCDnifmfahnMMdhv&XX=%GbFyybaykHvgjgFagnddgDgig65igacVa44Mw5Vy5n76666adaffAHctgg;XXXOXmAhyyehcvaca6bcdidcdstshdniiM",
+"6schiwdwntnMwahtawai5anhiiadhj-OX##mFgvbjyADbAgvhhahaaAjg45gChyiahawhhejaAMjh;i5fwsaffwhc1ccl:XX@@Xcgagvchbadywc6yhsth8ldgsaaica",
+"wsaddeiafahwaMdiadaMChjCwhnCMh%OXO#GAbcjhSgShvhv6kNhahjtaaANhaNNt5gVkhacaihheNhMsiagNMNMVMstc-XX.#XmgyhchcycctNaMic5cs5cdcydfhid",
+"DsisidfceawdcMwadFjn66niShVwth&OX@@HFbccykvgbhvwShaawwi6thwtiMwgNggyjiaacaaaa5hjDjNhawhahh1swXXXX@oMchhhhchvhcwcthdcvtccchnassii",
+"ttc5ccauiicjdisict3;sccafnacngtX@@=UHSbcjVbjekyhaat4jFjavgVhNtaceaBawcVgvdMghjahhaghafScVMsfs=XXXOXcMryVaaMyMegcivaicahgistddwss",
+"Mt56ligyvhcaaMdatf1lthgch6NdMg5@OX>HbbvyhAjkkDnhaiNDhjhhh6duytdtai4ahadecadwSNcfwdwsy525gtist3.XXXXGcvgcwDMMeMgtftihgtcldfhvdgha",
+"tifMtthvsccwcwdvNccsndudycSgajw#@#=HPKyvdajaBaghejasghgakDdthsMtdMidgaaDdnNh3;1wwf6CDnnhh83ty:O XXomgygcBaahtadcdhcdfcdcdcsdyffs",
+"6cttn5ctst5ttscdbvhMhcvcccvddNf+@#=JHgSbajgghhBaeAciaBMSttdhatitaihDwa5t1dtntchvhsVi4wMMcvdcf8X.OX@VSgygtdcdcaieasdhssyccchdzydf",
+"cifsssfzststcdBNtdffhs6tVgvadA2@X=@GjghgCnhdaakcBjagh5ctMdtdgMNnhhg6ccDhSc4avv6iaVjsfniMscdvgfXXX@ocgyjjhacidlcdhdtcggchhiycscgl",
+"tctfifd4afacnNgdDhutcfcpgNdScN2XX#-JSFDdfgagacMaecDggNggecsghaytah6sBSitgwcvhg6cag40i6ai1;uft%XXXOXNDewjyvMSvctstsgtcscgdlcsdhsf",
+"mtcsfauhnMcfc6Sau57mthcdcMDaVjc-X#=GHbaacDggwaghDtehcccgetydgwVg7htMedicjNSgcacsfsMcNhhfcGcts5X XOXSbAvghgtdtssdhdclachccahisacl",
+"slccfddsatdftdrdlwVcf6ucHcartbdXo@%SjbNVghhcVGehaaVdtiasynMMctsctghcA6Miy5edtMct*wwf0wMhwvcvc&XXXXXnbASyyacdsiwuchyilhayfdccfacg",
+"t7fwthasCsiddcft7cw4uwdhpwVlVF5o+@@CSgScgvcjStVhNcjcvMGvVghcafhafSdccMrlcccvCdwhVMgydcgtgc6hc5X.XOolFbycccgydycsttncdtfclcdpfdia",
+"clcsVdlcidtptissmcwZsncsdiadteh+@@@cASjgcfvjVeaDacNchcytVcMd5tcncatcshgytdhtcyahctlgaMdac4ss6-.XXOXZbbyegMMguchsvlsycccfstsdciic",
+"6gdcdtwttsMhsccffhfiuscMsmmcnjs++@@mgkghhcuVhScMDcfdMtVncastVVjifsccassVcVMchhDgcgcclyysvcScc;..XO@GSyyMyyccccdcs6lgfauscccfcscn",
+"ccdsgsdmccsualddhMidncMhflKsdhioXX@nFAjjsdchcsSc73hVvfaChMcmaiMacdstccgauwt1fwdceec6cydcyNyt3-.XXX@VbGuSjgyuvssdccccfstsctltscss",
+"snssscgutddtlMcndHhldfnsfi4Mhido.X+fDbjadjVds6&t6ifcddjadcsctvaNcyptw6MawvdVMhtgSccSvvSbNvjc73X.XXXVguMyAbccueccudfdffsclcchsdfd",
+"nyyssdlvcccSccdti6fhhAisljVaaD&+.@OfubAje5wdanKVLD6ijnCniGgAFNSANhvSDHjVhHvcMMVDbvNySutd5Mct5;.XXOXmbbevcctGcNycvccccfNcscsdtdsa",
+"nlldtutw6wi61afVNi3taictfeeVa5+.XXOps6g5thc6dcyyjdsdhhMNcchvtitwadNidyahNAaaaMaht5t7MvdgVMaal>XXXoXmvygVagcMbcbcidhfpdddfshhfccd",
+"8553533323;333;2;&&-&-&;-%;;+o++O#X83o@%%%%@o%2ldafii522&3556tyHtisc6p7s4uii6piw7ydF64s&%;ac;@XXXoXmcVgycllgygldfspttutiuiii0667",
+";=%-@@+@X@====%@#@#@@#%#->=%-=XX@#O38+@@@@+#@@+o++++@+@@##@%%+@@+@+%%%@@@@@@@+@@o=X%%:@%#@XoXXX.XXoz42&112=;%@%%&252;;-;-;-%-;;;",
+"XXoXooXO@@+X++XX%@###%@#;-#-=XXX@OO8;73%%@%@@=@%+++@@@#@#--@$@#@@X@%#@#%#=#==@@@=X@@XX#%X=@X%#X.XXoz,+X@+oXX+ooo8XXoXXoX..ooXo+X",
+"XoX.XXX+oXXXXXXXX+XoX@+oXoXoXXXX#@#@.@o@++@o++o++++++++@@@@@@@+@+%XX++@@@@@+@@+@XX==%XXXXX@OXXoXXOo=%=XoXOXoXX@XoooXXXXXXX+XoXXX",
+"..o.oo....o.o.oo...Xooooo.ooooXXOOXooo.Xoooo+oXXo...oooo++Xooo.oXXooooooXXXOoo..oXoXooXXX...o.o.OOo. . . ...o .  oo  .    ... .o",
+"o X.........o..o.X.X.XXXXXoX.XXX@X@XXXX.XXXXX..oX.X.OOX+Xo+.......oX.o..XX...XX.X.X o.o.. . ..XXOOX. o .o .      o ...     .  ..",
+".....X..XX.+.XXOXXOXXXXOOOOOX#O$$$##$++OX@OO@OXOOOOOXX++OO+OXXOXOXX+XXO.O.X.XoX....XoX..X.X.X.XX.X.o . . o   o        .     ..o.",
+"XXX+>>>>>$>9,9,88<,,<<8888888z89X#>8ZUZ0<,-->>>>#--#$$$$$>=$-$$@$@$$@$@#$OOO@$$#OXOOXOXXOXOXOOOXOO$O>,=XoX#o..X..X..OOXO@X##$$#.",
+"+X+8038ppppsmmmpmmmlCmVGVKSGSccHfmKSciMKLGcJZmVZZZKZZZZLLZCZZUZGZJmZZZGZZZZZZmxxxmmxxzxzxxzxxq#O#9>xUUUGZxzzzu0u088878888777u7#.",
+"XX,Z3sVVMJGgSDPDHLbcGSHDHDDSDPShHDSdcGNSjSDcybyFSbSMytydsgjkhhctw7wMMayyMrgrsyNbFvFPPDhcMVSyyvu=uGcLecclrcbbMDSvSVcmVDMMVGGGMfXX",
+"XO8spvNJGvhVHSVcvcVHyLVHDHAKgheShtvyVNDHULFPHSKFAPSMDHLHHDKHckVVPKFPbDLLGLHLiuDcSAaSgHHGPSGHclyGHwccHHHSHHPGHcc7tnc4Vigacygggu%X",
+"OX7tgHcdptmlsslncccMyccDcVHaDvmcNztSncVyscPyvKDDbyMycycagvcvaGPBwFMccvc2u1yNgNHDHGvjPbaCyudvGHwwmmSGcgdsltVSHHMhwlyLtVVcdsscv4oo",
+"XXzcFyczyhyastdVnycuSbgl4f7amAsScvVceVMsVtdhccgygMVSSdgMSu5djvwNhcs5vCVwGcMwtMaGhHvhjhMnclcMmlMGgJVlwcrllecccbMVSNGcdhMfwcVNs2X.",
+"O@VgFgtltDCcVdVitdnnclgcVnSnDGSMMVylmvcwVcsDSgMMhSjcbcvvaVcVNvckcgbSGvghbvcgstcvcvMSNSADNSymyccMGVcyycgAgGVcclsscvcdMvatcgdvt=XX",
+"O=GcSccctftttcfVmStylgcliMcwMtaccyyyySccacKcvMhMShddgcbAjtcg6chDcVghdtNgVAvgctSNMavecvAvSScSVcrvrgymgJgccyydcsygcchcddMcs2cgy;XX",
+"X-SyvccucdtilccansmccMvMKchdaVchlyGlbvgvhdhuyhMVjdkSDyySccahSyctdgdgVNjNahy5lbDSNraSyASAVNScgVVcgdywGycdytmVyVVngccccf55tDvNw&XX",
+"@>Zbvy5yn6pcMsMcacdfcSscwMVDGhhsMccncDSgaNccNHNiasbcDDHcNydMcMhvVGShgyvASGassVAgMhGahHDhySuGMVcgcynVdwygcGSychscdaycuwasVyau2X#X",
+"O=cgbydsctmffcddcdfdC4MMMhc4thcNctyyvNaGMiSAhh6cVhftygySBhhcydbhADMNgfSadyNaMgDDec54Mhh1c5uvlruclcaydcSvgSgbjsccHdaChSMctitu3@XX",
+"@#lSGvcldsycn6scslMcpChnaMcfccadccgHhMcaMchhtccyaatvDVVh5MGDjvBvA4sDrMhyjgvNVgvrtgch4ec3ucHvchgcswdtVcyCghySaMfvcshaVt6ws6lc6;XX",
+"@XsvgdtuivlacsMdMds6hwStwdMhMdMFVcGcCdtfaSvGhSScNcNvgyDyNBkvSjhha7lgcDjhbehSyAthSbSFPFDhUcgSSSSSgaHacscsdNvgdtyccwtf35lcvsftt@X.",
+"OXzgbhscdlMMaCitstMgcdhMnMMVwaadcc5cccgGSNhhVtchvGHNhjvAgaGBeAgaHtuytgvStSGyhKckhgDhNjwagrcScgMMvcgNyGySvaahhcceahncccdtstcf5=.X",
+"#XpvcrflissdfcincchsMdCVahhaDCMVVvSdydjDSSiSNGjDhaytnSSe4SddSSvcNitdatchkFbghaaLSSjVhhcVStSctVcdctMgdahtahgVg7dMVhattyvcMsccu+X.",
+".@zcv6dfdccVMvMVacSVcNcatsadjehhvcwVdaNbijKCkhSAjShyMhhcvAvayaMvNNcHMMjcdycGjASaSHva4jSNadHyMVwyh6scdh4yMdy4yhdsjcSacdtptff65@XX",
+"@XuccthcsccsdswccVgiMhaSKLLSiaCdHgKyNujcjggdtDcaFhMVSdighAbSHSyAhhGScSjSaHcjvNHNMdvcSFNvSMyaghwVszVvaMSvjhSjSdcdVatthdgcmssst%XX",
+"XXlthhVsfiaccsCaiaMcnfMwngjnMVhhgvlsMMftvGtSwhdNyVjjaGGDSDcMSSADvvbtgaSSNSDAAv5jaagycMgvbGHHNKHgvtVNcdddaiwacivcNchvVcMNttsct@XX",
+"O+z6gcwztsVMaacsMfhMetsjPBghCNSGa6VtctmcFdhSNSchAgvNtNhADvg5jhvDtHVNcNgkyg5ucgSjSPSHGtDSgVMdGcyyacywycygNgbyycahgtfdtypsfc5h6%X.",
+"XO76VcdtmftdMMDVMahMasVaBFA66hihMGcGcccjMSMgBggcdSSNSvahAADPFcvyAFScVacbghcbHcvShgNyhbGyyMSctycgggkbVyjctyhjhhjMcLwtcMaMhasi6%XX",
+"O+pyBtcMi6nnyHvDdaScVMSaAa23iSFDgacttdSLtVhSgvFSvjahvahvyevFNvADvNASaaGcuSvFawDabvcNVyyHGcggAycttccDtdhattthiytcattvMdch6usc3%XX",
+"X+pvShta6tcinchtwsnsgNaNh62idnaScyfdhchwDhaNVvhjgNA6GcbaGbAjwhgjvvdhGaagDSFNNcaycbbgMDGyhyHNdgyvSgygatvvcvNNdtytvhc7gidtctdv5-.X",
+"X+zKy5ssinchii6t7dsdGhSdaGCgDMhncsVwgNDDgaaStcSDhSSyavNhagjyvwftdgVdyHMySAyhtVgcbgtdhlgbgcb4bSSvg4vStVt1iiSgggVidttcySdvnddu5%X.",
+"+XibncMgsavtcvn5picSMgjMVehjM6cDcMyvKLHMhdScatcrda4bShdeFeAbggDgNSSdydySStvgywjgFvaywt4gegbDcc4gVjagGycwcakNMaMdcatcachdddsf3%X.",
+"XOpgsctpmcdMhcs7sfLSDMSjhhALhdHhyvcSMrg5tiDBvhdcvhgkFSSPhvjgAbDjPyddbMyaebjaDKguggvSHDMjSMclycuvaAVysckcdahatgidVhDMhMguagdc2+.X",
+"XO7af5scycgcMcthdcKDwMNhVKSwSKhNGawwNSMLKKSNMDvhcGaKgkaawbFbgbAagccjHcuSddArDebvSgljcAbMSKgDvybyatwacajhgc4d76aMggctsaMcSsMc3X.X",
+"#Xugccc6MMddhssGVLDwifhMhniNhhhDyNNDvvAbddyyAaNhvvSttSSSAKajFMhASycgy5bHcSbysMHMcjaSckFbrNvhNDjnNjDadVvVNvDi5wnaccdfcifcdaa7;+X.",
+"XXughdtddhcflcdDNVtjVKgcjjhMDfjhCyaGgVDNMaShHvS4gcglMSFShjAMjDgBgjvgFgbeybjGSrgydHbavStgSgNNccNvycyavNg6MySbhDg5ccicMMdccsnw;O..",
+"XXzHatd6VcccaaKDBidMiSVhMCDhhCShcc6tcMacScFFvvvDvNgaKHjgahnhKaehbHbcchScvSHabLAGSgMMSjSgNPcMMSVhyNcvhvdvhjvhhgvVafhadaNVtadu8@..",
+"XOubgdtfsdffhGtttdjnhCcSjnhgjgFwcaHLKSgvyNh2aGcgdyFHAkMhBNhAjcVjbycbSFAKNSkyreggSeyHGrbSScaedthnGMgNDhbgvNcMcvctsvcGVcMhddiu2=XX",
+".OpSatwSinchScaiVNMGhcNnjDjMnKAhGSSNgSAvLKSnygtSHSyt4vcFMMeiSajNFSjSgAArkHvHGFGvbVScjKFDgcStGLVKdtSGchDcVFcvS5cscfdtfccalca7,O.o",
+"XXihw6MisD6hiVcMVcMjKVDdAaNDnjDFbcDNSSjHgldyDSNggggDSbdkFKHFkFAjygFgHSygAycSvAyvggggbccyhGHcasi4tGv62tMttyantsVssccvatscfwci@+..",
+"XO0AdacjnaancdfVchVSNMKNMVhidhNaSSvavgGadchVASVvjMbSHkgciawFDjahyHSvdHVFSMvNggdgvccHyVccVNjtVMmhDAstclSvyccgccaccfS6ddfa7cs;-X..",
+"XXpNsnDVMcMMMNcShGdGhcBNHDVGPLhKgGdcsGggvgcgSatAKNgMybLdgCnaABhkjkyaMtvDgyFDPHDHgbjPPchDVFvVMa6MKa6PhdVgglVSvcdctcShnDhcMas63X..",
+"X#pN1rttsyffstcaVSFhDSnKVhn66iwhScyJChSSPDnDKHADgjPSjSjcDgFKDjKDAbDKMgDPKSNhjihiDFNhaKjhVhgaGLiSafhhFiichiMtdVtmaahcccahwc7t,=o.",
+"XOpVultt7u723;1722;;;232266;,;06343542d6a6pt45iwaDfhsasNKVhiMBaiSDjtwtcafdwhei0lBhajniiMjnFShHKKnpDNhCKCaDDMNhNvcMS6kii572;%-%..",
+"XXzs7uut7333883>3::,,,:;;--;>,::--8:;-=%-=---=;=--&-&%%&;&&%%&%%-;&&@@=-%;2;%&-%&;&&%-%-;&&&22;&&%2%&&;&%;%&;3;;i127;3533#@+O-.X",
+".X85,257,33,,,,3-;;-;-#%-##--@--$==--#,=%-=#----#=-@==#=@=@#$%@%-#=--=@@-#@@#%z-@#$$#-@%@####+XO+@@@@O@@@#@#@@@@+@@o@++X++O+XX..",
+"XX8=#===%%%+%%@@@@%@%X@%@@++@@+@@@%@@%@+@@@@+@@%@@+++%@@@@+@+@++@+%+@%@@+@%@@+-.@@@@#@+@+%@%@@++@@@@@++@X@+@OXX%+X+X@++OXXXXX@..",
+"OX,@@@XX+O+XXX++X@++@%XX+o+o++++@#++++XX+++++++o+ooXoXoXo+++o+o+ooXo.o@o+++X+++++++.+++++X+X+o+XO+++Oo+ooXo+oXoXoXXXoXoXXXXXoXXX",
+"OO$@@XXoXX.OXOOXXOXOXOX@+O@++@OO@@@@@@++@@@@@+@+XO+O+XXX@@+OO++O++OX+.+.OXX++.X..+.+..ooXXX.XXXX..X.......o.oooo.ooo.oXoXX..X.XO",
+"$#>0z,@@O#O##@#@O##@##$$#$#$O#@#@@#$@####$#$$$#$$@O@##OX#@$$@O@O@OOO@@OXOOOO@OOOO+O+OOoOXXXOXXXXO.+.......XoXXXX+XXXXXXXX.XXXOXO",
+"$87zizp0z7708zzzxzxzzzzzzzxlzxz>++#-zxZl0zz7<8883<3>:>>-9>>:>>-$$$-$$$>9>99>$O$$$$$$#$$O$$$O##OO@OOOOOOOXXX#@###$>=>::-,:::3,8=#",
+"z7ZLf5307:833772ttsMu7assfVmcms#+X#,UmZPIIIIIIIIIIIIIIIIIIIPIUUPULULKKLZLLLJJKZmn8pp3,808q0q8<$X+@$$$$O$$>>:>->:>,,,><:9<<<<<>8q",
+";sSGLGDDDSvGHHGGDVDBHSKSc22t5;;#O+X:7cyPFFPAFHPHbPDKDNvABDFPFFFPKPHLKPFNAFNDjAAFDBFCGcfjVMtVVcX@@$3ZxcpmmzfucmVZGCCclzcmzl7uzz58",
+"4cddyiBNScjAAAAvDFNFHFAjSHNs;3c@@X#3l=vPPKaFANhBAbgAhygBhgBhAgjjhhaa*hgw6i206aiaSh6wtAFAvrMhc8..O+pi3lsia6KPDFSABbbFbSMhgdtudcyl",
+"HCtDgNaadaFSggVDjBAgjhNvAcyHHZ2o.#-8d&sDFhshNvNSjbbgajjbjAjAjgkAbkhgjggArBkihhagvgagSgAjwhFa5;.X@#fnw6iKdvFhAavahdaghags7tdzccMG",
+"ctcdhMghcSardcg4hatdc6wctsGFgDcX@#XZHSHSgcvbhghgbjBbAjABjAjNgbAjjjjkhjAjjkjkAjhkagjbggjPFBjiH;XXO@fsjnHDDSByaveh25wvta16;:46Vaht",
+"disvdi6wVhhNf6ptMhSshnlcSggjhV5-##:PUHPjcvtgvcchvjgNjjhjaahaykkgjkgAjFjjjAjAAkhNhgkAAgADjFkja;.OO@ldjFHhyrtyh4wtccaahdgu-3cSyats",
+"cshafdahahNa6vhchatSSsjhaccvvct=##:PbKjhAevDvSgMNhAvkNjngjjahjgAkjjjjjjkjaahkjjjkhjgkejkehhD*,XX@@nbBiwachagchfSjAgkaaNp5Svajttc",
+"tt6tacthFhw4itvB0BAihDaBhBABaf2$@@;UKajAADMNajjBMMjNNdvvMjvhvhSSNDgajgjjjdFjjhjhjjhjjjhjAaja*0XO@-Gnyadajhajaa0ahkaaijaahAiaaahi",
+"ca7MhejSah606hhABBhf0aFhfMhhAN3-+$$PFPjjaM*fVDDAvjjNvSavjBhjNAvAjjgFFjjBjjkAAjaaajhjjkkDajhAf*X+O%GgghaBi0aaiihhiaajaehaBhajhjha",
+"d6aidisai6ahhBhf2iDDFDhA5ahivi0;##3UiaFAjMGCNghnBDDAvbMvAahBFAShBhhMhNhjAjjjjjjhhjAAijhaBAhj0%XX$@CgahMwiijhjajahaaa0kjhjhAhhiah",
+"ihhj6chajh0hhaAADBiDhiFf0aBADff*O@;PPPFAKjjhAAVDijSDgFSvjADvggjSDjjhjiDFjjhhaNhFNajhjjAkaiji4%O+O+Jgbi5sijiahgggjhaahhjahi0h4fa6",
+"iajhfaDjBhDDhhBh0ahvhFCBBhh0BC*$+=3Pj5hhdhBjfNjBDbjDbHAgNjjvjkBaiaAKNDjgjNjDjjhdaDNNjhADAAh*&-X+@;ChAgbkDihh0hjkaahhhhahaiBBhh0a",
+"aMaiMMNaDBh6hAhvaBhi6hhaBFBhAh;%=$,LjjPjjjAANNBBbkSvgAhAhMAgADSddhaahajNAhjhjhFFFNNhjahhjkh-@-XXO-LjDjahjhh2ihhhr0ahihahihah6aij",
+"AghjjagNBhhfNvaDBAFvDAhBAAiAaB0%@@&KhjDFDDjACAjjSFDAgDgSjjAhykawLMFhDNAMjhNNdjjFjjjjajDAakh;@@+XO+HhaekiaAja4i0rjjAhhijjNihahfa6",
+"jahiighh6ivhhihhDABDFaBFhfKAA0*@@$-PFFjjgghDhASjjejAvAvjNMBggSSca5SghkjhNjhDjhjahhaDihakDh0:20XO@@GhBjDaaaahAkhhkjhiajihaiaaafjj",
+"nd5ijfjDjNfsABaahhfhAFAAjK6hh;0O+@-UKjPKNajjCjNNgNvbjvhFhgjgFANDDBKDHDjDjjMhhCjjjjhkjjDAak0;i%XO@@VagjkhgaaihDjaBa40Bii6050haka5",
+"jiNNjhhjhh00ejhABfjhhi6Ajhaf366@@@-PkPDjjFPjCNjfSDFyAADjjAkDVjgvSAAAgSBFhNjjjjjjjjhAjhaaaBja0;.+@#mBAaajjnkajjahhwahafhBahBjajBB",
+"hNhhhiaa040jAjAAhA6hAFDhBDhN;fN:O@2IKPjhjFjFCjjMShgFFFFDjgFNHVDSywDtDAkgNjjDfjajDjFhjkjhjajaF0o+O@MDhae5iNgjiakjtavhhvawBhhaBh6h",
+"Cahijhhh4haha0DABaBDFAaaiaA60JfO@@,PjAAKDhahhCKjSvhvjFAgFgFhVyhtSMFahjhFhjhhiajDajhjjaFAAAaBh&+++@CgadshgahdaifaiaffAwhhBaaii5fa",
+"ihdajjhNajjjFAhDaAfAhhDi0iD50i*@O$0PPIFAjhDNKAFCMaASBjgagjDMahjSADvNhjggjfhjjjhkAjjkakjAjhBh6%XX#+MDVhaSkkkkMNjjht0haaaBkihavhBB",
+"aaikDjahBAAi0hhBhhhAvihKFFKBwh5X@@6PPjDjjAgCjhNjgShaAghMKvgyhjAhyhhahKDMjjjjFjAFjjajAFhaBjBBj&XXO@VBw5jajgigiakihhB6jahfwhhhaaai",
+"NghahiahBA6ihahAhhBfvihahAAAPPfO@@jPAAijjdjhsFhCBkVgMshNjtDvNhdMbLggFvcvhkAjaAjajiAjjhDhjjhi4+.X@+CgyShhagNhajMahhaai0wwih00haaf",
+"fadhjjhNaiBBAFBaAAihDAFDjAiBBh%-+%NFjPKKjjCDDjNiwfcDDNsNaNMvMgDchajASvghjCjjjhhjhDhkhjjajhaFa%+X@+mhfi44hgaagj0rBhBtavaaahfAiava",
+"Df6hhhajBaiah6ihaiBBBhahBhFhAFi7XOvPFjFBhfhBAfNNCGDhhaMCDKaMgDFCMvcAhhMcgjjjgjjgi6ahFjkhhhBji@.+OOCaaBhDthhhtifhhataa6iahafafaif",
+"AaBBaahBhDBAi5iAhhvBhiFBhhFhKhv3++fKBAjFjBDAjDhihADMCjDfhfsGHahacjhvvNVNBANBghghhAjjjaBAhBjh6%XXOOCahaihi6fhhBt66aaaChhaahiBaDhh",
+"hBafBhBah6aBBDAahi6fBBhD6vBhhAiO+%0PFFFjDjh0MhhDAHfhhDjpNjMhaCDHSbchhdaakwhaiijBAkABkBjhhBkB**XX@@CvaaAahhhhh6hv0hBfhaaffhiifiBB",
+"ihah6ihh6Dfh6hfiAAKKhhaFDhhBFh6-+@;PFFBjahAKhDNhCNfajfjDFNfDjafhVgNSgjASDcggNNjBhaBhahhABhBB0+XX@OAhAh6iaftBfi6hva366ta6A6iihii6",
+"ii6ihfihifhfhDBi6hBfBDFhifANhBf*+%2FKjjBBaKDjjhFHMMFMMCjjMJhjKCjeccjNghBhFhBhaedAvaiBhahajAja+XOO+DiahBahaA66Bhf6afafhah6ih6iiih",
+"AafhihDfBCaifiiDDAKhDAihhvDCAh*O+X0KKKFDABAhBDNfMhNDjNjhhfhHjfhhvNDASjBHShhBkAhaahjjhBBBAhBa5++.OOCahAaih6a0h6iavaNAhi0faBfaBBfa",
+"AiBhFAfBhaiBfCDh6CfCBhDFKi6CBi2;X@%KjDDjABDDNCAjjhKjNDjNCAfFaDhjNaahgSBijhBhNABKFBBAAiahhjjBv%.XOOn5hht64hhBthiBhiaaiaffiaiiiiih",
+"6aiffiBBfBfDABiaiBiB0DKDhDNNh*;O+$-APPjNBBFjNFNNNhNDADjNCjjNCjCfhDDSShhjhMBASNhaaBBAhhjjBhjj0++XOOCfBj6vhBBaihhh6fatfiaBBiiiihha",
+"fiihihf46hhhfChCChKFDhaBfBKADhf%+@@HFKaNADDANFjACFFHahDDCDjhjhjAjFdjDhjjNDjhaaDhBhAhaaBajBAh2+O+O+Cs0a0ahahwvahifhBAhhvi6ii6fiaf",
+"fifiahaBBBvNBANNABBBBDhDFKDAfaf-@%%AFjjFAAjCDDjADjAjjKDjjjFAADCFjjjDhFhjDhjdjFNaFhhAAhABAAh06%+@@+CiAjjhDahhhhavhhai6i6hBvFAhfai",
+"6iifCBBAhhhNBhChfCBABAhvAfaAh*3;%-;hDjBAjNjADDjaajjCDjAAFAjFhjjjDjhjMhjNhjkhAhhjaajhBBBaBBjhw;$$%%nfhBaai0aihhaa66i0fiiii66ii6fa",
+";36i66i60h6373if6iiiiiifBhf326i--&-0h3sjDDFKNNhjCNjCAHjDjhDkhAjFjDAahjjNADDNFjhjhBABBBBhAAhh5%@---n66tahahhhiiiiiiifaihifi6336ii",
+"-*-*73332;3333*;3-;2*-;*-***33-;---03;&*204040242*2i00aihhjjjDjajNDNFNFAjaiiihMFjjBDBAFAAAjB0*2;;2l34s0hh0taf0iifhfi266i6632333;",
+"-%@%---*-*%%--%%%%%O+%@+++O+OO@O@OO;&+++++++++%+@%@%@+o+++@@@%%%&&%-&&&%%%+@%&*2562**%;**%%%%%@@@+0;***2***3*;***;;*%*-+%%%*-O%-",
+".OX+-OOO++++OO+%+@@@%++@@O+O++O-@$O$@@+@++++O+O++-%++%+++O++@@+@@+++@++++++++O+O++.O+O.+X.OX.+OOOO;+XX+..O+.O+XXXXOOXXX+OX+O@%OO",
+"O.O+OOOO.X+OOOOO+OOOO+@@++O+++OO+OO;;-+++.ooX++++++++++o++O++O.+++++++++@@+O++O+O+X+OO++.+.X.XXOOOO+X+OXXXOOXXX.OXXXX.XXOO+@O+OX"
+};
diff --git a/hacks/piecewise.c b/hacks/piecewise.c
new file mode 100644 (file)
index 0000000..9de3bda
--- /dev/null
@@ -0,0 +1,892 @@
+/* piecewise, 21jan2003
+ * Geoffrey Irving <irving@caltech.edu>
+ *
+ * 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.
+ */
+
+#include <stdarg.h>
+#include <math.h>
+#include "screenhack.h"
+
+#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
+# include "xdbe.h"
+#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
+
+#define X_PI (180 * 64)
+
+/******** splaying code */
+
+typedef struct _tree {
+  struct _tree *l, *r;   /* left and right children */
+                         /* extra stuff would go here */
+  } tree;
+
+typedef int (*cut)(tree*);    /* cut x is <, =, or > 0 given a <, =, or > x for some a */
+
+/* Top-down splay routine.  Reference:
+ *   "Self-adjusting Binary Search Trees", Sleator and Tarjan,
+ *   JACM Volume 32, No 3, July 1985, pp 652-686.
+ * See page 668 for specific splay transformations */
+
+tree *splay(cut c, tree *t) {
+  int v, vv;
+  tree *l, *r;
+  tree **lr, **rl;
+  tree *x, *y, *z;
+
+  if (!t)
+    return 0;
+
+  /* initialization */
+  x = t;
+  l = r = 0;
+  lr = &l;
+  rl = &r;
+
+  /* top-down splaying loop */
+  for (;;) {
+    v = c(x);
+    if (v == 0)
+      break;               /*** success ***/
+    else if (v < 0) {
+      y = x->l;
+      if (!y)
+        break;             /*** trivial ***/
+      else {
+        vv = c(y);
+        if (vv == 0) {
+          *rl = x;         /*** zig ***/
+          rl = &x->l;
+          x = y;
+          break;
+          }
+        else if (vv < 0) {
+          z = y->l;
+          if (!z) {
+            *rl = x;       /*** zig ***/
+            rl = &x->l;
+            x = y;
+            break;
+            }
+          else {
+            x->l = y->r;   /*** zig-zig ***/
+            y->r = x;
+            *rl = y;
+            rl = &y->l;
+            x = z;
+            }
+          }
+        else { /* vv > 0 */
+          z = y->r;
+          if (!z) {
+            *rl = x;       /*** zig ***/
+            rl = &x->l;
+            x = y;
+            break;
+            }
+          else {           /*** zig-zag ***/
+            *lr = y;
+            lr = &y->r;
+            *rl = x;
+            rl = &x->l;
+            x = z;
+            }
+          }
+        }
+      }
+    else { /* v > 0 */
+      y = x->r;
+      if (!y)
+        break;             /*** trivial ***/
+      else {
+        vv = c(y);
+        if (vv == 0) {
+          *lr = x;         /*** zig ***/
+          lr = &x->r;
+          x = y;
+          break;
+          }
+        else if (vv > 0) {
+          z = y->r;
+          if (!z) {
+            *lr = x;       /*** zig ***/
+            lr = &x->r;
+            x = y;
+            break;
+            }
+          else {
+            x->r = y->l;   /*** zig-zig ***/
+            y->l = x;
+            *lr = y;
+            lr = &y->r;
+            x = z;
+            }
+          }
+        else { /* vv < 0 */
+          z = y->l;
+          if (!z) {
+            *lr = x;       /*** zig ***/
+            lr = &x->r;
+            x = y;
+            break;
+            }
+          else {           /*** zig-zag ***/
+            *rl = y;
+            rl = &y->l;
+            *lr = x;
+            lr = &x->r;
+            x = z;
+            }
+          }
+        }
+      }
+    }
+
+  /* completion */
+  *lr = x->l;
+  x->l = l;
+  *rl = x->r;
+  x->r = r;
+  return x;
+  }
+
+tree *splay_min(tree *t) {
+  tree *r, **rl;
+  tree *x, *y, *z;
+
+  if (!t)
+    return 0;
+
+  x = t;
+  r = 0;
+  rl = &r;
+
+  for (;;) {
+    y = x->l;
+    if (!y)
+      break;           /*** trivial ***/
+    else {
+      z = y->l;
+      if (!z) {
+        *rl = x;       /*** zig ***/
+        rl = &x->l;
+        x = y;
+        break;
+        }
+      else {
+        x->l = y->r;   /*** zig-zig ***/
+        y->r = x;
+        *rl = y;
+        rl = &y->l;
+        x = z;
+        }
+      }
+    }
+
+  x->l = 0;
+  *rl = x->r;
+  x->r = r;
+  return x;
+  }
+
+tree *splay_max(tree *t) {
+  tree *l, **lr;
+  tree *x, *y, *z;
+
+  if (!t)
+    return 0;
+
+  x = t;
+  l = 0;
+  lr = &l;
+
+  for (;;) {
+    y = x->r;
+    if (!y)
+      break;           /*** trivial ***/
+    else {
+      z = y->r;
+      if (!z) {
+        *lr = x;       /*** zig ***/
+        lr = &x->r;
+        x = y;
+        break;
+        }
+      else {
+        x->r = y->l;   /*** zig-zig ***/
+        y->l = x;
+        *lr = y;
+        lr = &y->r;
+        x = z;
+        }
+      }
+    }
+
+  *lr = x->l;
+  x->l = l;
+  x->r = 0;
+  return x;
+  }
+
+/******** circles and fringe */
+
+struct _fringe;
+
+typedef struct _circle {
+  int r;                    /* radius */
+  double x, y;              /* position */
+  double dx, dy;            /* velocity */
+
+  int visible;              /* default visibility */
+  struct _fringe *lo, *hi;  /* lo and hi fringes */
+
+  int ni;                   /* number of intersections */
+  int *i;                   /* sorted intersection list */
+  } circle;             
+
+typedef struct _fringe {
+  struct _fringe *l, *r;  /* left and right children for splay trees */
+
+  circle *c;              /* associated circle */
+  int side;               /* 0 for lo, 1 for hi */
+
+  int mni;                /* size of intersection array */
+  int ni;                 /* number of intersections */
+  int *i;                 /* sorted intersection list */
+  } fringe;
+
+inline double fringe_x(fringe *f, double y) {
+  double dy, d;
+  dy = f->c->y - y;
+  d = sqrt(f->c->r * f->c->r - dy * dy);
+  return f->side ? f->c->x + d : f->c->x - d;
+  }
+
+inline void fringe_add_intersection(fringe *f, double x, double y) {
+  f->ni++;
+  if (f->mni < f->ni) {
+    f->mni += 2;
+    f->i = realloc(f->i, sizeof(int) * f->mni);
+    }
+  f->i[f->ni-1] = rint(atan2(y - f->c->y, x - f->c->x) * X_PI / M_PI);
+  }
+
+circle *init_circles(int n, int w, int h) {
+  int i, r0, dr, speed;
+  double v, a;
+  double minradius, maxradius;
+  fringe *s = malloc(sizeof(fringe) * n * 2);    /* never freed */
+  circle *c = malloc(sizeof(circle) * n);
+
+  speed = get_integer_resource("speed", "Speed");
+  minradius = get_float_resource("minradius", "Float");
+  maxradius = get_float_resource("maxradius", "Float");
+  if (maxradius < minradius)
+    maxradius = minradius;
+
+  r0 = ceil(minradius * h); 
+  dr = floor(maxradius * h) - r0 + 1;
+
+  for (i=0;i<n;i++) {
+    c[i].r = r0 + random() % dr;
+    c[i].x = c[i].r + frand(w - 1 - 2 * c[i].r);
+    c[i].y = c[i].r + frand(h - 1 - 2 * c[i].r);
+    c[i].visible = random() & 1;
+
+    c[i].ni = 0;
+    c[i].i = 0;
+
+    a = frand(2 * M_PI);
+    v = (1 + frand(0.5)) * speed / 10.0;
+    c[i].dx = v * cos(a);
+    c[i].dy = v * sin(a);
+
+    c[i].lo = s+i+i;
+    c[i].hi = s+i+i+1;
+    c[i].lo->c = c[i].hi->c = c+i;
+    c[i].lo->side = 0;
+    c[i].hi->side = 1;
+    c[i].lo->mni = c[i].lo->ni = c[i].hi->mni = c[i].hi->ni = 0;
+    c[i].lo->i = c[i].hi->i = 0;
+    }
+
+  return c;
+  }
+
+/* this is a hack, but I guess that's what I writing anyways */
+void tweak_circle(circle *c) {
+  c->x += frand(2) - 1;
+  c->y += frand(1) + 0.1;
+  }
+
+void move_circle(circle *c, int w, int h) {
+  c->x += c->dx;
+  if (c->x < c->r) {
+    c->x = c->r;
+    c->dx = -c->dx;
+    }
+  else if (c->x >= w - c->r) {
+    c->x = w - 1 - c->r;
+    c->dx = -c->dx;
+    }
+  c->y += c->dy;
+  if (c->y < c->r) {
+    c->y = c->r;
+    c->dy = -c->dy;
+    }
+  else if (c->y >= h - c->r) {
+    c->y = h - 1 - c->r;
+    c->dy = -c->dy;
+    }
+  }
+
+/******** event queue */
+
+#define START 0
+#define CROSS 1
+#define FINISH 2
+
+typedef struct _event {
+  struct _event *l, *r;    /* left and right children for splay tree */
+
+  int kind;                /* type of event */
+  double x, y;             /* position */
+  fringe *lo, *hi;         /* fringes */
+  } event;
+
+static double event_cut_y;
+
+int event_cut(event *e) {
+  return event_cut_y == e->y ? 0 : event_cut_y < e->y ? -1 : 1;
+  }
+
+void event_insert(event **eq, event *e) {
+  if (!*eq) {
+    e->l = e->r = 0;
+    *eq = e;
+    }
+
+  event_cut_y = e->y;
+  *eq = (event*)splay((cut)event_cut, (tree*)*eq);
+
+  if (e->y == (*eq)->y) {
+    if (!((e->lo == (*eq)->lo && e->hi == (*eq)->hi) || (e->lo == (*eq)->hi && e->hi == (*eq)->lo))) {
+      e->l = (*eq)->l;
+      e->r = 0;             /* doing this instead of dying might be dangerous */
+      (*eq)->l = e;           
+      }
+    }
+  else if (e->y < (*eq)->y) {
+    e->l = (*eq)->l;
+    e->r = *eq;
+    (*eq)->l = 0;
+    *eq = e;
+    }
+  else {
+    e->l = *eq;
+    e->r = (*eq)->r; 
+    (*eq)->r = 0;
+    *eq = e;
+    }
+  }
+
+void circle_start_event(event **eq, circle *c) {
+  event *s;
+  s = malloc(sizeof(event));
+  s->kind = START;
+  s->x = c->x;
+  s->y = c->y - c->r;
+  s->lo = c->lo;
+  s->hi = c->hi;
+  event_insert(eq, s);
+  }
+
+void circle_finish_event(event **eq, circle *c) {
+  event *f;
+  f = malloc(sizeof(event));
+  f->kind = FINISH;
+  f->x = c->x;
+  f->y = c->y + c->r;
+  f->lo = c->lo;
+  f->hi = c->hi;
+  event_insert(eq, f);
+  }
+
+event *event_next(event **eq) {
+  event *e;
+  if (!*eq)
+    return 0;
+  else {
+    e = (event*)splay_min((tree*)*eq);
+    *eq = e->r; 
+    return e;
+    }
+  }
+
+void event_shred(event *e) {
+  if (e) {
+    event_shred(e->l);
+    event_shred(e->r);
+    free(e);
+    }
+  }
+
+/******** fringe intersection */
+
+inline int check_fringe_intersection(double ye, fringe *lo, fringe *hi, double x, double y) {
+  return ye <= y && ((x < lo->c->x) ^ lo->side) && ((x < hi->c->x) ^ hi->side);
+  }
+
+void fringe_intersect(event **eq, double y, fringe *lo, fringe *hi) {
+  event *e;
+  double dx, dy, sd, rs, rd, d, sx, sy, rp, sqd;
+  double x1, y1, x2, y2;
+
+  if (lo->c == hi->c)
+    return;
+
+  dx = hi->c->x - lo->c->x; 
+  dy = hi->c->y - lo->c->y; 
+  sd = dx * dx + dy * dy; 
+
+  if (sd == 0)
+    return;
+
+  rs = hi->c->r + lo->c->r; 
+  rd = hi->c->r - lo->c->r; 
+  d = (rd * rd - sd) * (sd - rs * rs);
+
+  if (d <= 0)
+    return;
+  sd = 0.5 / sd;
+  rp = rs * rd; 
+  sqd = sqrt(d); 
+  sx = (lo->c->x + hi->c->x) / 2;
+  sy = (lo->c->y + hi->c->y) / 2;
+  x1 = sx + sd * (dy * sqd - dx * rp); 
+  y1 = sy - sd * (dx * sqd + dy * rp);
+  x2 = sx - sd * (dy * sqd + dx * rp);
+  y2 = sy + sd * (dx * sqd - dy * rp);
+
+  #define CHECK(xi, yi) (y <= yi && ((xi < lo->c->x) ^ lo->side) && ((xi < hi->c->x) ^ hi->side))
+
+  #define ADD_CROSS(xi, yi, ilo, ihi) {  \
+    e = malloc(sizeof(event));           \
+    e->kind = CROSS;                     \
+    e->x = xi; e->y = yi;                \
+    e->lo = ilo; e->hi = ihi;            \
+    event_insert(eq, e);                 \
+    }
+
+  if (CHECK(x1, y1)) {
+    if (CHECK(x2, y2)) {
+      if (y1 < y2) {
+        ADD_CROSS(x1, y1, lo, hi);
+        ADD_CROSS(x2, y2, hi, lo);
+        }
+      else {
+        ADD_CROSS(x1, y1, hi, lo);
+        ADD_CROSS(x2, y2, lo, hi);
+        }
+      }
+    else
+      ADD_CROSS(x1, y1, lo, hi);
+    }
+  else if (CHECK(x2, y2))
+    ADD_CROSS(x2, y2, lo, hi); 
+
+  return;
+  }
+
+/******** fringe trees and event handling */
+
+#define PANIC ((fringe*)1)     /* by alignment, no fringe should every be 1 */
+
+fringe *check_lo(event **eq, double y, fringe *f, fringe *hi) {
+  if (f) {
+    f = (fringe*)splay_max((tree*)f);
+    fringe_intersect(eq, y, f, hi);
+    }
+  return f;
+  }
+
+fringe *check_hi(event **eq, double y, fringe *lo, fringe *f) {
+  if (f) {
+    f = (fringe*)splay_min((tree*)f);
+    fringe_intersect(eq, y, lo, f);
+    }
+  return f;
+  }
+
+double fringe_start_cut_x;
+double fringe_start_cut_y;
+
+int fringe_start_cut(fringe *f) {
+  double x = fringe_x(f, fringe_start_cut_y);
+  return fringe_start_cut_x == x ? 0 : fringe_start_cut_x < x ? -1 : 1;
+  }
+
+fringe *fringe_start(event **eq, fringe *f, double x, double y, fringe *lo, fringe *hi) {
+  double sx;
+
+  if (!f) {
+    circle_finish_event(eq, lo->c);
+    lo->l = 0;
+    lo->r = hi;
+    hi->l = hi->r = 0;
+    return lo;
+    }
+
+  fringe_start_cut_x = x;
+  fringe_start_cut_y = y;
+  f = (fringe*)splay((cut)fringe_start_cut, (tree*)f);
+
+  sx = fringe_x(f, y);
+  if (x == sx) {       /* time to cheat my way out of handling degeneracies */
+    tweak_circle(lo->c);
+    circle_start_event(eq, lo->c);
+    return f;
+    }
+  else if (x < sx) {
+    circle_finish_event(eq, lo->c);
+    f->l = check_lo(eq, y, f->l, lo);    
+    fringe_intersect(eq, y, hi, f);
+    lo->l = f->l;
+    lo->r = f;
+    f->l = hi;
+    hi->l = hi->r = 0;
+    return lo;
+    }
+  else {
+    circle_finish_event(eq, lo->c);
+    fringe_intersect(eq, y, f, lo);
+    f->r = check_hi(eq, y, hi, f->r);
+    hi->r = f->r;
+    hi->l = f;
+    f->r = lo;
+    lo->l = lo->r = 0;
+    return hi;
+    }
+  }
+
+double fringe_double_cut_x;
+double fringe_double_cut_y;
+fringe *fringe_double_cut_lo;
+fringe *fringe_double_cut_hi;
+
+int fringe_double_cut(fringe *f) {
+  double x;
+  if (f == fringe_double_cut_lo || f == fringe_double_cut_hi)
+    return 0;
+  x = fringe_x(f, fringe_double_cut_y);
+  return fringe_double_cut_x == x ? 0 : fringe_double_cut_x < x ? -1 : 1;
+  }
+
+int fringe_double_splay(fringe *f, double x, double y, fringe *lo, fringe *hi) {
+  fringe_double_cut_x = x;
+  fringe_double_cut_y = y;
+  fringe_double_cut_lo = lo;
+  fringe_double_cut_hi = hi;
+  f = (fringe*)splay((cut)fringe_double_cut, (tree*)f);
+
+  if (f == lo)
+    return (f->r = (fringe*)splay_min((tree*)f->r)) == hi;
+  else if (f == hi)
+    return (f->l = (fringe*)splay_max((tree*)f->l)) == lo;
+  else
+    return 0;
+  }
+
+fringe *fringe_cross(event **eq, fringe *f, double x, double y, fringe *lo, fringe *hi) {
+  fringe *l, *r;
+  if (!fringe_double_splay(f, x, y, lo, hi))
+    return PANIC;
+  l = check_lo(eq, y, lo->l, hi);
+  r = check_hi(eq, y, lo, hi->r);
+  lo->l = hi;
+  lo->r = r;
+  hi->l = l;
+  hi->r = 0;
+  return lo;
+  }
+
+fringe *fringe_finish(event **eq, fringe *f, double x, double y, fringe *lo, fringe *hi) {
+  if (!fringe_double_splay(f, x, y, lo, hi))
+    return PANIC;
+  else if (!lo->l)
+    return hi->r;
+  else if (!hi->r)
+    return lo->l;
+  else {
+    lo->l = (fringe*)splay_max((tree*)lo->l);
+    hi->r = (fringe*)splay_min((tree*)hi->r);
+    fringe_intersect(eq, y, lo->l, hi->r);
+    lo->l->r = hi->r;
+    hi->r->l = 0;
+    return lo->l;
+    }
+  }
+
+/******** plane sweep */
+
+void sweep(int n, circle *c) {
+  int i;
+  event *eq, *e;
+  fringe *f;
+
+  RESTART:
+  #define CHECK_PANIC()                 \
+    if (f == PANIC) {                   \
+      free(e);                          \
+      event_shred(eq);                  \
+      for (i=0;i<n;i++) {               \
+        tweak_circle(c+i);              \
+        c[i].lo->ni = c[i].hi->ni = 0;  \
+        }                               \
+      goto RESTART;                     \
+      }
+
+  eq = 0;
+  for (i=0;i<n;i++)
+    circle_start_event(&eq, c+i); 
+  f = 0;
+
+  while ((e = event_next(&eq))) {
+    switch (e->kind) {
+      case START:
+        f = fringe_start(&eq, f, e->x, e->y, e->lo, e->hi);
+        break;
+      case CROSS:
+        f = fringe_cross(&eq, f, e->x, e->y, e->lo, e->hi);
+        CHECK_PANIC();
+        fringe_add_intersection(e->lo, e->x, e->y);
+        fringe_add_intersection(e->hi, e->x, e->y);
+        break;
+      case FINISH:
+        f = fringe_finish(&eq, f, e->x, e->y, e->lo, e->hi);
+        CHECK_PANIC();
+        break;
+      }
+    free(e);
+    }
+  }
+
+/******** circle drawing */
+
+void adjust_circle_visibility(circle *c) {
+  int i, j, n, a;
+  int *in;
+  n = c->lo->ni + c->hi->ni;
+  in = malloc(sizeof(int) * n);
+  for (i=0;i<c->hi->ni;i++)
+    in[i] = c->hi->i[i]; 
+  for (i=c->lo->ni-1;i>=0;i--)
+    in[n-i-1] = c->lo->i[i] > 0 ? c->lo->i[i] : c->lo->i[i] + 2 * X_PI;
+  c->lo->ni = c->hi->ni = 0;
+
+  i = j = 0;
+  a = 0;
+  while (i < n && j < c->ni)           /* whee */
+    a = (in[i] < c->i[j] ? in[i++] : c->i[j++]) - a;
+  while (i < n)
+    a = in[i++] - a;
+  while (j < c->ni)
+    a = c->i[j++] - a;
+
+  if (a > X_PI) 
+    c->visible = !c->visible;
+  free(c->i);  
+  c->ni = n;
+  c->i = in;
+  }
+
+#define ARC_BUFFER_SIZE 256
+int arc_buffer_count = 0;
+XArc arc_buffer[ARC_BUFFER_SIZE];
+
+void flush_arc_buffer(Display *dpy, Drawable w, GC gc) {
+  if (arc_buffer_count) {
+    XDrawArcs(dpy, w, gc, arc_buffer, arc_buffer_count);
+    arc_buffer_count = 0;
+    }
+  }
+
+void draw_circle(Display *dpy, Drawable w, GC gc, circle *c) {
+  int i, xi, yi, di;
+  adjust_circle_visibility(c); 
+
+  xi = rint(c->x - c->r);
+  yi = rint(c->y - c->r);
+  di = c->r << 1;
+
+  #define ARC(p, a1, a2) {                                \
+    if (((p) & 1) ^ c->visible) {                         \
+      arc_buffer[arc_buffer_count].x      = xi;           \
+      arc_buffer[arc_buffer_count].y      = yi;           \
+      arc_buffer[arc_buffer_count].width  = di;           \
+      arc_buffer[arc_buffer_count].height = di;           \
+      arc_buffer[arc_buffer_count].angle1 = -(a1);        \
+      arc_buffer[arc_buffer_count].angle2 = (a1) - (a2);  \
+      arc_buffer_count++;                                 \
+      if (arc_buffer_count == ARC_BUFFER_SIZE)            \
+        flush_arc_buffer(dpy, w, gc);                     \
+      }                                                   \
+    }
+
+  if (!c->ni)
+    ARC(0, 0, 2 * X_PI)
+  else
+    ARC(0, c->i[c->ni-1], c->i[0] + 2 * X_PI)
+  for (i=1;i<c->ni;i++)
+    ARC(i, c->i[i-1], c->i[i])
+  }
+
+/******** toplevel */
+
+char *progclass = "Piecewise";
+
+char *defaults [] = {
+  ".background:         black",
+  ".foreground:         white",
+  "*delay:              5000",
+  "*speed:              15",
+  "*ncolors:            256",
+  ".colorspeed:         10",
+
+  ".count:              32",
+  ".minradius:          0.05",
+  ".maxradius:          0.2",   
+
+  "*doubleBuffer:       True",
+#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
+  "*useDBE:             True",
+#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
+  0
+  };
+
+XrmOptionDescRec options [] = {
+  { "-delay",           ".delay",       XrmoptionSepArg, 0 },
+  { "-ncolors",         ".ncolors",     XrmoptionSepArg, 0 },
+  { "-speed",           ".speed",       XrmoptionSepArg, 0 },
+  { "-colorspeed",      ".colorspeed",  XrmoptionSepArg, 0 },
+
+  { "-count",           ".count",       XrmoptionSepArg, 0 },
+  { "-minradius",       ".minradius",   XrmoptionSepArg, 0 },
+  { "-maxradius",       ".maxradius",   XrmoptionSepArg, 0 },
+
+  { "-db",              ".doubleBuffer", XrmoptionNoArg,  "True" },
+  { "-no-db",           ".doubleBuffer", XrmoptionNoArg,  "False" },
+  { 0, 0, 0, 0 }
+  };
+
+void screenhack(Display *dpy, Window window) {
+  int i;
+  Bool dbuf;
+  XColor *colors;
+  XGCValues gcv;
+  GC erase_gc, draw_gc;
+  XWindowAttributes xgwa;
+  Pixmap b = 0, ba = 0, bb = 0;    /* double-buffering pixmap */
+
+#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
+  XdbeBackBuffer backb = 0;
+#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
+
+  int count, delay, ncolors, colorspeed, color_index, flags, iterations;
+  int color_iterations;
+  circle *circles;
+
+  count = get_integer_resource("count", "Integer");
+  delay = get_integer_resource("delay", "Integer");
+  ncolors = get_integer_resource("ncolors", "Integer");
+  colorspeed = get_integer_resource("colorspeed", "Integer");
+  dbuf = get_boolean_resource("doubleBuffer", "Boolean");
+
+  color_iterations = colorspeed ? 100 / colorspeed : 100000;
+  if (!color_iterations)
+    color_iterations = 1;
+
+  XGetWindowAttributes(dpy, window, &xgwa);
+  colors = calloc(sizeof(XColor), ncolors);
+
+  if (get_boolean_resource("mono", "Boolean")) {  
+    MONO:
+      ncolors = 1;
+      colors[0].pixel = get_pixel_resource("foreground", "Foreground", dpy, xgwa.colormap);
+    }
+  else {
+    make_color_loop(dpy, xgwa.colormap, 0, 1, 1, 120, 1, 1, 240, 1, 1, colors, &ncolors, True, False);
+    if (ncolors < 2)
+      goto MONO; 
+    }
+
+  if (dbuf) {
+#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
+    b = backb = xdbe_get_backbuffer(dpy, window, XdbeUndefined);
+#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
+    
+    if (!b) {
+      ba = XCreatePixmap(dpy, window, xgwa.width, xgwa.height,xgwa.depth);
+      bb = XCreatePixmap(dpy, window, xgwa.width, xgwa.height,xgwa.depth);
+      b = ba;
+      }
+    }
+  else
+    b = window;
+
+  /* erasure gc */
+  gcv.foreground = get_pixel_resource("background", "Background", dpy, xgwa.colormap);
+  erase_gc = XCreateGC (dpy, b, GCForeground, &gcv);
+
+  /* drawing gc */
+  flags = GCForeground;
+  color_index = random() % ncolors;
+  gcv.foreground = colors[color_index].pixel;
+  draw_gc = XCreateGC(dpy, b, flags, &gcv);
+
+  /* initialize circles */
+  circles = init_circles(count, xgwa.width, xgwa.height);
+  
+  iterations = 0;
+  for (;;) {
+    XFillRectangle (dpy, b, erase_gc, 0, 0, xgwa.width, xgwa.height);
+
+    sweep(count, circles);
+    for (i=0;i<count;i++) {
+      draw_circle(dpy, b, draw_gc, circles+i);
+      move_circle(circles+i, xgwa.width, xgwa.height);
+      }
+    flush_arc_buffer(dpy, b, draw_gc);
+
+    if (++iterations % color_iterations == 0) {
+      color_index = (color_index + 1) % ncolors;
+      XSetForeground(dpy, draw_gc, colors[color_index].pixel);
+      }
+
+#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
+    if (backb) {
+      XdbeSwapInfo info[1];
+      info[0].swap_window = window;
+      info[0].swap_action = XdbeUndefined;
+      XdbeSwapBuffers (dpy, info, 1);
+      }
+    else
+#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
+    if (dbuf) {
+      XCopyArea (dpy, b, window, erase_gc, 0, 0, xgwa.width, xgwa.height, 0, 0);
+      b = (b == ba ? bb : ba);
+      }
+
+    XSync(dpy, False);
+    screenhack_handle_events(dpy);
+    if (delay)
+      usleep(delay);
+    }
+  }
diff --git a/hacks/piecewise.man b/hacks/piecewise.man
new file mode 100644 (file)
index 0000000..e06b679
--- /dev/null
@@ -0,0 +1,73 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+piecewise - lots of moving circles intersecting in interesting ways.
+.SH SYNOPSIS
+.B piecewise
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay \fInumber\fP]
+[\-count \fInumber\fP]
+[\-ncolors \fInumber\fP]
+[\-colorspeed \fInumber\fP]
+[\-minradius \fInumber\fP]
+[\-maxradius \fInumber\fP]
+[\-no-db]
+.SH DESCRIPTION
+This draws a bunch of moving circles which switch from visibility to invisibility
+when they intersect.
+.SH OPTIONS
+.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 \-window
+Draw on a newly-created window.  This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds.  Default: 5000 (0.01 seconds.).
+.TP 8
+.B \-count \fInumber\fP
+Number of circles.  Default: 32.
+.TP 8
+.B \-ncolors \fInumber\fP
+Number of colors, only one of which is used at a time.  Default: 256.
+.TP 8
+.B \-colorspeed \fInumber\fP
+How fast the color changes (0 - 100).  Default: 10.
+.TP 8
+.B \-minradius \fInumber\fP
+Minimum circle radius (as a proportion of screen height). Default: 0.05.
+.TP 8
+.B \-maxradius \fInumber\fP
+Maximum circle radius (as a proportion of screen height). Default: 0.2.
+.TP 8
+.B \-db | \-no-db
+Whether to double buffer.
+.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)
+.SH COPYRIGHT
+Copyright \(co 2003 by Geoffrey Irving.  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
+Geoffrey Irving.
index 89549ec06dc0ec145d7fb1116095aca0ed8cd505..482605fb5b347de1e1267694ab5b3f7019226d01 100644 (file)
@@ -1,3 +1,7 @@
+2003-02-12  Eric Lassauge <lassauge@mail.dotcom.fr>
+
+       * fr.po: Updated French translation.
+
 2002-06-18  Carlos Perello Marin <carlos@gnome-db.org>
 
        * INFO, xscreensaver.pot: Updated from 4.0.5 release.
 2002-06-18  Carlos Perello Marin <carlos@gnome-db.org>
 
        * INFO, xscreensaver.pot: Updated from 4.0.5 release.
index 7f7680e7f9ce0b76b94a92616c366bc3508262b0..e7cb3b65c331e0bc6090c1509e2d3f80258b2a12 100644 (file)
@@ -1,4 +1,4 @@
-# Auto-generated: Mon Feb  3 04:06:28 PST 2003
+# Auto-generated: Tue Feb 18 22:47:48 PST 2003
 driver/demo-Gtk-conf.c
 driver/demo-Gtk-support.c
 driver/demo-Gtk-widgets.c
 driver/demo-Gtk-conf.c
 driver/demo-Gtk-support.c
 driver/demo-Gtk-widgets.c
@@ -11,6 +11,7 @@ hacks/config/ant.xml
 hacks/config/apollonian.xml
 hacks/config/atlantis.xml
 hacks/config/attraction.xml
 hacks/config/apollonian.xml
 hacks/config/atlantis.xml
 hacks/config/attraction.xml
+hacks/config/atunnel.xml
 hacks/config/barcode.xml
 hacks/config/blaster.xml
 hacks/config/blitspin.xml
 hacks/config/barcode.xml
 hacks/config/blaster.xml
 hacks/config/blitspin.xml
@@ -105,6 +106,7 @@ hacks/config/penetrate.xml
 hacks/config/penrose.xml
 hacks/config/petri.xml
 hacks/config/phosphor.xml
 hacks/config/penrose.xml
 hacks/config/petri.xml
 hacks/config/phosphor.xml
+hacks/config/piecewise.xml
 hacks/config/pipes.xml
 hacks/config/polyominoes.xml
 hacks/config/popsquares.xml
 hacks/config/pipes.xml
 hacks/config/polyominoes.xml
 hacks/config/popsquares.xml
index 1bd60392080eb64baf3738e6e12d8ce1688385a0..c9428aa97cc731dfe0b72a2b85400b22b135075a 100644 (file)
--- a/po/fr.po
+++ b/po/fr.po
@@ -1,11 +1,11 @@
 # xscreensaver fr.po
 # Copyright (C) 2002 Free Software Foundation, Inc.
 # maintainer: Christophe Merlet (RedFox) <redfox@eikonex.org>, 2002.
 # xscreensaver fr.po
 # Copyright (C) 2002 Free Software Foundation, Inc.
 # maintainer: Christophe Merlet (RedFox) <redfox@eikonex.org>, 2002.
-# Eric Lassauge <lassauge@mail.dotcom.fr>, 2002.
-# http://lassauge.free.fr/
+# Eric Lassauge <lassauge@mail.dotcom.fr>, 2003.
+# http://lassauge.free.fr/xscreensaver/
 msgid ""
 msgstr ""
 msgid ""
 msgstr ""
-"Project-Id-Version: xscreensaver 4.06\n"
+"Project-Id-Version: xscreensaver 4.07\n"
 "POT-Creation-Date: 2002-05-10 19:02-0700\n"
 "PO-Revision-Date: 2002-03-18 09:47+0100\n"
 "Last-Translator: Eric Lassauge <lassauge@mail.dotcom.fr>\n"
 "POT-Creation-Date: 2002-05-10 19:02-0700\n"
 "PO-Revision-Date: 2002-03-18 09:47+0100\n"
 "Last-Translator: Eric Lassauge <lassauge@mail.dotcom.fr>\n"
@@ -34,7 +34,7 @@ msgstr "Erreur au chargement du fichier d'image: %s"
 
 #: driver/demo-Gtk-widgets.c:155 driver/xscreensaver-demo.glade.h:89
 msgid "XScreenSaver"
 
 #: driver/demo-Gtk-widgets.c:155 driver/xscreensaver-demo.glade.h:89
 msgid "XScreenSaver"
-msgstr "Économiseur d'écran"
+msgstr "Économiseur d'écran XScreenSaver"
 
 #: driver/demo-Gtk-widgets.c:176
 msgid "_File"
 
 #: driver/demo-Gtk-widgets.c:176
 msgid "_File"
@@ -64,7 +64,7 @@ msgstr "_Tue le d
 
 #: driver/demo-Gtk-widgets.c:231 driver/xscreensaver-demo.glade.h:71
 msgid "Tell the running XScreenSaver daemon to exit."
 
 #: driver/demo-Gtk-widgets.c:231 driver/xscreensaver-demo.glade.h:71
 msgid "Tell the running XScreenSaver daemon to exit."
-msgstr "Demande au démon XScreenSave actif de se terminer."
+msgstr "Demande au démon XScreenSaver actif de se terminer."
 
 #: driver/demo-Gtk-widgets.c:235 driver/xscreensaver-demo.glade.h:98
 msgid "_Restart Daemon"
 
 #: driver/demo-Gtk-widgets.c:235 driver/xscreensaver-demo.glade.h:98
 msgid "_Restart Daemon"
@@ -144,7 +144,8 @@ msgstr "Aper
 msgid ""
 "Demo the selected screen saver in full-screen mode (click the mouse to "
 "return.)"
 msgid ""
 "Demo the selected screen saver in full-screen mode (click the mouse to "
 "return.)"
-msgstr "Démo du mode sélectionné en plein écran (cliquer pour revenir)."
+msgstr ""
+"Démo de l'économiseur sélectionné en plein écran (cliquer pour revenir)."
 
 #: driver/demo-Gtk-widgets.c:486 driver/xscreensaver-demo.glade.h:65
 msgid "Settings..."
 
 #: driver/demo-Gtk-widgets.c:486 driver/xscreensaver-demo.glade.h:65
 msgid "Settings..."
@@ -152,11 +153,11 @@ msgstr "Param
 
 #: driver/demo-Gtk-widgets.c:494 driver/xscreensaver-demo.glade.h:17
 msgid "Customization and explanation of the selected screen saver."
 
 #: driver/demo-Gtk-widgets.c:494 driver/xscreensaver-demo.glade.h:17
 msgid "Customization and explanation of the selected screen saver."
-msgstr "Personnalisation et explications pour le mode sélectionné."
+msgstr "Personnalisation et explications pour l'économiseur sélectionné."
 
 #: driver/demo-Gtk-widgets.c:515 driver/xscreensaver-demo.glade.h:52
 msgid "Mode:"
 
 #: driver/demo-Gtk-widgets.c:515 driver/xscreensaver-demo.glade.h:52
 msgid "Mode:"
-msgstr "Mode:"
+msgstr "Economiseur:"
 
 #: driver/demo-Gtk-widgets.c:533 driver/xscreensaver-demo.glade.h:25
 msgid "Disable Screen Saver"
 
 #: driver/demo-Gtk-widgets.c:533 driver/xscreensaver-demo.glade.h:25
 msgid "Disable Screen Saver"
@@ -164,7 +165,7 @@ msgstr "Inhibe l'
 
 #: driver/demo-Gtk-widgets.c:536 driver/xscreensaver-demo.glade.h:9
 msgid "Blank Screen Only"
 
 #: driver/demo-Gtk-widgets.c:536 driver/xscreensaver-demo.glade.h:9
 msgid "Blank Screen Only"
-msgstr "Ecran noir maintenant"
+msgstr "Ecran noir uniquement"
 
 #: driver/demo-Gtk-widgets.c:539 driver/xscreensaver-demo.glade.h:56
 msgid "Only One Screen Saver"
 
 #: driver/demo-Gtk-widgets.c:539 driver/xscreensaver-demo.glade.h:56
 msgid "Only One Screen Saver"
@@ -172,11 +173,11 @@ msgstr "Seulement un 
 
 #: driver/demo-Gtk-widgets.c:542 driver/xscreensaver-demo.glade.h:60
 msgid "Random Screen Saver"
 
 #: driver/demo-Gtk-widgets.c:542 driver/xscreensaver-demo.glade.h:60
 msgid "Random Screen Saver"
-msgstr "Économiseur d'écran au hasard"
+msgstr "Économiseur d'écran aléatoire"
 
 #: driver/demo-Gtk-widgets.c:565 driver/xscreensaver-demo.glade.h:75
 msgid "Use"
 
 #: driver/demo-Gtk-widgets.c:565 driver/xscreensaver-demo.glade.h:75
 msgid "Use"
-msgstr "Utilise"
+msgstr "Choisis"
 
 #: driver/demo-Gtk-widgets.c:585 driver/xscreensaver-demo.glade.h:63
 msgid "Screen Saver"
 
 #: driver/demo-Gtk-widgets.c:585 driver/xscreensaver-demo.glade.h:63
 msgid "Screen Saver"
@@ -237,7 +238,7 @@ msgstr ""
 
 #: driver/demo-Gtk-widgets.c:764 driver/xscreensaver-demo.glade.h:29
 msgid "Display Subprocess Errors"
 
 #: driver/demo-Gtk-widgets.c:764 driver/xscreensaver-demo.glade.h:29
 msgid "Display Subprocess Errors"
-msgstr "Afficher les erreurs des sous-processus"
+msgstr "Afficher les erreurs des économiseurs"
 
 #: driver/demo-Gtk-widgets.c:779 driver/xscreensaver-demo.glade.h:87
 msgid ""
 
 #: driver/demo-Gtk-widgets.c:779 driver/xscreensaver-demo.glade.h:87
 msgid ""
@@ -297,7 +298,7 @@ msgstr "Dur
 
 #: driver/demo-Gtk-widgets.c:922 driver/xscreensaver-demo.glade.h:44
 msgid "How long it should take for the screen to fade in and out."
 
 #: driver/demo-Gtk-widgets.c:922 driver/xscreensaver-demo.glade.h:44
 msgid "How long it should take for the screen to fade in and out."
-msgstr "Combien doit durer les fondus avec le noir."
+msgstr "Combien de temps doivent durer les fondus avec le noir."
 
 #: driver/demo-Gtk-widgets.c:926 driver/xscreensaver-demo.glade.h:100
 msgid "seconds"
 
 #: driver/demo-Gtk-widgets.c:926 driver/xscreensaver-demo.glade.h:100
 msgid "seconds"
@@ -344,8 +345,8 @@ msgid ""
 "Whether the image-manipulating modes should be allowed to operate on an "
 "image of your desktop."
 msgstr ""
 "Whether the image-manipulating modes should be allowed to operate on an "
 "image of your desktop."
 msgstr ""
-"Les modes qui manipulent des images sont-ils autorisés à utiliser une image "
-"de votre bureau."
+"Les économiseurs qui manipulent des images sont-ils autorisés à utiliser une "
+"image de votre bureau."
 
 #: driver/demo-Gtk-widgets.c:1163 driver/xscreensaver-demo.glade.h:39
 msgid "Grab Desktop Images"
 
 #: driver/demo-Gtk-widgets.c:1163 driver/xscreensaver-demo.glade.h:39
 msgid "Grab Desktop Images"
@@ -356,8 +357,8 @@ msgid ""
 "Whether the image-manipulating modes should operate on images captured from "
 "the system's video input (if there is one)."
 msgstr ""
 "Whether the image-manipulating modes should operate on images captured from "
 "the system's video input (if there is one)."
 msgstr ""
-"Les modes qui manipulent des images sont-ils autorisés à utiliser une image "
-"capturée sur le port d'entrée vidéo du système (s'il y en a un)."
+"Les économiseurs qui manipulent des images sont-ils autorisés à utiliser une "
+"image capturée sur le port d'entrée vidéo du système (s'il y en a un)."
 
 #: driver/demo-Gtk-widgets.c:1180 driver/xscreensaver-demo.glade.h:40
 msgid "Grab Video Frames"
 
 #: driver/demo-Gtk-widgets.c:1180 driver/xscreensaver-demo.glade.h:40
 msgid "Grab Video Frames"
@@ -368,12 +369,12 @@ msgid ""
 "Whether the image-manipulating modes should operate on random images loaded "
 "from disk."
 msgstr ""
 "Whether the image-manipulating modes should operate on random images loaded "
 "from disk."
 msgstr ""
-"Les modes qui manipulent des images sont-ils autorisés à utiliser une image "
-"aléatoire depuis le disque dur."
+"Les économiseurs qui manipulent des images sont-ils autorisés à utiliser une "
+"image aléatoire depuis le disque dur."
 
 #: driver/demo-Gtk-widgets.c:1197 driver/xscreensaver-demo.glade.h:12
 msgid "Choose Random Image:"
 
 #: driver/demo-Gtk-widgets.c:1197 driver/xscreensaver-demo.glade.h:12
 msgid "Choose Random Image:"
-msgstr "Choisir une image aléatoireb:"
+msgstr "Choisir une image aléatoirement: "
 
 #: driver/demo-Gtk-widgets.c:1230 driver/xscreensaver-demo.glade.h:73
 msgid "The directory from which images will be randomly chosen."
 
 #: driver/demo-Gtk-widgets.c:1230 driver/xscreensaver-demo.glade.h:73
 msgid "The directory from which images will be randomly chosen."
@@ -390,7 +391,7 @@ msgstr "Commande avanc
 
 #: driver/demo-Gtk-widgets.c:1438 driver/xscreensaver-demo.glade.h:90
 msgid "XScreenSaver: Mode-Specific Settings"
 
 #: driver/demo-Gtk-widgets.c:1438 driver/xscreensaver-demo.glade.h:90
 msgid "XScreenSaver: Mode-Specific Settings"
-msgstr "XScreenSaver: paramètres spécifiques des modes"
+msgstr "XScreenSaver: paramètres spécifiques des économiseurs"
 
 #: driver/demo-Gtk-widgets.c:1460 driver/xscreensaver-demo.glade.h:64
 msgid "Settings"
 
 #: driver/demo-Gtk-widgets.c:1460 driver/xscreensaver-demo.glade.h:64
 msgid "Settings"
@@ -464,7 +465,7 @@ msgid ""
 "it will be used, otherwise, this demo will not be run."
 msgstr ""
 "Le type de visuel X que le mode utilisera. Si ce visuel est disponible il "
 "it will be used, otherwise, this demo will not be run."
 msgstr ""
 "Le type de visuel X que le mode utilisera. Si ce visuel est disponible il "
-"sera utilisé, sinon le mode ne sera pas lancé."
+"sera utilisé, sinon l'économiseur ne sera pas lancé."
 
 #: driver/demo-Gtk-widgets.c:1569 driver/xscreensaver-demo.glade.h:16
 msgid "Command Line:"
 
 #: driver/demo-Gtk-widgets.c:1569 driver/xscreensaver-demo.glade.h:16
 msgid "Command Line:"
@@ -472,7 +473,7 @@ msgstr "Ligne de commande:"
 
 #: driver/demo-Gtk-widgets.c:1641 driver/xscreensaver-demo.glade.h:31
 msgid "Documentation..."
 
 #: driver/demo-Gtk-widgets.c:1641 driver/xscreensaver-demo.glade.h:31
 msgid "Documentation..."
-msgstr ""
+msgstr "Documentation ..."
 
 #: driver/demo-Gtk-widgets.c:1649 driver/xscreensaver-demo.glade.h:13
 msgid "Click here to read the manual for this display mode, if it has one."
 
 #: driver/demo-Gtk-widgets.c:1649 driver/xscreensaver-demo.glade.h:13
 msgid "Click here to read the manual for this display mode, if it has one."
@@ -488,7 +489,7 @@ msgstr "Editer directement la ligne de commande."
 
 #: driver/demo-Gtk-widgets.c:1684 driver/xscreensaver-demo.glade.h:67
 msgid "Standard <<"
 
 #: driver/demo-Gtk-widgets.c:1684 driver/xscreensaver-demo.glade.h:67
 msgid "Standard <<"
-msgstr ""
+msgstr "Standard <<"
 
 #: driver/demo-Gtk-widgets.c:1692 driver/xscreensaver-demo.glade.h:6
 msgid "Back to the graphical configuration options."
 
 #: driver/demo-Gtk-widgets.c:1692 driver/xscreensaver-demo.glade.h:6
 msgid "Back to the graphical configuration options."
@@ -505,7 +506,9 @@ msgstr "Annule"
 
 #: driver/demo-Gtk.c:511
 msgid "For updates, check http://www.jwz.org/xscreensaver/"
 
 #: driver/demo-Gtk.c:511
 msgid "For updates, check http://www.jwz.org/xscreensaver/"
-msgstr "Pour les mises à jour, voir «http://www.jwz.org/xscreensaver/»"
+msgstr ""
+"Pour les mises à jour, voir «http://www.jwz.org/xscreensaver/»\n"
+"Traductions par E. LASSAUGE «http://lassauge.free.fr/xscreensaver/»"
 
 #: driver/demo-Gtk.c:517
 #, c-format
 
 #: driver/demo-Gtk.c:517
 #, c-format
@@ -1143,7 +1146,7 @@ msgstr "Eau claire"
 
 #: hacks/config/atlantis.xml.h:5
 msgid "Flat Background"
 
 #: hacks/config/atlantis.xml.h:5
 msgid "Flat Background"
-msgstr "Arrière-plan plat"
+msgstr "Arrière-plan unis"
 
 #: hacks/config/atlantis.xml.h:6
 msgid "Gradient Background"
 
 #: hacks/config/atlantis.xml.h:6
 msgid "Gradient Background"
@@ -1273,7 +1276,7 @@ msgstr ""
 #: hacks/config/superquadrics.xml.h:4 hacks/config/t3d.xml.h:7
 #: hacks/config/twang.xml.h:5 hacks/config/wander.xml.h:8
 msgid "High"
 #: hacks/config/superquadrics.xml.h:4 hacks/config/t3d.xml.h:7
 #: hacks/config/twang.xml.h:5 hacks/config/wander.xml.h:8
 msgid "High"
-msgstr "Haute"
+msgstr "Haut(e)"
 
 #: hacks/config/attraction.xml.h:11
 msgid "Ignore Screen Edges"
 
 #: hacks/config/attraction.xml.h:11
 msgid "Ignore Screen Edges"
@@ -1281,7 +1284,7 @@ msgstr "Ignore les bords de l'
 
 #: hacks/config/attraction.xml.h:12
 msgid "Inward"
 
 #: hacks/config/attraction.xml.h:12
 msgid "Inward"
-msgstr ""
+msgstr "Vers l'intérieur"
 
 #: hacks/config/attraction.xml.h:14
 msgid ""
 
 #: hacks/config/attraction.xml.h:14
 msgid ""
@@ -1329,28 +1332,27 @@ msgstr "Long"
 #: hacks/config/superquadrics.xml.h:5 hacks/config/t3d.xml.h:8
 #: hacks/config/twang.xml.h:7 hacks/config/wander.xml.h:11
 msgid "Low"
 #: hacks/config/superquadrics.xml.h:5 hacks/config/t3d.xml.h:8
 #: hacks/config/twang.xml.h:7 hacks/config/wander.xml.h:11
 msgid "Low"
-msgstr "Basse"
+msgstr "Bas(se)"
 
 #: hacks/config/attraction.xml.h:20
 msgid "Orbital Mode"
 
 #: hacks/config/attraction.xml.h:20
 msgid "Orbital Mode"
-msgstr ""
+msgstr "Mode orbital"
 
 #: hacks/config/attraction.xml.h:21
 msgid "Outward"
 
 #: hacks/config/attraction.xml.h:21
 msgid "Outward"
-msgstr ""
+msgstr "Vers l'extérieur"
 
 #: hacks/config/attraction.xml.h:22
 msgid "Polygons"
 
 #: hacks/config/attraction.xml.h:22
 msgid "Polygons"
-msgstr ""
+msgstr "Polygônes"
 
 #: hacks/config/attraction.xml.h:23 hacks/config/spotlight.xml.h:3
 msgid "Radius"
 msgstr "Rayon"
 
 #: hacks/config/attraction.xml.h:24
 
 #: hacks/config/attraction.xml.h:23 hacks/config/spotlight.xml.h:3
 msgid "Radius"
 msgstr "Rayon"
 
 #: hacks/config/attraction.xml.h:24
-#, fuzzy
 msgid "Repulsion Threshold"
 msgid "Repulsion Threshold"
-msgstr "Réactivité"
+msgstr "Seuil de répulsion"
 
 #: hacks/config/attraction.xml.h:25 hacks/config/braid.xml.h:10
 #: hacks/config/cynosure.xml.h:8 hacks/config/drift.xml.h:11
 
 #: hacks/config/attraction.xml.h:25 hacks/config/braid.xml.h:10
 #: hacks/config/cynosure.xml.h:8 hacks/config/drift.xml.h:11
@@ -1430,7 +1432,7 @@ msgstr ""
 
 #: hacks/config/blitspin.xml.h:6
 msgid "Grab Screen"
 
 #: hacks/config/blitspin.xml.h:6
 msgid "Grab Screen"
-msgstr ""
+msgstr "Acquisition de l'écran"
 
 #: hacks/config/blitspin.xml.h:8
 msgid ""
 
 #: hacks/config/blitspin.xml.h:8
 msgid ""
@@ -1472,7 +1474,7 @@ msgstr "Vitesse d'animation"
 
 #: hacks/config/boxed.xml.h:2
 msgid "Boxed"
 
 #: hacks/config/boxed.xml.h:2
 msgid "Boxed"
-msgstr ""
+msgstr "Avec la boîte"
 
 #: hacks/config/boxed.xml.h:3
 msgid ""
 
 #: hacks/config/boxed.xml.h:3
 msgid ""
@@ -1516,9 +1518,8 @@ msgid "Line Thickness"
 msgstr "Epaisseur des lignes"
 
 #: hacks/config/braid.xml.h:8
 msgstr "Epaisseur des lignes"
 
 #: hacks/config/braid.xml.h:8
-#, fuzzy
 msgid "Max Rings"
 msgid "Max Rings"
-msgstr "Maximum de lignes"
+msgstr "Maximum de cercles"
 
 #: hacks/config/bsod.xml.h:1 hacks/config/molecule.xml.h:1
 #: hacks/config/vidwhacker.xml.h:1 hacks/config/webcollage.xml.h:1
 
 #: hacks/config/bsod.xml.h:1 hacks/config/molecule.xml.h:1
 #: hacks/config/vidwhacker.xml.h:1 hacks/config/webcollage.xml.h:1
@@ -1554,44 +1555,44 @@ msgstr ""
 
 #: hacks/config/bsod.xml.h:9
 msgid "Mac Bomb"
 
 #: hacks/config/bsod.xml.h:9
 msgid "Mac Bomb"
-msgstr ""
+msgstr "Bombe Mac"
 
 #: hacks/config/bsod.xml.h:10
 msgid "MacsBug"
 
 #: hacks/config/bsod.xml.h:10
 msgid "MacsBug"
-msgstr ""
+msgstr "MacsBug"
 
 #: hacks/config/bsod.xml.h:11
 msgid "NCD X Terminal"
 
 #: hacks/config/bsod.xml.h:11
 msgid "NCD X Terminal"
-msgstr ""
+msgstr "Terminal X NCD"
 
 #: hacks/config/bsod.xml.h:12
 msgid "SCO"
 
 #: hacks/config/bsod.xml.h:12
 msgid "SCO"
-msgstr ""
+msgstr "SCO"
 
 #: hacks/config/bsod.xml.h:13
 msgid "Sad Mac"
 
 #: hacks/config/bsod.xml.h:13
 msgid "Sad Mac"
-msgstr ""
+msgstr "Mac triste"
 
 #: hacks/config/bsod.xml.h:14
 msgid "Solaris"
 
 #: hacks/config/bsod.xml.h:14
 msgid "Solaris"
-msgstr ""
+msgstr "Solaris"
 
 #: hacks/config/bsod.xml.h:15
 msgid "Sparc Linux"
 
 #: hacks/config/bsod.xml.h:15
 msgid "Sparc Linux"
-msgstr ""
+msgstr "Linux Sparc"
 
 #: hacks/config/bsod.xml.h:16
 #, fuzzy
 msgid "Windows"
 
 #: hacks/config/bsod.xml.h:16
 #, fuzzy
 msgid "Windows"
-msgstr "Vent"
+msgstr "Windows NT"
 
 #: hacks/config/bsod.xml.h:17
 msgid "Windows 2000"
 
 #: hacks/config/bsod.xml.h:17
 msgid "Windows 2000"
-msgstr ""
+msgstr "Windows 2000"
 
 #: hacks/config/bsod.xml.h:18
 msgid "Windows NT"
 
 #: hacks/config/bsod.xml.h:18
 msgid "Windows NT"
-msgstr ""
+msgstr "Windows NT"
 
 #: hacks/config/bubble3d.xml.h:1
 msgid "Bubble3D"
 
 #: hacks/config/bubble3d.xml.h:1
 msgid "Bubble3D"
@@ -1699,25 +1700,24 @@ msgstr ""
 
 #: hacks/config/circuit.xml.h:1
 msgid "Animates a number of 3D electronic components. Written by Ben Buxton."
 
 #: hacks/config/circuit.xml.h:1
 msgid "Animates a number of 3D electronic components. Written by Ben Buxton."
-msgstr ""
+msgstr "Anime des composants électroniques en 3D. Ecris par Ben buxton."
 
 #: hacks/config/circuit.xml.h:2
 msgid "Circuit"
 
 #: hacks/config/circuit.xml.h:2
 msgid "Circuit"
-msgstr ""
+msgstr "Circuit"
 
 #: hacks/config/circuit.xml.h:3 hacks/config/gflux.xml.h:4
 #: hacks/config/pulsar.xml.h:2
 msgid "Directional Lighting"
 
 #: hacks/config/circuit.xml.h:3 hacks/config/gflux.xml.h:4
 #: hacks/config/pulsar.xml.h:2
 msgid "Directional Lighting"
-msgstr ""
+msgstr "Lumière directionnelle"
 
 #: hacks/config/circuit.xml.h:5
 
 #: hacks/config/circuit.xml.h:5
-#, fuzzy
 msgid "Flat Coloring"
 msgid "Flat Coloring"
-msgstr "Couleur des zones « mortes »"
+msgstr "Couleur à plat"
 
 #: hacks/config/circuit.xml.h:6
 msgid "Parts"
 
 #: hacks/config/circuit.xml.h:6
 msgid "Parts"
-msgstr ""
+msgstr "Eléments"
 
 #: hacks/config/circuit.xml.h:7 hacks/config/flipscreen3d.xml.h:4
 msgid "Rotate"
 
 #: hacks/config/circuit.xml.h:7 hacks/config/flipscreen3d.xml.h:4
 msgid "Rotate"
@@ -1740,7 +1740,7 @@ msgstr "Boussole"
 #: hacks/config/interference.xml.h:4 hacks/config/kumppa.xml.h:2
 #: hacks/config/nerverot.xml.h:6 hacks/config/pipes.xml.h:4
 msgid "Double Buffer"
 #: hacks/config/interference.xml.h:4 hacks/config/kumppa.xml.h:2
 #: hacks/config/nerverot.xml.h:6 hacks/config/pipes.xml.h:4
 msgid "Double Buffer"
-msgstr ""
+msgstr "Tampon double"
 
 #: hacks/config/compass.xml.h:6
 msgid ""
 
 #: hacks/config/compass.xml.h:6
 msgid ""
@@ -1873,9 +1873,8 @@ msgid "Display Solid Colors"
 msgstr "Affiche des couleurs unies"
 
 #: hacks/config/cubenetic.xml.h:4
 msgstr "Affiche des couleurs unies"
 
 #: hacks/config/cubenetic.xml.h:4
-#, fuzzy
 msgid "Display Surface Patterns"
 msgid "Display Surface Patterns"
-msgstr "Afficher les parasites."
+msgstr "Afficher les patterns de surface."
 
 #: hacks/config/cubenetic.xml.h:5
 msgid "Display Wireframe"
 
 #: hacks/config/cubenetic.xml.h:5
 msgid "Display Wireframe"
@@ -2134,7 +2133,7 @@ msgstr "
 
 #: hacks/config/discrete.xml.h:1
 msgid "Discrete"
 
 #: hacks/config/discrete.xml.h:1
 msgid "Discrete"
-msgstr "Discret"
+msgstr "Discrète"
 
 #: hacks/config/discrete.xml.h:5
 msgid ""
 
 #: hacks/config/discrete.xml.h:5
 msgid ""
@@ -2144,11 +2143,11 @@ msgstr ""
 
 #: hacks/config/distort.xml.h:1
 msgid "Black Hole"
 
 #: hacks/config/distort.xml.h:1
 msgid "Black Hole"
-msgstr ""
+msgstr "Trou noir"
 
 #: hacks/config/distort.xml.h:2
 msgid "Bounce"
 
 #: hacks/config/distort.xml.h:2
 msgid "Bounce"
-msgstr ""
+msgstr "Rebondis"
 
 #: hacks/config/distort.xml.h:3
 msgid "Distort"
 
 #: hacks/config/distort.xml.h:3
 msgid "Distort"
@@ -2222,7 +2221,7 @@ msgstr "Lissajous"
 
 #: hacks/config/electricsheep.xml.h:1
 msgid "ElectricSheep"
 
 #: hacks/config/electricsheep.xml.h:1
 msgid "ElectricSheep"
-msgstr "Mouton électrique"
+msgstr ""
 
 #: hacks/config/electricsheep.xml.h:2
 msgid ""
 
 #: hacks/config/electricsheep.xml.h:2
 msgid ""
@@ -2270,7 +2269,7 @@ msgstr ""
 
 #: hacks/config/euler2d.xml.h:10 hacks/config/whirlwindwarp.xml.h:5
 msgid "Particles"
 
 #: hacks/config/euler2d.xml.h:10 hacks/config/whirlwindwarp.xml.h:5
 msgid "Particles"
-msgstr "Particules à l'écran"
+msgstr "Particules"
 
 #: hacks/config/euler2d.xml.h:11
 msgid "Power"
 
 #: hacks/config/euler2d.xml.h:11
 msgid "Power"
@@ -2348,7 +2347,7 @@ msgstr ""
 
 #: hacks/config/fadeplot.xml.h:3
 msgid "FadePlot"
 
 #: hacks/config/fadeplot.xml.h:3
 msgid "FadePlot"
-msgstr "Ruban"
+msgstr ""
 
 #: hacks/config/flag.xml.h:1
 msgid "Bitmap for Flag"
 
 #: hacks/config/flag.xml.h:1
 msgid "Bitmap for Flag"
@@ -2391,7 +2390,7 @@ msgstr "Complexit
 
 #: hacks/config/flame.xml.h:8
 msgid "Flame"
 
 #: hacks/config/flame.xml.h:8
 msgid "Flame"
-msgstr "Xflame"
+msgstr "Flame"
 
 #: hacks/config/flame.xml.h:13
 msgid "Number of Fractals"
 
 #: hacks/config/flame.xml.h:13
 msgid "Number of Fractals"
@@ -2556,7 +2555,7 @@ msgstr ""
 
 #: hacks/config/gears.xml.h:10
 msgid "Three Gear System"
 
 #: hacks/config/gears.xml.h:10
 msgid "Three Gear System"
-msgstr ""
+msgstr "Système à trois roues"
 
 #: hacks/config/gflux.xml.h:2
 msgid "Checkerboard"
 
 #: hacks/config/gflux.xml.h:2
 msgid "Checkerboard"
@@ -2608,8 +2607,7 @@ msgid ""
 msgstr ""
 "Dessine l'animation d'un quasi-feu avec des triangles en 3D dans un paysage "
 "parsemé d'arbres. Nécessite une machine ayant un support matériel accéléré "
 msgstr ""
 "Dessine l'animation d'un quasi-feu avec des triangles en 3D dans un paysage "
 "parsemé d'arbres. Nécessite une machine ayant un support matériel accéléré "
-"de OpenGHL pour les textures. Ecris par Eric Lassauge <lassauge@mail.dotcom."
-"fr>"
+"OpenGL pour les textures. Ecris par Eric Lassauge <lassauge@mail.dotcom.fr>"
 
 #: hacks/config/glforestfire.xml.h:5
 msgid "Fog"
 
 #: hacks/config/glforestfire.xml.h:5
 msgid "Fog"
@@ -3366,7 +3364,7 @@ msgstr "Dessine les atomes"
 
 #: hacks/config/molecule.xml.h:7 hacks/config/spheremonics.xml.h:2
 msgid "Draw Bounding Box"
 
 #: hacks/config/molecule.xml.h:7 hacks/config/spheremonics.xml.h:2
 msgid "Draw Bounding Box"
-msgstr ""
+msgstr "Dessine la boîte englobante"
 
 #: hacks/config/molecule.xml.h:8
 msgid ""
 
 #: hacks/config/molecule.xml.h:8
 msgid ""
@@ -3395,7 +3393,7 @@ msgstr ""
 
 #: hacks/config/morph3d.xml.h:4
 msgid "Morph3D"
 
 #: hacks/config/morph3d.xml.h:4
 msgid "Morph3D"
-msgstr ""
+msgstr "Morph 3D"
 
 #: hacks/config/mountain.xml.h:3
 msgid ""
 
 #: hacks/config/mountain.xml.h:3
 msgid ""
@@ -3569,7 +3567,7 @@ msgstr "La mort arrive"
 
 #: hacks/config/petri.xml.h:4
 msgid "Diamond"
 
 #: hacks/config/petri.xml.h:4
 msgid "Diamond"
-msgstr "Diamand"
+msgstr "Diamant"
 
 #: hacks/config/petri.xml.h:6
 msgid "Fertility"
 
 #: hacks/config/petri.xml.h:6
 msgid "Fertility"
@@ -3581,7 +3579,7 @@ msgstr ""
 
 #: hacks/config/petri.xml.h:13
 msgid "Maxium Rate of Death"
 
 #: hacks/config/petri.xml.h:13
 msgid "Maxium Rate of Death"
-msgstr ""
+msgstr "Vitesse maximale de décès"
 
 #: hacks/config/petri.xml.h:14
 msgid "Maxium Rate of Growth"
 
 #: hacks/config/petri.xml.h:14
 msgid "Maxium Rate of Growth"
@@ -3631,7 +3629,6 @@ msgid ""
 msgstr ""
 
 #: hacks/config/phosphor.xml.h:1
 msgstr ""
 
 #: hacks/config/phosphor.xml.h:1
-#, fuzzy
 msgid ""
 "Draws a simulation of an old terminal, with large pixels and long-sustain "
 "phosphor. It can run any program as a source of the text it displays. "
 msgid ""
 "Draws a simulation of an old terminal, with large pixels and long-sustain "
 "phosphor. It can run any program as a source of the text it displays. "
@@ -3715,7 +3712,7 @@ msgstr ""
 
 #: hacks/config/pulsar.xml.h:1
 msgid "Anti-alias Lines"
 
 #: hacks/config/pulsar.xml.h:1
 msgid "Anti-alias Lines"
-msgstr ""
+msgstr "Lignes anti-aliasées"
 
 #: hacks/config/pulsar.xml.h:3
 msgid ""
 
 #: hacks/config/pulsar.xml.h:3
 msgid ""
@@ -3875,9 +3872,8 @@ msgid "Reaction/Difusion"
 msgstr "Réaction/Diffusion"
 
 #: hacks/config/rd-bomb.xml.h:16
 msgstr "Réaction/Diffusion"
 
 #: hacks/config/rd-bomb.xml.h:16
-#, fuzzy
 msgid "Seed Radius"
 msgid "Seed Radius"
-msgstr "Rayon"
+msgstr "Rayon de la racine"
 
 #: hacks/config/rd-bomb.xml.h:19 hacks/config/twang.xml.h:12
 msgid "Tile Size"
 
 #: hacks/config/rd-bomb.xml.h:19 hacks/config/twang.xml.h:12
 msgid "Tile Size"
@@ -3943,9 +3939,8 @@ msgid "Rotation"
 msgstr "Rotation"
 
 #: hacks/config/rocks.xml.h:10
 msgstr "Rotation"
 
 #: hacks/config/rocks.xml.h:10
-#, fuzzy
 msgid "Steering"
 msgid "Steering"
-msgstr "Démarre"
+msgstr ""
 
 #: hacks/config/rocks.xml.h:11
 msgid ""
 
 #: hacks/config/rocks.xml.h:11
 msgid ""
@@ -4048,6 +4043,9 @@ msgid ""
 "OpenGL, and a machine with fast hardware support for texture maps. Written "
 "by Eric Lassauge &lt;lassauge@mail.dotcom.fr&gt;."
 msgstr ""
 "OpenGL, and a machine with fast hardware support for texture maps. Written "
 "by Eric Lassauge &lt;lassauge@mail.dotcom.fr&gt;."
 msgstr ""
+"Dessine l'animation de balles texturées qui tournent comme des folles en GL. "
+"Nécessite une machine ayant un support matériel accéléré OpenGL pour les "
+"textures. Ecris par Eric Lassauge <lassauge@mail.dotcom.fr>"
 
 #: hacks/config/sballs.xml.h:5
 msgid "Icosahedron"
 
 #: hacks/config/sballs.xml.h:5
 msgid "Icosahedron"
@@ -4825,11 +4823,11 @@ msgstr "Temps r
 
 #: hacks/config/xearth.xml.h:20
 msgid "Shaded Image"
 
 #: hacks/config/xearth.xml.h:20
 msgid "Shaded Image"
-msgstr ""
+msgstr "Image ombrée"
 
 #: hacks/config/xearth.xml.h:21
 msgid "Sharp"
 
 #: hacks/config/xearth.xml.h:21
 msgid "Sharp"
-msgstr ""
+msgstr "Pointu"
 
 #: hacks/config/xearth.xml.h:23
 msgid "Spacing"
 
 #: hacks/config/xearth.xml.h:23
 msgid "Spacing"
@@ -4932,7 +4930,7 @@ msgstr ""
 
 #: hacks/config/xmatrix.xml.h:2
 msgid "Binary Encoding"
 
 #: hacks/config/xmatrix.xml.h:2
 msgid "Binary Encoding"
-msgstr "Encodag binaire"
+msgstr "Encodage binaire"
 
 #: hacks/config/xmatrix.xml.h:3
 msgid "Expansion Algorithm"
 
 #: hacks/config/xmatrix.xml.h:3
 msgid "Expansion Algorithm"
@@ -5093,13 +5091,13 @@ msgstr ""
 #~ msgstr "Choisir _Aléatoirement une image:"
 
 #~ msgid "Display Subprocess _Errors"
 #~ msgstr "Choisir _Aléatoirement une image:"
 
 #~ msgid "Display Subprocess _Errors"
-#~ msgstr "Afficher les _Erreurs des sous-processus"
+#~ msgstr "Afficher les _Erreurs des économiseurs"
 
 #~ msgid "Display _Splash Screen at Startup"
 #~ msgstr "Affiche l'écran _Splash au démarrage"
 
 #~ msgid "F_ade Duration"
 
 #~ msgid "Display _Splash Screen at Startup"
 #~ msgstr "Affiche l'écran _Splash au démarrage"
 
 #~ msgid "F_ade Duration"
-#~ msgstr "Durée de _Fondu"
+#~ msgstr "Durée du _Fondu"
 
 #~ msgid "Fade from Black When _Unblanking"
 #~ msgstr "Fondu depuis le noir lors de l'arrêt"
 
 #~ msgid "Fade from Black When _Unblanking"
 #~ msgstr "Fondu depuis le noir lors de l'arrêt"
@@ -5114,11 +5112,18 @@ msgstr ""
 #~ msgstr "Acquérir des trames _vidéo"
 
 #~ msgid "How long after the screen blanks until a password will be required."
 #~ msgstr "Acquérir des trames _vidéo"
 
 #~ msgid "How long after the screen blanks until a password will be required."
-#~ msgstr "Durée avant qu'un mot de passe soit nécessaire."
+#~ msgstr "Durée avant qu'un mot de passe soit nécessaire après l'activation."
 
 #~ msgid "How long before the screensaver activates."
 #~ msgstr "Durée avant que le l'économiseur d'écran s'active."
 
 
 #~ msgid "How long before the screensaver activates."
 #~ msgstr "Durée avant que le l'économiseur d'écran s'active."
 
+#~ msgid ""
+#~ "How long each display mode should run before choosing a new one (in "
+#~ "Random mode.)"
+#~ msgstr ""
+#~ "Combien de temps chaque économiseur doit fonctionner avant le passage à "
+#~ "un autre (avec l'option Mode Aléatoire)."
+
 #~ msgid "How long until the monitor goes completely black."
 #~ msgstr "Durée avant que le moniteur passe au noir."
 
 #~ msgid "How long until the monitor goes completely black."
 #~ msgstr "Durée avant que le moniteur passe au noir."
 
@@ -5145,6 +5150,13 @@ msgstr ""
 #~ msgid "Sus_pend After"
 #~ msgstr "Sus_pend après"
 
 #~ msgid "Sus_pend After"
 #~ msgstr "Sus_pend après"
 
+#~ msgid ""
+#~ "Whether the image-manipulating modes should operate on images captured "
+#~ "from the system's video input (if there is one.)"
+#~ msgstr ""
+#~ "Les modes qui manipulent des images sont-ils autorisés à utiliser une "
+#~ "image capturée sur le port d'entrée vidéo du système (s'il y en a un)."
+
 #~ msgid "_Advanced"
 #~ msgstr "_Avancée"
 
 #~ msgid "_Advanced"
 #~ msgstr "_Avancée"
 
@@ -5169,6 +5181,9 @@ msgstr ""
 #~ msgid "_Lock Screen After"
 #~ msgstr "_Blocage de l'écran après"
 
 #~ msgid "_Lock Screen After"
 #~ msgstr "_Blocage de l'écran après"
 
+#~ msgid "_Mode:"
+#~ msgstr "_Mode:"
+
 #~ msgid "_Off After"
 #~ msgstr "Coup_ure après"
 
 #~ msgid "_Off After"
 #~ msgstr "Coup_ure après"
 
@@ -5184,6 +5199,9 @@ msgstr ""
 #~ msgid "_Settings..."
 #~ msgstr "_Paramètres..."
 
 #~ msgid "_Settings..."
 #~ msgstr "_Paramètres..."
 
+#~ msgid "_Standard <<"
+#~ msgstr "_Standard <<"
+
 #~ msgid "_Verbose Diagnostics"
 #~ msgstr "Diagnostiques _verbeux"
 
 #~ msgid "_Verbose Diagnostics"
 #~ msgstr "Diagnostiques _verbeux"
 
@@ -5205,15 +5223,105 @@ msgstr ""
 #~ msgid "Arms"
 #~ msgstr "Bras"
 
 #~ msgid "Arms"
 #~ msgstr "Bras"
 
+#~ msgid "Rarely"
+#~ msgstr "Rarement"
+
 #~ msgid "Tentacles"
 #~ msgstr "Tentacules"
 
 #~ msgid "Tentacles"
 #~ msgstr "Tentacules"
 
-#~ msgid "90 deg Rotation Speed"
+#~ msgid "Turn speed"
 #~ msgstr "Vitesse de rotation"
 
 #~ msgstr "Vitesse de rotation"
 
+#~ msgid "Draw Eyes"
+#~ msgstr "Affiche les yeux"
+
+#~ msgid ""
+#~ "Draws an animation of a textured tunnel in GL. Requires OpenGL, and a "
+#~ "machine with fast hardware support for texture maps. Written by Eric "
+#~ "Lassauge &lt;lassauge@mail.dotcom.fr&gt;."
+#~ msgstr ""
+#~ "Dessine l'animation d'un tunnel texturé en 3D quasi-hypnotique.Nécessite "
+#~ "une machine ayant un support matériel accéléré OpenGL pour les textures. "
+#~ "Ecris par Eric Lassauge <lassauge@mail.dotcom.fr>"
+
+#~ msgid "Use light"
+#~ msgstr "Utiliser les éclairages"
+
+#~ msgid "Barcode"
+#~ msgstr "Code barre"
+
+#~ msgid "90 deg Rotation Speed"
+#~ msgstr "Vitesse de rotation à 90°"
+
+#~ msgid "Linux"
+#~ msgstr "Linux"
+
+#~ msgid "MacOS X"
+#~ msgstr "MacOS X"
+
+#~ msgid "Windows 3.1"
+#~ msgstr "Windows 3.1"
+
+#~ msgid "Frame Rate"
+#~ msgstr "Vitesse d'affichage"
+
+#~ msgid "Hide Sheep"
+#~ msgstr "Cache le mouton"
+
+#~ msgid "Nickname"
+#~ msgstr "Pseudo"
+
+#~ msgid "Repititions of each Sheep"
+#~ msgstr "Répérition de chaque mouton"
+
+#~ msgid "Standalone"
+#~ msgstr "Autonome"
+
 #~ msgid "Endgame"
 #~ msgstr "Fin de partie"
 
 #~ msgid "Endgame"
 #~ msgstr "Fin de partie"
 
+#~ msgid "Eruption"
+#~ msgstr "Eruption"
+
+#~ msgid "Heat"
+#~ msgstr "Chaleur"
+
+#~ msgid "Inferno"
+#~ msgstr "Enfer"
+
+#~ msgid "Little"
+#~ msgstr "Peu"
+
+#~ msgid "Negative"
+#~ msgstr "Négative"
+
+#~ msgid "Number of Particles"
+#~ msgstr "Nombre de particules"
+
+#~ msgid "Pleasant"
+#~ msgstr "Agréable"
+
+#~ msgid "Positive"
+#~ msgstr "Positive"
+
+#~ msgid "Classic"
+#~ msgstr "Classique"
+
+#~ msgid "Fire"
+#~ msgstr "Feux"
+
+#~ msgid "Insane"
+#~ msgstr "Fou"
+
+#~ msgid "Psychedelic"
+#~ msgstr "Psychédilique"
+
+#~ msgid "RGB"
+#~ msgstr "RVB"
+
+#~ msgid "Water"
+#~ msgstr "Eau"
+
 #~ msgid "Delay (Large = low cpu load)"
 #~ msgstr "Délai (élevé = peu de charge CPU)"
 
 #~ msgid "Delay (Large = low cpu load)"
 #~ msgstr "Délai (élevé = peu de charge CPU)"
 
@@ -5253,6 +5361,9 @@ msgstr ""
 #~ msgid "Giant Lavalite"
 #~ msgstr "Lavalite géante"
 
 #~ msgid "Giant Lavalite"
 #~ msgstr "Lavalite géante"
 
+#~ msgid "LavaLite"
+#~ msgstr "Lavalite"
+
 #~ msgid "Max Blobs"
 #~ msgstr "Blobs max"
 
 #~ msgid "Max Blobs"
 #~ msgstr "Blobs max"
 
@@ -5265,6 +5376,33 @@ msgstr ""
 #~ msgid "Smooth"
 #~ msgstr "Lisse"
 
 #~ msgid "Smooth"
 #~ msgstr "Lisse"
 
+#~ msgid "Big"
+#~ msgstr "Grand"
+
+#~ msgid "MetaBall Movement"
+#~ msgstr "Mouvement des métaballes"
+
+#~ msgid "MetaBall Radius"
+#~ msgstr "Rayon des métaballes"
+
+#~ msgid "MetaBalls"
+#~ msgstr "Métaballes"
+
+#~ msgid "Number of MetaBalls"
+#~ msgstr "Nombre de métaballes"
+
+#~ msgid "Border"
+#~ msgstr "Epaisseur de la bordure"
+
+#~ msgid "End color"
+#~ msgstr "Couleur de fin"
+
+#~ msgid "Start color"
+#~ msgstr "Couleur de début"
+
+#~ msgid "popsquares"
+#~ msgstr "Carrés pops"
+
 #~ msgid "Queens"
 #~ msgstr "Reines"
 
 #~ msgid "Queens"
 #~ msgstr "Reines"
 
@@ -5274,5 +5412,23 @@ msgstr ""
 #~ msgid "90 deg"
 #~ msgstr "90°"
 
 #~ msgid "90 deg"
 #~ msgstr "90°"
 
+#~ msgid "Leave a trail"
+#~ msgstr "Trainée"
+
+#~ msgid "Linear"
+#~ msgstr "Linéaire"
+
+#~ msgid "Lissajous"
+#~ msgstr "Lissajous"
+
+#~ msgid "Test"
+#~ msgstr "Teste"
+
+#~ msgid "Use Double Buffering"
+#~ msgstr "Utilise un tampon double"
+
+#~ msgid "Wrap the screen"
+#~ msgstr "Enveloppe l'écran"
+
 #~ msgid "Knock Knock"
 #~ msgstr "Toc toc"
 #~ msgid "Knock Knock"
 #~ msgstr "Toc toc"
index 96b4ce994665b17ab2fb9732760ab7edd8cbb191..a230ce360e8bb1520605ce9267f19553e4206899 100644 (file)
--- a/setup.com
+++ b/setup.com
@@ -74,6 +74,7 @@ $ penetrate   :== $'mydir'penetrate
 $ penrose      :== $'mydir'penrose
 $ petri                :== $'mydir'petri
 $ phosphor     :== $'mydir'phosphor
 $ penrose      :== $'mydir'penrose
 $ petri                :== $'mydir'petri
 $ phosphor     :== $'mydir'phosphor
+$ piecewise    :== $'mydir'piecewise
 $ polyominoes  :== $'mydir'polyominoes
 $ popsquares   :== $'mydir'popsquares
 $ pyro         :== $'mydir'pyro
 $ polyominoes  :== $'mydir'polyominoes
 $ popsquares   :== $'mydir'popsquares
 $ pyro         :== $'mydir'pyro
index 25d4030d56775d536eb93949438ec6ed64c46c4e..beb45ea99f1139a221248c2282082e2f5394f76c 100644 (file)
@@ -1,2 +1,2 @@
 static const char screensaver_id[] =
 static const char screensaver_id[] =
-       "@(#)xscreensaver 4.07 (03-Feb-2003), by Jamie Zawinski (jwz@jwz.org)";
+       "@(#)xscreensaver 4.08 (18-Feb-2003), by Jamie Zawinski (jwz@jwz.org)";
index 054bfaf2b6b061549d2a8add3a208383146adb98..09aee67a868844feba6ee3b8ca9508ea14b602a9 100644 (file)
@@ -1,4 +1,4 @@
-/* xscreensaver, Copyright (c) 1999, 2000 by Jamie Zawinski <jwz@jwz.org>
+/* xscreensaver, Copyright (c) 1999, 2000, 2003 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
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
  * documentation for any purpose is hereby granted without fee, provided that
@@ -43,19 +43,23 @@ get_gl_visual (Screen *screen)
 # define D GLX_DEPTH_SIZE
 # define I GLX_BUFFER_SIZE
 # define DB GLX_DOUBLEBUFFER
 # define D GLX_DEPTH_SIZE
 # define I GLX_BUFFER_SIZE
 # define DB GLX_DOUBLEBUFFER
+# define ST GLX_STENCIL_SIZE
 
   int attrs[][20] = {
 
   int attrs[][20] = {
-    { GLX_RGBA, R, 8, G, 8, B, 8, D, 8, DB, 0 }, /* rgb double */
-    { GLX_RGBA, R, 4, G, 4, B, 4, D, 4, DB, 0 },
-    { GLX_RGBA, R, 2, G, 2, B, 2, D, 2, DB, 0 },
-    { GLX_RGBA, R, 8, G, 8, B, 8, D, 8,     0 }, /* rgb single */
-    { GLX_RGBA, R, 4, G, 4, B, 4, D, 4,     0 },
-    { GLX_RGBA, R, 2, G, 2, B, 2, D, 2,     0 },
-    { I, 8,                       D, 8, DB, 0 }, /* cmap double */
-    { I, 4,                       D, 4, DB, 0 },
-    { I, 8,                       D, 8,     0 }, /* cmap single */
-    { I, 4,                       D, 4,     0 },
-    { GLX_RGBA, R, 1, G, 1, B, 1, D, 1,     0 }  /* monochrome */
+   { GLX_RGBA, R, 8, G, 8, B, 8, D, 8, DB, ST,1, 0 }, /* rgb double, stencil */
+   { GLX_RGBA, R, 4, G, 4, B, 4, D, 4, DB, ST,1, 0 },
+   { GLX_RGBA, R, 2, G, 2, B, 2, D, 2, DB, ST,1, 0 },
+   { GLX_RGBA, R, 8, G, 8, B, 8, D, 8, DB,       0 }, /* rgb double */
+   { GLX_RGBA, R, 4, G, 4, B, 4, D, 4, DB,       0 },
+   { GLX_RGBA, R, 2, G, 2, B, 2, D, 2, DB,       0 },
+   { GLX_RGBA, R, 8, G, 8, B, 8, D, 8,           0 }, /* rgb single */
+   { GLX_RGBA, R, 4, G, 4, B, 4, D, 4,           0 },
+   { GLX_RGBA, R, 2, G, 2, B, 2, D, 2,           0 },
+   { I, 8,                       D, 8, DB,       0 }, /* cmap double */
+   { I, 4,                       D, 4, DB,       0 },
+   { I, 8,                       D, 8,           0 }, /* cmap single */
+   { I, 4,                       D, 4,           0 },
+   { GLX_RGBA, R, 1, G, 1, B, 1, D, 1,           0 }  /* monochrome */
   };
 
   int i;
   };
 
   int i;
index 3d24943e0e9a3d960fa6264341999f6128712f3e..f12ea952857d3a84cc5e939814b9ee11acb74337 100644 (file)
@@ -1,6 +1,16 @@
 /* yarandom.c -- Yet Another Random Number Generator.
 /* yarandom.c -- Yet Another Random Number Generator.
+ * Copyright (c) 1997, 1998, 2003 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.
+ */
 
 
-   The unportable mess that is rand(), random(), drand48() and friends led me
+/* The unportable mess that is rand(), random(), drand48() and friends led me
    to ask Phil Karlton <karlton@netscape.com> what the Right Thing to Do was.
    He responded with this.  It is non-cryptographically secure, reasonably
    random (more so than anything that is in any C library), and very fast.
    to ask Phil Karlton <karlton@netscape.com> what the Right Thing to Do was.
    He responded with this.  It is non-cryptographically secure, reasonably
    random (more so than anything that is in any C library), and very fast.
index 14a287fa8c04ef432086bc3768ac8d2dde6ad0f7..3a4acbf0b07ddc69be58caa85c2cafe76e833654 100644 (file)
@@ -47,16 +47,16 @@ extern void ya_rand_init (unsigned int);
  /* Implement frand using GCC's statement-expression extension. */
 
 # define frand(f)                                                      \
  /* Implement frand using GCC's statement-expression extension. */
 
 # define frand(f)                                                      \
-  ({ double tmp = (((double) random()) /                               \
-                  (((double) ((unsigned int)~0)) / ((double) (f))));   \
+  ({ double tmp = ((((double) random()) * ((double) (f))) /            \
+                  ((double) ((unsigned int)~0)));                      \
      tmp < 0 ? (-tmp) : tmp; })
 
 #else /* not GCC2 - implement frand using a global variable.*/
 
 static double _frand_tmp_;
 # define frand(f)                                                      \
      tmp < 0 ? (-tmp) : tmp; })
 
 #else /* not GCC2 - implement frand using a global variable.*/
 
 static double _frand_tmp_;
 # define frand(f)                                                      \
-  (_frand_tmp_ = (((double) random()) /                                \
-                 (((double) ((unsigned int)~0)) / ((double) (f)))),    \
+  (_frand_tmp_ = ((((double) random()) * ((double) (f))) /             \
+                 ((double) ((unsigned int)~0))),                       \
    _frand_tmp_ < 0 ? (-_frand_tmp_) : _frand_tmp_)
 
 #endif /* not GCC2 */
    _frand_tmp_ < 0 ? (-_frand_tmp_) : _frand_tmp_)
 
 #endif /* not GCC2 */
index d3f623564f2ce87d0a74c4769f6b97504f603c50..00d401cbb96dc5e145a7ea473ecfebfe3e2557b2 100644 (file)
@@ -1,7 +1,7 @@
 Begin3
 Title:          xscreensaver
 Begin3
 Title:          xscreensaver
-Version:        4.07
-Entered-date:   03FEB03
+Version:        4.08
+Entered-date:   18FEB03
 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.
 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/
 Author:         jwz@jwz.org (Jamie Zawinski)
 Maintained-by:  jwz@jwz.org (Jamie Zawinski)
 Primary-site:   http://www.jwz.org/xscreensaver/
-                3242K xscreensaver-4.07.tar.gz
-                62K   xscreensaver.README
+                3283K xscreensaver-4.08.tar.gz
+                63K   xscreensaver.README
                 1K    xscreensaver.lsm
 Alternate-site: sunsite.unc.edu /pub/Linux/X11/screensavers/
                 1K    xscreensaver.lsm
 Alternate-site: sunsite.unc.edu /pub/Linux/X11/screensavers/
-                3242K xscreensaver-4.07.tar.gz
-                62K   xscreensaver.README
+                3283K xscreensaver-4.08.tar.gz
+                63K   xscreensaver.README
                 1K    xscreensaver.lsm
 Alternate-site: ftp.x.org /contrib/applications/
                 1K    xscreensaver.lsm
 Alternate-site: ftp.x.org /contrib/applications/
-                3242K xscreensaver-4.07.tar.gz
-                62K   xscreensaver.README
+                3283K xscreensaver-4.08.tar.gz
+                63K   xscreensaver.README
                 1K    xscreensaver.lsm
 Platforms:      Linux, Irix, SunOS, Solaris, HPUX, AIX, FreeBSD, NetBSD,
                 BSDI, SCO, OSF1, Ultrix, VMS.
                 1K    xscreensaver.lsm
 Platforms:      Linux, Irix, SunOS, Solaris, HPUX, AIX, FreeBSD, NetBSD,
                 BSDI, SCO, OSF1, Ultrix, VMS.
index ddf1aa15dd47f8d326766870d3d5a07e84d9aa14..549440e7238ef0629f48308cc1e2b458e71b45aa 100644 (file)
@@ -1,5 +1,5 @@
 %define        name            xscreensaver
 %define        name            xscreensaver
-%define        version         4.07
+%define        version         4.08
 %define        release         1
 %define        serial          1
 %define        x11_prefix      /usr/X11R6
 %define        release         1
 %define        serial          1
 %define        x11_prefix      /usr/X11R6