ftp://ftp.jp.xemacs.org/pub/NetBSD/packages/distfiles/xscreensaver-4.15.tar.gz
authorZygo Blaxell <zblaxell@hungrycats.org>
Mon, 2 Mar 2009 05:43:16 +0000 (00:43 -0500)
committerZygo Blaxell <zblaxell@faye.furryterror.org>
Fri, 8 Feb 2013 17:54:09 +0000 (12:54 -0500)
-rw-r--r-- 1 zblaxell zblaxell 4045811 Feb 26  2004 xscreensaver-4.15.tar.gz
3ce8f7d8a2f490daaa3a0943491a589f1a635529  xscreensaver-4.15.tar.gz

153 files changed:
README
config.h.in
configure
configure.in
driver/Makefile.in
driver/XScreenSaver.ad.in
driver/XScreenSaver_ad.h
driver/demo-Gtk-conf.c
driver/demo-Gtk.c
driver/passwd-helper.c [new file with mode: 0644]
driver/passwd-kerberos.c
driver/passwd.c
driver/pdf2jpeg.m
driver/screensaver-properties.desktop.in
driver/timers.c
driver/xscreensaver-command.man
driver/xscreensaver-demo.glade2
driver/xscreensaver-demo.man
driver/xscreensaver-getimage-desktop
driver/xscreensaver-getimage-file.man
driver/xscreensaver-getimage-video
driver/xscreensaver-getimage-video.man
driver/xscreensaver-getimage.c
driver/xscreensaver-getimage.man
driver/xscreensaver.c
driver/xscreensaver.kss.in
driver/xscreensaver.man
driver/xscreensaver.pam
hacks/Makefile.in
hacks/analogtv.c
hacks/analogtv.h
hacks/ant.c
hacks/apollonian.c
hacks/apple2-main.c
hacks/apple2.c
hacks/apple2.h
hacks/apple2.man
hacks/bsod.c
hacks/compile_axp.com
hacks/compile_decc.com
hacks/config/README
hacks/config/blinkbox.xml
hacks/config/blocktube.xml
hacks/config/electricsheep.xml
hacks/config/gleidescope.xml
hacks/config/glslideshow.xml
hacks/config/glsnake.xml
hacks/config/halo.xml
hacks/config/mirrorblob.xml
hacks/config/mismunch.xml [new file with mode: 0644]
hacks/config/molecule.xml
hacks/config/noof.xml [new file with mode: 0644]
hacks/config/pacman.xml [new file with mode: 0644]
hacks/config/phosphor.xml
hacks/config/pong.xml
hacks/config/wormhole.xml [new file with mode: 0644]
hacks/config/xanalogtv.xml
hacks/config/xearth.xml
hacks/config/xplanet.xml [new file with mode: 0644]
hacks/crystal.c
hacks/demon.c
hacks/drift.c
hacks/epicycle.c
hacks/euler2d.c
hacks/euler2d.tex [new file with mode: 0644]
hacks/galaxy.c
hacks/glx/Makefile.in
hacks/glx/atlantis.c
hacks/glx/atunnel.c
hacks/glx/blinkbox.c
hacks/glx/blinkbox.man
hacks/glx/blocktube.c
hacks/glx/blocktube.man
hacks/glx/bouncingcow.c
hacks/glx/boxed.c
hacks/glx/circuit.c
hacks/glx/cubenetic.c
hacks/glx/cubestorm.c
hacks/glx/dangerball.c
hacks/glx/endgame.c
hacks/glx/engine.c
hacks/glx/extrusion.c
hacks/glx/flipscreen3d.c
hacks/glx/flurry.c
hacks/glx/flyingtoasters.c
hacks/glx/gears.c
hacks/glx/gflux.c
hacks/glx/glblur.c
hacks/glx/glforestfire.c
hacks/glx/glknots.c
hacks/glx/glmatrix.c
hacks/glx/glplanet.c
hacks/glx/glslideshow.man
hacks/glx/glsnake.c
hacks/glx/gltext.c
hacks/glx/hypertorus.c
hacks/glx/jigglypuff.c
hacks/glx/klein.c
hacks/glx/lament.c
hacks/glx/lavalite.c
hacks/glx/menger.c
hacks/glx/mirrorblob.c
hacks/glx/moebius.c
hacks/glx/molecule.c
hacks/glx/molecule.man
hacks/glx/noof.c [new file with mode: 0644]
hacks/glx/noof.man [new file with mode: 0644]
hacks/glx/pipes.c
hacks/glx/pulsar.c
hacks/glx/queens.c
hacks/glx/rubik.c
hacks/glx/sballs.c
hacks/glx/sierpinski3d.c
hacks/glx/spheremonics.c
hacks/glx/starwars.c
hacks/glx/superquadrics.c
hacks/grav.c
hacks/hopalong.c
hacks/hyperball.c
hacks/hypercube.c
hacks/juggle.c
hacks/julia.c
hacks/lisa.c
hacks/loop.c
hacks/maze.c
hacks/mismunch.c [new file with mode: 0644]
hacks/mismunch.man [new file with mode: 0644]
hacks/pacman.c [new file with mode: 0644]
hacks/pacman.h [new file with mode: 0644]
hacks/pacman.man [new file with mode: 0644]
hacks/pacman_ai.h [new file with mode: 0644]
hacks/pacman_level.h [new file with mode: 0644]
hacks/penrose.c
hacks/phosphor.c
hacks/phosphor.man
hacks/polyominoes.c
hacks/pong.c
hacks/screenhack.c
hacks/vermiculate.c
hacks/vidwhacker
hacks/webcollage
hacks/wormhole.c [new file with mode: 0644]
hacks/wormhole.man [new file with mode: 0644]
hacks/xanalogtv.c
po/Makefile.in.in
po/POTFILES.in
po/fr.po
po/nl.po
setup.com
utils/grabclient.c
utils/version.h
xscreensaver.lsm
xscreensaver.spec

diff --git a/README b/README
index 036284795f75a2d4334ea1a0e45a2d1953da0ba2..44739a66d8a35509ce8739fcacf26af028420e54 100644 (file)
--- a/README
+++ b/README
@@ -76,6 +76,20 @@ the XScreenSaver FAQ about that: http://www.jwz.org/xscreensaver/faq.html
 
                               ============
 
+Changes since 4.14:   * New hacks, `wormhole', `mismunch', `noof', and
+                        `pacman'.
+                      * `phosphor' and `apple2' include vt100 emulators now:
+                        this means you can do "phosphor -program top", or
+                        can use either program as an xterm replacement:
+                        "apple2 -text -fast -program 'xemacs -nw'".
+                      * `analogtv' (and related) fill the screen better.
+                      * The '-gradient' option works in `atlantis' now.
+                      * Minor updates to `blinkbox', `queens', `endgame',
+                        `glmatrix', `mirrorblob', `blocktube', and `molecule'.
+                      * Integrated SuSE's "external passwd helper" support.
+                      * Marginally better /tmp handling in various programs.
+                      * Updated config defaults for xplanet 1.0.3.
+                      * Portability fixes.
 Changes since 4.13:   * New hacks, `fontglide', `apple2', `xanalogtv', `pong',
                         `gleidescope', `mirrorblob', and `blinkbox'.
                       * New version of `glsnake' (with many more models.)
index 463963e120fbd82cc7a62197d5a5b18a922f169e..d5688cbe771e35a6f88d4185c08bda62fda487b1 100644 (file)
  */
 #define FORTUNE_PROGRAM "fortune"
 
+/*  Set the name of the password helper program, if any
+ */
+#undef PASSWD_HELPER_PROGRAM
+
 
 
 /* *************************************************************************
 #undef HAVE_SETRLIMIT
 
 /* Define if you have the sbrk function.  */
-#define HAVE_SBRK 1
+#undef HAVE_SBRK
+
+/* Define if you have the forkpty function.  */
+#undef HAVE_FORKPTY
 
 /* Define if you have the <unistd.h> header file.  */
 #undef HAVE_UNISTD_H
index e0126736f83a85d49c20ce59f5249864f2af55eb..23b3ddbd7f86b76ccd0930001ed6c98b7fc3a4c5 100755 (executable)
--- a/configure
+++ b/configure
@@ -308,7 +308,7 @@ ac_includes_default="\
 # include <unistd.h>
 #endif"
 
-ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS build build_cpu build_vendor build_os host host_cpu host_vendor host_os CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT CPP INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA SET_MAKE EGREP PERL X_CFLAGS X_PRE_LIBS X_LIBS X_EXTRA_LIBS INTLTOOL_DESKTOP_RULE INTLTOOL_DIRECTORY_RULE INTLTOOL_KEYS_RULE INTLTOOL_OAF_RULE INTLTOOL_PONG_RULE INTLTOOL_SERVER_RULE INTLTOOL_SHEET_RULE INTLTOOL_SOUNDLIST_RULE INTLTOOL_UI_RULE INTLTOOL_XML_RULE INTLTOOL_CAVES_RULE INTLTOOL_EXTRACT INTLTOOL_MERGE INTLTOOL_UPDATE INTLTOOL_PERL GETTEXT_PACKAGE RANLIB ac_ct_RANLIB ALLOCA USE_NLS MSGFMT GMSGFMT XGETTEXT CATALOGS CATOBJEXT DATADIRNAME GMOFILES INSTOBJEXT INTLDEPS INTLLIBS INTLOBJS POFILES POSUB MKINSTALLDIRS pkg_config glib_config gtk_config gnome_config have_gnome_help xml_config gdk_pixbuf_config fortune_tmp INCLUDES PREFERRED_DEMO_PROGRAM ALL_DEMO_PROGRAMS SAVER_LIBS MOTIF_LIBS GTK_LIBS XML_LIBS JPEG_LIBS HACK_LIBS XPM_LIBS GL_LIBS GLE_LIBS XDPMS_LIBS PASSWD_LIBS INSTALL_SETUID SETUID_HACKS INSTALL_DIRS NEED_SETUID INSTALL_PAM OBJCC EXES_OSX SCRIPTS_OSX MEN_OSX PASSWD_SRCS PASSWD_OBJS XMU_SRCS XMU_OBJS XMU_LIBS SAVER_GL_SRCS SAVER_GL_OBJS SAVER_GL_LIBS LOCK_SRCS LOCK_OBJS JPEG_EXES GL_EXES GL_UTIL_EXES GL_MEN GL_KLUDGE GLE_EXES GLE_KLUDGE GNOMEHELP_Y GNOMEHELP_N HACKDIR GNOME_DATADIR GLADE_DATADIR PO_DATADIR GNOME_PANELDIR HACK_CONF_DIR GTK_EXTRA_OBJS APPDEFAULTS DEPEND DEPEND_FLAGS DEPEND_DEFINES LIBOBJS LTLIBOBJS'
+ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS build build_cpu build_vendor build_os host host_cpu host_vendor host_os CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT CPP INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA SET_MAKE EGREP PERL X_CFLAGS X_PRE_LIBS X_LIBS X_EXTRA_LIBS INTLTOOL_DESKTOP_RULE INTLTOOL_DIRECTORY_RULE INTLTOOL_KEYS_RULE INTLTOOL_OAF_RULE INTLTOOL_PONG_RULE INTLTOOL_SERVER_RULE INTLTOOL_SHEET_RULE INTLTOOL_SOUNDLIST_RULE INTLTOOL_UI_RULE INTLTOOL_XML_RULE INTLTOOL_CAVES_RULE INTLTOOL_EXTRACT INTLTOOL_MERGE INTLTOOL_UPDATE INTLTOOL_PERL GETTEXT_PACKAGE RANLIB ac_ct_RANLIB ALLOCA USE_NLS MSGFMT GMSGFMT XGETTEXT CATALOGS CATOBJEXT DATADIRNAME GMOFILES INSTOBJEXT INTLDEPS INTLLIBS INTLOBJS POFILES POSUB MKINSTALLDIRS pkg_config glib_config gtk_config gnome_config have_gnome_help xml_config gdk_pixbuf_config fortune_tmp INCLUDES PREFERRED_DEMO_PROGRAM ALL_DEMO_PROGRAMS SAVER_LIBS MOTIF_LIBS GTK_LIBS XML_LIBS JPEG_LIBS HACK_LIBS XPM_LIBS PTY_LIBS GL_LIBS GLE_LIBS XDPMS_LIBS PASSWD_LIBS INSTALL_SETUID SETUID_HACKS INSTALL_DIRS NEED_SETUID INSTALL_PAM OBJCC EXES_OSX SCRIPTS_OSX MEN_OSX PASSWD_SRCS PASSWD_OBJS XMU_SRCS XMU_OBJS XMU_LIBS SAVER_GL_SRCS SAVER_GL_OBJS SAVER_GL_LIBS LOCK_SRCS LOCK_OBJS JPEG_EXES GL_EXES GL_UTIL_EXES GL_MEN GL_KLUDGE GLE_EXES GLE_KLUDGE GNOMEHELP_Y GNOMEHELP_N HACKDIR GNOME_DATADIR GLADE_DATADIR PO_DATADIR GNOME_PANELDIR HACK_CONF_DIR GTK_EXTRA_OBJS APPDEFAULTS DEPEND DEPEND_FLAGS DEPEND_DEFINES LIBOBJS LTLIBOBJS'
 ac_subst_files=''
 
 # Initialize some variables set by options.
@@ -889,6 +889,8 @@ Screen blanking and idle-detection options:
   --with-pam              Include support for PAM (Pluggable Auth Modules.)
   --with-kerberos         Include support for Kerberos authentication.
   --with-shadow           Include support for shadow password authentication.
+  --with-passwd-helper    Include support for an external password
+                          verification helper program.
 
 User interface options:
 
@@ -4458,7 +4460,6 @@ done
 
 
 
-
 for ac_func in sigaction syslog realpath setrlimit
 do
 as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
@@ -8585,6 +8586,7 @@ fi
    sed -e "/^#/d" -e "/^\$/d" -e "s,.*,        $posrcprefix& \\\\," -e "\$s/\(.*\) \\\\/\1/" \
        < $srcdir/po/POTFILES.in > po/POTFILES
 
+MKINSTALLDIRS="$INSTALL_DIRS"
 
 
 ###############################################################################
@@ -10175,9 +10177,9 @@ fi
   # note: $X_LIBS includes $x_libraries
   LDFLAGS="$LDFLAGS $X_LIBS $X_EXTRA_LIBS"
 
-  echo "$as_me:$LINENO: checking for XineramaQueryExtension in -lXext" >&5
-echo $ECHO_N "checking for XineramaQueryExtension in -lXext... $ECHO_C" >&6
-if test "${ac_cv_lib_Xext_XineramaQueryExtension+set}" = set; then
+  echo "$as_me:$LINENO: checking for XineramaQueryScreens in -lXext" >&5
+echo $ECHO_N "checking for XineramaQueryScreens in -lXext... $ECHO_C" >&6
+if test "${ac_cv_lib_Xext_XineramaQueryScreens+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   ac_check_lib_save_LIBS=$LIBS
@@ -10196,11 +10198,11 @@ 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 XineramaQueryExtension ();
+char XineramaQueryScreens ();
 int
 main ()
 {
-XineramaQueryExtension ();
+XineramaQueryScreens ();
   ;
   return 0;
 }
@@ -10217,19 +10219,19 @@ if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
-  ac_cv_lib_Xext_XineramaQueryExtension=yes
+  ac_cv_lib_Xext_XineramaQueryScreens=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_cv_lib_Xext_XineramaQueryExtension=no
+ac_cv_lib_Xext_XineramaQueryScreens=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_Xext_XineramaQueryExtension" >&5
-echo "${ECHO_T}$ac_cv_lib_Xext_XineramaQueryExtension" >&6
-if test $ac_cv_lib_Xext_XineramaQueryExtension = yes; then
+echo "$as_me:$LINENO: result: $ac_cv_lib_Xext_XineramaQueryScreens" >&5
+echo "${ECHO_T}$ac_cv_lib_Xext_XineramaQueryScreens" >&6
+if test $ac_cv_lib_Xext_XineramaQueryScreens = yes; then
   have_xinerama=yes
 else
   true
@@ -10259,9 +10261,9 @@ fi
   # note: $X_LIBS includes $x_libraries
   LDFLAGS="$LDFLAGS $X_LIBS $X_EXTRA_LIBS"
 
-  echo "$as_me:$LINENO: checking for XineramaQueryExtension in -lXinerama" >&5
-echo $ECHO_N "checking for XineramaQueryExtension in -lXinerama... $ECHO_C" >&6
-if test "${ac_cv_lib_Xinerama_XineramaQueryExtension+set}" = set; then
+  echo "$as_me:$LINENO: checking for XineramaQueryScreens in -lXinerama" >&5
+echo $ECHO_N "checking for XineramaQueryScreens in -lXinerama... $ECHO_C" >&6
+if test "${ac_cv_lib_Xinerama_XineramaQueryScreens+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   ac_check_lib_save_LIBS=$LIBS
@@ -10280,11 +10282,11 @@ 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 XineramaQueryExtension ();
+char XineramaQueryScreens ();
 int
 main ()
 {
-XineramaQueryExtension ();
+XineramaQueryScreens ();
   ;
   return 0;
 }
@@ -10301,19 +10303,19 @@ if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
-  ac_cv_lib_Xinerama_XineramaQueryExtension=yes
+  ac_cv_lib_Xinerama_XineramaQueryScreens=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_cv_lib_Xinerama_XineramaQueryExtension=no
+ac_cv_lib_Xinerama_XineramaQueryScreens=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_Xinerama_XineramaQueryExtension" >&5
-echo "${ECHO_T}$ac_cv_lib_Xinerama_XineramaQueryExtension" >&6
-if test $ac_cv_lib_Xinerama_XineramaQueryExtension = yes; then
+echo "$as_me:$LINENO: result: $ac_cv_lib_Xinerama_XineramaQueryScreens" >&5
+echo "${ECHO_T}$ac_cv_lib_Xinerama_XineramaQueryScreens" >&6
+if test $ac_cv_lib_Xinerama_XineramaQueryScreens = yes; then
   have_xinerama=yes; SAVER_LIBS="$SAVER_LIBS -lXinerama"
 else
   true
@@ -11342,6 +11344,127 @@ if test $ac_cv_lib_dl_dlopen = yes; then
 fi
 
 
+    # On Linux, sigtimedwait() is in libc; on Solaris, it's in librt.
+    have_timedwait=no
+    echo "$as_me:$LINENO: checking for sigtimedwait in -lc" >&5
+echo $ECHO_N "checking for sigtimedwait in -lc... $ECHO_C" >&6
+if test "${ac_cv_lib_c_sigtimedwait+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lc  $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end 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 sigtimedwait ();
+int
+main ()
+{
+sigtimedwait ();
+  ;
+  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_c_sigtimedwait=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_lib_c_sigtimedwait=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_c_sigtimedwait" >&5
+echo "${ECHO_T}$ac_cv_lib_c_sigtimedwait" >&6
+if test $ac_cv_lib_c_sigtimedwait = yes; then
+  have_timedwait=yes
+fi
+
+    if test "$have_timedwait" = no ; then
+      echo "$as_me:$LINENO: checking for sigtimedwait in -lrt" >&5
+echo $ECHO_N "checking for sigtimedwait in -lrt... $ECHO_C" >&6
+if test "${ac_cv_lib_rt_sigtimedwait+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lrt  $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end 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 sigtimedwait ();
+int
+main ()
+{
+sigtimedwait ();
+  ;
+  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_rt_sigtimedwait=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_lib_rt_sigtimedwait=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_rt_sigtimedwait" >&5
+echo "${ECHO_T}$ac_cv_lib_rt_sigtimedwait" >&6
+if test $ac_cv_lib_rt_sigtimedwait = yes; then
+  PASSWD_LIBS="${PASSWD_LIBS} -lrt"
+fi
+
+    fi
+
     echo "$as_me:$LINENO: checking how to call pam_strerror" >&5
 echo $ECHO_N "checking how to call pam_strerror... $ECHO_C" >&6
     if test "${ac_cv_pam_strerror_args+set}" = set; then
@@ -12831,6 +12954,51 @@ _ACEOF
 fi
 
 
+###############################################################################
+#
+#       Check for external password helper
+#      On SuSE, instead of having xscreensaver be a setuid program, they
+#      fork an external program that takes the password on stdin, and
+#      returns true if that password is a valid one.  Then only that
+#      smaller program needs to be setuid.
+#
+#       (Note that this external program is not a GUI: the GUI is still
+#      all in xscreensaver itself; the external program just does auth.)
+#
+###############################################################################
+
+have_passwd_helper=no
+with_passwd_helper_req=unspecified
+
+
+# Check whether --with-passwd-helper or --without-passwd-helper was given.
+if test "${with_passwd_helper+set}" = set; then
+  withval="$with_passwd_helper"
+  with_passwd_helper="$withval"; with_passwd_helper_req="$withval"
+else
+  with_passwd_helper=no
+fi;
+# no HANDLE_X_PATH_ARG for this one
+
+if test "$enable_locking" = no ; then
+  with_passwd_helper_req=no
+  with_passwd_helper=no
+fi
+
+case "$with_passwd_helper" in
+  ""|no) : ;;
+  /*)
+    cat >>confdefs.h <<_ACEOF
+#define PASSWD_HELPER_PROGRAM "$with_passwd_helper"
+_ACEOF
+
+    have_passwd_helper=yes;;
+  *)
+    echo "error: --with-passwd-helper needs full pathname of helper (not '$with_passwd_helper')." >&2
+    exit 1
+esac
+
+
 ###############################################################################
 #
 #       Check for -lXm.
@@ -15392,7 +15560,7 @@ if test "${ac_cv_mesagl_version_string+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 15401 "configure"
+#line 15569 "configure"
 #include "confdefs.h"
 #include <GL/gl.h>
 #ifndef MESA_MAJOR_VERSION
 fi
 
 
+###############################################################################
+#
+#       Check for pty support for 'phosphor'
+#
+###############################################################################
+
+PTY_LIBS=
+have_ptys=no
+
+  ac_save_CPPFLAGS="$CPPFLAGS"
+  if test \! -z "$includedir" ; then
+    CPPFLAGS="$CPPFLAGS -I$includedir"
+  fi
+  CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+  if test "${ac_cv_header_pty_h+set}" = set; then
+  echo "$as_me:$LINENO: checking for pty.h" >&5
+echo $ECHO_N "checking for pty.h... $ECHO_C" >&6
+if test "${ac_cv_header_pty_h+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+fi
+echo "$as_me:$LINENO: result: $ac_cv_header_pty_h" >&5
+echo "${ECHO_T}$ac_cv_header_pty_h" >&6
+else
+  # Is the header compilable?
+echo "$as_me:$LINENO: checking pty.h usability" >&5
+echo $ECHO_N "checking pty.h usability... $ECHO_C" >&6
+cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+#include <pty.h>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+         { ac_try='test -s conftest.$ac_objext'
+  { (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_header_compiler=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_header_compiler=no
+fi
+rm -f conftest.$ac_objext conftest.$ac_ext
+echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+echo "${ECHO_T}$ac_header_compiler" >&6
+
+# Is the header present?
+echo "$as_me:$LINENO: checking pty.h presence" >&5
+echo $ECHO_N "checking pty.h presence... $ECHO_C" >&6
+cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <pty.h>
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_c_preproc_warn_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  ac_header_preproc=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  ac_header_preproc=no
+fi
+rm -f conftest.err conftest.$ac_ext
+echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+echo "${ECHO_T}$ac_header_preproc" >&6
+
+# So?  What about this header?
+case $ac_header_compiler:$ac_header_preproc in
+  yes:no )
+    { echo "$as_me:$LINENO: WARNING: pty.h: accepted by the compiler, rejected by the preprocessor!" >&5
+echo "$as_me: WARNING: pty.h: accepted by the compiler, rejected by the preprocessor!" >&2;}
+    { echo "$as_me:$LINENO: WARNING: pty.h: proceeding with the preprocessor's result" >&5
+echo "$as_me: WARNING: pty.h: proceeding with the preprocessor's result" >&2;}
+    (
+      cat <<\_ASBOX
+## ------------------------------------ ##
+## Report this to bug-autoconf@gnu.org. ##
+## ------------------------------------ ##
+_ASBOX
+    ) |
+      sed "s/^/$as_me: WARNING:     /" >&2
+    ;;
+  no:yes )
+    { echo "$as_me:$LINENO: WARNING: pty.h: present but cannot be compiled" >&5
+echo "$as_me: WARNING: pty.h: present but cannot be compiled" >&2;}
+    { echo "$as_me:$LINENO: WARNING: pty.h: check for missing prerequisite headers?" >&5
+echo "$as_me: WARNING: pty.h: check for missing prerequisite headers?" >&2;}
+    { echo "$as_me:$LINENO: WARNING: pty.h: proceeding with the preprocessor's result" >&5
+echo "$as_me: WARNING: pty.h: proceeding with the preprocessor's result" >&2;}
+    (
+      cat <<\_ASBOX
+## ------------------------------------ ##
+## Report this to bug-autoconf@gnu.org. ##
+## ------------------------------------ ##
+_ASBOX
+    ) |
+      sed "s/^/$as_me: WARNING:     /" >&2
+    ;;
+esac
+echo "$as_me:$LINENO: checking for pty.h" >&5
+echo $ECHO_N "checking for pty.h... $ECHO_C" >&6
+if test "${ac_cv_header_pty_h+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_cv_header_pty_h=$ac_header_preproc
+fi
+echo "$as_me:$LINENO: result: $ac_cv_header_pty_h" >&5
+echo "${ECHO_T}$ac_cv_header_pty_h" >&6
+
+fi
+if test $ac_cv_header_pty_h = yes; then
+  have_ptys=yes
+fi
+
+
+  CPPFLAGS="$ac_save_CPPFLAGS"
+if test "$have_ptys" = yes; then
+  # we have the header, now check for the library
+  have_ptys=no
+
+  ac_save_CPPFLAGS="$CPPFLAGS"
+  ac_save_LDFLAGS="$LDFLAGS"
+#  ac_save_LIBS="$LIBS"
+
+  if test \! -z "$includedir" ; then
+    CPPFLAGS="$CPPFLAGS -I$includedir"
+  fi
+  # note: $X_CFLAGS includes $x_includes
+  CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+
+  if test \! -z "$libdir" ; then
+    LDFLAGS="$LDFLAGS -L$libdir"
+  fi
+  # note: $X_LIBS includes $x_libraries
+  LDFLAGS="$LDFLAGS $X_LIBS $X_EXTRA_LIBS"
+
+  echo "$as_me:$LINENO: checking for forkpty in -lutil" >&5
+echo $ECHO_N "checking for forkpty in -lutil... $ECHO_C" >&6
+if test "${ac_cv_lib_util_forkpty+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lutil  $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end 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 forkpty ();
+int
+main ()
+{
+forkpty ();
+  ;
+  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_util_forkpty=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_lib_util_forkpty=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_util_forkpty" >&5
+echo "${ECHO_T}$ac_cv_lib_util_forkpty" >&6
+if test $ac_cv_lib_util_forkpty = yes; then
+  have_ptys=yes
+                  PTY_LIBS="-lutil"
+                  cat >>confdefs.h <<\_ACEOF
+#define HAVE_FORKPTY 1
+_ACEOF
+
+fi
+
+  CPPFLAGS="$ac_save_CPPFLAGS"
+  LDFLAGS="$ac_save_LDFLAGS"
+#  LIBS="$ac_save_LIBS"
+
+fi
+
+
 ###############################################################################
 #
 #       Check for the XSHM server extension.
@@ -18529,6 +18936,10 @@ if test "$have_pam" = yes; then
   PASSWD_SRCS="$PASSWD_SRCS \$(PAM_SRCS)"
   PASSWD_OBJS="$PASSWD_OBJS \$(PAM_OBJS)"
   INSTALL_PAM="install-pam"
+fi
+if test "$have_passwd_helper" = yes; then
+  PASSWD_SRCS="$PASSWD_SRCS \$(PWHELPER_SRCS)"
+  PASSWD_OBJS="$PASSWD_OBJS \$(PWHELPER_OBJS)"
 fi
   PASSWD_SRCS="$PASSWD_SRCS \$(PWENT_SRCS)"
   PASSWD_OBJS="$PASSWD_OBJS \$(PWENT_OBJS)"
@@ -18748,6 +19159,7 @@ INCLUDES=`echo "$INCLUDES" | sed 's@ -I${prefix}/include@@g;'`
 
 
 
+
 
 
 APPDEFAULTS=$ac_x_app_defaults
@@ -19475,6 +19887,7 @@ s,@XML_LIBS@,$XML_LIBS,;t t
 s,@JPEG_LIBS@,$JPEG_LIBS,;t t
 s,@HACK_LIBS@,$HACK_LIBS,;t t
 s,@XPM_LIBS@,$XPM_LIBS,;t t
+s,@PTY_LIBS@,$PTY_LIBS,;t t
 s,@GL_LIBS@,$GL_LIBS,;t t
 s,@GLE_LIBS@,$GLE_LIBS,;t t
 s,@XDPMS_LIBS@,$XDPMS_LIBS,;t t
index 8397156d7df721751e7d875ea2236f4ed0705b2d..e6d3cdc7232c70e085d2215302ef4d0ff22b3a0b 100644 (file)
@@ -830,7 +830,6 @@ AC_HEADER_SYS_WAIT
 AC_HEADER_DIRENT
 AC_GETTIMEOFDAY_ARGS
 AC_CHECK_FUNCS(select fcntl uname nice setpriority getcwd getwd putenv sbrk)
-
 AC_CHECK_FUNCS(sigaction syslog realpath setrlimit)
 AC_CHECK_ICMP
 AC_CHECK_ICMPHDR
@@ -877,6 +876,7 @@ AC_SUBST(GETTEXT_PACKAGE)
 
 ALL_LINGUAS="ca da de es et fi fr hu it ja ko nl no pl pt pt_BR ru sk sv vi wa zh_CN zh_TW"
 AM_GLIB_GNU_GETTEXT
+MKINSTALLDIRS="$INSTALL_DIRS"
 
 
 ###############################################################################
@@ -1259,12 +1259,12 @@ if test "$with_xinerama" = yes; then
 
     # first look in -lXext
     have_xinerama=no
-    AC_CHECK_X_LIB(Xext, XineramaQueryExtension, [have_xinerama=yes], [true],
+    AC_CHECK_X_LIB(Xext, XineramaQueryScreens, [have_xinerama=yes], [true],
                   -lXext -lX11)
 
     # if that failed, look in -lXinerama (this is where it is in XFree86 4.1.)
     if test "$have_xinerama" = no; then
-      AC_CHECK_X_LIB(Xinerama, XineramaQueryExtension,
+      AC_CHECK_X_LIB(Xinerama, XineramaQueryScreens,
                      [have_xinerama=yes; SAVER_LIBS="$SAVER_LIBS -lXinerama"],
                      [true], -lXext -lX11)
     fi
@@ -1564,6 +1564,13 @@ if test "$enable_locking" = yes -a "$with_pam" = yes; then
     # those are in libc.  On Linux and Solaris, they're in libdl.
     AC_CHECK_LIB(dl, dlopen, [PASSWD_LIBS="${PASSWD_LIBS} -ldl"])
 
+    # On Linux, sigtimedwait() is in libc; on Solaris, it's in librt.
+    have_timedwait=no
+    AC_CHECK_LIB(c, sigtimedwait, [have_timedwait=yes])
+    if test "$have_timedwait" = no ; then
+      AC_CHECK_LIB(rt, sigtimedwait, [PASSWD_LIBS="${PASSWD_LIBS} -lrt"])
+    fi
+
     AC_MSG_CHECKING(how to call pam_strerror)
     AC_CACHE_VAL(ac_cv_pam_strerror_args,
      [AC_TRY_COMPILE([#include <stdio.h>
@@ -1889,6 +1896,44 @@ elif test "$have_shadow" = yes ; then
 fi
 
 
+###############################################################################
+#
+#       Check for external password helper
+#      On SuSE, instead of having xscreensaver be a setuid program, they
+#      fork an external program that takes the password on stdin, and
+#      returns true if that password is a valid one.  Then only that
+#      smaller program needs to be setuid.
+#
+#       (Note that this external program is not a GUI: the GUI is still
+#      all in xscreensaver itself; the external program just does auth.)
+#
+###############################################################################
+
+have_passwd_helper=no
+with_passwd_helper_req=unspecified
+
+AC_ARG_WITH(passwd-helper,
+[  --with-passwd-helper    Include support for an external password
+                          verification helper program.],
+  [with_passwd_helper="$withval"; with_passwd_helper_req="$withval"],[with_passwd_helper=no])
+# no HANDLE_X_PATH_ARG for this one
+
+if test "$enable_locking" = no ; then
+  with_passwd_helper_req=no
+  with_passwd_helper=no
+fi
+
+case "$with_passwd_helper" in
+  ""|no) : ;;
+  /*)
+    AC_DEFINE_UNQUOTED(PASSWD_HELPER_PROGRAM, "$with_passwd_helper")
+    have_passwd_helper=yes;;
+  *)
+    echo "error: --with-passwd-helper needs full pathname of helper (not '$with_passwd_helper')." >&2
+    exit 1
+esac
+
+
 ###############################################################################
 #
 #       Check for -lXm.
@@ -3139,6 +3184,25 @@ if test "$with_jpeg" = yes; then
 fi
 
 
+###############################################################################
+#
+#       Check for pty support for 'phosphor'
+#
+###############################################################################
+
+PTY_LIBS=
+have_ptys=no
+AC_CHECK_X_HEADER(pty.h, [have_ptys=yes])
+if test "$have_ptys" = yes; then
+  # we have the header, now check for the library
+  have_ptys=no
+  AC_CHECK_X_LIB(util, forkpty,
+                 [have_ptys=yes
+                  PTY_LIBS="-lutil"
+                  AC_DEFINE(HAVE_FORKPTY)])
+fi
+
+
 ###############################################################################
 #
 #       Check for the XSHM server extension.
@@ -3416,6 +3480,10 @@ if test "$have_pam" = yes; then
   PASSWD_SRCS="$PASSWD_SRCS \$(PAM_SRCS)"
   PASSWD_OBJS="$PASSWD_OBJS \$(PAM_OBJS)"
   INSTALL_PAM="install-pam"
+fi
+if test "$have_passwd_helper" = yes; then
+  PASSWD_SRCS="$PASSWD_SRCS \$(PWHELPER_SRCS)"
+  PASSWD_OBJS="$PASSWD_OBJS \$(PWHELPER_OBJS)"
 fi
   PASSWD_SRCS="$PASSWD_SRCS \$(PWENT_SRCS)"
   PASSWD_OBJS="$PASSWD_OBJS \$(PWENT_OBJS)"
@@ -3593,6 +3661,7 @@ AC_SUBST(XML_LIBS)
 AC_SUBST(JPEG_LIBS)
 AC_SUBST(HACK_LIBS)
 AC_SUBST(XPM_LIBS)
+AC_SUBST(PTY_LIBS)
 AC_SUBST(GL_LIBS)
 AC_SUBST(GLE_LIBS)
 AC_SUBST(XDPMS_LIBS)
index b7d308280470f7ef75405eee9210210ad760c0b5..d10f3d3eb1d9ff48cf3bf980b1be633ddde5f0c0 100644 (file)
@@ -111,6 +111,9 @@ KERBEROS_OBJS       = passwd-kerberos.o
 PAM_SRCS       = passwd-pam.c
 PAM_OBJS       = passwd-pam.o
 
+PWHELPER_SRCS  = passwd-helper.c
+PWHELPER_OBJS  = passwd-helper.o
+
 LOCK_SRCS_1    = lock.c passwd.c
 LOCK_OBJS_1    = lock.o passwd.o
 NOLOCK_SRCS_1  = lock.c
@@ -240,7 +243,7 @@ VMSFILES    = compile_axp.com compile_decc.com link_axp.com link_decc.com \
                  vms_axp.opt vms_axp_12.opt vms_decc.opt vms_decc_12.opt
 
 TARFILES       = $(EXTRAS) $(VMSFILES) $(SAVER_SRCS_1) \
-                 $(MOTIF_SRCS) $(GTK_SRCS) $(PWENT_SRCS) \
+                 $(MOTIF_SRCS) $(GTK_SRCS) $(PWENT_SRCS) $(PWHELPER_SRCS) \
                  $(KERBEROS_SRCS) $(PAM_SRCS) $(LOCK_SRCS_1) $(DEMO_SRCS_1) \
                  $(CMD_SRCS) $(GETIMG_SRCS_1) $(PDF2JPEG_SRCS) $(HDRS) \
                  $(SCRIPTS_1) $(SCRIPTS_OSX) $(MEN_1) $(MEN_OSX) \
index fde6eeec352fa3f90b6ba14e37aa826a1c59aa13..fe738b08e07f8765c550765dc21a1082e6baad0a 100644 (file)
@@ -4,8 +4,8 @@
 !            a screen saver and locker for the X window system
 !                            by Jamie Zawinski
 !
-!                              version 4.14
-!                              25-Oct-2003
+!                              version 4.15
+!                              26-Feb-2004
 !
 ! See "man xscreensaver" for more info.  The latest version is always
 ! available at http://www.jwz.org/xscreensaver/
 
 
 ! Turning on "installColormap" on 8-bit systems interacts erratically with
-! twm and tvtwm, but seems to work fine with mwm and olwm.  Try it and see.
-! If your screen turns some color other than black, the window manager is
-! buggy, and you need to set this resource to False (or get a WM that works.)
+! certain jurassic window managers.  If your screen turns some color other
+! than black, the window manager is buggy, and you need to set this resource
+! to false.  Or switch WMs.  Or join the 21st century and get a 24-bit
+! graphics card.
 !
 *installColormap:      True
 
 
-! Any program which can draw on the root window will work as a screensaver.
-! The following resource enumerates them.
+! This is the list of installed screen saver modes.  See "man xscreensaver"
+! for the syntax used here.
 !
-! Programs are separated by newlines (specified in resource files with \n).
-! Lines may be continued with a lone \ at the end of the line.
+! If you want to disable a screensaver, DO NOT remove it from this list:
+! instead, mark it as inactive by placing a "-" at the beginning of the line.
 !
-! Each line is an `sh' command.
-!
-! If the first (non-blank) character on the line is "-", then that means
-! that this command is disabled: it's still in the list, but it won't ever
-! be used.  (This is just to make it easy to disable and then re-enable 
-! them later.)
-!
-! If the first word on the line is the name of a visual followed by a
-! colon, then that visual will be used for the program, if it is available.
-! If no such visual is available, then the program will be skipped.  In
-! this way, you can specify that you want certain programs to run only
-! on color screens, and others only on mono screens, by making use of the
-! magic visual names "color" and "mono".  Likewise, if some hacks prefer
-! colormaps, but others prefer 24-bit windows, that also can be arranged
-! (in this case, by using "PseudoColor:" versus "TrueColor:".)
-!
-! Some of the screenhacks are written using OpenGL.  OpenGL programs are
-! a bit different than normal X programs, in that they prefer visuals that
-! are *half* as deep as the screen.  You can tell xscreensaver to select a
-! good visual for a GL program by using the magic visual name "GL".
-!
-! All programs must be launched in such a way that they draw on the root
-! window; they should not be spawned in the background with "&".  If shell
-! metacharacters are used, they must be understandable to `sh', not `csh'
-! (the $SHELL variable is not consulted, for unfortunate but good reasons.)
-!
-! Be sure to check out Demo Mode: run the `xscreensaver-demo' program to
-! edit the current list of programs interactively, try out the various modes,
-! and change other parameters.  See the man page for details.
+! You can use the `xscreensaver-demo' program to edit the current list of
+! screen savers interactively.
 !
 *programs:                                                                   \
                 "Qix (solid)"  qix -root -solid -segments 100              \n\
                                starfish -root                              \n\
             "Starfish (blob)"  starfish -root -blob                        \n\
                                munch -root                                 \n\
+                               mismunch -root                              \n\
                                fadeplot -root                              \n\
                                coral -root -delay 0                        \n\
                                mountain -root                              \n\
                                apple2 -root                                \n\
                                 bubbles -root                              \n\
                                pong -root                                  \n\
+                               wormhole -root                              \n\
+                               pacman -root                                \n\
 - default-n:                   webcollage -root                            \n\
 - default-n:  "WebCollage (whacked)"                                         \
                                webcollage -root -filter                      \
 @GL_KLUDGE@ GL:                        flipscreen3d -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:        "GLForestFire"          glforestfire -root                  \n\
+-         GL:  "GLForestFire (rain)"   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:            "MirrorBlob (color only)"                                 \
                                 mirrorblob -root -colour -no-texture       \n\
 @GL_KLUDGE@ GL:                        blinkbox -root                              \n\
+@GL_KLUDGE@ GL:                        noof -root                                  \n\
                                                                              \
 -                              xdaliclock -root -builtin3 -cycle           \n\
 - default-n:                   xearth -nofork -nostars -ncolors 50           \
                                  -night 3 -wait 0 -timewarp 400.0 -pos       \
                                  sunrel/38/-30                             \n\
--                              xplanetbg -xscreensaver -moonside             \
-                                  -markerfile earth -wait 1 -timewarp 400   \n\
+-                              xplanet -vroot -wait 1 -timewarp 90000        \
+                                  -label -origin moon                      \n\
 -                              xmountains -b -M -Z 0 -r 1                  \n\
 -      "XMountains (top)"      xmountains -b -M -Z 0 -r 1 -m               \n\
 -                               xaos -root -autopilot -nogui -delay 10000     \
 -         GL:                  fireflies -root                             \n
 
 
-! To display a randomized slideshow of images, you can do something like this:
-!
-!    default-n:  "Slideshow"   xv -root -rmode 5 -random -viewonly           \
-!                                -wloop -wait 30 $HOME/bitmaps/*.jpg       \n\
-!
-! Recipes for using other slideshow programs can be found in the
-! XScreenSaver FAQ: http://www.jwz.org/xscreensaver/faq.html
-!
-! Note that we've used "default-n" as the visual name, rather than just
-! "default": this means "default visual, no install", that is, it's like
-! specifying the command-line arguments "-visual default -no-install".
-! This is necessary because, when XV or XLI arerunning in "-root" mode, they
-! always assume that the default visual and colormap are being used, rather
-! than  examining the window it is drawing on to see what visual and colormap
-! it has.  If we didn't force the default visual to be used, we would get an
-! X error.  If we didn't force the default colormap to be installed, the
-! colors would be all wrong.  "default-i" may also be used as a visual name
-! (meaning, "-visual default -install") but you probably won't ever need
-! to use that.
-
-
 
 !=============================================================================
 !
@@ -459,7 +416,7 @@ XScreenSaver.bourneShell:           /bin/sh
 *passwd.thermometer.width:     8
 
 *splash.heading.label:         XScreenSaver %s
-*splash.body.label:            Copyright © 1991-2003 by
+*splash.body.label:            Copyright © 1991-2004 by
 *splash.body2.label:           Jamie Zawinski <jwz@jwz.org>
 *splash.demo.label:            Settings
 *splash.help.label:            Help
@@ -633,6 +590,7 @@ XScreenSaver*doc.fontList:       *-helvetica-medium-r-*-*-*-100-*-*-*-iso8859-1
 *hacks.sballs.name:         SBalls
 *hacks.xdaliclock.name:     XDaliClock
 *hacks.xplanetbg.name:      XPlanet
+*hacks.xplanet.name:        XPlanet
 *hacks.xaos.name:           XaoS
 *hacks.xfishtank.name:      XFishTank
 *hacks.electricsheep.name:  ElectricSheep
index b6ec5815256055605809d6183850aabea59ce10b..b3caf1df9672c43238ba39264a4ecf13d9379b64 100644 (file)
                                starfish -root                              \\n\
             \"Starfish (blob)\"        starfish -root -blob                        \\n\
                                munch -root                                 \\n\
+                               mismunch -root                              \\n\
                                fadeplot -root                              \\n\
                                coral -root -delay 0                        \\n\
                                mountain -root                              \\n\
                                apple2 -root                                \\n\
                                 bubbles -root                              \\n\
                                pong -root                                  \\n\
+                               wormhole -root                              \\n\
+                               pacman -root                                \\n\
 - default-n:                   webcollage -root                            \\n\
 - default-n:  \"WebCollage (whacked)\"                                       \
                                webcollage -root -filter                      \
           GL:                  flipscreen3d -root                          \\n\
           GL:                  glsnake -root                               \\n\
           GL:                  boxed -root                                 \\n\
-          GL:                  glforestfire -root                          \\n\
--         GL:                  glforestfire -root -rain                    \\n\
+          GL:  \"GLForestFire\"                glforestfire -root                  \\n\
+-         GL:  \"GLForestFire (rain)\" glforestfire -root -rain            \\n\
           GL:                  sballs -root                                \\n\
           GL:                  cubenetic -root                             \\n\
           GL:                  spheremonics -root                          \\n\
           GL:      \"MirrorBlob (color only)\"                               \
                                 mirrorblob -root -colour -no-texture       \\n\
           GL:                  blinkbox -root                              \\n\
+          GL:                  noof -root                                  \\n\
                                                                              \
 -                              xdaliclock -root -builtin3 -cycle           \\n\
 - default-n:                   xearth -nofork -nostars -ncolors 50           \
                                  -night 3 -wait 0 -timewarp 400.0 -pos       \
                                  sunrel/38/-30                             \\n\
--                              xplanetbg -xscreensaver -moonside             \
-                                  -markerfile earth -wait 1 -timewarp 400   \\n\
+-                              xplanet -vroot -wait 1 -timewarp 90000        \
+                                  -label -origin moon                      \\n\
 -                              xmountains -b -M -Z 0 -r 1                  \\n\
 -      \"XMountains (top)\"    xmountains -b -M -Z 0 -r 1 -m               \\n\
 -                               xaos -root -autopilot -nogui -delay 10000     \
 "*passwd.passwdFont:           *-courier-medium-r-*-*-*-140-*-*-*-iso8859-1",
 "*passwd.thermometer.width:    8",
 "*splash.heading.label:                XScreenSaver %s",
-"*splash.body.label:           Copyright © 1991-2003 by",
+"*splash.body.label:           Copyright © 1991-2004 by",
 "*splash.body2.label:          Jamie Zawinski <jwz@jwz.org>",
 "*splash.demo.label:           Settings",
 "*splash.help.label:           Help",
 "*hacks.sballs.name:         SBalls",
 "*hacks.xdaliclock.name:     XDaliClock",
 "*hacks.xplanetbg.name:      XPlanet",
+"*hacks.xplanet.name:        XPlanet",
 "*hacks.xaos.name:           XaoS",
 "*hacks.xfishtank.name:      XFishTank",
 "*hacks.electricsheep.name:  ElectricSheep",
index 396803755dee25987a778d125ecf71a98f858e57..6416e6ce99906f243e579471acf41e1cd1d18cb5 100644 (file)
@@ -1,5 +1,5 @@
 /* demo-Gtk-conf.c --- implements the dynamic configuration dialogs.
- * xscreensaver, Copyright (c) 2001, 2003 Jamie Zawinski <jwz@jwz.org>
+ * xscreensaver, Copyright (c) 2001, 2003, 2004 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
@@ -1642,7 +1642,7 @@ restore_defaults (const char *progname, GList *parms)
  */
 
 static char *
-get_description (GList *parms)
+get_description (GList *parms, gboolean verbose_p)
 {
   parameter *doc = 0;
   for (; parms; parms = parms->next)
@@ -1661,6 +1661,7 @@ get_description (GList *parms)
     {
       char *d = strdup ((char *) doc->string);
       char *s;
+      char *p;
       for (s = d; *s; s++)
         if (s[0] == '\n')
           {
@@ -1687,7 +1688,27 @@ get_description (GList *parms)
           d[--L] = 0;
       }
 
-      return _(d);
+      /* strip off duplicated whitespaces */
+      for (s = d; *s; s++)
+         if (s[0] == ' ')
+         {
+           p = s+1;
+           while (*s == ' ')
+             s++;
+            if (*p && (s != p))
+              memmove (p, s, strlen(s)+1);
+         }
+
+#if 0
+      if (verbose_p)
+        {
+          fprintf (stderr, "%s: text read   is \"%s\"\n", blurb(),doc->string);
+          fprintf (stderr, "%s: description is \"%s\"\n", blurb(), d);
+          fprintf (stderr, "%s: translation is \"%s\"\n", blurb(), _(d));
+        }
+#endif /* 0 */
+
+      return (d);
     }
 }
 
@@ -1771,7 +1792,7 @@ load_configurator_1 (const char *program, const char *arguments,
 
       data->widget = table;
       data->parameters = parms;
-      data->description = get_description (parms);
+      data->description = get_description (parms, verbose_p);
     }
   else
     {
index 9c2f0ca8dc9b1dc9666f39527afef4ac4de9a917..f220ab0dd558268b70cade6add9e7ba37df02b9f 100644 (file)
@@ -1,5 +1,5 @@
 /* demo-Gtk.c --- implements the interactive demo-mode and options dialogs.
- * xscreensaver, Copyright (c) 1993-2003 Jamie Zawinski <jwz@jwz.org>
+ * xscreensaver, Copyright (c) 1993-2004 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
 #include "logo-50.xpm"
 #include "logo-180.xpm"
 
+#undef dgettext  /* else these are defined twice... */
+#undef dcgettext
+
 #include "demo-Gtk-widgets.h"
 #include "demo-Gtk-support.h"
 #include "demo-Gtk-conf.h"
@@ -650,9 +653,9 @@ about_menu_cb (GtkMenuItem *menuitem, gpointer user_data)
      look as good in the plain-old default Latin1 "C" locale.)
    */
 #ifdef HAVE_GTK2
-  sprintf(copy, ("Copyright \xC2\xA9 1991-2003 %s"), s);
+  sprintf(copy, ("Copyright \xC2\xA9 1991-2004 %s"), s);
 #else  /* !HAVE_GTK2 */
-  sprintf(copy, ("Copyright \251 1991-2003 %s"), s);
+  sprintf(copy, ("Copyright \251 1991-2004 %s"), s);
 #endif /* !HAVE_GTK2 */
 
   sprintf (msg, "%s\n\n%s", copy, desc);
@@ -2833,15 +2836,15 @@ populate_demo_window (state *s, int list_elt)
   if (!pretty_name)
     pretty_name = strdup (_("Preview"));
 
-  gtk_frame_set_label (frame1, pretty_name);
-  gtk_frame_set_label (frame2, pretty_name);
+  gtk_frame_set_label (frame1, _(pretty_name));
+  gtk_frame_set_label (frame2, _(pretty_name));
 
   gtk_entry_set_text (cmd, (hack ? hack->command : ""));
   gtk_entry_set_position (cmd, 0);
 
   {
     char title[255];
-    sprintf (title, "%s: %.100s Settings",
+    sprintf (title, _("%s: %.100s Settings"),
              progclass, (pretty_name ? pretty_name : "???"));
     gtk_window_set_title (GTK_WINDOW (s->popup_widget), title);
   }
diff --git a/driver/passwd-helper.c b/driver/passwd-helper.c
new file mode 100644 (file)
index 0000000..7b23f05
--- /dev/null
@@ -0,0 +1,154 @@
+/* passwd-helper.c --- verifying typed passwords with external helper program
+ * written by Olaf Kirch <okir@suse.de>
+ * xscreensaver, Copyright (c) 1993-2004 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 idea here is to be able to run xscreensaver without any setuid bits.
+ * Password verification happens through an external program that you feed
+ * your password to on stdin.  The external command is invoked with a user
+ * name argument.
+ *
+ * The external helper does whatever authentication is necessary.  Currently,
+ * SuSE uses "unix2_chkpwd", which is a variation of "unix_chkpwd" from the
+ * PAM distribution.
+ *
+ * Normally, the password helper should just authenticate the calling user
+ * (i.e. based on the caller's real uid).  This is in order to prevent
+ * brute-forcing passwords in a shadow environment.  A less restrictive
+ * approach would be to allow verifying other passwords as well, but always
+ * with a 2 second delay or so.  (Not sure what SuSE's "unix2_chkpwd"
+ * currently does.)
+ *                         -- Olaf Kirch <okir@suse.de>, 16-Dec-2003
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#ifndef NO_LOCKING  /* whole file */
+
+#include <stdlib.h>
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+
+extern char *blurb(void);
+
+
+#include <stdio.h>
+#include <string.h>
+#include <sys/types.h>
+#include <pwd.h>
+#include <errno.h>
+
+#include <sys/wait.h>
+
+extern void block_sigchld (void);
+extern void unblock_sigchld (void);
+
+static int
+ext_run (const char *user, const char *typed_passwd, int verbose_p)
+{
+  int pfd[2], status;
+  pid_t pid;
+
+  if (pipe(pfd) < 0)
+    return 0;
+
+  if (verbose_p)
+    fprintf (stderr, "%s: ext_run (%s, %s)\n",
+             blurb(), PASSWD_HELPER_PROGRAM, user);
+
+  block_sigchld();
+
+  if ((pid = fork()) < 0) {
+    close(pfd[0]);
+    close(pfd[1]);
+    return 0;
+  }
+
+  if (pid == 0) {
+    close(pfd[1]);
+    if (pfd[0] != 0)
+      dup2(pfd[0], 0);
+
+    /* Helper is invoked as helper service-name [user] */
+    execlp(PASSWD_HELPER_PROGRAM, PASSWD_HELPER_PROGRAM, "xscreensaver", user, NULL);
+    if (verbose_p)
+      fprintf(stderr, "%s: %s\n", PASSWD_HELPER_PROGRAM,
+               strerror(errno));
+    exit(1);
+  }
+
+  close(pfd[0]);
+
+  /* Write out password to helper process */
+  if (!typed_passwd)
+    typed_passwd = "";
+  write(pfd[1], typed_passwd, strlen(typed_passwd));
+  close(pfd[1]);
+
+  while (waitpid(pid, &status, 0) < 0) {
+    if (errno == EINTR)
+      continue;
+    if (verbose_p)
+      fprintf(stderr, "%s: ext_run: waitpid failed: %s\n",
+               blurb(), strerror(errno));
+    unblock_sigchld();
+    return 0;
+  }
+
+  unblock_sigchld();
+
+  if (!WIFEXITED(status) || WEXITSTATUS(status) != 0)
+    return 0;
+  return 1;
+}
+
+
+
+/* This can be called at any time, and says whether the typed password
+   belongs to either the logged in user (real uid, not effective); or
+   to root.
+ */
+int
+ext_passwd_valid_p (const char *typed_passwd, int verbose_p)
+{
+  struct passwd *pw;
+  int res = 0;
+
+  if ((pw = getpwuid(getuid())) != NULL)
+    res = ext_run (pw->pw_name, typed_passwd, verbose_p);
+  endpwent();
+
+  if (!res)
+    res = ext_run ("root", typed_passwd, verbose_p);
+
+  return res;
+}
+
+
+int 
+ext_priv_init (int argc, char **argv, int verbose_p)
+{
+  /* Make sure the passwd helper exists */
+  if (access(PASSWD_HELPER_PROGRAM, X_OK) < 0) {
+    fprintf(stderr,
+               "%s: warning: %s does not exist.\n"
+               "%s: password authentication via "
+                       "external helper will not work.\n",
+               blurb(), PASSWD_HELPER_PROGRAM, blurb());
+    return 0;
+  }
+  return 1;
+}
+
+#endif /* NO_LOCKING -- whole file */
index cdb22b595d0ade04aa309caacd861e080f2bf9b7..26b2cb869d2c08032dfad7888af726a8db940903 100644 (file)
@@ -26,6 +26,7 @@
 #include <stdio.h>
 #include <string.h>
 #include <sys/types.h>
+#include <sys/stat.h>
 
 /* I'm not sure if this is exactly the right test...
    Might __APPLE__ be defined if this is apple hardware, but not
@@ -192,6 +193,7 @@ kerberos_passwd_valid_p (const char *typed_passwd, Bool verbose_p)
     C_Block mitkey;
     Bool success;
     char *newtkfile;
+    int fh = -1;
 
     /* temporarily switch to a new ticketfile.
        I'm not using tmpnam() because it isn't entirely portable.
@@ -199,7 +201,19 @@ kerberos_passwd_valid_p (const char *typed_passwd, Bool verbose_p)
     newtkfile = malloc(80 * sizeof(char));
     memset(newtkfile, 0, sizeof(newtkfile));
 
-    sprintf(newtkfile, "/tmp/xscrn-%i", getpid());
+    sprintf(newtkfile, "/tmp/xscrn-%i.XXXXXX", getpid());
+
+    if( (fh = mkstemp(newtktfile)) < 0)
+    {
+        free(newtktfile);
+        return(False);
+    }
+    if( fchmod(fh, 0600) < 0)
+    {
+        free(newtktfile);
+        return(False);
+    }
+
 
     krb_set_tkt_string(newtkfile);
 
@@ -222,6 +236,7 @@ kerberos_passwd_valid_p (const char *typed_passwd, Bool verbose_p)
     krb_set_tkt_string(tk_file);
     free(newtkfile);
     memset(mitkey, 0, sizeof(mitkey));
+    close(fh); /* #### tom: should the file be removed? */
     
 
     /* Did we verify successfully? */
index fa7d4178a5798896032f29b776bf0271a34f5bc2..c3c2b62ac9f309547db83d887ea1286ab097a60b 100644 (file)
@@ -55,6 +55,10 @@ extern Bool kerberos_passwd_valid_p (const char *typed_passwd, Bool verbose_p);
 extern Bool pam_priv_init (int argc, char **argv, Bool verbose_p);
 extern Bool pam_passwd_valid_p (const char *typed_passwd, Bool verbose_p);
 #endif
+#ifdef PASSWD_HELPER_PROGRAM
+extern Bool ext_priv_init (int argc, char **argv, Bool verbose_p);
+extern Bool ext_passwd_valid_p (const char *typed_passwd, Bool verbose_p);
+#endif
 extern Bool pwent_lock_init (int argc, char **argv, Bool verbose_p);
 extern Bool pwent_priv_init (int argc, char **argv, Bool verbose_p);
 extern Bool pwent_passwd_valid_p (const char *typed_passwd, Bool verbose_p);
@@ -74,6 +78,10 @@ struct auth_methods methods[] = {
   { "PAM",              0, pam_priv_init, pam_passwd_valid_p, 
                         False, False },
 # endif
+# ifdef PASSWD_HELPER_PROGRAM
+  { "external",                0, ext_priv_init, ext_passwd_valid_p,
+                       False, False },
+#endif
   { "normal",           pwent_lock_init, pwent_priv_init, pwent_passwd_valid_p,
                         False, False }
 };
index 87e890341c7bcfedee2a8036916a9b9735591738..60778fe10c472169a07c062314ef2dbbcd9eb594 100644 (file)
@@ -1,6 +1,6 @@
 /* pdf2jpeg -- converts a PDF file to a JPEG file, using Cocoa
  *
- * Copyright (c) 2001, 2002, 2003 by Jamie Zawinski <jwz@jwz.org>
+ * Copyright (c) 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
index ee6cd7e4df7da2b2e2c0a3499101e5511d147fce..d0949083074dc72882380690f6276ec686bc5040 100644 (file)
@@ -5,4 +5,4 @@ Terminal=false
 _Name=Screensaver
 _Comment=Change screensaver properties
 Type=Application
-Categories=Application;Settings;AdvancedSettings;
+Categories=Application;Settings;Appearance;AdvancedSettings;
index 8c068c023e7fcdaec347c582ab6bb7371e9dee41..d36ff701f948a6045102dbe389d5be54a83f7a21 100644 (file)
@@ -1076,7 +1076,20 @@ proc_interrupts_activity_p (saver_info *si)
 
   while (fgets (new_line, sizeof(new_line)-1, f1))
     {
-      if (!checked_kbd && strstr (new_line, "keyboard"))
+      if (strchr (new_line, ','))
+        {
+          /* Ignore any line that has a comma on it: this is because
+             a setup like this:
+
+                 12:     930935          XT-PIC  usb-uhci, PS/2 Mouse
+
+             is really bad news.  It *looks* like we can note mouse
+             activity from that line, but really, that interrupt gets
+             fired any time any USB device has activity!  So we have
+             to ignore any shared IRQs.
+           */
+        }
+      else if (!checked_kbd && strstr (new_line, "keyboard"))
         {
           kbd_changed = (*last_kbd_line && !!strcmp (new_line, last_kbd_line));
           strcpy (last_kbd_line, new_line);
index d8dd718b5965e843c1934d01d1720dab9c614dd6..a7cea7a288567ffbce3b7d1c366074ff5ca95f74 100644 (file)
@@ -11,7 +11,7 @@
 .if n .sp 1
 .if t .sp .5
 ..
-.TH XScreenSaver 1 "25-Oct-2003 (4.14)" "X Version 11"
+.TH XScreenSaver 1 "26-Feb-2004 (4.15)" "X Version 11"
 .SH NAME
 xscreensaver-command - control a running xscreensaver process
 .SH SYNOPSIS
@@ -148,8 +148,8 @@ using a machine remotely, and you find that some display modes are using too
 much CPU.  
 
 (If you want to do this \fIpermanently\fP, that is, you want the screen saver
-to only blank the screen and not run demos at all, then set the \fIprograms\fP
-resource to an empty list:  See
+to only blank the screen and not run demos at all, then set the \fImode\fP
+preference to "blank":  See
 .BR xscreensaver (1)
 for details.)
 .TP 8
@@ -256,7 +256,7 @@ and related tools can always be found at http://www.jwz.org/xscreensaver/
 .BR xscreensaver (1)
 .BR xscreensaver\-demo (1)
 .SH COPYRIGHT
-Copyright \(co 1992, 1993, 1997, 1998, 1999, 2000, 2001, 2002
+Copyright \(co 1992, 1993, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004
 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
index f0828d0b277553ca9e4dfcc186294855fb5cd753..a1c7c6e7397873d479556c71dc6620a9e4601e53 100644 (file)
@@ -2,14 +2,13 @@
 <!DOCTYPE glade-interface SYSTEM "http://glade.gnome.org/glade-2.0.dtd">
 
 <glade-interface>
+<requires lib="gnome"/>
 
 <widget class="GtkWindow" id="xscreensaver_demo">
   <property name="title" translatable="yes">XScreenSaver</property>
   <property name="type">GTK_WINDOW_TOPLEVEL</property>
   <property name="window_position">GTK_WIN_POS_NONE</property>
   <property name="modal">False</property>
-  <property name="wmclass_name">xscreensaver</property>
-  <property name="wmclass_class">XScreenSaver</property>
   <property name="resizable">True</property>
   <property name="destroy_with_parent">False</property>
 
              <property name="show_border">True</property>
              <property name="tab_pos">GTK_POS_TOP</property>
              <property name="scrollable">False</property>
-             <property name="tab_hborder">2</property>
-             <property name="tab_vborder">2</property>
              <property name="enable_popup">False</property>
              <signal name="switch_page" handler="switch_page_cb"/>
 
                          <property name="show_border">False</property>
                          <property name="tab_pos">GTK_POS_BOTTOM</property>
                          <property name="scrollable">False</property>
-                         <property name="tab_hborder">2</property>
-                         <property name="tab_vborder">2</property>
                          <property name="enable_popup">False</property>
 
                          <child>
@@ -1926,8 +1921,6 @@ Installed</property>
                  <property name="show_border">False</property>
                  <property name="tab_pos">GTK_POS_BOTTOM</property>
                  <property name="scrollable">False</property>
-                 <property name="tab_hborder">2</property>
-                 <property name="tab_vborder">2</property>
                  <property name="enable_popup">False</property>
                  <signal name="switch_page" handler="settings_switch_page_cb"/>
 
@@ -2301,6 +2294,27 @@ Installed</property>
                      <property name="xpad">0</property>
                      <property name="ypad">0</property>
                    </widget>
+                   <packing>
+                     <property name="padding">0</property>
+                     <property name="expand">False</property>
+                     <property name="fill">False</property>
+                   </packing>
+                 </child>
+
+                 <child>
+                   <widget class="GtkLabel" id="spacer">
+                     <property name="visible">True</property>
+                     <property name="label" translatable="yes"></property>
+                     <property name="use_underline">False</property>
+                     <property name="use_markup">False</property>
+                     <property name="justify">GTK_JUSTIFY_LEFT</property>
+                     <property name="wrap">False</property>
+                     <property name="selectable">False</property>
+                     <property name="xalign">0.5</property>
+                     <property name="yalign">0.5</property>
+                     <property name="xpad">0</property>
+                     <property name="ypad">0</property>
+                   </widget>
                    <packing>
                      <property name="padding">0</property>
                      <property name="expand">True</property>
index 22c60d50f72ea622650096183b2c11e0e2c8265d..3f583321e98acba73e48c001687ac0698b5b3721 100644 (file)
@@ -11,7 +11,7 @@
 .if n .sp 1
 .if t .sp .5
 ..
-.TH XScreenSaver 1 "25-Oct-2003 (4.14)" "X Version 11"
+.TH XScreenSaver 1 "26-Feb-2004 (4.15)" "X Version 11"
 .SH NAME
 xscreensaver-demo - interactively control the background xscreensaver daemon
 .SH SYNOPSIS
@@ -235,11 +235,10 @@ power down after this much idle time.  This duration should be greater
 than or equal to \fISuspend\fP.
 .TP 4
 .B Install Colormap
-Whether to install a private colormap while the screensaver is active, so
-that the graphics hacks can get as many colors as possible.  (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-demo basis.
+On 8-bit screens, whether to install a private colormap while the
+screensaver is active, so that the graphics hacks can get as many
+colors as possible.  This does nothing if you are running in 16-bit
+or better.
 .TP 4
 .B Fade To Black When Blanking
 If selected, then when the screensaver activates, the current contents
@@ -284,7 +283,7 @@ available, and another should only be run in monochrome.  See the
 discussion of the \fIprograms\fP parameter in the \fIConfiguration\fP
 section of the
 .BR xscreensaver (1)
-manual.
+manual.  (OpenGL programs should always have their visual set to "GL".)
 .SH COMMAND-LINE OPTIONS
 .I xscreensaver\-demo
 accepts the following command line options.
@@ -298,10 +297,6 @@ is managing that same display.
 Start up with the \fBAdvanced\fP tab selected by default
 instead of the \fBDisplay Modes\fP tab.
 .TP 8
-.B \-crapplet
-For use by the Gnome Control Center code: this causes this program to
-be embedded inside the Control Center window.
-.TP 8
 .B \-debug
 Causes lots of diagnostics to be printed on stderr.
 .P
@@ -338,7 +333,7 @@ http://www.jwz.org/xscreensaver/
 .BR xscreensaver\-command (1),
 .BR xscreensaver\-getimage (1)
 .SH COPYRIGHT
-Copyright \(co 1992, 1993, 1997, 1998, 1999, 2000, 2001, 2002
+Copyright \(co 1992, 1993, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004
 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
index f7d9e7650aa371aaf5bd049dfa95f330099246ac..40c6173cbc46a6c6a45b8e5891413c2642b5477a 100755 (executable)
@@ -34,7 +34,7 @@ use diagnostics;
 use strict;
 
 my $progname = $0; $progname =~ s@.*/@@g;
-my $version = q{ $Revision: 1.1 $ }; $version =~ s/^[^0-9]+([0-9.]+).*$/$1/;
+my $version = q{ $Revision: 1.2 $ }; $version =~ s/^[^0-9]+([0-9.]+).*$/$1/;
 
 my @grabber   = ("screencapture", "-x");
 my @converter = ("pdf2jpeg");
@@ -81,7 +81,7 @@ sub grab_image {
   my $tmpdir = $ENV{TMPDIR};
   $tmpdir = "/tmp" unless $tmpdir;
 
-  my $tmpfile = "$tmpdir/xssgrab.$$.pdf";
+  my $tmpfile = sprintf ("%s/xssgrab.%08x.pdf", $tmpdir, rand(0xffffffff));
   my @cmd     = (@grabber, $tmpfile);
 
   unlink $tmpfile;
index 92a53d9c83c013cdcb32f5e911552e24a522d933..6dea72b98b0ea1d5c76154333ff24125e0d66f1f 100644 (file)
@@ -1,4 +1,4 @@
-.TH XScreenSaver 1 "25-Oct-2003 (4.14)" "X Version 11"
+.TH XScreenSaver 1 "26-Feb-2004 (4.15)" "X Version 11"
 .SH NAME
 xscreensaver-getimage-file - put a randomly-selected image on the root window
 .SH SYNOPSIS
index d35d0ca730476ead33a91473f070235d47e1fd26..f8474670cca37a567ef68d4f1c8f282449a2de20 100755 (executable)
@@ -29,7 +29,7 @@ use diagnostics;
 use strict;
 
 my $progname = $0; $progname =~ s@.*/@@g;
-my $version = q{ $Revision: 1.12 $ }; $version =~ s/^[^0-9]+([0-9.]+).*$/$1/;
+my $version = q{ $Revision: 1.13 $ }; $version =~ s/^[^0-9]+([0-9.]+).*$/$1/;
 
 my $verbose = 0;
 
@@ -44,7 +44,7 @@ my $verbose = 0;
 my $tmpdir = $ENV{TMPDIR};
 $tmpdir = "/tmp" unless $tmpdir;
 
-my $tmpfile = "$tmpdir/xssgv.$$.ppm";
+my $tmpfile = sprintf ("%s/xssgv.%08x.ppm", $tmpdir, rand(0xFFFFFFFF));
 
 # this crap is because "vidtomem" can only write to a file, and uses
 # a stupid, non-overridable file name format.
@@ -55,7 +55,10 @@ my @programs = (
   "bttvgrab -d q -Q -l 1 -o ppm -f $tmpfile",  # BTTV
   "qcam > $tmpfile",                           # Connectix Qcam
   "gqcam -t PPM -d $tmpfile",                  # GTK+ Qcam clone
-  "streamer -s 768x576 -o $tmpfile",           # XawTV
+
+  "streamer -a -s 768x576 -o $tmpfile",                # XawTV
+  #   the "-a" option ("mute audio") arrived with XawTV 3.76.
+
   "atitv snap $tmpfile",                       # ATI video capture card
 
   "grab -type ppm -format ntsc -source 1 " .
index 86c38230402b3c3e8b66be3a528b2778df891983..ed4b9f32128e13c07e020d0d09f84dbe90b8dcda 100644 (file)
@@ -1,4 +1,4 @@
-.TH XScreenSaver 1 "25-Oct-2003 (4.14)" "X Version 11"
+.TH XScreenSaver 1 "26-Feb-2004 (4.15)" "X Version 11"
 .SH NAME
 xscreensaver-getimage-video - put a video frame on the root window
 .SH SYNOPSIS
index e46bc5c97262a6e9d55ce566c0142ec8c4b25228..67b59d0656be830aa2082bd494de4a1e79c1e174 100644 (file)
@@ -136,6 +136,15 @@ ignore_all_errors_ehandler (Display *dpy, XErrorEvent *error)
   return 0;
 }
 
+static int
+ignore_badmatch_ehandler (Display *dpy, XErrorEvent *error)
+{
+  if (error->error_code == BadMatch)
+    return ignore_all_errors_ehandler (dpy, error);
+  else
+    return x_ehandler (dpy, error);
+}
+
 
 /* Returns True if the given Drawable is a Window; False if it's a Pixmap.
  */
@@ -885,7 +894,7 @@ read_jpeg_ximage (Screen *screen, Visual *visual, Drawable drawable,
           int x;
           for (x = 0; x < ximage->width; x++)
             {
-              int j = x * cinfo.num_components;
+              int j = x * cinfo.output_components;
               unsigned char r = scanbuf[i][j];
               unsigned char g = scanbuf[i][j+1];
               unsigned char b = scanbuf[i][j+2];
@@ -897,10 +906,12 @@ read_jpeg_ximage (Screen *screen, Visual *visual, Drawable drawable,
                 pixel = ((r >> 5) | ((g >> 5) << 3) | ((b >> 6) << 6));
               else if (depth == 12)
                 pixel = ((r >> 4) | ((g >> 4) << 4) | ((b >> 4) << 8));
-              else if (depth == 16 || depth == 15)
+              else if (depth == 15)
                 /* Gah! I don't understand why these are in the other
                    order. */
                 pixel = (((r >> 3) << 10) | ((g >> 3) << 5) | ((b >> 3)));
+              else if (depth == 16)
+                pixel = (((r >> 3) << 11) | ((g >> 2) << 5) | ((b >> 3)));
               else
                 abort();
 
@@ -1347,12 +1358,38 @@ display_desktop (Screen *screen, Window window, Drawable drawable,
     }
   else  /* size mismatch -- must scale client-side images to fit drawable */
     {
-      XImage *ximage = XGetImage (dpy, window, 0, 0, xgwa.width, xgwa.height,
-                                  ~0L, ZPixmap);
       GC gc;
+      XImage *ximage = 0;
+      XErrorHandler old_handler;
+
+      XSync (dpy, False);
+      old_handler = XSetErrorHandler (ignore_badmatch_ehandler);
+      error_handler_hit_p = False;
+
+      /* This can return BadMatch if the window is not fully on screen.
+         Trap that error and return color bars in that case.
+         (Note that this only happens with XGetImage, not with XCopyArea:
+         yet another totally gratuitous inconsistency in X, thanks.)
+       */
+      ximage = XGetImage (dpy, window, 0, 0, xgwa.width, xgwa.height,
+                          ~0L, ZPixmap);
+
+      XSync (dpy, False);
+      XSetErrorHandler (old_handler);
+      XSync (dpy, False);
+
+      if (error_handler_hit_p)
+        {
+          ximage = 0;
+          if (verbose_p)
+            fprintf (stderr, "%s: BadMatch reading window 0x%x contents!\n",
+                     progname, (unsigned int) window);
+        }
+
       if (!ximage ||
           !scale_ximage (xgwa.screen, xgwa.visual, ximage, w2, h2))
         return False;
+
       gc = XCreateGC (dpy, drawable, 0, &gcv);
       clear_drawable (screen, drawable);
       XPutImage (dpy, drawable, gc, ximage, 
index f83aed8933bd3c64e04eb86a2bb72508339819d6..0c76222129b1656a9cdccd16cbbe52ff0bbbf869 100644 (file)
@@ -1,4 +1,4 @@
-.TH XScreenSaver 1 "25-Oct-2003 (4.14)" "X Version 11"
+.TH XScreenSaver 1 "26-Feb-2004 (4.15)" "X Version 11"
 .SH NAME
 xscreensaver-getimage - put some randomly-selected image on the root window
 .SH SYNOPSIS
index 09665b665de43e7c4cff488992de83749510e1a2..5327ccb0cf23470ed07b66f42ca18f2909109a91 100644 (file)
@@ -255,7 +255,7 @@ do_help (saver_info *si)
   fflush (stdout);
   fflush (stderr);
   fprintf (stdout, "\
-xscreensaver %s, copyright (c) 1991-2003 by Jamie Zawinski <jwz@jwz.org>\n\
+xscreensaver %s, copyright (c) 1991-2004 by Jamie Zawinski <jwz@jwz.org>\n\
 \n\
   All xscreensaver configuration is via the `~/.xscreensaver' file.\n\
   Rather than editing that file by hand, just run `xscreensaver-demo':\n\
@@ -719,7 +719,7 @@ print_banner (saver_info *si)
 
   if (p->verbose_p)
     fprintf (stderr,
-            "%s %s, copyright (c) 1991-2003 "
+            "%s %s, copyright (c) 1991-2004 "
             "by Jamie Zawinski <jwz@jwz.org>.\n",
             progname, si->version);
 
@@ -1372,27 +1372,33 @@ main_loop (saver_info *si)
 
          To avoid this: after un-blanking the screen, sleep for a second,
          and then really make sure the window is unmapped.
+
+         Update: actually, let's do that once a second for 8 seconds,
+         because sometimes the machine is slow, and we miss...
        */
       {
-        int i;
-        XSync (si->dpy, False);
-        sleep (1);
-        for (i = 0; i < si->nscreens; i++)
+        int i, j;
+        for (j = 0; j < 8; j++)
           {
-            saver_screen_info *ssi = &si->screens[i];
-            Window w = ssi->screensaver_window;
-            XWindowAttributes xgwa;
-            XGetWindowAttributes (si->dpy, w, &xgwa);
-            if (xgwa.map_state != IsUnmapped)
+            XSync (si->dpy, False);
+            sleep (1);
+            for (i = 0; i < si->nscreens; i++)
               {
-                if (p->verbose_p)
-                  fprintf (stderr,
-                           "%s: %d: client race! emergency unmap 0x%lx.\n",
-                           blurb(), i, (unsigned long) w);
-                XUnmapWindow (si->dpy, w);
+                saver_screen_info *ssi = &si->screens[i];
+                Window w = ssi->screensaver_window;
+                XWindowAttributes xgwa;
+                XGetWindowAttributes (si->dpy, w, &xgwa);
+                if (xgwa.map_state != IsUnmapped)
+                  {
+                    if (p->verbose_p)
+                      fprintf (stderr,
+                               "%s: %d: client race! emergency unmap 0x%lx.\n",
+                               blurb(), i, (unsigned long) w);
+                    XUnmapWindow (si->dpy, w);
+                  }
               }
+            XSync (si->dpy, False);
           }
-        XSync (si->dpy, False);
       }
     }
 }
index ba2a7f1be324581ce327f54107027c12beb27fea..28cda06cba4a9fb93d2120b44c05103c9b0f7ed6 100755 (executable)
@@ -58,23 +58,27 @@ while [ -n "$1" ]; do
       exit
       ;;
 
-    -test)
-      # I was unable to grep stdout because xscreensaver nabs it. But I was able
-      # to output it to a file, and grep the file.
-      TEMP_FILE=/tmp/xsc.$RANDOM
-      $bindir/xscreensaver -no-splash -verbose -no-capture-stderr 2> $TEMP_FILE &
-      $bindir/xscreensaver-command -activate
-      while true; do
-        ExitNow=$(grep -E -c unblanking\|already $TEMP_FILE)
-        if [ $ExitNow != 0 ]; then
-          kill $!
-          rm $TEMP_FILE
-          exit
-        fi
-        sleep 1
-      done
-      exit     # It should never get this far.
-      ;;
+# I don't know what "-test" was supposed to do, but I suspect the
+# answer is "something stupid."  Also, it uses /tmp insecurely.
+# So let's just comment it out, shall we?  -jwz, 10-Nov-2003.
+#
+#    -test)
+#      # I was unable to grep stdout because xscreensaver nabs it. But I was able
+#      # to output it to a file, and grep the file.
+#      TEMP_FILE=/tmp/xsc.$RANDOM
+#      $bindir/xscreensaver -no-splash -verbose -no-capture-stderr 2> $TEMP_FILE &
+#      $bindir/xscreensaver-command -activate
+#      while true; do
+#        ExitNow=$(grep -E -c unblanking\|already $TEMP_FILE)
+#        if [ $ExitNow != 0 ]; then
+#          kill $!
+#          rm $TEMP_FILE
+#          exit
+#        fi
+#        sleep 1
+#      done
+#      exit    # It should never get this far.
+#      ;;
 
 #    -corners)
 #      echo "Not yet supported"
@@ -124,7 +128,7 @@ if [ -n "$Install" ] ; then
   wait $!                                               # Do not exit, just wait for signals.
 
 else
-  echo "Usage: ./xscreensaver.kss -install|-setup|-test|-desc [-delay num] [-lock] [-nice num]"
+  echo "Usage: ./xscreensaver.kss -install|-setup|-desc [-delay num] [-lock] [-nice num]"
 #  echo "  -corners xxxx     Placing cursor in corner performs action:"
 #  echo "                     x = i  no action (ignore)"
 #  echo "                     x = s  save screen"
@@ -139,7 +143,7 @@ else
   echo "  -preview wid      Run in the specified XWindow"
 #  echo "  -inroot           Run in the root window"
   echo "  -setup            Setup screen saver"
-  echo "  -test             Invoke the screen saver immediately"
+#  echo "  -test             Invoke the screen saver immediately"
 fi
 
 # End of script - "xscreensaver.kss"
index 7d627791665d6df45735b6d56129cf3b986e59ef..6f9f32c833d3a9e1504af6335c93cfcc0fa3d4cf 100644 (file)
@@ -11,7 +11,7 @@
 .if n .sp 1
 .if t .sp .5
 ..
-.TH XScreenSaver 1 "25-Oct-2003 (4.14)" "X Version 11"
+.TH XScreenSaver 1 "26-Feb-2004 (4.15)" "X Version 11"
 .SH NAME
 xscreensaver - extensible screen saver framework, plus locking
 .SH SYNOPSIS
@@ -231,7 +231,7 @@ Whether to print diagnostics.  Default false.
 .TP 8
 .B timestamp\fP (class \fBBoolean\fP)
 Whether to print the time of day along with any other diagnostic messages.
-Default false.
+Default true.
 .TP 8
 .B splash\fP (class \fBBoolean\fP)
 Whether to display a splash screen at startup.  Default true.
@@ -270,23 +270,6 @@ system, and don't increase the load unnecessarily.  The default is 10.
 .BR nice (1)
 for details.)
 .TP 8
-.B memoryLimit\fP (class \fBMemoryLimit\fP)
-The sub-processes created by \fIxscreensaver\fP will not be allowed to
-allocate more than this much memory (more accurately, this is the maximum
-size their address space may become.)  If any sub-process tries to allocate
-more than this,
-.BR malloc (3)
-will fail, and the process will likely exit (or safely crash) rather than
-going forth and hogging memory.  
-
-The assumption here is that if one of the screenhacks is trying to use
-a lot of memory, then something has gone wrong, and it's better to kill
-that program than to overload the machine.
-
-Default: 0, meaning "no limit."  30M is a good choice on most systems.
-(But beware that setting this to a small value can cause OpenGL programs
-to malfunction on certain systems.)
-.TP 8
 .B fade\fP (class \fBBoolean\fP)
 If this is true, then when the screensaver activates, the current contents
 of the screen will fade to black instead of simply winking out.  This only
@@ -476,12 +459,13 @@ seconds before selecting events on existing windows, under the assumption that
 \fIxscreensaver\fP is started during your login procedure, and the window 
 state may be in flux.  Default 0.  (This used to default to 30, but that was
 back in the days when slow machines and X terminals were more common...)
-.TP 8
-.B sgiSaverExtension\fP (class \fBBoolean\fP)
+.RE
+.PP
 There are a number of different X server extensions which can make
 xscreensaver's job easier.  The next few resources specify whether these
 extensions should be utilized if they are available.
-
+.TP 8
+.B sgiSaverExtension\fP (class \fBBoolean\fP)
 This resource controls whether the SGI \fBSCREEN_SAVER\fP server extension
 will be used to decide whether the user is idle.  This is the default 
 if \fIxscreensaver\fP has been compiled with support for this 
@@ -1332,7 +1316,7 @@ and a FAQ can always be found at http://www.jwz.org/xscreensaver/
 .BR zoom (1)
 .SH COPYRIGHT
 Copyright \(co 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
-2000, 2001, 2002, 2003 by Jamie Zawinski.  Permission to use, copy,
+2000, 2001, 2002, 2003, 2004 by Jamie Zawinski.  Permission to use, copy,
 modify, distribute, and sell this software and its documentation for
 any purpose is hereby granted without fee, provided that the above
 copyright notice appear in all copies and that both that copyright
index b59e26036fe6de018d01651b8a3881e9da36fe77..4a0c3e0995d2c5eca5f8c4886062e159e3b7ddf7 100644 (file)
@@ -3,5 +3,8 @@
 # Red Hat says this is right for them, as of 7.3:
 auth       required    /lib/security/pam_stack.so service=system-auth
 
+# SuSE 9.0 uses this (along with "--with-passwd-helper" of "unix2_chkpwd")
+# auth     required       pam_unix2.so nullok
+
 # This is what we were using before:
 # auth       required  /lib/security/pam_pwdb.so shadow nullok
index c818b1fc2f322e5bb05bd2126c9da70f4be6d5a4..53520547eb1e8762185c1b052afc4ad1911924fd 100644 (file)
@@ -54,6 +54,7 @@ HACK_LIBS     = $(HACK_PRE)            @HACK_LIBS@ $(HACK_POST)
 XPM_LIBS       = $(HACK_PRE) @XPM_LIBS@ @HACK_LIBS@ $(HACK_POST)
 JPEG_LIBS      = @JPEG_LIBS@
 XLOCK_LIBS     = $(HACK_LIBS)
+PTY_LIBS       = @PTY_LIBS@
 
 UTILS_SRC      = $(srcdir)/../utils
 UTILS_BIN      = ../utils
@@ -99,7 +100,8 @@ SRCS         = attraction.c blitspin.c bouboule.c braid.c bubbles.c \
                  euler2d.c juggle.c polyominoes.c thornbird.c fluidballs.c \
                  anemone.c halftone.c metaballs.c eruption.c popsquares.c \
                  barcode.c piecewise.c cloudlife.c fontglide.c apple2.c \
-                 apple2-main.c analogtv.c xanalogtv.c pong.c
+                 apple2-main.c analogtv.c xanalogtv.c pong.c wormhole.c \
+                 mismunch.c pacman.c
 SCRIPTS                = vidwhacker webcollage ljlatest
 
 OBJS           = attraction.o blitspin.o bouboule.o braid.o bubbles.o \
@@ -125,7 +127,8 @@ OBJS                = attraction.o blitspin.o bouboule.o braid.o bubbles.o \
                  euler2d.o juggle.o polyominoes.o thornbird.o fluidballs.o \
                  anemone.o halftone.o metaballs.o eruption.o popsquares.o \
                  barcode.o piecewise.o cloudlife.o fontglide.o apple2.o \
-                 apple2-main.o analogtv.o xanalogtv.o pong.o
+                 apple2-main.o analogtv.o xanalogtv.o pong.o wormhole.o \
+                 mismunch.o pacman.p
 
 NEXES          = attraction blitspin bouboule braid bubbles decayscreen deco \
                  drift flag flame forest vines galaxy grav greynetic halo \
@@ -143,7 +146,8 @@ NEXES               = attraction blitspin bouboule braid bubbles decayscreen deco \
                  whirlygig speedmine vermiculate twang apollonian euler2d \
                  juggle polyominoes thornbird  fluidballs anemone halftone \
                  metaballs eruption popsquares barcode piecewise cloudlife \
-                 fontglide apple2 xanalogtv pong \
+                 fontglide apple2 xanalogtv pong  wormhole mismunch \
+                 pacman \
                  @JPEG_EXES@
 SEXES          = sonar
 JPEG_EXES      = webcollage-helper
@@ -159,7 +163,8 @@ XSHM_OBJS   = $(UTILS_BIN)/xshm.o
 XDBE_OBJS      = $(UTILS_BIN)/xdbe.o
 
 HDRS           = bubbles.h screenhack.h xlockmore.h xlockmoreI.h automata.h \
-                 bumps.h xpm-pixmap.h apple2.h analogtv.h
+                 bumps.h xpm-pixmap.h apple2.h analogtv.h \
+                 pacman.h pacman_ai.h pacman_level.h
 MEN            = anemone.man ant.man apollonian.man attraction.man \
                  blaster.man blitspin.man bouboule.man braid.man bsod.man \
                  bubbles.man bumps.man ccurve.man compass.man coral.man \
@@ -186,9 +191,11 @@ MEN                = anemone.man ant.man apollonian.man attraction.man \
                  xrayswarm.man xspirograph.man xsublim.man xteevee.man \
                  zoom.man halftone.man eruption.man metaballs.man \
                  barcode.man piecewise.man cloudlife.man ljlatest.man \
-                 fontglide.man apple2.man xanalogtv.man pong.man
+                 fontglide.man apple2.man xanalogtv.man pong.man \
+                 wormhole.man mismunch.man pacman.man
 STAR           = *
 EXTRAS         = README Makefile.in xlock_23.h xml2man.pl .gdbinit \
+                 euler2d.tex \
                  config/README \
                  config/$(STAR).xml \
                  images/$(STAR).xbm \
@@ -635,7 +642,7 @@ bsod:               bsod.o          $(HACK_OBJS) $(GRAB) $(APPLE2) $(XPM)
        $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(GRAB) $(APPLE2) $(XPM) $(XPM_LIBS)
 
 apple2:                apple2.o apple2-main.o  $(HACK_OBJS) $(ATV) $(GRAB)
-       $(CC_HACK) -o $@ $@.o   apple2-main.o $(HACK_OBJS) $(ATV) $(GRAB) $(XPM_LIBS)
+       $(CC_HACK) -o $@ $@.o   apple2-main.o $(HACK_OBJS) $(ATV) $(GRAB) $(XPM_LIBS) $(PTY_LIBS)
 
 xanalogtv:     xanalogtv.o     $(HACK_OBJS) $(ATV) $(GRAB) $(XPM)
        $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(ATV) $(GRAB) $(XPM) $(XPM_LIBS) $(HACK_LIBS)
@@ -677,7 +684,7 @@ critical:   critical.o      $(HACK_OBJS) $(COL) $(ERASE)
        $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(COL) $(ERASE) $(HACK_LIBS)
 
 phosphor:      phosphor.o      $(HACK_OBJS) $(COL)
-       $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(COL) $(HACK_LIBS)
+       $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(COL) $(HACK_LIBS) $(PTY_LIBS)
 
 xmatrix:       xmatrix.o       $(HACK_OBJS) $(XPM)
        $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(XPM) $(XPM_LIBS)
@@ -769,6 +776,11 @@ fontglide: fontglide.o     $(HACK_OBJS) $(DBE)
 pong:  pong.o  $(HACK_OBJS) $(ATV) $(GRAB) $(XPM)
        $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(ATV) $(GRAB) $(XPM) $(XPM_LIBS) $(HACK_LIBS)
 
+wormhole:      wormhole.o      $(HACK_OBJS)
+       $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(HACK_LIBS)
+
+mismunch:      mismunch.o      $(HACK_OBJS) $(COL) $(SPL)
+       $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(COL) $(SPL) $(HACK_LIBS)
 
 # The rules for those hacks which follow the `xlockmore' API.
 #
@@ -887,6 +899,9 @@ polyominoes:        polyominoes.o   $(XLOCK_OBJS) $(ERASE)
 thornbird:     thornbird.o     $(XLOCK_OBJS)
        $(CC_HACK) -o $@ $@.o   $(XLOCK_OBJS) $(HACK_LIBS)
 
+pacman:                pacman.o        $(XLOCK_OBJS)
+       $(CC_HACK) -o $@ $@.o   $(XLOCK_OBJS) $(HACK_LIBS)
+
 
 # These are not like the others.
 #
@@ -1183,6 +1198,8 @@ maze.o: ../config.h
 maze.o: $(srcdir)/screenhack.h
 metaballs.o: ../config.h
 metaballs.o: $(srcdir)/screenhack.h
+mismunch.o: ../config.h
+mismunch.o: $(srcdir)/screenhack.h
 moire2.o: ../config.h
 moire2.o: $(srcdir)/screenhack.h
 moire.o: ../config.h
@@ -1206,6 +1223,13 @@ noseguy.o: $(srcdir)/images/noseguy/nose-r1.xpm
 noseguy.o: $(srcdir)/images/noseguy/nose-r2.xpm
 noseguy.o: $(srcdir)/screenhack.h
 noseguy.o: $(srcdir)/xpm-pixmap.h
+pacman.o: ../config.h
+pacman.o: $(srcdir)/pacman_ai.h
+pacman.o: $(srcdir)/pacman.h
+pacman.o: $(srcdir)/pacman_level.h
+pacman.o: $(srcdir)/screenhack.h
+pacman.o: $(srcdir)/xlockmore.h
+pacman.o: $(srcdir)/xlockmoreI.h
 pedal.o: ../config.h
 pedal.o: $(srcdir)/screenhack.h
 penetrate.o: ../config.h
@@ -1314,6 +1338,8 @@ whirlwindwarp.o: ../config.h
 whirlwindwarp.o: $(srcdir)/screenhack.h
 whirlygig.o: ../config.h
 whirlygig.o: $(srcdir)/screenhack.h
+wormhole.o: ../config.h
+wormhole.o: $(srcdir)/screenhack.h
 worm.o: ../config.h
 worm.o: $(srcdir)/screenhack.h
 worm.o: $(srcdir)/xlockmore.h
index 86761b7d3656e8a9d31a57b9f9b8534800725eec..85ced09c9a1a14dd8829e96c9a86d5f8bf6ec0c4 100644 (file)
@@ -51,6 +51,7 @@
   Trevor Blackwell <tlb@tlb.org>
 */
 
+#include <X11/Xlib.h>
 #include <X11/Xutil.h>
 #include <X11/Intrinsic.h>
 #include <assert.h>
@@ -273,30 +274,77 @@ analogtv_configure(analogtv *it)
 {
   int oldwidth=it->usewidth;
   int oldheight=it->useheight;
-  int wlim,hlim,ohlim;
+  int wlim,hlim,height_diff;
 
-  hlim=it->xgwa.height;
-  if (hlim<ANALOGTV_VISLINES) hlim = ANALOGTV_VISLINES;
+  /* If the window is very small, don't let the image we draw get lower
+     than the actual TV resolution (266x200.)
 
+     If the aspect ratio of the window is within 20% of a 4:3 ratio,
+     then scale the image to exactly fill the window.
+
+     Otherwise, center the image either horizontally or vertically,
+     padding on the left+right, or top+bottom, but not both.
+
+     If it's very close (2.5%) to a multiple of VISLINES, make it exact
+     For example, it maps 1024 => 1000.
+   */
+  float percent = 0.20;
+  float min_ratio = 4.0 / 3.0 * (1 - percent);
+  float max_ratio = 4.0 / 3.0 * (1 + percent);
+  float ratio;
+  float height_snap=0.025;
+
+  hlim = it->xgwa.height;
   wlim = it->xgwa.width;
-  if (wlim<300) wlim = 300;
+  ratio = wlim / (float) hlim;
 
-  /* require 3:4 aspect ratio */
-  if (wlim > hlim*4/3) wlim=hlim*4/3;
-  if (hlim > wlim*3/4) hlim=wlim*3/4;
+  if (wlim < 266 || hlim < 200)
+    {
+      wlim = 266;
+      hlim = 200;
+# ifdef DEBUG
+      fprintf (stderr,
+               "size: minimal: %dx%d in %dx%d (%.3f < %.3f < %.3f)\n",
+               wlim, hlim, it->xgwa.width, it->xgwa.height,
+               min_ratio, ratio, max_ratio);
+# endif
+    }
+  else if (ratio > min_ratio && ratio < max_ratio)
+    {
+# ifdef DEBUG
+      fprintf (stderr,
+               "size: close enough: %dx%d (%.3f < %.3f < %.3f)\n",
+               wlim, hlim, min_ratio, ratio, max_ratio);
+# endif
+    }
+  else if (ratio > max_ratio)
+    {
+      wlim = hlim*max_ratio;
+# ifdef DEBUG
+      fprintf (stderr,
+               "size: center H: %dx%d in %dx%d (%.3f < %.3f < %.3f)\n",
+               wlim, hlim, it->xgwa.width, it->xgwa.height,
+               min_ratio, ratio, max_ratio);
+# endif
+    }
+  else /* ratio < min_ratio */
+    {
+      hlim = wlim/min_ratio;
+# ifdef DEBUG
+      fprintf (stderr,
+               "size: center V: %dx%d in %dx%d (%.3f < %.3f < %.3f)\n",
+               wlim, hlim, it->xgwa.width, it->xgwa.height,
+               min_ratio, ratio, max_ratio);
+# endif
+    }
 
-  /* height must be a multiple of VISLINES */
-  ohlim=hlim;
-  hlim = (hlim/ANALOGTV_VISLINES)*ANALOGTV_VISLINES;
 
-  /* Scale width proportionally */
-  wlim=wlim*hlim/ohlim;
+  height_diff = ((hlim + ANALOGTV_VISLINES/2) % ANALOGTV_VISLINES) - ANALOGTV_VISLINES/2;
+  if (height_diff != 0 && fabs(height_diff) < hlim * height_snap)
+    {
+      hlim -= height_diff;
+    }
 
-  {
-    FILE *fp=fopen("/tmp/analogtv.size","w");
-    fprintf(fp,"wlim=%d hlim=%d\n", wlim, hlim);
-    fclose(fp);
-  }
 
   /* Most times this doesn't change */
   if (wlim != oldwidth || hlim != oldheight) {
@@ -766,7 +814,7 @@ analogtv_setup_frame(analogtv *it)
     it->hashnoise_rpm -= 100 + 0.01*it->hashnoise_rpm;
     if (it->hashnoise_rpm<0.0) it->hashnoise_rpm=0.0;
   }
-  if (it->hashnoise_rpm >= 0.0) {
+  if (it->hashnoise_rpm > 0.0) {
     int hni;
     int hnc=it->hashnoise_counter; /* in 24.8 format */
 
@@ -786,7 +834,8 @@ analogtv_setup_frame(analogtv *it)
     hnc -= (ANALOGTV_V * ANALOGTV_H)<<8;
   }
 
-  it->agclevel = 1.0/it->rx_signal_level;
+  if (it->rx_signal_level != 0.0)
+    it->agclevel = 1.0/it->rx_signal_level;
 
 
 #ifdef DEBUG2
@@ -949,6 +998,52 @@ analogtv_level(analogtv *it, int y, int ytop, int ybot)
   return level;
 }
 
+/*
+
+  The point of this stuff is to ensure that when useheight is not a
+  multiple of VISLINES so that TV scan lines map to different numbers
+  of vertical screen pixels, the total brightness of each scan line
+  remains the same.
+  MAX_LINEHEIGHT corresponds to 2400 vertical pixels, beyond which
+  it interpolates extra black lines.
+ */
+enum {MAX_LINEHEIGHT=12};
+static struct {
+  int index;
+  double value;
+} leveltable[MAX_LINEHEIGHT+1][MAX_LINEHEIGHT+1];
+
+static void
+analogtv_setup_levels(analogtv *it, double avgheight)
+{
+  int i,height;
+  static double levelfac[3]={-7.5, 5.5, 24.5};
+
+  for (height=0; height<avgheight+2.0 && height<=MAX_LINEHEIGHT; height++) {
+
+    for (i=0; i<height; i++) {
+      leveltable[height][i].index = 2;
+    }
+    
+    if (avgheight>=3) {
+      leveltable[height][0].index=0;
+    }
+    if (avgheight>=5) {
+      leveltable[height][height-1].index=0;
+    }
+    if (avgheight>=7) {
+      leveltable[height][1].index=1;
+      leveltable[height][height-2].index=1;
+    }
+
+    for (i=0; i<height; i++) {
+      leveltable[height][i].value = 
+        (40.0 + levelfac[leveltable[height][i].index]*puramp(it, 3.0, 6.0, 1.0)) / 256.0;
+    }
+
+  }
+}
+
 static void
 analogtv_blast_imagerow(analogtv *it,
                         float *rgbf, float *rgbf_end,
@@ -961,7 +1056,8 @@ analogtv_blast_imagerow(analogtv *it,
   for (i=0; i<3; i++) level_copyfrom[i]=NULL;
 
   for (y=ytop; y<ybot; y++) {
-    int level=analogtv_level(it, y, ytop, ybot);
+    int level=leveltable[ybot-ytop][y-ytop].index;
+    double levelmult=leveltable[ybot-ytop][y-ytop].value;
     char *rowdata;
 
     rowdata=it->image->data + y*it->image->bytes_per_line;
@@ -978,7 +1074,6 @@ analogtv_blast_imagerow(analogtv *it,
       memcpy(rowdata, level_copyfrom[level], it->image->bytes_per_line);
     }
     else {
-      double levelmult=analogtv_levelmult(it, level);
       level_copyfrom[level] = rowdata;
 
       if (0) {
@@ -1115,6 +1210,8 @@ analogtv_draw(analogtv *it)
   puheight = puramp(it, 2.0, 1.0, 1.3) * it->height_control *
     (1.125 - 0.125*puramp(it, 2.0, 2.0, 1.1));
 
+  analogtv_setup_levels(it, puheight * (double)it->useheight/(double)ANALOGTV_VISLINES);
+
   overall_top=it->useheight;
   overall_bot=0;
 
@@ -1137,6 +1234,8 @@ analogtv_draw(analogtv *it)
     if (ytop<0) ytop=0;
     if (ybot>it->useheight) ybot=it->useheight;
 
+    if (ybot > ytop+MAX_LINEHEIGHT) ybot=ytop+MAX_LINEHEIGHT;
+
     if (ytop < overall_top) overall_top=ytop;
     if (ybot > overall_bot) overall_bot=ybot;
 
@@ -1493,6 +1592,8 @@ analogtv_load_ximage(analogtv *it, analogtv_input *input, XImage *pic_im)
   XColor col1[ANALOGTV_PIC_LEN];
   XColor col2[ANALOGTV_PIC_LEN];
   int multiq[ANALOGTV_PIC_LEN+4];
+  int y_overscan=5; /* overscan this much top and bottom */
+  int y_scanlength=ANALOGTV_VISLINES+2*y_overscan;
 
   img_w=pic_im->width;
   img_h=pic_im->height;
@@ -1503,9 +1604,9 @@ analogtv_load_ximage(analogtv *it, analogtv_input *input, XImage *pic_im)
     multiq[i]=(int)(-cos(3.1415926/180.0*(phase-303)) * 4096.0 * ampl);
   }
 
-  for (y=0; y<ANALOGTV_VISLINES; y++) {
-    int picy1=(y*img_h)/ANALOGTV_VISLINES;
-    int picy2=(y*img_h+ANALOGTV_VISLINES/2)/ANALOGTV_VISLINES;
+  for (y=0; y<y_scanlength; y++) {
+    int picy1=(y*img_h)/y_scanlength;
+    int picy2=(y*img_h + y_scanlength/2)/y_scanlength;
 
     for (x=0; x<ANALOGTV_PIC_LEN; x++) {
       int picx=(x*img_w)/ANALOGTV_PIC_LEN;
@@ -1573,7 +1674,7 @@ analogtv_load_ximage(analogtv *it, analogtv_input *input, XImage *pic_im)
       composite = ((composite*100)>>14) + ANALOGTV_BLACK_LEVEL;
       if (composite>125) composite=125;
       if (composite<0) composite=0;
-      input->signal[y+ANALOGTV_TOP][x+ANALOGTV_PIC_START] = composite;
+      input->signal[y-y_overscan+ANALOGTV_TOP][x+ANALOGTV_PIC_START] = composite;
     }
   }
 
@@ -2104,9 +2205,15 @@ analogtv_handle_events (analogtv *it)
           {
             KeySym keysym;
             char c = 0;
-            XLookupString (&event.xkey, &c, 1, &keysym, 0);
-            if (c == ' ' || c == '\t' || c == '\r' || c == '\n')
-              return 1;
+
+            if (it->key_handler) {
+              if (it->key_handler (it->dpy, &event, it->key_data))
+                return 1;
+            } else {
+              XLookupString (&event.xkey, &c, 1, &keysym, 0);
+              if (c == ' ' || c == '\t' || c == '\r' || c == '\n')
+                return 1;
+            }
           }
           break;
 
index ff9e8db2d6b8bb8942e5298c9ee2ede36a1ef228..2a76db0fa500032bc431e96ddfe7a0bab72cd32f 100644 (file)
@@ -163,6 +163,8 @@ typedef struct analogtv_s {
   int screen_xo,screen_yo; /* centers image in window */
 
   void (*event_handler)(Display *dpy, XEvent *event);
+  int (*key_handler)(Display *dpy, XEvent *event,void *key_data);
+  void *key_data;
 
   int flutter_horiz_desync;
   int flutter_tint;
index d7d07266594f114e5b25ca71c6f2b1021b4d112e..9fc750a577b17486c69dc7f847c81616e84d9b6f 100644 (file)
@@ -102,11 +102,11 @@ static XrmOptionDescRec opts[] =
 };
 static argtype vars[] =
 {
-       {(caddr_t *) & neighbors, (char *) "neighbors", (char *) "Neighbors", (char *) DEF_NEIGHBORS, t_Int},
-       {(caddr_t *) & truchet, (char *) "truchet", (char *) "Truchet", (char *) DEF_TRUCHET, t_Bool},
-       {(caddr_t *) & eyes, (char *) "eyes", (char *) "Eyes", (char *) DEF_EYES, t_Bool},
-   {(caddr_t *) & sharpturn, (char *) "sharpturn", (char *) "SharpTurn", (char *) DEF_SHARPTURN, t_Bool},
-       {(caddr_t *) & neighbors, "neighbors", "Neighbors", DEF_NEIGHBORS, t_Int}
+       {&neighbors, "neighbors", "Neighbors", DEF_NEIGHBORS, t_Int},
+       {&truchet,   "truchet",   "Truchet",   DEF_TRUCHET,   t_Bool},
+       {&eyes,      "eyes",      "Eyes",      DEF_EYES,      t_Bool},
+       {&sharpturn, "sharpturn", "SharpTurn", DEF_SHARPTURN, t_Bool},
+       {&neighbors, "neighbors", "Neighbors", DEF_NEIGHBORS, t_Int}
 };
 static OptionStruct desc[] =
 {
index 0c1888acd4c834d5d84ae6f3a16a3ceec040f1ef..838f81fd73c4acf86cd073f06615b020f51be000 100644 (file)
@@ -97,8 +97,8 @@ static XrmOptionDescRec opts[] =
 };
 static argtype vars[] =
 {
-       {(caddr_t *) & altgeom, (char *) "altgeom", (char *) "AltGeom", (char *) DEF_ALTGEOM, t_Bool},
-       {(caddr_t *) & label, (char *) "label", (char *) "Label", (char *) DEF_LABEL, t_Bool},
+       {&altgeom, "altgeom", "AltGeom", DEF_ALTGEOM, t_Bool},
+       {&label,   "label",   "Label",   DEF_LABEL,   t_Bool},
 };
 static OptionStruct desc[] =
 {
index ae38787f9856b0912b7b7e6b347595e9dd215333..95078befdcfb9681c135bdc328f3a7f11808e023 100644 (file)
@@ -1,4 +1,4 @@
-/* xscreensaver, Copyright (c) 1998-2003 Jamie Zawinski <jwz@jwz.org>
+/* xscreensaver, Copyright (c) 1998-2004 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
  *
  * Apple ][ CRT simulator, by Trevor Blackwell <tlb@tlb.org>
  * with additional work by Jamie Zawinski <jwz@jwz.org>
+ * Pty and vt100 emulation by Fredrik Tolf <fredrik@dolda2000.com>
  */
 
 #include <math.h>
+#include <ctype.h>
 #include "screenhack.h"
 #include "apple2.h"
 #include <X11/Xutil.h>
 #include <X11/Intrinsic.h>
-#include <ctype.h>
+
+#define XK_MISCELLANY
+#include <X11/keysymdef.h>
+
+#ifdef HAVE_FORKPTY
+# include <pty.h>
+#endif /* HAVE_FORKPTY */
 
 #undef countof
 #define countof(x) (sizeof((x))/sizeof((*x)))
 
+#define SCREEN_COLS 40
+#define SCREEN_ROWS 24
+
 #define DEBUG
 
 extern XtAppContext app;
@@ -552,18 +563,36 @@ load_image (Display *dpy, Window window, char **image_filename_r)
 char *progclass = "Apple2";
 
 char *defaults [] = {
+  ".background:                   black",
+  ".foreground:                   white",
   "*mode:                 random",
   "*duration:             20",
+  "*metaSendsESC:         True",
+  "*swapBSDEL:            True",
+  "*fast:                 False",
+# ifdef HAVE_FORKPTY
+  "*usePty:                True",
+#else
+  "*usePty:                False",
+# endif /* !HAVE_FORKPTY */
+
   ANALOGTV_DEFAULTS
   0
 };
 
 XrmOptionDescRec options [] = {
-  { "-slideshow",      ".mode",                XrmoptionNoArg, "slideshow" },
-  { "-basic",          ".mode",                XrmoptionNoArg, "basic" },
-  { "-text",           ".mode",                XrmoptionNoArg, "text" },
+  { "-slideshow",      ".mode",                XrmoptionNoArg,  "slideshow" },
+  { "-basic",          ".mode",                XrmoptionNoArg,  "basic" },
+  { "-text",           ".mode",                XrmoptionNoArg,  "text" },
   { "-program",                ".program",             XrmoptionSepArg, 0 },
   { "-duration",       ".duration",            XrmoptionSepArg, 0 },
+  { "-pty",            ".usePty",              XrmoptionNoArg,  "True"  },
+  { "-pipe",           ".usePty",              XrmoptionNoArg,  "False" },
+  { "-meta",           ".metaSendsESC",        XrmoptionNoArg,  "False" },
+  { "-esc",            ".metaSendsESC",        XrmoptionNoArg,  "True"  },
+  { "-bs",             ".swapBSDEL",           XrmoptionNoArg,  "False" },
+  { "-del",            ".swapBSDEL",           XrmoptionNoArg,  "True"  },
+  { "-fast",           ".fast",                XrmoptionNoArg,  "True"  },
   ANALOGTV_OPTIONS
   { 0, 0, 0, 0 }
 };
@@ -719,15 +748,37 @@ void slideshow_controller(apple2_sim_t *sim, int *stepno,
   }
 }
 
+#define NPAR 16
+
 struct terminal_controller_data {
   FILE *pipe;
   int pipe_id;
+  pid_t pid;
   int input_available_p;
   XtIntervalId timeout_id;
   char curword[256];
   unsigned char lastc;
   int fake_nl;
   double last_emit_time;
+  XComposeStatus compose;
+
+  int escstate;
+  int csiparam[NPAR];
+  int curparam;
+  int cursor_x, cursor_y;
+  int saved_x,  saved_y;
+  union {
+    struct {
+      unsigned int bold : 1;
+      unsigned int blink : 1;
+      unsigned int rev : 1;
+    } bf;
+    int w;
+  } termattrib;
+  Bool meta_sends_esc_p;
+  Bool swap_bs_del_p;
+  Bool fast_p;
+
 };
 
 static void
@@ -741,6 +792,7 @@ subproc_cb (XtPointer closure, int *source, XtInputId *id)
 static void
 launch_text_generator (struct terminal_controller_data *mine)
 {
+  char buf[255];
   char *oprogram = get_string_resource ("program", "Program");
   char *program;
 
@@ -754,6 +806,48 @@ launch_text_generator (struct terminal_controller_data *mine)
   strcat (program, " ) 2>&1");
 
   if (mine->pipe) abort();
+
+# ifdef HAVE_FORKPTY
+  if (get_boolean_resource ("usePty", "Boolean"))
+    {
+      int fd;
+      struct winsize ws;
+
+      ws.ws_col = SCREEN_COLS;
+      ws.ws_row = SCREEN_ROWS;
+      ws.ws_xpixel = ws.ws_col * 6;
+      ws.ws_ypixel = ws.ws_row * 8;
+      
+      mine->pipe = NULL;
+      if((mine->pid = forkpty(&fd, NULL, NULL, &ws)) < 0)
+       {
+          /* Unable to fork */
+          sprintf (buf, "%.100s: forkpty", progname);
+         perror(buf);
+       }
+      else if(!mine->pid)
+       {
+          /* This is the child fork. */
+         if (putenv("TERM=vt100"))
+            abort();
+         execl("/bin/sh", "/bin/sh", "-c", oprogram, NULL);
+          sprintf (buf, "%.100s: %.100s", progname, oprogram);
+         perror(buf);
+         exit(1);
+       }
+      else
+       {
+          /* This is the parent fork. */
+         mine->pipe = fdopen(fd, "r+");
+         mine->pipe_id =
+           XtAppAddInput (app, fileno (mine->pipe),
+                          (XtPointer) (XtInputReadMask | XtInputExceptMask),
+                          subproc_cb, (XtPointer) mine);
+       }
+    }
+  else
+# endif /* HAVE_FORKPTY */
+
   if ((mine->pipe = popen (program, "r")))
     {
       if (mine->pipe_id) abort();
@@ -764,7 +858,8 @@ launch_text_generator (struct terminal_controller_data *mine)
     }
   else
     {
-      perror (program);
+      sprintf (buf, "%.100s: %.100s", progname, program);
+      perror(buf);
     }
 }
 
@@ -830,6 +925,480 @@ terminal_read(struct terminal_controller_data *mine, unsigned char *buf, int n)
 }
 
 
+/* The interpretation of the ModN modifiers is dependent on what keys
+   are bound to them: Mod1 does not necessarily mean "meta".  It only
+   means "meta" if Meta_L or Meta_R are bound to it.  If Meta_L is on
+   Mod5, then Mod5 is the one that means Meta.  Oh, and Meta and Alt
+   aren't necessarily the same thing.  Icepicks in my forehead!
+ */
+static unsigned int
+do_icccm_meta_key_stupidity (Display *dpy)
+{
+  unsigned int modbits = 0;
+  int i, j, k;
+  XModifierKeymap *modmap = XGetModifierMapping (dpy);
+  for (i = 3; i < 8; i++)
+    for (j = 0; j < modmap->max_keypermod; j++)
+      {
+        int code = modmap->modifiermap[i * modmap->max_keypermod + j];
+        KeySym *syms;
+        int nsyms = 0;
+        if (code == 0) continue;
+        syms = XGetKeyboardMapping (dpy, code, 1, &nsyms);
+        for (k = 0; k < nsyms; k++)
+          if (syms[k] == XK_Meta_L || syms[k] == XK_Meta_R ||
+              syms[k] == XK_Alt_L  || syms[k] == XK_Alt_R)
+            modbits |= (1 << i);
+        XFree (syms);
+      }
+  XFreeModifiermap (modmap);
+  return modbits;
+}
+
+/* Returns a mask of the bit or bits of a KeyPress event that mean "meta". 
+ */
+static unsigned int
+meta_modifier (Display *dpy)
+{
+  static Bool done_once = False;
+  static unsigned int mask = 0;
+  if (!done_once)
+    {
+      /* Really, we are supposed to recompute this if a KeymapNotify
+         event comes in, but fuck it. */
+      done_once = True;
+      mask = do_icccm_meta_key_stupidity (dpy);
+    }
+  return mask;
+}
+
+
+static int
+terminal_keypress_handler (Display *dpy, XEvent *event, void *data)
+{
+  struct terminal_controller_data *mine =
+    (struct terminal_controller_data *) data;
+  KeySym keysym;
+  unsigned char c = 0;
+  XLookupString (&event->xkey, (char *) &c, 1, &keysym, &mine->compose);
+  if (c == 0 || !mine->pipe)
+    return 0;
+
+  if (!mine->swap_bs_del_p) ;
+  else if (c == 127) c = 8;
+  else if (c == 8)   c = 127;
+
+  /* If meta was held down, send ESC, or turn on the high bit. */
+  if (event->xkey.state & meta_modifier (dpy))
+    {
+      if (mine->meta_sends_esc_p)
+        fputc ('\033', mine->pipe);
+      else
+        c |= 0x80;
+    }
+
+  fputc (c, mine->pipe);
+  fflush (mine->pipe);
+
+  event->xany.type = 0;  /* do not process this event further */
+
+  return 0;
+}
+
+
+static void
+a2_ascii_printc (apple2_state_t *st, unsigned char c,
+                 Bool bold_p, Bool blink_p, Bool rev_p,
+                 Bool scroll_p)
+{
+  if (c >= 'a' && c <= 'z')            /* upcase lower-case chars */
+    {
+      c &= 0xDF;
+    }
+  else if ((c >= 'A'+128) ||                    /* upcase and blink */
+           (c < ' ' && c != 014 &&              /* high-bit & ctl chrs */
+            c != '\r' && c != '\n' && c!='\t'))
+    {
+      c = (c & 0x1F) | 0x80;
+    }
+  else if (c >= 'A' && c <= 'Z')            /* invert upper-case chars */
+    {
+      c |= 0x80;
+    }
+
+  if (bold_p)  c |= 0xc0;
+  if (blink_p) c = (c & ~0x40) | 0x80;
+  if (rev_p)   c |= 0xc0;
+
+  if (scroll_p)
+    a2_printc(st, c);
+  else
+    a2_printc_noscroll(st, c);
+}
+
+
+static void
+a2_vt100_printc (apple2_sim_t *sim, struct terminal_controller_data *state,
+                 unsigned char c)
+{
+  apple2_state_t *st=sim->st;
+  int cols = SCREEN_COLS;
+  int rows = SCREEN_ROWS;
+
+  int i;
+  int start, end;
+
+  switch (state->escstate)
+    {
+    case 0:
+      switch (c)
+        {
+        case 7: /* BEL */
+          /* Dummy case - we don't want the screensaver to beep */
+          /* #### But maybe this should flash the screen? */
+          break;
+        case 8: /* BS */
+          if (state->cursor_x > 0)
+            state->cursor_x--;
+          break;
+        case 9: /* HT */
+          if (state->cursor_x < cols - 8)
+            {
+              state->cursor_x = (state->cursor_x & ~7) + 8;
+            }
+          else
+            {
+              state->cursor_x = 0;
+              if (state->cursor_y < rows - 1)
+                state->cursor_y++;
+              else
+                a2_scroll (st);
+            }
+          break;
+        case 10: /* LF */
+        case 11: /* VT */
+        case 12: /* FF */
+          if (state->cursor_y < rows - 1)
+            state->cursor_y++;
+          else
+            a2_scroll (st);
+          break;
+        case 13: /* CR */
+          state->cursor_x = 0;
+          break;
+        case 14: /* SO */
+        case 15: /* SI */
+          /* Dummy case - there is one and only one font. */
+          break;
+        case 24: /* CAN */
+        case 26: /* SUB */
+          /* Dummy case - these interrupt escape sequences, so
+             they don't do anything in this state */
+          break;
+        case 27: /* ESC */
+          state->escstate = 1;
+          break;
+        case 127: /* DEL */
+          /* Dummy case - this is supposed to be ignored */
+          break;
+        case 155: /* CSI */
+          state->escstate = 2;
+          for(i = 0; i < NPAR; i++)
+            state->csiparam[i] = 0;
+          state->curparam = 0;
+          break;
+        default:
+          /* If the cursor is in column 39 and we print a character, then
+             that character shows up in column 39, and the cursor is no longer
+             visible on the screen (it's in "column 40".)  If another character
+             is printed, then that character shows up in column 0, and the
+             cursor moves to column 1.
+
+             This is empirically what xterm and gnome-terminal do, so that must
+             be the right thing.  (In xterm, the cursor vanishes, whereas; in
+             gnome-terminal, the cursor overprints the character in col 39.)
+           */
+          if (state->cursor_x >= cols)
+            {
+              state->cursor_x = 0;
+              if (state->cursor_y >= rows - 1)
+                a2_scroll (st);
+              else
+                state->cursor_y++;
+            }
+
+          a2_goto(st, state->cursor_y, state->cursor_x);  /* clips range */
+          a2_ascii_printc (st, c,
+                           state->termattrib.bf.bold,
+                           state->termattrib.bf.blink,
+                           state->termattrib.bf.rev,
+                           False);
+          state->cursor_x++;
+
+          break;
+        }
+      break;
+    case 1:
+      switch (c)
+        {
+        case 24: /* CAN */
+        case 26: /* SUB */
+          state->escstate = 0;
+          break;
+        case 'c': /* Reset */
+          a2_cls(st);
+          state->escstate = 0;
+          break;
+        case 'D': /* Linefeed */
+          if (state->cursor_y < rows - 1)
+            state->cursor_y++;
+          else
+            a2_scroll (st);
+          state->escstate = 0;
+          break;
+        case 'E': /* Newline */
+          state->cursor_x = 0;
+          state->escstate = 0;
+          break;
+        case 'M': /* Reverse newline */
+          if (state->cursor_y > 0)
+            state->cursor_y--;
+          state->escstate = 0;
+          break;
+        case '7': /* Save state */
+          state->saved_x = state->cursor_x;
+          state->saved_y = state->cursor_y;
+          state->escstate = 0;
+          break;
+        case '8': /* Restore state */
+          state->cursor_x = state->saved_x;
+          state->cursor_y = state->saved_y;
+          state->escstate = 0;
+          break;
+        case '[': /* CSI */
+          state->escstate = 2;
+          for(i = 0; i < NPAR; i++)
+            state->csiparam[i] = 0;
+          state->curparam = 0;
+          break;
+        case '%': /* Select charset */
+          /* No, I don't support UTF-8, since the apple2 font
+             isn't even Unicode anyway. We must still catch the
+             last byte, though. */
+        case '(':
+        case ')':
+          /* I don't support different fonts either - see above
+             for SO and SI */
+          state->escstate = 3;
+          break;
+        default:
+          /* Escape sequences not supported:
+           * 
+           * H - Set tab stop
+           * Z - Terminal identification
+           * > - Keypad change
+           * = - Other keypad change
+           * ] - OS command
+           */
+          state->escstate = 0;
+          break;
+        }
+      break;
+    case 2:
+      switch (c)
+        {
+        case 24: /* CAN */
+        case 26: /* SUB */
+          state->escstate = 0;
+          break;
+        case '0': case '1': case '2': case '3': case '4':
+        case '5': case '6': case '7': case '8': case '9':
+          if (state->curparam < NPAR)
+            state->csiparam[state->curparam] =
+              (state->csiparam[state->curparam] * 10) + (c - '0');
+          break;
+        case ';':
+          state->csiparam[++state->curparam] = 0;
+          break;
+        case '[':
+          state->escstate = 3;
+          break;
+        case '@':
+          for (i = 0; i < state->csiparam[0]; i++)
+            {
+              if(++state->cursor_x > cols)
+                {
+                  state->cursor_x = 0;
+                  if (state->cursor_y < rows - 1)
+                    state->cursor_y++;
+                  else
+                    a2_scroll (st);
+                }
+            }
+          state->escstate = 0;
+          break;
+        case 'F':
+          state->cursor_x = 0;
+        case 'A':
+          if (state->csiparam[0] == 0)
+            state->csiparam[0] = 1;
+          if ((state->cursor_y -= state->csiparam[0]) < 0)
+            state->cursor_y = 0;
+          state->escstate = 0;
+          break;
+        case 'E':
+          state->cursor_x = 0;
+        case 'e':
+        case 'B':
+          if (state->csiparam[0] == 0)
+            state->csiparam[0] = 1;
+          if ((state->cursor_y += state->csiparam[0]) >= rows)
+            state->cursor_y = rows - 1;
+          state->escstate = 0;
+          break;
+        case 'a':
+        case 'C':
+          if (state->csiparam[0] == 0)
+            state->csiparam[0] = 1;
+          if ((state->cursor_x += state->csiparam[0]) >= cols)
+            state->cursor_x = cols - 1;
+          state->escstate = 0;
+          break;
+        case 'D':
+          if (state->csiparam[0] == 0)
+            state->csiparam[0] = 1;
+          if ((state->cursor_x -= state->csiparam[0]) < 0)
+            state->cursor_x = 0;
+          state->escstate = 0;
+          break;
+        case 'd':
+          if ((state->cursor_y = (state->csiparam[0] - 1)) >= rows)
+            state->cursor_y = rows - 1;
+          state->escstate = 0;
+          break;
+        case '`':
+        case 'G':
+          if ((state->cursor_x = (state->csiparam[0] - 1)) >= cols)
+            state->cursor_x = cols - 1;
+          state->escstate = 0;
+          break;
+        case 'f':
+        case 'H':
+          if ((state->cursor_y = (state->csiparam[0] - 1)) >= rows)
+            state->cursor_y = rows - 1;
+          if ((state->cursor_x = (state->csiparam[1] - 1)) >= cols)
+            state->cursor_x = cols - 1;
+          if(state->cursor_y < 0)
+            state->cursor_y = 0;
+          if(state->cursor_x < 0)
+            state->cursor_x = 0;
+          state->escstate = 0;
+          break;
+        case 'J':
+          start = 0;
+          end = rows * cols;
+          if (state->csiparam[0] == 0)
+            start = cols * state->cursor_y + state->cursor_x;
+          if (state->csiparam[0] == 1)
+            end = cols * state->cursor_y + state->cursor_x;
+
+          a2_goto(st, state->cursor_y, state->cursor_x);
+          for (i = start; i < end; i++)
+            {
+              a2_ascii_printc(st, ' ', False, False, False, False);
+            }
+          state->escstate = 0;
+          break;
+        case 'K':
+          start = 0;
+          end = cols;
+          if (state->csiparam[0] == 0)
+            start = state->cursor_x;
+          if (state->csiparam[1] == 1)
+            end = state->cursor_x;
+
+          a2_goto(st, state->cursor_y, state->cursor_x);
+          for (i = start; i < end; i++)
+            {
+              a2_ascii_printc(st, ' ', False, False, False, False);
+            }
+          state->escstate = 0;
+          break;
+        case 'm': /* Set attributes */
+          for (i = 0; i <= state->curparam; i++)
+            {
+              switch(state->csiparam[i])
+                {
+                case 0:
+                  state->termattrib.w = 0;
+                  break;
+                case 1:
+                  state->termattrib.bf.bold = 1;
+                  break;
+                case 5:
+                  state->termattrib.bf.blink = 1;
+                  break;
+                case 7:
+                  state->termattrib.bf.rev = 1;
+                  break;
+                case 21:
+                case 22:
+                  state->termattrib.bf.bold = 0;
+                  break;
+                case 25:
+                  state->termattrib.bf.blink = 0;
+                  break;
+                case 27:
+                  state->termattrib.bf.rev = 0;
+                  break;
+                }
+            }
+          state->escstate = 0;
+          break;
+        case 's': /* Save position */
+          state->saved_x = state->cursor_x;
+          state->saved_y = state->cursor_y;
+          state->escstate = 0;
+          break;
+        case 'u': /* Restore position */
+          state->cursor_x = state->saved_x;
+          state->cursor_y = state->saved_y;
+          state->escstate = 0;
+          break;
+        case '?': /* DEC Private modes */
+          if ((state->curparam != 0) || (state->csiparam[0] != 0))
+            state->escstate = 0;
+          break;
+        default:
+          /* Known unsupported CSIs:
+           *
+           * L - Insert blank lines
+           * M - Delete lines (I don't know what this means...)
+           * P - Delete characters
+           * X - Erase characters (difference with P being...?)
+           * c - Terminal identification
+           * g - Clear tab stop(s)
+           * h - Set mode (Mainly due to its complexity and lack of good
+           docs)
+           * l - Clear mode
+           * m - Set mode (Phosphor is, per defenition, green on black)
+           * n - Status report
+           * q - Set keyboard LEDs
+           * r - Set scrolling region (too exhausting - noone uses this,
+           right?)
+          */
+          state->escstate = 0;
+          break;
+        }
+      break;
+    case 3:
+      state->escstate = 0;
+      break;
+    }
+  a2_goto(st, state->cursor_y, state->cursor_x);
+}
+
+
 /*
   It's fun to put things like "gdb" as the command. For one, it's
   amusing how the standard mumble (version, no warranty, it's
@@ -848,6 +1417,13 @@ terminal_controller(apple2_sim_t *sim, int *stepno, double *next_actiontime)
     sim->controller_data=calloc(sizeof(struct terminal_controller_data),1);
   mine=(struct terminal_controller_data *) sim->controller_data;
 
+  mine->meta_sends_esc_p = get_boolean_resource ("metaSendsESC", "Boolean");
+  mine->swap_bs_del_p    = get_boolean_resource ("swapBSDEL",    "Boolean");
+  mine->fast_p           = get_boolean_resource ("fast",         "Boolean");
+
+  sim->dec->key_handler = terminal_keypress_handler;
+  sim->dec->key_data = mine;
+
   switch(*stepno) {
 
   case 0:
@@ -858,17 +1434,19 @@ terminal_controller(apple2_sim_t *sim, int *stepno, double *next_actiontime)
     a2_goto(st,0,16);
     a2_prints(st, "APPLE ][");
     a2_goto(st,2,0);
+    mine->cursor_y = 2;
 
     if (! mine->pipe)
       launch_text_generator(mine);
 
-    *next_actiontime += 4.0;
+    if (! mine->fast_p)
+      *next_actiontime += 4.0;
     *stepno = 10;
     break;
 
   case 10:
     {
-      unsigned char buf[5];
+      unsigned char buf[1024];
       int nr,nwant;
       double elapsed;
 
@@ -879,28 +1457,17 @@ terminal_controller(apple2_sim_t *sim, int *stepno, double *next_actiontime)
       if (nwant<1) nwant=1;
       if (nwant>4) nwant=4;
 
+      if (mine->fast_p)
+        nwant = sizeof(buf)-1;
+
       nr=terminal_read(mine, buf, nwant);
       for (i=0; i<nr; i++) {
         c=buf[i];
-        if (c < 0)
-          ;
-        else if (c >= 'a' && c <= 'z')            /* upcase lower-case chars */
-          {
-            a2_printc(st, c&0xDF);
-          }
-        else if ((c >= 'A'+128) ||                    /* upcase and blink */
-                 (c < ' ' && c != 014 &&              /* high-bit & ctl chrs */
-                  c != '\r' && c != '\n' && c!='\t'))
-          {
-            a2_printc(st, (c & 0x1F) | 0x80);
-          }
-        else if (c >= 'A' && c <= 'Z')            /* invert upper-case chars */
-          {
-            a2_printc(st, c | 0x80);
-          }
-        else {
-          a2_printc(st, c);
-        }
+
+        if (mine->pid)
+          a2_vt100_printc (sim, mine, c);
+        else
+          a2_ascii_printc (st, c, False, False, False, True);
       }
     }
     break;
index 184ff68fc184b4a4eb6e33ed5a6ea09d9f71f7a7..c2b3e652d3415d8f728ecfff62c72c036a707c0a 100644 (file)
@@ -71,14 +71,16 @@ void
 a2_scroll(apple2_state_t *st)
 {
   int i;
+  st->textlines[st->cursy][st->cursx] ^= 0xc0;     /* turn off cursor */
   for (i=0; i<23; i++) {
     memcpy(st->textlines[i],st->textlines[i+1],40);
   }
   memset(st->textlines[23],0xe0,40);
+  st->textlines[st->cursy][st->cursx] ^= 0xc0;     /* turn cursor back on */
 }
 
-void
-a2_printc(apple2_state_t *st, char c)
+static void
+a2_printc_1(apple2_state_t *st, char c, int scroll_p)
 {
   st->textlines[st->cursy][st->cursx] |= 0xc0; /* turn off blink */
 
@@ -86,7 +88,8 @@ a2_printc(apple2_state_t *st, char c)
     {
       if (st->cursy==23)
         {
-          a2_scroll(st);
+          if (scroll_p)
+            a2_scroll(st);
         }
       else
         {
@@ -118,7 +121,8 @@ a2_printc(apple2_state_t *st, char c)
       st->cursx++;
       if (st->cursx==40) {
         if (st->cursy==23) {
-          a2_scroll(st);
+          if (scroll_p)
+            a2_scroll(st);
         } else {
           st->cursy++;
         }
@@ -129,6 +133,19 @@ a2_printc(apple2_state_t *st, char c)
   st->textlines[st->cursy][st->cursx] &= 0x7f; /* turn on blink */
 }
 
+void
+a2_printc(apple2_state_t *st, char c)
+{
+  a2_printc_1(st, c, 1);
+}
+
+void
+a2_printc_noscroll(apple2_state_t *st, char c)
+{
+  a2_printc_1(st, c, 0);
+}
+
+
 void
 a2_prints(apple2_state_t *st, char *s)
 {
@@ -138,6 +155,8 @@ a2_prints(apple2_state_t *st, char *s)
 void
 a2_goto(apple2_state_t *st, int r, int c)
 {
+  if (r > 23) r = 23;
+  if (c > 39) r = 39;
   st->textlines[st->cursy][st->cursx] |= 0xc0; /* turn off blink */
   st->cursy=r;
   st->cursx=c;
index f445b3fe7a1816ce4e5a644e2238b50f2ba4b773..27202fc280c137d38fea7d01f08d8e6678e6fdf9 100644 (file)
@@ -94,6 +94,7 @@ void a2_add_disk_item(apple2_state_t *st, char *name, u_char *data,
                       int len, char type);
 void a2_scroll(apple2_state_t *st);
 void a2_printc(apple2_state_t *st, char c);
+void a2_printc_noscroll(apple2_state_t *st, char c);
 void a2_prints(apple2_state_t *st, char *s);
 void a2_goto(apple2_state_t *st, int r, int c);
 void a2_cls(apple2_state_t *st);
index a14400c35322784e7c9ca1d09d4d2c541104b4ee..e29cd23936707eaceb65e5eae873f4a62d16964d 100644 (file)
@@ -20,7 +20,8 @@ apple2 - Apple ][ display emulator
 [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install]
 [\-visual \fIvisual\fP] [\-delay \fIseconds\fP]
 [\-program \fIcommand to run\fP]
-[\-text] [\-slideshow] [\-basic]
+[\-basic] [\-slideshow] [\-text]
+[\-meta] [\-esc] [\-bs] [\-del] [\-fast]
 .SH DESCRIPTION
 The
 .I apple2 
@@ -28,20 +29,22 @@ program simulates an original Apple ][ Plus computer in all its 1979
 glory. It also reproduces the appearance of display on a color
 television set of the period.
 .PP
-There are 3 modes: text, slideshow, and basic. Normally it chooses a
-mode randomly, but you can override with the \fI\-text\fP,
-\fI\-slideshow\fP, or \fI\-basic\fP options.
-.PP
-In text mode it displays the output of a command (by default your
-system's fortune program, but can be overridden with -program).
-.PP
+There are 3 modes: basic, slideshow, and text. Normally it chooses a
+mode randomly, but you can override with the \fI\-basic\fP,
+\fI\-slideshow\fP, or \fI\-text\fP options.
+
+In basic mode a simulated user types in a Basic program and runs it.
+
 In slideshow mode it chooses a number of images from the image source
 you configured into XScreenSaver and displays them within the
 limitations of the Apple ][ display hardware. With only 6 available
 colors, you can only make out the general shape of the pictures.
-.PP
-In basic mode a simulated user types in a Basic program and runs it.
 
+In text mode it displays the output of a command (by default your
+system's fortune program, but can be overridden with \fI\-program\fP).
+
+In text mode, it is also a fully functional (if anachronistic)
+vt100 terminal emulator.
 .SH OPTIONS
 .I apple2
 accepts the following options:
@@ -65,14 +68,14 @@ or the id number (decimal or hex) of a specific visual.
 .B \-delay \fIdelay\fP
 The delay between displaying one crash and another.
 .TP 8
-.B \-text
-Choose text mode
+.B \-basic
+Choose basic mode
 .TP 8
 .B \-slideshow
 Choose slideshow mode
 .TP 8
-.B \-basic
-Choose basic mode
+.B \-text
+Choose text mode
 .TP 8
 .B \-program \fIsh-command\fP
 In text mode, the command to run to generate the text to display. This
@@ -82,25 +85,69 @@ run at the end of a pipe, and any characters that it prints to
 exits, it will be launched again after 3 seconds.  Default:
 .BR fortune (1).
 
-Note that apple2 is \fInot\fP a terminal emulator: programs that try
-to directly address the screen will not do what you might expect. It
-merely draws the characters on the screen left to right, top to
-bottom. Lines wrap when they reach the right edge, and the screen
-scrolls when characters reach the bottom.
-
-In other words, programs like
-.BR fortune (1)
-will work, but programs like
-.BR top (1)
-won't.
+In text mode, \fIapple2\fP emulates a vt100 terminal running on a 40x24
+uppercase-only screen.
 
 For example:
 .EX
-apple2 -text -program 'cat /usr/src/linux*/README | fold -sw40'
+apple2 -text \\
+       -program 'cat /usr/src/linux*/README | fold -sw40'
 apple2 -text -program 'ping apple.com'
 apple2 -text -program 'ps -e'
 apple2 -text -program 'od -txCz -w7 /dev/random'
+apple2 -text -fast -program 'xemacs -nw -q -f life'
+apple2 -text -fast \\
+       -program 'xemacs -nw -q --eval "(hanoi 5)"'
+.EE
+You can also use \fIapple2\fP as an extremely lo-fi replacement for the
+.BR xterm (1)
+and
+.BR gnome-terminal (1)
+terminal emulators:
+.EX
+apple2 -fast -program tcsh
 .EE
+.TP 8
+.B \-pty
+In \fI\-text\fP mode, launch the sub-program under a pty so that it
+can address the screen directly.  This is the default.
+.TP 8
+.B \-pipe
+In \fI\-text\fP mode, launch the sub-program at the end of a pipe: 
+do not let it address the screen directly.
+.TP 8
+.B \-esc
+When the user types a key with the Alt or Meta keys held down, send an
+ESC character first.  This is the default.
+.TP 8
+.B \-meta
+When Meta or Alt are held down, set the high bit on the character instead.
+.TP 8
+.B \-del
+Swap Backspace and Delete.  This is the default.
+.TP 8
+.B \-bs
+Do not swap Backspace and Delete.
+.TP 8
+.B \-fast
+Normally, characters are printed at the speed of an original Apple][
+computer; however, when using this program as a terminal emulator,
+the novelty of those 300 baud characters might wear off.  You can use
+the \fI\-fast\fP option to speed things up a bit.
+.SH TERMINAL EMULATION
+By default, \fIapple2\fP allocates a pseudo-tty for the \fI\-text\fP-mode
+sub-process to run under.  This has the desirable side effect that the
+program will be able to use
+.BR ioctl (2)
+to fetch information about terminal parameters and window size, which
+many programs (such as
+.BR top (1))
+need to run properly. \fIapple2\fP will also set the environment
+variable \fITERM\fP to \fIvt100\fP in the child process.
+
+Any characters typed on the apple2 window will be passed along to
+the sub-process.  (Note that this only works when running in "window"
+mode, not when running in \fI\-root\fP mode under xscreensaver.)
 .SH ENVIRONMENT
 .PP
 .TP 8
@@ -110,6 +157,9 @@ to get the default host and display number.
 .B XENVIRONMENT
 to get the name of a resource file that overrides the global resources
 stored in the RESOURCE_MANAGER property.
+.TP 8
+.B TERM
+to inform the sub-process of the type of terminal emulation.
 .SH X RESOURCES
 Notable X resources supported include the following which correspond
 to standard TV controls:
@@ -134,7 +184,8 @@ Apple ][ and Applesoft are trademarks of Apple Computer.
 .BR webcollage (1),
 .BR driftnet (1)
 .BR EtherPEG ,
-.BR EtherPeek
+.BR EtherPeek ,
+.BR console_codes (4).
 .SH COPYRIGHT
 Copyright \(co 2002-2003 by Trevor Blackwell.  Permission to use, copy,
 modify, distribute, and sell this software and its documentation for
@@ -147,3 +198,4 @@ warranty.
 .SH AUTHOR
 Television and Apple ][ emulation by Trevor Blackwell <tlb@tlb.org>.
 Slideshow and text mode by Jamie Zawinski <jwz@jwz.org>.
+Pty and vt100 emulation by Fredrik Tolf <fredrik@dolda2000.com>.
index 84f5f312a1a1a47f4fa4039b0bcc361069febc34..32877b8bccb0451f5c993894912cf09288ea4174 100644 (file)
@@ -314,9 +314,9 @@ windows (Display *dpy, Window window, int delay, int which)
       "with the manufacturer for driver updates. Try changing video\n"
       "adapters.\n"
       "\n"
-      "Check with you hardware vendor for any BIOS updates. Disable\n"
+      "Check with your hardware vendor for any BIOS updates. Disable\n"
       "BIOS memory options such as caching or shadowing. If you need\n"
-      "to use Safe Mode to remove or disable compinents, restart your\n"
+      "to use Safe Mode to remove or disable components, restart your\n"
       "computer, press F8 to select Advanced Startup Options, and then\n"
       "select Safe Mode.\n"
       "\n"
@@ -1735,7 +1735,7 @@ sparc_solaris (Display* dpy, Window window, int delay)
 
   const char *msg1 =
     "BAD TRAP: cpu=0 type=0x31 rp=0x2a10043b5e0 addr=0xf3880 mmu_fsr=0x0\n"
-    "BAD TRAP occured in module \"unix\" due to an illegal access to a"
+    "BAD TRAP occurred in module \"unix\" due to an illegal access to a"
     " user address.\n"
     "adb: trap type = 0x31\n"
     "addr=0xf3880\n"
index 7ae7c0a5b7b38a4fd55e8a38eb42cc357903c31b..8beb3cb7ee275034e6b617db68db38f17cb62620 100644 (file)
@@ -64,12 +64,14 @@ $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) LOOP.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) MAZE.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) METABALLS.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) MISMUNCH.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) MOIRE2.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) MOIRE.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) MOUNTAIN.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) MUNCH.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) NERVEROT.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) NOSEGUY.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) PACMAN.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) PEDAL.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) PENETRATE.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) PENROSE.C
@@ -113,6 +115,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]) WHIRLWINDWARP.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) WHIRLYGIG.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) WORM.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) WORMHOLE.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) XANALOGTV.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) XFLAME.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) XJACK.C
index 7ae7c0a5b7b38a4fd55e8a38eb42cc357903c31b..8beb3cb7ee275034e6b617db68db38f17cb62620 100644 (file)
@@ -64,12 +64,14 @@ $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) LOOP.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) MAZE.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) METABALLS.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) MISMUNCH.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) MOIRE2.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) MOIRE.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) MOUNTAIN.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) MUNCH.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) NERVEROT.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) NOSEGUY.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) PACMAN.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) PEDAL.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) PENETRATE.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) PENROSE.C
@@ -113,6 +115,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]) WHIRLWINDWARP.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) WHIRLYGIG.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) WORM.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) WORMHOLE.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) XANALOGTV.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) XFLAME.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) XJACK.C
index 1975f672c3a9f2ca1441df80c77a6ecee0b93fb0..d43165d1aaa469b41f86b884ffbf0d51228019f8 100644 (file)
@@ -4,8 +4,8 @@
             a screen saver and locker for the X window system
                             by Jamie Zawinski
 
-                              version 4.14
-                               25-Oct-2003
+                              version 4.15
+                               26-Feb-2004
 
                      http://www.jwz.org/xscreensaver/
 
index 0c25f39defd25ef609eb6af701265dce3c0c2b34..92aaffddf2ec49868eb05e6d1f41a997d633a776 100644 (file)
@@ -8,6 +8,15 @@
           _label="Speed" _low-label="Fast" _high-label="Slow"
           low="0" high="50000" default="30000"/>
 
+  <number id="boxsize" type="spinbutton" arg="-boxsize %"
+          _label="Box Size" low="1" high="4" default="1"/>
+
+  <hgroup>
+   <boolean id="fade"      _label="Fade"       arg-unset="-no-fade"/>
+   <boolean id="dissolve"  _label="Dissolve"   arg-set="-dissolve"/>
+   <boolean id="wire"      _label="Wireframe"  arg-set="-wireframe"/>
+  </hgroup>
+
   <_description>
 Shows a ball contained inside of a bounding box.
 Colored blocks blink in when the ball hits the edges.
index b4d4ab989cbb4cbae0901d6f9c2189125fe18379..aa0fb910e04cf91a394b8e78b7604a221c2d8366 100644 (file)
@@ -1,32 +1,32 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>\r
-\r
-<screensaver name="blocktube" _label="BlockTube">\r
-\r
-  <command arg="-root"/>\r
-\r
-  <number id="speed" type="slider" arg="-delay %"\r
-          _label="Speed" _low-label="Slow" _high-label="Fast"\r
-          low="0" high="50000" default="10000"\r
-          convert="invert"/>\r
-\r
-  <number id="holdtime" type="slider" arg="-holdtime %"\r
-          _label="Color Hold Time" _low-label="Short" _high-label="Long"\r
-          low="10" high="2000" default="1000"/>\r
-\r
-  <number id="changetime" type="slider" arg="-changetime %"\r
-          _label="Color Change Time" _low-label="Short" _high-label="Long"\r
-          low="10" high="1000" default="200"/>\r
-\r
-  <select id="render">\r
-    <option id="texture"  _label="Reflective Blocks"/>\r
-    <option id="solid"    _label="Solid Blocks" arg-set="-no-texture"/>\r
-    <option id="wire"     _label="Wireframe" arg-set="-wireframe"/>\r
-  </select>\r
-\r
-  <boolean id="showfps" _label="Show Frames-per-Second" arg-set="-fps"/>\r
-\r
-  <_description>\r
-This hack draws a swirling, falling tunnel of reflective slabs. They fade from\r
-hue to hue.  Written by Lars R. Damerow.\r
-  </_description>\r
-</screensaver>\r
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="blocktube" _label="BlockTube">
+
+  <command arg="-root"/>
+
+  <number id="speed" type="slider" arg="-delay %"
+          _label="Speed" _low-label="Slow" _high-label="Fast"
+           low="0" high="50000" default="40000"
+          convert="invert"/>
+
+  <number id="holdtime" type="slider" arg="-holdtime %"
+          _label="Color Hold Time" _low-label="Short" _high-label="Long"
+          low="10" high="2000" default="1000"/>
+
+  <number id="changetime" type="slider" arg="-changetime %"
+          _label="Color Change Time" _low-label="Short" _high-label="Long"
+          low="10" high="1000" default="200"/>
+
+  <select id="render">
+    <option id="texture"  _label="Reflective Blocks"/>
+    <option id="solid"    _label="Solid Blocks" arg-set="-no-texture"/>
+    <option id="wire"     _label="Wireframe" arg-set="-wireframe"/>
+  </select>
+
+  <boolean id="showfps" _label="Show Frames-per-Second" arg-set="-fps"/>
+
+  <_description>
+This hack draws a swirling, falling tunnel of reflective slabs. They fade from
+hue to hue.  Written by Lars R. Damerow.
+  </_description>
+</screensaver>
index 14403c0bdda0f927b9280957db06d68d5f755864..58aae7c44c4db55fbf7993c9438a8af3d59ac2e5 100644 (file)
@@ -1,4 +1,8 @@
-command arg="--root 1"/>
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="electricsheep" _label="ElectricSheep">
+
+  <command arg="--root 1"/>
 
   <hgroup>
     <string id="nick" _label="Nickname" arg="--nick %"/>
index ec8c1f6ea0fceb37a64f982d7c1b477898e332a4..fb753cafa280504a681c8046987d090c11ea07b2 100644 (file)
@@ -18,7 +18,7 @@
   <boolean id="showfps"        _label="Show Frames-per-Second" arg-set="-fps"/>
 
   <_description>
-An OpenGL Kaleidescope.
-Written by andrew dean.
+An OpenGL kaleidescope that operates on your desktop image, or on
+image files loaded from disk.  Written by andrew dean.
   </_description>
 </screensaver>
index 479b2991f659cb15d546ccc58dc33a205d850db9..19a80a6d15d6634203f921c6ee8885e13c8584ed 100644 (file)
 
   <_description>
 Loads a random sequence of images and smoothly scans and zooms around
-in each, fading from pan to pan.  You can set the directory from which
-images are loaded on the "Advanced" tab.
+in each, fading from pan to pan.  
 
-This  program  requires  a good video card capable of supporting large
+To tell it where to find the images to display, go to the "Advanced"
+tab on the Screensaver Preferences window.  Select "Choose Random
+Images", and enter your image directory in the text field right below
+that.
+
+(Note: not the the "Advanced" button at the bottom of this window:
+the one on the other window.)
+
+This program requires a good video card capable of supporting large
 textures.
 
 Written by Jamie Zawinski and Mike Oliphant.
index f897c482c5f51ce3ea256fd94e4f42c94a5a4a0e..88dd749ad91a75d1cde09270b6bcb53aebd63250 100644 (file)
@@ -8,25 +8,24 @@
           _label="Duration" _low-label="1" _high-label="30 Seconds"
           low="1000" high="30000" default="5000"/>
 
-  <number id="velocity" type="slider" arg="-velocity %"
-          _label="Velocity" _low-label="Slow" _high-label="Fast"
+  <number id="angvel" type="slider" arg="-angvel %"
+          _label="Angular Velocity" _low-label="Slow" _high-label="Fast"
           low="0.05" high="5.0" default="1.0"/>
 
-  <number id="yspin" type="slider" arg="-yspin %"
-          _label="Y Rotation" _low-label="Slow" _high-label="Fast"
+  <number id="yangvel" type="slider" arg="-yangvel %"
+          _label="Y Angular Velocity" _low-label="Slow" _high-label="Fast"
           low="0.0" high="1.0" default="0.10"/>
 
-  <number id="zspin" type="slider" arg="-zspin %"
-          _label="Z Rotation" _low-label="Slow" _high-label="Fast"
+  <number id="zangvel" type="slider" arg="-zangvel %"
+          _label="Z Angular Velocity" _low-label="Slow" _high-label="Fast"
           low="0.0" high="1.0" default="0.10"/>
 
   <number id="packing" type="slider" arg="-explode %"
           _label="Packing" _low-label="Tight" _high-label="Loose"
           low="0.0" high="0.5" default="0.03"/>
 
-  <boolean id="scarycolour" _label="Scary Colors" arg-set="-scarycolour"/>
 
-  <boolean id="labels" _label="Show Labels" arg-unset="-no-labels"/>
+  <boolean id="labels" _label="Show Titles" arg-unset="-no-titles"/>
 
   <select id="render">
     <option id="wire"  _label="Wireframe" arg-set="-wireframe"/>
index 0684637b728ff422dafe69501cfa4d84460b2e0e..08bb858d86fa74fe4d598fa2de78a01db1c2ee9e 100644 (file)
@@ -17,7 +17,7 @@
   <select id="mode">
     <option id="random"   _label="Random Mode"/>
     <option id="seuss"    _label="Seuss Mode" arg-set="-mode seuss"/>
-    <option id="gradient" _label="Seuss Mode" arg-set="-mode gradient"/>
+    <option id="ramp"     _label="Ramp Mode"  arg-set="-mode ramp"/>
   </select>
 
   <number id="ncolors" type="slider" arg="-colors %"
index 7601266c2f8598e024115cf08627138507d1b93b..ec63dc2db71e3ad1617ed1a42d5b71b8e3f64f00 100644 (file)
@@ -4,18 +4,22 @@
 
   <command arg="-root"/>
 
-  <hgroup>
-    <select id="render">
-      <option id="wire"  _label="Wireframe" arg-set="-wire"/>
-      <option id="solid" _label="Solid Surface"/>
-    </select>
-  </hgroup>
-
   <number id="speed" type="slider" arg="-delay %"
           _label="Speed" _low-label="Slow" _high-label="Fast"
           low="0" high="20000" default="10000"
           convert="invert"/>
 
+  <number id="hold_time" type="slider" arg="-hold_time %"
+          _label="Time until loading a new image:"
+          _low-label="10 Seconds" _high-label="5 Minutes"
+          low="10" high="300" default="30"/>
+
+  <number id="fade_speed" type="slider" arg="-fade_speed %"
+          _label="Crossfade Duration:"
+          _low-label="None" _high-label="30 Seconds"
+          low="0" high="30" default="5"/>
+
+<!--
   <number id="x_res" type="slider" arg="-x_res %"
           _label="X Resolution" low="5" high="500" default="60"/>
 
 
   <number id="field_points" type="slider" arg="-field_points %"
           _label="Field Points" low="0" high="50" default="10"/>
-
-  <number id="hold_frames" type="slider" arg="-hold_frames %"
-          _label="Frames Between Images" low="1" high="65536" default="10240"/>
-
-  <number id="fade_speed" type="slider" arg="-fade_speed %"
-          _label="Fade Speed" low="1" high="256" default="1"/>
+-->
 
   <hgroup>
     <select id="Calculation Method">
-      <option id="wire"  _label="Blobby"/>
-      <option id="calm"  _label="Calm"           arg-set="-incremental 1"/>
-      <option id="freaky"  _label="Freaky"       arg-set="-incremental 3"/>
+      <option id="blobby"   _label="Blobby"/>
+      <option id="calm"     _label="Calm"           arg-set="-incremental 1"/>
+      <option id="freaky"   _label="Freaky"       arg-set="-incremental 3"/>
       <option id="vfreaky"  _label="Very Freaky" arg-set="-incremental 2"/>
     </select>
-  </hgroup>
 
-  <hgroup>
-   <vgroup>
-     <boolean id="walls" _label="Enable Walls"/>
-     <boolean id="colour" _label="Enable Colouring" arg-set="-colour"/>
-     <boolean id="texture" _label="Enable Reflected Image" arg-unset="-no-texture"/>
-     <boolean id="background" _label="Enable Background Image" arg-unset="-no-bgimage"/>
-     <boolean id="offset_texture" _label="Offset Texture Coordinates" arg-set="-offset_texture"/>
-     <boolean id="showfps" _label="Show Frames-per-Second" arg-set="-fps"/>
-   </vgroup>
+    <select id="render">
+      <option id="wire"  _label="Wireframe" arg-set="-wire"/>
+      <option id="solid" _label="Solid Surface"/>
+    </select>
   </hgroup>
 
+  <boolean id="walls" _label="Enable Walls"/>
+  <boolean id="colour" _label="Enable Colouring" arg-set="-colour"/>
+  <boolean id="texture" _label="Enable Reflected Image" arg-unset="-no-texture"/>
+  <boolean id="background" _label="Enable Background Image" arg-unset="-no-bgimage"/>
+  <boolean id="offset_texture" _label="Offset Texture Coordinates" arg-set="-offset_texture"/>
+  <boolean id="showfps" _label="Show Frames-per-Second" arg-set="-fps"/>
+
   <_description>
 Draws a wobbly blob that distorts the image behind it.
 Requires OpenGL hardware acceleration for nice animation.
diff --git a/hacks/config/mismunch.xml b/hacks/config/mismunch.xml
new file mode 100644 (file)
index 0000000..5392728
--- /dev/null
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="mismunch" _label="Mismunch">
+
+  <command arg="-root"/>
+
+  <number id="speed" type="slider" arg="-delay %"
+          _label="Speed" _low-label="Slow" _high-label="Fast"
+          low="0" high="25000" default="2500"
+          convert="invert"/>
+
+  <number id="duration" type="slider" arg="-clear %"
+          _label="Duration" _low-label="Short" _high-label="Long"
+          low="1" high="200" default="65"/>
+
+  <number id="simultaneous" type="slider" arg="-simul %"
+          _label="Simultaneous Squares" _low-label="One" _high-label="Many"
+          low="1" high="20" default="5"/>
+
+  <select id="mode">
+    <option id="xor"   _label="XOR"/>
+    <option id="solid" _label="Solid" arg-set="-no-xor"/>
+  </select>
+
+  <_description>
+Munching errors!  This is a creatively broken misimplementation of the
+classic munching squares graphics hack.  Written by Steven Hazel.
+  </_description>
+</screensaver>
index df9bb0f4ee0c58df3629d256a163b7438a0b0d89..cf098eba9ce0446221e3b8d140e75b06d32e987b 100644 (file)
@@ -44,7 +44,7 @@
     <option id="solid" _label="Solid"/>
   </select>
 
-  <file id="molecule" _label="PDB File" arg="-molecule %"/>
+  <file id="molecule" _label="PDB File or Directory" arg="-molecule %"/>
 
   <_description>
 Draws several different representations of molecules.  Some common
diff --git a/hacks/config/noof.xml b/hacks/config/noof.xml
new file mode 100644 (file)
index 0000000..94edcce
--- /dev/null
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="noof" _label="Noof">
+
+  <command arg="-root"/>
+
+  <number id="speed" type="slider" arg="-delay %"
+          _label="Speed" _low-label="Slow" _high-label="Fast"
+          low="0" high="50000" default="10000"
+          convert="invert"/>
+
+  <boolean id="showfps" _label="Show Frames-per-Second" arg-set="-fps"/>
+
+  <_description>
+Draws some rotatey patterns, using OpenGL.
+Written by Mark Kilgard.
+  </_description>
+</screensaver>
diff --git a/hacks/config/pacman.xml b/hacks/config/pacman.xml
new file mode 100644 (file)
index 0000000..205b40d
--- /dev/null
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="pacman" _label="Pacman">
+
+  <command arg="-root"/>
+
+  <number id="size" type="spinbutton" arg="-size %"
+           _label="Player Size" low="0" high="200" default="0"/>
+
+  <number id="speed" type="slider" arg="-delay %"
+          _label="Speed" _low-label="Slow" _high-label="Fast"
+          low="0" high="50000" default="10000"
+          convert="invert"/>
+
+  <_description>
+Simulates a game of Pac-Man on a randomly-created level.
+Written by Edwin de Jong.
+  </_description>
+</screensaver>
index 2ac804462da09bad779349a7fd044b38bbd18c70..8fb36412fefca5f238e440b58f0dcab2bfcf15fc 100644 (file)
           low="1" high="100" default="20"
           convert="invert"/>
 
+  <select id="mode">
+    <option id="dumb" _label="Dump pipe"/>
+    <option id="pty"  _label="Use PTY" arg-set="-pty"/>
+  </select>
+
   <file id="program" _label="Text Program" arg="-program %"/>
 
   <!-- #### -font [fixed] -->
index 7ed8ee7e5833667b6298a7d6d2a2c331592f06e4..3ef413d6384c03a72985049e68a077bc3b9e6a21 100644 (file)
@@ -13,8 +13,8 @@
           low="0.01" high="0.075" default="0.0375"/>
 
   <_description>
-Displays a game of pong. It doesn't keep score
-because they are not suppose to miss.
-Written by Jeremy English.
+The pong program simulates an ancient Pong home video game, as well as
+various artifacts from displaying it on a color TV set.
+Written by Jeremy English and Trevor Blackwell.
   </_description>
 </screensaver>
diff --git a/hacks/config/wormhole.xml b/hacks/config/wormhole.xml
new file mode 100644 (file)
index 0000000..226e16e
--- /dev/null
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="wormhole" _label="Wormhole">
+
+  <command arg="-root"/>
+
+  <number id="speed" type="slider" arg="-delay %"
+          _label="Animation Speed" _low-label="Slow" _high-label="Fast"
+          low="0" high="50000" default="100"
+          convert="invert"/>
+
+  <number id="zspeed" type="slider" arg="-zspeed %"
+          _label="Star speed" _low-label="Slow" _high-label="Fast"
+          low="1" high="30" default="15"/>
+
+  <number id="stars" type="slider" arg="-stars %"
+          _label="Stars Created" _low-label="Few" _high-label="Lots"
+          low="1" high="100" default="30"/>
+
+  <_description>
+  Wormhole simulates flying through a colored wormhole in space. 
+  Written by Jon Rafkind.
+  </_description>
+</screensaver>
index e476537d8a5285f5a2fc17003f5d6cca6c9ac63a..9c7dd56f25af001bfabf962f3b75dcf7e85d8af9 100644 (file)
@@ -8,7 +8,7 @@
   <_description>
 
 XAnalogTV shows a detailed simulation of an old TV set showing various
-test patters, with various picture artifacts like snow, bloom,
+test patterns, with various picture artifacts like snow, bloom,
 distortion, ghosting, and hash noise. It also simulates the TV warming
 up. It will cycle through 12 channels, some with images you give it,
 and some with color bars or nothing but static.
index c0c41b0a8bc5788c6d53cbf3fd8010d522f644bd..28df204635de6a806bc90878fc4d91f485407259 100644 (file)
@@ -86,5 +86,8 @@ point in space, correctly shaded for the current position of the Sun.
 Written by Kirk Johnson.  This is not included with the XScreenSaver
 package, but if you don't have it already, you can find it at
 &lt;http://www.cs.colorado.edu/~tuna/xearth/&gt;.
+
+There is also a similar (but more recent) program called xplanet
+to be found at &lt;http://xplanet.sourceforge.net/&gt;.
   </_description>
 </screensaver>
diff --git a/hacks/config/xplanet.xml b/hacks/config/xplanet.xml
new file mode 100644 (file)
index 0000000..7227c72
--- /dev/null
@@ -0,0 +1,138 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="xplanet" _label="Xplanet">
+
+  <command arg="-vroot"/>
+
+  <number id="wait" type="slider" arg="-wait %"
+          _label="Speed" _low-label="Slow" _high-label="Fast"
+          low="1" high="30" default="9999999"
+          convert="invert"/>
+
+  <number id="timewarp" type="slider" arg="-timewarp %"
+          _label="Time Warp" _low-label="Real Time" _high-label="Fast"
+          low="1" high="100000" default="0"/>
+
+  <hgroup>
+   <select id="body">
+    <option id="sun"       _label="View Sun"       arg-set="-body sun"/>
+    <option id="mercury"   _label="View Mercury"   arg-set="-body mercury"/>
+    <option id="venus"     _label="View Venus"     arg-set="-body venus"/>
+    <option id="earth"     _label="View Earth"/>
+    <option id="moon"      _label="View Moon"      arg-set="-body moon"/>
+    <option id="mars"      _label="View Mars"      arg-set="-body mars"/>
+    <option id="phobos"    _label="View Phobos"    arg-set="-body phobos"/>
+    <option id="deimos"    _label="View Deimos"    arg-set="-body deimos"/>
+    <option id="jupiter"   _label="View Jupiter"   arg-set="-body jupiter"/>
+    <option id="io"        _label="View Io"        arg-set="-body io"/>
+    <option id="europa"    _label="View Europa"    arg-set="-body europa"/>
+    <option id="ganymede"  _label="View Ganymede"  arg-set="-body ganymede"/>
+    <option id="callisto"  _label="View Callisto"  arg-set="-body callisto"/>
+    <option id="saturn"    _label="View Saturn"    arg-set="-body saturn"/>
+    <option id="mimas"     _label="View Mimas"     arg-set="-body mimas"/>
+    <option id="enceladus" _label="View Enceladus" arg-set="-body enceladus"/>
+    <option id="tethys"    _label="View Tethys"    arg-set="-body tethys"/>
+    <option id="dione"     _label="View Dione"     arg-set="-body dione"/>
+    <option id="rhea"      _label="View Rhea"      arg-set="-body rhea"/>
+    <option id="titan"     _label="View Titan"     arg-set="-body titan"/>
+    <option id="hyperion"  _label="View Hyperion"  arg-set="-body hyperion"/>
+    <option id="iapetus"   _label="View Iapetus"   arg-set="-body iapetus"/>
+    <option id="phoebe"    _label="View Phoebe"    arg-set="-body phoebe"/>
+    <option id="uranus"    _label="View Uranus"    arg-set="-body uranus"/>
+    <option id="miranda"   _label="View Miranda"   arg-set="-body miranda"/>
+    <option id="ariel"     _label="View Ariel"     arg-set="-body ariel"/>
+    <option id="umbriel"   _label="View Umbriel"   arg-set="-body umbriel"/>
+    <option id="titania"   _label="View Titania"   arg-set="-body titania"/>
+    <option id="oberon"    _label="View Oberon"    arg-set="-body oberon"/>
+    <option id="neptune"   _label="View Neptune"   arg-set="-body neptune"/>
+    <option id="triton"    _label="View Triton"    arg-set="-body triton"/>
+    <option id="nereid"    _label="View Nereid"    arg-set="-body nereid"/>
+    <option id="pluto"     _label="View Pluto"     arg-set="-body pluto"/>
+    <option id="charon"    _label="View Charon"    arg-set="-body charon"/>
+    <option id="random"    _label="View Random"    arg-set="-body random"/>
+    <option id="major"     _label="View Major"     arg-set="-body major"/>
+   </select> 
+
+   <select id="origin">
+    <option id="sun"       _label="From Sun"/>
+    <option id="mercury"   _label="From Mercury"   arg-set="-origin mercury"/>
+    <option id="venus"     _label="From Venus"     arg-set="-origin venus"/>
+    <option id="earth"     _label="From Earth"     arg-set="-origin venus"/>
+    <option id="moon"      _label="From Moon"      arg-set="-origin moon"/>
+    <option id="mars"      _label="From Mars"      arg-set="-origin mars"/>
+    <option id="phobos"    _label="From Phobos"    arg-set="-origin phobos"/>
+    <option id="deimos"    _label="From Deimos"    arg-set="-origin deimos"/>
+    <option id="jupiter"   _label="From Jupiter"   arg-set="-origin jupiter"/>
+    <option id="io"        _label="From Io"        arg-set="-origin io"/>
+    <option id="europa"    _label="From Europa"    arg-set="-origin europa"/>
+    <option id="ganymede"  _label="From Ganymede"  arg-set="-origin ganymede"/>
+    <option id="callisto"  _label="From Callisto"  arg-set="-origin callisto"/>
+    <option id="saturn"    _label="From Saturn"    arg-set="-origin saturn"/>
+    <option id="mimas"     _label="From Mimas"     arg-set="-origin mimas"/>
+    <option id="enceladus" _label="From Enceladus" arg-set="-origin enceladus"/>
+    <option id="tethys"    _label="From Tethys"    arg-set="-origin tethys"/>
+    <option id="dione"     _label="From Dione"     arg-set="-origin dione"/>
+    <option id="rhea"      _label="From Rhea"      arg-set="-origin rhea"/>
+    <option id="titan"     _label="From Titan"     arg-set="-origin titan"/>
+    <option id="hyperion"  _label="From Hyperion"  arg-set="-origin hyperion"/>
+    <option id="iapetus"   _label="From Iapetus"   arg-set="-origin iapetus"/>
+    <option id="phoebe"    _label="From Phoebe"    arg-set="-origin phoebe"/>
+    <option id="uranus"    _label="From Uranus"    arg-set="-origin uranus"/>
+    <option id="miranda"   _label="From Miranda"   arg-set="-origin miranda"/>
+    <option id="ariel"     _label="From Ariel"     arg-set="-origin ariel"/>
+    <option id="umbriel"   _label="From Umbriel"   arg-set="-origin umbriel"/>
+    <option id="titania"   _label="From Titania"   arg-set="-origin titania"/>
+    <option id="oberon"    _label="From Oberon"    arg-set="-origin oberon"/>
+    <option id="neptune"   _label="From Neptune"   arg-set="-origin neptune"/>
+    <option id="triton"    _label="From Triton"    arg-set="-origin triton"/>
+    <option id="nereid"    _label="From Nereid"    arg-set="-origin nereid"/>
+    <option id="pluto"     _label="From Pluto"     arg-set="-origin pluto"/>
+    <option id="charon"    _label="From Charon"    arg-set="-origin charon"/>
+    <option id="random"    _label="From Random"    arg-set="-origin random"/>
+    <option id="major"     _label="From Major"     arg-set="-origin major"/>
+   </select>
+  </hgroup>
+
+  <select id="proj">
+   <option id="none"         _label="Render as a Globe"/>
+   <option id="ancient"      _label="Ancient Projection"      arg-set="-projection ancient"/>
+   <option id="azimuthal"    _label="Azimuthal Projection"    arg-set="-projection azimuthal"/>
+   <option id="hemisphere"   _label="Hemisphere Projection"   arg-set="-projection hemisphere"/>
+   <option id="lambert"      _label="Lambert Projection"      arg-set="-projection lambert"/>
+   <option id="mercator"     _label="Mercator Projection"     arg-set="-projection mercator"/>
+   <option id="mollweide"    _label="Mollweide Projection"    arg-set="-projection mollweide"/>
+   <option id="peters"       _label="Peters Projection"       arg-set="-projection peters"/>
+   <option id="orthographic" _label="Orthographic Projection" arg-set="-projection orthographic"/>
+   <option id="rectangular"  _label="Rectangular Projection"  arg-set="-projection rectangular"/>
+  </select>
+
+  <hgroup>
+    <number id="lat" type="spinbutton" arg="-latitude %"
+            _label="Latitude" low="-90" high="90" default="0"/>
+    <number id="longitude" type="spinbutton" arg="-longitude %"
+            _label="Longitude" low="-180" high="180" default="0"/>
+  </hgroup>
+
+  <hgroup>
+    <boolean id="label" _label="Date/Time Stamp" arg-set="-label"/>
+
+    <select id="timestamp">
+      <option id="ul" _label="Upper Left"  arg-set="-labelpos +5+5"/>
+      <option id="ll" _label="Lower Left"  arg-set="-labelpos +5-5"/>
+      <option id="ur" _label="Upper Right"/>
+      <option id="lr" _label="Lower Right" arg-set="-labelpos -5+5"/>
+    </select>
+  </hgroup>
+
+  <number id="radius" type="slider" arg="-radius %"
+          _label="Radius" _low-label="0%" _high-label="100%"
+          low="1" high="100" default="45"/>
+
+  <_description>
+Xplanet draws an image of the Earth, as seen from your favorite vantage
+point in space, correctly shaded for the current position of the Sun.
+Written by Hari Nair.  This is not included with the XScreenSaver
+package, but if you don't have it already, you can find it at
+&lt;http://xplanet.sourceforge.net/&gt;.
+  </_description>
+</screensaver>
index 80bcca5b8ebb3de4841e459f80dc7894d3cef5be..a0907da867c353720e4a67d2bc9d57ae3a2c9cfd 100644 (file)
@@ -124,13 +124,13 @@ static XrmOptionDescRec opts[] =
 
 static argtype vars[] =
 {
-       {(caddr_t *) & nx, "nx", "nx", DEF_NX, t_Int},
-       {(caddr_t *) & ny, "ny", "ny", DEF_NY, t_Int},
-       {(caddr_t *) & centre, "centre", "Centre", DEF_CENTRE, t_Bool},
-       {(caddr_t *) & maxsize, "maxsize", "Maxsize", DEF_MAXSIZE, t_Bool},
-       {(caddr_t *) & unit_cell, "cell", "Cell", DEF_CELL, t_Bool},
-       {(caddr_t *) & grid_cell, "grid", "Grid", DEF_GRID, t_Bool},
-       {(caddr_t *) & cycle_p, "shift", "Shift", DEF_CYCLE, t_Bool}
+       {&nx, "nx", "nx", DEF_NX, t_Int},
+       {&ny, "ny", "ny", DEF_NY, t_Int},
+       {&centre, "centre", "Centre", DEF_CENTRE, t_Bool},
+       {&maxsize, "maxsize", "Maxsize", DEF_MAXSIZE, t_Bool},
+       {&unit_cell, "cell", "Cell", DEF_CELL, t_Bool},
+       {&grid_cell, "grid", "Grid", DEF_GRID, t_Bool},
+       {&cycle_p, "shift", "Shift", DEF_CYCLE, t_Bool}
 };
 static OptionStruct desc[] =
 {
index ba6c2b5d62905b676d7d34ae031142982ca73b76..46137d665babf61464dce1ca62d92949e99a3193 100644 (file)
@@ -82,7 +82,7 @@ static XrmOptionDescRec opts[] =
 
 static argtype vars[] =
 {
-       {(caddr_t *) & neighbors, (char *) "neighbors", (char *) "Neighbors", (char *) DEF_NEIGHBORS, t_Int}
+       {&neighbors, "neighbors", "Neighbors", DEF_NEIGHBORS, t_Int}
 };
 static OptionStruct desc[] =
 {
index 38cdf7b70d8a70b809c946237a2153c852fd02aa..50893db90b9fa9c312a6fe2824763a6c79421024 100644 (file)
@@ -68,8 +68,8 @@ static XrmOptionDescRec opts[] =
 };
 static argtype vars[] =
 {
-       {(caddr_t *) & grow, (char *) "grow", (char *) "Grow", (char *) DEF_GROW, t_Bool},
-       {(caddr_t *) & liss, (char *) "liss", (char *) "Liss", (char *) DEF_LISS, t_Bool}
+       {&grow, "grow", "Grow", DEF_GROW, t_Bool},
+       {&liss, "liss", "Liss", DEF_LISS, t_Bool}
 };
 static OptionStruct desc[] =
 {
index 65a468162ef9fe5dcbfb7974600652edbd337e31..01e88d381e3342e594bd077886483d938ec1dca3 100644 (file)
@@ -589,8 +589,7 @@ setup(void)
     {
       XGetWindowAttributes (dpy, window, &xgwa);
       XSelectInput (dpy, window,
-                    xgwa.your_event_mask | ExposureMask |
-                    ButtonPressMask |StructureNotifyMask);
+                    xgwa.your_event_mask | ExposureMask | ButtonPressMask);
     }
   
 }
index 7b694e545a606a918db9130625e3bb7d0946fd05..b055c45e4343b6877f03ca66da8c2921d95747f1 100644 (file)
@@ -75,9 +75,9 @@ static XrmOptionDescRec opts[] =
 };
 static argtype vars[] =
 {
-  {(caddr_t *) &tail_len, (char *) "eulertail",
+  {&tail_len, "eulertail",
    (char *) "EulerTail", (char *) DEF_EULERTAIL, t_Int},
-  {(caddr_t *) &power, (char *) "eulerpower",
+  {&power, "eulerpower",
    (char *) "EulerPower", (char *) "1", t_Float},
 };
 static OptionStruct desc[] =
diff --git a/hacks/euler2d.tex b/hacks/euler2d.tex
new file mode 100644 (file)
index 0000000..700ad31
--- /dev/null
@@ -0,0 +1,337 @@
+\documentclass[12pt]{article}
+
+%\usepackage{fullpage}
+\usepackage{amsmath,amssymb}
+
+\begin{document}
+
+\title{Two Dimensional Euler Simulation}
+
+\author{
+S.J. Montgomery-Smith\\
+Department of Mathematics\\
+University of Missouri\\
+Columbia, MO 65211, U.S.A.\\
+stephen@math.missouri.edu\\
+http://www.math.missouri.edu/\~{}stephen}
+
+\date{September 10, 2000}
+
+\maketitle
+
+This document describes a program I wrote to simulate the 
+two dimensional Euler Equation --- a program that is part
+of the {\tt xlock} screensaver as the {\tt euler2d}
+mode.  A similar explanation may also be found in the
+book by Chorin \cite{C}.
+
+\section{The Euler Equation}
+
+The Euler Equation describes the motion of an incompressible
+fluid that has no viscosity.  If the fluid is contained
+in a domain $\Omega$ with boundary $\partial \Omega$, then
+the equation is in the vector field $u$ (the velocity)
+and the
+scalar field $p$ (the pressure):
+\begin{eqnarray*}
+\frac{\partial}{\partial t} u &=& -u \cdot \nabla u + \nabla p \\
+\nabla \cdot u &=& 0 \\
+u \cdot n &=& 0 \quad \text{on $\partial \Omega$}
+\end{eqnarray*}
+where $n$ is the unit normal to $\partial \Omega$.
+
+\section{Vorticity}
+
+It turns out that it can be easier write these equations
+in terms of the vorticity.  In two dimensions the vorticity
+is the scalar $w = \partial u_2/\partial x - \partial u_1/\partial y$.
+The equation for vorticity becomes
+\[ \frac{\partial}{\partial t} w = -u \cdot \nabla w .\]
+A solution to this equation can be written as follows.  The velocity
+$u$ causes a flow, that is, a function $\varphi(t,x)$ that tells where
+the particle initially at $x$ ends up at time $t$, that is
+\[
+\frac\partial{\partial t} \varphi(t,x)
+= u(t,\varphi(t,x)) .\]
+Then the equation
+for $w$ tells us that the vorticity is ``pushed'' around by the flow,
+that is, $w(t,\varphi(t,x)) = w(0,x)$.
+
+\section{The Biot-Savart Kernel}
+
+Now, once we have the vorticity, we can recover the velocity $u$ by
+solving the equation
+\begin{eqnarray*}
+\partial u_2/\partial x - \partial u_1/\partial y &=& w \\
+\nabla \cdot u &=& 0 \\
+u \cdot n &=& 0 \quad \text{on $\partial \Omega$}.
+\end{eqnarray*}
+This equation is solved by using a Biot-Savart kernel $K(x,y)$:
+$$ u(x) = \int_\Omega K(x,y) w(y) \, dy .$$
+The function $K$ depends upon the choice of domain.  First let us consider
+the case when $\Omega$ is the whole plane (in which case the boundary
+condition $u \cdot n = 0$ is replaced by saying that $u$ decays at infinity).
+Then
+\begin{equation*}
+K(x,y) = K_1(x,y) = c \frac{(x-y)^\perp}{|x-y|^2} .
+\end{equation*}
+Here $x^\perp = (-x_2,x_1)$, and $c$ is a constant, probably something
+like $1/2\pi$.  In any case we will set it to be one, which in effect
+is rescaling the time variable, so we don't need to worry about it.
+
+We can use this as a basis to find $K$ on the unit disk
+$\Omega = \Delta = \{x:|x|<1\}$.  It turns out to be
+\begin{equation*}
+K_2(x,y) = K_1(x,y) - K_1(x,y^*) ,
+\end{equation*}
+where $y^* = y/|y|^2$ is called the reflection of $y$ about the
+boundary of the unit disk.
+
+Another example is if we have a bijective analytic function
+$p:\Delta \to {\mathbb C}$, and we let $\Omega = p(\Delta)$.
+(Here we think of $\Delta$ as a subset of $\mathbb C$, that is,
+we are identifying the plane with the set of complex numbers.)
+In that case we get
+\[ K_p(p(x),p(y)) = K_2(x,y)/|p'(x)|^2 .\]
+Our simulation considers the last case.  Examples of such
+analytic functions include series 
+$p(x) = x + \sum_{n=2}^\infty c_n x^n$, where
+$\sum_{n=2}^\infty n |c_n| \le 1$.
+(Thanks to David Ullrich for pointing this out to me.)
+
+\section{The Simulation}
+
+Now let's get to decribing the simulation.  We assume a rather
+unusual initial distribution for the vorticity --- that the
+vorticity is a finite sum of dirac delta masses.
+\[ w(0,x) = \sum_{k=1}^N w_k \delta(x-x_k(0)) .\]
+Here $x_k(0)$ is the initial place where the points
+of vorticity are concentrated, with values $w_k$.  
+Then at time $t$, the vorticity becomes
+\[ w(t,x) = \sum_{k=1}^N w_k \delta(x-x_k(t)) .\]
+The points of fluid $x_k(t)$ are pushed by the
+flow, that is, $x_k(t) = \varphi(t,x_k(0))$, or
+\[ \frac{\partial}{\partial t} x_k(t) = u(t,x_k(t)) .\]
+Putting this all together, we finally obtain the equations
+\[ \frac{\partial}{\partial t} x_k = \alpha_k \]
+where
+\[ \alpha_k   = \sum_{l=1}^N w_l K(x_k,x_l) .\]
+This is the equation that our simulation solves.
+
+In fact, in our case, where the domain is $p(\Delta)$,
+the points are described by points
+$\tilde x_k$, where $x_k = p(\tilde x_k)$.  Then
+the equations become
+\begin{eqnarray}
+\label{tildex-p1}
+\frac{\partial}{\partial t} \tilde x_k &=& \tilde\alpha_k \\
+\label{tildex-p2}
+\tilde\alpha_k &=& \frac1{|p'(\tilde x_k)|^2}
+     \sum_{l=1}^N w_l K_2(\tilde x_k,\tilde x_l) .
+\end{eqnarray}
+
+We solve this $2N$ system of equations using standard
+numerical methods, in our case, using the second order midpoint method
+for the first step, and thereafter using the second order Adams-Bashforth 
+method.  (See for example the book
+by Burden and Faires \cite{BF}).
+
+\section{The Program - Data Structures}
+
+The computer program solves equation (\ref{tildex-p1}), and displays
+the results on the screen, with a boundary.  All the information
+for solving the equation and displaying the output is countained
+in the structure {\tt euler2dstruct}.  Let us describe some of
+the fields in {\tt euler2dstruct}.  
+The points $\tilde x_k$ are contained 
+in {\tt double *x}: with the coordinates of
+$\tilde x_k$ being the two numbers
+{\tt x[2*k+0]}, {\tt x[2*k+1]}.  The values $w_k$ are contained
+in {\tt double *w}.  The total number of points is
+{\tt int N}.  (But only the first {\tt int Nvortex} points
+have $w_k \ne 0$.)  The coefficients of the analytic function
+(in our case a polynomial) $p$
+are contained in {\tt double p\_coef[2*(deg\_p-1)]} --- here
+{\tt deg\_p} is the degree of $p$, and the real and imaginary
+parts of the coefficient
+$c_n$ is contained in {\tt p\_coef[2*(n-2)+0]} and {\tt p\_coef[2*(n-2)+1]}.
+
+\section{Data Initialization}
+
+The program starts in the function {\tt init\_euler2d}.  After allocating
+the memory for the data, and initialising some of the temporary variables
+required for the numerical solving program, it randomly assigns the
+coefficients of $p$, making sure that $\sum_{n=2}^{\tt deg\_p} n |c_n| = 1$.
+Then the program figures out how to draw the boundary, and what rescaling
+of the data is required to draw it on the screen.  (This uses the
+function {\tt calc\_p} which calculates $p(x)$.)
+
+Next, it randomly assigns the initial values of $\tilde x_k$.  We want
+to do this in such a way so that the points are uniformly spread over the
+domain.  Let us first consider the case when the domain is the unit circle
+$\Delta$.  In that case the proportion of points that we would expect
+inside the circle of radius $r$ would be proportional to $r^2$.  So
+we do it as follows:
+\[ r = \sqrt{R_{0,1}},\quad \theta = R_{-\pi,\pi}, \quad
+   \tilde x_k = r (\cos \theta, \sin \theta) .\]
+Here, and in the rest of this discussion, $R_{a,b}$ is a function
+that returns a random variable uniformly distributed over the interval
+$[a,b]$.
+
+This works fine for $\Delta$, but for $p(\Delta)$, the points 
+$p(\tilde x_k)$ are not uniformly distributed over $p(\Delta)$,
+but are distributed with a density proportional to
+$1/|p'(\tilde x_k)|^2$.  So to restore the uniform density we need
+to reject this value of $\tilde x_k$ with probability proportional
+to $|p'(\tilde x_k)|^2$.  Noticing that the condition 
+$\sum_{n=2}^{\tt deg\_p} n |c_n| = 1$ implies that 
+$|p'(\tilde x_k)| \le 2$, we
+do this by rejecting if $|p'(\tilde x_k)|^2 < R_{0,4}$.
+(This makes use of the function {\tt calc\_mod\_dp2} which calculates
+$|p'(x)|^2$.)
+
+\section{Solving the Equation}
+
+The main loop of the program is in the function {\tt draw\_euler2d}.
+Most of the drawing operations are contained in this function, and
+the numerical aspects are sent to the function {\tt ode\_solve}.
+But there is an aspect of this that I would like
+to discuss in the next section, and so we will look at a simple method for 
+numerically solving differential equations.
+
+The Euler Method
+(nothing to do with the Euler Equation), is as
+follows.  Pick a small number $h$ --- the time step (in
+the program call {\tt delta\_t}).  Then we approximate
+the solution of the equation:
+\begin{equation}
+\label{method-simple}
+\tilde x_k(t+h) = \tilde x_k(t) + h \tilde\alpha_k(t) .
+\end{equation}
+The more sophisticated methods we use are variations of 
+the Euler Method, and so the discussion in the following section
+still applies.
+
+In the program, the quantities $\tilde\alpha_k$, given by
+equations (\ref{tildex-p2}) are calculated by the function
+{\tt derivs}
+(which in turns calls {\tt calc\_all\_mod\_dp2} to
+calculate $|p'(\tilde x_k)|^2$ at all the points).
+
+
+\section{Subtle Perturbation}
+
+Added later: the scheme described here seems to not be that effective,
+so now it is not used.
+
+One problem using a numerical scheme such as the Euler Method occurs
+when the points $\tilde x_k$ get close to the boundary
+of $\Delta$.  In that case, it is possible that the new
+points will be pushed outside of the boundary.  Even if they 
+are not pushed out of the boundary, they may be much closer
+or farther from the boundary than they should be.  
+Our system of equations is very sensitive to how close points
+are to the boundary --- points with non-zero vorticity
+(``vortex points'') that are close to the boundary travel
+at great speed alongside the boundary, with speed that is
+inversely proportional to the distance from the boundary.
+
+A way to try to mitigate this problem is something that I call
+``subtle perturbation.''
+We map the points in 
+the unit disk to points in the plane using the map
+\begin{equation*}
+F(x) = f(|x|) \frac x{|x|} ,
+\end{equation*}
+where $f:[0,1]\to[0,\infty]$ is an increasing continuous
+bijection.  It turns out that a good choice is
+\begin{equation*}
+f(t) = -\log(1-t) .
+\end{equation*}
+(The reason for this is that points close to each other 
+that are a distance
+about $r$ from the boundary will be pushed around so that
+their distance from each other is about multiplied by the
+derivative of $\log r$, that is, $1/r$.)
+Note that the inverse of this function is given by
+\begin{equation*}
+F^{-1}(x) = f^{-1}(|x|) \frac x{|x|} ,
+\end{equation*}
+where 
+\begin{equation*}
+f^{-1}(t) = 1-e^{-t} .
+\end{equation*}
+
+So what we could do is the following: instead of working with
+the points $\tilde x_k$, we could work instead with the points
+$y_k = F(\tilde x_k)$.  In effect this is what we do.
+Instead of performing the computation (\ref{method-simple}),
+we do the calculation
+\begin{equation*}
+y_k = F(\tilde x_k(t)) + h {\cal A}(\tilde x_k) \tilde\alpha_k(t) 
+\end{equation*}
+where
+${\cal A}(x)$ is the matrix of partial derivatives of $F$:
+\begin{equation*}
+{\cal A}(x) = 
+\frac{f(|x|)}{|x|}
+\left[
+\begin{matrix}
+1 & 0\\
+0 & 1
+\end{matrix}
+\right]
++ \frac1{|x|}
+  \left(\frac{f'(|x|)}{|x|} - \frac{f(|x|)}{|x|^2}\right)
+\left[
+\begin{matrix}
+x_{1}^2   & x_{1} x_{2}\\
+x_{1} x_{2} & x_{2}^2
+\end{matrix}
+\right],
+\end{equation*}
+and then compute
+\begin{equation*}
+\tilde x_k(t+h) = F^{-1}(y_k).
+\end{equation*}
+These calculations are done in the function {\tt perturb}, if
+the quantity {\tt SUBTLE\_PERTURB} is set.
+
+\section{Drawing the Points}
+
+As we stated earlier, most of the drawing functions are contained
+in the function {\tt draw\_euler2d}.  If the variable 
+{\tt hide\_vortex} is set (and the function {\tt init\_euler2d}
+will set this with probability $3/4$), then we only display
+the points $\tilde x_k$ for ${\tt Nvortex} < k \le N$.  If 
+{\tt hide\_vortex} is not set, then the ``vortex points''
+$\tilde x_k$ ($1 \le k \le {\tt Nvortex}$) are displayed in white.
+In fact the points $p(\tilde x_k)$ are what are put onto the screen,
+and for this we make use of the function {\tt calc\_all\_p}.
+
+\section{Addition to Program: Changing the Power Law}
+
+A later addition to the program adds an option {\tt eulerpower},
+which allows one to change the power law that describes how
+the vortex points influence other points.  In effect, if this
+option is set with the value $m$, then the Biot-Savart Kernel
+is replace by
+$$ K_1(x,y) = \frac{(x-y)^\perp}{|x-y|^{m+1}}, $$
+and
+$$ K_2(x,y) = K_1(x,y) - |y|^{1-m} K_1(x,y) .$$
+So for example, setting $m=2$ corresponds to the 
+quasi-geostrophic equation.  (I haven't yet figured out
+what $K_p$ should be, so if $m \ne 1$ we use the unit circle
+as the boundary.)
+
+\begin{thebibliography}{9}
+
+\bibitem{BF} Richard L. Burden, J. Douglas Faires, Numerical Analysis,
+sixth edition, Brooks/Cole, 1996.
+
+\bibitem{C} Alexandre J. Chorin, Vorticity and Turbulence,
+Applied Mathematical Sciences, Vol 103, Springer Verlag, 1994.
+
+\end{thebibliography}
+
+\end{document}
index 87e698b156538903f48037251df9ccff40db09fa..b9b2db0d6b83cd8cd4d4bc932689688f72c017b1 100644 (file)
@@ -67,7 +67,7 @@ static XrmOptionDescRec opts[] =
 
 static argtype vars[] =
 {
- {(caddr_t *) & tracks, "tracks", "Tracks", DEF_TRACKS, t_Bool}
+ {&tracks, "tracks", "Tracks", DEF_TRACKS, t_Bool}
 };
 
 static OptionStruct desc[] =
index 84609e08bc35f7bd99e83abc38bac376b6d144e9..b6c3a62750301e0bb268ae56a127e9a939c80567 100644 (file)
@@ -95,7 +95,7 @@ SRCS          = xscreensaver-gl-helper.c \
                  cow_tail.c cow_udder.c glslideshow.c jigglypuff.c klein.c \
                  hypertorus.c glmatrix.c cubestorm.c glknots.c blocktube.c \
                  flipflop.c antspotlight.c polytopes.c gleidescope.c \
-                 mirrorblob.c blinkbox.c
+                 mirrorblob.c blinkbox.c noof.c
 
 OBJS           = xscreensaver-gl-helper.o \
                  atlantis.o b_draw.o b_lockglue.o b_sphere.o bubble3d.o \
@@ -123,7 +123,7 @@ OBJS                = xscreensaver-gl-helper.o \
                  cow_tail.o cow_udder.o glslideshow.o jigglypuff.o klein.o \
                  hypertorus.o glmatrix.o cubestorm.o glknots.o blocktube.o \
                  flipflop.o antspotlight.o polytopes.o gleidescope.o \
-                 mirrorblob.o blinkbox.o
+                 mirrorblob.o blinkbox.o noof.o
 
 GL_EXES                = cage gears moebius pipes sproingies stairs superquadrics \
                  morph3d rubik atlantis lament bubble3d glplanet pulsar \
@@ -133,7 +133,7 @@ GL_EXES             = cage gears moebius pipes sproingies stairs superquadrics \
                  endgame glblur flurry atunnel flyingtoasters bouncingcow \
                  glslideshow jigglypuff klein hypertorus glmatrix cubestorm \
                  glknots blocktube flipflop antspotlight polytopes \
-                 gleidescope mirrorblob blinkbox
+                 gleidescope mirrorblob blinkbox noof
 GLE_EXES       = extrusion
 GL_UTIL_EXES   = xscreensaver-gl-helper
 HACK_EXES      = @GL_EXES@ @GLE_EXES@
@@ -165,7 +165,7 @@ GL_MEN              = atlantis.man boxed.man bubble3d.man cage.man circuit.man \
                  jigglypuff.man klein.man hypertorus.man glmatrix.man \
                  cubestorm.man glknots.man blocktube.man flipflop.man \
                  antspotlight.man polytopes.man gleidescope.man \
-                 mirrorblob.man blinkbox.man
+                 mirrorblob.man blinkbox.man noof.man
 MEN            = @GL_MEN@
 EXTRAS         = README Makefile.in dxf2gl.pl
 
@@ -584,6 +584,9 @@ mirrorblob: mirrorblob.o    $(HACK_OBJS) $(GRAB_OBJS)
 blinkbox:      blinkbox.o      sphere.o $(HACK_OBJS)
        $(CC_HACK) -o $@ $@.o   sphere.o $(HACK_OBJS) $(HACK_LIBS)
 
+noof:  noof.o                  $(HACK_OBJS)
+       $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(HACK_LIBS)
+
 dnalogo:       dnalogo.o       tube.o $(TRACK_OBJS) $(HACK_OBJS)
        $(CC_HACK) -o $@ $@.o   tube.o $(TRACK_OBJS) $(HACK_OBJS) $(HACK_LIBS)
 
@@ -784,6 +787,7 @@ molecule.o: $(srcdir)/rotator.h
 molecule.o: $(srcdir)/sphere.h
 molecule.o: $(srcdir)/tube.h
 morph3d.o: ../../config.h
+noof.o: ../../config.h
 pipeobjs.o: $(srcdir)/buildlwo.h
 pipes.o: $(srcdir)/buildlwo.h
 pipes.o: ../../config.h
index e0a90ae897fe630734516ced4e9addf4668d8aa1..9e4a449d7052d883cf1c371e6414c61cfcf1963e 100644 (file)
@@ -147,9 +147,9 @@ static XrmOptionDescRec opts[] =
 
 static argtype vars[] =
 {
- {(caddr_t *) & whalespeed, "whalespeed", "WhaleSpeed", DEF_WHALESPEED, t_Int},
- {(caddr_t *) &do_texture,  "texture",    "Texture",    DEF_TEXTURE,   t_Bool},
- {(caddr_t *) &do_gradient, "gradient",   "Gradient",   DEF_GRADIENT,  t_Bool},
+ {&whalespeed, "whalespeed", "WhaleSpeed", DEF_WHALESPEED, t_Int},
+ {&do_texture,  "texture",    "Texture",    DEF_TEXTURE,   t_Bool},
+ {&do_gradient, "gradient",   "Gradient",   DEF_GRADIENT,  t_Bool},
 };
 
 static OptionStruct desc[] =
@@ -345,16 +345,9 @@ reshape_atlantis(ModeInfo * mi, int width, int height)
 }
 
 
-/* jwz -- this doesn't really work very well.
-
-   All I want to do is give the tank a gradient-filled background, instead
-   of just solid blue.  The following was my guess as to how to do this,
-   but it kills my frame rate.  I guess there's a more efficient way to do
-   this, but I don't see it...
-
-   I mean, all I want to do is dump some non-projected bytes into the color
-   buffer, then zero out the depth buffer.  That *can't* be expensive, can
-   it?
+/* Fill the background with a gradient -- thanks to 
+   Phil Carrig <pod@internode.on.net> for figuring out
+   how to do this more efficiently!
  */
 static void
 clear_tank (atlantisstruct * ap)
@@ -363,83 +356,44 @@ clear_tank (atlantisstruct * ap)
 
   if (do_gradient && !ap->wire)
     {
-      static GLuint gradient_list = 0;
-      static GLuint gradient_tex = 0;
-
-      if (gradient_list == 0)
+      GLfloat top[3] = { 0.00, 0.40, 0.70 };
+      GLfloat bot[3] = { 0.00, 0.05, 0.18 };
+
+      glMatrixMode(GL_PROJECTION);
+      glPushMatrix();
+      {
+        glLoadIdentity();
+        glMatrixMode(GL_MODELVIEW);
+        glPushMatrix();
         {
-          unsigned char *pixels = 0;
-          int start = 64;
-          int end = start + 128;
-          int size = 4 * (end - start);
-          int i;
-
-          pixels = (unsigned char *) malloc (size);
-          i = 0;
-          while (i < size)
-            {
-              pixels[i] = 0; i++;
-              pixels[i] = (start + (i>>2)) * 0.56; i++;
-              pixels[i] = (start + (i>>2)); i++;
-              pixels[i] = 255; i++;
-            }
-
-          clear_gl_error();
-
-          glGenTextures(1, &gradient_tex);
-          glBindTexture(GL_TEXTURE_1D, gradient_tex);
-
-          glTexImage1D(GL_TEXTURE_1D, 0, 4,
-                       (end - start), 0,
-                       GL_RGBA, GL_UNSIGNED_BYTE, pixels);
-          check_gl_error ("gradient texture");
-          glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
-          glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
-
-
-          gradient_list = glGenLists(1);
-          glNewList(gradient_list, GL_COMPILE);
-
-          glDepthMask (False);
-          glDisable(GL_DEPTH_TEST);
-          glDisable(GL_LIGHTING);
-          glDisable(GL_TEXTURE_2D);
-          glEnable(GL_TEXTURE_1D);
-          glBindTexture(GL_TEXTURE_1D, gradient_tex);
-          glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL); 
-          glTexParameterf(GL_TEXTURE_1D, GL_TEXTURE_WRAP_S, GL_CLAMP);
-
-          glMatrixMode(GL_PROJECTION);
-          glPushMatrix();
           glLoadIdentity();
-          glRotatef(90, 0, 0, 1);
-          glTranslatef(-1, -1, 0);
-          glScalef(2, 2, 1);
-
-          glBegin(GL_QUADS);
-          glTexCoord1i(1); glVertex3i(1, 0, 0);
-          glTexCoord1i(0); glVertex3i(0, 0, 0);
-          glTexCoord1i(0); glVertex3i(0, 1, 0);
-          glTexCoord1i(1); glVertex3i(1, 1, 0);
-          glEnd();
-
-          glPopMatrix();
-
-          glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); 
-          glDisable(GL_TEXTURE_1D);
-
-          glDepthMask (True);
-          glEnable(GL_DEPTH_TEST);
-          glEnable(GL_CULL_FACE);
-          glEnable(GL_LIGHTING);
-          if (do_texture)
-            glEnable(GL_TEXTURE_2D);
 
-          glEndList();
-          check_gl_error ("gradient list");
+          /* save GL_COLOR_MATERIAL, GL_COLOR_MATERIAL_FACE, etc.
+             This stalls the pipeline, so it would be better to do this
+             with explicit enable/disable calls, but I can't figure
+             out how to undo the glEnable() and glColor() calls below!
+             Simply calling glDisable(GL_COLOR_MATERIAL) is insufficient!
+           */
+          glPushAttrib (GL_LIGHTING_BIT);
+          {
+            glEnable (GL_COLOR_MATERIAL);
+
+            glShadeModel(GL_SMOOTH);
+            glBegin(GL_QUADS);
+            glColor3f (bot[0], bot[1], bot[2]); glVertex3f (-1, -1, 1);
+            glColor3f (bot[0], bot[1], bot[2]); glVertex3f ( 1, -1, 1);
+            glColor3f (top[0], top[1], top[2]); glVertex3f ( 1,  1, 1);
+            glColor3f (top[0], top[1], top[2]); glVertex3f (-1,  1, 1);
+            glEnd();
+          }
+          glPopAttrib();
         }
+        glPopMatrix();
+      }
+      glMatrixMode(GL_PROJECTION);
+      glPopMatrix();
 
-      glCallList(gradient_list);
+      glMatrixMode(GL_MODELVIEW);
     }
 }
 
index 6d3b8b621f9073b23c1c422687986be9865acfc8..966b1be3c29c69dad17face448b823426ae7b3b2 100644 (file)
@@ -98,9 +98,9 @@ static XrmOptionDescRec opts[] = {
 };
 
 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},
+  {&do_light,   "light",   "Light",   DEF_LIGHT,   t_Bool},
+  {&do_wire,    "wire",    "Wire",    DEF_WIRE,    t_Bool},
+  {&do_texture, "texture", "Texture", DEF_TEXTURE, t_Bool},
 };
 
 static OptionStruct desc[] =
index bbd1e599f0326a1bc1239a123fa8df4d36111518..c057943f5344066893eb6704aad6e98e83b211eb 100644 (file)
@@ -5,7 +5,7 @@
  * 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 
+ * software for any purpose.  It is provided "as is" without express or
  * implied warranty.
  */
 
@@ -18,10 +18,22 @@ extern XtAppContext app;
 #define HACK_DRAW        draw_ball
 #define HACK_RESHAPE  reshape_ball
 #define sws_opts         xlockmore_opts
-
 #define MAX_COUNT 20
+#define ALPHA_AMT 0.05
+
+/* this should be between 1 and 4 */
+#define DEF_WH      "1"
+#define DEF_DISSOLVE "False"
+#define DEF_FADE    "True"
 
-#define DEFAULTS       "*delay:        30000       \n" \
+#define DEFAULTS       "*delay:          30000         \n" \
+                               "*wireframe:  False      \n" \
+                       "*boxsize:  " DEF_WH      "\n" \
+                    "*dissolve:  " DEF_DISSOLVE "\n" \
+                    "*fade:     " DEF_FADE    "\n" \
+
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
 
 #include "xlockmore.h"
 #include "sphere.h"
@@ -42,6 +54,8 @@ typedef struct{
   int counter;
   GLfloat color[3];
   GLfloat rot[4];
+  int des_count;
+  int alpha_count;
 }Side;
 
 struct Bounding_box {
@@ -56,28 +70,51 @@ struct Ball {
   int d;
 } ball = {0,0,0,1};
 
+struct {
+  GLfloat wh; /*width Height*/
+  GLfloat d; /*depth*/
+} bscale = {1, 0.25};
+
 static GLuint ballList;
 static GLuint boxList;
 Tdpos mo = { 1.0, 1.0, 1.0};  /*motion*/
 Tdpos moh= {-1.0,-1.5,-1.5}; /*hold motion value*/
 
-GLfloat bscale[3] = {1,1,0.25};
-GLfloat bpos[3];
+Tdpos bpos= {1.0, 1.0, 1.0};
 
 /*sides*/
-static Side lside = {0, {0, 0, 0,}, MAX_COUNT,  {1.0, 0.0, 0.0},{90,0,1,0}};/*Red*/
-static Side rside = {0, {0, 0, 0,}, MAX_COUNT,  {0.0, 1.0, 0.0},{90,0,1,0}};/*Green*/
-static Side tside = {0, {0, 0, 0,}, MAX_COUNT,  {0.0, 0.0, 1.0},{90,1,0,0}};/*Blue*/
-static Side bside = {0, {0, 0, 0,}, MAX_COUNT,  {1.0, 0.5, 0.0},{90,1,0,0}};/*Orange*/
-static Side fside = {0, {0, 0, 0,}, MAX_COUNT,  {1.0, 1.0, 0.0},{90,0,0,1}};/*Yellow*/
-static Side aside = {0, {0, 0, 0,}, MAX_COUNT,  {0.5, 0.0, 1.0},{90,0,0,1}};/*Purple*/
+static Side lside = {0, {0, 0, 0,}, MAX_COUNT,  {1.0, 0.0, 0.0},{90,0,1,0},1,1};/*Red*/
+static Side rside = {0, {0, 0, 0,}, MAX_COUNT,  {0.0, 1.0, 0.0},{90,0,1,0},1,1};/*Green*/
+static Side tside = {0, {0, 0, 0,}, MAX_COUNT,  {0.0, 0.0, 1.0},{90,1,0,0},1,1};/*Blue*/
+static Side bside = {0, {0, 0, 0,}, MAX_COUNT,  {1.0, 0.5, 0.0},{90,1,0,0},1,1};/*Orange*/
+static Side fside = {0, {0, 0, 0,}, MAX_COUNT,  {1.0, 1.0, 0.0},{90,0,0,1},1,1};/*Yellow*/
+static Side aside = {0, {0, 0, 0,}, MAX_COUNT,  {0.5, 0.0, 1.0},{90,0,0,1},1,1};/*Purple*/
 Side *sp;
 
 /* lights */
 static float LightDiffuse[]=   { 1.0f, 1.0f, 1.0f, 1.0f };
 static float LightPosition[]=  { 20.0f, 100.0f, 20.0f, 1.0f };
 
-ModeSpecOpt sws_opts = {0,NULL,0,NULL,NULL};
+static Bool do_dissolve;
+static Bool do_fade;
+static GLfloat des_amt   = 1;
+
+static XrmOptionDescRec opts[] = {
+  { "-boxsize", ".boxsize", XrmoptionSepArg, 0 },
+  { "-dissolve", ".dissolve", XrmoptionNoArg, "True" },
+  { "+dissolve", ".dissolve", XrmoptionNoArg, "False" },
+  { "-fade",    ".fade",    XrmoptionNoArg, "True" },
+  { "+fade",    ".fade",    XrmoptionNoArg, "False" }
+
+};
+
+static argtype vars[] = {
+  {(caddr_t *) &bscale.wh,  "boxsize",  "Boxsize",  DEF_WH,      t_Float},
+  {(caddr_t *) &do_dissolve, "dissolve",  "Dissolve",  DEF_DISSOLVE, t_Bool},
+  {(caddr_t *) &do_fade,    "fade",     "Fade",     DEF_FADE,    t_Bool},
+};
+
+ModeSpecOpt sws_opts = {countof(opts), opts, countof(vars), vars, NULL};
 
 void
 swap(GLfloat *a, GLfloat *b)
@@ -87,7 +124,7 @@ swap(GLfloat *a, GLfloat *b)
   *b = t;
 }
 
-float 
+float
 get_rand(void)
 {
   GLfloat j = 1+(random() % 2);
@@ -106,7 +143,7 @@ swap_mov(GLfloat *a, GLfloat *b)
     *a = j;
 }
 
-void 
+void
 cp_b_pos(Tdpos *s_pos){
   s_pos->x = ball.x;
   s_pos->y = ball.y;
@@ -116,15 +153,19 @@ cp_b_pos(Tdpos *s_pos){
 void
 hit_side(void)
 {
-  if ((ball.x - ball.d) <= bbox.bottom.x){ 
+  if ((ball.x - ball.d) <= bbox.bottom.x){
     lside.hit = 1;
-    lside.counter = MAX_COUNT;
+    lside.counter   = MAX_COUNT;
+    lside.des_count = 1;
+    lside.alpha_count = 0;
     cp_b_pos(&lside.pos);
     swap_mov(&mo.x,&moh.x);
   }else
-  if ((ball.x + ball.d) >= bbox.top.x){ 
+  if ((ball.x + ball.d) >= bbox.top.x){
     rside.hit = 1;
     rside.counter = MAX_COUNT;
+    rside.des_count = 1;
+    rside.alpha_count = 0;
     cp_b_pos(&rside.pos);
     swap_mov(&mo.x,&moh.x);
   }
@@ -135,13 +176,17 @@ hit_top_bottom(void)
 {
   if ((ball.y - ball.d) <= bbox.bottom.y){
     bside.hit = 1;
-    bside.counter = MAX_COUNT;    
+    bside.counter = MAX_COUNT;
+    bside.des_count = 1;
+    bside.alpha_count = 0;
     cp_b_pos(&bside.pos);
     swap_mov(&mo.y,&moh.y);
   }else
   if ((ball.y + ball.d) >= bbox.top.y){
     tside.hit = 1;
     tside.counter = MAX_COUNT;
+    tside.des_count = 1;
+    tside.alpha_count = 0;
     cp_b_pos(&tside.pos);
     swap_mov(&mo.y,&moh.y);
   }
@@ -149,16 +194,20 @@ hit_top_bottom(void)
 
 void
 hit_front_back(void)
-{    
+{
   if ((ball.z - ball.d) <= bbox.bottom.z){
     aside.hit = 1;
     aside.counter = MAX_COUNT;
+    aside.des_count = 1;
+    aside.alpha_count = 0;
     cp_b_pos(&aside.pos);
     swap_mov(&mo.z,&moh.z);
   }else
   if((ball.z + ball.d) >= bbox.top.z){
     fside.hit = 1;
     fside.counter = MAX_COUNT;
+    fside.des_count = 1;
+    fside.alpha_count = 0;
     cp_b_pos(&fside.pos);
     swap_mov(&mo.z,&moh.z);
   }
@@ -183,11 +232,11 @@ reshape_ball (ModeInfo *mi, int width, int height)
 }
 
 void
-unit_cube(void)
+unit_cube(int wire)
 {
-  glBegin(GL_QUADS);           
+  glBegin((wire)?GL_LINE_LOOP:GL_QUADS);
   glNormal3f( 0.0f, -1.0f, 0.0f);
-  glVertex3f(-1.0f, -1.0f, -1.0f);     
+  glVertex3f(-1.0f, -1.0f, -1.0f);
   glVertex3f( 1.0f, -1.0f, -1.0f);
   glVertex3f( 1.0f, -1.0f,  1.0f);
   glVertex3f(-1.0f, -1.0f,  1.0f);
@@ -200,7 +249,7 @@ unit_cube(void)
   glVertex3f(-1.0f, -1.0f, -1.0f);
   glVertex3f(-1.0f,  1.0f, -1.0f);
   glVertex3f( 1.0f,  1.0f, -1.0f);
-  glVertex3f( 1.0f, -1.0f, -1.0f);     
+  glVertex3f( 1.0f, -1.0f, -1.0f);
   glNormal3f( 1.0f,  0.0f,  0.0f);
   glVertex3f( 1.0f, -1.0f, -1.0f);
   glVertex3f( 1.0f,  1.0f, -1.0f);
@@ -216,50 +265,75 @@ unit_cube(void)
   glVertex3f(-1.0f,  1.0f,  1.0f);
   glVertex3f( 1.0f,  1.0f,  1.0f);
   glVertex3f( 1.0f,  1.0f, -1.0f);
-  glEnd();                                             
+  glEnd();
 }
 
-void 
+void
 init_ball (ModeInfo *mi)
-{ 
+{
   #define SPHERE_SLICES 32  /* how densely to render spheres */
   #define SPHERE_STACKS 16
+  int wire = MI_IS_WIREFRAME(mi);
+
   sp = malloc(sizeof(*sp));
   if(sp == NULL){
     fprintf(stderr,"Could not allocate memory\n");
     exit(1);
   }
+  if( (bscale.wh < 1) ||
+      (bscale.wh > 4) ) {
+    fprintf(stderr,"Boxsize out of range. Using default\n");
+    bscale.wh = 1;
+  }
+  if (do_dissolve){
+    des_amt = bscale.wh / MAX_COUNT;
+  }
   init_GL(mi);
   reshape_ball(mi, MI_WIDTH(mi), MI_HEIGHT(mi));
   ballList = glGenLists(1);
   glNewList(ballList, GL_COMPILE);
-  unit_sphere (SPHERE_STACKS, SPHERE_SLICES, False);
+  unit_sphere (SPHERE_STACKS, SPHERE_SLICES, wire);
   glEndList ();
 
   boxList = glGenLists(1);
   glNewList(boxList, GL_COMPILE);
-  unit_cube();
+  unit_cube(wire);
   glEndList();
 
+  if (wire) return;
+
   glEnable(GL_COLOR_MATERIAL);
-  glShadeModel(GL_SMOOTH);                             
+  glShadeModel(GL_SMOOTH);
   glClearColor(0.0f, 0.0f, 0.0f, 0.5f);
-  glClearDepth(1.0f);                          
-  glEnable(GL_DEPTH_TEST);             
+  glClearDepth(1.0f);
+  glEnable(GL_DEPTH_TEST);
   glDepthFunc(GL_LEQUAL);
   glEnable(GL_LIGHTING);
   glClearDepth(1);
   glLightfv(GL_LIGHT1, GL_DIFFUSE, LightDiffuse);
   glLightfv(GL_LIGHT1, GL_POSITION,LightPosition);
   glEnable(GL_LIGHT1);
+  if (do_fade){
+    glEnable(GL_BLEND);
+    glDisable(GL_DEPTH_TEST);
+  }
+}
+
+void
+CheckBoxPos(GLfloat bot_x, GLfloat top_x, GLfloat bot_y, GLfloat top_y)
+{
+  /*Make sure it's inside of the bounding box*/
+  bpos.x = ((bpos.x - bscale.wh) < bot_x) ? bot_x + bscale.wh : bpos.x;
+  bpos.x = ((bpos.x + bscale.wh) > top_x) ? top_x - bscale.wh : bpos.x;
+  bpos.y = ((bpos.y - bscale.wh) < bot_y) ? bot_y + bscale.wh : bpos.y;
+  bpos.y = ((bpos.y + bscale.wh) > top_y) ? top_y - bscale.wh : bpos.y;
 }
 
 void
 draw_ball (ModeInfo *mi)
-{  
+{
    Display *dpy = MI_DISPLAY(mi);
    Window window = MI_WINDOW(mi);
-   /*int dem = 1;*/
    int i = 0;
    glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
 
@@ -271,6 +345,7 @@ draw_ball (ModeInfo *mi)
    glRotated(0.25,0,1,0);
    glRotated(0.25,1,0,0);
 
+
    glColor3f(1,1,1);
    glPushMatrix();
    glTranslatef(ball.x += mo.x,
@@ -284,60 +359,83 @@ draw_ball (ModeInfo *mi)
     switch(i){
       case 0:{
                sp = &lside;
-               bpos[0] = lside.pos.z*-1;
-               bpos[1] = lside.pos.y;
-               bpos[2] = bbox.bottom.x - bscale[3];
+               bpos.x = lside.pos.z*-1;
+               bpos.y = lside.pos.y;
+               bpos.z = bbox.bottom.x - bscale.d;
+               if (sp->hit)
+                CheckBoxPos(bbox.bottom.z,bbox.top.z,bbox.bottom.y,bbox.top.y);
                break;
              }
       case 1:{
                sp = &rside;
-               bpos[0] = rside.pos.z*-1;
-               bpos[1] = rside.pos.y;
-               bpos[2] = bbox.top.x + bscale[3];
+               bpos.x = rside.pos.z*-1;
+               bpos.y = rside.pos.y;
+               bpos.z = bbox.top.x + bscale.d;
+               if (sp->hit)
+                CheckBoxPos(bbox.bottom.z,bbox.top.z,bbox.bottom.y,bbox.top.y);
                break;
              }
       case 2:{
                sp = &tside;
-               bpos[0] = tside.pos.x;
-               bpos[1] = tside.pos.z;
-               bpos[2] = bbox.bottom.y - bscale[3];
+               bpos.x = tside.pos.x;
+               bpos.y = tside.pos.z;
+               bpos.z = bbox.bottom.y - bscale.d;
+               if (sp->hit)
+                CheckBoxPos(bbox.bottom.x,bbox.top.x,bbox.bottom.z,bbox.top.z);
                break;
              }
       case 3:{
                sp = &bside;
-               bpos[0] = bside.pos.x;
-               bpos[1] = bside.pos.z;
-               bpos[2] = bbox.top.y + bscale[3];
+               bpos.x = bside.pos.x;
+               bpos.y = bside.pos.z;
+               bpos.z = bbox.top.y + bscale.d;
+               if (sp->hit)
+                CheckBoxPos(bbox.bottom.x,bbox.top.x,bbox.bottom.z,bbox.top.z);
                break;
              }
       case 4:{
                sp = &fside;
-               bpos[0] = fside.pos.y;
-               bpos[1] = fside.pos.x*-1;
-               bpos[2] = bbox.top.z + bscale[3];
+               bpos.x = fside.pos.y;
+               bpos.y = fside.pos.x*-1;
+               bpos.z = bbox.top.z + bscale.d;
+               if (sp->hit)
+                CheckBoxPos(bbox.bottom.y,bbox.top.y,bbox.bottom.x,bbox.top.x);
                break;
              }
       case 5:{
                sp = &aside;
-               bpos[0] = aside.pos.y;
-               bpos[1] = aside.pos.x*-1;
-               bpos[2] = bbox.bottom.z + bscale[3];
+               bpos.x = aside.pos.y;
+               bpos.y = aside.pos.x*-1;
+               bpos.z = bbox.bottom.z + bscale.d;
+               if (sp->hit)
+                CheckBoxPos(bbox.bottom.y,bbox.top.y,bbox.bottom.x,bbox.top.x);
                break;
              }
     }
     if(sp->hit){
-     glColor3fv(sp->color);
-     glPushMatrix();
-     glRotatef(sp->rot[0],sp->rot[1],sp->rot[2],sp->rot[3]);
-     glTranslatef(bpos[0],bpos[1],bpos[2]);
-     /*dem = (MAX_COUNT-(sp->counter+1));*/
-     /*glScalef(bscale[0]/dem,bscale[1]/dem,bscale[2]);*/
-     glScalef(bscale[0],bscale[1],bscale[2]);
-     glCallList(boxList);
-     glPopMatrix();
-     sp->counter--;
-     if(!sp->counter)
-       sp->hit = 0;
+      if(do_fade){
+        glColor4f(sp->color[0],sp->color[1],sp->color[2],1-(ALPHA_AMT * sp->alpha_count));
+      }else{
+        glColor3fv(sp->color);
+      }
+      glBlendFunc(GL_SRC_ALPHA,GL_ONE);
+      glPushMatrix();
+      glRotatef(sp->rot[0],sp->rot[1],sp->rot[2],sp->rot[3]);
+      glTranslatef(bpos.x,bpos.y,bpos.z);
+      if (do_dissolve) {
+         glScalef(bscale.wh-(des_amt*sp->des_count),bscale.wh-(des_amt*sp->des_count),bscale.d);
+      }else{
+        glScalef(bscale.wh,bscale.wh,bscale.d);
+      }
+      glCallList(boxList);
+      glPopMatrix();
+      sp->counter--;
+      sp->des_count++;
+      sp->alpha_count++;
+      if(!sp->counter)
+      {
+        sp->hit = 0;
+      }
     }
     i++;
   }
index e8815d7c86b5c0e2cef83c3d978f72bb2ed43d74..0e0c2437c71e2e7fdcbdf6b76ca1ec124ec4987b 100644 (file)
@@ -2,12 +2,16 @@
 .SH NAME
 blinkbox 
 .SH SYNOPSIS
-.B boundingbox
+.B blinkbox
 [\-display \fIhost:display.screen\fP]
 [\-visual \fIvisual\fP]
 [\-window]
 [\-root]
 [\-delay \fInumber\fP]
+[\-wireframe]
+[\-boxsize \fInumber\fP]
+[\-dissolve]
+[\-fade]
 .SH DESCRIPTION
 Shows a ball contained inside of a bounding box. Colored blocks blink in
 when the ball hits the edges.
@@ -25,6 +29,18 @@ Draw on the root window.
 .TP 8
 .B \-delay \fInumber\fP
 Per-frame delay, in microseconds.  Default: 30000 (0.03 seconds.).
+.TP 8
+.B \-wireframe | \-no-wireframe
+Render in wireframe instead of solid.
+.TP 8
+.B \-boxsize 
+Sets the size of the colored boxes. Should be between 1 and 4. Default: 1 
+.TP 8
+.B \-dissolve | \-no-dissolve
+Boxes shrink instead of just vanishing.
+.TP 8
+.B \-fade | \-no-fade
+Boxes fade to transparency instead of just vanishing.
 .SH ENVIRONMENT
 .PP
 .TP 8
index f32c7b1e4a0d56241beebc06351f5f02eef381c3..9b4907eae54f357a61ade7f455c0a62c7e48febd 100644 (file)
@@ -30,7 +30,7 @@ extern XtAppContext app;
 #define DEF_TEXTURE     "True"
 #define DEF_FOG         "True"
 
-#define DEFAULTS        "*delay:       10000           \n" \
+#define DEFAULTS        "*delay:       40000           \n" \
                         "*holdtime:   " DEF_HOLDTIME   "\n" \
                         "*changetime: " DEF_CHANGETIME "\n" \
                        "*wireframe:    False           \n" \
@@ -105,11 +105,11 @@ static XrmOptionDescRec opts[] = {
 };
 
 static argtype vars[] = {
-    {(caddr_t *) &holdtime, "holdtime",  "Hold Time",  DEF_HOLDTIME,  t_Int},
-    {(caddr_t *) &changetime, "changetime",  "Change Time",  DEF_CHANGETIME, \
+    {&holdtime, "holdtime",  "Hold Time",  DEF_HOLDTIME,  t_Int},
+    {&changetime, "changetime",  "Change Time",  DEF_CHANGETIME, \
      t_Int},
-    {(caddr_t *) &do_texture, "texture",    "Texture", DEF_TEXTURE,   t_Bool},
-    {(caddr_t *) &do_fog,     "fog",        "Fog",     DEF_FOG,       t_Bool},
+    {&do_texture, "texture",    "Texture", DEF_TEXTURE,   t_Bool},
+    {&do_fog,     "fog",        "Fog",     DEF_FOG,       t_Bool},
 };
 
 static OptionStruct desc[] = {
@@ -123,7 +123,7 @@ ModeSpecOpt blocktube_opts = {countof(opts), opts, countof(vars), vars, desc};
 ModStruct blocktube_description =
     {"blocktube", "init_blocktube", "draw_blocktube", "release_blocktube",
      "draw_blocktube", "init_blocktube", (char *)NULL, &blocktube_opts,
-     10000, 30, 1, 1, 64, 1.0, "",
+     40000, 30, 1, 1, 64, 1.0, "",
      "A shifting tunnel of reflective blocks", 0, NULL};
 #endif /* USE_MODULES */
 
@@ -154,12 +154,17 @@ static Bool LoadGLTextures(ModeInfo *mi)
 
 static void newTargetColor(void)
 {
-    targetR = random() % 256;
-    targetG = random() % 256;
-    targetB = random() % 256;
-    deltaR = (targetR - currentR) / changetime;
-    deltaG = (targetG - currentG) / changetime;
-    deltaB = (targetB - currentB) / changetime;
+    int luminance = 0;
+
+    while (luminance <= 150) {
+        targetR = random() % 256;
+        targetG = random() % 256;
+        targetB = random() % 256;
+        deltaR = (targetR - currentR) / changetime;
+        deltaG = (targetG - currentG) / changetime;
+        deltaB = (targetB - currentB) / changetime;
+        luminance = 0.3 * targetR + 0.59 * targetG + 0.11 * targetB;
+    }
 }
 
 static void randomize_entity (entity *ent)
index 7b3963cce62f6316b68e68a63eb0994b7c837e91..825355f22ff7eca6f68a73aa035e8800059650a5 100644 (file)
@@ -30,7 +30,7 @@ Draw on a newly-created window.  This is the default.
 Draw on the root window.
 .TP 8
 .B \-delay \fInumber\fP
-Per-frame delay, in microseconds.  Default: 10000 (0.01 seconds.).
+Per-frame delay, in microseconds.  Default: 40000 (0.04 seconds.).
 .TP 8
 .B \-holdtime \fInumber\fP
 How long to stay on the same color.  Default: 1000 frames.
index 667dd1e8486ca8a473ea5cf14f94fe3ad8161554..a12beca6ccf19e1898fc60efe1808c46b0324844 100644 (file)
@@ -104,8 +104,8 @@ static XrmOptionDescRec opts[] = {
 };
 
 static argtype vars[] = {
-  {(caddr_t *) &speed,      "speed",      "Speed",   DEF_SPEED,     t_Float},
-  {(caddr_t *) &do_texture, "texture",    "Texture", DEF_TEXTURE,   t_String},
+  {&speed,      "speed",      "Speed",   DEF_SPEED,     t_Float},
+  {&do_texture, "texture",    "Texture", DEF_TEXTURE,   t_String},
 };
 
 ModeSpecOpt sws_opts = {countof(opts), opts, countof(vars), vars, NULL};
index 238cb3c8f8dcba2d4b7323f4371054c61a5047e2..1200e62c7a339949af85a1de29062b95200b261e 100644 (file)
@@ -66,7 +66,7 @@ static XrmOptionDescRec opts[] = {
 };
 
 static argtype vars[] = {
-  {(caddr_t *) &planetary, "planetary", "Planetary", DEF_PLANETARY, t_Bool},
+  {&planetary, "planetary", "Planetary", DEF_PLANETARY, t_Bool},
 };
 */
 
index 7b55956abec948f1e66bdbd67dcbf0fcba3dbc1d..e7ee382b80daae3fb04d1771578bf2c1e03b1c82 100644 (file)
@@ -102,13 +102,13 @@ static XrmOptionDescRec opts[] = {
 };
 
 static argtype vars[] = {
-  {(caddr_t *) &maxparts, "parts", "Parts", DEF_PARTS, t_Int},
-  {(caddr_t *) &font, "font", "Font", "fixed", t_String},
-  {(caddr_t *) &rotatespeed, "rotatespeed", "Rotatespeed", "1", t_Int},
-  {(caddr_t *) &spin, "spin", "Spin", DEF_SPIN, t_Bool},
-  {(caddr_t *) &rotate, "rotate", "Rotate", "False", t_Bool},
-  {(caddr_t *) &uselight, "light", "Light", "True", t_Bool},
-  {(caddr_t *) &seven, "seven", "Seven", DEF_SEVEN, t_Bool},
+  {&maxparts, "parts", "Parts", DEF_PARTS, t_Int},
+  {&font, "font", "Font", "fixed", t_String},
+  {&rotatespeed, "rotatespeed", "Rotatespeed", "1", t_Int},
+  {&spin, "spin", "Spin", DEF_SPIN, t_Bool},
+  {&rotate, "rotate", "Rotate", "False", t_Bool},
+  {&uselight, "light", "Light", "True", t_Bool},
+  {&seven, "seven", "Seven", DEF_SEVEN, t_Bool},
 };
 
 ModeSpecOpt circuit_opts = {countof(opts), opts, countof(vars), vars, NULL};
index a7399dd17a3bc26a658c77b6a24a8f3b3ec754db..c436420c29b785492e0156db33e4718c28534f09 100644 (file)
@@ -121,12 +121,12 @@ static XrmOptionDescRec opts[] = {
 };
 
 static argtype vars[] = {
-  {(caddr_t *) &do_spin,   "spin",   "Spin",   DEF_SPIN,   t_String},
-  {(caddr_t *) &do_wander, "wander", "Wander", DEF_WANDER, t_Bool},
-  {(caddr_t *) &do_texture, "texture", "Texture", DEF_TEXTURE, t_Bool},
-  {(caddr_t *) &wave_count, "waves",     "Waves",      DEF_WAVE_COUNT, t_Int},
-  {(caddr_t *) &wave_speed, "waveSpeed", "WaveSpeed",  DEF_WAVE_SPEED, t_Int},
-  {(caddr_t *) &wave_radius,"waveRadius","WaveRadius", DEF_WAVE_RADIUS,t_Int},
+  {&do_spin,   "spin",   "Spin",   DEF_SPIN,   t_String},
+  {&do_wander, "wander", "Wander", DEF_WANDER, t_Bool},
+  {&do_texture, "texture", "Texture", DEF_TEXTURE, t_Bool},
+  {&wave_count, "waves",     "Waves",      DEF_WAVE_COUNT, t_Int},
+  {&wave_speed, "waveSpeed", "WaveSpeed",  DEF_WAVE_SPEED, t_Int},
+  {&wave_radius,"waveRadius","WaveRadius", DEF_WAVE_RADIUS,t_Int},
 };
 
 ModeSpecOpt ccs_opts = {countof(opts), opts, countof(vars), vars, NULL};
index cfc53c0e8158c802aa0f6ced126185c9e45007e2..fd5c9d2165a2df9a2021c8e1584bd9bc56e423b8 100644 (file)
@@ -89,10 +89,10 @@ static XrmOptionDescRec opts[] = {
 };
 
 static argtype vars[] = {
-  {(caddr_t *) &do_spin,   "spin",   "Spin",   DEF_SPIN,   t_Bool},
-  {(caddr_t *) &do_wander, "wander", "Wander", DEF_WANDER, t_Bool},
-  {(caddr_t *) &speed,     "speed",  "Speed",  DEF_SPEED,  t_Float},
-  {(caddr_t *) &thickness, "thickness", "Thickness",  DEF_THICKNESS,  t_Float},
+  {&do_spin,   "spin",   "Spin",   DEF_SPIN,   t_Bool},
+  {&do_wander, "wander", "Wander", DEF_WANDER, t_Bool},
+  {&speed,     "speed",  "Speed",  DEF_SPEED,  t_Float},
+  {&thickness, "thickness", "Thickness",  DEF_THICKNESS,  t_Float},
 };
 
 ModeSpecOpt sws_opts = {countof(opts), opts, countof(vars), vars, NULL};
index 64de8a87bcc7414ab53cad8aa829391eeb46a36f..fae186b79fefac78cbeba9ff06d0394a4b56a25d 100644 (file)
@@ -89,9 +89,9 @@ static XrmOptionDescRec opts[] = {
 };
 
 static argtype vars[] = {
-  {(caddr_t *) &do_spin,   "spin",   "Spin",   DEF_SPIN,   t_Bool},
-  {(caddr_t *) &do_wander, "wander", "Wander", DEF_WANDER, t_Bool},
-  {(caddr_t *) &speed,     "speed",  "Speed",  DEF_SPEED,  t_Float},
+  {&do_spin,   "spin",   "Spin",   DEF_SPIN,   t_Bool},
+  {&do_wander, "wander", "Wander", DEF_WANDER, t_Bool},
+  {&speed,     "speed",  "Speed",  DEF_SPEED,  t_Float},
 };
 
 ModeSpecOpt sws_opts = {countof(opts), opts, countof(vars), vars, NULL};
index 5bac990a231bb2bcaec707c1c22f039598667cac..281f5a98dc9e2bdffc7946b84a07f02019242112 100644 (file)
@@ -58,9 +58,9 @@ static XrmOptionDescRec opts[] = {
 int rotate, reflections, smooth;
 
 static argtype vars[] = {
-  {(caddr_t *) &rotate, "rotate", "Rotate", "True", t_Bool},
-  {(caddr_t *) &reflections, "reflections", "Reflections", "True", t_Bool},
-  {(caddr_t *) &smooth, "smooth", "Smooth", "True", t_Bool},
+  {&rotate,      "rotate",      "Rotate",      "True", t_Bool},
+  {&reflections, "reflections", "Reflections", "True", t_Bool},
+  {&smooth,      "smooth",      "Smooth",      "True", t_Bool},
 };
 
 ModeSpecOpt chess_opts = {countof(opts), opts, countof(vars), vars, NULL};
@@ -107,7 +107,7 @@ GLfloat colors[2][3] =
 GLfloat whites[WHITES][3] = 
   {
     {1.0, 0.5, 0.0},
-    {0.8, 0.45, 1.0},
+    {0.9, 0.6, 0.9},
     {0.43, 0.54, 0.76},
     {0.8, 0.8, 0.8},
     {0.15, 0.77, 0.54},
@@ -167,6 +167,8 @@ GLfloat position[] = { 0.0, 5.0, 5.0, 1.0 };
 GLfloat position2[] = { 5.0, 5.0, 5.0, 1.0 };
 GLfloat diffuse2[] = {1.0, 1.0, 1.0, 1.0};
 GLfloat ambient2[] = {0.6, 0.6, 0.6, 1.0};
+GLfloat shininess[] = {60.0};
+GLfloat specular[] = {0.4, 0.4, 0.4, 1.0};
 
 /* configure lighting */
 void setup_lights(void) {
@@ -177,6 +179,9 @@ void setup_lights(void) {
 
 /*   glLightModelfv(GL_LIGHT_MODEL_AMBIENT, ambient2); */
 
+  glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, shininess);
+  glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, specular);
+
   glLightfv(GL_LIGHT1, GL_SPECULAR, diffuse2);
   glLightfv(GL_LIGHT1, GL_DIFFUSE, diffuse2);
   glEnable(GL_LIGHT1);
@@ -223,9 +228,26 @@ void drawMovingPiece(void) {
       mpiece = mpiece == PAWN ? QUEEN : BQUEEN;
   }
   else if(mpiece % PIECES == KNIGHT) {
+    GLfloat shine[1];
+    GLfloat spec[4];
+    GLfloat mult;
     glTranslatef(steps < 50 ? from[1] : to[1], 0.0, 
                 steps < 50 ? from[0] : to[0]);
 
+    mult = steps < 10 
+      ? (1.0 - steps / 10.0) 
+      : 100 - steps < 10 
+      ? specular[0] * (1.0 - (100 - steps) / 10.0) 
+      : 0.0;
+
+    shine[0] = 0.0;/*mult*shininess[0];*/
+    spec[0] = mult*specular[0];
+    spec[1] = mult*specular[1];
+    spec[2] = mult*specular[2];
+    spec[3] = 1.0;
+    glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, shine);
+    glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, spec);
+
     glColor4f(colors[mpiece/7][0], colors[mpiece/7][1], colors[mpiece/7][2],
              fabs(49-steps)/49.0);
     glScalef(fabs(49-steps)/49.0, fabs(49-steps)/49.0, fabs(49-steps)/49.0);
@@ -237,6 +259,10 @@ void drawMovingPiece(void) {
     glEnable(GL_BLEND);
   
   glCallList(piece);
+
+  glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, shininess);
+  glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, specular);
+
   glPopMatrix();
 
   if(!wire)
index f2a956f5438341f0dc1642b5b0e00776bad74a88..0ef40b51e46e23bcab5f0044205b20bb5a2b9760 100644 (file)
@@ -88,10 +88,10 @@ static XrmOptionDescRec opts[] = {
 };
 
 static argtype vars[] = {
-  {(caddr_t *) &which_engine, "engine", "Engine", DEF_ENGINE, t_String},
-  {(caddr_t *) &move,         "move",   "Move",   DEF_WANDER, t_Bool},
-  {(caddr_t *) &spin,         "spin",   "Spin",   DEF_SPIN,   t_Bool},
-  {(caddr_t *) &do_titles,    "titles", "Titles", DEF_TITLES, t_Bool},
+  {&which_engine, "engine", "Engine", DEF_ENGINE, t_String},
+  {&move,         "move",   "Move",   DEF_WANDER, t_Bool},
+  {&spin,         "spin",   "Spin",   DEF_SPIN,   t_Bool},
+  {&do_titles,    "titles", "Titles", DEF_TITLES, t_Bool},
 };
 
 ModeSpecOpt engine_opts = {countof(opts), opts, countof(vars), vars, NULL};
index 07a82dc4bd08513a5f6955cffc4f8ab6f98c82de..1c63435680aa4413a60aa7d4f23c34fb415fe33d 100644 (file)
@@ -141,13 +141,13 @@ static XrmOptionDescRec opts[] = {
 
 
 static argtype vars[] = {
-  {(caddr_t *) &do_light,    "light",   "Light",   DEF_LIGHT,   t_Bool},
-  {(caddr_t *) &do_wire,    "wire",   "Wire",   DEF_WIRE,   t_Bool},
-  {(caddr_t *) &do_texture,    "texture",   "Texture",   DEF_TEXTURE,   t_Bool},
-  {(caddr_t *) &do_texture_quality,    "texture_quality",   "Texture_Quality",   DEF_TEXTURE_QUALITY,   t_Bool},
-  {(caddr_t *) &do_mipmap,    "mipmap",   "Mipmap",   DEF_MIPMAP,   t_Bool},
-  {(caddr_t *) &which_name, "name",   "Name",   DEF_NAME,   t_String},
-  {(caddr_t *) &which_image, "image",   "Image",   DEF_IMAGE,   t_String},
+  {&do_light,    "light",   "Light",   DEF_LIGHT,   t_Bool},
+  {&do_wire,    "wire",   "Wire",   DEF_WIRE,   t_Bool},
+  {&do_texture,    "texture",   "Texture",   DEF_TEXTURE,   t_Bool},
+  {&do_texture_quality,    "texture_quality",   "Texture_Quality",   DEF_TEXTURE_QUALITY,   t_Bool},
+  {&do_mipmap,    "mipmap",   "Mipmap",   DEF_MIPMAP,   t_Bool},
+  {&which_name, "name",   "Name",   DEF_NAME,   t_String},
+  {&which_image, "image",   "Image",   DEF_IMAGE,   t_String},
 };
 
 
index 735c8d2c0729b6ab5a1e022a10be4f02bc209a5c..19d57bf495bc965973e25daaa0145adabb359a04 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * screenflip - takes snapshots of the screen and flips it around
+ * flipscreen3d - takes snapshots of the screen and flips it around
  *
  * version 1.0 - Oct 24, 2001
  *
@@ -18,7 +18,7 @@
 
 
 #ifdef STANDALONE
-# define PROGCLASS                                      "Screenflip"
+# define PROGCLASS                                      "FlipScreen3D"
 # define HACK_INIT                                      init_screenflip
 # define HACK_DRAW                                      draw_screenflip
 # define HACK_RESHAPE                           reshape_screenflip
@@ -69,7 +69,7 @@ static XrmOptionDescRec opts[] = {
 
 
 static argtype vars[] = {
-  {(caddr_t *) &rotate, "rotate", "Rotate", "True", t_Bool},
+  {&rotate, "rotate", "Rotate", "True", t_Bool},
 };
 
 
index 3571bece03dad6ec4fe4f22127e5787a966fddeb..e6a7565765557956f62ceb12636620e1daf124ff 100644 (file)
@@ -70,7 +70,7 @@ static XrmOptionDescRec opts[] = {
 };
 
 static argtype vars[] = {
-    {(caddr_t *) &preset_str, "preset",     "Preset",     DEF_PRESET,     t_String},
+    {&preset_str, "preset",     "Preset",     DEF_PRESET,     t_String},
 };
 
 #define countof(x) (sizeof((x))/sizeof((*x)))
index 5efc529f13fa4e6b4c4fd07264d997018ca52011..e8285627887bfec08c75cf166430dc2599e07a24 100644 (file)
@@ -158,10 +158,10 @@ static XrmOptionDescRec opts[] = {
 };
 
 static argtype vars[] = {
-  {(caddr_t *) &speed,      "speed",      "Speed",   DEF_SPEED,     t_Float},
-  {(caddr_t *) &ntoasters,  "ntoasters",  "Count",   DEF_NTOASTERS, t_Int},
-  {(caddr_t *) &nslices,    "nslices",    "Count",   DEF_NSLICES,   t_Int},
-  {(caddr_t *) &do_texture, "texture",    "Texture", DEF_TEXTURE,   t_Bool},
+  {&speed,      "speed",      "Speed",   DEF_SPEED,     t_Float},
+  {&ntoasters,  "ntoasters",  "Count",   DEF_NTOASTERS, t_Int},
+  {&nslices,    "nslices",    "Count",   DEF_NSLICES,   t_Int},
+  {&do_texture, "texture",    "Texture", DEF_TEXTURE,   t_Bool},
 };
 
 ModeSpecOpt sws_opts = {countof(opts), opts, countof(vars), vars, NULL};
index e1c08bdc35b39d64b243dbd4b66fd4011b170a06..e89ba4e44255464b1de9ad742fa0072902309bd7 100644 (file)
@@ -78,7 +78,7 @@ static XrmOptionDescRec opts[] = {
 };
 
 static argtype vars[] = {
-  {(caddr_t *) &planetary, "planetary", "Planetary", DEF_PLANETARY, t_Bool},
+  {&planetary, "planetary", "Planetary", DEF_PLANETARY, t_Bool},
 };
 
 ModeSpecOpt gears_opts = {countof(opts), opts, countof(vars), vars, NULL};
index 27a6bd4588f1afa993f0d8e4478940218d6f05e8..f2e682addcbbb6020a33468cf6b916064fc919e3 100644 (file)
@@ -148,19 +148,19 @@ static XrmOptionDescRec opts[] = {
 
 
 static argtype vars[] = {
-    {(caddr_t *) & _squares, "squares", "Squares", "19", t_Int},
-    {(caddr_t *) & _resolution, "resolution", "Resolution", "4", t_Int},
-/*    {(caddr_t *) & _draw, "draw", "Draw", "2", t_Int},*/
-    {(caddr_t *) & _flat, "flat", "Flat", "0", t_Int},
-    {(caddr_t *) & _speed, "speed", "Speed", "0.05", t_Float},
-    {(caddr_t *) & _rotationx, "rotationx", "Rotationx", "0.01", t_Float},
-    {(caddr_t *) & _rotationy, "rotationy", "Rotationy", "0.0", t_Float},
-    {(caddr_t *) & _rotationz, "rotationz", "Rotationz", "0.1", t_Float},
-    {(caddr_t *) & _waves, "waves", "Waves", "3", t_Int},
-    {(caddr_t *) & _waveChange, "waveChange", "WaveChange", "50", t_Int},
-    {(caddr_t *) & _waveHeight, "waveHeight", "WaveHeight", "1.0", t_Float},
-    {(caddr_t *) & _waveFreq, "waveFreq", "WaveFreq", "3.0", t_Float},
-    {(caddr_t *) & _zoom, "zoom", "Zoom", "1.0", t_Float},
+    {&_squares, "squares", "Squares", "19", t_Int},
+    {&_resolution, "resolution", "Resolution", "4", t_Int},
+/*    {&_draw, "draw", "Draw", "2", t_Int},*/
+    {&_flat, "flat", "Flat", "0", t_Int},
+    {&_speed, "speed", "Speed", "0.05", t_Float},
+    {&_rotationx, "rotationx", "Rotationx", "0.01", t_Float},
+    {&_rotationy, "rotationy", "Rotationy", "0.0", t_Float},
+    {&_rotationz, "rotationz", "Rotationz", "0.1", t_Float},
+    {&_waves, "waves", "Waves", "3", t_Int},
+    {&_waveChange, "waveChange", "WaveChange", "50", t_Int},
+    {&_waveHeight, "waveHeight", "WaveHeight", "1.0", t_Float},
+    {&_waveFreq, "waveFreq", "WaveFreq", "3.0", t_Float},
+    {&_zoom, "zoom", "Zoom", "1.0", t_Float},
 };
 
 
index f34776b39e97ccaaee061547c176e78a2d96fb73..47edc52a07c109894236cf0bfe7a2033f34276ee 100644 (file)
@@ -115,9 +115,9 @@ static XrmOptionDescRec opts[] = {
 };
 
 static argtype vars[] = {
-  {(caddr_t *) &do_spin,   "spin",   "Spin",   DEF_SPIN,   t_String},
-  {(caddr_t *) &do_wander, "wander", "Wander", DEF_WANDER, t_Bool},
-  {(caddr_t *) &blursize,  "blurSize","BlurSize", DEF_BLURSIZE,  t_Int},
+  {&do_spin,   "spin",   "Spin",   DEF_SPIN,   t_String},
+  {&do_wander, "wander", "Wander", DEF_WANDER, t_Bool},
+  {&blursize,  "blurSize","BlurSize", DEF_BLURSIZE,  t_Int},
 };
 
 ModeSpecOpt sws_opts = {countof(opts), opts, countof(vars), vars, NULL};
index 2a9507318c4acf05727a583e4855af5a3aa0d1e1..0531ebace58e07da648c7edad7c7d7afd2c412b4 100644 (file)
@@ -196,12 +196,12 @@ static XrmOptionDescRec opts[] = {
 };
 
 static argtype vars[] = {
-    {(caddr_t *) & do_texture, (char *) "texture", (char *) "Texture", (char *) DEF_TEXTURE, t_Bool},
-    {(caddr_t *) & do_fog, (char *) "fog", (char *) "Fog", (char *) DEF_FOG, t_Bool},
-    {(caddr_t *) & do_shadows, (char *) "shadows", (char *) "Shadows", (char *) DEF_SHADOWS, t_Bool},
-    {(caddr_t *) & do_trackmouse, (char *) "trackmouse", (char *) "TrackMouse", (char *) DEF_TRACKMOUSE, t_Bool},
-    {(caddr_t *) & do_wander, (char *) "wander", (char *) "Wander", (char *) DEF_WANDER, t_Bool},
-    {(caddr_t *) & num_trees, (char *) "trees", (char *) "Trees", (char *) DEF_TREES, t_Int},
+    {&do_texture,    "texture",    "Texture",    DEF_TEXTURE,    t_Bool},
+    {&do_fog,        "fog",        "Fog",        DEF_FOG,        t_Bool},
+    {&do_shadows,    "shadows",    "Shadows",    DEF_SHADOWS,    t_Bool},
+    {&do_trackmouse, "trackmouse", "TrackMouse", DEF_TRACKMOUSE, t_Bool},
+    {&do_wander,     "wander",     "Wander",     DEF_WANDER,     t_Bool},
+    {&num_trees,     "trees",      "Trees",      DEF_TREES,      t_Int},
 };
 
 static OptionStruct desc[] = {
index 4ce911eed2d149e1456ed77b65fd13a660a51315..47266ef7072added4d30c3b67912f523a211c11a 100644 (file)
@@ -95,12 +95,12 @@ static XrmOptionDescRec opts[] = {
 };
 
 static argtype vars[] = {
-  {(caddr_t *) &do_spin,   "spin",   "Spin",   DEF_SPIN,   t_String},
-  {(caddr_t *) &do_wander, "wander", "Wander", DEF_WANDER, t_Bool},
-  {(caddr_t *) &speed,     "speed",  "Speed",  DEF_SPEED,  t_Float},
-  {(caddr_t *) &thickness, "thickness", "Thickness",  DEF_THICKNESS, t_Float},
-  {(caddr_t *) &segments,  "segments",  "Segments",   DEF_SEGMENTS,  t_Int},
-  {(caddr_t *) &duration,  "duration",  "Duration",   DEF_DURATION,  t_Int},
+  {&do_spin,   "spin",   "Spin",   DEF_SPIN,   t_String},
+  {&do_wander, "wander", "Wander", DEF_WANDER, t_Bool},
+  {&speed,     "speed",  "Speed",  DEF_SPEED,  t_Float},
+  {&thickness, "thickness", "Thickness",  DEF_THICKNESS, t_Float},
+  {&segments,  "segments",  "Segments",   DEF_SEGMENTS,  t_Int},
+  {&duration,  "duration",  "Duration",   DEF_DURATION,  t_Int},
 };
 
 ModeSpecOpt sws_opts = {countof(opts), opts, countof(vars), vars, NULL};
index 9b5754069a039a12e39e14a635ce8a839ba60a7c..3830fa94f1bcb2a18dea3394df85ff4602143bc5 100644 (file)
@@ -209,13 +209,13 @@ static XrmOptionDescRec opts[] = {
 };
 
 static argtype vars[] = {
-  {(caddr_t *) &mode_str,   "mode",       "Mode",    DEF_MODE,      t_String},
-  {(caddr_t *) &speed,      "speed",      "Speed",   DEF_SPEED,     t_Float},
-  {(caddr_t *) &density,    "density",    "Density", DEF_DENSITY,   t_Float},
-  {(caddr_t *) &do_fog,     "fog",        "Fog",     DEF_FOG,       t_Bool},
-  {(caddr_t *) &do_waves,   "waves",      "Waves",   DEF_WAVES,     t_Bool},
-  {(caddr_t *) &do_rotate,  "rotate",     "Rotate",  DEF_ROTATE,    t_Bool},
-  {(caddr_t *) &do_texture, "texture",    "Texture", DEF_TEXTURE,   t_Bool},
+  {&mode_str,   "mode",       "Mode",    DEF_MODE,      t_String},
+  {&speed,      "speed",      "Speed",   DEF_SPEED,     t_Float},
+  {&density,    "density",    "Density", DEF_DENSITY,   t_Float},
+  {&do_fog,     "fog",        "Fog",     DEF_FOG,       t_Bool},
+  {&do_waves,   "waves",      "Waves",   DEF_WAVES,     t_Bool},
+  {&do_rotate,  "rotate",     "Rotate",  DEF_ROTATE,    t_Bool},
+  {&do_texture, "texture",    "Texture", DEF_TEXTURE,   t_Bool},
 };
 
 ModeSpecOpt matrix_opts = {countof(opts), opts, countof(vars), vars, NULL};
@@ -400,8 +400,8 @@ draw_glyph (ModeInfo *mi, int glyph,
            we fade towards a completely solid rectangle.  WTF?
 
            So, for now, instead of changing the alpha, just make the colors
-           be darker.  This isn't quite right (it causes a large dark glyph
-           to occlude the brighter glyphs behind it) but it's close...
+           be darker.  This works out ok so long as we use GL_ONE in
+           glBlendFunc, so that stacked glyph colors are added together.
          */
         r *= a;
         g *= a;
@@ -863,7 +863,13 @@ init_matrix (ModeInfo *mi)
       load_textures (mi, flip_p);
       glEnable(GL_TEXTURE_2D);
       glEnable(GL_BLEND);
-      glBlendFunc(GL_ONE_MINUS_SRC_ALPHA, GL_SRC_ALPHA);
+
+      /* Jeff Epler points out:
+         By using GL_ONE instead of GL_SRC_ALPHA, glyphs are added to
+         each other, so that a bright glyph with a darker one in front
+         is a little brighter than the bright glyph alone.
+       */
+      glBlendFunc (GL_ONE_MINUS_SRC_ALPHA, /* GL_SRC_ALPHA */ GL_ONE);
     }
 
   /* to scale coverage-percent to strips, this number looks about right... */
index 316e6821205dc65c6fcb809febd8253cb3921434..955325d261ecce8908099207cd52269d1c46ddba 100644 (file)
@@ -122,14 +122,14 @@ static XrmOptionDescRec opts[] = {
 };
 
 static argtype vars[] = {
-  {(caddr_t *) &do_rotate,   "rotate",  "Rotate",  DEF_ROTATE,  t_Bool},
-  {(caddr_t *) &do_roll,     "roll",    "Roll",    DEF_ROLL,    t_Bool},
-  {(caddr_t *) &do_wander,   "wander",  "Wander",  DEF_WANDER,  t_Bool},
-  {(caddr_t *) &do_texture,  "texture", "Texture", DEF_TEXTURE, t_Bool},
-  {(caddr_t *) &do_stars,  "stars", "Stars", DEF_STARS, t_Bool},
-  {(caddr_t *) &do_light,    "light",   "Light",   DEF_LIGHT,   t_Bool},
-  {(caddr_t *) &which_image, "image",   "Image",   DEF_IMAGE,   t_String},
-  {(caddr_t *) &resolution,  "resolution","Resolution", DEF_RESOLUTION, t_Int},
+  {&do_rotate,   "rotate",  "Rotate",  DEF_ROTATE,  t_Bool},
+  {&do_roll,     "roll",    "Roll",    DEF_ROLL,    t_Bool},
+  {&do_wander,   "wander",  "Wander",  DEF_WANDER,  t_Bool},
+  {&do_texture,  "texture", "Texture", DEF_TEXTURE, t_Bool},
+  {&do_stars,    "stars",   "Stars",   DEF_STARS,   t_Bool},
+  {&do_light,    "light",   "Light",   DEF_LIGHT,   t_Bool},
+  {&which_image, "image",   "Image",   DEF_IMAGE,   t_String},
+  {&resolution,  "resolution","Resolution", DEF_RESOLUTION, t_Int},
 };
 
 ModeSpecOpt planet_opts = {countof(opts), opts, countof(vars), vars, NULL};
index 53c15249ebd5bd14839b9989eadf84eb8e541b8f..61fa58deaf8b806d9beda8b00e7107ca84a07641 100644 (file)
@@ -7,9 +7,11 @@ glslideshow - slideshow of images using smooth zooming and fades
 [\-visual \fIvisual\fP]
 [\-window]
 [\-root]
+[\-duration \fIseconds\fP]
+[\-zoom \fIpercent\fP]
 [\-pan \fIseconds\fP]
 [\-fade \fIseconds\fP]
-[\-zoom \fIpercent\fP]
+[\-speed \fIfloat\fP]
 [\-delay \fIusecs\fP]
 [\-cutoff \fIint\fP]
 [\-titles]
@@ -38,6 +40,10 @@ Draw on a newly-created window.  This is the default.
 .B \-root
 Draw on the root window.
 .TP 8
+.B \-duration \fIseconds\fP
+How long each image will be displayed before loading a new one.
+Default 30 seconds.
+.TP 8
 .B \-pan \fIseconds\fP
 How long each pan should last.  Default 6 seconds.
 .TP 8
@@ -56,6 +62,9 @@ then the images will always fill the screen, and no panning or
 zooming will occur.  Images will still smoothly fade from one
 to another, however, assuming \fI\-fade\fP is non-zero.
 .TP 8
+.B \-speed \fIfloat\fP
+Speed up or slow down.  2 means twice as fast; 0.5 means half as fast.
+.TP 8
 .B \-delay \fInumber\fP
 Per-frame delay, in microseconds.  Default: 20000 (0.02 seconds.).
 .TP 8
index dd533539f41e0b06c4142465aa6badb9025dd794..9ee2cb2ad67acf0484bec31f2cff1fdb8f6e9115 100644 (file)
@@ -36,7 +36,6 @@
 #include <stddef.h>
 #include <stdlib.h>
 #include <string.h>
-#include <libgen.h>
 
 /* angles */
 #define ZERO     0.0
@@ -175,17 +174,17 @@ static XrmOptionDescRec opts[] = {
 };
 
 static argtype vars[] = {
-    {(caddr_t *) &explode, "explode", "Explode", DEF_EXPLODE, t_Float},
-    {(caddr_t *) &angvel, "angvel", "Angular Velocity", DEF_ANGVEL, t_Float},
-    {(caddr_t *) &accel, "accel", "Acceleration", DEF_ACCEL, t_Float},
-    {(caddr_t *) &statictime, "statictime", "Static Time", DEF_STATICTIME, t_Int},
-    {(caddr_t *) &yangvel, "yangvel", "Angular Velocity about Y axis", DEF_YANGVEL, t_Float},
-    {(caddr_t *) &zangvel, "zangvel", "Angular Velocity about X axis", DEF_ZANGVEL, t_Float},
-    {(caddr_t *) &interactive, "interactive", "Interactive", DEF_INTERACTIVE, t_Bool},
-    {(caddr_t *) &altcolour, "altcolour", "Alternate Colour Scheme", DEF_ALTCOLOUR, t_Bool},
-    {(caddr_t *) &titles, "titles", "Titles", DEF_TITLES, t_Bool},
-    {(caddr_t *) &zoom, "zoom", "Zoom", DEF_ZOOM, t_Float},
-    {(caddr_t *) &wireframe, "wireframe", "Wireframe", DEF_WIREFRAME, t_Bool},
+    {&explode, "explode", "Explode", DEF_EXPLODE, t_Float},
+    {&angvel, "angvel", "Angular Velocity", DEF_ANGVEL, t_Float},
+    {&accel, "accel", "Acceleration", DEF_ACCEL, t_Float},
+    {&statictime, "statictime", "Static Time", DEF_STATICTIME, t_Int},
+    {&yangvel, "yangvel", "Angular Velocity about Y axis", DEF_YANGVEL, t_Float},
+    {&zangvel, "zangvel", "Angular Velocity about X axis", DEF_ZANGVEL, t_Float},
+    {&interactive, "interactive", "Interactive", DEF_INTERACTIVE, t_Bool},
+    {&altcolour, "altcolour", "Alternate Colour Scheme", DEF_ALTCOLOUR, t_Bool},
+    {&titles, "titles", "Titles", DEF_TITLES, t_Bool},
+    {&zoom, "zoom", "Zoom", DEF_ZOOM, t_Float},
+    {&wireframe, "wireframe", "Wireframe", DEF_WIREFRAME, t_Bool},
 };
 
 ModeSpecOpt sws_opts = {countof(opts), opts, countof(vars), vars, NULL};
@@ -1849,6 +1848,11 @@ float morph_percent(void) {
        /* ang_diff / rot approaches 0, we want the complement */
        retval = 1.0 - (ang_diff_max / rot_max);
        /* protect against naan */
+
+/* Apparently some systems (Solaris) don't have isinf() */
+#undef isinf
+#define isinf(x) (((x) > 999999999999.9) || ((x) < -999999999999.9))
+
        if (isnan(retval) || isinf(retval)) retval = 1.0;
     }
     /*printf("morph_pct = %f\n", retval);*/
index aa3e876e4e333d075b1e30220298f2b1cf977b83..fca3147564a26f46c22f216b7c41b2129343be55 100644 (file)
@@ -98,9 +98,9 @@ static XrmOptionDescRec opts[] = {
 };
 
 static argtype vars[] = {
-  {(caddr_t *) &text_fmt,  "text",   "Text",   DEF_TEXT,   t_String},
-  {(caddr_t *) &do_spin,   "spin",   "Spin",   DEF_SPIN,   t_String},
-  {(caddr_t *) &do_wander, "wander", "Wander", DEF_WANDER, t_Bool},
+  {&text_fmt,  "text",   "Text",   DEF_TEXT,   t_String},
+  {&do_spin,   "spin",   "Spin",   DEF_SPIN,   t_String},
+  {&do_wander, "wander", "Wander", DEF_WANDER, t_Bool},
 };
 
 ModeSpecOpt sws_opts = {countof(opts), opts, countof(vars), vars, NULL};
index 9449c3184212815d7e0b6050bacd3d747fe65890..a41884d0aacf7e05160af5accdfd7505ae6f111d 100644 (file)
@@ -208,27 +208,27 @@ static XrmOptionDescRec opts[] =
 
 static argtype vars[] =
 {
-  { (caddr_t *) &display_mode,  "displayMode",  "DisplayMode",
+  { &display_mode,  "displayMode",  "DisplayMode",
     DEF_DISPLAY_MODE,  t_Int },
-  { (caddr_t *) &appearance,    "appearance",   "Appearance",
+  { &appearance,    "appearance",   "Appearance",
     DEF_APPEARANCE,    t_Int },
-  { (caddr_t *) &colors,        "colors",       "Colors",
+  { &colors,        "colors",       "Colors",
     DEF_COLORS,        t_Int },
-  { (caddr_t *) &projection_3d, "projection3d", "Projection3d",
+  { &projection_3d, "projection3d", "Projection3d",
     DEF_3D_PROJECTION, t_Int },
-  { (caddr_t *) &projection_4d, "projection4d", "Projection4d",
+  { &projection_4d, "projection4d", "Projection4d",
     DEF_4D_PROJECTION, t_Int },
-  { (caddr_t *) &speed_wx,      "speedwx",      "Speedwx",
+  { &speed_wx,      "speedwx",      "Speedwx",
     DEF_DALPHA,        t_Float},
-  { (caddr_t *) &speed_wy,      "speedwy",      "Speedwy",
+  { &speed_wy,      "speedwy",      "Speedwy",
     DEF_DBETA,         t_Float},
-  { (caddr_t *) &speed_wz,      "speedwz",      "Speedwz",
+  { &speed_wz,      "speedwz",      "Speedwz",
     DEF_DDELTA,        t_Float},
-  { (caddr_t *) &speed_xy,      "speedxy",      "Speedxy",
+  { &speed_xy,      "speedxy",      "Speedxy",
     DEF_DZETA,         t_Float},
-  { (caddr_t *) &speed_xz,      "speedxz",      "Speedxz",
+  { &speed_xz,      "speedxz",      "Speedxz",
     DEF_DETA,          t_Float},
-  { (caddr_t *) &speed_yz,      "speedyz",      "Speedyz",
+  { &speed_yz,      "speedyz",      "Speedyz",
     DEF_DTHETA,        t_Float}
 };
 
index ae8891f739cb743dc95a68e7a8c38afba8b2ea68..62f3af5c987a08d6adc01e8e465919f0bd0a52e2 100644 (file)
@@ -154,17 +154,17 @@ static XrmOptionDescRec opts[] = {
 };
 
 static argtype vars[] = {
-    {(caddr_t*)&random_parms, "random", "Random", "False", t_Bool},
-    {(caddr_t*)&do_tetrahedron, "tetra", "Tetra", "False", t_Bool},
-    {(caddr_t*)&spooky, "spooky", "Spooky", "0", t_Int},
-    {(caddr_t*)&color, "color", "Color", DEF_COLOR, t_String},
-    {(caddr_t*)&shininess, "shininess", "Shininess", DEF_SHININESS, t_Int},
-    {(caddr_t*)&complexity, "complexity", "Complexity", DEF_COMPLEXITY, t_Int},
-    {(caddr_t*)&speed, "speed", "Speed", DEF_SPEED, t_Int},
-    {(caddr_t*)&spherism, "spherism", "Spherism", DEF_SPHERISM, t_Int},
-    {(caddr_t*)&hold, "hold", "Hold", DEF_HOLD, t_Int},
-    {(caddr_t*)&distance, "distance", "Distance", DEF_DISTANCE, t_Int},
-    {(caddr_t*)&damping, "damping", "Damping", DEF_DAMPING, t_Int}
+    {&random_parms, "random", "Random", "False", t_Bool},
+    {&do_tetrahedron, "tetra", "Tetra", "False", t_Bool},
+    {&spooky, "spooky", "Spooky", "0", t_Int},
+    {&color, "color", "Color", DEF_COLOR, t_String},
+    {&shininess, "shininess", "Shininess", DEF_SHININESS, t_Int},
+    {&complexity, "complexity", "Complexity", DEF_COMPLEXITY, t_Int},
+    {&speed, "speed", "Speed", DEF_SPEED, t_Int},
+    {&spherism, "spherism", "Spherism", DEF_SPHERISM, t_Int},
+    {&hold, "hold", "Hold", DEF_HOLD, t_Int},
+    {&distance, "distance", "Distance", DEF_DISTANCE, t_Int},
+    {&damping, "damping", "Damping", DEF_DAMPING, t_Int}
 };
 
 #undef countof
index e4a87158c1f7d193149714fca9d7acc734ef8f22..8d508330ae0674879f7a5bc05cc330e81834ba77 100644 (file)
@@ -99,10 +99,10 @@ static XrmOptionDescRec opts[] = {
 };
 
 static argtype vars[] = {
-  {(caddr_t *) &rand,   "rand",   "Random",   DEF_RANDOM,   t_Bool},
-  {(caddr_t *) &do_spin,   "spin",   "Spin",   DEF_SPIN,   t_Bool},
-  {(caddr_t *) &do_wander, "wander", "Wander", DEF_WANDER, t_Bool},
-  {(caddr_t *) &speed,     "speed",  "Speed",  DEF_SPEED,  t_Int},
+  {&rand,      "rand",   "Random", DEF_RANDOM, t_Bool},
+  {&do_spin,   "spin",   "Spin",   DEF_SPIN,   t_Bool},
+  {&do_wander, "wander", "Wander", DEF_WANDER, t_Bool},
+  {&speed,     "speed",  "Speed",  DEF_SPEED,  t_Int},
 };
 
 
index bb6f219987796f0738ceab351da653df896280b7..ffc3c7886ae42c57a71bd0da2ad126ba4911e5d6 100644 (file)
@@ -98,7 +98,7 @@ static XrmOptionDescRec opts[] = {
 };
 
 static argtype vars[] = {
-  {(caddr_t *) &do_texture, "texture", "Texture", DEF_TEXTURE, t_Bool},
+  {&do_texture, "texture", "Texture", DEF_TEXTURE, t_Bool},
 };
 
 ModeSpecOpt lament_opts = {countof(opts), opts, countof(vars), vars, NULL};
index 743d6575542da3501392d1f21730cc6a00026f99..583e40964e35cbde0fac024bdf6291ba4c51c2c5 100644 (file)
@@ -298,22 +298,22 @@ static XrmOptionDescRec opts[] = {
 };
 
 static argtype vars[] = {
-  {(caddr_t *) &do_style,  "style",  "Style",  DEF_STYLE,  t_String},
-  {(caddr_t *) &do_spin,   "spin",   "Spin",   DEF_SPIN,   t_String},
-  {(caddr_t *) &do_wander, "wander", "Wander", DEF_WANDER, t_Bool},
-  {(caddr_t *) &speed,     "speed",  "Speed",  DEF_SPEED,  t_Float},
-  {(caddr_t *) &resolution, "resolution", "Resolution", DEF_RESOLUTION, t_Int},
-  {(caddr_t *) &do_smooth,  "smooth", "Smooth", DEF_SMOOTH, t_Bool},
-  {(caddr_t *) &do_impatient, "impatient", "Impatient", DEF_IMPATIENT, t_Bool},
-
-  {(caddr_t *) &lava_color_str, "lavaColor", "LavaColor", DEF_LCOLOR,t_String},
-  {(caddr_t *) &fluid_color_str,"fluidColor","FluidColor",DEF_FCOLOR,t_String},
-  {(caddr_t *) &base_color_str, "baseColor", "BaseColor", DEF_BCOLOR,t_String},
-  {(caddr_t *) &table_color_str,"tableColor","TableColor",DEF_TCOLOR,t_String},
-
-  {(caddr_t *) &fluid_tex, "fluidTexture", "FluidTexture", DEF_FTEX, t_String},
-  {(caddr_t *) &base_tex,  "baseTexture",  "BaseTexture",  DEF_BTEX, t_String},
-  {(caddr_t *) &table_tex, "tableTexture", "BaseTexture",  DEF_TTEX, t_String},
+  {&do_style,     "style",      "Style",      DEF_STYLE,      t_String},
+  {&do_spin,      "spin",       "Spin",       DEF_SPIN,       t_String},
+  {&do_wander,    "wander",     "Wander",     DEF_WANDER,     t_Bool},
+  {&speed,        "speed",      "Speed",      DEF_SPEED,      t_Float},
+  {&resolution,   "resolution", "Resolution", DEF_RESOLUTION, t_Int},
+  {&do_smooth,    "smooth",     "Smooth",     DEF_SMOOTH,     t_Bool},
+  {&do_impatient, "impatient",  "Impatient",  DEF_IMPATIENT,  t_Bool},
+
+  {&lava_color_str,  "lavaColor",    "LavaColor",  DEF_LCOLOR, t_String},
+  {&fluid_color_str, "fluidColor",   "FluidColor", DEF_FCOLOR, t_String},
+  {&base_color_str,  "baseColor",    "BaseColor",  DEF_BCOLOR, t_String},
+  {&table_color_str, "tableColor",   "TableColor", DEF_TCOLOR, t_String},
+
+  {&fluid_tex,       "fluidTexture", "FluidTexture", DEF_FTEX, t_String},
+  {&base_tex,        "baseTexture",  "BaseTexture",  DEF_BTEX, t_String},
+  {&table_tex,       "tableTexture", "BaseTexture",  DEF_TTEX, t_String},
 };
 
 ModeSpecOpt sws_opts = {countof(opts), opts, countof(vars), vars, NULL};
index 7686941b3eceb8a6f09b32590bfdd84cd2afc37c..fea32236889c4b4f98c4855be2201a13445de081 100644 (file)
@@ -133,11 +133,11 @@ static XrmOptionDescRec opts[] = {
 };
 
 static argtype vars[] = {
-  {(caddr_t *) &do_spin,   "spin",   "Spin",   DEF_SPIN,   t_Bool},
-  {(caddr_t *) &do_wander, "wander", "Wander", DEF_WANDER, t_Bool},
-  {(caddr_t *) &speed,     "speed",  "Speed",  DEF_SPEED,  t_Int},
-  {(caddr_t *) &do_optimize, "optimize", "Optimize", DEF_OPTIMIZE, t_Bool},
-  {(caddr_t *) &max_depth, "maxDepth", "MaxDepth", DEF_MAX_DEPTH, t_Int},
+  {&do_spin,     "spin",     "Spin",     DEF_SPIN,      t_Bool},
+  {&do_wander,   "wander",   "Wander",   DEF_WANDER,    t_Bool},
+  {&speed,       "speed",    "Speed",    DEF_SPEED,     t_Int},
+  {&do_optimize, "optimize", "Optimize", DEF_OPTIMIZE,  t_Bool},
+  {&max_depth,   "maxDepth", "MaxDepth", DEF_MAX_DEPTH, t_Int},
 };
 
 ModeSpecOpt sws_opts = {countof(opts), opts, countof(vars), vars, NULL};
index 679b72664d259dd83c5a72193f85f32fc70ce63e..2ff5666a9ac1a8c4d33be1f298ece30146639c25 100644 (file)
@@ -1,5 +1,3 @@
-/* -*- Mode: C; tab-width: 4 -*- */
-
 /* mirrorblob  Copyright (c) 2003 Jon Dowdall <jon.dowdall@bigpond.com> */
 /*
  * Permission to use, copy, modify, and distribute this software and its
  * 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.
-
+ *
  * Revision History:
- * 23-Sep-2003:  jon.dowdall@bigpond.com  Created module "mirrorblob"
+ * 23-Sep-2003:  jon.dowdall@bigpond.com  Created module "blob"
  * 19-Oct-2003:  jon.dowdall@bigpond.com  Added texturing
+ * 21-Oct-2003:                           Renamed to mirrorblob
+ * 10-Feb-2004:  jon.dowdall@bigpond.com  Added motion blur
  *
+ * The mirrorblob screensaver draws a pulsing blob on the screen.  Options
+ * include adding a background (via screen_to_ximage), texturing the blob,
+ * making the blob semi-transparent and varying the resolution of the blob
+ * tessellation.
  *
- * The mirrorblob screensaver draws a pulsing blob on the screen.
- * Options include adding a background (via screen_to_ximage),
- * texturing the blob, making the blob semi-transparent and varying the
- * resolution of the blob tessellation.
- *
- * The mirrorblob was inspired by a lavalamp is in no way a simulation.
- * The code is just an attempt to generate some eye-candy.
+ * The blob was inspired by a lavalamp is in no way a simulation.  The code is
+ * just an attempt to generate some eye-candy.
  *
  * Much of xscreensaver code framework is taken from the pulsar module by David
  * Konerding and the glslideshow by Mike Oliphant and Jamie Zawinski.
  *
  */
 
-#include <math.h> 
+#include <math.h>
 #include <stdio.h>
 #include <stdlib.h>
+#include <sys/time.h>
 
 /*-
  * due to a Bug/feature in VMS X11/Intrinsic.h has to be placed before xlock.
 #include <X11/Intrinsic.h>
 
 #ifdef STANDALONE
-# define PROGCLASS                                             "MirrorBlob"
-# define HACK_INIT                                             init_mirrorblob
-# define HACK_DRAW                                             draw_mirrorblob
-# define HACK_RESHAPE                                  reshape_mirrorblob
-# define screensaver_opts                              xlockmore_opts
-
-# define DEF_DELAY                      "10000"
-# define DEF_FPS                    "False"
-# define DEF_WIRE           "False"
-# define DEF_BLEND          "False"
-# define DEF_FOG                    "False"
-# define DEF_ANTIALIAS        "False"
-# define DEF_WALLS            "True"
-# define DEF_TEXTURE          "True"
-# define DEF_COLOUR           "False"
-# define DEF_OFFSET_TEXTURE   "False"
-# define DEF_PAINT_BACKGROUND "True"
-# define DEF_X_RES            "60"
-# define DEF_Y_RES            "32"
-# define DEF_FIELD_POINTS     "5"
-# define DEF_INCREMENTAL      "0"
-# define DEF_FADE_SPEED       "1"
-# define DEF_HOLD_FRAMES      "10240"
-
-#define        DEFAULTS                "*delay:                        " DEF_DELAY                             "\n" \
-                                               "*showFPS:                      " DEF_FPS                               "\n" \
-                                               "*wire:                         " DEF_WIRE                              "\n" \
-                                               "*blend:                        " DEF_BLEND                             "\n" \
-                                               "*fog:                          " DEF_FOG                               "\n" \
-                                               "*antialias:            " DEF_ANTIALIAS                 "\n" \
-                                               "*walls:                        " DEF_WALLS                             "\n" \
-                                               "*texture:                      " DEF_TEXTURE                   "\n" \
-                                               "*colour:                       " DEF_COLOUR                    "\n" \
-                                               "*offset_texture:       " DEF_OFFSET_TEXTURE    "\n" \
-                                               "*bgimage:                      " DEF_PAINT_BACKGROUND  "\n" \
-                                               "*x_resolution:         " DEF_X_RES                             "\n" \
-                                               "*y_resolution:         " DEF_Y_RES                             "\n" \
-                                               "*field_points:         " DEF_FIELD_POINTS              "\n" \
-                                               "*incremental:          " DEF_INCREMENTAL               "\n" \
-                                               "*fade_speed:           " DEF_FADE_SPEED                "\n" \
-                                               "*hold_frames:          " DEF_HOLD_FRAMES               "\n" \
-
-# include "xlockmore.h"                                /* from the xscreensaver distribution */
+# define PROGCLASS         "Screensaver"
+# define HACK_INIT         init_screensaver
+# define HACK_DRAW         draw_screensaver
+# define HACK_RESHAPE      reshape_screensaver
+# define screensaver_opts  xlockmore_opts
+
+#define DEF_DELAY            "10000"
+#define DEF_FPS              "False"
+#define DEF_WIRE             "False"
+#define DEF_BLEND            "False"
+#define DEF_FOG              "False"
+#define DEF_ANTIALIAS        "False"
+#define DEF_WALLS            "True"
+#define DEF_COLOUR           "False"
+#define DEF_TEXTURE          "True"
+#define DEF_OFFSET_TEXTURE   "False"
+#define DEF_PAINT_BACKGROUND "True"
+#define DEF_X_RES            "60"
+#define DEF_Y_RES            "32"
+#define DEF_FIELD_POINTS     "5"
+#define DEF_MOTION_BLUR      "0"
+#define DEF_INCREMENTAL      "0"
+#define DEF_HOLD_TIME        "30"
+#define DEF_FADE_TIME        "5"
+
+#define DEFAULTS \
+    "*delay:             " DEF_DELAY                "\n" \
+    "*showFPS:           " DEF_FPS                  "\n" \
+    "*wire:              " DEF_WIRE                 "\n" \
+    "*blend:             " DEF_BLEND                "\n" \
+    "*fog:               " DEF_FOG                  "\n" \
+    "*antialias:         " DEF_ANTIALIAS            "\n" \
+    "*walls:             " DEF_WALLS                "\n" \
+    "*colour :           " DEF_COLOUR               "\n" \
+    "*texture:           " DEF_TEXTURE              "\n" \
+    "*offset_texture:    " DEF_OFFSET_TEXTURE       "\n" \
+    "*paint_background:  " DEF_PAINT_BACKGROUND     "\n" \
+    "*x_resolution:      " DEF_X_RES                "\n" \
+    "*y_resolution:      " DEF_Y_RES                "\n" \
+    "*field_points:      " DEF_FIELD_POINTS         "\n" \
+    "*motion_blur:       " DEF_MOTION_BLUR          "\n" \
+    "*incremental:       " DEF_INCREMENTAL          "\n" \
+    "*hold_time:         " DEF_HOLD_TIME            "\n" \
+    "*fade_time:         " DEF_FADE_TIME            "\n"
+
+# include "xlockmore.h"    /* from the xscreensaver distribution */
 #else /* !STANDALONE */
-# include "xlock.h"                                    /* from the xlockmore distribution */
+# include "xlock.h"        /* from the xlockmore distribution */
 #endif /* !STANDALONE */
 
 #ifdef USE_GL /* whole file */
 #include "grab-ximage.h"
 
 #undef countof
-#define countof(x) (sizeof((x))/sizeof((*x)))
-
-#define WIDTH 1024
-#define HEIGHT 768
+#define countof(x) (sizeof((x)) / sizeof((*x)))
 
 #define PI  3.1415926535897
 
@@ -131,93 +131,95 @@ static int offset_texture;
 static int x_resolution;
 static int y_resolution;
 static int field_points;
+static int motion_blur;
 static int incremental;
-static int fade_speed;
-static int hold_frames;
+static int fade_time;
+static int hold_time;
 
 static XrmOptionDescRec opts[] = {
-  {"-wire",   ".mirrorblob.wire",   XrmoptionNoArg, (caddr_t) "true" },
-  {"+wire",   ".mirrorblob.wire",   XrmoptionNoArg, (caddr_t) "false" },
-  {"-blend",   ".mirrorblob.blend",   XrmoptionNoArg, (caddr_t) "true" },
-  {"+blend",   ".mirrorblob.blend",   XrmoptionNoArg, (caddr_t) "false" },
-  {"-fog",   ".mirrorblob.fog",   XrmoptionNoArg, (caddr_t) "true" },
-  {"+fog",   ".mirrorblob.fog",   XrmoptionNoArg, (caddr_t) "false" },
-  {"-antialias",   ".mirrorblob.antialias",   XrmoptionNoArg, (caddr_t) "true" },
-  {"+antialias",   ".mirrorblob.antialias",   XrmoptionNoArg, (caddr_t) "false" },
-  {"-walls",   ".mirrorblob.walls",   XrmoptionNoArg, (caddr_t) "true" },
-  {"+walls",   ".mirrorblob.walls",   XrmoptionNoArg, (caddr_t) "false" },
-  {"-texture",   ".mirrorblob.texture",   XrmoptionNoArg, (caddr_t) "true" },
-  {"+texture",   ".mirrorblob.texture",   XrmoptionNoArg, (caddr_t) "false" },
-  {"-colour",   ".mirrorblob.colour",   XrmoptionNoArg, (caddr_t) "true" },
-  {"+colour",   ".mirrorblob.colour",   XrmoptionNoArg, (caddr_t) "false" },
-  {"-offset_texture", ".mirrorblob.offset_texture",   XrmoptionNoArg, (caddr_t) "true" },
-  {"+offset_texture", ".mirrorblob.offset_texture",   XrmoptionNoArg, (caddr_t) "false" },
-  {"-bgimage", ".mirrorblob.bgimage", XrmoptionNoArg, (caddr_t) "true" },
-  {"+bgimage", ".mirrorblob.bgimage", XrmoptionNoArg, (caddr_t) "false" },
-  {"-x_res",   ".mirrorblob.x_res",   XrmoptionSepArg, (caddr_t) NULL },
-  {"-y_res",   ".mirrorblob.y_res",   XrmoptionSepArg, (caddr_t) NULL },
-  {"-field_points", ".mirrorblob.field_points",   XrmoptionSepArg, (caddr_t) NULL },
-  {"-incremental", ".mirrorblob.incremental",   XrmoptionSepArg, (caddr_t) NULL },
-  {"-fade_speed", ".mirrorblob.fade_speed",   XrmoptionSepArg, (caddr_t) NULL },
-  {"-hold_frames", ".mirrorblob.hold_frames",   XrmoptionSepArg, (caddr_t) NULL },
+    {"-wire",             ".blob.wire",             XrmoptionNoArg, "true" },
+    {"+wire",             ".blob.wire",             XrmoptionNoArg, "false" },
+    {"-blend",            ".blob.blend",            XrmoptionNoArg, "true" },
+    {"+blend",            ".blob.blend",            XrmoptionNoArg, "false" },
+    {"-fog",              ".blob.fog",              XrmoptionNoArg, "true" },
+    {"+fog",              ".blob.fog",              XrmoptionNoArg, "false" },
+    {"-antialias",        ".blob.antialias",        XrmoptionNoArg, "true" },
+    {"+antialias",        ".blob.antialias",        XrmoptionNoArg, "false" },
+    {"-walls",            ".blob.walls",            XrmoptionNoArg, "true" },
+    {"+walls",            ".blob.walls",            XrmoptionNoArg, "false" },
+    {"-texture",          ".blob.texture",          XrmoptionNoArg, "true" },
+    {"+texture",          ".blob.texture",          XrmoptionNoArg, "false" },
+    {"-colour",           ".blob.colour",           XrmoptionNoArg, "true" },
+    {"+colour",           ".blob.colour",           XrmoptionNoArg, "false" },
+    {"-offset_texture",   ".blob.offset_texture",   XrmoptionNoArg, "true" },
+    {"+offset_texture",   ".blob.offset_texture",   XrmoptionNoArg, "false" },
+    {"-paint_background", ".blob.paint_background", XrmoptionNoArg, "true" },
+    {"+paint_background", ".blob.paint_background", XrmoptionNoArg, "false" },
+    {"-x_res",            ".blob.x_res",            XrmoptionSepArg, NULL },
+    {"-y_res",            ".blob.y_res",            XrmoptionSepArg, NULL },
+    {"-field_points",     ".blob.field_points",     XrmoptionSepArg, NULL },
+    {"-motion_blur",      ".blob.motion_blur",      XrmoptionSepArg, NULL },
+    {"-incremental",      ".blob.incremental",      XrmoptionSepArg, NULL },
+    {"-fade_time",        ".blob.fade_time",        XrmoptionSepArg, NULL },
+    {"-hold_time",        ".blob.hold_time",        XrmoptionSepArg, NULL },
 };
 
-
 static argtype vars[] = {
-  {(caddr_t *) &do_wire,      "wire",      "Wire",      DEF_WIRE,      t_Bool},
-  {(caddr_t *) &do_blend,     "blend",     "Blend",     DEF_BLEND,     t_Bool},
-  {(caddr_t *) &do_fog,       "fog",       "Fog",       DEF_FOG,       t_Bool},
-  {(caddr_t *) &do_antialias, "antialias", "Antialias", DEF_ANTIALIAS, t_Bool},
-  {(caddr_t *) &do_walls,     "walls",     "Walls",     DEF_WALLS,     t_Bool},
-  {(caddr_t *) &do_texture,   "texture",   "texture",   DEF_TEXTURE,   t_Bool},
-  {(caddr_t *) &do_colour,    "colour",    "colour",    DEF_COLOUR,    t_Bool},
-  {(caddr_t *) &offset_texture, "offset_texture","offset_texture", DEF_OFFSET_TEXTURE, t_Bool},
-  {(caddr_t *) &do_paint_background,"bgimage","bgimage", DEF_PAINT_BACKGROUND, t_Bool},
-  {(caddr_t *) &x_resolution, "x_res", "X_res", DEF_X_RES, t_Int},
-  {(caddr_t *) &y_resolution, "y_res", "Y_res", DEF_Y_RES, t_Int},
-  {(caddr_t *) &field_points, "field_points", "Field_points", DEF_FIELD_POINTS, t_Int},
-  {(caddr_t *) &incremental, "incremental", "Incremental", DEF_INCREMENTAL, t_Int},
-  {(caddr_t *) &fade_speed, "fade_speed", "fade_speed", DEF_FADE_SPEED, t_Int},
-  {(caddr_t *) &hold_frames, "hold_frames", "hold_frames", DEF_HOLD_FRAMES, t_Int},
+    {&do_wire,      "wire",         "Wire",      DEF_WIRE,      t_Bool},
+    {&do_blend,     "blend",        "Blend",     DEF_BLEND,     t_Bool},
+    {&do_fog,       "fog",          "Fog",       DEF_FOG,       t_Bool},
+    {&do_antialias, "antialias",    "Antialias", DEF_ANTIALIAS, t_Bool},
+    {&do_walls,     "walls",        "Walls",     DEF_WALLS,     t_Bool},
+    {&do_texture,   "texture",      "Texture",   DEF_TEXTURE,   t_Bool},
+    {&do_colour,    "colour",       "Colour",    DEF_COLOUR,   t_Bool},
+    {&offset_texture, "offset_texture","Offset_Texture", DEF_OFFSET_TEXTURE, t_Bool},
+    {&do_paint_background,"paint_background","Paint_Background", DEF_PAINT_BACKGROUND, t_Bool},
+    {&x_resolution, "x_res",        "X_Res",        DEF_X_RES,        t_Int},
+    {&y_resolution, "y_res",        "Y_Res",        DEF_Y_RES,        t_Int},
+    {&field_points, "field_points", "Field_Points", DEF_FIELD_POINTS, t_Int},
+    {&motion_blur,  "motion_blur",  "Motion_Blur",  DEF_MOTION_BLUR,  t_Int},
+    {&incremental,  "incremental",  "Incremental",  DEF_INCREMENTAL,  t_Int},
+    {&fade_time,    "fade_time",    "Fade_Time",    DEF_FADE_TIME,    t_Int},
+    {&hold_time,    "hold_time",    "Hold_Time",    DEF_HOLD_TIME,    t_Int},
 };
 
 
 static OptionStruct desc[] =
 {
-       {"-/+ wire", "whether to do use wireframe instead of filled (faster)"},
-       {"-/+ blend", "whether to do enable blending (slower)"},
-       {"-/+ fog", "whether to do enable fog (slower)"},
-       {"-/+ antialias", "whether to do enable antialiased lines (slower)"},
-       {"-/+ walls", "whether to add walls to the blob space (slower)"},
-       {"-/+ texture", "whether to add a texture to the blob (slower)"},
-       {"-/+ colour", "whether to colour the blob"},
-       {"-/+ offset_texture", "whether to offset texture co-ordinates"},
-       {"-/+ bgimage", "whether to display a background texture (slower)"},
-       {"-x_res", "Blob resolution in x direction"},
-       {"-y_res", "Blob resolution in y direction"},
-       {"-field_points", "Number of field points used to disturb blob"},
-       {"-incremental", "Field summation method"},
-       {"-fade_speed", "speed of transistion"},
-       {"-hold_frames", "Number of frames before next image"},
+    {"-/+ wire", "whether to do use wireframe instead of filled (faster)"},
+    {"-/+ blend", "whether to do enable blending (slower)"},
+    {"-/+ fog", "whether to do enable fog (slower)"},
+    {"-/+ antialias", "whether to do enable antialiased lines (slower)"},
+    {"-/+ walls", "whether to add walls to the blob space (slower)"},
+    {"-/+ texture", "whether to add a texture to the blob (slower)"},
+    {"-/+ colour", "whether to colour the blob"},
+    {"-/+ offset_texture", "whether to offset texture co-ordinates"},
+    {"-/+ paint_background", "whether to display a background texture (slower)"},
+    {"-x_res", "Blob resolution in x direction"},
+    {"-y_res", "Blob resolution in y direction"},
+    {"-field_points", "Number of field points used to disturb blob"},
+    {"-motion_blur", "Fade blob images (higher number = faster fade)"},
+    {"-incremental", "Field summation method"},
+    {"-fade_time", "Number of frames to transistion to next image"},
+    {"-hold_time", "Number of frames before next image"},
 };
 
 ModeSpecOpt screensaver_opts = {countof(opts), opts, countof(vars), vars, desc};
 
 #ifdef USE_MODULES
 ModStruct   screensaver_description =
-{"screensaver", "init_mirrorblob", "draw_mirrorblob", "release_mirrorblob",
- "draw_mirrorblob", "init_mirrorblob", NULL, &screensaver_opts,
+{"screensaver", "init_screensaver", "draw_screensaver", "release_screensaver",
+ "draw_screensaver", "init_screensaver", NULL, &screensaver_opts,
  1000, 1, 2, 1, 4, 1.0, "",
  "OpenGL screensaver", 0, NULL};
 #endif
 
-
 /* structure for holding the screensaver data */
 typedef struct {
-  int screen_width, screen_height;
-  GLXContext *glx_context;
-  Window window;
-  XColor fg, bg;
+    int screen_width, screen_height;
+    GLXContext *glx_context;
+    Window window;
+    XColor fg, bg;
 } screensaverstruct;
 
 static screensaverstruct *Screensaver = NULL;
@@ -228,36 +230,36 @@ static screensaverstruct *Screensaver = NULL;
 
 typedef struct
 {
-  GLdouble x, y;
+    GLdouble x, y;
 } Vector2D;
 
 typedef struct
 {
-  GLdouble x, y, z;
+    GLdouble x, y, z;
 } Vector3D;
 
 typedef struct
 {
-  GLubyte red, green, blue, alpha;
+    GLubyte red, green, blue, alpha;
 } Colour;
 
 /* Data used for sphere tessellation */
 typedef struct
 {
-  double cosyd, sinyd;
+    double cosyd, sinyd;
 
-  /* Number of x points at each row of the blob */
-  int num_x_points;  
+    /* Number of x points at each row of the blob */
+    int num_x_points;
 } Row_Data;
 
 /* Structure to hold sphere distortion data */
 typedef struct
 {
-  double cx, cy, cpower;
-  double mx, my, mpower;
-  double ax, ay, apower;
-  double vx, vy, vpower;
-  Vector3D pos;
+    double cx, cy, cpower;
+    double mx, my, mpower;
+    double ax, ay, apower;
+    double vx, vy, vpower;
+    Vector3D pos;
 } Field_Data;
 
 /*****************************************************************************
@@ -285,7 +287,7 @@ static double *field = 0, *wall_field = 0;
 
 Field_Data *field_data;
 
-/* Use 2 textures to allow a gradualr fade between images */
+/* Use 2 textures to allow a gradual fade between images */
 #define NUM_TEXTURES 2
 static int current_texture;
 
@@ -293,23 +295,50 @@ static int current_texture;
 GLfloat tex_width[NUM_TEXTURES], tex_height[NUM_TEXTURES];
 GLuint textures[NUM_TEXTURES];
 
-static int holding = 1;
-static int transitioning = 0;
+typedef enum
+{
+  HOLDING,
+  TRANSITIONING
+} Frame_State;
+
+static Frame_State state = HOLDING;
+static double state_start_time = 0;
+
 static int colour_cycle = 0;
 
+/******************************************************************************
+ *
+ * Returns the current time in seconds as a double.  Shamelessly borrowed from
+ * glslideshow.
+ *
+ */
+static double
+double_time (void)
+{
+  struct timeval now;
+# ifdef GETTIMEOFDAY_TWO_ARGS
+  struct timezone tzp;
+  gettimeofday(&now, &tzp);
+# else
+  gettimeofday(&now);
+# endif
+
+  return (now.tv_sec + ((double) now.tv_usec * 0.000001));
+}
+
 /******************************************************************************
  *
  * Change to the projection matrix and set our viewing volume.
- * 
+ *
  */
 static void
-resetProjection(int width, int height)
+reset_projection(int width, int height)
 {
-  glMatrixMode( GL_PROJECTION );
-  glLoadIdentity( );
-  gluPerspective( 60.0, 1.0, 1.0, 1024.0 );
-  glMatrixMode(GL_MODELVIEW);
-  glLoadIdentity();
+    glMatrixMode (GL_PROJECTION);
+    glLoadIdentity ();
+    gluPerspective (60.0, 1.0, 1.0, 1024.0 );
+    glMatrixMode (GL_MODELVIEW);
+    glLoadIdentity ();
 }
 
 /****************************************************************************
@@ -319,30 +348,30 @@ resetProjection(int width, int height)
 void
 grab_texture(ModeInfo *mi, int texture_index)
 {
-  XImage *ximage;
+    XImage *ximage;
 
-  ximage = screen_to_ximage (mi->xgwa.screen, mi->window, 0);
+    ximage = screen_to_ximage (mi->xgwa.screen, mi->window, 0);
 
-  glBindTexture (GL_TEXTURE_2D, textures[texture_index]);
-  glPixelStorei (GL_UNPACK_ALIGNMENT, 1);
+    glBindTexture (GL_TEXTURE_2D, textures[texture_index]);
+    glPixelStorei (GL_UNPACK_ALIGNMENT, 1);
 
-  glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, ximage->width, ximage->height,
-               0, GL_RGBA, GL_UNSIGNED_BYTE, ximage->data);
+    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, ximage->width, ximage->height,
+                 0, GL_RGBA, GL_UNSIGNED_BYTE, ximage->data);
 
-  tex_width[texture_index] = mi->xgwa.width  / (GLfloat)ximage->width;
-  tex_height[texture_index] = mi->xgwa.height  / (GLfloat)ximage->height;
+    tex_width[texture_index] = (mi->xgwa.width - 1) / (GLfloat)ximage->width;
+    tex_height[texture_index] = (mi->xgwa.height - 1)  / (GLfloat)ximage->height;
 
-  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);
 
-  glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
-  glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
+    glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
+    glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
 
-  glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
+    glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
 
-  free(ximage->data);
-  ximage->data = 0;
-  XDestroyImage (ximage);
+    free(ximage->data);
+    ximage->data = 0;
+    XDestroyImage (ximage);
 }
 
 /******************************************************************************
@@ -350,116 +379,117 @@ grab_texture(ModeInfo *mi, int texture_index)
  * Initialise the data used to calculate the blob shape.
  */
 static void
-initializeGL(ModeInfo *mi, GLsizei width, GLsizei height) 
+initialize_gl(ModeInfo *mi, GLsizei width, GLsizei height)
 {
-  GLfloat fogColor[4] = { 0.1, 0.1, 0.1, 0.1 };
-  /* Lighting values */
-  GLfloat lightPos0[] = {50.0f, 10.0f, 20.0f, 1.0f };
-  GLfloat whiteLight0[] = { 0.1f, 0.1f, 0.1f, 1.0f };
-  GLfloat sourceLight0[] = { 1.0f, 1.0f, 1.0f, 1.0f };
-  GLfloat specularLight0[] = { 0.7f, 0.6f, 0.3f, 1.0f };
-
-  GLfloat lightPos1[] = {0.0f, -50.0f, 50.0f, 1.0f };
-  GLfloat whiteLight1[] = { 0.1f, 0.1f, 0.1f, 1.0f };
-  GLfloat sourceLight1[] = { 1.0f, 0.3f, 0.3f, 1.0f };
-  GLfloat specularLight1[] = { 0.7f, 0.6f, 0.3f, 1.0f };
-
-  GLfloat specref[] = { 1.0f, 1.0f, 1.0f, 1.0f };
-
-  /* Setup our viewport. */
-  glViewport( 0, 0, width, height ); 
-
-  glEnable(GL_DEPTH_TEST);
-
-  if (do_antialias)
-  {
-       do_blend = 1;
-       glEnable(GL_LINE_SMOOTH);
-  }
-
-  /* The blend function is used for trasitioning between two images even when
-   * blend is not selected.
-   */
-  glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
-
-  if (do_wire)
-  {
-       glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
-  }
-  else
-  {
-       glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
-  }
-
-  if (do_fog)
-  {
-       glEnable(GL_FOG);
-       glFogi(GL_FOG_MODE, GL_LINEAR);
-       glFogfv(GL_FOG_COLOR, fogColor);
-       glFogf(GL_FOG_DENSITY, 0.35);
-       glFogf(GL_FOG_START, 2.0);
-       glFogf(GL_FOG_END, 10.0);
-  }
-
-  /* Our shading model--Gouraud (smooth). */
-  glShadeModel (GL_SMOOTH);
-
-  /* Culling. */
-  glCullFace (GL_BACK);
-  glEnable (GL_CULL_FACE);
-  glEnable (GL_DEPTH_TEST);
-  glFrontFace (GL_CCW);
-
-
-  /* Set the clear color. */
-  glClearColor( 0, 0, 0, 0 );
-
-  glViewport( 0, 0, width, height );
-
-  glLightfv (GL_LIGHT0, GL_AMBIENT, whiteLight0);
-  glLightfv (GL_LIGHT0, GL_DIFFUSE, sourceLight0);
-  glLightfv (GL_LIGHT0, GL_SPECULAR, specularLight0);
-  glLightfv (GL_LIGHT0, GL_POSITION, lightPos0);
-  glEnable (GL_LIGHT0);
-  glLightfv (GL_LIGHT1, GL_AMBIENT, whiteLight1);
-  glLightfv (GL_LIGHT1, GL_DIFFUSE, sourceLight1);
-  glLightfv (GL_LIGHT1, GL_SPECULAR, specularLight1);
-  glLightfv (GL_LIGHT1, GL_POSITION, lightPos1);
-  glEnable (GL_LIGHT1);
-  glEnable (GL_LIGHTING);
-
-  /* Enable color tracking */
-  glEnable (GL_COLOR_MATERIAL);
-
-  /* Set Material properties to follow glColor values */
-  glColorMaterial (GL_FRONT, GL_AMBIENT_AND_DIFFUSE);
-
-  /* Set all materials to have specular reflectivity */
-  glMaterialfv (GL_FRONT, GL_SPECULAR, specref);
-  glMateriali (GL_FRONT, GL_SHININESS, 64);
-
-  glEnable (GL_NORMALIZE);
-
-  /* Enable Arrays */
-  if (do_texture)
-  {
-    glLightModeli (GL_LIGHT_MODEL_COLOR_CONTROL, GL_SEPARATE_SPECULAR_COLOR);
+    GLfloat fogColor[4] = { 0.1, 0.1, 0.1, 0.1 };
+    /* Lighting values */
+    GLfloat lightPos0[] = {500.0f, 100.0f, 200.0f, 1.0f };
+    GLfloat whiteLight0[] = { 0.1f, 0.1f, 0.1f, 1.0f };
+    GLfloat sourceLight0[] = { 1.0f, 1.0f, 1.0f, 1.0f };
+    GLfloat specularLight0[] = { 0.7f, 0.6f, 0.3f, 1.0f };
 
-    glEnable (GL_TEXTURE_2D);
-    current_texture = 0;
-    glGenTextures (NUM_TEXTURES, textures);
-    grab_texture (mi, current_texture);
-    grab_texture (mi, 1 - current_texture);
-
-    glEnableClientState (GL_TEXTURE_COORD_ARRAY);
-  }
-
-  if (do_colour)
-  {
-    glEnableClientState (GL_COLOR_ARRAY);
-  }
-  glEnableClientState (GL_NORMAL_ARRAY);
-  glEnableClientState (GL_VERTEX_ARRAY);
+    GLfloat lightPos1[] = {0.0f, -500.0f, 500.0f, 1.0f };
+    GLfloat whiteLight1[] = { 0.1f, 0.1f, 0.1f, 1.0f };
+    GLfloat sourceLight1[] = { 1.0f, 0.3f, 0.3f, 1.0f };
+    GLfloat specularLight1[] = { 0.7f, 0.6f, 0.3f, 1.0f };
+
+    GLfloat specref[] = { 1.0f, 1.0f, 1.0f, 1.0f };
+
+    /* Setup our viewport. */
+    glViewport (0, 0, width, height ); 
+
+    glEnable(GL_DEPTH_TEST);
+
+    if (do_antialias)
+    {
+        do_blend = 1;
+        glEnable(GL_LINE_SMOOTH);
+    }
+
+    /* The blend function is used for trasitioning between two images even when
+     * blend is not selected.
+     */
+    glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+
+    if (do_wire)
+    {
+        glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
+    }
+    else
+    {
+        glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
+    }
+
+    if (do_fog)
+    {
+        glEnable(GL_FOG);
+        glFogi(GL_FOG_MODE, GL_LINEAR);
+        glFogfv(GL_FOG_COLOR, fogColor);
+        glFogf(GL_FOG_DENSITY, 0.35);
+        glFogf(GL_FOG_START, 2.0);
+        glFogf(GL_FOG_END, 10.0);
+    }
+
+    /* Our shading model--Gouraud (smooth). */
+    glShadeModel (GL_SMOOTH);
+
+    /* Culling. */
+    glCullFace (GL_BACK);
+    glEnable (GL_CULL_FACE);
+    glEnable (GL_DEPTH_TEST);
+    glFrontFace (GL_CCW);
+
+    /* Set the clear color. */
+    glClearColor( 0, 0, 0, 0 );
+
+    glViewport( 0, 0, width, height );
+
+    glLightfv (GL_LIGHT0, GL_AMBIENT, whiteLight0);
+    glLightfv (GL_LIGHT0, GL_DIFFUSE, sourceLight0);
+    glLightfv (GL_LIGHT0, GL_SPECULAR, specularLight0);
+    glLightfv (GL_LIGHT0, GL_POSITION, lightPos0);
+    glEnable (GL_LIGHT0);
+    glLightfv (GL_LIGHT1, GL_AMBIENT, whiteLight1);
+    glLightfv (GL_LIGHT1, GL_DIFFUSE, sourceLight1);
+    glLightfv (GL_LIGHT1, GL_SPECULAR, specularLight1);
+    glLightfv (GL_LIGHT1, GL_POSITION, lightPos1);
+    glEnable (GL_LIGHT1);
+    glEnable (GL_LIGHTING);
+
+    /* Enable color tracking */
+    glEnable (GL_COLOR_MATERIAL);
+
+    /* Set Material properties to follow glColor values */
+    glColorMaterial (GL_FRONT, GL_AMBIENT_AND_DIFFUSE);
+
+    /* Set all materials to have specular reflectivity */
+    glMaterialfv (GL_FRONT, GL_SPECULAR, specref);
+    glMateriali (GL_FRONT, GL_SHININESS, 64);
+
+    glEnable (GL_NORMALIZE);
+
+    /* Enable Arrays */
+    if (do_texture)
+    {
+        glLightModeli (GL_LIGHT_MODEL_COLOR_CONTROL, GL_SEPARATE_SPECULAR_COLOR);
+
+        glEnable (GL_TEXTURE_2D);
+        current_texture = 0;
+        glGenTextures (NUM_TEXTURES, textures);
+        grab_texture (mi, current_texture);
+
+        glEnableClientState (GL_TEXTURE_COORD_ARRAY);
+    }
+
+    if (do_colour)
+    {
+        glEnableClientState (GL_COLOR_ARRAY);
+    }
+    glEnableClientState (GL_NORMAL_ARRAY);
+    glEnableClientState (GL_VERTEX_ARRAY);
+
+    /* Clear the buffer since this is not done during a draw with motion blur */
+    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
 }
 
 /******************************************************************************
@@ -472,33 +502,33 @@ calculate_normal (Vector3D point1,
                   Vector3D point3,
                   Vector3D *normal)
 {
-  Vector3D vector1, vector2;
-  double magnitude;
-
-  vector1.x = point2.x - point1.x;
-  vector1.y = point2.y - point1.y;
-  vector1.z = point2.z - point1.z;
-
-  vector2.x = point3.x - point2.x;
-  vector2.y = point3.y - point2.y;
-  vector2.z = point3.z - point2.z;
-
-  (*normal).x = vector1.y * vector2.z - vector1.z * vector2.y;
-  (*normal).y = vector1.z * vector2.x - vector1.x * vector2.z;
-  (*normal).z = vector1.x * vector2.y - vector1.y * vector2.x;
-
-  /* Adjust the normal to unit magnitude */
-  magnitude = sqrt ((*normal).x * (*normal).x
-    + (*normal).y * (*normal).y
-    + (*normal).z * (*normal).z);
-
-  /* Watch out for divide by zero/underflow */
-  if (magnitude > 1e-300)
-  {
-    (*normal).x /= magnitude;
-    (*normal).y /= magnitude;
-    (*normal).z /= magnitude;
-  }
+    Vector3D vector1, vector2;
+    double magnitude;
+
+    vector1.x = point2.x - point1.x;
+    vector1.y = point2.y - point1.y;
+    vector1.z = point2.z - point1.z;
+
+    vector2.x = point3.x - point2.x;
+    vector2.y = point3.y - point2.y;
+    vector2.z = point3.z - point2.z;
+
+    (*normal).x = vector1.y * vector2.z - vector1.z * vector2.y;
+    (*normal).y = vector1.z * vector2.x - vector1.x * vector2.z;
+    (*normal).z = vector1.x * vector2.y - vector1.y * vector2.x;
+
+    /* Adjust the normal to unit magnitude */
+    magnitude = sqrt ((*normal).x * (*normal).x
+                      + (*normal).y * (*normal).y
+                      + (*normal).z * (*normal).z);
+
+    /* Watch out for divide by zero/underflow */
+    if (magnitude > 1e-300)
+    {
+        (*normal).x /= magnitude;
+        (*normal).y /= magnitude;
+        (*normal).z /= magnitude;
+    }
 }
 
 /******************************************************************************
@@ -513,154 +543,150 @@ initialise_blob(int width,
                 int height,
                 int field_array_size)
 {
-  /* Loop variables */
-  int x, y, i;
-  double xd;
-
-  colour_cycle = 0;
-
-  row_data = (Row_Data *) malloc (y_resolution * sizeof (Row_Data));
-  if (!row_data)
-  {
-    fprintf(stderr, "Couldn't allocate row data buffer\n");
-    return -1;
-  }
-
-  field_data = (Field_Data *) malloc (field_points * sizeof (Field_Data));
-  if (!field_data)
-  {
-    fprintf(stderr, "Couldn't allocate row data buffer\n");
-    return -1;
-  }
-
-  field = (double *)malloc(field_array_size * sizeof(double));
-  if (!field)
-  {
-    fprintf(stderr, "Couldn't allocate field buffer\n");
-    return -1;
-  }
-
-  wall_field = (double *)malloc(field_array_size * sizeof(double));
-  if (!wall_field)
-  {
-    fprintf(stderr, "Couldn't allocate wall_field buffer\n");
-    return -1;
-  }
-
-  dots = (Vector3D *)malloc(x_resolution * y_resolution * sizeof(Vector3D));
-  if (!dots)
-  {
-    fprintf(stderr, "Couldn't allocate points buffer\n");
-    return -1;
-  }
-  glVertexPointer (3, GL_DOUBLE, 0, (GLvoid *) dots);
-
-  normals = (Vector3D *)malloc(x_resolution * y_resolution * sizeof(Vector3D));
-  if (!normals)
-  {
-    fprintf(stderr, "Couldn't allocate normals buffer\n");
-    return -1;
-  }
-  glNormalPointer (GL_DOUBLE, 0, (GLvoid *) normals);
-
-  if (do_colour)
-  {
-    colours = (Colour *)malloc(x_resolution * y_resolution * sizeof(Colour));
-    if (!colours)
+    /* Loop variables */
+    int x, y, i;
+    double xd;
+
+    colour_cycle = 0;
+
+    row_data = (Row_Data *) malloc (y_resolution * sizeof (Row_Data));
+    if (!row_data)
+    {
+        fprintf(stderr, "Couldn't allocate row data buffer\n");
+        return -1;
+    }
+
+    field_data = (Field_Data *) malloc (field_points * sizeof (Field_Data));
+    if (!field_data)
+    {
+        fprintf(stderr, "Couldn't allocate field data buffer\n");
+        return -1;
+    }
+
+    field = (double *)malloc(field_array_size * sizeof(double));
+    if (!field)
+    {
+        fprintf(stderr, "Couldn't allocate field buffer\n");
+        return -1;
+    }
+
+    wall_field = (double *)malloc(field_array_size * sizeof(double));
+    if (!wall_field)
+    {
+        fprintf(stderr, "Couldn't allocate wall field buffer\n");
+        return -1;
+    }
+
+    dots = (Vector3D *)malloc(x_resolution * y_resolution * sizeof(Vector3D));
+    if (!dots)
     {
-      fprintf(stderr, "Couldn't allocate colours buffer\n");
-      return -1;
+        fprintf(stderr, "Couldn't allocate points buffer\n");
+        return -1;
     }
-    glColorPointer (4, GL_UNSIGNED_BYTE, 0, (GLvoid *) colours);
-  }
-  
-  if (do_texture)
-  {
-    tex_coords = (Vector2D *)malloc(x_resolution * y_resolution
-                                    * sizeof(Vector2D));
-    if (!tex_coords)
+    glVertexPointer (3, GL_DOUBLE, 0, (GLvoid *) dots);
+
+    normals = (Vector3D *)malloc(x_resolution * y_resolution * sizeof(Vector3D));
+    if (!normals)
     {
-      fprintf(stderr, "Couldn't allocate tex_coords buffer\n");
-      return -1;
+        fprintf(stderr, "Couldn't allocate normals buffer\n");
+        return -1;
     }
-    glTexCoordPointer (2, GL_DOUBLE, 0, (GLvoid *) tex_coords);
-  }
-
-  if (! do_texture)
-    do_paint_background = False;
-
-
-  num_points = 0;
-  /* Generate constant row data and count of total number of points */
-  for (y = 0; y < y_resolution; y++)
-  {
-    row_data[y].cosyd = cos(PI * (double)(y * (y_resolution + 1))
-                   / (double)(y_resolution * y_resolution));
-    row_data[y].sinyd = sin(PI * (double)(y * (y_resolution + 1))
-                   / (double)(y_resolution * y_resolution));
-    row_data[y].num_x_points = (int)(x_resolution * row_data[y].sinyd + 1.0);
-    num_points += row_data[y].num_x_points;
-  }
-
-  /* Initialise field data */
-  for (i = 0; i < field_points; i++)
-  {
-    field_data[i].ax = 2.0 * (((double)random() / (double)RAND_MAX) - 0.5);
-    field_data[i].ay = 2.0 * (((double)random() / (double)RAND_MAX) - 0.5);
-    field_data[i].apower = (((double)random() / (double)RAND_MAX) - 0.5);
-
-    field_data[i].pos.x = 1.5 * sin(PI * field_data[i].ay)
-      * cos(PI *  field_data[i].ax);
-    field_data[i].pos.y = 1.5 * cos(PI * field_data[i].ay);
-    field_data[i].pos.z = 1.5 * sin(PI * field_data[i].ay)
-      * sin(PI *  field_data[i].ax);
-
-    field_data[i].cx = 2.0 * (((double)random() / (double)RAND_MAX) - 0.5);
-    field_data[i].cy = 2.0 * (((double)random() / (double)RAND_MAX) - 0.5);
-    field_data[i].cpower = (((double)random() / (double)RAND_MAX) - 0.5);
-
-    field_data[i].vx = 0.0;
-    field_data[i].vy = 0.0;
-    field_data[i].vpower = 0.0;
-
-    field_data[i].mx = 0.003 * ((double)random() / (double)RAND_MAX);
-    field_data[i].my = 0.003 * ((double)random() / (double)RAND_MAX);
-    field_data[i].mpower = 0.003 * ((double)random() / (double)RAND_MAX);
-  }
-
-  /* Initialise lookup table of field strength */
-  for (i = 0; i < field_array_size; i++)
-  {
-    xd = 2.0 * (((double)i / (double)field_array_size));
-
-    xd = 3.0 * xd * xd * xd * xd - 0.25 * xd * xd; 
-    field[i] = 0.4 / (field_points * (xd + 0.1));
-
-    xd = 10.0 * (((double)i / (double)field_array_size));
-    wall_field[i] = 0.4 / (xd * xd * xd * xd + 1.0);
-  }
-
-  for (y = 0; y < y_resolution; y++)
-  {
-    for (x = 0; x < row_data[y].num_x_points; x++)
+    glNormalPointer (GL_DOUBLE, 0, (GLvoid *) normals);
+
+    if (do_colour)
     {
-      i = x + y * x_resolution;
-      xd = 2.0 * (((double)x / (double)row_data[y].num_x_points) - 0.5);
-
-      dots[i].x = row_data[y].sinyd * cos(PI * xd);
-      dots[i].y = row_data[y].cosyd;
-      dots[i].z = row_data[y].sinyd * sin(PI * xd);
-      normals[i].x = row_data[y].sinyd * cos(PI * xd);
-      normals[i].y = row_data[y].cosyd;
-      normals[i].z = row_data[y].sinyd * sin(PI * xd);
-      if (do_texture)
-      {
-        tex_coords[i].x = 2.0 - 2.0 * x / (float) row_data[y].num_x_points;
-        tex_coords[i].y = 1.0 - y / (float) y_resolution;
-      }
+        colours = (Colour *)malloc(x_resolution * y_resolution * sizeof(Colour));
+        if (!colours)
+        {
+            fprintf(stderr, "Couldn't allocate colours buffer\n");
+            return -1;
+        }
+        glColorPointer (4, GL_UNSIGNED_BYTE, 0, (GLvoid *) colours);
     }
-  }
-  return 0;
+
+    if (do_texture)
+    {
+        tex_coords = (Vector2D *)malloc(x_resolution * y_resolution
+                                        * sizeof(Vector2D));
+        if (!tex_coords)
+        {
+            fprintf(stderr, "Couldn't allocate tex_coords buffer\n");
+            return -1;
+        }
+        glTexCoordPointer (2, GL_DOUBLE, 0, (GLvoid *) tex_coords);
+    }
+
+    num_points = 0;
+    /* Generate constant row data and count of total number of points */
+    for (y = 0; y < y_resolution; y++)
+    {
+        row_data[y].cosyd = cos(PI * (double)(y * (y_resolution + 1))
+                                / (double)(y_resolution * y_resolution));
+        row_data[y].sinyd = sin(PI * (double)(y * (y_resolution + 1))
+                                / (double)(y_resolution * y_resolution));
+        row_data[y].num_x_points = (int)(x_resolution * row_data[y].sinyd + 1.0);
+        num_points += row_data[y].num_x_points;
+    }
+
+    /* Initialise field data */
+    for (i = 0; i < field_points; i++)
+    {
+        field_data[i].ax = 2.0 * (((double)random() / (double)RAND_MAX) - 0.5);
+        field_data[i].ay = 2.0 * (((double)random() / (double)RAND_MAX) - 0.5);
+        field_data[i].apower = (((double)random() / (double)RAND_MAX) - 0.5);
+
+        field_data[i].pos.x = 1.5 * sin(PI * field_data[i].ay)
+            * cos(PI *  field_data[i].ax);
+        field_data[i].pos.y = 1.5 * cos(PI * field_data[i].ay);
+        field_data[i].pos.z = 1.5 * sin(PI * field_data[i].ay)
+            * sin(PI *  field_data[i].ax);
+
+        field_data[i].cx = 2.0 * (((double)random() / (double)RAND_MAX) - 0.5);
+        field_data[i].cy = 2.0 * (((double)random() / (double)RAND_MAX) - 0.5);
+        field_data[i].cpower = (((double)random() / (double)RAND_MAX) - 0.5);
+
+        field_data[i].vx = 0.0;
+        field_data[i].vy = 0.0;
+        field_data[i].vpower = 0.0;
+
+        field_data[i].mx = 0.003 * ((double)random() / (double)RAND_MAX);
+        field_data[i].my = 0.003 * ((double)random() / (double)RAND_MAX);
+        field_data[i].mpower = 0.003 * ((double)random() / (double)RAND_MAX);
+    }
+
+    /* Initialise lookup table of field strength */
+    for (i = 0; i < field_array_size; i++)
+    {
+        xd = 2.0 * (((double)i / (double)field_array_size));
+
+        xd = 3.0 * xd * xd * xd * xd;
+        field[i] = 0.4 / (field_points * (xd + 0.1));
+
+        xd = 10.0 * (((double)i / (double)field_array_size));
+        wall_field[i] = 0.4 / (xd * xd * xd * xd + 1.0);
+    }
+
+    for (y = 0; y < y_resolution; y++)
+    {
+        for (x = 0; x < row_data[y].num_x_points; x++)
+        {
+            i = x + y * x_resolution;
+            xd = 2.0 * (((double)x / (double)row_data[y].num_x_points) - 0.5);
+
+            dots[i].x = row_data[y].sinyd * cos(PI * xd);
+            dots[i].y = row_data[y].cosyd;
+            dots[i].z = row_data[y].sinyd * sin(PI * xd);
+            normals[i].x = row_data[y].sinyd * cos(PI * xd);
+            normals[i].y = row_data[y].cosyd;
+            normals[i].z = row_data[y].sinyd * sin(PI * xd);
+            if (do_texture)
+            {
+                tex_coords[i].x = 2.0 - 2.0 * x / (float) row_data[y].num_x_points;
+                tex_coords[i].y = 1.0 - y / (float) y_resolution;
+            }
+        }
+    }
+    return 0;
 }
 
 
@@ -672,261 +698,316 @@ static void
 calc_blob(int width,
           int height,
           int field_array_size,
-          float limit)
+          float limit,
+          double fade)
 {
-  static double freak = 0.0;
+    static double freak = 0.0;
 
-  static double v_freak = 0.0007;
+    static double v_freak = 0.0007;
 
-  /* Loop variables */
-  int x, y, i, index;
-  /* position of a point */
-  double xd, yd, zd, offset_x, offset_y, offset_z;
-  double strength, radius;
-  double xdist, ydist, zdist;
-  int dist;
+    /* Loop variables */
+    int x, y, i, index, index1, index2, index3;
+    /* position of a point */
+    double xd, yd, zd, offset_x, offset_y, offset_z;
+    double strength, radius;
+    double xdist, ydist, zdist;
+    int dist;
 
-  /* Color components */
+    /* Color components */
 
-  colour_cycle++;
+    colour_cycle++;
 
-  blob_force.x = 0.0;
-  blob_force.y = 0.0;
-  blob_force.z = 0.0;
-  for (y = 0; y < y_resolution; y++)
-  {
-    for (x = 0; x < row_data[y].num_x_points; x++)
+    /* Update position and strength of points used to distort the blob */
+    for (i = 0; i < field_points; i++)
     {
-      index = x + y * x_resolution;
-      xd = 2.0 * PI * (((double)x / (double)row_data[y].num_x_points) - 0.5);
-
-      radius = 1.0 + 0.0 * sin (xd * 10);
-
-      zd = radius * row_data[y].sinyd * sin(xd);
-      xd = radius * row_data[y].sinyd * cos(xd);
-      yd = radius * row_data[y].cosyd;
-
-      offset_x = 0.0;
-      offset_y = 0.0;
-      offset_z = 0.0;
-      strength = 0.0;
-      for ( i = 0; i < field_points; i++)
-      {
-        xdist = field_data[i].pos.x - xd;
-        ydist = field_data[i].pos.y - yd;
-        zdist = field_data[i].pos.z - zd;
-        dist = field_array_size * (xdist * xdist + ydist * ydist
-                                   + zdist * zdist) * 0.1;
-
-        strength += PI * field_data[i].apower;
-
-        if (dist < field_array_size)
+        field_data[i].vx += field_data[i].mx*(field_data[i].cx - field_data[i].ax);
+        field_data[i].vy += field_data[i].my*(field_data[i].cy - field_data[i].ay);
+        field_data[i].vpower += field_data[i].mpower
+            * (field_data[i].cpower - field_data[i].apower);
+
+        field_data[i].ax += 0.1 * field_data[i].vx;
+        field_data[i].ay += 0.1 * field_data[i].vy;
+        field_data[i].apower += 0.1 * field_data[i].vpower;
+
+        field_data[i].pos.x = 1.0 * sin(PI * field_data[i].ay)
+            * cos(PI * field_data[i].ax);
+        field_data[i].pos.y = 1.0 * cos(PI * field_data[i].ay);
+        field_data[i].pos.z = 1.0 * sin(PI * field_data[i].ay)
+            * sin(PI * field_data[i].ax);
+    }
+
+    blob_force.x = 0.0;
+    blob_force.y = 0.0;
+    blob_force.z = 0.0;
+    for (y = 0; y < y_resolution; y++)
+    {
+        for (x = 0; x < row_data[y].num_x_points; x++)
         {
-          offset_x += xd * field_data[i].apower * field[dist];
-          offset_y += yd * field_data[i].apower * field[dist];
-          offset_z += zd * field_data[i].apower * field[dist];
+            index = x + y * x_resolution;
+            xd = 2.0 * PI * (((double)x / (double)row_data[y].num_x_points) - 0.5);
 
-          blob_force.x += 2.0 * xd * field_data[i].apower * field[dist];
-          blob_force.y += 2.0 * yd * field_data[i].apower * field[dist];
-          blob_force.z += 2.0 * zd * field_data[i].apower * field[dist];
+            radius = 1.0 + 0.0 * sin (xd * 10);
 
-          strength *= 2.0 * field[dist];
-        }
+            zd = radius * row_data[y].sinyd * sin(xd);
+            xd = radius * row_data[y].sinyd * cos(xd);
+            yd = radius * row_data[y].cosyd;
 
-        if (incremental)
-        {
-          xd += offset_x * freak * freak;
-          yd += offset_y * freak * freak;
-          zd += offset_z * freak * freak;
-        }
-        if (incremental == 1)
-        {
-          offset_x = 0.0;
-          offset_y = 0.0;
-          offset_z = 0.0;
-        }
-      }
-
-      if (incremental < 3)
-      {
-        xd += offset_x;
-        yd += offset_y;
-        zd += offset_z;
-      }
-      xd += blob_center.x;
-      yd += blob_center.y;
-      zd += blob_center.z;
-
-      if (do_colour)
-      {
-        colours[index].red = 128 + (int)(sin(strength + colour_cycle * 0.01 + 2.0 * PI * x / row_data[y].num_x_points) * 127.0);
-        colours[index].green = 128 + (int)(cos(strength + colour_cycle * 0.025) * 127.0);
-        colours[index].blue = 128 + (int)(sin(strength + colour_cycle * 0.03 + 2.0 * PI * y / y_resolution) * 127.0);
-        colours[index].alpha = 128 + (int)(cos(strength + colour_cycle * 0.015) * 63.0);
-      }
-
-      /* Add walls */
-      if (do_walls)
-      {
-        if (zd < -limit) zd = -limit;
-        if (zd > limit) zd = limit;
-
-        dist = field_array_size * (zd + limit) * (zd + limit) * 0.5;
-        if (dist < field_array_size)
-        {
-          xd += (xd - blob_center.x) * wall_field[dist];
-          yd += (yd - blob_center.y) * wall_field[dist];
-          blob_force.z += (zd + limit);
-        }
-        else
-        {
-          dist = field_array_size * (zd - limit) * (zd - limit) * 0.5;
-          if (dist < field_array_size)
-          {
-            xd += (xd - blob_center.x) * wall_field[dist];
-            yd += (yd - blob_center.y) * wall_field[dist];
-            blob_force.z -= (zd - limit);
-          }
-
-          if (yd < -limit) yd = -limit;
-          if (yd > limit) yd = limit;
-          
-          dist = field_array_size * (yd + limit) * (yd + limit) * 0.5;
-          if (dist < field_array_size)
-          {
-            xd += (xd - blob_center.x) * wall_field[dist];
-            zd += (zd - blob_center.z) * wall_field[dist];
-            blob_force.y += (yd + limit);
-          }
-          else
-          {
-            dist = field_array_size * (yd - limit) * (yd - limit) * 0.5;
-            if (dist < field_array_size)
+            normals[index].x = xd;
+            normals[index].y = yd;
+            normals[index].z = zd;
+
+            offset_x = 0.0;
+            offset_y = 0.0;
+            offset_z = 0.0;
+            strength = 0.0;
+            for ( i = 0; i < field_points; i++)
             {
-              xd += (xd - blob_center.x) * wall_field[dist];
-              zd += (zd - blob_center.z) * wall_field[dist];
-              blob_force.y -= (yd - limit);
+                xdist = field_data[i].pos.x - xd;
+                ydist = field_data[i].pos.y - yd;
+                zdist = field_data[i].pos.z - zd;
+                dist = field_array_size * (xdist * xdist + ydist * ydist
+                                           + zdist * zdist) * 0.1;
+
+                strength += PI * field_data[i].apower;
+
+                if (dist < field_array_size)
+                {
+                    offset_x += xd * field_data[i].apower * field[dist];
+                    offset_y += yd * field_data[i].apower * field[dist];
+                    offset_z += zd * field_data[i].apower * field[dist];
+
+                    blob_force.x += 1.0 * xd * field_data[i].apower * field[dist];
+                    blob_force.y += 1.0 * yd * field_data[i].apower * field[dist];
+                    blob_force.z += 1.0 * zd * field_data[i].apower * field[dist];
+
+                    strength *= 2.0 * field[dist];
+                }
+
+                if (incremental)
+                {
+                    xd += offset_x * freak * freak;
+                    yd += offset_y * freak * freak;
+                    zd += offset_z * freak * freak;
+                }
+                if (incremental == 1)
+                {
+                    offset_x = 0.0;
+                    offset_y = 0.0;
+                    offset_z = 0.0;
+                }
             }
-          }
-          
-          if (xd < -limit) xd = -limit;
-          if (xd > limit) xd = limit;
-
-          dist = field_array_size * (xd + limit) * (xd + limit) * 0.5;
-          if (dist < field_array_size)
-          {
-            yd += (yd - blob_center.y) * wall_field[dist];
-            zd += (zd - blob_center.z) * wall_field[dist];
-            blob_force.x += (xd + limit);
-          }
-          else
-          {
-            dist = field_array_size * (xd - limit) * (xd - limit) * 0.5;
-            if (dist < field_array_size)
+
+            if (incremental < 3)
             {
-              yd += (yd - blob_center.y) * wall_field[dist];
-              zd += (zd - blob_center.z) * wall_field[dist];
-              blob_force.x -= (xd - limit);
+                xd += offset_x;
+                yd += offset_y;
+                zd += offset_z;
             }
-          }
-          
-          if (yd < -limit) yd = -limit;
-          if (yd > limit) yd = limit;
+            xd += blob_center.x;
+            yd += blob_center.y;
+            zd += blob_center.z;
+
+            if (do_colour)
+            {
+                colours[index].red = 128 + (int)(sin(strength + colour_cycle * 0.01 + 2.0 * PI * x / row_data[y].num_x_points) * 127.0);
+                colours[index].green = 128 + (int)(cos(strength + colour_cycle * 0.025) * 127.0);
+                colours[index].blue = 128 + (int)(sin(strength + colour_cycle * 0.03 + 2.0 * PI * y / y_resolution) * 127.0);
+                colours[index].alpha = (int)(255.0 * fade);
+            }
+
+            /* Add walls */
+            if (do_walls)
+            {
+                if (zd < -limit) zd = -limit;
+                if (zd > limit) zd = limit;
+
+                dist = field_array_size * (zd + limit) * (zd + limit) * 0.5;
+                if (dist < field_array_size)
+                {
+                    xd += (xd - blob_center.x) * wall_field[dist];
+                    yd += (yd - blob_center.y) * wall_field[dist];
+                    blob_force.z += (zd + limit);
+                }
+                else
+                {
+                    dist = field_array_size * (zd - limit) * (zd - limit) * 0.5;
+                    if (dist < field_array_size)
+                    {
+                        xd += (xd - blob_center.x) * wall_field[dist];
+                        yd += (yd - blob_center.y) * wall_field[dist];
+                        blob_force.z -= (zd - limit);
+                    }
+
+                    if (yd < -limit) yd = -limit;
+                    if (yd > limit) yd = limit;
+
+                    dist = field_array_size * (yd + limit) * (yd + limit) * 0.5;
+                    if (dist < field_array_size)
+                    {
+                        xd += (xd - blob_center.x) * wall_field[dist];
+                        zd += (zd - blob_center.z) * wall_field[dist];
+                        blob_force.y += (yd + limit);
+                    }
+                    else
+                    {
+                        dist = field_array_size * (yd - limit) * (yd - limit) * 0.5;
+                        if (dist < field_array_size)
+                        {
+                            xd += (xd - blob_center.x) * wall_field[dist];
+                            zd += (zd - blob_center.z) * wall_field[dist];
+                            blob_force.y -= (yd - limit);
+                        }
+                    }
+
+                    if (xd < -limit) xd = -limit;
+                    if (xd > limit) xd = limit;
+
+                    dist = field_array_size * (xd + limit) * (xd + limit) * 0.5;
+                    if (dist < field_array_size)
+                    {
+                        yd += (yd - blob_center.y) * wall_field[dist];
+                        zd += (zd - blob_center.z) * wall_field[dist];
+                        blob_force.x += (xd + limit);
+                    }
+                    else
+                    {
+                        dist = field_array_size * (xd - limit) * (xd - limit) * 0.5;
+                        if (dist < field_array_size)
+                        {
+                            yd += (yd - blob_center.y) * wall_field[dist];
+                            zd += (zd - blob_center.z) * wall_field[dist];
+                            blob_force.x -= (xd - limit);
+                        }
+                    }
+
+                    if (yd < -limit) yd = -limit;
+                    if (yd > limit) yd = limit;
+                }
+            }
+
+            dots[index].x = xd;
+            dots[index].y = yd;
+            dots[index].z = zd;
         }
-      }
-        
-      dots[index].x = xd;
-      dots[index].y = yd;
-      dots[index].z = zd;
     }
-  }
-
-  /* Calculate the normals for each vertex and the texture mapping if required.
-   * Although the code actually calculates the normal for one of the triangles
-   * attached to a vertex rather than the vertex itself the results are not too
-   * bad for with a reasonable number of verticies.
-   */
-  for (y = 1; y < y_resolution - 1; y++)
-  {
-    int index1, index2, index3;
-    if (row_data[y - 1].num_x_points)
-    {
 
-      for (x = 0; x < row_data[y].num_x_points; x++)
-      {
-        if (x == row_data[y].num_x_points - 1)
+    /* Calculate the normals for each vertex and the texture mapping if required.
+     * Although the code actually calculates the normal for one of the triangles
+     * attached to a vertex rather than the vertex itself the results are not too
+     * bad for with a reasonable number of verticies.
+     */
+
+    /* The first point is treated as a special case since the loop expects to use
+     * points in the previous row to form the triangle.
+     */
+    index1 = 0;
+    index2 = y * x_resolution;
+    index3 = 1 + y * x_resolution;
+    calculate_normal (dots[index1], dots[index2], dots[index3], &normals[index1]);
+    if (do_texture)
+    {
+        if (offset_texture)
         {
-          index1 = y * x_resolution;
+            tex_coords[index1].x = dots[index1].x * 0.125 + 0.5
+                * (1.0 + 0.25 * asin(normals[index1].x) / (0.5 * PI));
+            tex_coords[index1].y = dots[index1].y * 0.125 + 0.5
+                * (1.0 + 0.25 * asin(normals[index1].y) / (0.5 * PI));
         }
         else
         {
-          index1 = x + 1 + y * x_resolution;
+            tex_coords[index1].x = 0.5 * (1.0 + (asin(normals[index1].x)
+                                                 / (0.5 * PI)));
+            tex_coords[index1].y = 0.5 * (1.0 + (asin(normals[index1].y)
+                                                 / (0.5 * PI)));
+        }
+        tex_coords[index1].x *= tex_width[current_texture];
+        tex_coords[index1].y *= tex_height[current_texture];
+    }
+
+    for (y = 1; y < y_resolution - 1; y++)
+    {
+        if (row_data[y - 1].num_x_points)
+        {
+            for (x = 0; x < row_data[y].num_x_points; x++)
+            {
+                if (x == row_data[y].num_x_points - 1)
+                {
+                    index1 = y * x_resolution;
+                }
+                else
+                {
+                    index1 = x + 1 + y * x_resolution;
+                }
+                index2 = x + y * x_resolution;
+                index3 = ((x + 0.5) * row_data[y - 1].num_x_points
+                          / row_data[y].num_x_points) + (y - 1) * x_resolution;
+                calculate_normal (dots[index1], dots[index2], dots[index3],
+                                  &normals[index1]);
+                if (do_texture)
+                {
+                    if (offset_texture)
+                    {
+                        tex_coords[index1].x = dots[index1].x * 0.125 + 0.5
+                            * (1.0 + 0.25 * asin(normals[index1].x) / (0.5 * PI));
+                        tex_coords[index1].y = dots[index1].y * 0.125 + 0.5
+                            * (1.0 + 0.25 * asin(normals[index1].y) / (0.5 * PI));
+                    }
+                    else
+                    {
+                        tex_coords[index1].x = 0.5 * (1.0 + (asin(normals[index1].x)
+                                                             / (0.5 * PI)));
+                        tex_coords[index1].y = 0.5 * (1.0 + (asin(normals[index1].y)
+                                                             / (0.5 * PI)));
+                    }
+                    tex_coords[index1].x *= tex_width[current_texture];
+                    tex_coords[index1].y *= tex_height[current_texture];
+                }
+            }
         }
-        index2 = x + y * x_resolution;
-        index3 = ((x + 0.5) * row_data[y - 1].num_x_points
-                  / row_data[y].num_x_points) + (y - 1) * x_resolution;
-        calculate_normal (dots[index1], dots[index2], dots[index3],
-                          &normals[index1]);
-        if (do_texture)
+    }
+    index1 = (y_resolution - 1) * x_resolution;
+    index2 = (y_resolution - 2) * x_resolution;
+    index3 = 1 + (y_resolution - 2) * x_resolution;
+    calculate_normal (dots[index1], dots[index2], dots[index3], &normals[index1]);
+    if (do_texture)
+    {
+        if (offset_texture)
         {
-          if (offset_texture)
-          {
             tex_coords[index1].x = dots[index1].x * 0.125 + 0.5
-              * (1.0 + 0.25 * asin(normals[index1].x) / (0.5 * PI));
+                * (1.0 + 0.25 * asin(normals[index1].x) / (0.5 * PI));
             tex_coords[index1].y = dots[index1].y * 0.125 + 0.5
-              * (1.0 + 0.25 * asin(normals[index1].y) / (0.5 * PI));
-          }
-          else
-          {
+                * (1.0 + 0.25 * asin(normals[index1].y) / (0.5 * PI));
+        }
+        else
+        {
             tex_coords[index1].x = 0.5 * (1.0 + (asin(normals[index1].x)
                                                  / (0.5 * PI)));
             tex_coords[index1].y = 0.5 * (1.0 + (asin(normals[index1].y)
                                                  / (0.5 * PI)));
-          }
-          tex_coords[index1].x *= tex_width[current_texture];
-          tex_coords[index1].y *= tex_height[current_texture];
         }
-      }
+        tex_coords[index1].x *= tex_width[current_texture];
+        tex_coords[index1].y *= tex_height[current_texture];
     }
-  }
-
-  freak += v_freak;
-  v_freak += -freak / 2000000.0;
-
-  /* Update position and strength of points used to distort the blob */
-  for (i = 0; i < field_points; i++)
-  {
-    field_data[i].vx += field_data[i].mx*(field_data[i].cx - field_data[i].ax);
-    field_data[i].vy += field_data[i].my*(field_data[i].cy - field_data[i].ay);
-    field_data[i].vpower += field_data[i].mpower
-      * (field_data[i].cpower - field_data[i].apower);
-
-    field_data[i].ax += 0.1 * field_data[i].vx;
-    field_data[i].ay += 0.1 * field_data[i].vy;
-    field_data[i].apower += 0.1 * field_data[i].vpower;
-
-    field_data[i].pos.x = 1.5 * sin(PI * field_data[i].ay)
-      * cos(PI * field_data[i].ax);
-    field_data[i].pos.y = 1.5 * cos(PI * field_data[i].ay);
-    field_data[i].pos.z = 1.5 * sin(PI * field_data[i].ay)
-      * sin(PI * field_data[i].ax);
-  }
-        
-  /* Update the center of the whole blob */
-  blob_velocity.x += (blob_anchor.x - blob_center.x) / 80.0
-    + 0.01 * blob_force.x / num_points;
-  blob_velocity.y += (blob_anchor.y - blob_center.y) / 80.0
-    + 0.01 * blob_force.y / num_points;
-  blob_velocity.z += (blob_anchor.z - blob_center.z) / 80.0
-    + 0.01 * blob_force.z / num_points;
-
-  blob_center.x += blob_velocity.x * 0.5;
-  blob_center.y += blob_velocity.y * 0.5;
-  blob_center.z += blob_velocity.z * 0.5;
-
-  blob_velocity.x *= 0.99;
-  blob_velocity.y *= 0.99;
-  blob_velocity.z *= 0.99;
+
+
+    freak += v_freak;
+    v_freak += -freak / 2000000.0;
+
+    /* Update the center of the whole blob */
+    blob_velocity.x += (blob_anchor.x - blob_center.x) / 80.0
+        + 0.01 * blob_force.x / num_points;
+    blob_velocity.y += (blob_anchor.y - blob_center.y) / 80.0
+        + 0.01 * blob_force.y / num_points;
+    blob_velocity.z += (blob_anchor.z - blob_center.z) / 80.0
+        + 0.01 * blob_force.z / num_points;
+
+    blob_center.x += blob_velocity.x * 0.5;
+    blob_center.y += blob_velocity.y * 0.5;
+    blob_center.z += blob_velocity.z * 0.5;
+
+    blob_velocity.x *= 0.99;
+    blob_velocity.y *= 0.99;
+    blob_velocity.z *= 0.99;
 }
 
 /******************************************************************************
@@ -939,78 +1020,78 @@ calc_blob(int width,
  * with the more interesting bits of the code.
  */
 static void
-draw_blob (void) 
+draw_blob (void)
 {
-  int x, y, x2, x3;
-  int index1, index2, index3;
-  int lower, upper;
+    int x, y, x2, x3;
+    int index1, index2, index3;
+    int lower, upper;
 
-  glMatrixMode (GL_MODELVIEW);
-  glLoadIdentity ();
+    glMatrixMode (GL_MODELVIEW);
+    glLoadIdentity ();
 
-  /* Move down the z-axis. */
-  glTranslatef( 0.0, 0.0, -5.0 );
+    /* Move down the z-axis. */
+    glTranslatef (0.0, 0.0, -5.0 );
 
-  for (y = 1; y < y_resolution; y++)
-  {
-    if (row_data[y - 1].num_x_points)
+    for (y = 1; y < y_resolution; y++)
     {
-      for (x = 0; x < row_data[y].num_x_points; x++)
-      {
-        glBegin (GL_TRIANGLES);
-        if (x == row_data[y].num_x_points - 1)
+        if (row_data[y - 1].num_x_points)
         {
-          index1 = y * x_resolution;
-        }
-        else
-        {
-          index1 = x + 1 + y * x_resolution;
-        }
-        index2 = x + y * x_resolution;
-        index3 = ((x + 0.5) * row_data[y - 1].num_x_points
-                  / row_data[y].num_x_points) + (y - 1) * x_resolution;
-        glArrayElement(index1);
-        glArrayElement(index2);
-        glArrayElement(index3);
-        glEnd();
-
-        lower = floorf((x - 0.5) * row_data[y - 1].num_x_points
-                       / (float)row_data[y].num_x_points);
-        upper = floorf((x + 0.5) * row_data[y - 1].num_x_points
-                       / (float)row_data[y].num_x_points);
-
-        if (upper > lower)
-        {
-          glBegin (GL_TRIANGLE_FAN);
-          index1 = x + y * x_resolution;
-          
-          for (x2 = lower; x2 <= upper; x2++)
-          {
-            x3 = x2;
-            while (x3 < 0) x3 += row_data[y - 1].num_x_points;
-            while (x3 >= row_data[y - 1].num_x_points)
-              x3 -= row_data[y - 1].num_x_points;
-            index2 = x3 + (y - 1) * x_resolution;
-
-            if (x2 < upper)
+            for (x = 0; x < row_data[y].num_x_points; x++)
             {
-              x3 = x2 + 1;
-              while (x3 < 0) x3 += row_data[y - 1].num_x_points;
-              while (x3 >= row_data[y - 1].num_x_points)
-                x3 -= row_data[y - 1].num_x_points;
-              index3 = x3 + (y - 1) * x_resolution;
-              if (x2 == lower)
-              {
+                glBegin (GL_TRIANGLES);
+                if (x == row_data[y].num_x_points - 1)
+                {
+                    index1 = y * x_resolution;
+                }
+                else
+                {
+                    index1 = x + 1 + y * x_resolution;
+                }
+                index2 = x + y * x_resolution;
+                index3 = ((x + 0.5) * row_data[y - 1].num_x_points
+                          / row_data[y].num_x_points) + (y - 1) * x_resolution;
                 glArrayElement(index1);
-              }
+                glArrayElement(index2);
+                glArrayElement(index3);
+                glEnd();
+
+                lower = floorf((x - 0.5) * row_data[y - 1].num_x_points
+                               / (float)row_data[y].num_x_points);
+                upper = floorf((x + 0.5) * row_data[y - 1].num_x_points
+                               / (float)row_data[y].num_x_points);
+
+                if (upper > lower)
+                {
+                    glBegin (GL_TRIANGLE_FAN);
+                    index1 = x + y * x_resolution;
+
+                    for (x2 = lower; x2 <= upper; x2++)
+                    {
+                        x3 = x2;
+                        while (x3 < 0) x3 += row_data[y - 1].num_x_points;
+                        while (x3 >= row_data[y - 1].num_x_points)
+                            x3 -= row_data[y - 1].num_x_points;
+                        index2 = x3 + (y - 1) * x_resolution;
+
+                        if (x2 < upper)
+                        {
+                            x3 = x2 + 1;
+                            while (x3 < 0) x3 += row_data[y - 1].num_x_points;
+                            while (x3 >= row_data[y - 1].num_x_points)
+                                x3 -= row_data[y - 1].num_x_points;
+                            index3 = x3 + (y - 1) * x_resolution;
+                            if (x2 == lower)
+                            {
+                                glArrayElement(index1);
+                            }
+                        }
+                        glArrayElement(index2);
+                    }
+                    glEnd ();
+                }
             }
-            glArrayElement(index2);
-          }
-          glEnd ();
         }
-      }
     }
-  }
 }
 
 /******************************************************************************
@@ -1020,37 +1101,37 @@ draw_blob (void)
 static void
 draw_background (ModeInfo *mi)
 {
-  glTexEnvf (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
-  glEnable (GL_TEXTURE_2D);    
-  glDisable(GL_LIGHTING);
+    glTexEnvf (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
+    glEnable (GL_TEXTURE_2D);
+    glDisable(GL_LIGHTING);
 
-  /* Reset the projection matrix to make it easier to get the size of the quad
-   * correct
-   */
-  glMatrixMode(GL_PROJECTION);
-  glPushMatrix();
-  glLoadIdentity();
+    /* Reset the projection matrix to make it easier to get the size of the quad
+     * correct
+     */
+    glMatrixMode(GL_PROJECTION);
+    glPushMatrix();
+    glLoadIdentity();
 
-  glOrtho(0.0, MI_WIDTH(mi), MI_HEIGHT(mi), 0.0, -1000.0, 1000.0);
+    glOrtho(0.0, MI_WIDTH(mi), MI_HEIGHT(mi), 0.0, -1000.0, 1000.0);
 
-  glBegin (GL_QUADS);
-    
-  glTexCoord2f (0.0, tex_height[current_texture]);
-  glVertex2i (0, 0);
-    
-  glTexCoord2f (0.0, 0.0);
-  glVertex2i (0, MI_HEIGHT(mi));
+    glBegin (GL_QUADS);
     
-  glTexCoord2f (tex_width[current_texture], 0.0);
-  glVertex2i (MI_WIDTH(mi), MI_HEIGHT(mi));
+    glTexCoord2f (0.0, tex_height[current_texture]);
+    glVertex2i (0, 0);
     
-  glTexCoord2f (tex_width[current_texture], tex_height[current_texture]);
-  glVertex2i (MI_WIDTH(mi), 0);
-  glEnd();
+    glTexCoord2f (0.0, 0.0);
+    glVertex2i (0, MI_HEIGHT(mi));
 
-  glPopMatrix ();
-  glMatrixMode (GL_MODELVIEW);
-  glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
+    glTexCoord2f (tex_width[current_texture], 0.0);
+    glVertex2i (MI_WIDTH(mi), MI_HEIGHT(mi));
+
+    glTexCoord2f (tex_width[current_texture], tex_height[current_texture]);
+    glVertex2i (MI_WIDTH(mi), 0);
+    glEnd();
+
+    glPopMatrix ();
+    glMatrixMode (GL_MODELVIEW);
+    glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
 }
 
 /******************************************************************************
@@ -1058,193 +1139,247 @@ draw_background (ModeInfo *mi)
  * Update the scene.
  */
 static GLvoid
-drawScene(ModeInfo * mi) 
+draw_scene(ModeInfo * mi)
 {
-  check_gl_error ("drawScene");
-  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+    double fade = 0.0;
+    double current_time;
+    check_gl_error ("draw_scene");
 
-  glDisable (GL_BLEND);
+    glColor4d(1.0, 1.0, 1.0, 1.0);
 
-  /* Ensure the background is drawn with the correct texture */
-  if (do_texture)
-  {
-    glBindTexture (GL_TEXTURE_2D, textures[current_texture]);
-  }
+    current_time = double_time();
+    switch (state)
+    {
+    case TRANSITIONING:
+        fade = (current_time - state_start_time) / fade_time;
+        break;
 
-  glColor4ub(255, 255, 255, 255);
-  if (do_paint_background && !do_wire)
-  {
-    draw_background (mi);
+    case HOLDING:
+        fade = 0.0;
+        break;
+    }
 
-    /* When transitioning between two images paint the new image over the old
-     * image with a varying alpha value to get a smooth fade.
+
+    /* Set the correct texture, when transitioning this ensures that the first draw
+     * is the original texture (which has the new texture drawn over it with decreasing
+     * transparency)
      */
-    if (transitioning)
+    if (do_texture)
     {
-      glDisable (GL_DEPTH_TEST);
-      glEnable (GL_BLEND);
-      glBindTexture (GL_TEXTURE_2D, textures[1 - current_texture]);
-      glColor4ub (255, 255, 255, transitioning);
-
-      draw_background (mi);
-
       glBindTexture (GL_TEXTURE_2D, textures[current_texture]);
-      glEnable (GL_DEPTH_TEST);
     }
-    /* Clear the depth buffer bit so the backgound is behind the blob */
-    glClear(GL_DEPTH_BUFFER_BIT);
-  }
-  else
-  {
-    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
-  }
 
-  calc_blob(MI_WIDTH(mi), MI_HEIGHT(mi), 1024, 2.5);
+    if (do_paint_background && !do_wire)
+    {
+        glClear(GL_DEPTH_BUFFER_BIT);
+        if (motion_blur)
+        {
+            glEnable (GL_BLEND);
+            glColor4ub (255, 255, 255, motion_blur);
+        }
+        draw_background (mi);
 
-  glEnable(GL_LIGHTING);
-  glEnable(GL_LIGHT0);
-  glEnable(GL_LIGHT1);
+        /* When transitioning between two images paint the new image over the old
+         * image with a varying alpha value to get a smooth fade.
+         */
+        if (state == TRANSITIONING)
+        {
+            glDisable (GL_DEPTH_TEST);
+            glEnable (GL_BLEND);
+            /* Select the texture to transition to */
+            glBindTexture (GL_TEXTURE_2D, textures[1 - current_texture]);
+            glColor4d (1.0, 1.0, 1.0, fade);
+
+            draw_background (mi);
 
-  if (do_blend)
-  {
-    glEnable (GL_BLEND);
-    if (transitioning)
+            /* Select the original texture to draw the blob */
+            glBindTexture (GL_TEXTURE_2D, textures[current_texture]);
+            glEnable (GL_DEPTH_TEST);
+        }
+        /* Clear the depth buffer bit so the backgound is behind the blob */
+        glClear(GL_DEPTH_BUFFER_BIT);
+    }
+    else if (motion_blur)
     {
-      glColor4ub (255, 255, 255, 128 - transitioning / 2);
+        glDisable (GL_DEPTH_TEST);
+        glEnable (GL_BLEND);
+        glColor4ub (0, 0, 0, motion_blur);
+        glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
+        glRectd (-10.0, -10.0, 10.0, 10.0);
+        if (do_wire)
+        {
+            glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
+        }
+        glEnable (GL_DEPTH_TEST);
+        glClear (GL_DEPTH_BUFFER_BIT);
     }
     else
     {
-      glColor4ub (255, 255, 255, 128);
+        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
     }
-  }
-  else
-  {
-    glDisable (GL_BLEND);
-    glColor4ub (255, 255, 255, 255);
-  }
-  draw_blob();
-
-  /* While transitioning draw the blob twice with a modified alpha channel.
-   * The trasitioning state machine is very crude, it simply counts frames
-   * rather than elapsed time but it works.
-   */
-  if (do_texture)
-  {
-    if (transitioning)
+
+    if (do_blend)
     {
-      glClear(GL_DEPTH_BUFFER_BIT);
-      glEnable (GL_BLEND);
-      glBindTexture (GL_TEXTURE_2D, textures[1 - current_texture]);
-      if (do_blend)
-      {
-        glColor4ub (255, 255, 255, transitioning / 2);
-      }
-      else
-      {
-        glColor4ub (255, 255, 255, transitioning);
-      }
-      draw_blob ();
-      transitioning += fade_speed;
-      if (transitioning > 255)
-      {
-        transitioning = 0;
-        current_texture = 1 - current_texture;
-        holding = 1;
-      }
+        fade = fade * 0.5;
     }
-    if (holding)
+
+    calc_blob(MI_WIDTH(mi), MI_HEIGHT(mi), 1024, 2.5, fade);
+
+    glEnable(GL_LIGHTING);
+    glEnable(GL_LIGHT0);
+    glEnable(GL_LIGHT1);
+
+    if (do_blend)
+    {
+        glEnable (GL_BLEND);
+        if (do_colour)
+        {
+            glBlendFunc (GL_ONE_MINUS_SRC_ALPHA, GL_SRC_ALPHA);
+        }
+        else
+        {
+            glColor4d (1.0, 1.0, 1.0, 0.5 - fade);
+        }
+    }
+    else
     {
-      holding++;
-      if (holding > hold_frames)
-      {
-        grab_texture (mi, 1 - current_texture);
-        transitioning = 1;
-        holding = 0;
-      }
+        glDisable (GL_BLEND);
+        glColor4d (1.0, 1.0, 1.0, 1.0);
     }
-  }
-  
-  /* increment frame-counter */
-/*  frame++; */
+    draw_blob();
 
-/*  check_gl_error ("drawScene"); */
-}
+    if (do_blend && do_colour)
+    {
+        glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+    }
+
+    /* While transitioning draw a second blob twice with a modified alpha channel.
+     * The trasitioning state machine is very crude, it simply counts frames
+     * rather than elapsed time but it works.
+     */
+    if (do_texture && (hold_time > 0))
+    {
+        switch (state)
+        {
+        case TRANSITIONING:
+            glClear(GL_DEPTH_BUFFER_BIT);
+            glEnable (GL_BLEND);
+            /* Select the texture to transition to */
+            glBindTexture (GL_TEXTURE_2D, textures[1 - current_texture]);
+            glColor4d (1.0, 1.0, 1.0, fade);
+            draw_blob ();
+
+            if ((current_time - state_start_time) > fade_time)
+            {
+                state = HOLDING;
+                state_start_time = current_time;
+                current_texture = 1 - current_texture;
+            }
+            break;
 
+        case HOLDING:
+            if ((current_time - state_start_time) > hold_time)
+            {
+                grab_texture (mi, 1 - current_texture);
+                state = TRANSITIONING;
+                /* Get the time again rather than using the current time so
+                 * that the time taken by the grab_texture function is not part
+                 * of the fade time
+                 */
+                state_start_time = double_time();
+            }
+            break;
+        }
+    }
+}
 
+/******************************************************************************
+ *
+ * XScreensaver screen update entry
+ */
 void
-draw_mirrorblob(ModeInfo * mi)
+draw_screensaver(ModeInfo * mi)
 {
-  screensaverstruct *gp = &Screensaver[MI_SCREEN(mi)];
-  Display    *display = MI_DISPLAY(mi);
-  Window      window = MI_WINDOW(mi);
+    screensaverstruct *gp = &Screensaver[MI_SCREEN(mi)];
+    Display    *display = MI_DISPLAY(mi);
+    Window      window = MI_WINDOW(mi);
 
-  if (!gp->glx_context)
-       return;
+    if (!gp->glx_context)
+        return;
 
-  glXMakeCurrent(display, window, *(gp->glx_context));
-  drawScene(mi);
-  if (mi->fps_p) do_fps (mi);
-  glXSwapBuffers(display, window);
+    glXMakeCurrent(display, window, *(gp->glx_context));
+    draw_scene(mi);
+    if (mi->fps_p) do_fps (mi);
+    glXSwapBuffers(display, window);
 }
 
-/* Standard reshape function */
+/******************************************************************************
+ *
+ * XScreensaver screen resize entry
+ */
 void
-reshape_mirrorblob(ModeInfo *mi, int width, int height)
+reshape_screensaver(ModeInfo *mi, int width, int height)
 {
-  glViewport( 0, 0, MI_WIDTH(mi), MI_HEIGHT(mi) );
-  resetProjection(width, height);
+    glViewport( 0, 0, MI_WIDTH(mi), MI_HEIGHT(mi) );
+    reset_projection(width, height);
 }
 
+/******************************************************************************
+ *
+ * XScreensaver initialise entry
+ */
 void
-init_mirrorblob(ModeInfo * mi)
+init_screensaver(ModeInfo * mi)
 {
-  int screen = MI_SCREEN(mi);
-
-  screensaverstruct *gp;
-
-  if (Screensaver == NULL) {
-       if ((Screensaver = (screensaverstruct *)
-         calloc(MI_NUM_SCREENS(mi), sizeof (screensaverstruct))) == NULL)
-         return;
-  }
-  gp = &Screensaver[screen];
-
-  gp->window = MI_WINDOW(mi);
-  if ((gp->glx_context = init_GL(mi)) != NULL) {
-       reshape_mirrorblob(mi, MI_WIDTH(mi), MI_HEIGHT(mi));
-       initializeGL(mi, MI_WIDTH(mi), MI_HEIGHT(mi));
-  } else {
-       MI_CLEARWINDOW(mi);
-  }
-  /* Set the environment variable used by NVIDIA cards to control updating
-   * during the blankning interval */ 
-  setenv ("__GL_SYNC_TO_VBLANK", "1", 1);
-  setenv ("__GL_FSAA_MODE", "1", 1);
-
-  initialise_blob(MI_WIDTH(mi), MI_HEIGHT(mi), 1024);
-}
+    int screen = MI_SCREEN(mi);
 
+    screensaverstruct *gp;
+
+    if (Screensaver == NULL)
+    {
+        if ((Screensaver = (screensaverstruct *)
+             calloc(MI_NUM_SCREENS(mi), sizeof (screensaverstruct))) == NULL)
+        {
+            return;
+        }
+    }
+    gp = &Screensaver[screen];
 
-/* all sorts of nice cleanup code should go here! */
-void release_mirrorblob(ModeInfo * mi)
+    gp->window = MI_WINDOW(mi);
+    if ((gp->glx_context = init_GL(mi)) != NULL)
+    {
+        reshape_screensaver(mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+        initialize_gl(mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+    }
+    else
+    {
+        MI_CLEARWINDOW(mi);
+    }
+
+    initialise_blob(MI_WIDTH(mi), MI_HEIGHT(mi), 1024);
+    state_start_time = double_time();
+}
+
+/******************************************************************************
+ *
+ * XScreensaver cleanup entry
+ */
+void
+release_screensaver(ModeInfo * mi)
 {
-  int screen;
-
-  if (row_data) free(row_data);
-  if (field_data) free(field_data);
-  if (colours) free(colours);
-  if (tex_coords) free(tex_coords);
-  if (dots) free(dots);
-  if (wall_field) free(wall_field);
-  if (field) free(field);
-
-  if (Screensaver != NULL) {
-       for (screen = 0; screen < MI_NUM_SCREENS(mi); screen++) {
-/*       screensaverstruct *gp = &Screensaver[screen];*/
-       }
-       (void) free((void *) Screensaver);
-       Screensaver = NULL;
-  }
-  FreeAllGL(mi);
+    if (row_data) free(row_data);
+    if (field_data) free(field_data);
+    if (colours) free(colours);
+    if (tex_coords) free(tex_coords);
+    if (dots) free(dots);
+    if (wall_field) free(wall_field);
+    if (field) free(field);
+
+    if (Screensaver != NULL)
+    {
+        (void) free((void *) Screensaver);
+        Screensaver = NULL;
+    }
+    FreeAllGL(mi);
 }
 #endif
index f9693ae16f348ed4cc4f5c4224c0475c942fee48..97e7824ffcf7c78def6550eb3550174789847d25 100644 (file)
@@ -122,8 +122,8 @@ static XrmOptionDescRec opts[] =
 };
 static argtype vars[] =
 {
-  {(caddr_t *) & solidmoebius, (char *) "solidmoebius", (char *) "Solidmoebius", (char *) DEF_SOLIDMOEBIUS, t_Bool},
-  {(caddr_t *) & noants, (char *) "noants", (char *) "Noants", (char *) DEF_NOANTS, t_Bool}
+  {&solidmoebius, "solidmoebius", "Solidmoebius", DEF_SOLIDMOEBIUS, t_Bool},
+  {&noants, "noants", "Noants", DEF_NOANTS, t_Bool}
 
 };
 static OptionStruct desc[] =
index 39ad1969e7e8d05693c7b0c63e4c63e094199d4b..85c6317396e6f081bb3d5a5440d941c20b4f98be 100644 (file)
@@ -1,4 +1,4 @@
-/* molecule, Copyright (c) 2001 Jamie Zawinski <jwz@jwz.org>
+/* molecule, Copyright (c) 2001, 2004 Jamie Zawinski <jwz@jwz.org>
  * Draws molecules, based on coordinates from PDB (Protein Data Base) files.
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
    http://www.sci.ouc.bc.ca/chem/molecule/molecule.html
  */
 
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <unistd.h>
+#include <dirent.h>
 #include <X11/Intrinsic.h>
 
 #define PROGCLASS      "Molecule"
@@ -115,6 +119,7 @@ typedef struct {
 static atom_data all_atom_data[] = {
   { "H",    1.17,  0,  "White",           "Grey70",        { 0, }},
   { "C",    1.75,  0,  "Grey60",          "White",         { 0, }},
+  { "CA",   1.80,  0,  "Blue",            "LightBlue",     { 0, }},
   { "N",    1.55,  0,  "LightSteelBlue3", "SlateBlue1",    { 0, }},
   { "O",    1.40,  0,  "Red",             "LightPink",     { 0, }},
   { "P",    1.28,  0,  "MediumPurple",    "PaleVioletRed", { 0, }},
@@ -204,15 +209,15 @@ static XrmOptionDescRec opts[] = {
 };
 
 static argtype vars[] = {
-  {(caddr_t *) &molecule_str, "molecule",   "Molecule", DEF_MOLECULE,t_String},
-  {(caddr_t *) &timeout,   "timeout","Seconds",DEF_TIMEOUT,t_Int},
-  {(caddr_t *) &do_spin,   "spin",   "Spin",   DEF_SPIN,   t_String},
-  {(caddr_t *) &do_wander, "wander", "Wander", DEF_WANDER, t_Bool},
-  {(caddr_t *) &do_labels, "labels", "Labels", DEF_LABELS, t_Bool},
-  {(caddr_t *) &do_titles, "titles", "Titles", DEF_TITLES, t_Bool},
-  {(caddr_t *) &do_atoms,  "atoms",  "Atoms",  DEF_ATOMS,  t_Bool},
-  {(caddr_t *) &do_bonds,  "bonds",  "Bonds",  DEF_BONDS,  t_Bool},
-  {(caddr_t *) &do_bbox,   "bbox",   "BBox",   DEF_BBOX,   t_Bool},
+  {&molecule_str, "molecule",   "Molecule", DEF_MOLECULE,t_String},
+  {&timeout,   "timeout","Seconds",DEF_TIMEOUT,t_Int},
+  {&do_spin,   "spin",   "Spin",   DEF_SPIN,   t_String},
+  {&do_wander, "wander", "Wander", DEF_WANDER, t_Bool},
+  {&do_labels, "labels", "Labels", DEF_LABELS, t_Bool},
+  {&do_titles, "titles", "Titles", DEF_TITLES, t_Bool},
+  {&do_atoms,  "atoms",  "Atoms",  DEF_ATOMS,  t_Bool},
+  {&do_bonds,  "bonds",  "Bonds",  DEF_BONDS,  t_Bool},
+  {&do_bbox,   "bbox",   "BBox",   DEF_BBOX,   t_Bool},
 };
 
 ModeSpecOpt molecule_opts = {countof(opts), opts, countof(vars), vars, NULL};
@@ -305,7 +310,7 @@ get_atom_data (const char *atom_name)
   for (i = 0; i < countof(all_atom_data); i++)
     {
       d = &all_atom_data[i];
-      if (!strcmp (n, all_atom_data[i].name))
+      if (!strcasecmp (n, all_atom_data[i].name))
         break;
     }
 
@@ -844,6 +849,12 @@ parse_pdb_data (molecule *m, const char *data, const char *filename, int line)
           ss = name + strlen(name)-1;
           while (isspace(*ss) && ss > name)
             *ss-- = 0;
+         ss = name + 1;
+         while(*ss)
+          {
+           *ss = tolower(*ss);
+            ss++;
+          }
           sscanf (s + 32, " %f %f %f ", &x, &y, &z);
 /*
           fprintf (stderr, "%s: %s: %d: atom: %d \"%s\" %9.4f %9.4f %9.4f\n",
@@ -1072,41 +1083,134 @@ load_molecules (ModeInfo *mi)
 {
   molecule_configuration *mc = &mcs[MI_SCREEN(mi)];
   int wire = MI_IS_WIREFRAME(mi);
+  Bool verbose_p = False;
+  int i;
 
   if (!molecule_str || !*molecule_str ||
       !strcmp(molecule_str, "(default)"))      /* do the builtins */
     {
-      int i;
       mc->nmolecules = countof(builtin_pdb_data);
       mc->molecules = (molecule *) calloc (sizeof (molecule), mc->nmolecules);
       for (i = 0; i < mc->nmolecules; i++)
         {
           char name[100];
           sprintf (name, "<builtin-%d>", i);
+          if (verbose_p) fprintf (stderr, "%s: reading %s\n", progname, name);
           parse_pdb_data (&mc->molecules[i], builtin_pdb_data[i], name, 1);
-          generate_molecule_formula (&mc->molecules[i]);
-          insert_vertical_whitespace ((char *) mc->molecules[i].label);
         }
     }
   else                                         /* Load a file */
     {
-      int i = 0;
-      mc->nmolecules = 1;
-      mc->molecules = (molecule *) calloc (sizeof (molecule), mc->nmolecules);
-      parse_pdb_file (&mc->molecules[i], molecule_str);
-      generate_molecule_formula (&mc->molecules[i]);
-      insert_vertical_whitespace ((char *) mc->molecules[i].label);
+      /* The -molecule option can point to a .pdb file, or to
+         a directory of them.
+      */
+      struct stat st;
+      int nfiles = 0;
+      int list_size = 0;
+      char **files = 0;
+
+      if (!stat (molecule_str, &st) &&
+          S_ISDIR (st.st_mode))
+        {
+          char buf [255];
+          DIR *pdb_dir;
+          struct dirent *dentry;
+
+          pdb_dir = opendir (molecule_str);
+          if (! pdb_dir)
+            {
+              sprintf (buf, "%.100s: %.100s", progname, molecule_str);
+              perror (buf);
+              exit (1);
+            }
+
+          if (verbose_p)
+            fprintf (stderr, "%s: directory %s\n", progname, molecule_str);
+
+          nfiles = 0;
+          list_size = 100;
+          files = (char **) calloc (sizeof(*files), list_size);
+
+          while ((dentry = readdir (pdb_dir)))
+            {
+              int L = strlen (dentry->d_name);
+              if (L > 4 && !strcasecmp (dentry->d_name + L - 4, ".pdb"))
+                {
+                  char *fn;
+                  if (nfiles >= list_size-1)
+                    {
+                      list_size = (list_size + 10) * 1.2;
+                      files = (char **)
+                        realloc (files, list_size * sizeof(*files));
+                      if (!files)
+                        {
+                        OOM:
+                          fprintf (stderr, "%s: out of memory (%d files)\n",
+                                   progname, nfiles);
+                          exit (1);
+                        }
+                    }
+
+                  fn = (char *) malloc (strlen (molecule_str) + L + 10);
+                  if (!fn) goto OOM;
+                  strcpy (fn, molecule_str);
+                  if (fn[strlen(fn)-1] != '/') strcat (fn, "/");
+                  strcat (fn, dentry->d_name);
+                  files[nfiles++] = fn;
+                  if (verbose_p)
+                    fprintf (stderr, "%s: file %s\n", progname, fn);
+                }
+            }
+          closedir (pdb_dir);
+
+          if (nfiles == 0)
+            {
+              fprintf (stderr, "%s: no .pdb files in directory %s\n",
+                       progname, molecule_str);
+              exit (1);
+            }
+        }
+      else
+        {
+          files = (char **) malloc (sizeof (*files));
+          nfiles = 1;
+          files[0] = strdup (molecule_str);
+          if (verbose_p)
+            fprintf (stderr, "%s: file %s\n", progname, molecule_str);
+        }
 
-      if ((wire || !do_atoms) &&
-          !do_labels &&
-          mc->molecules[i].nbonds == 0)
+      mc->nmolecules = nfiles;
+      mc->molecules = (molecule *) calloc (sizeof (molecule), mc->nmolecules);
+      for (i = 0; i < mc->nmolecules; i++)
         {
-          /* If we're not drawing atoms (e.g., wireframe mode), and
-             there is no bond info, then make sure labels are turned on,
-             or we'll be looking at a black screen... */
-          fprintf (stderr, "%s: no bonds: turning -label on.\n", progname);
-          do_labels = 1;
+          if (verbose_p)
+            fprintf (stderr, "%s: reading %s\n", progname, files[i]);
+          parse_pdb_file (&mc->molecules[i], files[i]);
+
+          if ((wire || !do_atoms) &&
+              !do_labels &&
+              mc->molecules[i].nbonds == 0)
+            {
+              /* If we're not drawing atoms (e.g., wireframe mode), and
+                 there is no bond info, then make sure labels are turned on,
+                 or we'll be looking at a black screen... */
+              fprintf (stderr, "%s: %s: no bonds: turning -label on.\n",
+                       progname, files[i]);
+              do_labels = 1;
+            }
+
+          free (files[i]);
+          files[i] = 0;
         }
+
+      free (files);
+      files = 0;
+    }
+
+  for (i = 0; i < mc->nmolecules; i++)
+    {
+      generate_molecule_formula (&mc->molecules[i]);
+      insert_vertical_whitespace ((char *) mc->molecules[i].label);
     }
 }
 
index 4903654fbf0472309a21206b23feca26221008b5..1b92b6b355c3eb335be4b0ed0916741eb9a3bb90 100644 (file)
@@ -107,11 +107,15 @@ This will be very fast.
 When using the built-in data set, change to a new molecule every
 this-many seconds.  Default is 20 seconds.
 .TP 8
-.B \-molecule \fIfilename\fP
+.B \-molecule \fIfile-or-directory\fP
 Instead of using the built-in molecules, read one from the given file.
 This file must be in PDB (Protein Data Base) format.  (Note that it's
 not uncommon for PDB files to contain only the atoms, with no (or
 little) information about the atomic bonds.)
+
+This can also be a directory, in which case, all of the .pdb files in
+that directory will be loaded.  A new one will be displayed at random
+every few seconds (as per the \fI\-timeout\fP option.)
 .PP
 When the molecule is too large (bigger than about 30 angstroms from
 side to side), the \fI\-label\fP option will be automatically turned
@@ -142,7 +146,7 @@ A good source of PDB files:
 http://www.sci.ouc.bc.ca/chem/molecule/molecule.html
 .EE
 .SH COPYRIGHT
-Copyright \(co 2001 by Jamie Zawinski.
+Copyright \(co 2001, 2004 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
diff --git a/hacks/glx/noof.c b/hacks/glx/noof.c
new file mode 100644 (file)
index 0000000..21ec792
--- /dev/null
@@ -0,0 +1,460 @@
+/* noof, Copyright (c) 2004 Mark Kilgard <mjk@nvidia.com>
+ *
+ * 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.
+ *
+ * Originally a demo included with GLUT;
+ * ported to raw GL and xscreensaver by jwz, 12-Feb-2004.
+ */
+
+#include <X11/Intrinsic.h>
+
+extern XtAppContext app;
+
+#define PROGCLASS      "Noof"
+#define HACK_INIT      init_noof
+#define HACK_DRAW      draw_noof
+#define HACK_RESHAPE   reshape_noof
+#define noof_opts      xlockmore_opts
+
+#define DEFAULTS       "*delay:        10000       \n" \
+                       "*showFPS:      False       \n" \
+                       "*fpsSolid:     True        \n" \
+
+#include "xlockmore.h"
+
+#ifdef USE_GL /* whole file */
+
+typedef struct {
+  GLXContext *glx_context;
+} noof_configuration;
+
+static noof_configuration *bps = NULL;
+ModeSpecOpt noof_opts = {0, NULL, 0, NULL, NULL};
+
+
+/* --- shape parameters def'n --- */
+#define N_SHAPES 7
+static float pos[N_SHAPES * 3];
+static float dir[N_SHAPES * 3];
+static float acc[N_SHAPES * 3];
+static float col[N_SHAPES * 3];
+static float hsv[N_SHAPES * 3];
+static float hpr[N_SHAPES * 3];
+static float ang[N_SHAPES];
+static float spn[N_SHAPES];
+static float sca[N_SHAPES];
+static float geep[N_SHAPES];
+static float peep[N_SHAPES];
+static float speedsq[N_SHAPES];
+static int blad[N_SHAPES];
+
+static float ht, wd;
+
+static void
+initshapes(int i)
+{
+  int k;
+  float f;
+
+  /* random init of pos, dir, color */
+  for (k = i * 3; k <= i * 3 + 2; k++) {
+    f = random() / 2147483647.0;
+    pos[k] = f;
+    f = random() / 2147483647.0;
+    f = (f - 0.5) * 0.05;
+    dir[k] = f;
+    f = random() / 2147483647.0;
+    f = (f - 0.5) * 0.0002;
+    acc[k] = f;
+    f = random() / 2147483647.0;
+    col[k] = f;
+  }
+
+  speedsq[i] = dir[i * 3] * dir[i * 3] + dir[i * 3 + 1] * dir[i * 3 + 1];
+  f = random() / 2147483647.0;
+  blad[i] = 2 + (int) (f * 17.0);
+  f = random() / 2147483647.0;
+  ang[i] = f;
+  f = random() / 2147483647.0;
+  spn[i] = (f - 0.5) * 40.0 / (10 + blad[i]);
+  f = random() / 2147483647.0;
+  sca[i] = (f * 0.1 + 0.08);
+  dir[i * 3] *= sca[i];
+  dir[i * 3 + 1] *= sca[i];
+
+  f = random() / 2147483647.0;
+  hsv[i * 3] = f * 360.0;
+
+  f = random() / 2147483647.0;
+  hsv[i * 3 + 1] = f * 0.6 + 0.4;
+
+  f = random() / 2147483647.0;
+  hsv[i * 3 + 2] = f * 0.7 + 0.3;
+
+  f = random() / 2147483647.0;
+  hpr[i * 3] = f * 0.005 * 360.0;
+  f = random() / 2147483647.0;
+  hpr[i * 3 + 1] = f * 0.03;
+  f = random() / 2147483647.0;
+  hpr[i * 3 + 2] = f * 0.02;
+
+  geep[i] = 0;
+  f = random() / 2147483647.0;
+  peep[i] = 0.01 + f * 0.2;
+}
+
+static int tko = 0;
+
+static float bladeratio[] =
+{
+  /* nblades = 2..7 */
+  0.0, 0.0, 3.00000, 1.73205, 1.00000, 0.72654, 0.57735, 0.48157,
+  /* 8..13 */
+  0.41421, 0.36397, 0.19076, 0.29363, 0.26795, 0.24648,
+  /* 14..19 */
+  0.22824, 0.21256, 0.19891, 0.18693, 0.17633, 0.16687,
+};
+
+static void
+drawleaf(int l)
+{
+
+  int b, blades;
+  float x, y;
+  float wobble;
+
+  blades = blad[l];
+
+  y = 0.10 * sin(geep[l] * M_PI / 180.0) + 0.099 * sin(geep[l] * 5.12 * M_PI / 180.0);
+  if (y < 0)
+    y = -y;
+  x = 0.15 * cos(geep[l] * M_PI / 180.0) + 0.149 * cos(geep[l] * 5.12 * M_PI / 180.0);
+  if (x < 0.0)
+    x = 0.0 - x;
+  if (y < 0.001 && x > 0.000002 && ((tko & 0x1) == 0)) {
+    initshapes(l);      /* let it become reborn as something
+                           else */
+    tko++;
+    return;
+  } {
+    float w1 = sin(geep[l] * 15.3 * M_PI / 180.0);
+    wobble = 3.0 + 2.00 * sin(geep[l] * 0.4 * M_PI / 180.0) + 3.94261 * w1;
+  }
+
+  /**
+  if(blades == 2) if (y > 3.000*x) y = x*3.000;
+  if(blades == 3) if (y > 1.732*x) y = x*1.732;
+  if(blades == 4) if (y >       x) y = x;
+  if(blades == 5) if (y > 0.726*x) y = x*0.726;
+  if(blades == 6) if (y > 0.577*x) y = x*0.577;
+  if(blades == 7) if (y > 0.481*x) y = x*0.481;
+  if(blades == 8) if (y > 0.414*x) y = x*0.414;
+  */
+  if (y > x * bladeratio[blades])
+    y = x * bladeratio[blades];
+
+  for (b = 0; b < blades; b++) {
+    glPushMatrix();
+    glTranslatef(pos[l * 3], pos[l * 3 + 1], pos[l * 3 + 2]);
+    glRotatef(ang[l] + b * (360.0 / blades), 0.0, 0.0, 1.0);
+    glScalef(wobble * sca[l], wobble * sca[l], wobble * sca[l]);
+    /**
+    if(tko & 0x40000) glColor3f(col[l*3], col[l*3+1], col[l*3+2]); 
+    else
+    */
+    glColor4ub(0, 0, 0, 0x60);
+
+    /* constrain geep cooridinates here XXX */
+    glEnable(GL_BLEND);
+
+    glBegin(GL_TRIANGLE_STRIP);
+    glVertex2f(x * sca[l], 0.0);
+    glVertex2f(x, y);
+    glVertex2f(x, -y);  /* C */
+    glVertex2f(0.3, 0.0);  /* D */
+    glEnd();
+
+    /**
+    if(tko++ & 0x40000) glColor3f(0,0,0);
+    else
+    */
+    glColor3f(col[l * 3], col[l * 3 + 1], col[l * 3 + 2]);
+    glBegin(GL_LINE_LOOP);
+    glVertex2f(x * sca[l], 0.0);
+    glVertex2f(x, y);
+    glVertex2f(0.3, 0.0);  /* D */
+    glVertex2f(x, -y);  /* C */
+    glEnd();
+    glDisable(GL_BLEND);
+
+    glPopMatrix();
+  }
+}
+
+static void
+motionUpdate(int t)
+{
+  if (pos[t * 3] < -sca[t] * wd && dir[t * 3] < 0.0) {
+    dir[t * 3] = -dir[t * 3];
+  /**
+  acc[t*3+1] += 0.8*acc[t*3];
+  acc[t*3] = -0.8*acc[t*3];
+  */
+  } else if (pos[t * 3] > (1 + sca[t]) * wd && dir[t * 3] > 0.0) {
+    dir[t * 3] = -dir[t * 3];
+    /**
+    acc[t*3+1] += 0.8*acc[t*3];
+    acc[t*3] = -0.8*acc[t*3];
+    */
+  } else if (pos[t * 3 + 1] < -sca[t] * ht && dir[t * 3 + 1] < 0.0) {
+    dir[t * 3 + 1] = -dir[t * 3 + 1];
+    /**
+    acc[t*3] += 0.8*acc[t*3+1];
+    acc[t*3+1] = -0.8*acc[t*3+1];
+    */
+  } else if (pos[t * 3 + 1] > (1 + sca[t]) * ht && dir[t * 3 + 1] > 0.0) {
+    dir[t * 3 + 1] = -dir[t * 3 + 1];
+    /**
+    acc[t*3] += 0.8*acc[t*3+1];
+    acc[t*3+1] = -0.8*acc[t*3+1];
+    */
+  }
+
+  pos[t * 3] += dir[t * 3];
+  pos[t * 3 + 1] += dir[t * 3 + 1];
+  /**
+  dir[t*3]   += acc[t*3];
+  dir[t*3+1] += acc[t*3+1];
+  */
+  ang[t] += spn[t];
+  geep[t] += peep[t];
+  if (geep[t] > 360 * 5.0)
+    geep[t] -= 360 * 5.0;
+  if (ang[t] < 0.0) {
+    ang[t] += 360.0;
+  }
+  if (ang[t] > 360.0) {
+    ang[t] -= 360.0;
+  }
+}
+
+static void
+colorUpdate(int i)
+{
+  if (hsv[i * 3 + 1] <= 0.5 && hpr[i * 3 + 1] < 0.0)
+    hpr[i * 3 + 1] = -hpr[i * 3 + 1];  /* adjust s */
+  if (hsv[i * 3 + 1] >= 1.0 && hpr[i * 3 + 1] > 0.0)
+    hpr[i * 3 + 1] = -hpr[i * 3 + 1];  /* adjust s */
+  if (hsv[i * 3 + 2] <= 0.4 && hpr[i * 3 + 2] < 0.0)
+    hpr[i * 3 + 2] = -hpr[i * 3 + 2];  /* adjust s */
+  if (hsv[i * 3 + 2] >= 1.0 && hpr[i * 3 + 2] > 0.0)
+    hpr[i * 3 + 2] = -hpr[i * 3 + 2];  /* adjust s */
+
+  hsv[i * 3] += hpr[i * 3];
+  hsv[i * 3 + 1] += hpr[i * 3 + 1];
+  hsv[i * 3 + 2] += hpr[i * 3 + 2];
+
+  /* --- hsv -> rgb --- */
+#define H(hhh) hhh[i*3  ]
+#define S(hhh) hhh[i*3+1]
+#define V(hhh) hhh[i*3+2]
+
+#define R(hhh) hhh[i*3  ]
+#define G(hhh) hhh[i*3+1]
+#define B(hhh) hhh[i*3+2]
+
+  if (V(hsv) < 0.0)
+    V(hsv) = 0.0;
+  if (V(hsv) > 1.0)
+    V(hsv) = 1.0;
+  if (S(hsv) <= 0.0) {
+    R(col) = V(hsv);
+    G(col) = V(hsv);
+    B(col) = V(hsv);
+  } else {
+    float f, h, p, q, t, v;
+    int hi;
+
+    while (H(hsv) < 0.0)
+      H(hsv) += 360.0;
+    while (H(hsv) >= 360.0)
+      H(hsv) -= 360.0;
+
+    if (S(hsv) < 0.0)
+      S(hsv) = 0.0;
+    if (S(hsv) > 1.0)
+      S(hsv) = 1.0;
+
+    h = H(hsv) / 60.0;
+    hi = (int) (h);
+    f = h - hi;
+    v = V(hsv);
+    p = V(hsv) * (1 - S(hsv));
+    q = V(hsv) * (1 - S(hsv) * f);
+    t = V(hsv) * (1 - S(hsv) * (1 - f));
+
+    if (hi <= 0) {
+      R(col) = v;
+      G(col) = t;
+      B(col) = p;
+    } else if (hi == 1) {
+      R(col) = q;
+      G(col) = v;
+      B(col) = p;
+    } else if (hi == 2) {
+      R(col) = p;
+      G(col) = v;
+      B(col) = t;
+    } else if (hi == 3) {
+      R(col) = p;
+      G(col) = q;
+      B(col) = v;
+    } else if (hi == 4) {
+      R(col) = t;
+      G(col) = p;
+      B(col) = v;
+    } else {
+      R(col) = v;
+      G(col) = p;
+      B(col) = q;
+    }
+  }
+}
+
+static void
+gravity(float fx)
+{
+  int a, b;
+
+  for (a = 0; a < N_SHAPES; a++) {
+    for (b = 0; b < a; b++) {
+      float t, d2;
+
+      t = pos[b * 3] - pos[a * 3];
+      d2 = t * t;
+      t = pos[b * 3 + 1] - pos[a * 3 + 1];
+      d2 += t * t;
+      if (d2 < 0.000001)
+        d2 = 0.00001;
+      if (d2 < 0.1) {
+
+        float v0, v1, z;
+        v0 = pos[b * 3] - pos[a * 3];
+        v1 = pos[b * 3 + 1] - pos[a * 3 + 1];
+
+        z = 0.00000001 * fx / (d2);
+
+        dir[a * 3] += v0 * z * sca[b];
+        dir[b * 3] += -v0 * z * sca[a];
+        dir[a * 3 + 1] += v1 * z * sca[b];
+        dir[b * 3 + 1] += -v1 * z * sca[a];
+
+      }
+    }
+    /** apply brakes
+    if(dir[a*3]*dir[a*3] + dir[a*3+1]*dir[a*3+1]
+      > 0.0001) {
+      dir[a*3] *= 0.9;
+      dir[a*3+1] *= 0.9;
+    }
+    */
+  }
+}
+
+void
+draw_noof (ModeInfo *mi)
+{
+  int i;
+
+  /**
+  if((random() & 0xff) == 0x34){
+    glClear(GL_COLOR_BUFFER_BIT);
+  }
+
+  if((tko & 0x1f) == 0x1f){
+    glEnable(GL_BLEND);
+    glColor4f(0.0, 0.0, 0.0, 0.09);
+    glRectf(0.0, 0.0, wd, ht);
+    glDisable(GL_BLEND);
+#ifdef __sgi
+    sginap(0);
+#endif
+  }
+  */
+
+  gravity(-2.0);
+  for (i = 0; i < N_SHAPES; i++) {
+    motionUpdate(i);
+    colorUpdate(i);
+    drawleaf(i);
+  }
+
+  if (mi->fps_p) do_fps (mi);
+  glFinish();
+
+  glXSwapBuffers(MI_DISPLAY(mi), MI_WINDOW(mi));
+}
+
+
+void
+reshape_noof(ModeInfo *mi, int w, int h)
+{
+  glViewport(0, 0, w, h);
+  glMatrixMode(GL_PROJECTION);
+  glLoadIdentity();
+  if (w <= h) {
+    wd = 1.0;
+    ht = (GLfloat) h / (GLfloat) w;
+    glOrtho(0.0, 1.0,
+      0.0, 1.0 * (GLfloat) h / (GLfloat) w,
+      -16.0, 4.0);
+  } else {
+    wd = (GLfloat) w / (GLfloat) h;
+    ht = 1.0;
+    glOrtho(0.0, 1.0 * (GLfloat) w / (GLfloat) h,
+      0.0, 1.0,
+      -16.0, 4.0);
+  }
+  glMatrixMode(GL_MODELVIEW);
+  glLoadIdentity();
+
+  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+}
+
+void 
+init_noof (ModeInfo *mi)
+{
+  int i;
+  noof_configuration *bp;
+
+  if (!bps) {
+    bps = (noof_configuration *)
+      calloc (MI_NUM_SCREENS(mi), sizeof (noof_configuration));
+    if (!bps) {
+      fprintf(stderr, "%s: out of memory\n", progname);
+      exit(1);
+    }
+    bp = &bps[MI_SCREEN(mi)];
+  }
+
+  bp = &bps[MI_SCREEN(mi)];
+
+  bp->glx_context = init_GL(mi);
+
+  glClearColor(0.0, 0.0, 0.0, 1.0);
+  glEnable(GL_LINE_SMOOTH);
+  glShadeModel(GL_FLAT);
+  glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+  for (i = 0; i < N_SHAPES; i++)
+    initshapes(i);
+  reshape_noof (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+}
+
+
+#endif /* USE_GL */
diff --git a/hacks/glx/noof.man b/hacks/glx/noof.man
new file mode 100644 (file)
index 0000000..b3fd3ba
--- /dev/null
@@ -0,0 +1,49 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+noof - draw rotatey patterns
+.SH SYNOPSIS
+.B dangerball
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay \fInumber\fP]
+[\-fps]
+.SH DESCRIPTION
+Draws some rotatey patterns, using OpenGL.
+.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: 10000 (0.01 seconds.).
+.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 2004 by Mark Kilgard.  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
+Mark Kilgard <mjk@nvidia.com>
index e20266b573f182a69ef7f2c6770e5a3b5b75b0d0..881651de90e720798f8c5cf7e19d44a81d4c63ac 100644 (file)
@@ -100,11 +100,11 @@ static XrmOptionDescRec opts[] =
 };
 static argtype vars[] =
 {
-       {(caddr_t *) & factory, "factory", "Factory", DEF_FACTORY, t_Int},
-       {(caddr_t *) & fisheye, "fisheye", "Fisheye", DEF_FISHEYE, t_Bool},
-       {(caddr_t *) & tightturns, "tightturns", "Tightturns", DEF_TIGHTTURNS, t_Bool},
-       {(caddr_t *) & rotatepipes, "rotatepipes", "Rotatepipes", DEF_ROTATEPIPES, t_Bool},
-       {(caddr_t *) & dbuf_p, "doubleBuffer", "DoubleBuffer", DEF_DBUF, t_Bool}
+       {&factory, "factory", "Factory", DEF_FACTORY, t_Int},
+       {&fisheye, "fisheye", "Fisheye", DEF_FISHEYE, t_Bool},
+       {&tightturns, "tightturns", "Tightturns", DEF_TIGHTTURNS, t_Bool},
+       {&rotatepipes, "rotatepipes", "Rotatepipes", DEF_ROTATEPIPES, t_Bool},
+       {&dbuf_p, "doubleBuffer", "DoubleBuffer", DEF_DBUF, t_Bool}
 };
 static OptionStruct desc[] =
 {
index f4535670bf7250c0d1ebd70326b1b07da55a8fd4..b3f0cf41fd79d1b9fc64c27ba9c78154ae85a848 100644 (file)
@@ -157,17 +157,17 @@ static XrmOptionDescRec opts[] = {
 
 
 static argtype vars[] = {
-  {(caddr_t *) &num_quads, "quads", "Quads", DEF_NUM_QUADS, t_Int},
-  {(caddr_t *) &do_light,    "light",   "Light",   DEF_LIGHT,   t_Bool},
-  {(caddr_t *) &do_wire,    "wire",   "Wire",   DEF_WIRE,   t_Bool},
-  {(caddr_t *) &do_blend,    "blend",   "Blend",   DEF_BLEND,   t_Bool},
-  {(caddr_t *) &do_fog,    "fog",   "Fog",   DEF_FOG,   t_Bool},
-  {(caddr_t *) &do_antialias,    "antialias",   "Antialias",   DEF_ANTIALIAS,   t_Bool},
-  {(caddr_t *) &do_texture,    "texture",   "Texture",   DEF_TEXTURE,   t_Bool},
-  {(caddr_t *) &do_texture_quality,    "texture_quality",   "Texture_quality",   DEF_TEXTURE_QUALITY,   t_Bool},
-  {(caddr_t *) &do_mipmap,    "mipmap",   "Mipmap",   DEF_MIPMAP,   t_Bool},
-  {(caddr_t *) &do_depth,    "doDepth",   "DoDepth",   DEF_DO_DEPTH,   t_Bool},
-  {(caddr_t *) &which_image, "image",   "Image",   DEF_IMAGE,   t_String},
+  {&num_quads,    "quads",     "Quads",     DEF_NUM_QUADS, t_Int},
+  {&do_light,     "light",     "Light",     DEF_LIGHT,     t_Bool},
+  {&do_wire,      "wire",      "Wire",      DEF_WIRE,      t_Bool},
+  {&do_blend,     "blend",     "Blend",     DEF_BLEND,     t_Bool},
+  {&do_fog,       "fog",       "Fog",       DEF_FOG,       t_Bool},
+  {&do_antialias, "antialias", "Antialias", DEF_ANTIALIAS, t_Bool},
+  {&do_texture,   "texture",   "Texture",   DEF_TEXTURE,   t_Bool},
+  {&do_texture_quality, "texture_quality", "Texture_quality", DEF_TEXTURE_QUALITY,   t_Bool},
+  {&do_mipmap,    "mipmap",    "Mipmap",    DEF_MIPMAP,    t_Bool},
+  {&do_depth,    "doDepth",    "DoDepth",   DEF_DO_DEPTH,  t_Bool},
+  {&which_image, "image",      "Image",     DEF_IMAGE,     t_String},
 };
 
 
index 7862ea725e4921f75a7b8cb5ce499f340f6d91ae..0c893af7ee452b435c0c21533334f3aa95157acb 100644 (file)
@@ -6,7 +6,7 @@
  *
  * version 1.0 - May 10, 2002
  *
- * Copyright (C) 2002 Blair Tennessy (tennessb@unbc.ca)
+ * Copyright (C) 2002 Blair Tennessy (tennessy@cs.ubc.ca)
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
  * documentation for any purpose is hereby granted without fee, provided that
 static XrmOptionDescRec opts[] = {
   {"+rotate", ".queens.rotate", XrmoptionNoArg, (caddr_t) "false" },
   {"-rotate", ".queens.rotate", XrmoptionNoArg, (caddr_t) "true" },
-/*   {"-white", ".queens.white", XrmoptionSepArg, (cadd_t) NULL }, */
-/*   {"-black", ".queens.white", XrmoptionSepArg, (cadd_t) NULL }, */
+  {"+flat", ".queens.flat", XrmoptionNoArg, (caddr_t) "false" },
+  {"-flat", ".queens.flat", XrmoptionNoArg, (caddr_t) "true" },
 };
 
-int rotate, wire, clearbits;
+int rotate, wire, clearbits, flat;
 
 static argtype vars[] = {
-  {(caddr_t *) &rotate, "rotate", "Rotate", "True", t_Bool},
+  {&rotate, "rotate", "Rotate", "True",  t_Bool},
+  {&flat,   "flat",   "Flat",   "False", t_Bool},
 };
 
 ModeSpecOpt queens_opts = {countof(opts), opts, countof(vars), vars, NULL};
@@ -106,6 +107,7 @@ GLfloat colors[COLORSETS][2][3] =
 
 int board[MAXBOARD][MAXBOARD];
 int steps = 0, colorset = 0, BOARDSIZE = 8; /* 8 cuz its classic */
+double theta = 0.0;
 
 Bool
 queens_handle_event (ModeInfo *mi, XEvent *event)
@@ -210,13 +212,11 @@ int findSolution(int row, int col) {
 void go(void) { while(!findSolution(0, random()%BOARDSIZE)); }
 
 /* lighting variables */
-GLfloat front_shininess[] = {80.0};
-GLfloat front_specular[] = {0.5, 0.5, 0.5, 1.0};
-GLfloat ambient[] = {0.5, 0.5, 0.5, 1.0};
-GLfloat ambient2[] = {0.1, 0.1, 0.1, 1.0};
-GLfloat diffuse[] = {0.7, 0.7, 0.7, 1.0};
-GLfloat position0[] = {0.0, 7.0, 0.0, 1.0};
-GLfloat position1[] = {8.0, 7.0, 8.0, 1.0};
+GLfloat front_shininess[] = {60.0};
+GLfloat front_specular[] = {0.4, 0.4, 0.4, 1.0};
+GLfloat ambient[] = {0.3, 0.3, 0.3, 1.0};
+GLfloat diffuse[] = {0.8, 0.8, 0.8, 1.0};
+GLfloat position[] = { 0.0, 5.0, 5.0, 1.0 };
 GLfloat lmodel_ambient[] = {0.6, 0.6, 0.6, 1.0};
 GLfloat lmodel_twoside[] = {GL_TRUE};
 
@@ -224,15 +224,11 @@ GLfloat lmodel_twoside[] = {GL_TRUE};
 void setup_lights(void) {
 
   /* setup twoside lighting */
-  glLightfv(GL_LIGHT0, GL_AMBIENT, ambient2);
+  glLightfv(GL_LIGHT0, GL_AMBIENT, ambient);
   glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse);
-  glLightfv(GL_LIGHT0, GL_POSITION, position0);
-  glLightfv(GL_LIGHT1, GL_AMBIENT, ambient2);
-  glLightfv(GL_LIGHT1, GL_DIFFUSE, diffuse);
-  glLightfv(GL_LIGHT1, GL_POSITION, position1);
+  glLightfv(GL_LIGHT0, GL_POSITION, position);
   glEnable(GL_LIGHTING);
   glEnable(GL_LIGHT0);
-  glEnable(GL_LIGHT1);
 
   /* setup material properties */
   glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, front_shininess);
@@ -241,9 +237,13 @@ void setup_lights(void) {
   glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
 }
 
+#define    checkImageWidth 8
+#define    checkImageHeight 8
+GLubyte checkImage[checkImageWidth][checkImageHeight][3];
+
 /* return alpha value for fading */
 GLfloat findAlpha(void) {
-  return steps < 128 ? steps/128.0 : steps < 512-128 ? 1.0 : (512-steps)/128.0;
+  return steps < 128 ? steps/128.0 : steps < 1024-128 ?1.0:(1024-steps)/128.0;
 }
 
 /* draw pieces */
@@ -253,7 +253,7 @@ void drawPieces(void) {
   for(i = 0; i < BOARDSIZE; ++i) {
     for(j = 0; j < BOARDSIZE; ++j) {
       if(board[i][j]) {
-       glColor3fv(colors[colorset][i%2]);      
+       glColor3fv(colors[colorset][i%2]);
        glCallList(QUEEN);
       }
       
@@ -296,15 +296,13 @@ void draw_reflections(void) {
   glPushMatrix(); 
   glScalef(1.0, -1.0, 1.0);
   glTranslatef(0.5, 0.001, 0.5);
-  glLightfv(GL_LIGHT0, GL_POSITION, position0);
-  glLightfv(GL_LIGHT1, GL_POSITION, position1);
+  glLightfv(GL_LIGHT0, GL_POSITION, position);
   drawPieces();
   glPopMatrix();
   glDisable(GL_STENCIL_TEST);
 
   /* replace lights */
-  glLightfv(GL_LIGHT0, GL_POSITION, position0);
-  glLightfv(GL_LIGHT1, GL_POSITION, position1);
+  glLightfv(GL_LIGHT0, GL_POSITION, position);
 
   glEnable(GL_CULL_FACE);
   glCullFace(GL_BACK);
@@ -323,7 +321,7 @@ void drawBoard(void) {
       glColor4f(colors[colorset][par][0],
                colors[colorset][par][1],
                colors[colorset][par][2],
-               0.60);
+               0.70);
       glNormal3f(0.0, 1.0, 0.0);
       glVertex3f(i, 0.0, j + 1.0);
       glVertex3f(i + 1.0, 0.0, j + 1.0);
@@ -334,38 +332,45 @@ void drawBoard(void) {
   glEnd();
 }
 
-double theta = 0.0;
-
 void display(Queenscreen *c) {
   glClear(clearbits);
   
   glMatrixMode(GL_MODELVIEW);
   glLoadIdentity();
 
-  glEnable(GL_LIGHTING);
+  /* setup light attenuation */
   glEnable(GL_COLOR_MATERIAL);
-  glLightfv(GL_LIGHT0, GL_POSITION, position0);
-  glLightfv(GL_LIGHT1, GL_POSITION, position1);
-  glLightf(GL_LIGHT0, GL_CONSTANT_ATTENUATION, 1.0/(0.01+findAlpha()));
-  glLightf(GL_LIGHT1, GL_CONSTANT_ATTENUATION, 1.0/(0.01+findAlpha()));
+  glLightf(GL_LIGHT0, GL_CONSTANT_ATTENUATION, 0.8/(0.01+findAlpha()));
+  glLightf(GL_LIGHT0, GL_LINEAR_ATTENUATION, 0.06);
 
-  /** setup perspectif */
+  /** setup perspective */
   glTranslatef(0.0, 0.0, -1.5*BOARDSIZE);
   glRotatef(30.0, 1.0, 0.0, 0.0);
   gltrackball_rotate (c->trackball);
   glRotatef(theta*100, 0.0, 1.0, 0.0);
   glTranslatef(-0.5*BOARDSIZE, 0.0, -0.5*BOARDSIZE);
 
+  /* find light positions */
+  position[0] = BOARDSIZE/2.0 + BOARDSIZE/1.4*-sin(theta*100*M_PI/180.0);
+  position[2] = BOARDSIZE/2.0 + BOARDSIZE/1.4*cos(theta*100*M_PI/180.0);
+  position[1] = 6.0;
+
+  if(!wire) {
+    glEnable(GL_LIGHTING);
+    glLightfv(GL_LIGHT0, GL_POSITION, position);
+    glEnable(GL_LIGHT0);
+  }
+
   /* draw reflections */
-  draw_reflections();
-  glEnable(GL_BLEND);
+  if(!wire) {
+    draw_reflections();
+    glEnable(GL_BLEND);
+  }
   drawBoard();
-  glDisable(GL_BLEND);
+  if(!wire)
+    glDisable(GL_BLEND);
 
-  position1[0] = BOARDSIZE+2.0;
-  position1[2] = BOARDSIZE+2.0;
-  glLightfv(GL_LIGHT0, GL_POSITION, position0);
-  glLightfv(GL_LIGHT1, GL_POSITION, position1);
+  glLightf(GL_LIGHT0, GL_LINEAR_ATTENUATION, 0.1);
 
   glTranslatef(0.5, 0.0, 0.5);
   drawPieces();
@@ -375,7 +380,7 @@ void display(Queenscreen *c) {
     theta += .002;
 
   /* zero out board, find new solution of size MINBOARD <= i <= MAXBOARD */
-  if(++steps == 512) {
+  if(++steps == 1024) {
     steps = 0;
     blank();
     BOARDSIZE = MINBOARD + (random() % (MAXBOARD - MINBOARD + 1));
@@ -453,6 +458,9 @@ void init_queens(ModeInfo *mi) {
   glNewList(QUEEN, GL_COMPILE);
   draw_model(schunks, spidermodel, 24);
   glEndList();
+
+  if(flat)
+    glShadeModel(GL_FLAT);
   
   clearbits = GL_COLOR_BUFFER_BIT;
 
index 034122c5ae9de26bd54ed666e7265f86b829a631..1f2be0abee1884f97c1e912d5b78c3f8adada387 100644 (file)
@@ -152,10 +152,10 @@ static XrmOptionDescRec opts[] =
 
 static argtype vars[] =
 {
-       {(caddr_t *) & sizex, (char *) "sizex", (char *) "SizeX", (char *) DEF_SIZEX, t_Int},
-       {(caddr_t *) & sizey, (char *) "sizey", (char *) "SizeY", (char *) DEF_SIZEY, t_Int},
-       {(caddr_t *) & sizez, (char *) "sizez", (char *) "SizeZ", (char *) DEF_SIZEZ, t_Int},
-       {(caddr_t *) & hideshuffling, (char *) "hideshuffling", (char *) "Hideshuffling", (char *) DEF_HIDESHUFFLING, t_Bool}
+       {&sizex, "sizex", "SizeX", DEF_SIZEX, t_Int},
+       {&sizey, "sizey", "SizeY", DEF_SIZEY, t_Int},
+       {&sizez, "sizez", "SizeZ", DEF_SIZEZ, t_Int},
+       {&hideshuffling, "hideshuffling", "Hideshuffling", DEF_HIDESHUFFLING, t_Bool}
 };
 
 static OptionStruct desc[] =
index 25300483e1585eacab093e4c9fe87d0d0d2ff55f..93c24c5dd4a40491fc6a660f925d795f3144fdab 100644 (file)
@@ -115,9 +115,9 @@ static XrmOptionDescRec opts[] = {
 };
 
 static argtype vars[] = {
-    {(caddr_t *) & do_texture, (char *) "texture", (char *) "Texture", (char *) DEF_TEXTURE, t_Bool},
-    {(caddr_t *) & do_trackmouse, (char *) "trackmouse", (char *) "TrackMouse", (char *) DEF_TRACKMOUSE, t_Bool},
-    {(caddr_t *) & object, (char *) "object", (char *) "Object", (char *) DEF_OBJECT, t_Int},
+    {&do_texture,    "texture",    "Texture",    DEF_TEXTURE,    t_Bool},
+    {&do_trackmouse, "trackmouse", "TrackMouse", DEF_TRACKMOUSE, t_Bool},
+    {&object,        "object",     "Object",     DEF_OBJECT,     t_Int},
 
 };
 
index d3df8cdf1bf583b077072cbc05ecfc1564a76b68..b061bf23f47f910dff90167be11b7cfccb9ed574 100644 (file)
@@ -85,10 +85,10 @@ static XrmOptionDescRec opts[] = {
 };
 
 static argtype vars[] = {
-  {(caddr_t *) &do_spin,   "spin",   "Spin",   DEF_SPIN,   t_Bool},
-  {(caddr_t *) &do_wander, "wander", "Wander", DEF_WANDER, t_Bool},
-  {(caddr_t *) &speed,     "speed",  "Speed",  DEF_SPEED,  t_Int},
-  {(caddr_t *) &max_depth, "maxDepth", "MaxDepth", DEF_MAXDEPTH, t_Int},
+  {&do_spin,   "spin",     "Spin",     DEF_SPIN,     t_Bool},
+  {&do_wander, "wander",   "Wander",   DEF_WANDER,   t_Bool},
+  {&speed,     "speed",    "Speed",    DEF_SPEED,    t_Int},
+  {&max_depth, "maxDepth", "MaxDepth", DEF_MAXDEPTH, t_Int},
 };
 
 
index 8e45a4a4266cf3645f9900594e42724a0af2325f..efc4d46a2b806ab43bc56c617b700415c2d47703 100644 (file)
@@ -165,14 +165,14 @@ static XrmOptionDescRec opts[] = {
 };
 
 static argtype vars[] = {
-  {(caddr_t *) &do_spin,   "spin",   "Spin",   DEF_SPIN,   t_String},
-  {(caddr_t *) &do_wander, "wander", "Wander", DEF_WANDER, t_Bool},
-  {(caddr_t *) &res,       "resolution", "Resolution", DEF_RESOLUTION, t_Int},
-  {(caddr_t *) &duration,  "duration",   "Duration",   DEF_DURATION,   t_Int},
-  {(caddr_t *) &do_bbox,   "bbox",   "BBox",   DEF_BBOX,   t_Bool},
-  {(caddr_t *) &do_grid,   "grid",   "Grid",   DEF_GRID,   t_Bool},
-  {(caddr_t *) &smooth_p,  "smooth", "Smooth", DEF_SMOOTH, t_Bool},
-  {(caddr_t *) &static_parms, "parameters", "Parameters", DEF_PARMS, t_String},
+  {&do_spin,      "spin",       "Spin",       DEF_SPIN,       t_String},
+  {&do_wander,    "wander",     "Wander",     DEF_WANDER,     t_Bool},
+  {&res,          "resolution", "Resolution", DEF_RESOLUTION, t_Int},
+  {&duration,     "duration",   "Duration",   DEF_DURATION,   t_Int},
+  {&do_bbox,      "bbox",       "BBox",       DEF_BBOX,       t_Bool},
+  {&do_grid,      "grid",       "Grid",       DEF_GRID,       t_Bool},
+  {&smooth_p,     "smooth",     "Smooth",     DEF_SMOOTH,     t_Bool},
+  {&static_parms, "parameters", "Parameters", DEF_PARMS,      t_String},
 };
 
 ModeSpecOpt ccs_opts = {countof(opts), opts, countof(vars), vars, NULL};
index 5e41af2a7c8ab386ad8dfba8919fcf026b7258c0..55c6198226a309bc1b2d0b77571b4d5b7cb4b05e 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * starwars, Copyright (c) 1998-2001 Jamie Zawinski <jwz@jwz.org> and
+ * starwars, Copyright (c) 1998-2001, 2004 Jamie Zawinski <jwz@jwz.org> and
  * Claudio Matsuoka <claudio@helllabs.org>
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
@@ -162,17 +162,17 @@ static XrmOptionDescRec opts[] = {
 };
 
 static argtype vars[] = {
-  {(caddr_t *) &program,        "program", "Program", DEF_PROGRAM, t_String},
-  {(caddr_t *) &max_lines,      "lines",   "Integer", DEF_LINES,   t_Int},
-  {(caddr_t *) &scroll_steps,   "steps",   "Integer", DEF_STEPS,   t_Int},
-  {(caddr_t *) &star_spin,      "spin",    "Float",   DEF_SPIN,    t_Float},
-  {(caddr_t *) &font_size,      "fontSize","Float",   DEF_STEPS,   t_Float},
-  {(caddr_t *) &target_columns, "columns", "Integer", DEF_COLUMNS, t_Int},
-  {(caddr_t *) &wrap_p,         "lineWrap","Boolean", DEF_COLUMNS, t_Bool},
-  {(caddr_t *) &alignment_str,  "alignment","Alignment",DEF_ALIGN, t_String},
-  {(caddr_t *) &smooth_p,       "smooth",  "Boolean", DEF_SMOOTH,  t_Bool},
-  {(caddr_t *) &thick_p,        "thick",   "Boolean", DEF_THICK,   t_Bool},
-  {(caddr_t *) &fade_p,         "fade",    "Boolean", DEF_FADE,    t_Bool},
+  {&program,        "program",   "Program",    DEF_PROGRAM, t_String},
+  {&max_lines,      "lines",     "Integer",    DEF_LINES,   t_Int},
+  {&scroll_steps,   "steps",     "Integer",    DEF_STEPS,   t_Int},
+  {&star_spin,      "spin",      "Float",      DEF_SPIN,    t_Float},
+  {&font_size,      "fontSize",  "Float",      DEF_STEPS,   t_Float},
+  {&target_columns, "columns",   "Integer",    DEF_COLUMNS, t_Int},
+  {&wrap_p,         "lineWrap",  "Boolean",    DEF_COLUMNS, t_Bool},
+  {&alignment_str,  "alignment", "Alignment", DEF_ALIGN,    t_String},
+  {&smooth_p,       "smooth",    "Boolean",   DEF_SMOOTH,   t_Bool},
+  {&thick_p,        "thick",     "Boolean",   DEF_THICK,    t_Bool},
+  {&fade_p,         "fade",      "Boolean",   DEF_FADE,     t_Bool},
 };
 
 ModeSpecOpt sws_opts = {countof(opts), opts, countof(vars), vars, NULL};
@@ -265,7 +265,7 @@ launch_text_generator (sws_configuration *sc)
     {
       oprogram = FORTUNE_PROGRAM;
 
-#ifdef __linux__
+#if defined(__linux__) && defined(HAVE_UNAME)
       {
         static int done_once = 0;
         if (!done_once)
@@ -295,7 +295,7 @@ launch_text_generator (sws_configuration *sc)
               }
           }
       }
-#endif /* __linux__ */
+#endif /* __linux__ && HAVE_UNAME */
 
 #ifdef __APPLE__   /* MacOS X + XDarwin */
       {
index f274741b5557ef854a0ef1f3ebd6eca5b5006667..022392c114e64bb7bd43e861b878aa7babb06f64 100644 (file)
@@ -111,7 +111,7 @@ static XrmOptionDescRec opts[] =
 };
 static argtype vars[] =
 {
-  {(caddr_t *) & spinspeed, "spinspeed", "Spinspeed", DEF_SPINSPEED, t_Float}
+  {&spinspeed, "spinspeed", "Spinspeed", DEF_SPINSPEED, t_Float}
 };
 static OptionStruct desc[] =
 {
index aec897d559de8a0e7fb4d6c3a05f2001fd41830e..1aedf93adb4fff71d50a591dc803a03c0b006b92 100644 (file)
@@ -60,8 +60,8 @@ static XrmOptionDescRec opts[] =
 };
 static argtype vars[] =
 {
-       {(caddr_t *) & decay, (char *) "decay", (char *) "Decay", (char *) DEF_DECAY, t_Bool},
-       {(caddr_t *) & trail, (char *) "trail", (char *) "Trail", (char *) DEF_TRAIL, t_Bool}
+       {&decay, "decay", "Decay", DEF_DECAY, t_Bool},
+       {&trail, "trail", "Trail", DEF_TRAIL, t_Bool}
 };
 static OptionStruct desc[] =
 {
index 71bbdc8e911f91a859f866fe3bda5ea96209a289..502c73dbeb2f04fa853f4bc4108be05ff62e0641 100644 (file)
@@ -121,17 +121,17 @@ static XrmOptionDescRec opts[] =
 };
 static argtype vars[] =
 {
-       {(caddr_t *) & martin, (char *) "martin", (char *) "Martin", (char *) DEF_MARTIN, t_Bool},
-       {(caddr_t *) & popcorn, (char *) "popcorn", (char *) "Popcorn", (char *) DEF_POPCORN, t_Bool},
-       {(caddr_t *) & ejk1, (char *) "ejk1", (char *) "EJK1", (char *) DEF_EJK1, t_Bool},
-       {(caddr_t *) & ejk2, (char *) "ejk2", (char *) "EJK2", (char *) DEF_EJK2, t_Bool},
-       {(caddr_t *) & ejk3, (char *) "ejk3", (char *) "EJK3", (char *) DEF_EJK3, t_Bool},
-       {(caddr_t *) & ejk4, (char *) "ejk4", (char *) "EJK4", (char *) DEF_EJK4, t_Bool},
-       {(caddr_t *) & ejk5, (char *) "ejk5", (char *) "EJK5", (char *) DEF_EJK5, t_Bool},
-       {(caddr_t *) & ejk6, (char *) "ejk6", (char *) "EJK6", (char *) DEF_EJK6, t_Bool},
-       {(caddr_t *) & rr, (char *) "rr", (char *) "RR", (char *) DEF_RR, t_Bool},
-       {(caddr_t *) & jong, (char *) "jong", (char *) "Jong", (char *) DEF_JONG, t_Bool},
-       {(caddr_t *) & sine, (char *) "sine", (char *) "Sine", (char *) DEF_SINE, t_Bool}
+       {&martin,  "martin",  "Martin",  DEF_MARTIN,  t_Bool},
+       {&popcorn, "popcorn", "Popcorn", DEF_POPCORN, t_Bool},
+       {&ejk1, "ejk1", "EJK1", DEF_EJK1, t_Bool},
+       {&ejk2, "ejk2", "EJK2", DEF_EJK2, t_Bool},
+       {&ejk3, "ejk3", "EJK3", DEF_EJK3, t_Bool},
+       {&ejk4, "ejk4", "EJK4", DEF_EJK4, t_Bool},
+       {&ejk5, "ejk5", "EJK5", DEF_EJK5, t_Bool},
+       {&ejk6, "ejk6", "EJK6", DEF_EJK6, t_Bool},
+       {&rr,   "rr",   "RR",   DEF_RR,   t_Bool},
+       {&jong, "jong", "Jong", DEF_JONG, t_Bool},
+       {&sine, "sine", "Sine", DEF_SINE, t_Bool}
 };
 static OptionStruct desc[] =
 {
index 34c2a2a5ded60fceb3fadf1a55e2c9d6e7cc920b..584d939518a01e82034020ff1d2fbd50a99b9aed 100644 (file)
@@ -228,8 +228,7 @@ init (struct hyper_state *hs)
     root = get_boolean_resource("root", "Boolean");
     XGetWindowAttributes (dpy, win, &wa);
     XSelectInput(dpy, win, root ? ExposureMask :
-                wa.your_event_mask | ExposureMask |
-                ButtonPressMask | StructureNotifyMask);
+                wa.your_event_mask | ExposureMask | ButtonPressMask);
 
     width = wa.width;
     height = wa.height;
index e1410742bfa10a27e79b3beda9dc0d7bde82024d..56c17293d4e4ba93e52b835c12fb81cae39cd35c 100644 (file)
@@ -174,8 +174,7 @@ init (struct hyper_state *hs)
     root = get_boolean_resource("root", "Boolean");
     XGetWindowAttributes (dpy, win, &wa);
     XSelectInput(dpy, win, root ? ExposureMask :
-                wa.your_event_mask | ExposureMask |
-                ButtonPressMask | StructureNotifyMask);
+                wa.your_event_mask | ExposureMask | ButtonPressMask);
     
     width = wa.width;
     height = wa.height;
index 8080ccb334b35ab485748b2950cef06aa37af662..bc58f372255c14bbb03f011fd8bd1a7c26e098a4 100644 (file)
@@ -146,16 +146,13 @@ static XrmOptionDescRec opts[] =
 };
 static argtype vars[] =
 {
-  {(caddr_t *) &pattern, (char *) "pattern",
+  {&pattern, "pattern", 
    (char *) "Pattern", (char *) DEF_PATTERN, t_String},
-  {(caddr_t *) &trail, (char *) "trail",
-   (char *) "Trail", (char *) DEF_TRAIL, t_Int},
+  {&trail, "trail", "Trail", DEF_TRAIL, t_Int},
 #ifdef UNI
-  {(caddr_t *) &uni, (char *) "uni",
-   (char *) "Uni", (char *) DEF_UNI, t_Bool},
+  {&uni, "uni", "Uni", DEF_UNI, t_Bool},
 #endif
-  {(caddr_t *) &solid, (char *) "solid",
-   (char *) "Solid", (char *) DEF_SOLID, t_Bool}
+  {&solid, "solid", "Solid", DEF_SOLID, t_Bool}
 };
 static OptionStruct desc[] =
 {
index bff47db3127f8157ef7de3ceb5e6f9e02ce4b1d6..dafcf1649982e66988cfc200b9a59059a52b17e7 100644 (file)
@@ -63,7 +63,7 @@ static XrmOptionDescRec opts[] =
 };
 static argtype vars[] =
 {
-       {(caddr_t *) & track_p, "mouse", "Mouse", DEF_MOUSE, t_Bool},
+       {&track_p, "mouse", "Mouse", DEF_MOUSE, t_Bool},
 };
 static OptionStruct desc[] =
 {
index 235ceab9b187840ddd40a666fe1db765feb4c984..2606f5b552d875d2de596a7f9d3bf9d0cf611220 100644 (file)
@@ -68,7 +68,7 @@ static XrmOptionDescRec opts[] =
 
 static argtype vars[] =
 {
-       {(caddr_t *) & additive, (char *) "additive", (char *) "Additive", (char *) DEF_ADDITIVE, t_Bool}
+       {&additive, "additive", "Additive", DEF_ADDITIVE, t_Bool}
 };
 
 static OptionStruct desc[] =
index f492ee44c4d92cf4224666e5d9591fd4b8125896..a30d3213b36c09384fcb4c7fcb5c339aaa2da6da 100644 (file)
@@ -114,7 +114,7 @@ static XrmOptionDescRec opts[] =
 
 static argtype vars[] =
 {
-       {(caddr_t *) & neighbors, (char *) "neighbors", (char *) "Neighbors", (char *) DEF_NEIGHBORS, t_Int}
+       {&neighbors, "neighbors", "Neighbors", DEF_NEIGHBORS, t_Int}
 };
 
 static OptionStruct desc[] =
index 32bb09f2df75da30d726bbd1662996bf88b4c2ae..9371b276cbd40c99c2d1b765b6be527fbd109d7f 100644 (file)
@@ -1659,8 +1659,7 @@ screenhack(Display *display, Window window)
       XWindowAttributes xgwa;
       XGetWindowAttributes (dpy, window, &xgwa);
       XSelectInput (dpy, win,
-                    xgwa.your_event_mask | ExposureMask |
-                    ButtonPressMask |StructureNotifyMask);
+                    xgwa.your_event_mask | ExposureMask | ButtonPressMask);
     }
   
   gc  = XCreateGC(dpy, win, 0, 0);
diff --git a/hacks/mismunch.c b/hacks/mismunch.c
new file mode 100644 (file)
index 0000000..0283f93
--- /dev/null
@@ -0,0 +1,361 @@
+/* mismunch.c
+ * Munch Errors
+ * Copyright (c) 2004 Steven Hazel <sah@thalassocracy.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.
+ *
+ * Based on munch.c
+ * A munching squares implementation for X
+ * Copyright 1997, Tim Showalter <tjs@andrew.cmu.edu>
+ *
+ * Some code stolen from / This is meant to work with
+ * xscreensaver, Copyright (c) 1992, 1995, 1996 Jamie Zawinski <jwz@jwz.org>
+ *
+ */
+
+#include <math.h>
+#include "screenhack.h"
+
+char *progclass = "Mismunch";
+
+char *defaults [] = {
+  ".background:       black",
+  ".foreground:       white",
+  "*delay:            2500",
+  "*simul:            5",
+  "*clear:            65",
+  "*xor:              True",
+  0
+};
+
+XrmOptionDescRec options [] = {
+  { "-delay",         ".delay",       XrmoptionSepArg,  0 },
+  { "-simul",         ".simul",       XrmoptionSepArg,  0 },
+  { "-clear",         ".clear",       XrmoptionSepArg, "true" },
+  { "-xor",           ".xor",         XrmoptionNoArg,  "true" },
+  { "-no-xor",        ".xor",         XrmoptionNoArg,  "false" },
+  { 0, 0, 0, 0 }
+};
+
+
+static GC gc;
+static int delay, simul, clear, xor;
+static int logminwidth, logmaxwidth;
+static int restart, window_width, window_height;
+
+typedef struct _muncher {
+  int width;
+  int atX, atY;
+  int kX, kT, kY;
+  int grav;
+  XColor fgc;
+  int yshadow, xshadow;
+  int x, y, t;
+  int doom;
+  int done;
+} muncher;
+
+
+/*
+ * dumb way to get # of digits in number.  Probably faster than actually
+ * doing a log and a division, maybe.
+ */
+static int dumb_log_2(int k) {
+  int r = -1;
+  while (k > 0) {
+    k >>= 1; r++;
+  }
+  return r;
+}
+
+
+void calc_logwidths (void) {
+  /* Choose a range of square sizes based on the window size.  We want
+     a power of 2 for the square width or the munch doesn't fill up.
+     Also, if a square doesn't fit inside an area 20% smaller than the
+     window, it's too big.  Mismunched squares that big make things
+     look too noisy. */
+
+  if (window_height < window_width) {
+    logmaxwidth = (int)dumb_log_2(window_height * 0.8);
+  } else {
+    logmaxwidth = (int)dumb_log_2(window_width * 0.8);
+  }
+
+  if (logmaxwidth < 2) {
+    logmaxwidth = 2;
+  }
+
+  /* we always want three sizes of squares */
+  logminwidth = logmaxwidth - 2;
+
+  if (logminwidth < 2) {
+    logminwidth = 2;
+  }
+}
+
+
+void mismunch_handle_events (Display *dpy) {
+  XEvent e;
+
+  while (XPending(dpy)) {
+    XNextEvent(dpy, &e);
+
+    switch (e.type) {
+      case ConfigureNotify:
+        if (e.xconfigure.width != window_width ||
+            e.xconfigure.height != window_height) {
+          window_width = e.xconfigure.width;
+          window_height = e.xconfigure.height;
+          calc_logwidths();
+          restart = 1;
+        }
+        break;
+
+      default:
+        screenhack_handle_event(dpy, &e);
+    }
+  }
+}
+
+
+static muncher *make_muncher (Display *dpy, Window w) {
+  int logwidth;
+  XWindowAttributes xgwa;
+  muncher *m = (muncher *) malloc(sizeof(muncher));
+
+  XGetWindowAttributes(dpy, w, &xgwa);
+
+  /* choose size -- power of two */
+  logwidth = (logminwidth +
+              (random() % (1 + logmaxwidth - logminwidth)));
+
+  m->width = 1 << logwidth;
+
+  /* draw at this location */
+  m->atX = (random() % (xgwa.width <= m->width ? 1
+                        : xgwa.width - m->width));
+  m->atY = (random() % (xgwa.height <= m->width ? 1
+                        : xgwa.width - m->width));
+
+  /* wrap-around by these values; no need to % as we end up doing that
+     later anyway */
+  m->kX = ((random() % 2)
+           ? (random() % m->width) : 0);
+  m->kT = ((random() % 2)
+           ? (random() % m->width) : 0);
+  m->kY = ((random() % 2)
+           ? (random() % m->width) : 0);
+
+  /* set the gravity of the munch, or rather, which direction we draw
+     stuff in. */
+  m->grav = random() % 2;
+
+  /* I like this color scheme better than random colors. */
+  switch (random() % 4) {
+    case 0:
+      m->fgc.red = random() % 65536;
+      m->fgc.blue = random() % 32768;
+      m->fgc.green = random() % 16384;
+      break;
+
+    case 1:
+      m->fgc.red = 0;
+      m->fgc.blue = random() % 65536;
+      m->fgc.green = random() % 16384;
+      break;
+
+    case 2:
+      m->fgc.red = random() % 8192;
+      m->fgc.blue = random() % 8192;
+      m->fgc.green = random() % 49152;
+      break;
+
+    case 3:
+      m->fgc.red = random() % 65536;
+      m->fgc.green = m->fgc.red;
+      m->fgc.blue = m->fgc.red;
+      break;
+  }
+
+  /* Sometimes draw a mostly-overlapping copy of the square.  This
+     generates all kinds of neat blocky graphics when drawing in xor
+     mode. */
+  if (random() % 4) {
+    m->xshadow = 0;
+    m->yshadow = 0;
+  } else {
+    m->xshadow = (random() % (m->width/3)) - (m->width/6);
+    m->yshadow = (random() % (m->width/3)) - (m->width/6);
+  }
+
+  /* Start with a random y value -- this sort of controls the type of
+     deformities seen in the squares. */
+  m->y = random() % 256;
+
+  m->t = 0;
+
+  /*
+    Doom each square to be aborted at some random point.
+    (When doom == (width - 1), the entire square will be drawn.)
+  */
+  m->doom = random() % m->width;
+
+  m->done = 0;
+
+  return m;
+}
+
+
+static void munch (Display *dpy, Window w, muncher *m) {
+  int drawX, drawY;
+  XWindowAttributes xgwa;
+  static Colormap cmap;
+
+  if (m->done) {
+    return;
+  }
+
+  XGetWindowAttributes(dpy, w, &xgwa);
+
+  if (!mono_p) {
+    /* XXX there are probably bugs with this. */
+    cmap = xgwa.colormap;
+
+    if (XAllocColor(dpy, cmap, &m->fgc)) {
+      XSetForeground(dpy, gc, m->fgc.pixel);
+    }
+  }
+
+  /* Finally draw this pass of the munching error. */
+
+  for(m->x = 0; m->x < m->width; m->x++) {
+    /* figure out the next point */
+
+    /*
+      The ordinary Munching Squares calculation is:
+      m->y = ((m->x ^ ((m->t + m->kT) % m->width)) + m->kY) % m->width;
+
+      We create some feedback by plugging in y in place of x, and
+      make a couple of values negative so that some parts of some
+      squares get drawn in the wrong place.
+    */
+    m->y = ((-m->y ^ ((-m->t + m->kT) % m->width)) + m->kY) % m->width;
+
+    drawX = ((m->x + m->kX) % m->width) + m->atX;
+    drawY = (m->grav ? m->y + m->atY : m->atY + m->width - 1 - m->y);
+
+    XDrawPoint(dpy, w, gc, drawX, drawY);
+    if ((m->xshadow != 0) || (m->yshadow != 0)) {
+      /* draw the corresponding shadow point */
+      XDrawPoint(dpy, w, gc, drawX + m->xshadow, drawY + m->yshadow);
+    }
+    /* XXX may want to change this to XDrawPoints,
+       but it's fast enough without it for the moment. */
+
+  }
+
+  /*
+    we've drawn one pass' worth of points.  let the server catch up or
+    this won't be interesting to watch at all.  we call this here in
+    the hopes of having one whole sequence of dots appear at the same
+    time (one for each value of x, surprisingly enough)
+  */
+  XSync(dpy, False);
+  mismunch_handle_events(dpy);
+
+  if (delay) usleep(delay);
+
+  m->t++;
+  if (m->t > m->doom) {
+    m->done = 1;
+    return;
+  }
+
+  return;
+}
+
+
+void screenhack (Display *dpy, Window w)
+{
+  XWindowAttributes xgwa;
+  Colormap cmap;
+  XGCValues gcv;
+  int n = 0;  /* number of squares before we have to clear */
+  muncher **munchers;
+  int i;
+
+  restart = 0;
+
+  /* get the dimensions of the window */
+  XGetWindowAttributes(dpy, w, &xgwa);
+
+  /* create the gc */
+  cmap = xgwa.colormap;
+  gcv.foreground= get_pixel_resource("foreground","Foreground",
+                                     dpy, cmap);
+  gcv.background= get_pixel_resource("background","Background",
+                                     dpy, cmap);
+
+  gc = XCreateGC(dpy, w, GCForeground|GCBackground, &gcv);
+
+  delay = get_integer_resource("delay", "Integer");
+  if (delay < 0) delay = 0;
+
+  simul = get_integer_resource("simul", "Integer");
+  if (simul < 1) simul = 1;
+
+  clear = get_integer_resource("clear", "Integer");
+  if (clear < 0) clear = 0;
+
+  xor = get_boolean_resource("xor", "Boolean");
+
+  window_width = xgwa.width;
+  window_height = xgwa.height;
+
+  calc_logwidths();
+
+  /* always draw xor on mono. */
+  if (mono_p || xor) {
+    XSetFunction(dpy, gc, GXxor);
+  }
+
+  munchers = (muncher **) calloc(simul, sizeof(muncher *));
+  for (i = 0; i < simul; i++) {
+    munchers[i] = make_muncher(dpy, w);
+  }
+
+  for(;;) {
+    for (i = 0; i < simul; i++) {
+      munch(dpy, w, munchers[i]);
+
+      if (munchers[i]->done) {
+        n++;
+
+        free(munchers[i]);
+        munchers[i] = make_muncher(dpy, w);
+
+        mismunch_handle_events(dpy);
+      }
+    }
+
+    if (restart || (clear && n >= clear)) {
+      for (i = 0; i < simul; i++) {
+        free(munchers[i]);
+        munchers[i] = make_muncher(dpy, w);
+      }
+
+      XClearWindow(dpy, w);
+      n = 0;
+      restart = 0;
+    }
+
+    XSync(dpy, False);
+  }
+}
diff --git a/hacks/mismunch.man b/hacks/mismunch.man
new file mode 100644 (file)
index 0000000..0de8ef9
--- /dev/null
@@ -0,0 +1,75 @@
+.TH XScreenSaver 1 "10-Feb-04" "X Version 11"
+.SH NAME
+mismunch - munches errors
+.SH SYNOPSIS
+.B mismunch
+[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP]
+[\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install]
+[\-visual \fIvisual\fP] [\-delay \fIusecs\fP] [\-xor] [\-noxor] 
+[\-clear \fInumber\fP] [\-simul \fInumber\fP]
+.SH DESCRIPTION
+The
+.I mismunch
+program is a creatively broken misimplementation of the classic
+munching squares graphics hack.
+.SH OPTIONS
+.I mismunch
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window.  This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-mono 
+If on a color display, pretend we're on a monochrome display.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use.  Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-delay \fIusecs\fP
+The delay between steps of the animation, in microseconds.  Default: 2500.
+.TP 8
+.B \-xor
+Use the XOR drawing function.  This is the default.
+.TP 8
+.B \-no\-xor
+Don't use the XOR drawing function.
+.TP 8
+.B \-clear \fInumber\fP
+Number of squares to misdraw before clearing the display.  Default: 65.
+.TP 8
+.B \-simul \fInumber\fP
+Number of squares to misdraw simultaneously.  Default: 5.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1),
+.BR munch (1)
+.SH COPYRIGHT
+Copyright \(co 2004 Steven Hazel.  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.
+
+Based on the munch screensaver Copyright \(co 1997, 
+Tim Showalter <tjs@andrew.cmu.edu>.
+.SH AUTHOR
+Steven Hazel <sah@thalassocracy.org>, 10-Feb-04
diff --git a/hacks/pacman.c b/hacks/pacman.c
new file mode 100644 (file)
index 0000000..43ca2cd
--- /dev/null
@@ -0,0 +1,864 @@
+/* -*- Mode: C; tab-width: 4 -*- */
+/* pacman --- Mr. Pacman and his ghost friends */
+
+#if !defined( lint ) && !defined( SABER )
+static const char sccsid[] = "@(#)pacman.c     5.00 2000/11/01 xlockmore";
+
+#endif
+
+/*-
+ * Copyright (c) 2002 by Edwin de Jong <mauddib@gmx.net>.
+ *
+ * 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.
+ *
+ * Revision History:
+ * 13-May-2002: Added -trackmouse feature thanks to code from 'maze.c'.  
+ *             splitted up code into several files.  Retouched AI code, cleaned
+ *             up code.
+ *  3-May-2002: Added AI to pacman and ghosts, slowed down ghosts.
+ * 26-Nov-2001: Random level generator added
+ * 01-Nov-2000: Allocation checks
+ * 04-Jun-1997: Compatible with xscreensaver
+ *
+ */
+
+/* TODO:
+   1. add "bonus" dots
+   2. make better ghost sprites (eyes, waving dress)
+   3. make a bit better pacman sprite (mouth should be larger)
+   4. think of a better level generation algorithm
+*/
+
+#ifdef STANDALONE
+#      define MODE_pacman
+#      define PROGCLASS "Pacman"
+#      define HACK_INIT init_pacman
+#      define HACK_DRAW draw_pacman
+#      define pacman_opts xlockmore_opts
+#      define DEFAULTS "*delay: 10000 \n" \
+                                       "*size: 0 \n" \
+                                       "*ncolors: 6 \n" \
+                                       "*trackmouse: False \n"
+#      define UNIFORM_COLORS
+#      define BRIGHT_COLORS
+#      include "xlockmore.h"           /* in xscreensaver distribution */
+#else /* STANDALONE */
+#      include "xlock.h"               /* in xlockmore distribution */
+#endif /* STANDALONE */
+
+#ifdef MODE_pacman
+
+#include "pacman.h"
+#include "pacman_ai.h"
+#include "pacman_level.h"
+
+#ifdef DISABLE_INTERACTIVE
+ModeSpecOpt pacman_opts = {
+       0, 
+       (XrmOptionDescRec *) NULL, 
+       0, 
+       (argtype *) NULL, 
+       (OptionStruct *) NULL
+};
+#else
+static XrmOptionDescRec opts[] =
+{
+       {(char *) "-trackmouse", (char *) ".pacman.trackmouse", XrmoptionNoArg,
+               (caddr_t) "on"},
+       {(char *) "+trackmouse", (char *) ".pacman.trackmouse", XrmoptionNoArg,
+               (caddr_t) "off"}
+};
+
+static argtype vars[] =
+{
+       {(caddr_t *) & trackmouse, (char *) "trackmouse", (char *) "TrackMouse",
+               (char *) DEF_TRACKMOUSE, t_Bool}
+};
+
+static OptionStruct desc[] =
+{
+       {(char *) "-/+trackmouse", (char *) "turn on/off the tracking of the "
+               "mouse"}
+};
+
+ModeSpecOpt pacman_opts =
+{sizeof opts / sizeof opts[0], opts, sizeof vars / sizeof vars[0], vars, desc};
+#endif
+
+#ifdef USE_MODULES
+ModStruct   pacman_description = { 
+       "pacman",               /* *cmdline_arg; */
+       "init_pacman",          /* *init_name; */
+       "draw_pacman",          /* *callback_name; */
+       "release_pacman",       /* *release_name; */
+       "refresh_pacman",       /* *refresh_name; */
+       "change_pacman",        /* *change_name; */
+       (char *) NULL,          /* *unused_name; */
+       &pacman_opts,           /* *msopts */
+       10000, 4, 1, 0, 64, 1.0, "", "Shows Pacman(tm)", 0, NULL
+};
+
+#endif
+static void
+free_pacman(Display *display, pacmangamestruct *pp)
+{
+       int         dir, mouth;
+
+       if (pp->ghosts != NULL) {
+               free(pp->ghosts);
+               pp->ghosts = (ghoststruct *) NULL;
+       }
+       if (pp->stippledGC != None) {
+               XFreeGC(display, pp->stippledGC);
+               pp->stippledGC = None;
+       }
+       if (pp->ghostPixmap != None) {
+               XFreePixmap(display, pp->ghostPixmap);
+               pp->ghostPixmap = None;
+       }
+       for (dir = 0; dir < 4; dir++)
+               for (mouth = 0; mouth < MAXMOUTH; mouth++)
+                       if (pp->pacmanPixmap[dir][mouth] != None) {
+                               XFreePixmap(display, 
+                                       pp->pacmanPixmap[dir][mouth]);
+                               pp->pacmanPixmap[dir][mouth] = None;
+                       }
+}
+
+/* Checks for death of any ghosts/pacman and updates.  It also makes a new
+   level if all ghosts are dead or all dots are eaten. */
+static void
+check_death(ModeInfo * mi, pacmangamestruct *pp)
+{
+       Display *display =      MI_DISPLAY(mi);
+       Window   window  =      MI_WINDOW(mi);
+       unsigned int    ghost;
+       int     alldead;
+
+       alldead = 1;
+       for (ghost = 0; ghost < pp->nghosts; ghost++) {
+               if (pp->ghosts[ghost].dead == True)
+                       continue;
+
+               if ((pp->ghosts[ghost].nextrow == NOWHERE &&
+                    pp->ghosts[ghost].nextcol == NOWHERE)) {
+                       alldead = 0;
+                       continue;
+               }
+
+               if (((pp->ghosts[ghost].nextrow == pp->pacman.nextrow) &&
+               (pp->ghosts[ghost].nextcol == pp->pacman.nextcol)) ||
+                   ((pp->ghosts[ghost].nextrow == pp->pacman.row) &&
+                    (pp->ghosts[ghost].nextcol == pp->pacman.col) &&
+                    (pp->ghosts[ghost].row == pp->pacman.nextrow) &&
+                    (pp->ghosts[ghost].col == pp->pacman.nextcol))) {
+                       pp->ghosts[ghost].dead = 1;
+                       XSetForeground(display, 
+                                            pp->stippledGC, 
+                                            MI_BLACK_PIXEL(mi));
+                       XFillRectangle(display, window, 
+                                           pp->stippledGC,
+                                           pp->ghosts[ghost].cf, 
+                                           pp->ghosts[ghost].rf, 
+                                           pp->spritexs, 
+                                           pp->spriteys);
+
+               } else
+                       alldead = 0;
+       }
+
+       if (alldead == 1 || pp->dotsleft == 0)
+               repopulate(mi);
+}
+
+/* Resets state of ghosts + pacman.  Creates a new level, draws that level. */
+static void
+repopulate(ModeInfo * mi)
+{
+       pacmangamestruct *pp = &pacmangames[MI_SCREEN(mi)];
+       unsigned int ghost;
+       int i = createnewlevel(mi);
+
+       MI_CLEARWINDOW(mi);
+       drawlevel(mi);
+
+       pp->gamestate = GHOST_DANGER;
+
+       pp->pacman.row = (LEVHEIGHT + JAILHEIGHT)/2 - i;
+       pp->pacman.col = (LEVWIDTH/2);
+       pp->pacman.nextrow = NOWHERE; 
+       pp->pacman.nextcol = NOWHERE;
+       pp->pacman.cf = NOWHERE;
+       pp->pacman.rf = NOWHERE;
+       pp->pacman.oldcf = NOWHERE;
+       pp->pacman.oldrf = NOWHERE;
+       pp->pacman.oldlx = NOWHERE;
+       pp->pacman.oldly = NOWHERE;
+       pp->pacman.aistate = ps_eating;
+       pp->pacman.cur_trace = 0;
+       pp->pacman.roundscore = 0;
+       pp->pacman.speed = 4;
+       pp->pacman.lastturn = 0;
+       pp->pacman.delta.x = 0;
+       pp->pacman.delta.y = 0;
+       pac_clear_trace(&(pp->pacman));
+
+       for (ghost = 0; ghost < pp->nghosts; ghost++) {
+               pp->ghosts[ghost].col = (LEVWIDTH/2);
+               pp->ghosts[ghost].row = (LEVHEIGHT/2);
+               pp->ghosts[ghost].nextcol = NOWHERE;
+               pp->ghosts[ghost].nextrow = NOWHERE;
+               pp->ghosts[ghost].dead = 0;
+               pp->ghosts[ghost].lastbox = START;
+               pp->ghosts[ghost].cf = NOWHERE;
+               pp->ghosts[ghost].rf = NOWHERE;
+               pp->ghosts[ghost].oldcf = NOWHERE;
+               pp->ghosts[ghost].oldrf = NOWHERE;
+               pp->ghosts[ghost].aistate = inbox;
+               pp->ghosts[ghost].timeleft = ghost * 50;
+               pp->ghosts[ghost].speed = 3;
+               pp->ghosts[ghost].delta.x = 0;
+               pp->ghosts[ghost].delta.y = 0;
+
+               ghost_update(pp, &(pp->ghosts[ghost]));
+       }
+       check_death(mi, pp);
+       pac_update(mi, pp, &(pp->pacman));
+}
+
+/* Sets the color to the color of a wall. */
+static void 
+setwallcolor(ModeInfo * mi) 
+{
+       Display    *display = MI_DISPLAY(mi);
+       pacmangamestruct *pp = &pacmangames[MI_SCREEN(mi)];
+
+       if (MI_NPIXELS(mi) > 2)
+               XSetForeground(display, pp->stippledGC, 
+                               MI_PIXEL(mi, BLUE));
+       else
+               XSetForeground(display, pp->stippledGC, 
+                               MI_WHITE_PIXEL(mi));
+}
+
+/* Sets the color to the color of a dot. */
+static void 
+setdotcolor(ModeInfo * mi) 
+{
+       Display    *display = MI_DISPLAY(mi);
+       pacmangamestruct *pp = &pacmangames[MI_SCREEN(mi)];
+
+       XSetForeground(display, pp->stippledGC, 
+                       MI_WHITE_PIXEL(mi));
+}
+
+/* Draws a block in the level at the specified x and y locations. */
+static void
+drawlevelblock(ModeInfo * mi, pacmangamestruct *pp, 
+               const unsigned x, const unsigned y)
+{
+       Display    *display = MI_DISPLAY(mi);
+       Window      window = MI_WINDOW(mi);
+       int dx = 0, dy = 0;
+
+       if (pp->xs % 2 == 1) dx = -1;
+       if (pp->ys % 2 == 1) dy = -1;
+
+       XSetFillStyle(display, pp->stippledGC, FillSolid);
+       XSetLineAttributes(display, pp->stippledGC, pp->wallwidth,
+                       LineSolid, CapRound, JoinMiter);
+
+       if (pp->xs < 2 || pp->ys < 2) {
+               switch(pp->level[y*LEVWIDTH + x]) {
+                       case ' ':
+                       case '=':
+                               break;
+                       case '.':
+                               setdotcolor(mi);
+                               (void)XDrawPoint(display, window,
+                                                pp->stippledGC,
+                                                x * pp->xs + pp->xb, 
+                                                y * pp->ys + pp->yb);
+                               break;
+                       default:
+                               setwallcolor(mi);
+                               (void)XDrawPoint(display, window,
+                                                pp->stippledGC,
+                                                x * pp->xs + pp->xb, 
+                                                y * pp->ys + pp->yb);
+               }
+
+               return;
+       }
+
+       switch (pp->level[y*LEVWIDTH + x]) {
+               case ' ':
+               case '=':
+                       break;
+
+               case '.':
+                       setdotcolor(mi);
+                       if (pp->xs < 8 || pp->ys < 8) {
+                               (void)XDrawPoint(display, window,
+                                                pp->stippledGC,
+                                                x * pp->xs + pp->xb +
+                                                pp->xs/2, 
+                                                y * pp->ys + pp->yb +
+                                                pp->ys/2);
+                               break;
+                       }
+
+                       (void)XDrawArc(display, window, pp->stippledGC,
+                               (pp->xs * x) + 
+                                       (pp->xs / 2) - 
+                                       (pp->xs > 32 ? (pp->xs / 16) : 1) +
+                                       pp->xb,
+                               (pp->ys * y) + 
+                                       (pp->ys / 2) -
+                                       (pp->ys > 32 ? (pp->ys / 16) : 1) +
+                                       pp->yb,
+                               (pp->xs > 32 ? (pp->xs / 32) : 1),
+                               (pp->ys > 32 ? (pp->ys / 32) : 1),
+                               0, 23040);
+                       break;
+
+               case '-':
+                       setwallcolor(mi);
+                       (void)XDrawLine(display, window, pp->stippledGC,
+                               (pp->xs * x) + pp->xb,
+                               (pp->ys * y) + (pp->ys / 2) + pp->yb,
+                               (pp->xs * (x + 1)) + pp->xb,
+                               (pp->ys * y) + (pp->ys / 2) + pp->yb);
+                       break;
+
+               case '|':
+                       setwallcolor(mi);
+                       (void)XDrawLine(display, window, pp->stippledGC,
+                               (pp->xs * x) + (pp->xs / 2) + pp->xb,
+                               (pp->ys * y) + pp->yb,
+                               (pp->xs * x) + (pp->xs / 2) + pp->xb,
+                               (pp->ys * (y + 1)) + pp->yb);
+                       break;
+
+               case '_':
+                       setwallcolor(mi);
+                       (void)XDrawArc(display, window, pp->stippledGC,
+                               (pp->xs * x) - (pp->ys / 2) + pp->xb + dx,
+                               (pp->ys * y) + (pp->ys / 2) + pp->yb,
+                               pp->xs, pp->ys,
+                               0*64, 90*64);
+                       break;
+
+               case ',':
+                       setwallcolor(mi);
+                       (void)XDrawArc(display, window, pp->stippledGC,
+                               (pp->xs * x) + (pp->ys / 2) + pp->xb,
+                               (pp->ys * y) + (pp->ys / 2) + pp->yb,
+                               pp->xs, pp->ys,
+                               90*64, 90*64);
+                       break;
+
+               case '`':
+                       setwallcolor(mi);
+                       (void)XDrawArc(display, window, pp->stippledGC,
+                               (pp->xs * x) + (pp->ys / 2) + pp->xb,
+                               (pp->ys * y) - (pp->ys / 2) + pp->yb + dy,
+                               pp->xs, pp->ys,
+                               180*64, 90*64);
+                       break;
+
+               case '\'':
+                       setwallcolor(mi);
+                       (void)XDrawArc(display, window, pp->stippledGC,
+                               (pp->xs * x) - (pp->ys / 2) + pp->xb + dx,
+                               (pp->ys * y) - (pp->ys / 2) + pp->yb + dy,
+                               pp->xs, pp->ys,
+                               270*64, 90*64);
+                       break;
+
+       }
+}
+
+/* Draws a complete level. */
+static void
+drawlevel(ModeInfo * mi)
+{ 
+       pacmangamestruct *pp = &pacmangames[MI_SCREEN(mi)];
+       unsigned int x, y;
+
+       for (y = 0; y < LEVHEIGHT; y++)
+               for (x = 0; x < LEVWIDTH; x++)
+                       drawlevelblock(mi, pp, x, y);
+}
+
+/* There is some overlap so it can be made more efficient */
+#define ERASE_IMAGE(d,w,g,x,y,xl,yl,xs,ys) \
+ if (yl<y) \
+  (y<(yl+ys))?XFillRectangle(d,w,g,xl,yl,xs,y-(yl)): \
+  XFillRectangle(d,w,g,xl,yl,xs,ys); \
+ else if (yl>y) \
+  (y>(yl-(ys)))?XFillRectangle(d,w,g,xl,y+ys,xs,yl-(y)): \
+  XFillRectangle(d,w,g,xl,yl,xs,ys); \
+ if (xl<x) \
+  (x<(xl+xs))?XFillRectangle(d,w,g,xl,yl,x-(xl),ys): \
+  XFillRectangle(d,w,g,xl,yl,xs,ys); \
+ else if (xl>x) \
+  (x>(xl-(xs)))?XFillRectangle(d,w,g,x+xs,yl,xl-(x),ys): \
+  XFillRectangle(d,w,g,xl,yl,xs,ys)
+
+
+/* Draws the pacman sprite, removing the previous location. */
+static void
+draw_pacman_sprite(ModeInfo * mi)
+{
+       Display *display = MI_DISPLAY(mi);
+       Window window  = MI_WINDOW(mi);
+       pacmangamestruct *pp = &pacmangames[MI_SCREEN(mi)];
+       unsigned int dir;
+
+       pp->pacman.cf = pp->pacman.col * pp->xs + pp->pacman.delta.x * 
+               pp->pacman.cfactor + pp->xb + pp->spritedx;
+       pp->pacman.rf = pp->pacman.row * pp->ys + pp->pacman.delta.y * 
+               pp->pacman.rfactor + pp->yb + pp->spritedy;
+
+       dir = (ABS(pp->pacman.cfactor) * (2 - pp->pacman.cfactor) +
+              ABS(pp->pacman.rfactor) * (1 + pp->pacman.rfactor)) % 4;
+
+       XSetForeground(display, pp->stippledGC, 
+                            MI_BLACK_PIXEL(mi));
+       if (pp->pacman.oldcf != NOWHERE && pp->pacman.oldrf != NOWHERE) {
+#ifdef FLASH
+               XFillRectangle(display, window, pp->stippledGC,
+                            pp->pacman.oldcf, pp->pacman.oldrf, 
+                            pp->spritexs, pp->spriteys);
+#else
+               ERASE_IMAGE(display, window, pp->stippledGC, 
+                           pp->pacman.cf,    pp->pacman.rf,
+                           pp->pacman.oldcf, pp->pacman.oldrf, 
+                           pp->spritexs, pp->spriteys);
+#endif
+       }
+
+       XSetTSOrigin(display, pp->stippledGC, 
+                          pp->pacman.cf, pp->pacman.rf);
+       if (MI_NPIXELS(mi) > 2)
+               XSetForeground(display, pp->stippledGC, 
+                                    MI_PIXEL(mi, YELLOW));
+       else
+               XSetForeground(display, pp->stippledGC, 
+                                    MI_WHITE_PIXEL(mi));
+
+       XSetStipple(display, pp->stippledGC,
+                   pp->pacmanPixmap[dir][pp->pacman.mouthstage]);
+#ifdef FLASH
+       XSetFillStyle(display, pp->stippledGC, FillStippled);
+#else
+       XSetFillStyle(display, pp->stippledGC, 
+                           FillOpaqueStippled);
+#endif
+       if (pp->xs < 2 || pp->ys < 2)
+               XDrawPoint(display, window, pp->stippledGC,
+                               pp->pacman.cf, pp->pacman.rf);
+       else
+               XFillRectangle(display, window, pp->stippledGC,
+                              pp->pacman.cf, pp->pacman.rf, 
+                              pp->spritexs, pp->spriteys);
+       pp->pacman.mouthstage += pp->pacman.mouthdirection;
+       if ((pp->pacman.mouthstage >= MAXMOUTH) ||
+           (pp->pacman.mouthstage < 0)) {
+               pp->pacman.mouthdirection *= -1;
+               pp->pacman.mouthstage += pp->pacman.mouthdirection * 2;
+       }
+       pp->pacman.oldcf = pp->pacman.cf;
+       pp->pacman.oldrf = pp->pacman.rf;
+}
+
+/* Draws a ghost sprite, removing the previous sprite and restores the level. */
+static void
+draw_ghost_sprite(ModeInfo * mi, const unsigned ghost) {
+       Display    *display = MI_DISPLAY(mi);
+       Window      window = MI_WINDOW(mi);
+       pacmangamestruct *pp = &pacmangames[MI_SCREEN(mi)];
+
+       pp->ghosts[ghost].cf = 
+               pp->ghosts[ghost].col * pp->xs + pp->ghosts[ghost].delta.x * 
+               pp->ghosts[ghost].cfactor + pp->xb + pp->spritedx;
+       pp->ghosts[ghost].rf = 
+               pp->ghosts[ghost].row * pp->ys + pp->ghosts[ghost].delta.y * 
+               pp->ghosts[ghost].rfactor + pp->yb + pp->spritedy;
+       
+       XSetForeground(display, 
+                            pp->stippledGC, 
+                            MI_BLACK_PIXEL(mi));
+
+       if (pp->ghosts[ghost].oldcf != NOWHERE ||
+               pp->ghosts[ghost].oldrf != NOWHERE) {
+#ifdef FLASH
+               XFillRectangle(display, window, 
+                                   pp->stippledGC, pp->ghosts[ghost].oldcf, 
+                                   pp->ghosts[ghost].oldrf, 
+                                   pp->spritexs, pp->spriteys);
+#else
+               ERASE_IMAGE(display, window, pp->stippledGC,
+                       pp->ghosts[ghost].cf, pp->ghosts[ghost].rf,
+                       pp->ghosts[ghost].oldcf, pp->ghosts[ghost].oldrf, 
+                       pp->spritexs, pp->spriteys);
+#endif
+       }
+
+       drawlevelblock(mi, pp, 
+               (unsigned int)pp->ghosts[ghost].col, 
+               (unsigned int)pp->ghosts[ghost].row);
+
+       XSetTSOrigin(display, pp->stippledGC,
+               pp->ghosts[ghost].cf, pp->ghosts[ghost].rf);
+
+       if (MI_NPIXELS(mi) > 2)
+               XSetForeground(display, 
+                    pp->stippledGC, 
+                    MI_PIXEL(mi, GREEN));
+       else
+               XSetForeground(display, 
+                    pp->stippledGC, 
+                    MI_WHITE_PIXEL(mi));
+
+       XSetStipple(display, pp->stippledGC, 
+                         pp->ghostPixmap);
+
+#ifdef FLASH
+       XSetFillStyle(display, 
+                           pp->stippledGC, 
+                           FillStippled);
+#else
+       XSetFillStyle(display, 
+                           pp->stippledGC, 
+                           FillOpaqueStippled);
+#endif
+       if (pp->xs < 2 || pp->ys < 2)
+               XDrawPoint(display, window, pp->stippledGC,
+                               pp->ghosts[ghost].cf,
+                               pp->ghosts[ghost].rf);
+       else
+               XFillRectangle(display, 
+                                    window, 
+                                    pp->stippledGC,
+                                    pp->ghosts[ghost].cf, 
+                                    pp->ghosts[ghost].rf, 
+                                    pp->spritexs, pp->spriteys);
+
+       pp->ghosts[ghost].oldcf = pp->ghosts[ghost].cf;
+       pp->ghosts[ghost].oldrf = pp->ghosts[ghost].rf;
+}
+
+/* Does all drawing of moving sprites in the level. */
+static void
+pacman_tick(ModeInfo * mi)
+{
+       Display    *display = MI_DISPLAY(mi);
+       pacmangamestruct *pp = &pacmangames[MI_SCREEN(mi)];
+       unsigned int ghost;
+
+       for (ghost = 0; ghost < pp->nghosts; ghost++) {
+               if (pp->ghosts[ghost].dead == True)
+                       continue;
+               draw_ghost_sprite(mi, ghost);
+       }
+
+       draw_pacman_sprite(mi);
+
+       (void)XFlush(display);
+}
+
+/* Hook function, sets state to initial position. */
+void
+init_pacman(ModeInfo * mi)
+{
+       Display    *display = MI_DISPLAY(mi);
+       Window      window = MI_WINDOW(mi);
+       int         size = MI_SIZE(mi);
+       pacmangamestruct *pp;
+       XGCValues   gcv;
+       int         dir, mouth;
+       GC          fg_gc, bg_gc;
+       XPoint      points[9];
+
+       if (pacmangames == NULL) {
+               if ((pacmangames = (pacmangamestruct *) 
+                                       calloc((size_t)MI_NUM_SCREENS(mi),
+                                        sizeof (pacmangamestruct))) == NULL)
+                       return;
+       }
+       pp = &pacmangames[MI_SCREEN(mi)];
+
+       pp->width = (unsigned short)MI_WIDTH(mi);
+       pp->height = (unsigned short)MI_HEIGHT(mi);
+       if (pp->ghostPixmap != None) {
+               XFreePixmap(display, pp->ghostPixmap);
+               pp->ghostPixmap = None;
+               pp->graphics_format = 0 /*IS_NONE*/;
+       }
+
+       if (size == 0 ||
+               MINGRIDSIZE * size > (int)pp->width ||
+               MINGRIDSIZE * size > (int)pp->height) {
+
+               pp->ys = pp->xs = MAX(MIN(pp->width/LEVWIDTH, 
+                               pp->height/LEVHEIGHT), 1);
+       } else {
+               if (size < -MINSIZE)
+                       pp->ys = (short)(NRAND( MIN( -size, MAX( MINSIZE, 
+                                  MIN( pp->width, pp->height) / MINGRIDSIZE)) 
+                                       - MINSIZE + 1) + MINSIZE);
+               else if (size < MINSIZE)
+                       pp->ys = MINSIZE;
+               else
+                       pp->ys = (short)(MIN(size, 
+                                    MAX(MINSIZE, MIN(pp->width, pp->height) /
+                                         MINGRIDSIZE)));
+               pp->xs = pp->ys;
+       }
+
+       pp->wallwidth = (unsigned int)(pp->xs + pp->ys) >> 4;
+       if (pp->wallwidth < 1) pp->wallwidth = 1;
+       pp->incx = (pp->xs >> 3) + 1;
+       pp->incy = (pp->ys >> 3) + 1;
+       pp->ncols = (unsigned short)MAX(LEVWIDTH, 2);
+       pp->nrows = (unsigned short)MAX(LEVHEIGHT, 2);
+       pp->xb = (pp->width - pp->ncols * pp->xs) >> 1;
+       pp->yb = (pp->height - pp->nrows * pp->ys) >> 1;
+       pp->spritexs = MAX(pp->xs + (pp->xs >> 1) - 1, 1);
+       pp->spriteys = MAX(pp->ys + (pp->ys >> 1) - 1, 1);
+       pp->spritedx = (pp->xs - pp->spritexs) >> 1;
+       pp->spritedy = (pp->ys - pp->spriteys) >> 1;
+
+       if ((pp->ghostPixmap = XCreatePixmap(display, window,
+               pp->spritexs, pp->spriteys, 1)) == None) {
+               free_pacman(display, pp);
+               return;
+       }
+
+       gcv.foreground = 0;
+       gcv.background = 1;
+       if ((bg_gc = XCreateGC(display, pp->ghostPixmap,
+                       GCForeground | GCBackground, &gcv)) == None) {
+               free_pacman(display, pp);
+               return;
+       }
+
+       gcv.foreground = 1;
+       gcv.background = 0;
+       if ((fg_gc = XCreateGC(display, pp->ghostPixmap,
+                       GCForeground | GCBackground, &gcv)) == None) {
+               XFreeGC(display, bg_gc);
+               free_pacman(display, pp);
+               return;
+       }
+
+#define SETPOINT(p, xp, yp) p.x = xp; p.y = yp
+
+       /* draw the triangles on the bottom (scalable) */
+       SETPOINT(points[0], 1,                          pp->spriteys * 5 / 6);
+       SETPOINT(points[1], pp->spritexs / 6,           pp->spriteys);
+       SETPOINT(points[2], pp->spritexs / 3,           pp->spriteys * 5 / 6);
+       SETPOINT(points[3], pp->spritexs / 2,           pp->spriteys);
+       SETPOINT(points[4], pp->spritexs * 2 / 3,       pp->spriteys * 5 / 6);
+       SETPOINT(points[5], pp->spritexs * 5 / 6,       pp->spriteys);
+       SETPOINT(points[6], pp->spritexs,               pp->spriteys * 5 / 6);
+       SETPOINT(points[7], pp->spritexs,               pp->spriteys / 2);
+       SETPOINT(points[8], 1,                          pp->spriteys / 2);
+
+       XFillRectangle(display, pp->ghostPixmap, bg_gc,
+               0, 0, pp->spritexs, pp->spriteys);
+       XFillArc(display, pp->ghostPixmap, fg_gc,
+               0, 0, pp->spritexs, pp->spriteys, 0, 11520);
+       XFillPolygon(display, pp->ghostPixmap, fg_gc,
+               points, 9, Nonconvex, CoordModeOrigin);
+       XFreeGC(display, bg_gc);
+       XFreeGC(display, fg_gc);
+
+       if (!pp->stippledGC) {
+               gcv.foreground = MI_BLACK_PIXEL(mi);
+               gcv.background = MI_BLACK_PIXEL(mi);
+               if ((pp->stippledGC = XCreateGC(display, window,
+                               GCForeground | GCBackground, &gcv)) == None) {
+                       free_pacman(display, pp);
+                       return;
+               }
+       }
+       if (pp->pacmanPixmap[0][0] != None)
+               for (dir = 0; dir < 4; dir++)
+                       for (mouth = 0; mouth < MAXMOUTH; mouth++)
+                               XFreePixmap(display, 
+                                                 pp->pacmanPixmap[dir]
+                                                       [mouth]);
+
+       for (dir = 0; dir < 4; dir++)
+               for (mouth = 0; mouth < MAXMOUTH; mouth++) {
+                       if ((pp->pacmanPixmap[dir][mouth] = XCreatePixmap(
+                                       display, MI_WINDOW(mi), 
+                                       pp->spritexs, pp->spriteys, 1)) == 
+                                       None) {
+                               free_pacman(display, pp);
+                               return;
+                       }
+                       gcv.foreground = 1;
+                       gcv.background = 0;
+                       if ((fg_gc = XCreateGC(display, pp->pacmanPixmap[dir][mouth],
+                                       GCForeground | GCBackground, &gcv)) == None) {
+                               free_pacman(display, pp);
+                               return;
+                       }
+                       gcv.foreground = 0;
+                       gcv.background = 0;
+                       if ((bg_gc = XCreateGC(display, 
+                                               pp->pacmanPixmap[dir][mouth],
+                                               GCForeground | 
+                                               GCBackground, &gcv)) == 
+                                       None) {
+                               XFreeGC(display, fg_gc);
+                               free_pacman(display, pp);
+                               return;
+                       }
+                       XFillRectangle(display, 
+                                       pp->pacmanPixmap[dir][mouth], bg_gc,
+                                       0, 0, pp->spritexs, pp->spriteys);
+                       if (pp->spritexs == 1 && pp->spriteys == 1)
+                               XFillRectangle(display, 
+                                            pp->pacmanPixmap[dir][mouth], 
+                                            fg_gc, 0, 0, pp->spritexs, 
+                                            pp->spriteys);
+                       else
+                               XFillArc(display, 
+                                              pp->pacmanPixmap[dir][mouth],
+                                              fg_gc,
+                                       0, 0, pp->spritexs, pp->spriteys,
+                                       ((90 - dir * 90) + mouth * 5) * 64,
+                                       (360 + (-2 * mouth * 5)) * 64);
+                       XFreeGC(display, fg_gc);
+                       XFreeGC(display, bg_gc);
+               }
+
+       pp->pacman.lastbox = START;
+       pp->pacman.mouthdirection = 1;
+       pp->pacman.nextcol = NOWHERE;
+       pp->pacman.nextrow = NOWHERE;
+
+       if (pp->ghosts != NULL) {
+                       free(pp->ghosts);
+                       pp->ghosts = (ghoststruct *) NULL;
+       }
+       pp->nghosts = GHOSTS;
+
+       if (!pp->ghosts)
+               if ((pp->ghosts = (ghoststruct *) calloc((size_t)pp->nghosts,
+                               sizeof (ghoststruct))) == NULL) {
+                       free_pacman(display, pp);
+                       return;
+               }
+
+       pp->pacman.mouthstage = MAXMOUTH - 1;
+
+       MI_CLEARWINDOW(mi);
+       repopulate(mi);
+}
+
+/* Callback function called for each tick.  This is the complete machinery of
+   everything that moves. */
+void
+draw_pacman(ModeInfo * mi)
+{
+       unsigned int g;
+       pacmangamestruct *pp;
+
+       if (pacmangames == NULL)
+               return;
+       pp = &pacmangames[MI_SCREEN(mi)];
+       if (pp->ghosts == NULL)
+               return;
+
+       pp->pacman.err.x = (pp->pacman.err.x + 1) % pp->pacman.speed;
+       pp->pacman.err.y = (pp->pacman.err.y + 1) % pp->pacman.speed;
+       pp->pacman.delta.x += pp->pacman.err.x != 0 ? pp->incx : 0;
+       pp->pacman.delta.y += pp->pacman.err.y != 0 ? pp->incy : 0;
+
+       if (pp->pacman.delta.x >= pp->xs && pp->pacman.delta.y >= pp->ys) {
+               pac_update(mi, pp, &(pp->pacman));
+               check_death(mi, pp);
+               pp->pacman.delta.x = pp->incx;
+               pp->pacman.delta.y = pp->incy;
+       }
+
+       if (pp->pacman.delta.x > pp->xs + pp->incx)
+               pp->pacman.delta.x = pp->xs + pp->incx;
+       if (pp->pacman.delta.y > pp->ys + pp->incy)
+               pp->pacman.delta.y = pp->ys + pp->incy;
+
+       for (g = 0; g < pp->nghosts; g++) {
+               if (pp->ghosts[g].dead == True) continue;
+
+               pp->ghosts[g].err.x = (pp->ghosts[g].err.x + 1) % 
+                       pp->ghosts[g].speed;
+               pp->ghosts[g].err.y = (pp->ghosts[g].err.y + 1) % 
+                       pp->ghosts[g].speed;
+               pp->ghosts[g].delta.x += pp->ghosts[g].err.x != 0 ? 
+                       pp->incx : 0;
+               pp->ghosts[g].delta.y += pp->ghosts[g].err.y != 0 ? 
+                       pp->incy : 0;
+
+               if (pp->ghosts[g].delta.x >= pp->xs && 
+                   pp->ghosts[g].delta.y >= pp->ys) {
+                       ghost_update(pp, &(pp->ghosts[g]));
+                       pp->ghosts[g].delta.x = pp->incx;
+                       pp->ghosts[g].delta.y = pp->incy;
+               }
+
+               if (pp->ghosts[g].delta.x > pp->xs + pp->incx)
+                       pp->ghosts[g].delta.x = pp->xs + pp->incx;
+               if (pp->ghosts[g].delta.y > pp->ys + pp->incy)
+                       pp->ghosts[g].delta.y = pp->ys + pp->incy;
+       }
+
+       pacman_tick(mi);
+}
+
+/* Releases resources. */
+void
+release_pacman(ModeInfo * mi)
+{
+       if (pacmangames != NULL) {
+               int         screen;
+
+               for (screen = 0; screen < MI_NUM_SCREENS(mi); screen++)
+                       free_pacman(MI_DISPLAY(mi), &pacmangames[screen]);
+               free(pacmangames);
+               pacmangames = (pacmangamestruct *) NULL;
+       }
+}
+
+/* Refresh current level. */
+void
+refresh_pacman(ModeInfo * mi)
+{
+       drawlevel(mi);
+       pacman_tick(mi);
+}
+
+/* Callback to change level. */
+void
+change_pacman(ModeInfo * mi)
+{
+       MI_CLEARWINDOW(mi);
+       repopulate(mi);
+}
+
+#endif /* MODE_pacman */
diff --git a/hacks/pacman.h b/hacks/pacman.h
new file mode 100644 (file)
index 0000000..8c914f7
--- /dev/null
@@ -0,0 +1,189 @@
+/*-
+ * Copyright (c) 2002 by Edwin de Jong <mauddib@gmx.net>.
+ *
+ * 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.
+ *
+ * Revision History:
+ *  3-May-2002: Added AI to pacman and ghosts, slowed down ghosts.
+ * 26-Nov-2001: Random level generator added
+ * 01-Nov-2000: Allocation checks
+ * 04-Jun-1997: Compatible with xscreensaver
+ *
+ */
+
+#define LEVHEIGHT      32U
+#define LEVWIDTH       40U
+
+#define GETNB(n) ((1 << (n)) - 1)
+#define TESTNB(v, n) (((1 << (n)) & v) != 0x00)
+#define SNB(v, n) ((v) |= (1 << (n)))
+#define UNSNB(v, n) ((v) &= ~(1 << (n)))
+#define GHOSTS 4U
+#define MAXMOUTH 11
+#define MAXGPOS 2
+#define MINGRIDSIZE 4
+#define MINSIZE 3
+#define NOWHERE 16383
+#define START ((LRAND() & 1) ? 1 : 3)
+#define MINDOTPERC 10
+
+#define YELLOW (MI_NPIXELS(mi) / 6)
+#define GREEN (23 * MI_NPIXELS(mi) / 64)
+#define BLUE (45 * MI_NPIXELS(mi) / 64)
+#define WHITE (MI_NPIXELS(mi))
+
+#define LINEWIDTH      4
+#define HLINEWIDTH     1
+#define JAILHEIGHT      7
+#define JAILWIDTH       8
+
+#define GETFACTOR(x, y) ((x) > (y) ? 1 : ((x) < (y) ? -1 : 0))
+#define SIGN(x) GETFACTOR((x), 0)
+#define TRACEVECS 40
+
+#define DEF_TRACKMOUSE "False"
+static Bool trackmouse;
+
+typedef struct { int vx, vy; } tracevec_struct;
+
+typedef enum { inbox = 0, goingout, randdir, chasing, hiding } GhostState;
+typedef enum { ps_eating = 0, ps_chasing, ps_hiding, ps_random } PacmanState;
+typedef enum { GHOST_DANGER, GHOST_EATEN } GameState;
+
+typedef struct {
+       unsigned int    col, row;
+       unsigned int    lastbox, nextcol, nextrow;
+       int             dead;
+       int             cfactor, rfactor;
+       int             cf, rf;
+       int             oldcf, oldrf;
+       int             timeleft;
+       GhostState      aistate;
+       /*int         color; */
+       int             speed;
+       XPoint          delta;
+       XPoint          err;
+} ghoststruct;
+
+typedef struct {
+       unsigned int    col, row;
+       unsigned int    lastbox, nextcol, nextrow;
+       int             mouthstage, mouthdirection;
+       int             cfactor, rfactor;
+       int             cf, rf;
+       int             oldcf, oldrf;
+       int             oldlx, oldly;
+       int             justate;
+       PacmanState     aistate;
+       tracevec_struct trace[TRACEVECS];
+       int             cur_trace;
+       int             state_change;
+       int             roundscore;
+       int             speed;
+       int             lastturn;
+       XPoint          delta;
+       XPoint          err;
+} pacmanstruct;
+
+typedef struct {
+       unsigned short  width, height;
+       unsigned short  nrows, ncols;
+       short           xs, ys, xb, yb;
+       short           incx, incy;
+       GC              stippledGC;
+       int             graphics_format;
+       pacmanstruct    pacman;
+       ghoststruct     *ghosts;
+       unsigned int    nghosts;
+       Pixmap          pacmanPixmap[4][MAXMOUTH];
+/*     Pixmap          ghostPixmap[4][MAXGPOS];*/
+       Pixmap          ghostPixmap;
+       char            level[LEVHEIGHT * LEVWIDTH];
+       unsigned int    wallwidth;
+       unsigned int    dotsleft;
+       int             spritexs, spriteys, spritedx, spritedy;
+
+       GameState       gamestate;
+       unsigned int    timeleft;
+} pacmangamestruct;
+
+#define DIRVECS 4
+static const struct { int dx, dy; } dirvecs[DIRVECS] =
+       { {-1, 0}, {0, 1}, {1, 0}, {0, -1}};
+
+static pacmangamestruct *pacmangames = (pacmangamestruct *) NULL;
+
+typedef char lev_t[LEVHEIGHT][LEVWIDTH + 1];
+
+/* function type definitions */
+
+       /* level generation */
+static int     creatlevelblock(lev_t *level, const unsigned x, 
+                               const unsigned y);
+static void    setblockto(lev_t *level, const unsigned x, const unsigned y, 
+                               const char c);
+static int     checkset(lev_t *level, const unsigned x, const unsigned y);
+static int     checksetout(lev_t *level, const unsigned x, const unsigned y);
+static int     checkunsetdef(lev_t *level, const unsigned x, const unsigned y);
+static void    clearlevel(lev_t *level);
+static void    copylevel(char *dest, lev_t *level);
+static void    createjail(lev_t *level, const unsigned width, 
+                               const unsigned height);
+static void    finishjail(lev_t *level, const unsigned width, 
+                               const unsigned height);
+static int     tryset(lev_t *level, const unsigned xpos, const unsigned ypos, 
+                               const char *block);
+static int     creatlevelblock(lev_t *level, const unsigned x, 
+                               const unsigned y);
+static void    filllevel(lev_t *level);
+static void    frmtlevel(lev_t *level);
+static unsigned countdots(ModeInfo * mi);
+static int     createnewlevel(ModeInfo * mi);
+static int     check_pos(pacmangamestruct *pp, int y, int x, int ghostpass);
+static int     check_dot(pacmangamestruct *pp, unsigned int x, unsigned int y);
+
+       /* graphics rendering */
+static void    drawlevel(ModeInfo * mi);
+
+       /* AI */
+static int     ghost_get_posdirs(pacmangamestruct *pp, int *posdirs, 
+                               ghoststruct *g);
+static void    ghost_random(pacmangamestruct *pp, ghoststruct *g);
+static void    ghost_chasing(pacmangamestruct *pp, ghoststruct *g);
+static void    ghost_hiding(pacmangamestruct *pp, ghoststruct *g);
+static void    ghost_update(pacmangamestruct *pp, ghoststruct *g);
+
+static void    pac_dot_vec(pacmangamestruct *pp, pacmanstruct *p, 
+                               long *vx, long *vy);
+static int     pac_ghost_prox_and_vector(pacmangamestruct *pp, 
+                               pacmanstruct *p, int *vx, int *vy);
+static int     pac_get_posdirs(pacmangamestruct *pp, pacmanstruct *p, 
+                               int *posdirs);
+static void    pac_clear_trace(pacmanstruct *p);
+static void    pac_save_trace(pacmanstruct *p, const int vx, const int vy);
+static int     pac_check_trace(const pacmanstruct *p, const int vx, 
+                               const int vy);
+static void    pac_eating(pacmangamestruct *pp, pacmanstruct *p);
+#if 0
+static void    pac_chasing(pacmangamestruct *pp, pacmanstruct *p);
+#endif
+static void    pac_random(pacmangamestruct *pp, pacmanstruct *p);
+static int     pac_get_vector_screen(pacmangamestruct *pp, pacmanstruct *p, 
+                       const int x, const int y, int *vx, int *vy);
+static int     pac_trackmouse(ModeInfo * mi, pacmangamestruct *pp, 
+                       pacmanstruct *p);
+static void    pac_update(ModeInfo * mi, pacmangamestruct *pp, 
+                       pacmanstruct *p);
+
+       /* generic functions */
+static void    repopulate(ModeInfo * mi);
diff --git a/hacks/pacman.man b/hacks/pacman.man
new file mode 100644 (file)
index 0000000..ba18c41
--- /dev/null
@@ -0,0 +1,63 @@
+.TH XScreenSaver 1 "12-Feb-2004" "X Version 11"
+.SH NAME
+pacman - simulates a game of Pac-Man on a randomly-created level.
+.SH SYNOPSIS
+.B pacman
+[\-display \fIhost:display.screen\fP]
+[\-window]
+[\-root]
+[\-mono]
+[\-install]
+[\-visual \fIvisual\fP]
+[\-ncolors \fIinteger\fP]
+[\-delay \fImicroseconds\fP]
+[\-size \fIpixels\fP]
+.SH DESCRIPTION
+Simulates a game of Pac-Man on a randomly-created level.
+.SH OPTIONS
+.I pacman
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window.  This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-mono 
+If on a color display, pretend we're on a monochrome display.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use.  Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-ncolors \fIinteger\fP
+How many colors should be used (if possible).  Default 6.
+.TP 8
+.B \-size \fIinteger\fP
+How big to make Pac-Man and the ghosts.  0 means "default."
+.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 2000 Edwin de Jong.
+
+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. 
+.SH AUTHOR
+Edwin de Jong <mauddib@gmx.net>.
diff --git a/hacks/pacman_ai.h b/hacks/pacman_ai.h
new file mode 100644 (file)
index 0000000..9dbcb7d
--- /dev/null
@@ -0,0 +1,565 @@
+/*-
+ * Copyright (c) 2002 by Edwin de Jong <mauddib@gmx.net>.
+ *
+ * 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.
+ */
+
+/* this file is a part of pacman.c, and included via pacman.h.  It handles the
+   AI of the ghosts and the pacman. */
+
+
+/* fills array of DIRVECS size with possible directions, returns number of
+   directions. 'posdirs' points to a possibly undefined array of four
+   integers.  The vector will contain booleans wether the direction is
+   a possible direction or not.  Reverse directions are deleted. */
+static int
+ghost_get_posdirs(pacmangamestruct *pp, int *posdirs, ghoststruct *g) 
+{
+       unsigned int i, nrdirs = 0;
+
+       /* bit of black magic here */
+       for (i = 0; i < DIRVECS; i++) {
+               /* remove opposite */
+               if (g->lastbox != NOWHERE && i == (g->lastbox + 2) % DIRVECS
+                               && g->aistate != goingout) {
+                       posdirs[i] = 0;
+                       continue;
+               }
+               if (g->aistate == goingout && i == 1) {
+                       posdirs[i] = 0;
+                       continue;
+               }
+               /* check if possible direction */
+               if ((posdirs[i] = 
+                       check_pos(pp, g->row + dirvecs[i].dy, 
+                               g->col + dirvecs[i].dx, 
+                               g->aistate == goingout ? True : False)) == 
+                               True) {
+                       nrdirs++;
+               }
+       }
+
+       return nrdirs;
+}
+
+/* Directs ghost to a random direction, exluding opposite (except in the
+   impossible situation that there is only one valid direction). */
+static void
+ghost_random(pacmangamestruct *pp, ghoststruct *g) 
+{
+       int posdirs[DIRVECS], nrdirs = 0, i, dir = 0;
+
+       nrdirs = ghost_get_posdirs(pp, posdirs, g);
+       for (i = 0; i < DIRVECS; i++)
+               if (posdirs[i] == True) dir = i;
+
+       if (nrdirs == 0) dir = (g->lastbox + 2) % DIRVECS;
+       else if (nrdirs > 1)
+               for (i = 0; i < DIRVECS; i++) {
+                       if (posdirs[i] == True && NRAND(nrdirs) == 0) {
+                               dir = i;
+                               break;
+                       }
+               }
+
+       g->nextrow = g->row + dirvecs[dir].dy;
+       g->nextcol = g->col + dirvecs[dir].dx;
+       g->lastbox = dir;
+}
+
+/* Determines best direction to chase the pacman and goes that direction. */
+static void
+ghost_chasing(pacmangamestruct *pp, ghoststruct *g) 
+{
+       int posdirs[DIRVECS], nrdirs = 0, i, dir = 0, highest = -100000, 
+               thisvecx, thisvecy, thisvec;
+
+       nrdirs = ghost_get_posdirs(pp, posdirs, g);
+       for (i = 0; i < DIRVECS; i++)
+               if (posdirs[i] == True) dir = i;
+
+       if (nrdirs == 0) dir = (g->lastbox + 2) % DIRVECS;
+       else if (nrdirs > 1)
+               for (i = 0; i < DIRVECS; i++) {
+                       if (posdirs[i] == False) continue;
+                       thisvecx = (pp->pacman.col - g->col) * dirvecs[i].dx;
+                       thisvecy = (pp->pacman.row - g->row) * dirvecs[i].dy;
+                       thisvec = thisvecx + thisvecy;
+                       if (thisvec >= highest) {
+                               dir = i;
+                               highest = thisvec;
+                       }
+               }
+
+       g->nextrow = g->row + dirvecs[dir].dy;
+       g->nextcol = g->col + dirvecs[dir].dx;
+       g->lastbox = dir;
+}
+
+/* Determines the best direction to go away from the pacman, and goes that
+   direction. */
+static void
+ghost_hiding(pacmangamestruct *pp, ghoststruct *g) 
+{
+       int posdirs[DIRVECS], nrdirs = 0, i, dir = 0, highest = -100000,
+               thisvecx, thisvecy, thisvec;
+
+       nrdirs = ghost_get_posdirs(pp, posdirs, g);
+       for (i = 0; i < DIRVECS; i++)
+               if (posdirs[i] == True) dir = i;
+
+       if (nrdirs == 0) dir = (g->lastbox + 2) % DIRVECS;
+       else if (nrdirs > 1)
+               for (i = 0; i < DIRVECS; i++) {
+                       if (posdirs[i] == False) continue;
+                       thisvecx = (g->col - pp->pacman.col) * dirvecs[i].dx;
+                       thisvecy = (g->row - pp->pacman.row) * dirvecs[i].dy;
+                       thisvec = thisvecx + thisvecy;
+                       if (thisvec >= highest)
+                               dir = i;
+               }
+
+       g->nextrow = g->row + dirvecs[dir].dy;
+       g->nextcol = g->col + dirvecs[dir].dx;
+       g->lastbox = dir;
+}
+
+/* Determines a vector from the pacman position, towards all dots.  The vector
+   is inversely proportional to the square of the distance of each dot.  
+   (so, close dots attract more than far away dots). */
+static void 
+pac_dot_vec(pacmangamestruct *pp, pacmanstruct *p, long *vx, long *vy) 
+{
+       int x, y, bx = 0, by = 0, ex = LEVWIDTH, ey = LEVHEIGHT;
+       long dx, dy, dist, top = 0;
+
+#if 0
+       int rnr = NRAND(50);
+       /* determine begin and end vectors */
+
+       switch (rnr) {
+               case 0: ex = LEVHEIGHT/2; break;
+               case 1: bx = LEVHEIGHT/2; break;
+               case 2: ey = LEVHEIGHT/2; break;
+               case 3: by = LEVHEIGHT/2; break;
+       }
+#endif
+       *vx = *vy = 0;
+
+       for (y = by; y < ey; y++) 
+               for (x = bx; x < ex; x++)
+                       if (check_dot(pp, x, y) == 1) {
+                               dx = (long)x - (long)(p->col);
+                               dy = (long)y - (long)(p->row);
+                               dist = dx * dx + dy * dy;
+                               if (dist > top)
+                                       top = dist;
+                               *vx += (dx * ((long)LEVWIDTH * (long)LEVHEIGHT))
+                                      / dist;
+                               *vy += (dy * ((long)LEVWIDTH * (long)LEVHEIGHT))
+                                      / dist;
+                       }
+}
+
+/* Determine a vector towards the closest ghost (in one loop, so we spare a
+   couple of cycles which we can spoil somewhere else just as fast). */
+static int
+pac_ghost_prox_and_vector(pacmangamestruct *pp, pacmanstruct *p, 
+               int *vx, int *vy) 
+{
+       int dx, dy, dist, closest = 100000;
+       unsigned int g;
+
+       if (vx != NULL)
+               *vx = *vy = 0;
+
+       for (g = 0; g < pp->nghosts; g++) {
+               if (pp->ghosts[g].dead    == True  || 
+                   pp->ghosts[g].aistate == inbox ||
+                   pp->ghosts[g].aistate == goingout)
+                       continue;
+               dx = pp->ghosts[g].col + /*dirvecs[pp->ghosts[g].lastbox].dx*/ -
+                       p->col;
+               dy = pp->ghosts[g].row + /*dirvecs[pp->ghosts[g].lastbox].dy*/ -
+                       p->row;
+               dist = dx * dx + dy * dy;
+               if (dist < closest) {
+                       closest = dist;
+                       if (vx != NULL) {
+                               *vx = dx; *vy = dy;
+                       }
+               }
+       }
+       return closest;
+}
+
+/* fills array of DIRVECS size with possible directions, returns number of
+   directions.  posdirs should point to an array of 4 integers. */
+static int
+pac_get_posdirs(pacmangamestruct *pp, pacmanstruct *p, int *posdirs)
+{
+       int nrdirs = 0;
+       unsigned int i;
+
+       for (i = 0; i < DIRVECS; i++) {
+               /* if we just ate, or we are in a statechange, it is allowed 
+                  to go the opposite direction */
+               if (p->justate == 0 &&
+                   p->state_change == 0 && 
+                   p->lastbox != NOWHERE && 
+                   i == (p->lastbox + 2) % DIRVECS) {
+                       posdirs[i] = 0;
+               } else if ((posdirs[i] = 
+                       check_pos(pp, p->row + dirvecs[i].dy, 
+                               p->col + dirvecs[i].dx, 0)) == 1)
+                       nrdirs++;
+       }
+       p->state_change = 0;
+
+       return nrdirs;
+}
+
+/* Clears the trace of vectors. */
+static void
+pac_clear_trace(pacmanstruct *p) 
+{
+       int i;
+
+       for(i = 0; i < TRACEVECS; i++) {
+               p->trace[i].vx = NOWHERE; p->trace[i].vy = NOWHERE;
+       }
+       p->cur_trace = 0;
+}
+
+/* Adds a new vector to the trace. */
+static void
+pac_save_trace(pacmanstruct *p, const int vx, const int vy) 
+{
+       if (!(vx == NOWHERE && vy == NOWHERE)) {
+               p->trace[p->cur_trace].vx = vx;
+               p->trace[p->cur_trace].vy = vy;
+               p->cur_trace = (p->cur_trace + 1) % TRACEVECS;
+       }
+}
+
+/* Check if a vector can be found in the trace. */
+static int
+pac_check_trace(const pacmanstruct *p, const int vx, const int vy) 
+{
+       int i, curel;
+
+       for (i = 1; i < TRACEVECS; i++) {
+               curel = (p->cur_trace - i + TRACEVECS) % TRACEVECS;
+               if (p->trace[curel].vx == NOWHERE &&
+                   p->trace[curel].vy == NOWHERE)
+                       continue;
+               if (p->trace[curel].vx == vx &&
+                   p->trace[curel].vy == vy)
+                       return 1;
+       }
+
+
+       return 0;
+}
+
+/* AI mode "Eating" for pacman. Tries to eat as many dots as possible, goes
+   to "hiding" if too close to a ghost. If in state "hiding" the vectors
+   of the ghosts are also taken into account (thus not running towards them
+   is the general idea). */
+static void
+pac_eating(pacmangamestruct *pp, pacmanstruct *p) 
+{
+       int posdirs[DIRVECS], nrdirs, i, highest = -(1 << 16), 
+               score, dir = 0, dotfound = 0, prox, worst = 0;
+       long vx, vy;
+
+       if ((prox = pac_ghost_prox_and_vector(pp, p, (int *)&vx, (int *)&vy)) <
+                               4 * 4 && p->aistate == ps_eating) {
+               p->aistate = ps_hiding;
+               p->state_change = 1;
+               pac_clear_trace(p);
+       }
+
+       if (prox > 6 * 6 && p->aistate == ps_hiding) {
+               p->aistate = ps_eating;
+               if (p->justate == 0) p->state_change = 1;
+               pac_clear_trace(p);
+       }
+
+       if (prox < 3 * 3) p->state_change = 1;
+
+       nrdirs = pac_get_posdirs(pp, p, posdirs);
+       
+       /* remove directions which lead to ghosts */
+       if (p->aistate == ps_hiding) {
+               for (i = 0; i < DIRVECS; i++) {
+                       if (posdirs[i] == 0) continue;
+                       score = vx * dirvecs[i].dx + vy * dirvecs[i].dy;
+                       if (score > highest) {
+                               worst = i;
+                               highest = score;
+                       }
+                       dir = i;
+               }
+               nrdirs--;
+               posdirs[worst] = 0;
+               highest = -(1 << 16);
+       }
+
+       /* get last possible direction if all else fails */
+       for (i = 0; i < DIRVECS; i++)
+               if (posdirs[i] != 0) dir = i;
+
+       pac_dot_vec(pp, p, &vx, &vy);
+
+       if (vx != NOWHERE && vy != NOWHERE && pac_check_trace(p, vx, vy) > 0) {
+               p->roundscore++;
+               if (p->roundscore >= 12) {
+                       p->roundscore = 0;
+                       p->aistate = ps_random;
+                       pac_clear_trace(p);
+               }
+       } else
+               p->roundscore = 0;
+
+       if (p->justate == 0) pac_save_trace(p, vx, vy);
+
+       for (i = 0; i < DIRVECS; i++) {
+               if (posdirs[i] == 0) continue;
+               score = dirvecs[i].dx * vx + dirvecs[i].dy * vy;
+               if (check_dot(pp, p->col + dirvecs[i].dx, 
+                                 p->row + dirvecs[i].dy) == 1) {
+                       if (dotfound == 0) {
+                               highest = score;
+                               dir = i;
+                               dotfound = 1;
+                       } else if (score > highest) {
+                               highest = score;
+                               dir = i;
+                       }
+               } else if (score > highest && dotfound == 0) {
+                       dir = i;
+                       highest = score;
+               }
+       }
+
+       p->nextrow = p->row + dirvecs[dir].dy;
+       p->nextcol = p->col + dirvecs[dir].dx;
+       p->lastbox = dir;
+}
+
+#if 0
+/* Tries to catch the ghosts. */
+static void
+pac_chasing(pacmangamestruct *pp, pacmanstruct *p) 
+{
+}
+#endif
+
+/* Goes completely random, but not in the opposite direction.  Used when a
+   loop is detected. */
+static void
+pac_random(pacmangamestruct *pp, pacmanstruct *p) 
+{
+       int posdirs[DIRVECS], nrdirs, i, dir = -1, lastdir = 0;
+
+       if (pac_ghost_prox_and_vector(pp, p, NULL, NULL) < 5 * 5) {
+               p->aistate = ps_hiding;
+               p->state_change = 1;
+       }
+       if (NRAND(20) == 0) {
+               p->aistate = ps_eating;
+               p->state_change = 1;
+               pac_clear_trace(p);
+       }
+
+       nrdirs = pac_get_posdirs(pp, p, posdirs);
+
+       for (i = 0; i < DIRVECS; i++) {
+               if (posdirs[i] == 0) continue;
+               lastdir = i;
+               if (check_dot(pp, p->col + dirvecs[i].dx, 
+                       p->row + dirvecs[i].dy) == 1) {
+                       dir = i;
+                       p->aistate = ps_eating;
+                       p->state_change = 1;
+                       pac_clear_trace(p);
+                       break;
+               } else if (NRAND(nrdirs) == 0)
+                       dir = i;
+       }
+
+       if (dir == -1) dir = lastdir;
+
+       p->nextrow = p->row + dirvecs[dir].dy;
+       p->nextcol = p->col + dirvecs[dir].dx;
+       p->lastbox = dir;
+}
+
+static int
+pac_get_vector_screen(pacmangamestruct *pp, pacmanstruct *p, 
+               const int x, const int y, int *vx, int *vy) 
+{
+       int lx, ly;
+
+       lx = (x - pp->xb) / pp->xs;
+       ly = (y - pp->yb) / pp->ys;
+
+       if (lx < 0) lx = 0;
+       else if ((unsigned int) lx > LEVWIDTH) lx = LEVWIDTH - 1;
+
+       if (ly < 0) ly = 0;
+       else if ((unsigned int) ly > LEVHEIGHT) ly = LEVHEIGHT - 1;
+
+       *vx = lx - p->col;
+       *vy = ly - p->row;
+
+       if (lx == p->oldlx && ly == p->oldly) return 0;
+       p->oldlx = lx; p->oldly = ly;
+       return 1;
+}
+
+static int
+pac_trackmouse(ModeInfo * mi, pacmangamestruct *pp, pacmanstruct *p) 
+{
+       int dx, dy, cx, cy, vx, vy;
+       unsigned int m;
+       int posdirs[DIRVECS], i, dir = -1, highest = -(2 << 16), score;
+       Window r, c;
+
+       (void) XQueryPointer(MI_DISPLAY(mi), MI_WINDOW(mi),
+                        &r, &c, &dx, &dy, &cx, &cy, &m);
+
+       if (cx <= 0 || cy <= 0 ||
+                    cx >= MI_WIDTH(mi) - 1 ||
+                    cy >= MI_HEIGHT(mi) - 1)
+               return 0;
+       /* get vector */
+       p->state_change = pac_get_vector_screen(pp, p, cx, cy, &vx, &vy);
+
+       (void) pac_get_posdirs(pp, p, posdirs);
+
+       for (i = 0; i < DIRVECS; i++) {
+               if (posdirs[i] == 0) continue;
+               score = dirvecs[i].dx * vx + dirvecs[i].dy * vy;
+               if (score > highest) {
+                       highest = score;
+                       dir = i;
+               }
+       }
+
+       p->nextrow = p->row + dirvecs[dir].dy;
+       p->nextcol = p->col + dirvecs[dir].dx;
+       p->lastbox = dir;
+       return 1;
+}
+
+/* Calls correct state function, and changes between states. */
+static void
+ghost_update(pacmangamestruct *pp, ghoststruct *g)
+{
+
+       if (!(g->nextrow == NOWHERE && g->nextcol == NOWHERE)) {
+               g->row = g->nextrow;
+               g->col = g->nextcol;
+       }
+
+       /* update ghost */
+       if (g->dead == True) /* dead ghosts are dead, 
+                               so they don't run around */
+               return;
+
+       if ((g->aistate == randdir || g->aistate == chasing) && 
+                       NRAND(10) == 0) {
+               switch (NRAND(3)) {
+                       case 0:
+                               g->aistate = randdir; break;
+                       case 1:
+                               g->aistate = chasing; break;
+                       case 2:
+                               g->aistate = chasing; break;
+               }
+
+       } else if (g->aistate == inbox) {
+               if (g->timeleft < 0)
+                       g->aistate = goingout;
+               else
+                       g->timeleft--;
+
+       } else if (g->aistate == goingout) {
+               if (g->col < LEVWIDTH/2 - JAILWIDTH/2 ||
+                   g->col > LEVWIDTH/2 + JAILWIDTH/2 ||
+                   g->row < LEVHEIGHT/2 - JAILHEIGHT/2 ||
+                   g->row > LEVHEIGHT/2 + JAILHEIGHT/2 )
+                       g->aistate = randdir;
+       }
+                  
+       switch (g->aistate) {
+               case inbox:
+               case goingout:
+               case randdir:
+                       ghost_random(pp, g);
+                       break;
+               case chasing:
+                       ghost_chasing(pp, g);
+                       break;
+               case hiding:
+                       ghost_hiding(pp, g);
+                       break;
+       }
+
+       g->cfactor = GETFACTOR(g->nextcol, g->col);
+       g->rfactor = GETFACTOR(g->nextrow, g->row);
+}
+
+/* Calls correct pacman state function. */
+static void
+pac_update(ModeInfo *mi, pacmangamestruct *pp, pacmanstruct *p) 
+{
+       if (!(p->nextrow == NOWHERE && p->nextcol == NOWHERE)) {
+               p->row = p->nextrow;
+               p->col = p->nextcol;
+       }
+
+       if (pp->level[p->row * LEVWIDTH + p->col] == '.') { 
+               pp->level[p->row * LEVWIDTH + p->col] = ' ';
+               if (!trackmouse)
+                       p->justate = 1;
+               pp->dotsleft--;
+       } else if (!trackmouse) {
+               p->justate = 0;
+       }
+
+       if (!(trackmouse && pac_trackmouse(mi, pp, p))) {
+               /* update pacman */
+               switch (p->aistate) {
+                       case ps_eating:
+                               pac_eating(pp, p);
+                               break;
+                       case ps_hiding:
+                               pac_eating(pp, p);
+                               break;
+                       case ps_random:
+                               pac_random(pp, p);
+                               break;
+                       case ps_chasing:
+#if 0
+                               pac_chasing(pp, p);
+#endif
+                               break;
+               }
+       }
+
+       p->cfactor = GETFACTOR(p->nextcol, p->col);
+       p->rfactor = GETFACTOR(p->nextrow, p->row);
+}
diff --git a/hacks/pacman_level.h b/hacks/pacman_level.h
new file mode 100644 (file)
index 0000000..c33f28e
--- /dev/null
@@ -0,0 +1,651 @@
+/*-
+ * Copyright (c) 2002 by Edwin de Jong <mauddib@gmx.net>.
+ *
+ * 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.
+ */
+
+#define NONE 0x0000
+#define LT   0x1000
+#define RT   0x0001
+#define RB   0x0010
+#define LB   0x0100
+#define ALL  0x1111
+
+#define BLOCK_EMPTY    ' '
+#define BLOCK_DOT_1    '`'
+#define BLOCK_DOT_2    '.'
+#define BLOCK_WALL     '#'
+#define BLOCK_GHOST_ONLY       '='
+#define BLOCK_WALL_TL  '\''
+#define BLOCK_WALL_TR  '`'
+#define BLOCK_WALL_BR  ','
+#define BLOCK_WALL_BL  '_'
+#define BLOCK_WALL_HO  '-'
+#define BLOCK_WALL_VE  '|'
+
+/* This is more or less the standard pacman level (without the left-right
+   tunnel. */
+static const lev_t stdlevel = {
+       "########################################",
+       "########################################",
+       "#######````````````##````````````#######",
+       "#######`####`#####`##`#####`####`#######",
+       "#######`####`#####`##`#####`####`#######",
+       "#######`####`#####`##`#####`####`#######",
+       "#######``````````````````````````#######",
+       "#######`####`##`########`##`####`#######",
+       "#######`####`##`########`##`####`#######",
+       "#######``````##````##````##``````#######",
+       "############`#####`##`#####`############",
+       "############`#####`##`#####`############",
+       "############`##``````````##`############",
+       "############`##`###==###`##`############",
+       "############`##`########`##`############",
+       "############````########````############",
+       "############`##`########`##`############",
+       "############`##`########`##`############",
+        "############`##``````````##`############",
+        "############`##`########`##`############",
+       "############`##`########`##`############",
+        "#######````````````##````````````#######",
+       "#######`####`#####`##`#####`####`#######",
+       "#######`####`#####`##`#####`####`#######",
+       "#######```##````````````````##```#######",
+       "#########`##`##`########`##`##`#########",
+       "#########`##`##`########`##`##`#########",
+       "#######``````##````##````##``````#######",
+       "#######`##########`##`##########`#######",
+       "#######`##########`##`##########`#######",
+       "#######``````````````````````````#######",
+       "########################################"};
+
+#define TILEWIDTH 5U
+#define TILEHEIGHT 5U
+#define TILES_COUNT 11U
+
+#define GO_UP 0x0001U
+#define GO_LEFT 0x0002U
+#define GO_RIGHT 0x0004U
+#define GO_DOWN 0x0008U
+
+/* This are tiles which can be places to create a level. */
+static struct {
+       char block[TILEWIDTH * TILEHEIGHT + 1];
+       unsigned dirvec[4];
+        unsigned ndirs;
+       unsigned simular_to;
+} tiles[TILES_COUNT] = { 
+/*   
+ *   ' ' == dont care == BLOCK_EMPTY
+ *   '#' == set wall, and not clear == BLOCK_WALL
+ *   '`' == clear == BLOCK_DOT_1
+ *   middle position is always set as cleardef
+ */
+  {    "  #  "
+       "  #  "
+       " ``` "
+       "  #  "
+       "  #  ", 
+        { GO_LEFT, GO_RIGHT, 0, 0 }, 2,
+       (unsigned) (1 << 0 | 1 << 6 | 1 << 8 | 1 << 10) },
+  {     "     "
+       "  `  "
+       "##`##"
+       "  `  "
+       "     ", 
+        { GO_UP, GO_DOWN, 0, 0 }, 2,
+       (unsigned) (1 << 1 | 1 << 7 | 1 << 9 | 1 << 10) },
+  {    "   ##"
+       "##`##"
+       "##`` "
+       "#### "
+       "#### ", 
+        { GO_UP, GO_RIGHT, 0, 0 }, 2,
+       (unsigned) (1 << 2 | 1 << 6 | 1 << 7 | 1 << 10) },
+  {    "#### "
+       "#### "
+       "##`` "
+       "##`##"
+       "   ##", 
+        { GO_RIGHT, GO_DOWN, 0, 0 }, 2,
+       (unsigned) (1 << 3 | 1 << 7 | 1 << 8 | 1 << 10) },
+  {    "  ###"
+       "  ###"
+       " ``##"
+       "##`  "
+       "##   ",
+        { GO_LEFT, GO_DOWN, 0, 0 }, 2,
+       (unsigned) (1 << 4 | 1 << 8 | 1 << 9 | 1 << 10) },
+  {    "##   "
+       "##`##"
+       " ``##"
+       " ####"
+       " ####",
+        { GO_LEFT, GO_UP, 0, 0 }, 2,
+       (unsigned) (1 << 5 | 1 << 6 | 1 << 9 | 1 << 10) },
+  {    "##`##"
+       "##`##"
+       "`````"
+       " ### "
+       " ### ",
+        { GO_LEFT, GO_UP, GO_RIGHT, 0 }, 3,
+       (unsigned) 1 << 6 },
+  {    "  `##"
+        "##`##"
+        "##```"
+        "##`##"
+        "  `##",
+        { GO_UP, GO_RIGHT, GO_DOWN, 0}, 3,
+       (unsigned) (1 << 7) },
+  {    " ### "
+        " ### "
+        "`````"
+        "##`##"
+        "##`##",
+        { GO_LEFT, GO_RIGHT, GO_DOWN, 0}, 3, 
+       (unsigned) (1 << 8) },
+  {    "##`  "
+        "##`##"
+        "```##"
+        "##`##"
+        "##`  ",
+        { GO_UP, GO_DOWN, GO_LEFT, 0 }, 3,
+       (unsigned) (1 << 9) },
+  {    "##`##"
+        "##`##"
+        "`````"
+        "##`##"
+        "##`##",
+        { GO_UP, GO_DOWN, GO_LEFT, GO_RIGHT }, 4,
+       (unsigned) (1 << 10) }
+};
+
+/* probability array for each of the tiles */
+#define MAXTILEPROB 22
+static const unsigned tileprob[MAXTILEPROB] =
+       { 0, 0, 0, 1, 1, 2, 3, 4, 5, 6, 6, 6, 7, 7, 8, 8, 8, 9, 9, 10, 10, 10 };
+
+/* Sets a block in the level to a certain state. */
+static void 
+setblockto(lev_t *level, const unsigned x, const unsigned y, 
+               const char c) 
+{
+       if (!(x < LEVWIDTH && y < LEVHEIGHT)) return;
+       (*level)[y][x] = c;
+}
+
+/* check if a block is set */
+static int 
+checkset(lev_t *level, const unsigned x, const unsigned y) 
+{
+       if (!(x < LEVWIDTH && y < LEVHEIGHT) ||
+                       (*level)[y][x] == BLOCK_WALL || 
+                       (*level)[y][x] == BLOCK_GHOST_ONLY)
+               return True;
+       return False;
+}
+
+/* Check if a block is not set */
+static int 
+checksetout(lev_t *level, const unsigned x, const unsigned y) 
+{
+       if (!(x < LEVWIDTH && y < LEVHEIGHT) ||
+                       checkset(level, x, y) != 0)
+               return True;
+
+       return False;
+}
+
+/* Check if a block cannot be set */
+static int 
+checkunsetdef(lev_t *level, const unsigned x, const unsigned y) 
+{
+       if (!(x < LEVWIDTH && y < LEVHEIGHT))
+               return False;
+        if ((*level)[y][x] == BLOCK_DOT_1) return True;
+        return False;
+}
+
+/* Initializes a level to empty state. */
+static void 
+clearlevel(lev_t *level) 
+{
+        unsigned x, y;
+
+        for (y = 0; y < LEVHEIGHT ; y++)
+                for (x = 0 ; x < LEVWIDTH ; x++)
+                        (*level)[y][x] = BLOCK_EMPTY;
+}
+
+/* Changes a level from the level creation structure ((array to array) to
+   array. */
+static void
+copylevel(char *dest, lev_t *level) 
+{
+       unsigned x, y;
+
+       for (y = 0; y < LEVHEIGHT ; y++)
+               for (x = 0; x < LEVWIDTH ; x++)
+                       dest[y * LEVWIDTH + x] = (*level)[y][x];
+}
+
+/* Creates a jail to work around, so we can finish it later. */
+static void 
+createjail(lev_t *level, const unsigned width, 
+               const unsigned height) 
+{
+        unsigned x, y, xstart, xend, ystart, yend;
+
+       if (LEVWIDTH < width || LEVHEIGHT < height) return;
+
+        xstart = LEVWIDTH/2 - width/2;
+        xend = LEVWIDTH/2 + width/2;
+        ystart = LEVHEIGHT/2 - height/2;
+        yend = LEVHEIGHT/2 + height/2;
+
+        for (y = ystart - 1; y < yend + 1; y++)
+                for (x = xstart - 1; x < xend + 1; x++)
+                        setblockto(level, x, y, BLOCK_DOT_1);
+
+        for (y = ystart; y < yend; y++)
+                for (x = xstart; x < xend; x++)
+                        setblockto(level, x, y, BLOCK_WALL);
+}
+
+/* Finishes a jail so it is empty and the ghostpass is on top. */
+static void 
+finishjail(lev_t *level, const unsigned width, 
+               const unsigned height) 
+{
+        unsigned x, y, xstart, xend, ystart, yend;
+
+        xstart = LEVWIDTH/2 - width/2;
+        xend = LEVWIDTH/2 + width/2;
+        ystart = LEVHEIGHT/2 - height/2;
+        yend = LEVHEIGHT/2 + height/2;
+
+        for (y = ystart + 1; y < yend - 1 ; y++)
+                for (x = xstart + 1; x < xend - 1; x++)
+                        setblockto(level, x, y, BLOCK_EMPTY);
+
+       for (x = xstart - 1; x < xend + 1; x++) {
+               setblockto(level, x, ystart - 1, BLOCK_EMPTY);
+               setblockto(level, x, yend, BLOCK_EMPTY);
+       }
+
+       for (y = ystart - 1; y < yend + 1; y++) {
+               setblockto(level, xstart - 1, y, BLOCK_EMPTY);
+               setblockto(level, xend, y, BLOCK_EMPTY);
+       }
+
+        setblockto(level, xstart + width/2 - 1, ystart, BLOCK_GHOST_ONLY);
+        setblockto(level, xstart + width/2, ystart, BLOCK_GHOST_ONLY);
+}
+
+/* Tries to set a block at a certain position. Returns true if possible,
+    and leaves level in new state (plus block), or False if not possible,
+    and leaves level in unpredictable state. */
+static int 
+tryset(lev_t *level, const unsigned xpos, const unsigned ypos, 
+               const char *block) 
+{
+        register unsigned x, y;
+        register char locchar;
+        int xstart, ystart;
+       unsigned xend, yend;
+
+        if ((*level)[ypos][xpos] == BLOCK_DOT_1) return False;
+
+        xstart = xpos - 2;
+        ystart = ypos - 2;
+
+        for (y = 0 ; y < TILEHEIGHT ; y++)
+                for (x = 0 ; x < TILEWIDTH ; x++) {
+                        locchar = block[y * TILEWIDTH + x];
+                        if (locchar == BLOCK_EMPTY)
+                                continue;
+                        if (locchar == BLOCK_DOT_1 &&
+                             (xstart + x < 1 ||
+                              xstart + x >= LEVWIDTH - 1 ||
+                              ystart + y < 1 ||
+                              ystart + y >= LEVHEIGHT - 1 ||
+                              checkset(level, xstart + x, ystart + y) != 0))
+                                return False;
+                        else if (locchar == BLOCK_WALL &&
+                                (xstart + x > 1 &&
+                                 xstart + x < LEVWIDTH &&
+                                 ystart + y > 1 &&
+                                 ystart + y < LEVHEIGHT - 1) &&
+                                 checkunsetdef(level, 
+                                        (unsigned)(xstart + x), 
+                                        (unsigned)(ystart + y)) != 0)
+                                return False;
+                }
+
+        /* and set the block in place */
+
+        xend = (xstart + TILEWIDTH < LEVWIDTH - 1) ? 
+                TILEWIDTH : LEVWIDTH - xstart - 2;
+        yend = (ystart + TILEHEIGHT < LEVHEIGHT - 1) ?
+                TILEHEIGHT : LEVHEIGHT - ystart - 2;
+
+        for (y = (ystart < 1) ? (unsigned)(1 - ystart) : 0U ; 
+                        y < yend ; y++)
+                for (x = (xstart < 1) ? 
+                               (unsigned)(1 - xstart) : 0U ; 
+                      x < xend ; x++) {
+                        locchar = block[y * TILEWIDTH + x];
+                       if ((locchar == BLOCK_WALL) &&
+                            ((*level)[ystart + y][xstart + x] == BLOCK_EMPTY)) {
+                                (*level)[ystart + y][xstart + x] = BLOCK_WALL;
+                                (*level)[ystart + y]
+                                       [LEVWIDTH - (xstart + x + 1)] = 
+                                               BLOCK_WALL;
+                        }
+                }
+
+        (*level)[ypos][xpos] = BLOCK_DOT_1;
+        (*level)[ypos][LEVWIDTH-xpos-1] = BLOCK_DOT_1;
+
+        return True;
+}
+
+/* Tries certain combinations of blocks in the level recursively. */
+static unsigned
+nextstep(lev_t *level, const unsigned x, const unsigned y, 
+               unsigned dirvec[], unsigned ndirs) 
+{
+        unsigned dirpos, curdir, inc = 0;
+       int ret = 0;
+
+        while (ndirs > 0) {
+               ndirs--;
+                if (ndirs == 0) {
+                        curdir = dirvec[0];
+                }
+                else {
+                        dirpos = NRAND(ndirs);
+                        curdir = dirvec[dirpos];
+                       /* nope, no bufoverflow, but ndirs - 1 + 1 */
+                        dirvec[dirpos] = dirvec[ndirs];
+                        dirvec[ndirs] = curdir;
+                }
+
+                switch (curdir) {
+                   case GO_UP:
+                        if (y < 1 || 
+                                (ret = creatlevelblock(level, x, y - 1)) 
+                                        == 0)
+                                return 0;
+                        break;
+                   case GO_RIGHT:
+                        if (x > LEVWIDTH - 2 || 
+                                (ret = creatlevelblock(level, x + 1, y))
+                                        == 0)
+                                return 0;
+                        break;
+                   case GO_DOWN:
+                        if (y > LEVHEIGHT - 2 ||
+                                (ret = creatlevelblock(level, x, y + 1))
+                                        == 0)
+                                return 0;
+                        break;
+                   case GO_LEFT:
+                        if (x < 1 || 
+                                (ret = creatlevelblock(level, x - 1, y))
+                                        == 0)
+                                return 0;
+                }
+               if (ret != -1)
+                       inc += (unsigned)ret;
+        }
+       if (inc == 0) inc = 1;
+        return inc; 
+}
+
+static int 
+creatlevelblock(lev_t *level, const unsigned x, const unsigned y) 
+{
+        unsigned tried = GETNB(TILES_COUNT);
+        unsigned tilenr;
+       unsigned ret;
+        lev_t savedlev;
+
+        if (!((x < LEVWIDTH) && (y < LEVHEIGHT)))
+                return 0;
+
+        if (checkunsetdef(level, x, y) != 0)
+                return -1;
+
+        if (x == 0)
+               tried &= ~(1<<0);
+        else if (x == 1)
+               tried &= ~(1<<4 | 1<<5 | 1<<6 | 1<<8 | 1<<9 | 1<<10);
+        else if (x == LEVWIDTH-1)
+               tried &= ~(1<<0);
+        else if (x == LEVWIDTH-2)
+               tried &= ~(1<<2 | 1<<3 | 1<<6 | 1<<7 | 1<<8 | 1<<10);
+
+        if (y == 1) 
+               tried &= ~(1<<2 | 1<<5 | 1<<6 | 1<<7 | 1<<9 | 1<<10);
+        else if (y == 0)
+               tried &= ~(1<<1);
+        else if (y == LEVHEIGHT-1)
+               tried &= ~(1<<1);
+        else if (y == LEVHEIGHT-2)
+               tried &= ~(1<<3 | 1<<4 | 1<<7 | 1<<8 | 1<<9 | 1<<10);
+
+       /* make a copy of the current level, so we can go back on the stack */
+        (void) memcpy(&savedlev, level, sizeof(lev_t));
+
+        /* while there are still some blocks left to try */
+        while (tried != 0x00) {
+                tilenr = tileprob[NRAND(MAXTILEPROB)];
+
+                if (!TESTNB(tried, tilenr))
+                        continue;
+
+               if (tryset(level, x, y, tiles[tilenr].block) != 0) {
+                       if ((ret = nextstep(level, x, y, tiles[tilenr].dirvec,
+                                       tiles[tilenr].ndirs)) != 0) {
+                               return ret + 1;
+                       }
+                       (void) memcpy(level, &savedlev, sizeof(lev_t));
+               }
+               tried &= ~(tiles[tilenr].simular_to);
+       }
+        return 0;
+}
+
+/* Fills up all empty space so there is wall everywhere. */
+static void 
+filllevel(lev_t *level) 
+{
+        unsigned x, y;
+
+        for (y = 0; y < LEVHEIGHT; y++)
+                for (x = 0; x < LEVWIDTH; x++)
+                        if ((*level)[y][x] == BLOCK_EMPTY) 
+                               (*level)[y][x] = BLOCK_WALL;
+}
+
+/* Changes a level from a simple wall/nowall to a wall with rounded corners
+   and such.  Stupid algorithm, could be done better! */
+static void 
+frmtlevel(lev_t *level) 
+{
+        lev_t frmtlev;
+        register unsigned x, y;
+        register unsigned poscond;
+        register unsigned poscond2;
+
+        clearlevel(&frmtlev);
+
+        for (y = 0; y < LEVHEIGHT; y++)
+                for (x = 0; x < LEVWIDTH; x++) {
+
+                        if (checkset(level, x, y) == 0) {
+                                frmtlev[y][x] = BLOCK_DOT_2;
+                                continue;
+                        }
+
+                       if ((*level)[y][x] == BLOCK_GHOST_ONLY) {
+                               frmtlev[y][x] = BLOCK_GHOST_ONLY;       
+                               continue;
+                       }
+
+                        poscond = 
+                                 (checksetout(level, x - 1, y - 1) != 0 ? 
+                                         0x01U : 0U) |
+                                 (checksetout(level, x + 1, y - 1) != 0 ?
+                                         0x02U : 0U) |
+                                 (checksetout(level, x + 1, y + 1) != 0 ?
+                                         0x04U : 0U) |
+                                 (checksetout(level, x - 1, y + 1) != 0 ?
+                                         0x08U : 0U);
+
+                        poscond2 = 
+                                (checksetout(level, x - 1, y) != 0 ?
+                                        0x01U : 0) |
+                                (checksetout(level, x, y - 1) != 0 ?
+                                        0x02U : 0) |
+                                (checksetout(level, x + 1, y) != 0 ?
+                                        0x04U : 0) |
+                                (checksetout(level, x, y + 1) != 0 ?
+                                        0x08U : 0);
+
+                        switch (poscond) {
+                                /* completely filled */
+                                case 0x01U | 0x02U | 0x04U | 0x08U:
+                                        frmtlev[y][x] = BLOCK_EMPTY; continue;
+
+                                /* left to top corner */
+                                case 0x01U:
+                                        frmtlev[y][x] = BLOCK_WALL_TL; continue;
+                                /* top to right corner */
+                                case 0x02U:
+                                        frmtlev[y][x] = BLOCK_WALL_TR; continue;
+                                /* right to bottom corner */
+                                case 0x04U:
+                                        frmtlev[y][x] = BLOCK_WALL_BR; continue;
+                                /* bottom to left corner */
+                                case 0x08U:
+                                        frmtlev[y][x] = BLOCK_WALL_BL; continue;
+                        }
+
+                        switch (poscond2) {
+                                case 0x01U | 0x04U:
+                                case 0x01U | 0x04U | 0x08U:
+                                case 0x01U | 0x04U | 0x02U:
+                                        frmtlev[y][x] = BLOCK_WALL_HO; continue;
+                                case 0x02U | 0x08U:
+                                case 0x02U | 0x08U | 0x01U:
+                                case 0x02U | 0x08U | 0x04U:
+                                        frmtlev[y][x] = BLOCK_WALL_VE; continue;
+                                case 0x01U | 0x02U:
+                                        frmtlev[y][x] = BLOCK_WALL_TL; continue;
+                                case 0x02U | 0x04U:
+                                        frmtlev[y][x] = BLOCK_WALL_TR; continue;
+                                case 0x04U | 0x08U:
+                                        frmtlev[y][x] = BLOCK_WALL_BR; continue;
+                                case 0x08U | 0x01U:
+                                        frmtlev[y][x] = BLOCK_WALL_BL; continue;
+                        }
+                        switch (poscond) {
+                                case 0x02U | 0x04U | 0x08U:
+                                        frmtlev[y][x] = BLOCK_WALL_TL; continue;
+                                case 0x01U | 0x04U | 0x08U:
+                                        frmtlev[y][x] = BLOCK_WALL_TR; continue;
+                                case 0x01U | 0x02U | 0x08U:
+                                        frmtlev[y][x] = BLOCK_WALL_BR; continue;
+                                case 0x01U | 0x02U | 0x04U:
+                                        frmtlev[y][x] = BLOCK_WALL_BL; continue;
+                        }
+                        frmtlev[y][x] = BLOCK_EMPTY;
+                }
+        (void) memcpy((lev_t *)level, (lev_t *)&frmtlev, sizeof(lev_t));
+}
+
+/* Counts the number of dots in the level, and returns that number. */
+static unsigned
+countdots(ModeInfo * mi)
+{
+       pacmangamestruct *pp = &pacmangames[MI_SCREEN(mi)];
+       unsigned i, count = 0;
+
+       for (i = 0 ; i < LEVWIDTH*LEVHEIGHT ; i++)
+               if (pp->level[i] == BLOCK_DOT_2) count++;
+
+       return count;
+}
+
+/* Creates a new level, and places that in the pacmangamestruct. */
+static int
+createnewlevel(ModeInfo * mi)
+{
+       pacmangamestruct *pp = &pacmangames[MI_SCREEN(mi)];
+       lev_t *level;
+       unsigned dirvec[1] = { GO_UP };
+       unsigned ret = 0, i = 0;
+
+       if ((level = (lev_t *)calloc(1, sizeof(lev_t))) == NULL)
+               return i;
+
+       if (NRAND(2) == 0) {
+
+               do {
+                       clearlevel(level);
+                       createjail(level, JAILWIDTH, JAILHEIGHT);
+                       if ((ret = nextstep(level, LEVWIDTH/2 - 1,
+                                           LEVHEIGHT/2 - JAILHEIGHT/2 - 3, 
+                                           dirvec, 1)) == 0) {
+                               (void) free((void *) level);
+                               return i;
+                       }
+               } while (ret * 100 < (LEVWIDTH * LEVHEIGHT * MINDOTPERC));
+
+               filllevel(level);
+               frmtlevel(level);
+               finishjail(level, JAILWIDTH, JAILHEIGHT);
+       } else {
+               (void) memcpy(level, stdlevel, sizeof(lev_t));
+               frmtlevel(level);
+               i = 1;
+       }
+       copylevel(pp->level, level);
+       pp->dotsleft = countdots(mi);
+
+       (void) free((void *) level);
+       return i;
+}
+
+/* Checks if a position is allowable for ghosts/pacs to enter. */
+static int
+check_pos(pacmangamestruct *pp, int y, int x, int ghostpass) 
+{
+       if ((pp->level[y*LEVWIDTH + x] == BLOCK_DOT_2) ||
+           (pp->level[y*LEVWIDTH + x] == BLOCK_EMPTY) ||
+          ((pp->level[y*LEVWIDTH + x] == BLOCK_GHOST_ONLY) && ghostpass)) {
+               return 1;
+       }
+       return 0;
+}
+
+/* Checks if there is a dot on the specified position in the level. */
+static int 
+check_dot(pacmangamestruct *pp, unsigned int x, unsigned int y) 
+{
+       if (x >= LEVWIDTH || y >= LEVHEIGHT) return 0;
+       if (pp->level[y * LEVWIDTH + x] == BLOCK_DOT_2) return 1;
+       return 0;
+}
index 03e93ac9c51233bb8b52b10cfa65f5c58ef53b31..e83822144b77346801fe1e0ea19d9a5b2114f77e 100644 (file)
@@ -108,7 +108,7 @@ static XrmOptionDescRec opts[] =
 };
 static argtype vars[] =
 {
-       {(caddr_t *) & ammann, (char *) "ammann", (char *) "Ammann", (char *) DEF_AMMANN, t_Bool}
+       {&ammann, "ammann", "Ammann", DEF_AMMANN, t_Bool}
 };
 static OptionStruct desc[] =
 {
index 8ba63dd28390b4f467474981837dcf5d06c8f5f7..5132cadd8001cf9c26117a207d52bf7b4cbac85d 100644 (file)
@@ -1,4 +1,4 @@
-/* xscreensaver, Copyright (c) 1999, 2000 Jamie Zawinski <jwz@jwz.org>
+/* xscreensaver, Copyright (c) 1999, 2000, 2004 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
@@ -9,14 +9,27 @@
  * implied warranty.
  *
  * Phosphor -- simulate a glass tty with long-sustain phosphor.
+ * Written by Jamie Zawinski <jwz@jwz.org>
+ * Pty and vt100 emulation by Fredrik Tolf <fredrik@dolda2000.com>
  */
 
 #include "screenhack.h"
+
 #include <stdio.h>
+#include <signal.h>
+#include <sys/wait.h>
+
 #include <X11/Xutil.h>
 #include <X11/Xatom.h>
 #include <X11/Intrinsic.h>
 
+#define XK_MISCELLANY
+#include <X11/keysymdef.h>
+
+#ifdef HAVE_FORKPTY
+# include <pty.h>
+#endif /* HAVE_FORKPTY */
+
 extern XtAppContext app;
 
 #define FUZZY_BORDER
@@ -32,6 +45,8 @@ extern XtAppContext app;
 
 #define CURSOR_INDEX 128
 
+#define NPAR 16
+
 typedef struct {
   unsigned char name;
   int width, height;
@@ -55,8 +70,14 @@ typedef struct {
   XFontStruct *font;
   int grid_width, grid_height;
   int char_width, char_height;
+  int saved_x, saved_y;
   int scale;
   int ticks;
+  int mode;
+  pid_t pid;
+  int escstate;
+  int csiparam[NPAR];
+  int curparam;
   p_char **chars;
   p_cell *cells;
   XGCValues gcv;
@@ -76,6 +97,9 @@ typedef struct {
   XtInputId pipe_id;
   Bool input_available_p;
   Time subproc_relaunch_delay;
+  XComposeStatus compose;
+  Bool meta_sends_esc_p;
+  Bool swap_bs_del_p;
 
 } p_state;
 
@@ -129,6 +153,10 @@ init_phosphor (Display *dpy, Window window)
   state->window = window;
 
   XGetWindowAttributes (dpy, window, &state->xgwa);
+  XSelectInput (dpy, window, state->xgwa.your_event_mask | ExposureMask);
+
+  state->meta_sends_esc_p = get_boolean_resource ("metaSendsESC", "Boolean");
+  state->swap_bs_del_p    = get_boolean_resource ("swapBSDEL",    "Boolean");
 
   state->font = XLoadQueryFont (dpy, fontname);
 
@@ -146,6 +174,25 @@ init_phosphor (Display *dpy, Window window)
   font = state->font;
   state->scale = get_integer_resource ("scale", "Integer");
   state->ticks = STATE_MAX + get_integer_resource ("ticks", "Integer");
+  state->escstate = 0;
+
+  {
+    char *s = get_string_resource ("mode", "Integer");
+    state->mode = 0;
+    if (!s || !*s || !strcasecmp (s, "pipe"))
+      state->mode = 0;
+    else if (!strcasecmp (s, "pty"))
+      state->mode = 1;
+    else
+      fprintf (stderr, "%s: mode must be either `pipe' or `pty', not `%s'\n",
+               progname, s);
+
+#ifndef HAVE_FORKPTY
+    fprintf (stderr, "%s: no pty support on this system; using -pipe mode.\n",
+             progname);
+    state->mode = 0;
+#endif /* HAVE_FORKPTY */
+  }
 
 #if 0
   for (i = 0; i < font->n_properties; i++)
@@ -250,6 +297,48 @@ init_phosphor (Display *dpy, Window window)
 }
 
 
+/* Re-query the window size and update the internal character grid if changed.
+ */
+static void
+resize_grid (p_state *state)
+{
+  int ow = state->grid_width;
+  int oh = state->grid_height;
+  p_cell *ocells = state->cells;
+  int x, y;
+
+  XGetWindowAttributes (state->dpy, state->window, &state->xgwa);
+
+  state->grid_width = state->xgwa.width   /(state->char_width  * state->scale);
+  state->grid_height = state->xgwa.height /(state->char_height * state->scale);
+
+  if (ow == state->grid_width &&
+      oh == state->grid_height)
+    return;
+
+  state->cells = (p_cell *) calloc (sizeof(p_cell),
+                                    state->grid_width * state->grid_height);
+
+  for (y = 0; y < state->grid_height; y++)
+    {
+      for (x = 0; x < state->grid_width; x++)
+        {
+          p_cell *ncell = &state->cells [state->grid_width * y + x];
+          if (x < ow && y < oh)
+            *ncell = ocells [ow * y + x];
+          ncell->changed = True;
+        }
+    }
+
+  if (state->cursor_x >= state->grid_width)
+    state->cursor_x = state->grid_width-1;
+  if (state->cursor_y >= state->grid_height)
+    state->cursor_y = state->grid_height-1;
+
+  free (ocells);
+}
+
+
 static void
 capture_font_bits (p_state *state)
 {
@@ -567,9 +656,11 @@ static void
 print_char (p_state *state, int c)
 {
   static char last_c = 0;
+  static int bk;
 
   p_cell *cell = &state->cells[state->grid_width * state->cursor_y
-                              + state->cursor_x];
+                              + state->cursor_x];
+  int i, start, end;
 
   /* Start the cursor fading (in case we don't end up overwriting it.) */
   if (cell->state == FLARE || cell->state == NORMAL)
@@ -577,46 +668,386 @@ print_char (p_state *state, int c)
       cell->state = FADE;
       cell->changed = True;
     }
-
-  if (c == '\t') c = ' ';   /* blah. */
-
-  if (c == '\r' || c == '\n')
-    {
-      if (c == '\n' && last_c == '\r')
-        ;   /* CRLF -- do nothing */
-      else
-        {
-          state->cursor_x = 0;
-          if (state->cursor_y == state->grid_height - 1)
-            scroll (state);
-          else
-            state->cursor_y++;
-        }
-    }
-  else if (c == '\014')
+  
+  if (state->pid)  /* Only interpret VT100 sequences if running in pty-mode.
+                      It would be nice if we could just interpret them all
+                      the time, but that would require subprocesses to send
+                      CRLF line endings instead of bare LF, so that's no good.
+                    */
     {
-      clear (state);
+      switch (state->escstate)
+       {
+       case 0:
+         switch (c)
+           {
+           case 7: /* BEL */
+             /* Dummy case - we don't want the screensaver to beep */
+              /* #### But maybe this should flash the screen? */
+             break;
+           case 8: /* BS */
+             if (state->cursor_x > 0)
+               state->cursor_x--;
+             break;
+           case 9: /* HT */
+             if (state->cursor_x < state->grid_width - 8)
+               {
+                 state->cursor_x = (state->cursor_x & ~7) + 8;
+               }
+             else
+               {
+                 state->cursor_x = 0;
+                 if (state->cursor_y < state->grid_height - 1)
+                   state->cursor_y++;
+                 else
+                   scroll (state);
+               }
+             break;
+           case 10: /* LF */
+           case 11: /* VT */
+           case 12: /* FF */
+             if(last_c == 13)
+               {
+                 cell->state = NORMAL;
+                 cell->p_char = state->chars[bk];
+                 cell->changed = True;
+               }
+             if (state->cursor_y < state->grid_height - 1)
+               state->cursor_y++;
+             else
+               scroll (state);
+             break;
+           case 13: /* CR */
+             state->cursor_x = 0;
+             cell = &state->cells[state->grid_width * state->cursor_y];
+             if((cell->p_char == NULL) || (cell->p_char->name == CURSOR_INDEX))
+               bk = ' ';
+             else
+               bk = cell->p_char->name;
+             break;
+           case 14: /* SO */
+           case 15: /* SI */
+             /* Dummy case - I don't want to load several fonts for
+                the maybe two programs world-wide that use that */
+             break;
+           case 24: /* CAN */
+           case 26: /* SUB */
+             /* Dummy case - these interrupt escape sequences, so
+                they don't do anything in this state */
+             break;
+           case 27: /* ESC */
+             state->escstate = 1;
+             break;
+           case 127: /* DEL */
+             /* Dummy case - this is supposed to be ignored */
+             break;
+           case 155: /* CSI */
+             state->escstate = 2;
+             for(i = 0; i < NPAR; i++)
+               state->csiparam[i] = 0;
+             state->curparam = 0;
+             break;
+           default:
+             cell->state = FLARE;
+             cell->p_char = state->chars[c];
+             cell->changed = True;
+             state->cursor_x++;
+
+             if (c != ' ' && cell->p_char->blank_p)
+               cell->p_char = state->chars[CURSOR_INDEX];
+
+             if (state->cursor_x >= state->grid_width - 1)
+               {
+                 state->cursor_x = 0;
+                 if (state->cursor_y >= state->grid_height - 1)
+                   scroll (state);
+                 else
+                   state->cursor_y++;
+               }
+             break;
+           }
+         break;
+       case 1:
+         switch (c)
+           {
+           case 24: /* CAN */
+           case 26: /* SUB */
+             state->escstate = 0;
+             break;
+           case 'c': /* Reset */
+             clear (state);
+             state->escstate = 0;
+             break;
+           case 'D': /* Linefeed */
+             if (state->cursor_y < state->grid_height - 1)
+               state->cursor_y++;
+             else
+               scroll (state);
+             state->escstate = 0;
+             break;
+           case 'E': /* Newline */
+             state->cursor_x = 0;
+             state->escstate = 0;
+             break;
+           case 'M': /* Reverse newline */
+             if (state->cursor_y > 0)
+               state->cursor_y--;
+             state->escstate = 0;
+             break;
+           case '7': /* Save state */
+             state->saved_x = state->cursor_x;
+             state->saved_y = state->cursor_y;
+             state->escstate = 0;
+             break;
+           case '8': /* Restore state */
+             state->cursor_x = state->saved_x;
+             state->cursor_y = state->saved_y;
+             state->escstate = 0;
+             break;
+           case '[': /* CSI */
+             state->escstate = 2;
+             for(i = 0; i < NPAR; i++)
+               state->csiparam[i] = 0;
+             state->curparam = 0;
+             break;
+           case '%': /* Select charset */
+             /* No, I don't support UTF-8, since the phosphor font
+                isn't even Unicode anyway. We must still catch the
+                last byte, though. */
+           case '(':
+           case ')':
+             /* I don't support different fonts either - see above
+                for SO and SI */
+             state->escstate = 3;
+             break;
+           default:
+             /* Escape sequences not supported:
+              * 
+              * H - Set tab stop
+              * Z - Terminal identification
+              * > - Keypad change
+              * = - Other keypad change
+              * ] - OS command
+              */
+             state->escstate = 0;
+             break;
+           }
+         break;
+       case 2:
+         switch (c)
+           {
+           case 24: /* CAN */
+           case 26: /* SUB */
+             state->escstate = 0;
+             break;
+            case '0': case '1': case '2': case '3': case '4':
+            case '5': case '6': case '7': case '8': case '9':
+             if (state->curparam < NPAR)
+               state->csiparam[state->curparam] = (state->csiparam[state->curparam] * 10) + (c - '0');
+             break;
+           case ';':
+             state->csiparam[++state->curparam] = 0;
+             break;
+           case '[':
+             state->escstate = 3;
+             break;
+           case '@':
+             for (i = 0; i < state->csiparam[0]; i++)
+               {
+                 if(++state->cursor_x > state->grid_width)
+                   {
+                     state->cursor_x = 0;
+                     if (state->cursor_y < state->grid_height - 1)
+                       state->cursor_y++;
+                     else
+                       scroll (state);
+                   }
+                 cell = &state->cells[state->grid_width * state->cursor_y + state->cursor_x];
+                 if (cell->state == FLARE || cell->state == NORMAL)
+                   {
+                     cell->state = FADE;
+                     cell->changed = True;
+                   }
+               }
+             state->escstate = 0;
+             break;
+           case 'F':
+             state->cursor_x = 0;
+           case 'A':
+             if (state->csiparam[0] == 0)
+               state->csiparam[0] = 1;
+             if ((state->cursor_y -= state->csiparam[0]) < 0)
+               state->cursor_y = 0;
+             state->escstate = 0;
+             break;
+           case 'E':
+             state->cursor_x = 0;
+           case 'e':
+           case 'B':
+             if (state->csiparam[0] == 0)
+               state->csiparam[0] = 1;
+             if ((state->cursor_y += state->csiparam[0]) >= state->grid_height - 1)
+               state->cursor_y = state->grid_height - 1;
+             state->escstate = 0;
+             break;
+           case 'a':
+           case 'C':
+             if (state->csiparam[0] == 0)
+               state->csiparam[0] = 1;
+             if ((state->cursor_x += state->csiparam[0]) >= state->grid_width - 1)
+               state->cursor_x = state->grid_width - 1;
+             state->escstate = 0;
+             break;
+           case 'D':
+             if (state->csiparam[0] == 0)
+               state->csiparam[0] = 1;
+             if ((state->cursor_x -= state->csiparam[0]) < 0)
+               state->cursor_x = 0;
+             state->escstate = 0;
+             break;
+           case 'd':
+             if ((state->cursor_y = (state->csiparam[0] - 1)) >= state->grid_height - 1)
+               state->cursor_y = state->grid_height - 1;
+             state->escstate = 0;
+             break;
+           case '`':
+           case 'G':
+             if ((state->cursor_x = (state->csiparam[0] - 1)) >= state->grid_width - 1)
+               state->cursor_x = state->grid_width - 1;
+             state->escstate = 0;
+             break;
+           case 'f':
+           case 'H':
+             if ((state->cursor_y = (state->csiparam[0] - 1)) >= state->grid_height - 1)
+               state->cursor_y = state->grid_height - 1;
+             if ((state->cursor_x = (state->csiparam[1] - 1)) >= state->grid_width - 1)
+               state->cursor_x = state->grid_width - 1;
+             if(state->cursor_y < 0)
+               state->cursor_y = 0;
+             if(state->cursor_x < 0)
+               state->cursor_x = 0;
+             state->escstate = 0;
+             break;
+           case 'J':
+             start = 0;
+             end = state->grid_height * state->grid_width;
+             if (state->csiparam[0] == 0)
+               start = state->grid_width * state->cursor_y + state->cursor_x;
+             if (state->csiparam[0] == 1)
+               end = state->grid_width * state->cursor_y + state->cursor_x;
+             for (i = start; i < end; i++)
+               {
+                 cell = &state->cells[i];
+                 if (cell->state == FLARE || cell->state == NORMAL)
+                   {
+                     cell->state = FADE;
+                     cell->changed = True;
+                   }
+               }
+             set_cursor (state, True);
+             state->escstate = 0;
+             break;
+           case 'K':
+             start = 0;
+             end = state->grid_width;
+             if (state->csiparam[0] == 0)
+               start = state->cursor_x;
+             if (state->csiparam[1] == 1)
+               end = state->cursor_x;
+             for (i = start; i < end; i++)
+               {
+                 if (cell->state == FLARE || cell->state == NORMAL)
+                   {
+                     cell->state = FADE;
+                     cell->changed = True;
+                   }
+                 cell++;
+               }
+             state->escstate = 0;
+             break;
+           case 's': /* Save position */
+             state->saved_x = state->cursor_x;
+             state->saved_y = state->cursor_y;
+             state->escstate = 0;
+             break;
+           case 'u': /* Restore position */
+             state->cursor_x = state->saved_x;
+             state->cursor_y = state->saved_y;
+             state->escstate = 0;
+             break;
+           case '?': /* DEC Private modes */
+             if ((state->curparam != 0) || (state->csiparam[0] != 0))
+               state->escstate = 0;
+             break;
+           default:
+             /* Known unsupported CSIs:
+              *
+              * L - Insert blank lines
+              * M - Delete lines (I don't know what this means...)
+              * P - Delete characters
+              * X - Erase characters (difference with P being...?)
+              * c - Terminal identification
+              * g - Clear tab stop(s)
+              * h - Set mode (Mainly due to its complexity and lack of good
+                     docs)
+              * l - Clear mode
+              * m - Set mode (Phosphor is, per defenition, green on black)
+              * n - Status report
+              * q - Set keyboard LEDs
+              * r - Set scrolling region (too exhausting - noone uses this,
+                     right?)
+              */
+             state->escstate = 0;
+             break;
+           }
+         break;
+       case 3:
+         state->escstate = 0;
+         break;
+       }
+      set_cursor (state, True);
     }
   else
     {
-      cell->state = FLARE;
-      cell->p_char = state->chars[c];
-      cell->changed = True;
-      state->cursor_x++;
-
-      if (c != ' ' && cell->p_char->blank_p)
-        cell->p_char = state->chars[CURSOR_INDEX];
-
-      if (state->cursor_x >= state->grid_width - 1)
-        {
-          state->cursor_x = 0;
-          if (state->cursor_y >= state->grid_height - 1)
-            scroll (state);
-          else
-            state->cursor_y++;
-        }
+      if (c == '\t') c = ' ';   /* blah. */
+
+      if (c == '\r' || c == '\n')  /* handle CR, LF, or CRLF as "new line". */
+       {
+         if (c == '\n' && last_c == '\r')
+           ;   /* CRLF -- do nothing */
+         else
+           {
+             state->cursor_x = 0;
+             if (state->cursor_y == state->grid_height - 1)
+               scroll (state);
+             else
+               state->cursor_y++;
+           }
+       }
+      else if (c == '\014')
+       {
+         clear (state);
+       }
+      else
+       {
+         cell->state = FLARE;
+         cell->p_char = state->chars[c];
+         cell->changed = True;
+         state->cursor_x++;
+
+         if (c != ' ' && cell->p_char->blank_p)
+           cell->p_char = state->chars[CURSOR_INDEX];
+
+         if (state->cursor_x >= state->grid_width - 1)
+           {
+             state->cursor_x = 0;
+             if (state->cursor_y >= state->grid_height - 1)
+               scroll (state);
+             else
+               state->cursor_y++;
+           }
+       }
+      set_cursor (state, True);
     }
-  set_cursor (state, True);
 
   last_c = c;
 }
@@ -703,23 +1134,72 @@ subproc_cb (XtPointer closure, int *source, XtInputId *id)
 static void
 launch_text_generator (p_state *state)
 {
+  char buf[255];
   char *oprogram = get_string_resource ("program", "Program");
-  char *program = (char *) malloc (strlen (oprogram) + 10);
-
-  strcpy (program, "( ");
-  strcat (program, oprogram);
-  strcat (program, " ) 2>&1");
 
-  if ((state->pipe = popen (program, "r")))
+#ifdef HAVE_FORKPTY
+  if(state->mode == 1)
     {
-      state->pipe_id =
-        XtAppAddInput (app, fileno (state->pipe),
-                       (XtPointer) (XtInputReadMask | XtInputExceptMask),
-                       subproc_cb, (XtPointer) state);
+      int fd;
+      struct winsize ws;
+      
+      ws.ws_row = state->grid_height - 1;
+      ws.ws_col = state->grid_width  - 2;
+      ws.ws_xpixel = state->xgwa.width;
+      ws.ws_ypixel = state->xgwa.height;
+      
+      state->pipe = NULL;
+      if((state->pid = forkpty(&fd, NULL, NULL, &ws)) < 0)
+       {
+          /* Unable to fork */
+          sprintf (buf, "%.100s: forkpty", progname);
+         perror(buf);
+       }
+      else if(!state->pid)
+       {
+          /* This is the child fork. */
+         if (putenv("TERM=vt100"))
+            abort();
+         execl("/bin/sh", "/bin/sh", "-c", oprogram, NULL);
+          sprintf (buf, "%.100s: %.100s", progname, oprogram);
+         perror(buf);
+         exit(1);
+       }
+      else
+       {
+          /* This is the parent fork. */
+         state->pipe = fdopen(fd, "r+");
+         state->pipe_id =
+           XtAppAddInput (app, fileno (state->pipe),
+                          (XtPointer) (XtInputReadMask | XtInputExceptMask),
+                          subproc_cb, (XtPointer) state);
+       }
     }
   else
+#endif /* HAVE_FORKPTY */
     {
-      perror (program);
+      char *program = (char *) malloc (strlen (oprogram) + 10);
+      
+      strcpy (program, "( ");
+      strcat (program, oprogram);
+      strcat (program, " ) 2>&1");
+
+      /* don't mess up controlling terminal if someone dumbly does
+         "-pipe -program tcsh". */
+      fclose (stdin);
+
+      if ((state->pipe = popen (program, "r")))
+       {
+         state->pipe_id =
+           XtAppAddInput (app, fileno (state->pipe),
+                          (XtPointer) (XtInputReadMask | XtInputExceptMask),
+                          subproc_cb, (XtPointer) state);
+       }
+      else
+       {
+          sprintf (buf, "%.100s: %.100s", progname, program);
+         perror (buf);
+       }
     }
 }
 
@@ -747,7 +1227,15 @@ drain_input (p_state *state)
         {
           XtRemoveInput (state->pipe_id);
           state->pipe_id = 0;
-          pclose (state->pipe);
+         if (state->pid)
+           {
+             waitpid(state->pid, NULL, 0);
+             fclose (state->pipe);
+           }
+         else
+           {
+             pclose (state->pipe);
+           }
           state->pipe = 0;
 
           if (state->cursor_x != 0)    /* break line if unbroken */
@@ -765,6 +1253,120 @@ drain_input (p_state *state)
 }
 
 
+/* The interpretation of the ModN modifiers is dependent on what keys
+   are bound to them: Mod1 does not necessarily mean "meta".  It only
+   means "meta" if Meta_L or Meta_R are bound to it.  If Meta_L is on
+   Mod5, then Mod5 is the one that means Meta.  Oh, and Meta and Alt
+   aren't necessarily the same thing.  Icepicks in my forehead!
+ */
+static unsigned int
+do_icccm_meta_key_stupidity (Display *dpy)
+{
+  unsigned int modbits = 0;
+  int i, j, k;
+  XModifierKeymap *modmap = XGetModifierMapping (dpy);
+  for (i = 3; i < 8; i++)
+    for (j = 0; j < modmap->max_keypermod; j++)
+      {
+        int code = modmap->modifiermap[i * modmap->max_keypermod + j];
+        KeySym *syms;
+        int nsyms = 0;
+        if (code == 0) continue;
+        syms = XGetKeyboardMapping (dpy, code, 1, &nsyms);
+        for (k = 0; k < nsyms; k++)
+          if (syms[k] == XK_Meta_L || syms[k] == XK_Meta_R ||
+              syms[k] == XK_Alt_L  || syms[k] == XK_Alt_R)
+            modbits |= (1 << i);
+        XFree (syms);
+      }
+  XFreeModifiermap (modmap);
+  return modbits;
+}
+
+/* Returns a mask of the bit or bits of a KeyPress event that mean "meta". 
+ */
+static unsigned int
+meta_modifier (Display *dpy)
+{
+  static Bool done_once = False;
+  static unsigned int mask = 0;
+  if (!done_once)
+    {
+      /* Really, we are supposed to recompute this if a KeymapNotify
+         event comes in, but fuck it. */
+      done_once = True;
+      mask = do_icccm_meta_key_stupidity (dpy);
+    }
+  return mask;
+}
+
+
+static void
+handle_events (p_state *state)
+{
+  XSync (state->dpy, False);
+  while (XPending (state->dpy))
+    {
+      XEvent event;
+      XNextEvent (state->dpy, &event);
+
+      if (event.xany.type == ConfigureNotify)
+        {
+          resize_grid (state);
+
+# if defined(HAVE_FORKPTY) && defined(TIOCSWINSZ)
+          if (state->pid)
+            {
+              /* Tell the sub-process that the screen size has changed. */
+              struct winsize ws;
+              ws.ws_row = state->grid_height - 1;
+              ws.ws_col = state->grid_width  - 2;
+              ws.ws_xpixel = state->xgwa.width;
+              ws.ws_ypixel = state->xgwa.height;
+              ioctl (fileno (state->pipe), TIOCSWINSZ, &ws);
+              kill (state->pid, SIGWINCH);
+            }
+# endif /* HAVE_FORKPTY && TIOCSWINSZ */
+        }
+      else if (event.xany.type == Expose)
+        {
+          update_display (state, False);
+        }
+      else if (event.xany.type == KeyPress)
+        {
+          KeySym keysym;
+          unsigned char c = 0;
+          XLookupString (&event.xkey, (char *) &c, 1, &keysym,
+                         &state->compose);
+          if (c != 0 && state->pipe)
+            {
+              if (!state->swap_bs_del_p) ;
+              else if (c == 127) c = 8;
+              else if (c == 8)   c = 127;
+
+              /* If meta was held down, send ESC, or turn on the high bit. */
+              if (event.xkey.state & meta_modifier (state->dpy))
+                {
+                  if (state->meta_sends_esc_p)
+                    fputc ('\033', state->pipe);
+                  else
+                    c |= 0x80;
+                }
+
+              fputc (c, state->pipe);
+              fflush (state->pipe);
+              event.xany.type = 0;  /* don't interpret this event defaultly. */
+            }
+        }
+
+      screenhack_handle_event (state->dpy, &event);
+    }
+
+  if (XtAppPending (app) & (XtIMTimer|XtIMAlternateInput))
+    XtAppProcessEvent (app, XtIMTimer|XtIMAlternateInput);
+}
+
+
 \f
 char *progclass = "Phosphor";
 
@@ -780,6 +1382,13 @@ char *defaults [] = {
   "*cursor:               333",
   "*program:            " FORTUNE_PROGRAM,
   "*relaunch:             5",
+  "*metaSendsESC:         True",
+  "*swapBSDEL:            True",
+#ifdef HAVE_FORKPTY
+  "*mode:                  pty",
+#else  /* !HAVE_FORKPTY */
+  "*mode:                  pipe",
+#endif /* !HAVE_FORKPTY */
   0
 };
 
@@ -789,6 +1398,12 @@ XrmOptionDescRec options [] = {
   { "-ticks",          ".ticks",               XrmoptionSepArg, 0 },
   { "-delay",          ".delay",               XrmoptionSepArg, 0 },
   { "-program",                ".program",             XrmoptionSepArg, 0 },
+  { "-pty",            ".mode",                XrmoptionNoArg, "pty"   },
+  { "-pipe",           ".mode",                XrmoptionNoArg, "pipe"  },
+  { "-meta",           ".metaSendsESC",        XrmoptionNoArg, "False" },
+  { "-esc",            ".metaSendsESC",        XrmoptionNoArg, "True"  },
+  { "-bs",             ".swapBSDEL",           XrmoptionNoArg, "False" },
+  { "-del",            ".swapBSDEL",           XrmoptionNoArg, "True"  },
   { 0, 0, 0, 0 }
 };
 
@@ -805,11 +1420,7 @@ screenhack (Display *dpy, Window window)
     {
       run_phosphor (state);
       XSync (dpy, False);
-      screenhack_handle_events (dpy);
-
-      if (XtAppPending (app) & (XtIMTimer|XtIMAlternateInput))
-        XtAppProcessEvent (app, XtIMTimer|XtIMAlternateInput);
-
+      handle_events (state);
       if (delay) usleep (delay);
     }
 }
index 989150ec46367b1a6d0fc3e1da49f16f11c7335b..f954c18935276713cf1846bb9015576b01bf7d8b 100644 (file)
@@ -19,10 +19,12 @@ phosphor - simulates an old terminal with long-sustain phosphor
 [\-display \fIhost:display.screen\fP] [\-window] [\-root] [\-install]
 [\-visual \fIvisual\fP] [\-font \fIfont\fP] [\-scale \fIint\fP]
 [\-ticks \fIint\fP] [\-delay \fIusecs\fP] [\-program \fIcommand\fP]
+[\-meta] [\-esc] [\-bs] [\-del]
 .SH DESCRIPTION
 The \fIphosphor\fP program draws text on the screen in a very large 
 pixelated font that looks like an old low resolution dumb tty.  The
-pixels flare and fade out as if the phosphor was very long-sustain.
+pixels flare and fade out as if the phosphor was very
+long-sustain.  It is also a fully functional vt100 terminal emulator.
 .SH OPTIONS
 .I phosphor
 accepts the following options:
@@ -55,25 +57,21 @@ The number of colors to use when fading to black.  Default 20.
 The speed of the terminal: how long to wait between drawing each character.
 Default 50000, or about 1/20th second.
 .TP 8
+.B \-pty
+Launch the sub-program under a PTY, so that it can address the screen
+directly.  This is the default.
+.TP 8
+.B \-pipe
+Launch the sub-program at the end of a pipe: do not let it address the
+screen directly.
+.TP 8
 .B \-program \fIsh-command\fP
-The command to run to generate the text to display.  This option may be
-any string acceptable to /bin/sh.  The program will be run at the end of
-a pipe, and any characters that it prints to \fIstdout\fP will be printed
-on phosphor's window.  The characters will be printed artificially slowly,
-as per the \fI\-delay\fP option above.  If the program exits, it will be
-launched again after 5 seconds.
-
-Note that phosphor is \fInot\fP a terminal emulator: programs that try to
-directly address the screen will not do what you might expect.  Phosphor
-merely draws the characters on the screen left to right, top to bottom.
-Lines wrap when they reach the right edge, and the screen scrolls when
-characters reach the bottom.
-
-In other words, programs like
-.BR fortune (1)
-will work, but programs like
-.BR top (1)
-won't.
+The command to run to generate the text to display.  This option may
+be any string acceptable to /bin/sh.  The program will be run at the
+end of a pty or pipe, and any characters that it prints to \fIstdout\fP
+will be printed on phosphor's window.  The characters will be printed
+artificially slowly, as per the \fI\-delay\fP option above.  If the
+program exits, it will be launched again after 5 seconds.
 
 For example:
 .EX
@@ -81,7 +79,48 @@ phosphor -program 'cat /usr/src/linux*/README'
 phosphor -program 'ping localhost'
 phosphor -program 'ps -e'
 phosphor -program 'od -txC -w6 /dev/random'
+phosphor -scale 2 -geom =1280x1024 -program 'top'
+phosphor -scale 4 -geom =1280x1024 \\
+         -program 'mtr www.kernel.org'
+phosphor -program 'xemacs -nw -q -f life'
+phosphor -scale 5 -geom =1280x1024 \\
+         -program 'xemacs -nw -q --eval "(hanoi 5)"'
+.EE
+You can also use \fIphosphor\fP as a lo-fi replacement for the
+.BR xterm (1)
+and
+.BR gnome-terminal (1)
+terminal emulators:
+.EX
+phosphor -delay 0 -program tcsh
 .EE
+.TP 8
+.B \-esc
+When the user types a key with the Alt or Meta keys held down, send an
+ESC character first.  This is the default.
+.TP 8
+.B \-meta
+When Meta or Alt are held down, set the high bit on the character instead.
+.TP 8
+.B \-del
+Swap Backspace and Delete.  This is the default.
+.TP 8
+.B \-bs
+Do not swap Backspace and Delete.
+.SH TERMINAL EMULATION
+By default, \fIphosphor\fP allocates a pseudo-tty for the sub-process to
+run under.  This has the desirable side effect that the program will be
+able to use
+.BR ioctl (2)
+to fetch information about terminal parameters and window size, which
+many programs (such as
+.BR top (1))
+need to run properly. \fIphosphor\fP will also set the environment
+variable \fITERM\fP to \fIvt100\fP in the child process.
+
+Any characters typed on the phosphor window will be passed along to
+the sub-process.  (Note that this only works when running in "window"
+mode, not when running in \fI\-root\fP mode under xscreensaver.)
 .SH ENVIRONMENT
 .PP
 .TP 8
@@ -91,6 +130,9 @@ to get the default host and display number.
 .B XENVIRONMENT
 to get the name of a resource file that overrides the global resources
 stored in the RESOURCE_MANAGER property.
+.TP 8
+.B TERM
+to inform the sub-process of the type of terminal emulation.
 .SH SEE ALSO
 .BR xscreensaver (1),
 .BR fortune (1),
@@ -102,7 +144,8 @@ stored in the RESOURCE_MANAGER property.
 .BR webcollage (1),
 .BR driftnet (1)
 .BR EtherPEG ,
-.BR EtherPeek
+.BR EtherPeek ,
+.BR console_codes (4).
 .SH COPYRIGHT
 Copyright \(co 1999 by Jamie Zawinski.  Permission to use, copy, modify, 
 distribute, and sell this software and its documentation for any purpose is 
@@ -113,3 +156,4 @@ suitability of this software for any purpose.  It is provided "as is" without
 express or implied warranty.
 .SH AUTHOR
 Jamie Zawinski <jwz@jwz.org>, 27-Apr-99.
+Pty and vt100 emulation by Fredrik Tolf <fredrik@dolda2000.com>.
index 3ed5227ba54bf1b41459f9789fde89b389e2f8ab..02645b72431c40c593b0f9f832ba84901f130a8c 100644 (file)
@@ -65,8 +65,8 @@ static XrmOptionDescRec opts[] =
 };
 static argtype vars[] =
 {
-  {(caddr_t *) &identical, (char *) "identical", (char *) "Identical", (char *) DEF_IDENTICAL, t_Bool},
-  {(caddr_t *) & plain, (char *) "plain", (char *) "Plain", (char *) DEF_PLAIN, t_Bool}
+  {&identical, "identical", "Identical", DEF_IDENTICAL, t_Bool},
+  {&plain, "plain", "Plain", DEF_PLAIN, t_Bool}
 };
 static OptionStruct desc[] =
 {
index bcfc3fc734d657d5624ce1fa347901f034e65980..eab2281122d3693c83021abedf5d5be9ec10c2b1 100644 (file)
@@ -478,6 +478,8 @@ play_pong (void)
 char *progclass = "pong";
 
 char *defaults [] = {
+  ".background: black",
+  ".foreground: white",
   "*delay:     10000",
   "*speed:      6",
   ANALOGTV_DEFAULTS
index 79a58cde9792e2d0c5fdcf29403742d11c69e1cc..5432711d3112f8f75558b7b4f9df1dc63bad3fc6 100644 (file)
@@ -1,4 +1,4 @@
-/* xscreensaver, Copyright (c) 1992, 1995, 1997, 1998, 2001, 2002, 2003
+/* xscreensaver, Copyright (c) 1992, 1995, 1997, 1998, 2001, 2002, 2003, 2004
  *  Jamie Zawinski <jwz@jwz.org>
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
@@ -534,9 +534,9 @@ main (int argc, char **argv)
       screen = xgwa.screen;
       visual_warning (screen, window, visual, cmap, True);
 
-      /* Select KeyPress events on the external window.
+      /* Select KeyPress and resize events on the external window.
        */
-      xgwa.your_event_mask |= KeyPressMask;
+      xgwa.your_event_mask |= KeyPressMask | StructureNotifyMask;
       XSelectInput (dpy, window, xgwa.your_event_mask);
 
       /* Select ButtonPress and ButtonRelease events on the external window,
index abfc9378b0e5af3acfa6441d2bb437597784ab60..afdfd19a9420ad1bf9dc9bfe60cfd2f3d8fbcb3b 100644 (file)
@@ -1174,7 +1174,7 @@ block in which it's invoked, since it declares variables: */
          {
            XEvent xe;
            while (XCheckWindowEvent
-                  (mydpy, mywindow, StructureNotifyMask | ExposureMask, &xe))
+                  (mydpy, mywindow, ExposureMask, &xe))
              switch (xe.type)
                {
                case ConfigureNotify:
@@ -1330,8 +1330,7 @@ main (int argc, char **argv)
   XStoreName (mydpy, mywindow, "vermiculate");
   XMapWindow (mydpy, mywindow);
   commonXinit ();
-  XSelectInput (mydpy, mywindow,
-               KeyPressMask | ExposureMask | StructureNotifyMask);
+  XSelectInput (mydpy, mywindow, KeyPressMask | ExposureMask);
 
 #undef ya_rand_init
   ya_rand_init (0);
index f243156256e1a7c59bfbe91e22070db219164f59..bf6186e5ea3afe751b61f23eba5ff110c8c61a97 100755 (executable)
@@ -21,7 +21,7 @@ use diagnostics;
 use strict;
 
 my $progname = $0; $progname =~ s@.*/@@g;
-my $version = q{ $Revision: 1.22 $ }; $version =~ s/^[^0-9]+([0-9.]+).*$/$1/;
+my $version = q{ $Revision: 1.24 $ }; $version =~ s/^[^0-9]+([0-9.]+).*$/$1/;
 
 my $verbose = 0;
 my $use_stdin = 0;
@@ -139,6 +139,32 @@ sub error {
   exit 1;
 }
 
+# Any files on this list will be deleted at exit.
+#
+my @all_tmpfiles = ();
+
+sub signal_cleanup {
+  unlink @all_tmpfiles;
+}
+
+sub init_signals {
+
+  $SIG{HUP}  = \&signal_cleanup;
+  $SIG{INT}  = \&signal_cleanup;
+  $SIG{QUIT} = \&signal_cleanup;
+  $SIG{ABRT} = \&signal_cleanup;
+  $SIG{KILL} = \&signal_cleanup;
+  $SIG{TERM} = \&signal_cleanup;
+
+  # Need this so that if giftopnm dies, we don't die.
+  $SIG{PIPE} = 'IGNORE';
+}
+
+END { signal_cleanup(); }
+
+
+
+
 # ####  Lifted from driver/xscreensaver-getimage-file
 #
 sub pick_displayer {
@@ -188,6 +214,7 @@ sub randcolors {
 }
 
 
+
 sub filter_subst {
   my ($filter, $width, $height, @tmpfiles) = @_;
   my $colors = randcolors();
@@ -219,8 +246,12 @@ sub frob_ppm {
 
   my $tmpdir = $ENV{TMPDIR};
   $tmpdir = "/tmp" unless $tmpdir;
-  my $fn = sprintf("$tmpdir/vw.%04x", $$);
-  my @files = ( "$fn", "$fn.1", "$fn.2", "$fn.3" );
+  my $fn =  sprintf ("%s/vidwhacker-0-%08x", $tmpdir, rand(0xFFFFFFFF));
+  my $fn1 = sprintf ("%s/vidwhacker-1-%08x", $tmpdir, rand(0xFFFFFFFF));
+  my $fn2 = sprintf ("%s/vidwhacker-2-%08x", $tmpdir, rand(0xFFFFFFFF));
+  my $fn3 = sprintf ("%s/vidwhacker-3-%08x", $tmpdir, rand(0xFFFFFFFF));
+  my @files = ( "$fn", "$fn1", "$fn2", "$fn3" );
+  push @all_tmpfiles, @files;
 
   my $n = int(rand($#filters+1));
   my $filter = $filters[$n];
@@ -389,9 +420,10 @@ sub dispose_ppm {
 
     my $tmpdir = $ENV{TMPDIR};
     $tmpdir = "/tmp" unless $tmpdir;
-    my $fn = sprintf("$tmpdir/vw.%04x", $$);
+    my $fn =  sprintf ("%s/vidwhacker-%08x", $tmpdir, rand(0xFFFFFFFF));
     local *OUT;
     unlink $fn;
+    push @all_tmpfiles, $fn;
     open (OUT, ">$fn") || error "writing $fn: $!";
     print OUT $ppm;
     close OUT;
@@ -463,6 +495,8 @@ sub main {
     else { usage; }
   }
 
+  init_signals();
+
   read_config;
 
   if (!$use_stdout) {
index 42f20ab4b65345d443974399e76c21f91e838a45..733cae5c6ccf531c86712ed6380980939991ec8d 100755 (executable)
@@ -53,7 +53,7 @@ use bytes;  # Larry can take Unicode and shove it up his ass sideways.
 
 
 my $progname = $0; $progname =~ s@.*/@@g;
-my $version = q{ $Revision: 1.107 $ }; $version =~ s/^[^0-9]+([0-9.]+).*$/$1/;
+my $version = q{ $Revision: 1.108 $ }; $version =~ s/^[^0-9]+([0-9.]+).*$/$1/;
 my $copyright = "WebCollage $version, Copyright (c) 1999-2002" .
     " Jamie Zawinski <jwz\@jwz.org>\n" .
     "            http://www.jwz.org/xscreensaver/\n";
@@ -1967,9 +1967,15 @@ sub url_only_output {
 #
 ##############################################################################
 
-my $image_ppm   = ($ENV{TMPDIR} ? $ENV{TMPDIR} : "/tmp") . "/webcollage." . $$;
-my $image_tmp1  = $image_ppm . "-1";
-my $image_tmp2  = $image_ppm . "-2";
+my $image_ppm   = sprintf ("%s/webcollage-%08x",
+                           ($ENV{TMPDIR} ? $ENV{TMPDIR} : "/tmp"),
+                           rand(0xFFFFFFFF));
+my $image_tmp1  = sprintf ("%s/webcollage-1-%08x",
+                           ($ENV{TMPDIR} ? $ENV{TMPDIR} : "/tmp"),
+                           rand(0xFFFFFFFF));
+my $image_tmp2  = sprintf ("%s/webcollage-2-%08x",
+                           ($ENV{TMPDIR} ? $ENV{TMPDIR} : "/tmp"),
+                           rand(0xFFFFFFFF));
 
 my $filter_cmd = undef;
 my $post_filter_cmd = undef;
diff --git a/hacks/wormhole.c b/hacks/wormhole.c
new file mode 100644 (file)
index 0000000..015b200
--- /dev/null
@@ -0,0 +1,682 @@
+/* xscreensaver, Copyright (c) 1992, 1995, 1996, 1997, 1998, 2004
+ *  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.
+ */
+
+/* wormhole:
+ * Animation of moving through a wormhole. Based on my own code written
+ * a few years ago.
+ * author: Jon Rafkind <jon@rafkind.com>
+ * date: 1/19/04
+ */
+
+#include <stdio.h>
+#include <math.h>
+#include <string.h>
+#include "screenhack.h"
+
+#ifndef debug
+#define debug printf("File:%s Line:%d\n", __FILE__, __LINE__ );
+#endif
+
+int SCREEN_X, SCREEN_Y;
+int z_speed;
+int make_stars;
+
+typedef struct STAR{
+       int x, y;
+       int calc_x, calc_y;
+       int Z;
+       int center_x, center_y;
+} star;
+
+typedef struct STARLINE{
+       star begin, end;
+} starline;
+
+/*
+typedef struct RGBHANDLE{
+       XColor mine;
+       unsigned short rwant, gwant, bwant;
+} RGBHandle;
+*/
+
+typedef struct COLORCHANGER{
+       XColor * shade;
+       int min, max; 
+       int shade_use;
+       int shade_max;
+       int min_want;
+       /* RGBHandle handle_begin, handle_end; */
+} color_changer;
+
+typedef struct WORMHOLE{
+       int diameter;
+       int diameter_change;
+       int actualx, actualy;
+       double virtualx, virtualy;
+       double speed;
+       int ang;
+       int want_ang;
+       int want_x, want_y;
+       int max_Z;
+       int addStar;
+       int spiral;
+       color_changer changer;
+       starline ** stars;
+       int num_stars; /* top of array we are using */
+       XColor black;
+       Pixmap work;
+} wormhole;
+
+inline int rnd( int q ){
+
+       return random() % q;
+
+}
+
+static int gang( int x1, int y1, int x2, int y2 ){
+
+       int tang = 0;
+       if ( x1 == x2 ) {
+               if ( y1 < y2 )
+                       tang = 90;
+               else
+                       tang = 270;
+       }
+       if ( y1 == y2 ) {
+
+               if ( x1 < x2 )
+                       tang = 0;
+               else
+                       tang = 180;
+
+       } else
+       tang = (int)(0.5+atan2( -(y2-y1), x2 - x1 ) * 180.0 / M_PI );
+
+       while ( tang < 0 )
+               tang += 360;
+       return tang % 360;
+
+}
+
+void blend_palette( XColor * pal, int max, XColor * sc, XColor * ec ) {
+
+       int q;
+
+       int sc_r = sc->red;
+       int sc_g = sc->green;
+       int sc_b = sc->blue;
+
+       int ec_r = ec->red;
+       int ec_g = ec->green;
+       int ec_b = ec->blue;
+
+        for ( q = 0; q < max; q++ ) {
+                float j = (float)( q ) / (float)( max );
+                int f_r = (int)( 0.5 + (float)( sc_r ) + (float)( ec_r-sc_r ) * j );
+                int f_g = (int)( 0.5 + (float)( sc_g ) + (float)( ec_g-sc_g ) * j );
+                int f_b = (int)( 0.5 + (float)( sc_b ) + (float)( ec_b-sc_b ) * j );
+                /* pal[q] = makecol( f_r, f_g, f_b ); */
+               pal[q].red = f_r;
+               pal[q].blue = f_b;
+               pal[q].green = f_g; 
+       }
+
+}
+
+
+/*
+static void initHandle( RGBHandle * handle ){
+
+       handle->mine.red = rnd( 65536 );
+       handle->mine.green = rnd( 65536 );
+       handle->mine.blue = rnd( 65536 );
+       handle->rwant = rnd( 65536 );
+       handle->gwant = rnd( 65536 );
+       handle->bwant = rnd( 65536 );
+
+}
+*/
+
+static void initXColor( XColor * color ){
+       color->red = rnd( 50000 ) + 10000;
+       color->blue = rnd( 50000 ) + 10000;
+       color->green = rnd( 50000 ) + 10000;
+}
+
+static void initColorChanger( color_changer * ch, Display * display, Colormap * cmap ){
+
+       int q;
+       int min, max;
+       XColor old_color, new_color;
+
+       ch->shade_max = 2048;
+       ch->shade_use = 128;
+       ch->min = 0;
+       ch->max = ch->shade_use;
+       ch->min_want = rnd( ch->shade_max - ch->shade_use );
+       ch->shade = (XColor *)malloc( sizeof(XColor) * ch->shade_max );
+       memset( ch->shade, 0, sizeof(XColor) * ch->shade_max );
+
+       initXColor( &old_color );
+       initXColor( &new_color );
+       
+       for ( q = 0; q < ch->shade_max; q += ch->shade_use ){
+               min = q;
+               max = q + ch->shade_use;
+               if ( max >= ch->shade_max ) max = ch->shade_max-1;
+               blend_palette( ch->shade + q, ch->shade_use, &old_color, &new_color );
+               old_color = new_color;
+
+               initXColor( &new_color );
+       }
+
+       for ( q = 0; q < ch->shade_max; q++ )
+               XAllocColor( display, *cmap, &( ch->shade[q] ) );
+
+       /*
+       initHandle( &(ch->handle_begin) );
+       initHandle( &(ch->handle_end) );
+       ch->shade = (XColor *)malloc( sizeof(XColor) * MAX_COLORS );
+       ch->max = MAX_COLORS;
+       memset( ch->shade, 0, sizeof(XColor) * ch->max );
+
+       blend_palette( ch->shade, ch->max, &(ch->handle_begin.mine), &(ch->handle_end.mine) );
+       for ( q = 0; q < ch->max; q++ )
+               XAllocColor( display, *cmap, &( ch->shade[q] ) );
+       */
+
+}
+
+/*
+static void changeColor( unsigned short * col, unsigned short * change, int min, int max ){
+       int RGB_GO_BLACK = 30;
+       if ( *col < *change ) *col++;
+       if ( *col > *change ) *col--;
+       if ( *col == *change ){
+               if ( rnd( RGB_GO_BLACK ) == rnd( RGB_GO_BLACK ) )
+                       *change = 0;
+               else    *change = rnd(max-min) + min;
+       }
+}
+*/
+
+/*
+static void moveRGBHandle( RGBHandle * handle, int min, int max ){
+
+       unsigned short * want[ 3 ];
+       int q;
+       int cy = 0;
+       want[0] = &(handle->rwant);
+       want[1] = &(handle->gwant);
+       want[2] = &(handle->bwant);
+
+       for ( q = 0; q < 10; q++ ){
+               changeColor( &( handle->mine.red ), &handle->rwant, min, max );
+               changeColor( &( handle->mine.green ), &handle->gwant, min, max );
+               changeColor( &( handle->mine.blue ), &handle->bwant, min, max );
+       }
+       
+       for ( q = 0; q < 3; q++ )
+               cy = cy || (*(want[q]) >= min && *(want[q]) <= max);
+       if ( !cy ) *(want[rnd(3)]) = rnd(max-min)+min;
+       cy = 1;
+       for ( q = 0; q < 3; q++ )
+               cy = cy && *(want[q]) == 0;
+       if ( cy ) *(want[rnd(3)]) = rnd(max-min)+min;
+
+       if ( rnd( 30 ) == rnd( 30 ) )
+               *(want[rnd(3)]) = rnd(max-min)+min;
+
+}
+*/
+
+static void moveColorChanger( color_changer * ch, Display * display, Colormap * cmap ){
+
+       /* int q; */
+
+       if ( ch->min < ch->min_want ){
+               ch->min++;
+               ch->max++;
+       }
+       if ( ch->min > ch->min_want ) {
+               ch->min--;
+               ch->max--;
+       }
+       if ( ch->min == ch->min_want )
+               ch->min_want = rnd( ch->shade_max - ch->shade_use );
+
+       /*
+       for ( q = 0; q < ch->max; q++ )
+               XFreeColors( display, *cmap, &( ch->shade[q].pixel ), 1, 0 );
+
+       moveRGBHandle( &( ch->handle_begin ), 5000, 65500 );
+       moveRGBHandle( &( ch->handle_end ), 5000, 65500 );
+       
+       blend_palette( ch->shade, ch->max, &(ch->handle_begin.mine), &(ch->handle_end.mine) );
+       for ( q = 0; q < ch->max; q++ )
+               XAllocColor( display, *cmap, &( ch->shade[q] ) );
+       */
+
+}
+
+static void destroyColorChanger( color_changer * ch, Display * display, Colormap * cmap ){
+       int q;
+       for ( q = 0; q < ch->max; q++ )
+               XFreeColors( display, *cmap, &( ch->shade[q].pixel ), 1, 0 );
+       free( ch->shade );
+}
+
+static void resizeWormhole( wormhole * worm, Display * display, Window * win ){
+       
+       XWindowAttributes attr;
+       Colormap cmap;
+
+       XGetWindowAttributes( display, *win, &attr );
+
+       cmap = attr.colormap;
+       
+       SCREEN_X = attr.width;
+       SCREEN_Y = attr.height;
+
+       XFreePixmap( display, worm->work );
+       worm->work = XCreatePixmap( display, *win, SCREEN_X, SCREEN_Y, attr.depth );
+
+}
+
+static void initWormhole( wormhole * worm, Display * display, Window * win ){
+       
+       int i;
+       XWindowAttributes attr;
+       Colormap cmap;
+
+       XGetWindowAttributes( display, *win, &attr );
+
+       cmap = attr.colormap;
+       
+       SCREEN_X = attr.width;
+       SCREEN_Y = attr.height;
+
+       worm->work = XCreatePixmap( display, *win, SCREEN_X, SCREEN_Y, attr.depth );
+
+       worm->diameter = rnd( 10 ) + 15;
+       worm->diameter_change = rnd( 10 ) + 15;
+       /* worm->actualx = rnd( attr.width );
+       worm->actualy = rnd( attr.height ); */
+       worm->actualx = attr.width / 2;
+       worm->actualy = attr.height / 2;
+       worm->virtualx = worm->actualx;
+       worm->virtualy = worm->actualy;
+       worm->speed = (float)SCREEN_X / 180.0;
+       /* z_speed = SCREEN_X / 120; */
+       worm->spiral = 0;
+       worm->addStar = make_stars;
+       worm->want_x = rnd( attr.width - 50 ) + 25;
+       worm->want_y = rnd( attr.height - 50 ) + 25;
+       worm->want_ang = gang( worm->actualx, worm->actualy, worm->want_x, worm->want_y );
+       worm->ang = worm->want_ang;
+       worm->max_Z = 600;
+       worm->black.red = 0;
+       worm->black.green = 0;
+       worm->black.blue = 0;
+       XAllocColor( display, cmap, &worm->black );
+       initColorChanger( &(worm->changer), display, &cmap );
+
+       worm->num_stars = 64;
+       worm->stars = (starline **)malloc( sizeof(starline *) * worm->num_stars );
+       for ( i = 0; i < worm->num_stars; i++ )
+               worm->stars[i] = NULL;
+
+}
+
+static void destroyWormhole( wormhole * worm, Display * display, Colormap * cmap ){
+       destroyColorChanger( &(worm->changer), display, cmap );
+       XFreePixmap( display, worm->work );
+       free( worm->stars );
+}
+
+static double Cos( int a ){
+       return cos( a * 180.0 / M_PI );
+}
+
+static double Sine( int a ){
+       return sin( a * 180.0 / M_PI );
+}
+
+
+
+static void calcStar( star * st ){
+       if ( st->center_x == 0 || st->center_y == 0 ){
+               st->Z = 0;
+               return;
+       }
+       if ( st->Z <= 0 ){
+               st->calc_x = (st->x << 10) / st->center_x;
+               st->calc_y = (st->y << 10) / st->center_y;
+       } else {
+               st->calc_x = (st->x << 10 ) / st->Z + st->center_x;
+               st->calc_y = (st->y << 10 ) / st->Z + st->center_y;
+       }
+}
+
+static void initStar( star * st, int Z, int ang, wormhole * worm ){
+
+       st->x = Cos( ang ) * worm->diameter;
+       st->y = Sine( ang ) * worm->diameter;
+       st->center_x = worm->actualx;
+       st->center_y = worm->actualy;
+       st->Z = Z;
+       calcStar( st );
+
+}
+
+static void addStar( wormhole * worm ){
+
+       starline * star_new;
+       starline ** xstars;
+       int old_stars;
+       int q;
+       int ang;
+       star_new = (starline *)malloc( sizeof( starline ) );
+       ang = rnd( 360 );
+       initStar( &star_new->begin, worm->max_Z, ang, worm );
+       initStar( &star_new->end, worm->max_Z+rnd(6)+4, ang, worm );
+
+       for ( q = 0; q < worm->num_stars; q++ ){
+               if ( worm->stars[q] == NULL ){
+                       worm->stars[q] = star_new;
+                       return;
+               }
+       }
+
+       old_stars = worm->num_stars;
+       worm->num_stars = worm->num_stars << 1;
+       xstars = (starline **)malloc( sizeof(starline *) * worm->num_stars );
+       for ( q = 0; q < worm->num_stars; q++ )
+               xstars[q] = NULL;
+
+       for ( q = 0; q < old_stars; q++ )
+               if ( worm->stars[q] != NULL ) xstars[q] = worm->stars[q];
+       free( worm->stars );
+       worm->stars = xstars;
+
+       worm->stars[ old_stars ] = star_new;
+
+}
+
+static int moveStar( starline * stl ){
+
+       stl->begin.Z -= z_speed;        
+       stl->end.Z -= z_speed;
+
+       calcStar( &stl->begin );
+       calcStar( &stl->end );
+
+       return ( stl->begin.Z <= 0 || stl->end.Z <= 0 );
+
+} 
+
+static int dist( int x1, int y1, int x2, int y2 ){
+       int xs, ys;
+       xs = x1-x2;
+       ys = y1-y2;
+       return (int)sqrt( xs*xs + ys*ys );
+}
+
+static void moveWormhole( wormhole * worm, Display * display, Colormap * cmap ){
+
+       int q;
+       double dx, dy;
+       /* int x1, y1, x2, y2; */
+       int min_dist = 100;
+       int find = 0;
+       dx = Cos( worm->ang ) * worm->speed;
+       dy = Sine( worm->ang ) * worm->speed;
+
+       worm->virtualx += dx;
+       worm->virtualy += dy;
+       worm->actualx = (int)worm->virtualx;
+       worm->actualy = (int)worm->virtualy;
+
+       if ( worm->spiral ){
+
+               if ( worm->spiral % 5 == 0 )
+                       worm->ang = (worm->ang + 1 ) % 360;
+               worm->spiral--;
+               if ( worm->spiral <= 0 ) find = 1;
+
+       } else {
+
+               if ( dist( worm->actualx, worm->actualy, worm->want_x, worm->want_y ) < 20 )
+                       find = 1;
+
+               if ( rnd( 20 ) == rnd( 20 ) )
+                       find = 1;
+
+               if ( worm->actualx < min_dist ){
+                       worm->actualx = min_dist;
+                       worm->virtualx = worm->actualx;
+                       find = 1;
+               }
+               if ( worm->actualy < min_dist ){
+                       worm->actualy = min_dist;
+                       worm->virtualy = worm->actualy;
+                       find = 1;
+               }
+               if ( worm->actualx > SCREEN_X - min_dist ){
+                       worm->actualx = SCREEN_X - min_dist;
+                       worm->virtualx = worm->actualx;
+                       find = 1;
+               }
+               if ( worm->actualy > SCREEN_Y - min_dist ){
+                       worm->actualy = SCREEN_Y - min_dist;
+                       worm->virtualy = worm->actualy;
+                       find = 1;
+               }
+       
+               if ( rnd( 500 ) == rnd( 500 ) ) worm->spiral = rnd( 30 ) + 50;
+       }
+
+       if ( find ){
+               worm->want_x = rnd( SCREEN_X - min_dist * 2 ) + min_dist;
+               worm->want_y = rnd( SCREEN_Y - min_dist * 2 ) + min_dist;
+               worm->ang = gang( worm->actualx, worm->actualy, worm->want_x, worm->want_y );
+       }
+
+
+       /* worm->ang = ( worm->ang + 360 + rnd( 30 ) - 15 ) % 360; */
+
+       /*
+       if ( worm->ang < worm->want_ang ) worm->ang++;
+       if ( worm->ang > worm->want_ang ) worm->ang--;
+       if ( worm->ang == worm->want_ang && rnd( 3 ) == rnd( 3 ) ) worm->want_ang = rnd( 360 );
+       */
+
+       /*
+       if ( rnd( 25 ) == rnd( 25 ) ){
+               x1 = worm->actualx;
+               y1 = worm->actualy;
+               x2 = SCREEN_X / 2 + rnd( 20 ) - 10;
+               y2 = SCREEN_Y / 2 + rnd( 20 ) - 10;
+               worm->want_ang = gang(x1,y1,x2,y2);
+       }
+       */
+
+       /*
+       if ( worm->actualx < min_dist || worm->actualx > SCREEN_X - min_dist || worm->actualy < min_dist || worm->actualy > SCREEN_Y - min_dist ){
+               x1 = worm->actualx;
+               y1 = worm->actualy;
+               x2 = SCREEN_X / 2 + rnd( 20 ) - 10;
+               y2 = SCREEN_Y / 2 + rnd( 20 ) - 10;
+               / * worm->ang = gang( worm->actualx, worm->actualy, SCREEN_X/2+rnd(20)-10, SCREEN_Y/2+rnd(20)-10 ); * /
+               worm->ang = gang( x1, y1, x2, y2 );
+               worm->want_ang = worm->ang;
+               / * printf("Angle = %d\n", worm->ang ); * /
+
+               if ( worm->actualx < min_dist )
+                       worm->actualx = min_dist;
+               if ( worm->actualx > SCREEN_X - min_dist )
+                       worm->actualx = SCREEN_X - min_dist;
+               if ( worm->actualy < min_dist )
+                       worm->actualy = min_dist;
+               if ( worm->actualy > SCREEN_Y - min_dist )
+                       worm->actualy = SCREEN_Y - min_dist;
+               worm->virtualx = worm->actualx;
+               worm->virtualy = worm->actualy;
+       }
+       */
+
+       for ( q = 0; q < worm->num_stars; q++ ){
+               if ( worm->stars[q] != NULL ){
+                       if ( moveStar( worm->stars[q] ) ){
+                               free( worm->stars[q] );
+                               worm->stars[q] = NULL;
+                       }
+               }
+       }
+
+       moveColorChanger( &worm->changer, display, cmap );
+
+       if ( worm->diameter < worm->diameter_change )
+               worm->diameter++;
+       if ( worm->diameter > worm->diameter_change )
+               worm->diameter--;
+       if ( rnd( 30 ) == rnd( 30 ) )
+               worm->diameter_change = rnd( 35 ) + 5;
+
+       for ( q = 0; q < worm->addStar; q++ )
+               addStar( worm );
+
+}
+
+static XColor * getColorShade( color_changer * ch ){
+       return ch->shade + ch->min;
+}
+
+static void drawWormhole( Display * display, Window * win, GC * gc, wormhole * worm ){
+
+       int i;
+       int color;
+       int z;
+       starline * current;
+       XColor * xcol;
+       XColor * shade;
+       for ( i = 0; i < worm->num_stars; i++ )
+               if ( worm->stars[i] != NULL ){
+       
+                       current = worm->stars[i];
+                       z = current->begin.Z;
+
+                       color = z * worm->changer.shade_use / worm->max_Z;
+                       shade = getColorShade( &worm->changer );
+                       /* xcol = &worm->changer.shade[ color ]; */
+                       xcol = &shade[ color ];
+
+                       XSetForeground( display, *gc, xcol->pixel );
+                       /* XDrawLine( display, *win, *gc, current->begin.calc_x, current->begin.calc_y, current->end.calc_x, current->end.calc_y ); */
+                       XDrawLine( display, worm->work, *gc, current->begin.calc_x, current->begin.calc_y, current->end.calc_x, current->end.calc_y );
+
+               }
+       XCopyArea( display, worm->work, *win, *gc, 0, 0, SCREEN_X, SCREEN_Y, 0, 0 );
+       XSetForeground( display, *gc, worm->black.pixel );
+       XFillRectangle( display, worm->work, *gc, 0, 0, SCREEN_X, SCREEN_Y );
+
+}
+
+/*
+static void eraseWormhole( Display * display, Window * win, GC * gc, wormhole * worm ){
+       starline * current;
+       int i;
+       XColor * xcol;
+       for ( i = 0; i < worm->num_stars; i++ )
+               if ( worm->stars[i] != NULL ){
+                       xcol = &worm->black;
+                       current = worm->stars[i];
+                       XSetForeground( display, *gc, xcol->pixel );
+                       XDrawLine( display, *win, *gc, current->begin.calc_x, current->begin.calc_y, current->end.calc_x, current->end.calc_y );
+               }
+}
+*/
+
+char *progclass = "Wormhole";
+
+char *defaults [] = {
+  ".background:        Black",
+  ".foreground:        #E9967A",
+  "*delay:     10000",
+  "*zspeed:    10",
+  "*stars:     20",
+  0
+};
+
+XrmOptionDescRec options [] = {
+  { "-delay",          ".delay",       XrmoptionSepArg, 0 },
+  { "-zspeed",         ".zspeed",      XrmoptionSepArg, 0 },
+  { "-stars",          ".stars",       XrmoptionSepArg, 0 },
+  { 0, 0, 0, 0 }
+};
+
+static int handle_event( Display * display, XEvent * event ){
+
+       if ( event->xany.type == ConfigureNotify ){
+               return 1;
+       }
+       screenhack_handle_event( display, event );
+
+       return 0;
+}
+
+void screenhack (Display *dpy, Window window) {
+
+       wormhole worm;
+       GC gc;
+       XGCValues gcv;
+       XWindowAttributes attr;
+       Colormap cmap;
+
+       int delay = get_integer_resource( "delay", "Integer" );
+       make_stars = get_integer_resource( "stars", "Integer" );
+       z_speed = get_integer_resource( "zspeed", "Integer" );
+
+       initWormhole( &worm, dpy, &window );
+
+       gcv.foreground = 1;
+       gcv.background = 1;
+       gc = XCreateGC( dpy, window, GCForeground, &gcv );
+       XGetWindowAttributes( dpy, window, &attr );
+       cmap = attr.colormap;
+
+       while (1){
+
+               moveWormhole( &worm, dpy, &cmap );
+               drawWormhole( dpy, &window, &gc, &worm );
+
+               XSync (dpy, False);
+               /* handle my own friggin events. mmmlaaaa */
+               while ( XPending(dpy) ){
+                       XEvent event;
+                       XNextEvent( dpy, &event );
+                       if ( handle_event( dpy, &event ) == 1 ){
+                               resizeWormhole( &worm, dpy, &window );
+                       }
+               }
+               /* screenhack_handle_events (dpy); */
+
+               if (delay) usleep (delay);
+               /* eraseWormhole( dpy, &window, &gc, &worm ); */
+               /*
+               XSetForeground( dpy, gc, worm.black.pixel );
+               XFillRectangle( dpy, window, gc, 0, 0, SCREEN_X, SCREEN_Y );
+               */
+       }
+
+       destroyWormhole( &worm, dpy, &cmap );
+}
diff --git a/hacks/wormhole.man b/hacks/wormhole.man
new file mode 100644 (file)
index 0000000..54164bf
--- /dev/null
@@ -0,0 +1,65 @@
+.TH XScreenSaver 1 "11-feb-04" "X Version 11"
+.SH NAME
+wormhole - animation of flying through a wormhole
+.SH SYNOPSIS
+.B wormhole
+[\-display \fIhost:display.screen\fP]
+[\-window]
+[\-visual \fIvisual\fP]
+[\-root]
+[\-stars \fIn\fP]
+[\-delay \fIusecs\fP]
+[\-zspeed \fIn\fP]
+.SH DESCRIPTION
+The \fIwormhole\fP program shows an animation of flying through a tunnel surrounded by streaks of light.
+.SH OPTIONS
+.I wormhole
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window.  This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-mono
+Make all the rocks the same color.
+.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 \-stars \fIinteger\fP
+Number of stars to create every animation loop.
+.TP 8
+.B \-zspeed \fIinteger\fP
+Speed light streaks fly by.
+.TP 8
+.B \-delay \fImicroseconds\fP
+Number of microseconds to delay between each frame.  Default 50000, meaning
+about 1/20th second.  Compare and contrast with \fI\-speed\fP, above.
+.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 2004 by Jon Rafkind.  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
+Jon Rafkind <jon@rafkind.com>
index 605acac6b32734d5071cf6dd4f24b9da9a1a6580..2e5513e58fd33e4420a3afd9c076006c6284048b 100644 (file)
@@ -31,6 +31,7 @@
 #include <stdio.h>
 #include <time.h>
 #include <sys/time.h>
+#include <X11/Xlib.h>
 #include <X11/Xutil.h>
 #include <X11/Intrinsic.h>
 
@@ -194,6 +195,8 @@ draw_color_square(analogtv_input *input)
 char *progclass = "XAnalogTV";
 
 char *defaults [] = {
+  ".background:             black",
+  ".foreground:             white",
   "*delay:          5",
   ANALOGTV_DEFAULTS
   0,
index c82f00661f60f3065b0741a91ecd11991d4d926e..7bce492ebabede2a53fc865b75420ef94aaf80a9 100644 (file)
@@ -101,7 +101,8 @@ prefix = @prefix@
 exec_prefix = @exec_prefix@
 #datadir = $(prefix)/@DATADIRNAME@      -- not for xscreensaver
 datadir = @PO_DATADIR@
-localedir = $(datadir)/locale
+#localedir = $(datadir)/locale
+localedir = $(prefix)/share/locale
 #gnulocaledir = $(prefix)/share/locale  -- not for xscreensaver
 gnulocaledir = $(localedir)
 #gettextsrcdir = $(prefix)/share/glib-2.0/gettext/po
index 0ef28022981b78c5527282a031461adfe6ad445e..aa8536dd056ec8c61131482781f2386f29280deb 100644 (file)
@@ -1,14 +1,14 @@
-# Auto-generated: Mon Oct 13 17:43:29 PDT 2003
-driver/demo-Gtk.c
+# Auto-generated: Thu Jan 29 17:47:32 RST 2004
 driver/demo-Gtk-conf.c
 driver/demo-Gtk-support.c
 driver/demo-Gtk-widgets.c
+driver/demo-Gtk.c
 driver/screensaver-properties.desktop.in
 driver/xscreensaver-demo.glade
 driver/xscreensaver-demo.glade2
 hacks/config/anemone.xml
-hacks/config/antspotlight.xml
 hacks/config/ant.xml
+hacks/config/antspotlight.xml
 hacks/config/apollonian.xml
 hacks/config/apple2.xml
 hacks/config/atlantis.xml
@@ -16,6 +16,7 @@ hacks/config/attraction.xml
 hacks/config/atunnel.xml
 hacks/config/barcode.xml
 hacks/config/blaster.xml
+hacks/config/blinkbox.xml
 hacks/config/blitspin.xml
 hacks/config/blocktube.xml
 hacks/config/bouboule.xml
@@ -69,6 +70,7 @@ hacks/config/galaxy.xml
 hacks/config/gears.xml
 hacks/config/gflux.xml
 hacks/config/glblur.xml
+hacks/config/gleidescope.xml
 hacks/config/glforestfire.xml
 hacks/config/glknots.xml
 hacks/config/glmatrix.xml
@@ -108,9 +110,10 @@ hacks/config/loop.xml
 hacks/config/maze.xml
 hacks/config/menger.xml
 hacks/config/metaballs.xml
+hacks/config/mirrorblob.xml
 hacks/config/moebius.xml
-hacks/config/moire2.xml
 hacks/config/moire.xml
+hacks/config/moire2.xml
 hacks/config/molecule.xml
 hacks/config/morph3d.xml
 hacks/config/mountain.xml
@@ -126,6 +129,7 @@ hacks/config/piecewise.xml
 hacks/config/pipes.xml
 hacks/config/polyominoes.xml
 hacks/config/polytopes.xml
+hacks/config/pong.xml
 hacks/config/popsquares.xml
 hacks/config/pulsar.xml
 hacks/config/pyro.xml
@@ -140,15 +144,15 @@ hacks/config/rotzoomer.xml
 hacks/config/rubik.xml
 hacks/config/sballs.xml
 hacks/config/shadebobs.xml
-hacks/config/sierpinski3d.xml
 hacks/config/sierpinski.xml
+hacks/config/sierpinski3d.xml
 hacks/config/slidescreen.xml
 hacks/config/slip.xml
 hacks/config/sonar.xml
 hacks/config/speedmine.xml
+hacks/config/sphere.xml
 hacks/config/sphereEversion.xml
 hacks/config/spheremonics.xml
-hacks/config/sphere.xml
 hacks/config/spiral.xml
 hacks/config/spotlight.xml
 hacks/config/sproingies.xml
index e0b4db163a811453c5e3a87c992bc03999ca720b..f9d7c0d77e54b26009a12bdc364cef46a3e5e7bc 100644 (file)
--- a/po/fr.po
+++ b/po/fr.po
@@ -1,13 +1,13 @@
 # xscreensaver fr.po
 # Copyright (C) 2002 Free Software Foundation, Inc.
 # maintainer: Christophe Merlet (RedFox) <christophe@merlet.net>, 2002.
-# Sun G11n <gnome_int_l10n@ireland.sun.com>, 2002.
-# Eric Lassauge <lassauge@mail.dotcom.fr>, 2003.
+# Eric Lassauge <lassauge@mail.dotcom.fr>, 2004.
 #
 msgid ""
 msgstr ""
-"Project-Id-Version: xscreensaver 4.11\n"
-"POT-Creation-Date: 2002-06-18 21:56+0200\n"
+"Project-Id-Version: xscreensaver 4.14\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2004-02-03 12:08+0100\n"
 "PO-Revision-Date: 2002-07-28 01:03+0200\n"
 "Last-Translator: Eric Lassauge <lassauge@mail.dotcom.fr>\n"
 "Language-Team: GNOME French Team <gnomefr@traduc.org>\n"
@@ -15,77 +15,82 @@ msgstr ""
 "Content-Type: text/plain; charset=iso-8859-1\n"
 "Content-Transfer-Encoding: 8bit\n"
 
-#: driver/demo-Gtk-conf.c:729
+#: driver/demo-Gtk-conf.c:732
 msgid "Browse..."
 msgstr "Parcourir... "
 
-#: driver/demo-Gtk-conf.c:1021
+#: driver/demo-Gtk-conf.c:1024
 msgid "Select file."
 msgstr "Sélectionnez un fichier."
 
-#: driver/demo-Gtk-support.c:121
+#: driver/demo-Gtk-support.c:135
 #, c-format
 msgid "Couldn't find pixmap file: %s"
 msgstr "Impossible de trouver le fichier d'image : %s"
 
-#: driver/demo-Gtk-support.c:130
+#: driver/demo-Gtk-support.c:147 driver/demo-Gtk-support.c:179
 #, c-format
 msgid "Error loading pixmap file: %s"
 msgstr "Erreur lors du chargement du fichier d'image : %s"
 
-#: driver/demo-Gtk-widgets.c:155 driver/xscreensaver-demo.glade.h:89
-#: driver/xscreensaver-demo.glade2.h:43
+#: driver/demo-Gtk-support.c:182
+#, c-format
+msgid "reason: %s\n"
+msgstr "Raison: %s\n"
+
+#: driver/demo-Gtk-widgets.c:161 driver/xscreensaver-demo.glade.h:89
+#: driver/xscreensaver-demo.glade2.h:65
 msgid "XScreenSaver"
 msgstr "XScreenSaver"
 
-#: driver/demo-Gtk-widgets.c:176 driver/xscreensaver-demo.glade2.h:54
+#: driver/demo-Gtk-widgets.c:182 driver/xscreensaver-demo.glade2.h:76
 msgid "_File"
 msgstr "_Fichier"
 
-#: driver/demo-Gtk-widgets.c:196 driver/xscreensaver-demo.glade.h:93
-#: driver/xscreensaver-demo.glade2.h:48
+#: driver/demo-Gtk-widgets.c:202 driver/xscreensaver-demo.glade.h:93
+#: driver/xscreensaver-demo.glade2.h:70
 msgid "_Blank Screen Now"
 msgstr "_Economiser l'écran maintenant"
 
-#: driver/demo-Gtk-widgets.c:205 driver/xscreensaver-demo.glade.h:2
+#: driver/demo-Gtk-widgets.c:211 driver/xscreensaver-demo.glade.h:2
 msgid ""
 "Activate the XScreenSaver daemon now (locking the screen if so configured.)"
 msgstr "Activer le démon XScreenSaver (blocage de l'écran si c'est configuré)."
 
-#: driver/demo-Gtk-widgets.c:209 driver/xscreensaver-demo.glade.h:97
-#: driver/xscreensaver-demo.glade2.h:58
+#: driver/demo-Gtk-widgets.c:215 driver/xscreensaver-demo.glade.h:97
+#: driver/xscreensaver-demo.glade2.h:80
 msgid "_Lock Screen Now"
 msgstr "_Verrouiller l'écran maintenant"
 
-#: driver/demo-Gtk-widgets.c:218 driver/xscreensaver-demo.glade.h:51
+#: driver/demo-Gtk-widgets.c:224 driver/xscreensaver-demo.glade.h:51
 msgid "Lock the screen now (even if \"Lock Screen\" is unchecked.)"
 msgstr ""
 "Verrouille l'écran maintenant (même si \"Verrouiller l'écran\" n'est pas "
 "validé)."
 
-#: driver/demo-Gtk-widgets.c:222 driver/xscreensaver-demo.glade.h:96
-#: driver/xscreensaver-demo.glade2.h:56
+#: driver/demo-Gtk-widgets.c:228 driver/xscreensaver-demo.glade.h:96
+#: driver/xscreensaver-demo.glade2.h:78
 msgid "_Kill Daemon"
 msgstr "_Tuer le démon"
 
-#: driver/demo-Gtk-widgets.c:231 driver/xscreensaver-demo.glade.h:71
+#: driver/demo-Gtk-widgets.c:237 driver/xscreensaver-demo.glade.h:71
 msgid "Tell the running XScreenSaver daemon to exit."
 msgstr "Demande au démon courant de XScreenSaver de se terminer."
 
-#: driver/demo-Gtk-widgets.c:235 driver/xscreensaver-demo.glade.h:98
-#: driver/xscreensaver-demo.glade2.h:64
+#: driver/demo-Gtk-widgets.c:241 driver/xscreensaver-demo.glade.h:98
+#: driver/xscreensaver-demo.glade2.h:86
 msgid "_Restart Daemon"
 msgstr "_Redémarrer le démon"
 
-#: driver/demo-Gtk-widgets.c:244 driver/xscreensaver-demo.glade.h:49
+#: driver/demo-Gtk-widgets.c:250 driver/xscreensaver-demo.glade.h:49
 msgid "Kill and re-launch the XScreenSaver daemon."
 msgstr "Tue et re-lance le démon XScreenSaver."
 
-#: driver/demo-Gtk-widgets.c:257 driver/xscreensaver-demo.glade.h:95
+#: driver/demo-Gtk-widgets.c:263 driver/xscreensaver-demo.glade.h:95
 msgid "_Exit"
 msgstr "_Quitter"
 
-#: driver/demo-Gtk-widgets.c:266 driver/xscreensaver-demo.glade.h:33
+#: driver/demo-Gtk-widgets.c:272 driver/xscreensaver-demo.glade.h:33
 msgid ""
 "Exit the xscreensaver-demo program (but leave the XScreenSaver daemon "
 "running in the background.)"
@@ -93,64 +98,65 @@ msgstr ""
 "Sort du programme xscreensaver-demo (mais laisse le démon XScreenSaver actif "
 "en arrière-plan)."
 
-#: driver/demo-Gtk-widgets.c:270 driver/xscreensaver-demo.glade2.h:55
+#: driver/demo-Gtk-widgets.c:276 driver/xscreensaver-demo.glade2.h:77
 msgid "_Help"
 msgstr "_Aide"
 
-#: driver/demo-Gtk-widgets.c:290 driver/xscreensaver-demo.glade.h:92
-#: driver/xscreensaver-demo.glade2.h:44
+#: driver/demo-Gtk-widgets.c:296 driver/xscreensaver-demo.glade.h:92
+#: driver/xscreensaver-demo.glade2.h:66
 msgid "_About..."
 msgstr "A _propos..."
 
-#: driver/demo-Gtk-widgets.c:299 driver/xscreensaver-demo.glade.h:30
+#: driver/demo-Gtk-widgets.c:305 driver/xscreensaver-demo.glade.h:30
 msgid "Display version information."
 msgstr "Affiche les informations de version"
 
-#: driver/demo-Gtk-widgets.c:303 driver/xscreensaver-demo.glade.h:94
-#: driver/xscreensaver-demo.glade2.h:53
+#: driver/demo-Gtk-widgets.c:309 driver/xscreensaver-demo.glade.h:94
+#: driver/xscreensaver-demo.glade2.h:75
 msgid "_Documentation..."
 msgstr "_Documentation..."
 
-#: driver/demo-Gtk-widgets.c:312 driver/xscreensaver-demo.glade.h:38
+#: driver/demo-Gtk-widgets.c:318 driver/xscreensaver-demo.glade.h:38
 msgid "Go to the documentation on the XScreenSaver web page."
 msgstr "Visite la page web de documentation de XScreenSaver."
 
-#: driver/demo-Gtk-widgets.c:342 driver/xscreensaver-demo.glade.h:18
+#: driver/demo-Gtk-widgets.c:348 driver/xscreensaver-demo.glade.h:18
 msgid "Cycle After"
 msgstr "Changement au bout de"
 
-#: driver/demo-Gtk-widgets.c:364 driver/xscreensaver-demo.glade.h:78
-#: driver/xscreensaver-demo.glade2.h:42
+#: driver/demo-Gtk-widgets.c:370 driver/xscreensaver-demo.glade.h:78
+#: driver/xscreensaver-demo.glade2.h:54
 msgid "Whether a password should be required to un-blank the screen."
 msgstr "Un mot de passe est-il requis pour débloquer l'écran."
 
-#: driver/demo-Gtk-widgets.c:366 driver/xscreensaver-demo.glade.h:50
+#: driver/demo-Gtk-widgets.c:372 driver/xscreensaver-demo.glade.h:50
 msgid "Lock Screen After"
 msgstr "Verrouiller l'écran après"
 
-#: driver/demo-Gtk-widgets.c:374 driver/xscreensaver-demo.glade.h:8
+#: driver/demo-Gtk-widgets.c:380 driver/xscreensaver-demo.glade.h:8
 msgid "Blank After"
 msgstr "Économiser l'écran après"
 
-#: driver/demo-Gtk-widgets.c:397 driver/demo-Gtk-widgets.c:447
-#: driver/demo-Gtk-widgets.c:461 driver/demo-Gtk-widgets.c:1010
-#: driver/xscreensaver-demo.glade.h:43 driver/xscreensaver-demo.glade2.h:26
+#: driver/demo-Gtk-widgets.c:403 driver/demo-Gtk-widgets.c:453
+#: driver/demo-Gtk-widgets.c:467 driver/demo-Gtk-widgets.c:1016
+#: driver/xscreensaver-demo.glade.h:43
 msgid "How long before the monitor goes completely black."
 msgstr "Durée avant que le moniteur passe complètement au noir."
 
-#: driver/demo-Gtk-widgets.c:401 driver/demo-Gtk-widgets.c:413
-#: driver/demo-Gtk-widgets.c:425 driver/demo-Gtk-widgets.c:1014
-#: driver/demo-Gtk-widgets.c:1026 driver/demo-Gtk-widgets.c:1038
-#: driver/xscreensaver-demo.glade.h:99 driver/xscreensaver-demo.glade2.h:70
+#: driver/demo-Gtk-widgets.c:407 driver/demo-Gtk-widgets.c:419
+#: driver/demo-Gtk-widgets.c:431 driver/demo-Gtk-widgets.c:1020
+#: driver/demo-Gtk-widgets.c:1032 driver/demo-Gtk-widgets.c:1044
+#: driver/xscreensaver-demo.glade.h:99 driver/xscreensaver-demo.glade2.h:92
 msgid "minutes"
 msgstr "minutes"
 
-#: driver/demo-Gtk-widgets.c:476 driver/demo-Gtk.c:2661
+#: driver/demo-Gtk-widgets.c:482 driver/demo-Gtk.c:2834
 #: driver/xscreensaver-demo.glade.h:58
 msgid "Preview"
 msgstr "Aperçu"
 
-#: driver/demo-Gtk-widgets.c:484 driver/xscreensaver-demo.glade.h:21
+#: driver/demo-Gtk-widgets.c:490 driver/xscreensaver-demo.glade.h:21
+#: driver/xscreensaver-demo.glade2.h:12
 msgid ""
 "Demo the selected screen saver in full-screen mode (click the mouse to "
 "return.)"
@@ -158,53 +164,55 @@ msgstr ""
 "Démo de l'économiseur d'écran sélectionné en mode plein-écran (cliquer avec "
 "la souris pour en sortir.)"
 
-#: driver/demo-Gtk-widgets.c:486 driver/xscreensaver-demo.glade.h:65
+#: driver/demo-Gtk-widgets.c:492 driver/xscreensaver-demo.glade.h:65
 msgid "Settings..."
 msgstr "Réglages..."
 
-#: driver/demo-Gtk-widgets.c:494 driver/xscreensaver-demo.glade.h:17
+#: driver/demo-Gtk-widgets.c:500 driver/xscreensaver-demo.glade.h:17
+#: driver/xscreensaver-demo.glade2.h:9
 msgid "Customization and explanation of the selected screen saver."
 msgstr "Configuration et explications pour l'économiseur d'écran sélectionné."
 
-#: driver/demo-Gtk-widgets.c:515 driver/xscreensaver-demo.glade.h:52
+#: driver/demo-Gtk-widgets.c:521 driver/xscreensaver-demo.glade.h:52
 msgid "Mode:"
 msgstr "Mode :"
 
-#: driver/demo-Gtk-widgets.c:533 driver/xscreensaver-demo.glade.h:25
-#: driver/xscreensaver-demo.glade2.h:14
+#: driver/demo-Gtk-widgets.c:539 driver/xscreensaver-demo.glade.h:25
+#: driver/xscreensaver-demo.glade2.h:16
 msgid "Disable Screen Saver"
 msgstr "Désactiver l'économiseur d'écran"
 
-#: driver/demo-Gtk-widgets.c:536 driver/xscreensaver-demo.glade.h:9
+#: driver/demo-Gtk-widgets.c:542 driver/xscreensaver-demo.glade.h:9
 #: driver/xscreensaver-demo.glade2.h:5
 msgid "Blank Screen Only"
 msgstr "Économiser l'écran uniquement"
 
-#: driver/demo-Gtk-widgets.c:539 driver/xscreensaver-demo.glade.h:56
-#: driver/xscreensaver-demo.glade2.h:32
+#: driver/demo-Gtk-widgets.c:545 driver/xscreensaver-demo.glade.h:56
+#: driver/xscreensaver-demo.glade2.h:42
 msgid "Only One Screen Saver"
 msgstr "Seulement un économiseur d'écran"
 
-#: driver/demo-Gtk-widgets.c:542 driver/xscreensaver-demo.glade.h:60
-#: driver/xscreensaver-demo.glade2.h:35
+#: driver/demo-Gtk-widgets.c:548 driver/xscreensaver-demo.glade.h:60
+#: driver/xscreensaver-demo.glade2.h:44
 msgid "Random Screen Saver"
 msgstr "Économiseur d'écran aléatoire"
 
-#: driver/demo-Gtk-widgets.c:565 driver/demo-Gtk.c:2034
+#: driver/demo-Gtk-widgets.c:571 driver/demo-Gtk.c:2123
 #: driver/xscreensaver-demo.glade.h:75
 msgid "Use"
 msgstr "Choisis"
 
-#: driver/demo-Gtk-widgets.c:585 driver/demo-Gtk.c:2044
+#: driver/demo-Gtk-widgets.c:591 driver/demo-Gtk.c:2133
 #: driver/xscreensaver-demo.glade.h:63
 msgid "Screen Saver"
 msgstr "Économiseur d'écran"
 
-#: driver/demo-Gtk-widgets.c:638 driver/xscreensaver-demo.glade.h:91
+#: driver/demo-Gtk-widgets.c:644 driver/xscreensaver-demo.glade.h:91
 msgid "\\/"
 msgstr "\\/"
 
-#: driver/demo-Gtk-widgets.c:646 driver/xscreensaver-demo.glade.h:61
+#: driver/demo-Gtk-widgets.c:652 driver/xscreensaver-demo.glade.h:61
+#: driver/xscreensaver-demo.glade2.h:45
 msgid ""
 "Run the next screen saver in the list in full-screen mode (click the mouse "
 "to return.)"
@@ -212,11 +220,12 @@ msgstr ""
 "Lance l'économiseur d'écran suivant dans la liste en mode plein-écran "
 "(cliquer la souris pour revenir.)"
 
-#: driver/demo-Gtk-widgets.c:648
+#: driver/demo-Gtk-widgets.c:654
 msgid "/\\"
 msgstr "/\\"
 
-#: driver/demo-Gtk-widgets.c:656 driver/xscreensaver-demo.glade.h:62
+#: driver/demo-Gtk-widgets.c:662 driver/xscreensaver-demo.glade.h:62
+#: driver/xscreensaver-demo.glade2.h:46
 msgid ""
 "Run the previous screen saver in the list in full-screen mode (click the "
 "mouse to return.)"
@@ -224,29 +233,31 @@ msgstr ""
 "Lance l'économiseur d'écran précédent dans la liste en mode plein-écran "
 "(cliquer la souris pour revenir.)"
 
-#: driver/demo-Gtk-widgets.c:658 driver/demo-Gtk-widgets.c:1601
-#: driver/xscreensaver-demo.glade.h:22 driver/xscreensaver-demo.glade2.h:11
+#: driver/demo-Gtk-widgets.c:664 driver/demo-Gtk-widgets.c:1607
+#: driver/xscreensaver-demo.glade.h:22 driver/xscreensaver-demo.glade2.h:13
 msgid "Description"
 msgstr "Description"
 
-#: driver/demo-Gtk-widgets.c:685 driver/xscreensaver-demo.glade.h:26
+#: driver/demo-Gtk-widgets.c:691 driver/xscreensaver-demo.glade.h:26
 msgid "Display Modes"
 msgstr "Modes d'affichage"
 
-#: driver/demo-Gtk-widgets.c:701 driver/xscreensaver-demo.glade.h:23
-#: driver/xscreensaver-demo.glade2.h:12
+#: driver/demo-Gtk-widgets.c:707 driver/xscreensaver-demo.glade.h:23
+#: driver/xscreensaver-demo.glade2.h:14
 msgid "Diagnostics"
 msgstr "Diagnostiques"
 
-#: driver/demo-Gtk-widgets.c:745 driver/xscreensaver-demo.glade.h:80
+#: driver/demo-Gtk-widgets.c:751 driver/xscreensaver-demo.glade.h:80
+#: driver/xscreensaver-demo.glade2.h:56
 msgid "Whether the daemon should print lots of debugging information."
 msgstr "Le démon doit-il afficher beaucoup d'informations de mise au point."
 
-#: driver/demo-Gtk-widgets.c:747 driver/xscreensaver-demo.glade.h:76
+#: driver/demo-Gtk-widgets.c:753 driver/xscreensaver-demo.glade.h:76
 msgid "Verbose Diagnostics"
 msgstr "Diagnostiques verbeux"
 
-#: driver/demo-Gtk-widgets.c:762 driver/xscreensaver-demo.glade.h:79
+#: driver/demo-Gtk-widgets.c:768 driver/xscreensaver-demo.glade.h:79
+#: driver/xscreensaver-demo.glade2.h:55
 msgid ""
 "Whether any error output of the display modes should be redirected to the "
 "screen."
@@ -254,11 +265,12 @@ msgstr ""
 "Les messages d'erreur des modes d'affichages doivent-ils être redirigés vers "
 "l'écran."
 
-#: driver/demo-Gtk-widgets.c:764 driver/xscreensaver-demo.glade.h:29
+#: driver/demo-Gtk-widgets.c:770 driver/xscreensaver-demo.glade.h:29
 msgid "Display Subprocess Errors"
 msgstr "Afficher les erreurs des sous-processus"
 
-#: driver/demo-Gtk-widgets.c:779 driver/xscreensaver-demo.glade.h:87
+#: driver/demo-Gtk-widgets.c:785 driver/xscreensaver-demo.glade.h:87
+#: driver/xscreensaver-demo.glade2.h:63
 msgid ""
 "Whether the splash screen (with the version number and `Help' button) should "
 "be momentarily displayed when the daemon first starts up."
@@ -266,16 +278,17 @@ msgstr ""
 "L'écran de démarrage (avec le numéro de version et le bouton 'Aide') doit-il "
 "être affiché momentanément au premier démarrage du démon."
 
-#: driver/demo-Gtk-widgets.c:781 driver/xscreensaver-demo.glade.h:28
+#: driver/demo-Gtk-widgets.c:787 driver/xscreensaver-demo.glade.h:28
 msgid "Display Splash Screen at Startup"
 msgstr "Afficher l'écran de démarrage"
 
-#: driver/demo-Gtk-widgets.c:790 driver/xscreensaver-demo.glade.h:15
+#: driver/demo-Gtk-widgets.c:796 driver/xscreensaver-demo.glade.h:15
 #: driver/xscreensaver-demo.glade2.h:8
 msgid "Colormaps"
 msgstr "Palettes de couleurs"
 
-#: driver/demo-Gtk-widgets.c:834 driver/xscreensaver-demo.glade.h:88
+#: driver/demo-Gtk-widgets.c:840 driver/xscreensaver-demo.glade.h:88
+#: driver/xscreensaver-demo.glade2.h:64
 msgid ""
 "Whether to install a private colormap when running in 8-bit mode on the "
 "default Visual."
@@ -283,22 +296,24 @@ msgstr ""
 "Faut-il installer une palette de couleurs privée en mode 8-bits pour le "
 "visuel par défaut"
 
-#: driver/demo-Gtk-widgets.c:836 driver/xscreensaver-demo.glade.h:48
+#: driver/demo-Gtk-widgets.c:842 driver/xscreensaver-demo.glade.h:48
 msgid "Install Colormap"
 msgstr "Installer une palette de couleur"
 
-#: driver/demo-Gtk-widgets.c:859 driver/xscreensaver-demo.glade.h:86
+#: driver/demo-Gtk-widgets.c:865 driver/xscreensaver-demo.glade.h:86
+#: driver/xscreensaver-demo.glade2.h:62
 msgid ""
 "Whether the screen should slowly fade to black when the screen saver "
 "activates."
 msgstr ""
 "L'écran doit-il fondre lentement au noir quand l'économiseur d'écran s'active"
 
-#: driver/demo-Gtk-widgets.c:861 driver/xscreensaver-demo.glade.h:36
+#: driver/demo-Gtk-widgets.c:867 driver/xscreensaver-demo.glade.h:36
 msgid "Fade To Black When Blanking"
 msgstr "Fondu au noir lors du verrouillage"
 
-#: driver/demo-Gtk-widgets.c:876 driver/xscreensaver-demo.glade.h:85
+#: driver/demo-Gtk-widgets.c:882 driver/xscreensaver-demo.glade.h:85
+#: driver/xscreensaver-demo.glade2.h:61
 msgid ""
 "Whether the screen should slowly fade in from black when the screen saver "
 "deactivates."
@@ -306,62 +321,67 @@ msgstr ""
 "L'écran doit-il fondre lentement depuis le noir quand l'économiseur d'écran "
 "se désactive"
 
-#: driver/demo-Gtk-widgets.c:878 driver/xscreensaver-demo.glade.h:35
+#: driver/demo-Gtk-widgets.c:884 driver/xscreensaver-demo.glade.h:35
 msgid "Fade From Black When Unblanking"
 msgstr "Fondu depuis le noir lors du dé-verrouillage"
 
-#: driver/demo-Gtk-widgets.c:904 driver/xscreensaver-demo.glade.h:34
+#: driver/demo-Gtk-widgets.c:910 driver/xscreensaver-demo.glade.h:34
 msgid "Fade Duration"
 msgstr "Durée du fondu"
 
-#: driver/demo-Gtk-widgets.c:922 driver/xscreensaver-demo.glade.h:44
+#: driver/demo-Gtk-widgets.c:928 driver/xscreensaver-demo.glade.h:44
+#: driver/xscreensaver-demo.glade2.h:31
 msgid "How long it should take for the screen to fade in and out."
 msgstr "Combien de temps doivent durer les fondus avec le noir."
 
-#: driver/demo-Gtk-widgets.c:926 driver/xscreensaver-demo.glade.h:100
-#: driver/xscreensaver-demo.glade2.h:73
+#: driver/demo-Gtk-widgets.c:932 driver/xscreensaver-demo.glade.h:100
+#: driver/xscreensaver-demo.glade2.h:96
 msgid "seconds"
 msgstr "secondes"
 
-#: driver/demo-Gtk-widgets.c:936 driver/xscreensaver-demo.glade.h:27
-#: driver/xscreensaver-demo.glade2.h:15
+#: driver/demo-Gtk-widgets.c:942 driver/xscreensaver-demo.glade.h:27
+#: driver/xscreensaver-demo.glade2.h:17
 msgid "Display Power Management"
 msgstr "Gestion d'alimentation de l'écran"
 
-#: driver/demo-Gtk-widgets.c:980 driver/xscreensaver-demo.glade.h:84
+#: driver/demo-Gtk-widgets.c:986 driver/xscreensaver-demo.glade.h:84
+#: driver/xscreensaver-demo.glade2.h:60
 msgid "Whether the monitor should be powered down after a while."
 msgstr "Le moniteur doit-il passer en économie d'énergie au bout d'un moment."
 
-#: driver/demo-Gtk-widgets.c:982 driver/xscreensaver-demo.glade.h:57
+#: driver/demo-Gtk-widgets.c:988 driver/xscreensaver-demo.glade.h:57
 msgid "Power Management Enabled"
 msgstr "Gestion d'alimentation de l'écran autorisée"
 
-#: driver/demo-Gtk-widgets.c:1050 driver/xscreensaver-demo.glade.h:55
+#: driver/demo-Gtk-widgets.c:1056 driver/xscreensaver-demo.glade.h:55
 msgid "Off After"
 msgstr "Extinction après"
 
-#: driver/demo-Gtk-widgets.c:1063 driver/xscreensaver-demo.glade.h:70
+#: driver/demo-Gtk-widgets.c:1069 driver/xscreensaver-demo.glade.h:70
 msgid "Suspend After"
 msgstr "Suspension après"
 
-#: driver/demo-Gtk-widgets.c:1076 driver/xscreensaver-demo.glade.h:68
+#: driver/demo-Gtk-widgets.c:1082 driver/xscreensaver-demo.glade.h:68
 msgid "Standby After"
 msgstr "En attente après"
 
-#: driver/demo-Gtk-widgets.c:1099 driver/xscreensaver-demo.glade.h:45
+#: driver/demo-Gtk-widgets.c:1105 driver/xscreensaver-demo.glade.h:45
+#: driver/xscreensaver-demo.glade2.h:33
 msgid "How long until the monitor goes into power-saving mode."
 msgstr "Durée avant que le moniteur passe en mode d'économie d'énergie."
 
-#: driver/demo-Gtk-widgets.c:1113 driver/xscreensaver-demo.glade.h:46
+#: driver/demo-Gtk-widgets.c:1119 driver/xscreensaver-demo.glade.h:46
+#: driver/xscreensaver-demo.glade2.h:34
 msgid "How long until the monitor powers down."
 msgstr "Durée avant que le moniteur coupe l'alimentation."
 
-#: driver/demo-Gtk-widgets.c:1117 driver/xscreensaver-demo.glade.h:47
-#: driver/xscreensaver-demo.glade2.h:27
+#: driver/demo-Gtk-widgets.c:1123 driver/xscreensaver-demo.glade.h:47
+#: driver/xscreensaver-demo.glade2.h:35
 msgid "Image Manipulation"
 msgstr "Manipulation d'images"
 
-#: driver/demo-Gtk-widgets.c:1161 driver/xscreensaver-demo.glade.h:81
+#: driver/demo-Gtk-widgets.c:1167 driver/xscreensaver-demo.glade.h:81
+#: driver/xscreensaver-demo.glade2.h:57
 msgid ""
 "Whether the image-manipulating modes should be allowed to operate on an "
 "image of your desktop."
@@ -369,11 +389,11 @@ msgstr ""
 "Les modes qui manipulent des images sont-ils autorisé à utiliser une image "
 "de votre bureau."
 
-#: driver/demo-Gtk-widgets.c:1163 driver/xscreensaver-demo.glade.h:39
+#: driver/demo-Gtk-widgets.c:1169 driver/xscreensaver-demo.glade.h:39
 msgid "Grab Desktop Images"
 msgstr "Capturer l'image du bureau"
 
-#: driver/demo-Gtk-widgets.c:1178 driver/xscreensaver-demo.glade.h:82
+#: driver/demo-Gtk-widgets.c:1184 driver/xscreensaver-demo.glade.h:82
 msgid ""
 "Whether the image-manipulating modes should operate on images captured from "
 "the system's video input (if there is one)."
@@ -381,11 +401,12 @@ msgstr ""
 "Les modes qui manipulent des images sont-ils autorisé à utiliser des images "
 "capturées par l'entrée vidéo du système (si il y en a une)."
 
-#: driver/demo-Gtk-widgets.c:1180 driver/xscreensaver-demo.glade.h:40
+#: driver/demo-Gtk-widgets.c:1186 driver/xscreensaver-demo.glade.h:40
 msgid "Grab Video Frames"
 msgstr "Capturer des trames vidéo"
 
-#: driver/demo-Gtk-widgets.c:1195 driver/xscreensaver-demo.glade.h:83
+#: driver/demo-Gtk-widgets.c:1201 driver/xscreensaver-demo.glade.h:83
+#: driver/xscreensaver-demo.glade2.h:59
 msgid ""
 "Whether the image-manipulating modes should operate on random images loaded "
 "from disk."
@@ -393,108 +414,109 @@ msgstr ""
 "Les modes qui manipulent des images sont-ils autorisé à utiliser des images "
 "chargées aléatoirement depuis le disque."
 
-#: driver/demo-Gtk-widgets.c:1197 driver/xscreensaver-demo.glade.h:12
+#: driver/demo-Gtk-widgets.c:1203 driver/xscreensaver-demo.glade.h:12
 msgid "Choose Random Image:"
 msgstr "Choisir une image aléatoire :"
 
-#: driver/demo-Gtk-widgets.c:1230 driver/xscreensaver-demo.glade.h:73
+#: driver/demo-Gtk-widgets.c:1236 driver/xscreensaver-demo.glade.h:73
+#: driver/xscreensaver-demo.glade2.h:52
 msgid "The directory from which images will be randomly chosen."
 msgstr "Répertoire source des images aléatoires."
 
-#: driver/demo-Gtk-widgets.c:1232 driver/xscreensaver-demo.glade.h:10
+#: driver/demo-Gtk-widgets.c:1238 driver/xscreensaver-demo.glade.h:10
 msgid "Browse"
 msgstr "Parcourir"
 
-#: driver/demo-Gtk-widgets.c:1240 driver/demo-Gtk-widgets.c:1593
+#: driver/demo-Gtk-widgets.c:1246 driver/demo-Gtk-widgets.c:1599
 #: driver/xscreensaver-demo.glade.h:3 driver/xscreensaver-demo.glade2.h:2
 msgid "Advanced"
-msgstr "Avancé"
+msgstr "Avancés"
 
-#: driver/demo-Gtk-widgets.c:1438 driver/xscreensaver-demo.glade.h:90
+#: driver/demo-Gtk-widgets.c:1444 driver/xscreensaver-demo.glade.h:90
 msgid "XScreenSaver: Mode-Specific Settings"
 msgstr "XScreenSaver: réglages spécifiques au mode"
 
-#: driver/demo-Gtk-widgets.c:1460 driver/xscreensaver-demo.glade.h:64
-#: driver/xscreensaver-demo.glade2.h:36
+#: driver/demo-Gtk-widgets.c:1466 driver/xscreensaver-demo.glade.h:64
+#: driver/xscreensaver-demo.glade2.h:47
 msgid "Settings"
 msgstr "Réglages"
 
-#: driver/demo-Gtk-widgets.c:1489 driver/xscreensaver-demo.glade.h:66
-#: driver/xscreensaver-demo.glade2.h:38
+#: driver/demo-Gtk-widgets.c:1495 driver/xscreensaver-demo.glade.h:66
+#: driver/xscreensaver-demo.glade2.h:49
 msgid "Standard"
 msgstr "Standard"
 
-#: driver/demo-Gtk-widgets.c:1526 driver/xscreensaver-demo.glade.h:77
+#: driver/demo-Gtk-widgets.c:1532 driver/xscreensaver-demo.glade.h:77
 msgid "Visual:"
 msgstr "Visuel :"
 
-#: driver/demo-Gtk-widgets.c:1544 driver/demo-Gtk-widgets.c:1567
-#: driver/demo-Gtk.c:1479 driver/demo-Gtk.c:2680
+#: driver/demo-Gtk-widgets.c:1550 driver/demo-Gtk-widgets.c:1573
+#: driver/demo-Gtk.c:1530 driver/demo-Gtk.c:2853
 #: driver/xscreensaver-demo.glade.h:5 driver/xscreensaver-demo.glade2.h:3
 msgid "Any"
 msgstr "Tous"
 
-#: driver/demo-Gtk-widgets.c:1545 driver/xscreensaver-demo.glade.h:7
+#: driver/demo-Gtk-widgets.c:1551 driver/xscreensaver-demo.glade.h:7
 #: driver/xscreensaver-demo.glade2.h:4
 msgid "Best"
 msgstr "Le meilleur"
 
-#: driver/demo-Gtk-widgets.c:1546 driver/xscreensaver-demo.glade.h:19
-#: driver/xscreensaver-demo.glade2.h:9
+#: driver/demo-Gtk-widgets.c:1552 driver/xscreensaver-demo.glade.h:19
+#: driver/xscreensaver-demo.glade2.h:10
 msgid "Default"
 msgstr "Par défaut"
 
-#: driver/demo-Gtk-widgets.c:1547 driver/xscreensaver-demo.glade.h:20
-#: driver/xscreensaver-demo.glade2.h:10
+#: driver/demo-Gtk-widgets.c:1553 driver/xscreensaver-demo.glade.h:20
+#: driver/xscreensaver-demo.glade2.h:11
 msgid "Default-N"
 msgstr "Défault-N"
 
-#: driver/demo-Gtk-widgets.c:1548 driver/xscreensaver-demo.glade.h:37
-#: driver/xscreensaver-demo.glade2.h:21
+#: driver/demo-Gtk-widgets.c:1554 driver/xscreensaver-demo.glade.h:37
+#: driver/xscreensaver-demo.glade2.h:23
 msgid "GL"
 msgstr "OpenGL"
 
-#: driver/demo-Gtk-widgets.c:1549 driver/xscreensaver-demo.glade.h:74
-#: driver/xscreensaver-demo.glade2.h:41
+#: driver/demo-Gtk-widgets.c:1555 driver/xscreensaver-demo.glade.h:74
+#: driver/xscreensaver-demo.glade2.h:53
 msgid "TrueColor"
 msgstr "Couleurs vraies"
 
-#: driver/demo-Gtk-widgets.c:1550 driver/xscreensaver-demo.glade.h:59
-#: driver/xscreensaver-demo.glade2.h:34
+#: driver/demo-Gtk-widgets.c:1556 driver/xscreensaver-demo.glade.h:59
+#: driver/xscreensaver-demo.glade2.h:43
 msgid "PseudoColor"
 msgstr "Pseudo couleurs"
 
-#: driver/demo-Gtk-widgets.c:1551 driver/xscreensaver-demo.glade.h:69
-#: driver/xscreensaver-demo.glade2.h:39
+#: driver/demo-Gtk-widgets.c:1557 driver/xscreensaver-demo.glade.h:69
+#: driver/xscreensaver-demo.glade2.h:50
 msgid "StaticGray"
 msgstr "StaticGray"
 
-#: driver/demo-Gtk-widgets.c:1552 driver/xscreensaver-demo.glade.h:42
-#: driver/xscreensaver-demo.glade2.h:25
+#: driver/demo-Gtk-widgets.c:1558 driver/xscreensaver-demo.glade.h:42
+#: driver/xscreensaver-demo.glade2.h:27
 msgid "GrayScale"
 msgstr "Niveaux de gris"
 
-#: driver/demo-Gtk-widgets.c:1553 driver/xscreensaver-demo.glade.h:24
-#: driver/xscreensaver-demo.glade2.h:13
+#: driver/demo-Gtk-widgets.c:1559 driver/xscreensaver-demo.glade.h:24
+#: driver/xscreensaver-demo.glade2.h:15
 msgid "DirectColor"
 msgstr "Couleurs directes"
 
-#: driver/demo-Gtk-widgets.c:1554 driver/xscreensaver-demo.glade.h:14
+#: driver/demo-Gtk-widgets.c:1560 driver/xscreensaver-demo.glade.h:14
 #: driver/xscreensaver-demo.glade2.h:7
 msgid "Color"
 msgstr "Couleur"
 
-#: driver/demo-Gtk-widgets.c:1555 driver/xscreensaver-demo.glade.h:41
-#: driver/xscreensaver-demo.glade2.h:24
+#: driver/demo-Gtk-widgets.c:1561 driver/xscreensaver-demo.glade.h:41
+#: driver/xscreensaver-demo.glade2.h:26
 msgid "Gray"
 msgstr "Gris"
 
-#: driver/demo-Gtk-widgets.c:1556 driver/xscreensaver-demo.glade.h:53
-#: driver/xscreensaver-demo.glade2.h:29
+#: driver/demo-Gtk-widgets.c:1562 driver/xscreensaver-demo.glade.h:53
+#: driver/xscreensaver-demo.glade2.h:37
 msgid "Mono"
 msgstr "Monochrome"
 
-#: driver/demo-Gtk-widgets.c:1566 driver/xscreensaver-demo.glade.h:72
+#: driver/demo-Gtk-widgets.c:1572 driver/xscreensaver-demo.glade.h:72
 msgid ""
 "The X visual type that this demo will require.  If that visual is available "
 "it will be used, otherwise, this demo will not be run."
@@ -502,61 +524,51 @@ msgstr ""
 "Le visuel X11 nécessaire pour cette démo. S'il est disponible il sera "
 "utilisé, sinon cette démo ne fonctionnera pas."
 
-#: driver/demo-Gtk-widgets.c:1569 driver/xscreensaver-demo.glade.h:16
+#: driver/demo-Gtk-widgets.c:1575 driver/xscreensaver-demo.glade.h:16
 msgid "Command Line:"
 msgstr "Ligne de commande :"
 
-#: driver/demo-Gtk-widgets.c:1641 driver/xscreensaver-demo.glade.h:31
+#: driver/demo-Gtk-widgets.c:1647 driver/xscreensaver-demo.glade.h:31
 msgid "Documentation..."
 msgstr "Documentation..."
 
-#: driver/demo-Gtk-widgets.c:1649 driver/xscreensaver-demo.glade.h:13
+#: driver/demo-Gtk-widgets.c:1655 driver/xscreensaver-demo.glade.h:13
 msgid "Click here to read the manual for this display mode, if it has one."
 msgstr ""
 "Cliquer ici pour lire le manuel de ce mode d'affichage, s'il en possède un."
 
-#: driver/demo-Gtk-widgets.c:1674 driver/xscreensaver-demo.glade.h:4
+#: driver/demo-Gtk-widgets.c:1680 driver/xscreensaver-demo.glade.h:4
 msgid "Advanced >>"
-msgstr "Avancé >>"
+msgstr "Avancés >>"
 
-#: driver/demo-Gtk-widgets.c:1682 driver/xscreensaver-demo.glade.h:32
+#: driver/demo-Gtk-widgets.c:1688 driver/xscreensaver-demo.glade.h:32
 msgid "Edit the command line directly."
 msgstr "Editer directement la ligne de commande."
 
-#: driver/demo-Gtk-widgets.c:1684 driver/xscreensaver-demo.glade.h:67
+#: driver/demo-Gtk-widgets.c:1690 driver/xscreensaver-demo.glade.h:67
 msgid "Standard <<"
 msgstr "Standard <<"
 
-#: driver/demo-Gtk-widgets.c:1692 driver/xscreensaver-demo.glade.h:6
+#: driver/demo-Gtk-widgets.c:1698 driver/xscreensaver-demo.glade.h:6
 msgid "Back to the graphical configuration options."
 msgstr "Retour aux options de configuration graphique."
 
-#: driver/demo-Gtk-widgets.c:1703 driver/demo-Gtk.c:688
+#: driver/demo-Gtk-widgets.c:1709 driver/demo-Gtk.c:733
 #: driver/xscreensaver-demo.glade.h:54
 msgid "OK"
 msgstr "Valider"
 
-#: driver/demo-Gtk-widgets.c:1712 driver/xscreensaver-demo.glade.h:11
+#: driver/demo-Gtk-widgets.c:1718 driver/xscreensaver-demo.glade.h:11
 msgid "Cancel"
 msgstr "Annuler"
 
-#: driver/demo-Gtk.c:601
+#: driver/demo-Gtk.c:641
 msgid "For updates, check http://www.jwz.org/xscreensaver/"
 msgstr ""
 "Pour les mises à jour, voir «http://www.jwz.org/xscreensaver/»\n"
 "Traductions par Eric Lassauge «http://lassauge.free.fr/xscreensaver/»"
 
-#: driver/demo-Gtk.c:608
-#, c-format
-msgid "Copyright © 1991-2002 %s"
-msgstr ""
-
-#: driver/demo-Gtk.c:610
-#, c-format
-msgid "Copyright © 1991-2002 %s"
-msgstr ""
-
-#: driver/demo-Gtk.c:726
+#: driver/demo-Gtk.c:771
 msgid ""
 "Error:\n"
 "\n"
@@ -566,7 +578,7 @@ msgstr ""
 "\n"
 "Aucune URL d'aide spécifiée.\n"
 
-#: driver/demo-Gtk.c:812
+#: driver/demo-Gtk.c:857
 msgid ""
 "Error:\n"
 "\n"
@@ -577,7 +589,7 @@ msgstr ""
 "\n"
 "Le démon xscreensaver ne démarre pas correctement.\n"
 
-#: driver/demo-Gtk.c:818
+#: driver/demo-Gtk.c:869
 msgid ""
 "You are running as root.  This usually means that xscreensaver\n"
 "was unable to contact your X server because access control is\n"
@@ -612,11 +624,11 @@ msgstr ""
 "place il faut se connecter en tant qu'utilisateur normal et utiliser\n"
 "'su' si nécessaire."
 
-#: driver/demo-Gtk.c:834
+#: driver/demo-Gtk.c:885
 msgid "Please check your $PATH and permissions."
 msgstr "Vérifiez votre $PATH et les permissions."
 
-#: driver/demo-Gtk.c:869
+#: driver/demo-Gtk.c:920
 msgid ""
 "Error:\n"
 "\n"
@@ -626,7 +638,7 @@ msgstr ""
 "\n"
 "Impossible de déterminer le nom du fichier d'init !\n"
 
-#: driver/demo-Gtk.c:874
+#: driver/demo-Gtk.c:925
 #, c-format
 msgid ""
 "Error:\n"
@@ -637,7 +649,7 @@ msgstr ""
 "\n"
 "Impossible d'écrire dans %s.\n"
 
-#: driver/demo-Gtk.c:933
+#: driver/demo-Gtk.c:984
 msgid ""
 "Error:\n"
 "\n"
@@ -647,7 +659,7 @@ msgstr ""
 "\n"
 "La ressource «manualCommand» n'est pas renseignée."
 
-#: driver/demo-Gtk.c:1114
+#: driver/demo-Gtk.c:1165
 #, c-format
 msgid ""
 "Error:\n"
@@ -658,7 +670,7 @@ msgstr ""
 "\n"
 "Le format «%s» pour l'heure n'est pas exploitable.\n"
 
-#: driver/demo-Gtk.c:1779
+#: driver/demo-Gtk.c:1821
 #, c-format
 msgid ""
 "Error:\n"
@@ -669,23 +681,28 @@ msgstr ""
 "\n"
 "Répertoire «%s» inexistant.\n"
 
-#: driver/demo-Gtk.c:2376
+#: driver/demo-Gtk.c:2535
 msgid "Descriptions not available: no XML support compiled in."
 msgstr "Descriptions indisponibles: pas de support XML compilé."
 
-#: driver/demo-Gtk.c:2381
+#: driver/demo-Gtk.c:2540
 msgid "No description available."
 msgstr "Aucune description disponible."
 
-#: driver/demo-Gtk.c:2632
+#: driver/demo-Gtk.c:2805
 msgid "Blank Screen"
 msgstr "Verrouiller l'écran"
 
-#: driver/demo-Gtk.c:2638
+#: driver/demo-Gtk.c:2811
 msgid "Screen Saver Disabled"
 msgstr "Économiseur d'écran inhibé"
 
-#: driver/demo-Gtk.c:2798
+#: driver/demo-Gtk.c:2844
+#, c-format
+msgid "%s: %.100s Settings"
+msgstr "%s: réglages %.100s"
+
+#: driver/demo-Gtk.c:2999
 #, c-format
 msgid ""
 "Warning:\n"
@@ -696,15 +713,23 @@ msgstr ""
 "\n"
 "Le fichier \"%s\" a changé, rechargement.\n"
 
-#: driver/demo-Gtk.c:2875
+#: driver/demo-Gtk.c:3081
 msgid "No Preview"
 msgstr "Pas d'aperçu"
 
-#: driver/demo-Gtk.c:2875
+#: driver/demo-Gtk.c:3081
 msgid "Available"
 msgstr "Disponible"
 
-#: driver/demo-Gtk.c:3543
+#: driver/demo-Gtk.c:3082
+msgid "Not"
+msgstr "Non"
+
+#: driver/demo-Gtk.c:3082
+msgid "Installed"
+msgstr "installé"
+
+#: driver/demo-Gtk.c:3808
 #, c-format
 msgid ""
 "Warning:\n"
@@ -714,10 +739,10 @@ msgid ""
 msgstr ""
 "Attention :\n"
 "\n"
-"Le démon XScreenSaver n'est pas actif pour l'écran \"%s\". Lancement "
+"Le démon XScreenSaver n'est pas actif pour l'écran \"%s\". Le lancer "
 "maintenant ?"
 
-#: driver/demo-Gtk.c:3553
+#: driver/demo-Gtk.c:3818
 #, c-format
 msgid ""
 "Warning:\n"
@@ -735,8 +760,20 @@ msgid ""
 "\n"
 "Restart the xscreensaver daemon now?\n"
 msgstr ""
+"Attention:\n"
+"%s est lancé par l'utilisateur \"%s\" sur la machine \"%s\".\n"
+"Mais le xscreensaver gérant l'écran \"%s\"\n"
+"est lancé par l'utilisateur \"%s\" sur la machine \"%s\".\n"
+"\n"
+"Comme il s'agit d'utilisateurs différents, alors %s ne fonctionnera\n"
+"pas correctement.\n"
+"\n"
+"Vous devez soit re-lancer %s en tant que \"%s\", ou re-lancer\n"
+"xscreensaver en tant que \"%s\".\n"
+"\n"
+"Relancer le démon xscreensaver maintenant ?\n"
 
-#: driver/demo-Gtk.c:3812
+#: driver/demo-Gtk.c:3843
 #, c-format
 msgid ""
 "Warning:\n"
@@ -751,8 +788,18 @@ msgid ""
 "\n"
 "Restart the daemon on \"%s\" as \"%s\" now?\n"
 msgstr ""
+"Attention:\n"
+"%s est lancé par l'utilisateur \"%s\" sur la machine \"%s\".\n"
+"Mais le xscreensaver gérant l'écran \"%s\"\n"
+"est lancé par l'utilisateur \"%s\" sur la machine \"%s\".\n"
+"\n"
+"Si ces deux machines ne partagent pas le même système de fichier\n"
+"(c'est à dire pas le même fichier ~%s/.xscreensaver) alors\n"
+"%s ne fonctionnera pas correctement.\n"
+"\n"
+"Relancer le démon sur \"%s\" en tant que \"%s\" maintenant ?\n"
 
-#: driver/demo-Gtk.c:3834
+#: driver/demo-Gtk.c:3865
 #, c-format
 msgid ""
 "Warning:\n"
@@ -763,15 +810,25 @@ msgid ""
 "\n"
 "Restart the xscreensaver daemon now?\n"
 msgstr ""
+"Attention:\n"
+"Ceci est %s version %s.\n"
+"Mais le xscreensaver gérant l'écran \"%s\"\n"
+"est en version %s. Cela risque de causer des problèmes.\n"
+"\n"
+"Relancer le démon xscreensaver maintenant ?\n"
 
-#: driver/demo-Gtk.c:3999
+#: driver/demo-Gtk.c:4322
 #, c-format
 msgid "%s: unknown option: %s\n"
 msgstr "%s: option inconnue: «%s»\n"
 
+#: driver/demo-Gtk.c:4386
+msgid "Screensaver Preferences"
+msgstr "Préférences économiseur d'écran"
+
 #: driver/screensaver-properties.desktop.in.h:1
-msgid "Configure the settings of the screensaver."
-msgstr "Configurer les paramètres de l'économiseur d'écran"
+msgid "Change screensaver properties"
+msgstr "Modifier les propriétés de l'économiseur d'écran"
 
 #: driver/screensaver-properties.desktop.in.h:2
 msgid "Screensaver"
@@ -789,39 +846,60 @@ msgstr "*"
 msgid "Choose _Random Image:"
 msgstr "Choisir une image _Aléatoire :"
 
-#: driver/xscreensaver-demo.glade2.h:16
+#: driver/xscreensaver-demo.glade2.h:18
 msgid "Display Subprocess _Errors"
 msgstr "Afficher les erreurs des sous-process"
 
-#: driver/xscreensaver-demo.glade2.h:17
+#: driver/xscreensaver-demo.glade2.h:19
 msgid "Display _Splash Screen at Startup"
 msgstr "Afficher l'écran de _Démarrage"
 
-#: driver/xscreensaver-demo.glade2.h:18
+#: driver/xscreensaver-demo.glade2.h:20
 msgid "F_ade Duration"
 msgstr "Durée du _fondu"
 
-#: driver/xscreensaver-demo.glade2.h:19
+#: driver/xscreensaver-demo.glade2.h:21
 msgid "Fade from Black When _Unblanking"
 msgstr "Fondu depuis le noir lors du dé-verrouillage"
 
-#: driver/xscreensaver-demo.glade2.h:20
+#: driver/xscreensaver-demo.glade2.h:22
 msgid "Fade to Black when _Blanking"
 msgstr "Fondu au noir lors du _verrouillage"
 
-#: driver/xscreensaver-demo.glade2.h:22
+#: driver/xscreensaver-demo.glade2.h:24
 msgid "Grab Desktop _Images"
 msgstr "Capturer des _images du bureau"
 
-#: driver/xscreensaver-demo.glade2.h:23
+#: driver/xscreensaver-demo.glade2.h:25
 msgid "Grab _Video Frames"
 msgstr "Captures des trames _vidéo"
 
 #: driver/xscreensaver-demo.glade2.h:28
+msgid "How long after the screen blanks until a password will be required."
+msgstr ""
+"Combien de temps avant qu'il soit nécessaire de donner un mot de passe."
+
+#: driver/xscreensaver-demo.glade2.h:29
+msgid "How long before the screensaver activates."
+msgstr "Combien de temps avant l'activation de l'économiseur d'écran."
+
+#: driver/xscreensaver-demo.glade2.h:30
+msgid ""
+"How long each display mode should run before choosing a new one (in Random "
+"mode.)"
+msgstr ""
+"Combien de temps avant l'activation d'un autre économiseur d'écran (en mode "
+"aléatoire)"
+
+#: driver/xscreensaver-demo.glade2.h:32
+msgid "How long until the monitor goes completely black."
+msgstr "Durée avant que le moniteur passe complètement au noir."
+
+#: driver/xscreensaver-demo.glade2.h:36
 msgid "Install _Colormap"
 msgstr "Installer la palette de _couleurs"
 
-#: driver/xscreensaver-demo.glade2.h:30
+#: driver/xscreensaver-demo.glade2.h:38
 msgid ""
 "No Preview\n"
 "Available"
@@ -829,96 +907,111 @@ msgstr ""
 "Pas d'aperçu\n"
 "Disponible"
 
-#: driver/xscreensaver-demo.glade2.h:33
-msgid "Preview of screen saver"
-msgstr "Aperçu de l'économiseur d'écran"
+#: driver/xscreensaver-demo.glade2.h:40
+msgid ""
+"Not\n"
+"Installed"
+msgstr ""
+"Non\n"
+"installé"
 
-#: driver/xscreensaver-demo.glade2.h:37
+#: driver/xscreensaver-demo.glade2.h:48
 msgid "Stand_by After"
 msgstr "Blo_cage après"
 
-#: driver/xscreensaver-demo.glade2.h:40
+#: driver/xscreensaver-demo.glade2.h:51
 msgid "Sus_pend After"
 msgstr "Sus_pend après"
 
-#: driver/xscreensaver-demo.glade2.h:45
+#: driver/xscreensaver-demo.glade2.h:58
+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 des images "
+"capturées par l'entrée vidéo du système (si il y en a une)."
+
+#: driver/xscreensaver-demo.glade2.h:67
 msgid "_Advanced"
 msgstr "_Avancé"
 
-#: driver/xscreensaver-demo.glade2.h:46
+#: driver/xscreensaver-demo.glade2.h:68
 msgid "_Advanced >>"
 msgstr "_Avancé >>"
 
-#: driver/xscreensaver-demo.glade2.h:47
+#: driver/xscreensaver-demo.glade2.h:69
 msgid "_Blank After"
 msgstr "_Verrouillage après"
 
-#: driver/xscreensaver-demo.glade2.h:49
+#: driver/xscreensaver-demo.glade2.h:71
 msgid "_Browse"
 msgstr "_Parcourir"
 
-#: driver/xscreensaver-demo.glade2.h:50
+#: driver/xscreensaver-demo.glade2.h:72
 msgid "_Command Line:"
 msgstr "_Ligne de commande :"
 
-#: driver/xscreensaver-demo.glade2.h:51
+#: driver/xscreensaver-demo.glade2.h:73
 msgid "_Cycle After"
 msgstr "_Changement au bout de"
 
-#: driver/xscreensaver-demo.glade2.h:52
+#: driver/xscreensaver-demo.glade2.h:74
 msgid "_Display Modes"
 msgstr "_Modes d'affichage"
 
-#: driver/xscreensaver-demo.glade2.h:57
+#: driver/xscreensaver-demo.glade2.h:79
 msgid "_Lock Screen After"
 msgstr "_Verrouillage de l'écran après"
 
-#: driver/xscreensaver-demo.glade2.h:59
+#: driver/xscreensaver-demo.glade2.h:81
 msgid "_Mode:"
 msgstr "_Mode :"
 
-#: driver/xscreensaver-demo.glade2.h:60
+#: driver/xscreensaver-demo.glade2.h:82
 msgid "_Off After"
 msgstr "Coup_ure après"
 
-#: driver/xscreensaver-demo.glade2.h:61
+#: driver/xscreensaver-demo.glade2.h:83
 msgid "_Power Management Enabled"
 msgstr "_Gestion d'alimentation de l'écran"
 
-#: driver/xscreensaver-demo.glade2.h:62
+#: driver/xscreensaver-demo.glade2.h:84
 msgid "_Preview"
 msgstr "_Aperçu"
 
-#: driver/xscreensaver-demo.glade2.h:63
+#: driver/xscreensaver-demo.glade2.h:85
 msgid "_Quit"
 msgstr "_Quitte"
 
-#: driver/xscreensaver-demo.glade2.h:65
+#: driver/xscreensaver-demo.glade2.h:87
 msgid "_Settings..."
 msgstr "_Paramètres..."
 
-#: driver/xscreensaver-demo.glade2.h:66
+#: driver/xscreensaver-demo.glade2.h:88
 msgid "_Standard <<"
 msgstr "_Standard <<"
 
-#: driver/xscreensaver-demo.glade2.h:67
-#, fuzzy
-msgid "_Verbose Dialognostics"
-msgstr "Diagnostiques _verbeux"
+#: driver/xscreensaver-demo.glade2.h:89
+msgid "_Verbose Diagnostics"
+msgstr "Diagnostiques verbeux"
 
-#: driver/xscreensaver-demo.glade2.h:68
+#: driver/xscreensaver-demo.glade2.h:90
 msgid "_Visual:"
 msgstr "_Visuels :"
 
-#: driver/xscreensaver-demo.glade2.h:69
+#: driver/xscreensaver-demo.glade2.h:91
 msgid "dialog1"
 msgstr "dialog1"
 
-#: driver/xscreensaver-demo.glade2.h:71
+#: driver/xscreensaver-demo.glade2.h:93
 msgid "no preview"
 msgstr "pas d'aperçu"
 
-#: driver/xscreensaver-demo.glade2.h:72
+#: driver/xscreensaver-demo.glade2.h:94
+msgid "not installed"
+msgstr "non installé"
+
+#: driver/xscreensaver-demo.glade2.h:95
 msgid "preview"
 msgstr "aperçu"
 
@@ -930,48 +1023,60 @@ msgstr "An
 msgid "Arms"
 msgstr "Bras"
 
-#: hacks/config/anemone.xml.h:3 hacks/config/ant.xml.h:5
-#: hacks/config/apollonian.xml.h:5 hacks/config/atlantis.xml.h:4
-#: hacks/config/attraction.xml.h:8 hacks/config/blaster.xml.h:3
-#: hacks/config/blitspin.xml.h:4 hacks/config/bouboule.xml.h:3
+#: hacks/config/anemone.xml.h:3 hacks/config/ant.xml.h:6
+#: hacks/config/antspotlight.xml.h:3 hacks/config/apollonian.xml.h:5
+#: hacks/config/atlantis.xml.h:4 hacks/config/attraction.xml.h:8
+#: hacks/config/atunnel.xml.h:3 hacks/config/barcode.xml.h:4
+#: hacks/config/blaster.xml.h:3 hacks/config/blinkbox.xml.h:2
+#: hacks/config/blitspin.xml.h:4 hacks/config/blocktube.xml.h:4
+#: hacks/config/bouboule.xml.h:3 hacks/config/bouncingcow.xml.h:6
 #: hacks/config/boxed.xml.h:4 hacks/config/braid.xml.h:4
 #: hacks/config/bubble3d.xml.h:3 hacks/config/bubbles.xml.h:8
 #: hacks/config/bumps.xml.h:3 hacks/config/cage.xml.h:2
-#: hacks/config/circuit.xml.h:4 hacks/config/compass.xml.h:3
-#: hacks/config/coral.xml.h:7 hacks/config/critical.xml.h:3
-#: hacks/config/crystal.xml.h:6 hacks/config/cubenetic.xml.h:8
+#: hacks/config/circuit.xml.h:4 hacks/config/cloudlife.xml.h:3
+#: hacks/config/compass.xml.h:3 hacks/config/coral.xml.h:7
+#: hacks/config/critical.xml.h:3 hacks/config/crystal.xml.h:6
+#: hacks/config/cubenetic.xml.h:8 hacks/config/cubestorm.xml.h:4
 #: hacks/config/cynosure.xml.h:4 hacks/config/dangerball.xml.h:3
 #: hacks/config/decayscreen.xml.h:2 hacks/config/deluxe.xml.h:4
 #: hacks/config/demon.xml.h:4 hacks/config/discrete.xml.h:2
 #: hacks/config/distort.xml.h:4 hacks/config/drift.xml.h:3
-#: hacks/config/endgame.xml.h:3 hacks/config/engine.xml.h:3
-#: hacks/config/epicycle.xml.h:5 hacks/config/euler2d.xml.h:3
-#: hacks/config/extrusion.xml.h:3 hacks/config/fadeplot.xml.h:4
-#: hacks/config/flag.xml.h:2 hacks/config/flame.xml.h:6
+#: hacks/config/endgame.xml.h:3 hacks/config/engine.xml.h:8
+#: hacks/config/epicycle.xml.h:5 hacks/config/eruption.xml.h:5
+#: hacks/config/euler2d.xml.h:3 hacks/config/extrusion.xml.h:3
+#: hacks/config/fadeplot.xml.h:4 hacks/config/flag.xml.h:2
+#: hacks/config/flame.xml.h:6 hacks/config/flipflop.xml.h:1
 #: hacks/config/flipscreen3d.xml.h:1 hacks/config/flow.xml.h:4
-#: hacks/config/fluidballs.xml.h:3 hacks/config/forest.xml.h:1
+#: hacks/config/fluidballs.xml.h:5 hacks/config/flyingtoasters.xml.h:5
+#: hacks/config/fontglide.xml.h:4 hacks/config/forest.xml.h:1
 #: hacks/config/galaxy.xml.h:3 hacks/config/gears.xml.h:2
-#: hacks/config/gflux.xml.h:6 hacks/config/glforestfire.xml.h:4
-#: hacks/config/glplanet.xml.h:2 hacks/config/glsnake.xml.h:5
-#: hacks/config/gltext.xml.h:3 hacks/config/goop.xml.h:4
-#: hacks/config/grav.xml.h:2 hacks/config/greynetic.xml.h:1
-#: hacks/config/halo.xml.h:2 hacks/config/hopalong.xml.h:9
-#: hacks/config/hyperball.xml.h:2 hacks/config/hypercube.xml.h:2
-#: hacks/config/ifs.xml.h:1 hacks/config/interference.xml.h:5
-#: hacks/config/jigsaw.xml.h:3 hacks/config/juggle.xml.h:3
-#: hacks/config/julia.xml.h:2 hacks/config/kaleidescope.xml.h:2
+#: hacks/config/gflux.xml.h:6 hacks/config/glblur.xml.h:4
+#: hacks/config/glforestfire.xml.h:4 hacks/config/glknots.xml.h:3
+#: hacks/config/glmatrix.xml.h:8 hacks/config/glplanet.xml.h:2
+#: hacks/config/glsnake.xml.h:5 hacks/config/gltext.xml.h:3
+#: hacks/config/goop.xml.h:4 hacks/config/grav.xml.h:2
+#: hacks/config/greynetic.xml.h:1 hacks/config/halo.xml.h:2
+#: hacks/config/hopalong.xml.h:9 hacks/config/hyperball.xml.h:2
+#: hacks/config/hypercube.xml.h:2 hacks/config/hypertorus.xml.h:6
+#: hacks/config/ifs.xml.h:1 hacks/config/interference.xml.h:7
+#: hacks/config/jigglypuff.xml.h:6 hacks/config/jigsaw.xml.h:3
+#: hacks/config/juggle.xml.h:3 hacks/config/julia.xml.h:2
+#: hacks/config/kaleidescope.xml.h:2 hacks/config/klein.xml.h:2
 #: hacks/config/kumppa.xml.h:3 hacks/config/lament.xml.h:2
 #: hacks/config/laser.xml.h:3 hacks/config/lavalite.xml.h:10
 #: hacks/config/lightning.xml.h:1 hacks/config/lisa.xml.h:2
 #: hacks/config/lissie.xml.h:3 hacks/config/lmorph.xml.h:3
 #: hacks/config/loop.xml.h:1 hacks/config/maze.xml.h:4
-#: hacks/config/menger.xml.h:3 hacks/config/moebius.xml.h:3
+#: hacks/config/menger.xml.h:3 hacks/config/metaballs.xml.h:4
+#: hacks/config/mirrorblob.xml.h:9 hacks/config/moebius.xml.h:3
 #: hacks/config/moire2.xml.h:2 hacks/config/molecule.xml.h:10
 #: hacks/config/morph3d.xml.h:3 hacks/config/mountain.xml.h:2
 #: hacks/config/munch.xml.h:3 hacks/config/nerverot.xml.h:9
 #: hacks/config/penetrate.xml.h:3 hacks/config/penrose.xml.h:6
 #: hacks/config/petri.xml.h:5 hacks/config/phosphor.xml.h:3
-#: hacks/config/pipes.xml.h:5 hacks/config/polyominoes.xml.h:2
+#: hacks/config/piecewise.xml.h:4 hacks/config/pipes.xml.h:5
+#: hacks/config/polyominoes.xml.h:2 hacks/config/polytopes.xml.h:11
+#: hacks/config/pong.xml.h:2 hacks/config/popsquares.xml.h:3
 #: hacks/config/pulsar.xml.h:11 hacks/config/pyro.xml.h:4
 #: hacks/config/qix.xml.h:7 hacks/config/queens.xml.h:1
 #: hacks/config/rd-bomb.xml.h:9 hacks/config/ripples.xml.h:4
@@ -984,8 +1089,8 @@ msgstr "Bras"
 #: hacks/config/spiral.xml.h:3 hacks/config/spotlight.xml.h:2
 #: hacks/config/sproingies.xml.h:2 hacks/config/squiral.xml.h:4
 #: hacks/config/stairs.xml.h:1 hacks/config/starfish.xml.h:3
-#: hacks/config/starwars.xml.h:6 hacks/config/strange.xml.h:2
-#: hacks/config/superquadrics.xml.h:3 hacks/config/swirl.xml.h:2
+#: hacks/config/starwars.xml.h:6 hacks/config/strange.xml.h:1
+#: hacks/config/superquadrics.xml.h:4 hacks/config/swirl.xml.h:2
 #: hacks/config/t3d.xml.h:6 hacks/config/thornbird.xml.h:2
 #: hacks/config/triangle.xml.h:1 hacks/config/truchet.xml.h:1
 #: hacks/config/twang.xml.h:3 hacks/config/vines.xml.h:1
@@ -999,16 +1104,17 @@ msgstr "Rapide"
 
 #: hacks/config/anemone.xml.h:4 hacks/config/blaster.xml.h:4
 #: hacks/config/bouboule.xml.h:4 hacks/config/coral.xml.h:8
-#: hacks/config/cubenetic.xml.h:9 hacks/config/euler2d.xml.h:4
-#: hacks/config/flame.xml.h:7 hacks/config/fluidballs.xml.h:4
-#: hacks/config/kaleidescope.xml.h:3 hacks/config/lisa.xml.h:3
-#: hacks/config/pedal.xml.h:4 hacks/config/petri.xml.h:7
-#: hacks/config/qix.xml.h:8 hacks/config/thornbird.xml.h:3
-#: hacks/config/whirlwindwarp.xml.h:1 hacks/config/xfishtank.xml.h:4
+#: hacks/config/cubenetic.xml.h:9 hacks/config/eruption.xml.h:6
+#: hacks/config/euler2d.xml.h:4 hacks/config/flame.xml.h:7
+#: hacks/config/fluidballs.xml.h:6 hacks/config/kaleidescope.xml.h:3
+#: hacks/config/lisa.xml.h:3 hacks/config/pedal.xml.h:4
+#: hacks/config/petri.xml.h:7 hacks/config/qix.xml.h:8
+#: hacks/config/thornbird.xml.h:3 hacks/config/whirlwindwarp.xml.h:1
+#: hacks/config/xfishtank.xml.h:4
 msgid "Few"
 msgstr "Peu"
 
-#: hacks/config/anemone.xml.h:5 hacks/config/ant.xml.h:8
+#: hacks/config/anemone.xml.h:5 hacks/config/ant.xml.h:9
 #: hacks/config/apollonian.xml.h:7 hacks/config/attraction.xml.h:18
 #: hacks/config/blaster.xml.h:6 hacks/config/bouboule.xml.h:5
 #: hacks/config/braid.xml.h:7 hacks/config/coral.xml.h:9
@@ -1024,7 +1130,7 @@ msgstr "Peu"
 #: hacks/config/galaxy.xml.h:6 hacks/config/grav.xml.h:4
 #: hacks/config/halo.xml.h:4 hacks/config/hopalong.xml.h:15
 #: hacks/config/ifs.xml.h:3 hacks/config/imsmap.xml.h:9
-#: hacks/config/interference.xml.h:11 hacks/config/julia.xml.h:6
+#: hacks/config/interference.xml.h:14 hacks/config/julia.xml.h:6
 #: hacks/config/kaleidescope.xml.h:5 hacks/config/laser.xml.h:6
 #: hacks/config/lightning.xml.h:3 hacks/config/lisa.xml.h:5
 #: hacks/config/lissie.xml.h:6 hacks/config/loop.xml.h:4
@@ -1038,7 +1144,7 @@ msgstr "Peu"
 #: hacks/config/shadebobs.xml.h:5 hacks/config/sierpinski.xml.h:4
 #: hacks/config/slip.xml.h:4 hacks/config/sphere.xml.h:3
 #: hacks/config/spiral.xml.h:6 hacks/config/squiral.xml.h:9
-#: hacks/config/starfish.xml.h:5 hacks/config/strange.xml.h:5
+#: hacks/config/starfish.xml.h:5 hacks/config/strange.xml.h:2
 #: hacks/config/swirl.xml.h:3 hacks/config/thornbird.xml.h:4
 #: hacks/config/triangle.xml.h:3 hacks/config/vines.xml.h:2
 #: hacks/config/whirlwindwarp.xml.h:4 hacks/config/worm.xml.h:4
@@ -1046,80 +1152,102 @@ msgstr "Peu"
 msgid "Many"
 msgstr "Beaucoup"
 
-#: hacks/config/anemone.xml.h:6 hacks/config/ant.xml.h:10
+#: hacks/config/anemone.xml.h:6 hacks/config/ant.xml.h:11
 #: hacks/config/apollonian.xml.h:8 hacks/config/attraction.xml.h:19
 #: hacks/config/bouboule.xml.h:6 hacks/config/braid.xml.h:9
 #: hacks/config/critical.xml.h:5 hacks/config/crystal.xml.h:10
 #: hacks/config/cynosure.xml.h:7 hacks/config/deco.xml.h:8
 #: hacks/config/deluxe.xml.h:7 hacks/config/demon.xml.h:7
 #: hacks/config/discrete.xml.h:6 hacks/config/drift.xml.h:10
-#: hacks/config/epicycle.xml.h:9 hacks/config/euler2d.xml.h:9
-#: hacks/config/fadeplot.xml.h:7 hacks/config/flag.xml.h:6
-#: hacks/config/flame.xml.h:12 hacks/config/flow.xml.h:9
-#: hacks/config/forest.xml.h:4 hacks/config/galaxy.xml.h:7
-#: hacks/config/grav.xml.h:5 hacks/config/halo.xml.h:6
-#: hacks/config/hopalong.xml.h:17 hacks/config/ifs.xml.h:4
-#: hacks/config/imsmap.xml.h:10 hacks/config/interference.xml.h:12
-#: hacks/config/julia.xml.h:7 hacks/config/laser.xml.h:8
-#: hacks/config/lightning.xml.h:4 hacks/config/lisa.xml.h:6
-#: hacks/config/lissie.xml.h:7 hacks/config/loop.xml.h:5
+#: hacks/config/epicycle.xml.h:9 hacks/config/eruption.xml.h:14
+#: hacks/config/euler2d.xml.h:9 hacks/config/fadeplot.xml.h:7
+#: hacks/config/flag.xml.h:6 hacks/config/flame.xml.h:12
+#: hacks/config/flow.xml.h:9 hacks/config/forest.xml.h:4
+#: hacks/config/galaxy.xml.h:7 hacks/config/grav.xml.h:5
+#: hacks/config/halo.xml.h:6 hacks/config/hopalong.xml.h:17
+#: hacks/config/ifs.xml.h:4 hacks/config/imsmap.xml.h:10
+#: hacks/config/interference.xml.h:15 hacks/config/julia.xml.h:7
+#: hacks/config/laser.xml.h:8 hacks/config/lightning.xml.h:4
+#: hacks/config/lisa.xml.h:6 hacks/config/lissie.xml.h:7
+#: hacks/config/loop.xml.h:5 hacks/config/metaballs.xml.h:10
 #: hacks/config/moire.xml.h:7 hacks/config/moire2.xml.h:5
 #: hacks/config/mountain.xml.h:6 hacks/config/penrose.xml.h:8
-#: hacks/config/polyominoes.xml.h:6 hacks/config/rd-bomb.xml.h:13
-#: hacks/config/rocks.xml.h:6 hacks/config/rotor.xml.h:7
-#: hacks/config/shadebobs.xml.h:6 hacks/config/sierpinski.xml.h:5
-#: hacks/config/slip.xml.h:5 hacks/config/sphere.xml.h:4
-#: hacks/config/spiral.xml.h:8 hacks/config/squiral.xml.h:10
-#: hacks/config/starfish.xml.h:6 hacks/config/strange.xml.h:6
-#: hacks/config/swirl.xml.h:5 hacks/config/thornbird.xml.h:5
-#: hacks/config/triangle.xml.h:4 hacks/config/vines.xml.h:3
-#: hacks/config/worm.xml.h:5 hacks/config/xearth.xml.h:17
-#: hacks/config/xfishtank.xml.h:9
+#: hacks/config/polyominoes.xml.h:6 hacks/config/popsquares.xml.h:4
+#: hacks/config/rd-bomb.xml.h:13 hacks/config/rocks.xml.h:6
+#: hacks/config/rotor.xml.h:7 hacks/config/shadebobs.xml.h:6
+#: hacks/config/sierpinski.xml.h:5 hacks/config/slip.xml.h:5
+#: hacks/config/sphere.xml.h:4 hacks/config/spiral.xml.h:8
+#: hacks/config/squiral.xml.h:10 hacks/config/starfish.xml.h:6
+#: hacks/config/strange.xml.h:3 hacks/config/swirl.xml.h:5
+#: hacks/config/thornbird.xml.h:5 hacks/config/triangle.xml.h:4
+#: hacks/config/vines.xml.h:3 hacks/config/worm.xml.h:5
+#: hacks/config/xearth.xml.h:17 hacks/config/xfishtank.xml.h:9
 msgid "Number of Colors"
 msgstr "Nombre de couleurs"
 
-#: hacks/config/anemone.xml.h:7 hacks/config/ant.xml.h:14
-#: hacks/config/apollonian.xml.h:11 hacks/config/atlantis.xml.h:13
-#: hacks/config/attraction.xml.h:26 hacks/config/blaster.xml.h:8
-#: hacks/config/blitspin.xml.h:7 hacks/config/bouboule.xml.h:8
+#: hacks/config/anemone.xml.h:7 hacks/config/fireflies.xml.h:32
+#: hacks/config/pyro.xml.h:8
+msgid "Often"
+msgstr "Souvent"
+
+#: hacks/config/anemone.xml.h:8
+msgid "Rarely"
+msgstr "Rarement"
+
+#: hacks/config/anemone.xml.h:9 hacks/config/ant.xml.h:15
+#: hacks/config/antspotlight.xml.h:5 hacks/config/apollonian.xml.h:11
+#: hacks/config/atlantis.xml.h:13 hacks/config/attraction.xml.h:26
+#: hacks/config/atunnel.xml.h:6 hacks/config/barcode.xml.h:6
+#: hacks/config/blaster.xml.h:8 hacks/config/blinkbox.xml.h:4
+#: hacks/config/blitspin.xml.h:7 hacks/config/blocktube.xml.h:9
+#: hacks/config/bouboule.xml.h:8 hacks/config/bouncingcow.xml.h:10
 #: hacks/config/boxed.xml.h:6 hacks/config/braid.xml.h:11
 #: hacks/config/bubble3d.xml.h:5 hacks/config/bubbles.xml.h:10
 #: hacks/config/bumps.xml.h:4 hacks/config/cage.xml.h:4
-#: hacks/config/circuit.xml.h:10 hacks/config/compass.xml.h:4
-#: hacks/config/coral.xml.h:12 hacks/config/critical.xml.h:6
-#: hacks/config/crystal.xml.h:11 hacks/config/cubenetic.xml.h:22
+#: hacks/config/circuit.xml.h:10 hacks/config/cloudlife.xml.h:11
+#: hacks/config/compass.xml.h:4 hacks/config/coral.xml.h:12
+#: hacks/config/critical.xml.h:6 hacks/config/crystal.xml.h:11
+#: hacks/config/cubenetic.xml.h:22 hacks/config/cubestorm.xml.h:8
 #: hacks/config/cynosure.xml.h:9 hacks/config/dangerball.xml.h:5
 #: hacks/config/decayscreen.xml.h:17 hacks/config/deluxe.xml.h:8
 #: hacks/config/demon.xml.h:8 hacks/config/discrete.xml.h:7
 #: hacks/config/distort.xml.h:11 hacks/config/drift.xml.h:12
-#: hacks/config/endgame.xml.h:5 hacks/config/engine.xml.h:5
-#: hacks/config/epicycle.xml.h:10 hacks/config/euler2d.xml.h:14
-#: hacks/config/extrusion.xml.h:11 hacks/config/fadeplot.xml.h:8
-#: hacks/config/flag.xml.h:7 hacks/config/flame.xml.h:14
+#: hacks/config/endgame.xml.h:5 hacks/config/engine.xml.h:15
+#: hacks/config/epicycle.xml.h:10 hacks/config/eruption.xml.h:19
+#: hacks/config/euler2d.xml.h:14 hacks/config/extrusion.xml.h:11
+#: hacks/config/fadeplot.xml.h:8 hacks/config/flag.xml.h:7
+#: hacks/config/flame.xml.h:14 hacks/config/flipflop.xml.h:5
 #: hacks/config/flipscreen3d.xml.h:6 hacks/config/flow.xml.h:13
-#: hacks/config/fluidballs.xml.h:18 hacks/config/forest.xml.h:5
+#: hacks/config/fluidballs.xml.h:18 hacks/config/flyingtoasters.xml.h:11
+#: hacks/config/fontglide.xml.h:13 hacks/config/forest.xml.h:5
 #: hacks/config/galaxy.xml.h:10 hacks/config/gears.xml.h:7
-#: hacks/config/gflux.xml.h:12 hacks/config/glforestfire.xml.h:14
-#: hacks/config/glplanet.xml.h:6 hacks/config/glsnake.xml.h:12
-#: hacks/config/gltext.xml.h:13 hacks/config/goop.xml.h:10
-#: hacks/config/grav.xml.h:8 hacks/config/greynetic.xml.h:3
-#: hacks/config/halo.xml.h:9 hacks/config/hopalong.xml.h:21
-#: hacks/config/hyperball.xml.h:8 hacks/config/hypercube.xml.h:7
-#: hacks/config/ifs.xml.h:5 hacks/config/interference.xml.h:14
-#: hacks/config/jigsaw.xml.h:5 hacks/config/juggle.xml.h:7
-#: hacks/config/julia.xml.h:8 hacks/config/kaleidescope.xml.h:7
+#: hacks/config/gflux.xml.h:12 hacks/config/glblur.xml.h:14
+#: hacks/config/glforestfire.xml.h:14 hacks/config/glknots.xml.h:17
+#: hacks/config/glmatrix.xml.h:18 hacks/config/glplanet.xml.h:6
+#: hacks/config/glsnake.xml.h:12 hacks/config/gltext.xml.h:13
+#: hacks/config/goop.xml.h:10 hacks/config/grav.xml.h:8
+#: hacks/config/greynetic.xml.h:3 hacks/config/halo.xml.h:9
+#: hacks/config/hopalong.xml.h:21 hacks/config/hyperball.xml.h:8
+#: hacks/config/hypercube.xml.h:7 hacks/config/hypertorus.xml.h:13
+#: hacks/config/ifs.xml.h:5 hacks/config/interference.xml.h:17
+#: hacks/config/jigglypuff.xml.h:16 hacks/config/jigsaw.xml.h:5
+#: hacks/config/juggle.xml.h:7 hacks/config/julia.xml.h:8
+#: hacks/config/kaleidescope.xml.h:7 hacks/config/klein.xml.h:7
 #: hacks/config/kumppa.xml.h:8 hacks/config/lament.xml.h:6
-#: hacks/config/laser.xml.h:10 hacks/config/lavalite.xml.h:26
+#: hacks/config/laser.xml.h:10 hacks/config/lavalite.xml.h:27
 #: hacks/config/lightning.xml.h:5 hacks/config/lisa.xml.h:8
 #: hacks/config/lissie.xml.h:9 hacks/config/lmorph.xml.h:11
 #: hacks/config/loop.xml.h:7 hacks/config/maze.xml.h:14
-#: hacks/config/menger.xml.h:16 hacks/config/moebius.xml.h:7
+#: hacks/config/menger.xml.h:16 hacks/config/metaballs.xml.h:13
+#: hacks/config/mirrorblob.xml.h:16 hacks/config/moebius.xml.h:7
 #: hacks/config/moire2.xml.h:6 hacks/config/molecule.xml.h:22
 #: hacks/config/morph3d.xml.h:6 hacks/config/mountain.xml.h:7
 #: hacks/config/munch.xml.h:7 hacks/config/nerverot.xml.h:20
 #: hacks/config/penetrate.xml.h:6 hacks/config/penrose.xml.h:11
 #: hacks/config/petri.xml.h:23 hacks/config/phosphor.xml.h:6
-#: hacks/config/pipes.xml.h:15 hacks/config/polyominoes.xml.h:10
+#: hacks/config/piecewise.xml.h:9 hacks/config/pipes.xml.h:15
+#: hacks/config/polyominoes.xml.h:10 hacks/config/polytopes.xml.h:20
+#: hacks/config/pong.xml.h:5 hacks/config/popsquares.xml.h:5
 #: hacks/config/pulsar.xml.h:15 hacks/config/pyro.xml.h:13
 #: hacks/config/qix.xml.h:19 hacks/config/queens.xml.h:4
 #: hacks/config/rd-bomb.xml.h:17 hacks/config/ripples.xml.h:11
@@ -1132,25 +1260,28 @@ msgstr "Nombre de couleurs"
 #: hacks/config/spiral.xml.h:9 hacks/config/spotlight.xml.h:4
 #: hacks/config/sproingies.xml.h:6 hacks/config/squiral.xml.h:14
 #: hacks/config/stairs.xml.h:3 hacks/config/starfish.xml.h:8
-#: hacks/config/starwars.xml.h:12 hacks/config/strange.xml.h:7
-#: hacks/config/superquadrics.xml.h:7 hacks/config/swirl.xml.h:6
+#: hacks/config/starwars.xml.h:12 hacks/config/strange.xml.h:4
+#: hacks/config/superquadrics.xml.h:8 hacks/config/swirl.xml.h:6
 #: hacks/config/t3d.xml.h:11 hacks/config/thornbird.xml.h:7
 #: hacks/config/triangle.xml.h:5 hacks/config/truchet.xml.h:2
 #: hacks/config/twang.xml.h:9 hacks/config/vines.xml.h:4
 #: hacks/config/webcollage.xml.h:7 hacks/config/worm.xml.h:7
 #: hacks/config/xearth.xml.h:22 hacks/config/xfishtank.xml.h:10
 #: hacks/config/xflame.xml.h:5 hacks/config/xjack.xml.h:2
-#: hacks/config/xmatrix.xml.h:14 hacks/config/xmountains.xml.h:4
+#: hacks/config/xmatrix.xml.h:15 hacks/config/xmountains.xml.h:4
 #: hacks/config/xrayswarm.xml.h:3 hacks/config/zoom.xml.h:6
 msgid "Slow"
 msgstr "Lent(e)"
 
-#: hacks/config/anemone.xml.h:8 hacks/config/ant.xml.h:16
-#: hacks/config/apollonian.xml.h:12 hacks/config/attraction.xml.h:28
-#: hacks/config/blaster.xml.h:9 hacks/config/bouboule.xml.h:9
-#: hacks/config/braid.xml.h:12 hacks/config/bubble3d.xml.h:6
-#: hacks/config/bubbles.xml.h:11 hacks/config/bumps.xml.h:5
-#: hacks/config/cage.xml.h:6 hacks/config/circuit.xml.h:11
+#: hacks/config/anemone.xml.h:10 hacks/config/ant.xml.h:17
+#: hacks/config/antspotlight.xml.h:6 hacks/config/apollonian.xml.h:12
+#: hacks/config/attraction.xml.h:28 hacks/config/atunnel.xml.h:7
+#: hacks/config/barcode.xml.h:7 hacks/config/blaster.xml.h:9
+#: hacks/config/blinkbox.xml.h:5 hacks/config/blocktube.xml.h:11
+#: hacks/config/bouboule.xml.h:9 hacks/config/braid.xml.h:12
+#: hacks/config/bubble3d.xml.h:6 hacks/config/bubbles.xml.h:11
+#: hacks/config/bumps.xml.h:5 hacks/config/cage.xml.h:6
+#: hacks/config/circuit.xml.h:11 hacks/config/cloudlife.xml.h:13
 #: hacks/config/compass.xml.h:5 hacks/config/coral.xml.h:14
 #: hacks/config/critical.xml.h:7 hacks/config/crystal.xml.h:12
 #: hacks/config/cubenetic.xml.h:24 hacks/config/cynosure.xml.h:10
@@ -1162,74 +1293,82 @@ msgstr "Lent(e)"
 #: hacks/config/eruption.xml.h:20 hacks/config/euler2d.xml.h:15
 #: hacks/config/extrusion.xml.h:13 hacks/config/fadeplot.xml.h:10
 #: hacks/config/flag.xml.h:9 hacks/config/flame.xml.h:15
-#: hacks/config/flipscreen3d.xml.h:7 hacks/config/flow.xml.h:16
-#: hacks/config/fluidballs.xml.h:20 hacks/config/forest.xml.h:6
-#: hacks/config/galaxy.xml.h:11 hacks/config/glblur.xml.h:17
-#: hacks/config/glforestfire.xml.h:15 hacks/config/glplanet.xml.h:8
-#: hacks/config/gltext.xml.h:15 hacks/config/goop.xml.h:11
-#: hacks/config/grav.xml.h:9 hacks/config/greynetic.xml.h:4
-#: hacks/config/halo.xml.h:10 hacks/config/hopalong.xml.h:23
-#: hacks/config/hyperball.xml.h:9 hacks/config/hypercube.xml.h:8
-#: hacks/config/ifs.xml.h:6 hacks/config/jigsaw.xml.h:7
-#: hacks/config/juggle.xml.h:8 hacks/config/julia.xml.h:10
-#: hacks/config/kaleidescope.xml.h:8 hacks/config/klein.xml.h:8
-#: hacks/config/kumppa.xml.h:9 hacks/config/lament.xml.h:7
-#: hacks/config/laser.xml.h:11 hacks/config/lavalite.xml.h:30
-#: hacks/config/lightning.xml.h:6 hacks/config/lisa.xml.h:9
-#: hacks/config/lissie.xml.h:11 hacks/config/lmorph.xml.h:12
-#: hacks/config/loop.xml.h:9 hacks/config/menger.xml.h:18
-#: hacks/config/metaballs.xml.h:15 hacks/config/moebius.xml.h:10
+#: hacks/config/flipflop.xml.h:7 hacks/config/flipscreen3d.xml.h:7
+#: hacks/config/flow.xml.h:16 hacks/config/fluidballs.xml.h:20
+#: hacks/config/forest.xml.h:6 hacks/config/galaxy.xml.h:11
+#: hacks/config/glblur.xml.h:17 hacks/config/glforestfire.xml.h:15
+#: hacks/config/glplanet.xml.h:8 hacks/config/gltext.xml.h:15
+#: hacks/config/goop.xml.h:11 hacks/config/grav.xml.h:9
+#: hacks/config/greynetic.xml.h:4 hacks/config/halo.xml.h:10
+#: hacks/config/hopalong.xml.h:23 hacks/config/hyperball.xml.h:9
+#: hacks/config/hypercube.xml.h:8 hacks/config/ifs.xml.h:6
+#: hacks/config/jigsaw.xml.h:7 hacks/config/juggle.xml.h:8
+#: hacks/config/julia.xml.h:10 hacks/config/kaleidescope.xml.h:8
+#: hacks/config/klein.xml.h:8 hacks/config/kumppa.xml.h:9
+#: hacks/config/lament.xml.h:7 hacks/config/laser.xml.h:11
+#: hacks/config/lavalite.xml.h:30 hacks/config/lightning.xml.h:6
+#: hacks/config/lisa.xml.h:9 hacks/config/lissie.xml.h:11
+#: hacks/config/lmorph.xml.h:12 hacks/config/loop.xml.h:9
+#: hacks/config/menger.xml.h:18 hacks/config/metaballs.xml.h:15
+#: hacks/config/mirrorblob.xml.h:18 hacks/config/moebius.xml.h:10
 #: hacks/config/moire2.xml.h:7 hacks/config/molecule.xml.h:24
 #: hacks/config/morph3d.xml.h:7 hacks/config/mountain.xml.h:8
 #: hacks/config/munch.xml.h:9 hacks/config/nerverot.xml.h:22
 #: hacks/config/penrose.xml.h:12 hacks/config/petri.xml.h:25
 #: hacks/config/phosphor.xml.h:7 hacks/config/piecewise.xml.h:11
 #: hacks/config/pipes.xml.h:16 hacks/config/polyominoes.xml.h:11
-#: hacks/config/popsquares.xml.h:6 hacks/config/pulsar.xml.h:17
-#: hacks/config/qix.xml.h:22 hacks/config/queens.xml.h:6
-#: hacks/config/rotor.xml.h:12 hacks/config/rubik.xml.h:11
-#: hacks/config/sballs.xml.h:14 hacks/config/shadebobs.xml.h:10
-#: hacks/config/sierpinski.xml.h:9 hacks/config/sierpinski3d.xml.h:10
-#: hacks/config/slidescreen.xml.h:7 hacks/config/slip.xml.h:9
-#: hacks/config/speedmine.xml.h:15 hacks/config/sphere.xml.h:6
-#: hacks/config/spheremonics.xml.h:22 hacks/config/spiral.xml.h:10
-#: hacks/config/spotlight.xml.h:5 hacks/config/sproingies.xml.h:8
-#: hacks/config/squiral.xml.h:16 hacks/config/stairs.xml.h:5
-#: hacks/config/starfish.xml.h:9 hacks/config/strange.xml.h:8
-#: hacks/config/superquadrics.xml.h:9 hacks/config/swirl.xml.h:7
-#: hacks/config/t3d.xml.h:13 hacks/config/thornbird.xml.h:8
-#: hacks/config/triangle.xml.h:6 hacks/config/truchet.xml.h:3
-#: hacks/config/twang.xml.h:10 hacks/config/vines.xml.h:5
-#: hacks/config/webcollage.xml.h:8 hacks/config/whirlygig.xml.h:4
-#: hacks/config/worm.xml.h:8 hacks/config/xearth.xml.h:25
-#: hacks/config/xflame.xml.h:6 hacks/config/xjack.xml.h:3
-#: hacks/config/xmatrix.xml.h:17 hacks/config/xmountains.xml.h:5
-#: hacks/config/xrayswarm.xml.h:4 hacks/config/zoom.xml.h:7
+#: hacks/config/pong.xml.h:6 hacks/config/popsquares.xml.h:6
+#: hacks/config/pulsar.xml.h:17 hacks/config/qix.xml.h:22
+#: hacks/config/queens.xml.h:6 hacks/config/rotor.xml.h:12
+#: hacks/config/rubik.xml.h:11 hacks/config/sballs.xml.h:14
+#: hacks/config/shadebobs.xml.h:10 hacks/config/sierpinski.xml.h:9
+#: hacks/config/sierpinski3d.xml.h:10 hacks/config/slidescreen.xml.h:7
+#: hacks/config/slip.xml.h:9 hacks/config/speedmine.xml.h:15
+#: hacks/config/sphere.xml.h:6 hacks/config/spheremonics.xml.h:22
+#: hacks/config/spiral.xml.h:10 hacks/config/spotlight.xml.h:5
+#: hacks/config/sproingies.xml.h:8 hacks/config/squiral.xml.h:16
+#: hacks/config/stairs.xml.h:5 hacks/config/starfish.xml.h:9
+#: hacks/config/strange.xml.h:5 hacks/config/superquadrics.xml.h:10
+#: hacks/config/swirl.xml.h:7 hacks/config/t3d.xml.h:13
+#: hacks/config/thornbird.xml.h:8 hacks/config/triangle.xml.h:6
+#: hacks/config/truchet.xml.h:3 hacks/config/twang.xml.h:10
+#: hacks/config/vines.xml.h:5 hacks/config/webcollage.xml.h:8
+#: hacks/config/whirlygig.xml.h:13 hacks/config/worm.xml.h:8
+#: hacks/config/xearth.xml.h:25 hacks/config/xflame.xml.h:6
+#: hacks/config/xjack.xml.h:3 hacks/config/xmatrix.xml.h:18
+#: hacks/config/xmountains.xml.h:5 hacks/config/xrayswarm.xml.h:4
+#: hacks/config/zoom.xml.h:7
 msgid "Speed"
 msgstr "Vitesse"
 
-#: hacks/config/anemone.xml.h:9
+#: hacks/config/anemone.xml.h:11
 msgid "Tentacles"
 msgstr "Tentacules"
 
-#: hacks/config/anemone.xml.h:10 hacks/config/deluxe.xml.h:10
-#: hacks/config/lmorph.xml.h:13 hacks/config/starfish.xml.h:11
-#: hacks/config/thornbird.xml.h:9
+#: hacks/config/anemone.xml.h:12 hacks/config/cubestorm.xml.h:11
+#: hacks/config/deluxe.xml.h:10 hacks/config/glknots.xml.h:19
+#: hacks/config/lmorph.xml.h:13 hacks/config/pong.xml.h:7
+#: hacks/config/starfish.xml.h:11 hacks/config/thornbird.xml.h:9
 msgid "Thick"
-msgstr "Épais"
+msgstr "Épais(se)"
 
-#: hacks/config/anemone.xml.h:11 hacks/config/moire2.xml.h:8
-#: hacks/config/thornbird.xml.h:10
+#: hacks/config/anemone.xml.h:13 hacks/config/glknots.xml.h:20
+#: hacks/config/moire2.xml.h:8 hacks/config/thornbird.xml.h:10
 msgid "Thickness"
 msgstr "Épaisseur"
 
-#: hacks/config/anemone.xml.h:12 hacks/config/deluxe.xml.h:11
-#: hacks/config/lmorph.xml.h:14 hacks/config/starfish.xml.h:12
-#: hacks/config/thornbird.xml.h:11
+#: hacks/config/anemone.xml.h:14 hacks/config/cubestorm.xml.h:12
+#: hacks/config/deluxe.xml.h:11 hacks/config/glknots.xml.h:21
+#: hacks/config/lmorph.xml.h:14 hacks/config/pong.xml.h:8
+#: hacks/config/starfish.xml.h:12 hacks/config/thornbird.xml.h:11
 msgid "Thin"
-msgstr "Fin"
+msgstr "Fin(e)"
 
-#: hacks/config/anemone.xml.h:13 hacks/config/ant.xml.h:21
+#: hacks/config/anemone.xml.h:15
+msgid "Turn speed"
+msgstr "Vitesse de rotation"
+
+#: hacks/config/anemone.xml.h:16 hacks/config/ant.xml.h:22
 #: hacks/config/apollonian.xml.h:13 hacks/config/attraction.xml.h:32
 #: hacks/config/bouboule.xml.h:11 hacks/config/braid.xml.h:13
 #: hacks/config/critical.xml.h:8 hacks/config/crystal.xml.h:13
@@ -1242,7 +1381,7 @@ msgstr "Fin"
 #: hacks/config/forest.xml.h:8 hacks/config/galaxy.xml.h:13
 #: hacks/config/grav.xml.h:11 hacks/config/halo.xml.h:12
 #: hacks/config/hopalong.xml.h:25 hacks/config/ifs.xml.h:8
-#: hacks/config/imsmap.xml.h:15 hacks/config/interference.xml.h:16
+#: hacks/config/imsmap.xml.h:15 hacks/config/interference.xml.h:19
 #: hacks/config/julia.xml.h:12 hacks/config/laser.xml.h:12
 #: hacks/config/lightning.xml.h:8 hacks/config/lisa.xml.h:12
 #: hacks/config/lissie.xml.h:13 hacks/config/loop.xml.h:12
@@ -1254,7 +1393,7 @@ msgstr "Fin"
 #: hacks/config/shadebobs.xml.h:12 hacks/config/sierpinski.xml.h:12
 #: hacks/config/slip.xml.h:12 hacks/config/sphere.xml.h:8
 #: hacks/config/spiral.xml.h:12 hacks/config/squiral.xml.h:18
-#: hacks/config/starfish.xml.h:14 hacks/config/strange.xml.h:11
+#: hacks/config/starfish.xml.h:14 hacks/config/strange.xml.h:8
 #: hacks/config/swirl.xml.h:9 hacks/config/thornbird.xml.h:13
 #: hacks/config/triangle.xml.h:8 hacks/config/vines.xml.h:7
 #: hacks/config/worm.xml.h:9 hacks/config/xearth.xml.h:28
@@ -1264,7 +1403,7 @@ msgstr "Deux"
 
 #: hacks/config/anemone.xml.h:17
 msgid "Wiggling tentacles. By Gabriel Finch."
-msgstr ""
+msgstr "Tentacules agitées. Par Gabriel Finch."
 
 #: hacks/config/anemone.xml.h:18
 msgid "Withdraw freqency"
@@ -1280,8 +1419,8 @@ msgstr ""
 "Un automate cellulaire qui est en fait une machine de Turing "
 "bidimensionnelle: à mesure que les têtes («fourmis») marchent le long de "
 "l'écran, elles changent la valeur des pixels sur leur chemin. Ensuite, leur "
-"comportement est influencé lorsqu'elles passent sur les pixels modifié. àrit "
-"par David Bagley."
+"comportement est influencé lorsqu'elles passent sur les pixels modifiés. "
+"Écrit par David Bagley."
 
 #: hacks/config/ant.xml.h:2
 msgid "Ant"
@@ -1295,59 +1434,67 @@ msgstr "Taille des fourmis"
 msgid "Ants Count"
 msgstr "Nombre de fourmis"
 
-#: hacks/config/ant.xml.h:6
+#: hacks/config/ant.xml.h:5
+msgid "Draw Eyes"
+msgstr "Dessiner des yeux"
+
+#: hacks/config/ant.xml.h:7
 msgid "Four Sided Cells"
 msgstr "Cellules à 4 côtés"
 
-#: hacks/config/ant.xml.h:7 hacks/config/attraction.xml.h:13
-#: hacks/config/cubenetic.xml.h:11 hacks/config/demon.xml.h:5
-#: hacks/config/discrete.xml.h:3 hacks/config/distort.xml.h:5
-#: hacks/config/fadeplot.xml.h:5 hacks/config/flag.xml.h:4
-#: hacks/config/flow.xml.h:7 hacks/config/fluidballs.xml.h:12
-#: hacks/config/hopalong.xml.h:13 hacks/config/interference.xml.h:8
-#: hacks/config/julia.xml.h:5 hacks/config/lissie.xml.h:4
-#: hacks/config/loop.xml.h:2 hacks/config/moire.xml.h:4
+#: hacks/config/ant.xml.h:8 hacks/config/attraction.xml.h:13
+#: hacks/config/cloudlife.xml.h:7 hacks/config/cubenetic.xml.h:11
+#: hacks/config/demon.xml.h:5 hacks/config/discrete.xml.h:3
+#: hacks/config/distort.xml.h:5 hacks/config/fadeplot.xml.h:5
+#: hacks/config/flag.xml.h:4 hacks/config/flow.xml.h:7
+#: hacks/config/fluidballs.xml.h:12 hacks/config/gleidescope.xml.h:7
+#: hacks/config/halftone.xml.h:8 hacks/config/hopalong.xml.h:13
+#: hacks/config/interference.xml.h:11 hacks/config/julia.xml.h:5
+#: hacks/config/lissie.xml.h:4 hacks/config/loop.xml.h:2
+#: hacks/config/moire.xml.h:4 hacks/config/piecewise.xml.h:5
 #: hacks/config/rd-bomb.xml.h:11 hacks/config/rorschach.xml.h:5
 #: hacks/config/rubik.xml.h:4 hacks/config/sierpinski.xml.h:3
 #: hacks/config/slip.xml.h:3
 msgid "Large"
 msgstr "Important(e)"
 
-#: hacks/config/ant.xml.h:9
+#: hacks/config/ant.xml.h:10
 msgid "Nine Sided Cells"
 msgstr "Cellules à 8 côtés"
 
-#: hacks/config/ant.xml.h:11
+#: hacks/config/ant.xml.h:12
 msgid "Random Cell Shape"
 msgstr "Forme de cellule aléatoire"
 
-#: hacks/config/ant.xml.h:12 hacks/config/speedmine.xml.h:11
+#: hacks/config/ant.xml.h:13 hacks/config/speedmine.xml.h:11
 msgid "Sharp Turns"
 msgstr "Virages serrés"
 
-#: hacks/config/ant.xml.h:13
+#: hacks/config/ant.xml.h:14
 msgid "Six Sided Cells"
 msgstr "Cellules à 6 côtés"
 
-#: hacks/config/ant.xml.h:15 hacks/config/attraction.xml.h:27
-#: hacks/config/cubenetic.xml.h:23 hacks/config/demon.xml.h:9
-#: hacks/config/discrete.xml.h:8 hacks/config/distort.xml.h:12
-#: hacks/config/fadeplot.xml.h:9 hacks/config/flag.xml.h:8
-#: hacks/config/flow.xml.h:15 hacks/config/fluidballs.xml.h:19
-#: hacks/config/hopalong.xml.h:22 hacks/config/interference.xml.h:15
-#: hacks/config/julia.xml.h:9 hacks/config/lissie.xml.h:10
-#: hacks/config/loop.xml.h:8 hacks/config/moire.xml.h:9
-#: hacks/config/rd-bomb.xml.h:18 hacks/config/rorschach.xml.h:8
-#: hacks/config/rubik.xml.h:10 hacks/config/sierpinski.xml.h:8
-#: hacks/config/slip.xml.h:8
+#: hacks/config/ant.xml.h:16 hacks/config/attraction.xml.h:27
+#: hacks/config/cloudlife.xml.h:12 hacks/config/cubenetic.xml.h:23
+#: hacks/config/demon.xml.h:9 hacks/config/discrete.xml.h:8
+#: hacks/config/distort.xml.h:12 hacks/config/fadeplot.xml.h:9
+#: hacks/config/flag.xml.h:8 hacks/config/flow.xml.h:15
+#: hacks/config/fluidballs.xml.h:19 hacks/config/gleidescope.xml.h:12
+#: hacks/config/halftone.xml.h:14 hacks/config/hopalong.xml.h:22
+#: hacks/config/interference.xml.h:18 hacks/config/julia.xml.h:9
+#: hacks/config/lissie.xml.h:10 hacks/config/loop.xml.h:8
+#: hacks/config/metaballs.xml.h:14 hacks/config/moire.xml.h:9
+#: hacks/config/piecewise.xml.h:10 hacks/config/rd-bomb.xml.h:18
+#: hacks/config/rorschach.xml.h:8 hacks/config/rubik.xml.h:10
+#: hacks/config/sierpinski.xml.h:8 hacks/config/slip.xml.h:8
 msgid "Small"
 msgstr "Faible"
 
-#: hacks/config/ant.xml.h:17
+#: hacks/config/ant.xml.h:18
 msgid "Three Sided Cells"
 msgstr "Cellules à 3 côtés"
 
-#: hacks/config/ant.xml.h:18 hacks/config/demon.xml.h:12
+#: hacks/config/ant.xml.h:19 hacks/config/demon.xml.h:12
 #: hacks/config/discrete.xml.h:10 hacks/config/fadeplot.xml.h:11
 #: hacks/config/flag.xml.h:12 hacks/config/flow.xml.h:17
 #: hacks/config/lissie.xml.h:12 hacks/config/loop.xml.h:11
@@ -1356,14 +1503,53 @@ msgstr "Cellules 
 msgid "Timeout"
 msgstr "Délai"
 
-#: hacks/config/ant.xml.h:19
+#: hacks/config/ant.xml.h:20
 msgid "Truchet Lines"
 msgstr "Lignes de Truchet"
 
-#: hacks/config/ant.xml.h:20
+#: hacks/config/ant.xml.h:21
 msgid "Twelve Sided Cells"
 msgstr "Cellules à 12 côtés"
 
+#: hacks/config/antspotlight.xml.h:1
+msgid "AntSpotlight"
+msgstr "Faisceau lumineux"
+
+#: hacks/config/antspotlight.xml.h:2
+msgid ""
+"Antspotlight draws an ant (with a headlight) who walks on top of an image of "
+"your desktop or other image. Written by Blair Tennessy."
+msgstr ""
+
+#: hacks/config/antspotlight.xml.h:4 hacks/config/atlantis.xml.h:11
+#: hacks/config/atunnel.xml.h:5 hacks/config/blocktube.xml.h:8
+#: hacks/config/boxed.xml.h:5 hacks/config/bubble3d.xml.h:4
+#: hacks/config/cage.xml.h:3 hacks/config/circuit.xml.h:9
+#: hacks/config/cubenetic.xml.h:21 hacks/config/cubestorm.xml.h:7
+#: hacks/config/dangerball.xml.h:4 hacks/config/endgame.xml.h:4
+#: hacks/config/engine.xml.h:14 hacks/config/extrusion.xml.h:10
+#: hacks/config/flipflop.xml.h:4 hacks/config/flipscreen3d.xml.h:5
+#: hacks/config/fluidballs.xml.h:17 hacks/config/flurry.xml.h:9
+#: hacks/config/flyingtoasters.xml.h:10 hacks/config/gears.xml.h:6
+#: hacks/config/gflux.xml.h:11 hacks/config/glblur.xml.h:13
+#: hacks/config/gleidescope.xml.h:10 hacks/config/glforestfire.xml.h:13
+#: hacks/config/glknots.xml.h:16 hacks/config/glmatrix.xml.h:17
+#: hacks/config/glplanet.xml.h:5 hacks/config/glslideshow.xml.h:18
+#: hacks/config/glsnake.xml.h:10 hacks/config/gltext.xml.h:12
+#: hacks/config/hypertorus.xml.h:12 hacks/config/jigglypuff.xml.h:15
+#: hacks/config/klein.xml.h:6 hacks/config/lament.xml.h:5
+#: hacks/config/lavalite.xml.h:26 hacks/config/menger.xml.h:15
+#: hacks/config/mirrorblob.xml.h:15 hacks/config/moebius.xml.h:6
+#: hacks/config/molecule.xml.h:21 hacks/config/morph3d.xml.h:5
+#: hacks/config/pipes.xml.h:14 hacks/config/polytopes.xml.h:18
+#: hacks/config/pulsar.xml.h:14 hacks/config/queens.xml.h:3
+#: hacks/config/rubik.xml.h:6 hacks/config/sballs.xml.h:12
+#: hacks/config/sierpinski3d.xml.h:6 hacks/config/spheremonics.xml.h:18
+#: hacks/config/sproingies.xml.h:4 hacks/config/stairs.xml.h:2
+#: hacks/config/starwars.xml.h:11 hacks/config/superquadrics.xml.h:7
+msgid "Show Frames-per-Second"
+msgstr "Afficher «trames par seconde» (FPS)"
+
 #: hacks/config/apollonian.xml.h:1
 msgid "Apollonian"
 msgstr "Apollonien"
@@ -1378,7 +1564,7 @@ msgstr "Profondeur"
 
 #: hacks/config/apollonian.xml.h:4
 msgid "Draw Labels"
-msgstr "Afficher les étiquettes"
+msgstr "Afficher le texte"
 
 #: hacks/config/apollonian.xml.h:6
 msgid "Include Alternate Geometries"
@@ -1389,12 +1575,59 @@ msgid ""
 "Packs a large circle with smaller circles, demonstrating the Descartes "
 "Circle Theorem. Written by Allan R. Wilks and David Bagley."
 msgstr ""
-"Remplit un grand cercle de cercles plus petits et démontre ainsi le théoràme "
+"Remplit un grand cercle de cercles plus petits et démontre ainsi le théorème "
 "des cercles de Descartes. Écrit par Allan R. Wilks et David Bagley."
 
 #: hacks/config/apollonian.xml.h:10
 msgid "Shallow"
-msgstr "Creux"
+msgstr "Peu profond"
+
+#: hacks/config/apple2.xml.h:1
+msgid "Apple ]["
+msgstr "Apple ]["
+
+#: hacks/config/apple2.xml.h:2
+msgid "Basic Programming Mode"
+msgstr "Mode programmation en BASIC"
+
+#: hacks/config/apple2.xml.h:3 hacks/config/halo.xml.h:7
+#: hacks/config/imsmap.xml.h:11
+msgid "Random Mode"
+msgstr "Mode aléatoire"
+
+#: hacks/config/apple2.xml.h:4
+msgid ""
+"Simulates an original Apple ][ Plus computer in all its 1979 glory. It also "
+"reproduces the appearance of display on a color television set of the "
+"period. In \"Text Mode\", it displays the output of a command (e.g., "
+"\"fortune\".) In \"Slideshow Mode\", it chooses a number of images from the "
+"image source you configured into XScreenSaver and displays them within the "
+"limitations of the Apple ][ display hardware. (Six available colors in hi-"
+"res mode!) In \"Basic Programming Mode\", a simulated user types in a BASIC "
+"program and runs it. By Trevor Blackwell."
+msgstr ""
+"Simule une machine Apple ][ Plus dans toute sa gloire de 1979. Il reproduit "
+"également l'affichage d'une télévision couleur de l'époque. En mode \"Texte\","
+" il affiche la sortie d'une commande (p.ex. \"fortune\"). En Mode \""
+"diaporama\", il choisis des images depuis la source d'image configurée dans "
+"XScreenSaver et les affiche avec les limitations de l'écran de l'Apple ][ "
+"(seulement 6 couleurs en mode haute résolution!). Dans le mode "
+"\"Programmation en BASIC\", un utilisateur simulé tape des commandes BASIC "
+"et lance le programme. Par Trevor Blackwell."
+
+#: hacks/config/apple2.xml.h:5
+msgid "Slideshow Mode"
+msgstr "Mode diaporama"
+
+#: hacks/config/apple2.xml.h:6
+msgid "Text Mode"
+msgstr "Mode texte"
+
+#: hacks/config/apple2.xml.h:7 hacks/config/fontglide.xml.h:15
+#: hacks/config/noseguy.xml.h:7 hacks/config/phosphor.xml.h:8
+#: hacks/config/starwars.xml.h:17
+msgid "Text Program"
+msgstr "Programme générant du texte"
 
 #: hacks/config/atlantis.xml.h:1
 msgid "Agressive"
@@ -1432,26 +1665,6 @@ msgstr "Vitesse des requins"
 msgid "Shimmering Water"
 msgstr "Eau miroitante"
 
-#: hacks/config/atlantis.xml.h:11 hacks/config/boxed.xml.h:5
-#: hacks/config/bubble3d.xml.h:4 hacks/config/cage.xml.h:3
-#: hacks/config/circuit.xml.h:9 hacks/config/cubenetic.xml.h:21
-#: hacks/config/dangerball.xml.h:4 hacks/config/endgame.xml.h:4
-#: hacks/config/engine.xml.h:4 hacks/config/extrusion.xml.h:10
-#: hacks/config/flipscreen3d.xml.h:5 hacks/config/fluidballs.xml.h:17
-#: hacks/config/gears.xml.h:6 hacks/config/gflux.xml.h:11
-#: hacks/config/glforestfire.xml.h:13 hacks/config/glplanet.xml.h:5
-#: hacks/config/glsnake.xml.h:10 hacks/config/gltext.xml.h:12
-#: hacks/config/lament.xml.h:5 hacks/config/menger.xml.h:15
-#: hacks/config/moebius.xml.h:6 hacks/config/molecule.xml.h:21
-#: hacks/config/morph3d.xml.h:5 hacks/config/pipes.xml.h:14
-#: hacks/config/pulsar.xml.h:14 hacks/config/queens.xml.h:3
-#: hacks/config/rubik.xml.h:6 hacks/config/sballs.xml.h:12
-#: hacks/config/sierpinski3d.xml.h:6 hacks/config/spheremonics.xml.h:18
-#: hacks/config/sproingies.xml.h:4 hacks/config/stairs.xml.h:2
-#: hacks/config/starwars.xml.h:11 hacks/config/superquadrics.xml.h:6
-msgid "Show Frames-per-Second"
-msgstr "Afficher images par seconde (FPS)"
-
 #: hacks/config/atlantis.xml.h:12
 msgid "Shy"
 msgstr "Timide"
@@ -1467,7 +1680,7 @@ msgstr "Timide"
 #: hacks/config/stairs.xml.h:4 hacks/config/stonerview.xml.h:2
 #: hacks/config/superquadrics.xml.h:9
 msgid "Solid"
-msgstr "Uni"
+msgstr "Plein"
 
 #: hacks/config/atlantis.xml.h:15
 msgid ""
@@ -1477,24 +1690,29 @@ msgid ""
 msgstr ""
 "Voici un aquarium grand format: une animation GL avec des requins, des "
 "dauphins et des baleines. Les mouvements de nage sont magnifiques. "
-"Initialement écrit par Mark Kilgard."
+"Initialement écrit par Mark Kilgard (porté par Eric Lassauge pour xlock)."
 
 #: hacks/config/atlantis.xml.h:16
 msgid "Whale Speed"
 msgstr "Vitesse des baleines"
 
-#: hacks/config/atlantis.xml.h:17 hacks/config/boxed.xml.h:8
-#: hacks/config/cage.xml.h:8 hacks/config/dangerball.xml.h:11
-#: hacks/config/extrusion.xml.h:19 hacks/config/gears.xml.h:11
-#: hacks/config/glforestfire.xml.h:20 hacks/config/glplanet.xml.h:11
-#: hacks/config/glsnake.xml.h:16 hacks/config/gltext.xml.h:18
-#: hacks/config/lament.xml.h:9 hacks/config/lavalite.xml.h:31
-#: hacks/config/menger.xml.h:21 hacks/config/moebius.xml.h:11
-#: hacks/config/molecule.xml.h:26 hacks/config/pulsar.xml.h:20
-#: hacks/config/sballs.xml.h:18 hacks/config/sierpinski3d.xml.h:12
-#: hacks/config/speedmine.xml.h:18 hacks/config/spheremonics.xml.h:26
-#: hacks/config/sproingies.xml.h:10 hacks/config/stairs.xml.h:7
-#: hacks/config/stonerview.xml.h:4 hacks/config/superquadrics.xml.h:11
+#: hacks/config/atlantis.xml.h:17 hacks/config/atunnel.xml.h:10
+#: hacks/config/blocktube.xml.h:13 hacks/config/boxed.xml.h:8
+#: hacks/config/cage.xml.h:8 hacks/config/cubestorm.xml.h:14
+#: hacks/config/dangerball.xml.h:11 hacks/config/extrusion.xml.h:19
+#: hacks/config/flipflop.xml.h:8 hacks/config/flyingtoasters.xml.h:14
+#: hacks/config/gears.xml.h:11 hacks/config/glblur.xml.h:20
+#: hacks/config/glforestfire.xml.h:20 hacks/config/glknots.xml.h:23
+#: hacks/config/glplanet.xml.h:11 hacks/config/glsnake.xml.h:16
+#: hacks/config/gltext.xml.h:18 hacks/config/jigglypuff.xml.h:25
+#: hacks/config/lament.xml.h:9 hacks/config/lavalite.xml.h:32
+#: hacks/config/menger.xml.h:21 hacks/config/mirrorblob.xml.h:20
+#: hacks/config/moebius.xml.h:11 hacks/config/molecule.xml.h:26
+#: hacks/config/pulsar.xml.h:20 hacks/config/sballs.xml.h:18
+#: hacks/config/sierpinski3d.xml.h:12 hacks/config/speedmine.xml.h:18
+#: hacks/config/spheremonics.xml.h:26 hacks/config/sproingies.xml.h:10
+#: hacks/config/stairs.xml.h:7 hacks/config/stonerview.xml.h:4
+#: hacks/config/superquadrics.xml.h:12
 msgid "Wireframe"
 msgstr "Fil de fer"
 
@@ -1510,7 +1728,7 @@ msgstr "Nombre de balles"
 msgid "Ball Mass"
 msgstr "Masse des balles"
 
-#: hacks/config/attraction.xml.h:4 hacks/config/fluidballs.xml.h:2
+#: hacks/config/attraction.xml.h:4 hacks/config/fluidballs.xml.h:3
 msgid "Balls"
 msgstr "Balles"
 
@@ -1519,7 +1737,7 @@ msgid "Bounce Off Walls"
 msgstr "Rebondir sur les murs"
 
 #: hacks/config/attraction.xml.h:6 hacks/config/hopalong.xml.h:1
-#: hacks/config/interference.xml.h:3 hacks/config/qix.xml.h:2
+#: hacks/config/interference.xml.h:5 hacks/config/qix.xml.h:2
 #: hacks/config/wander.xml.h:3
 msgid "Color Contrast"
 msgstr "Contraste des couleurs"
@@ -1533,18 +1751,19 @@ msgid "Filled Splines"
 msgstr "Rayons pleins"
 
 #: hacks/config/attraction.xml.h:10 hacks/config/ccurve.xml.h:9
-#: hacks/config/cubenetic.xml.h:10 hacks/config/euler2d.xml.h:5
-#: hacks/config/flame.xml.h:9 hacks/config/goop.xml.h:6
-#: hacks/config/hopalong.xml.h:10 hacks/config/hyperball.xml.h:3
-#: hacks/config/hypercube.xml.h:3 hacks/config/interference.xml.h:6
+#: hacks/config/cloudlife.xml.h:5 hacks/config/cubenetic.xml.h:10
+#: hacks/config/euler2d.xml.h:5 hacks/config/flame.xml.h:9
+#: hacks/config/glslideshow.xml.h:13 hacks/config/goop.xml.h:6
+#: hacks/config/halftone.xml.h:7 hacks/config/hopalong.xml.h:10
+#: hacks/config/hyperball.xml.h:3 hacks/config/hypercube.xml.h:3
+#: hacks/config/interference.xml.h:8 hacks/config/jigglypuff.xml.h:8
 #: hacks/config/kumppa.xml.h:4 hacks/config/lavalite.xml.h:12
 #: hacks/config/nerverot.xml.h:11 hacks/config/petri.xml.h:8
 #: hacks/config/pyro.xml.h:5 hacks/config/qix.xml.h:10
 #: hacks/config/speedmine.xml.h:5 hacks/config/spheremonics.xml.h:6
 #: hacks/config/spiral.xml.h:4 hacks/config/squiral.xml.h:6
-#: hacks/config/strange.xml.h:3 hacks/config/superquadrics.xml.h:4
-#: hacks/config/t3d.xml.h:7 hacks/config/twang.xml.h:5
-#: hacks/config/wander.xml.h:8
+#: hacks/config/superquadrics.xml.h:5 hacks/config/t3d.xml.h:7
+#: hacks/config/twang.xml.h:5 hacks/config/wander.xml.h:8
 msgid "High"
 msgstr "Haut(e)"
 
@@ -1583,15 +1802,18 @@ msgstr ""
 
 #: hacks/config/attraction.xml.h:15 hacks/config/deluxe.xml.h:5
 #: hacks/config/lmorph.xml.h:7 hacks/config/pedal.xml.h:5
-#: hacks/config/starfish.xml.h:4 hacks/config/whirlygig.xml.h:3
+#: hacks/config/starfish.xml.h:4 hacks/config/whirlygig.xml.h:10
 msgid "Lines"
-msgstr "Lignes"
-
-#: hacks/config/attraction.xml.h:16 hacks/config/braid.xml.h:6
-#: hacks/config/cynosure.xml.h:5 hacks/config/drift.xml.h:8
-#: hacks/config/euler2d.xml.h:6 hacks/config/galaxy.xml.h:5
-#: hacks/config/juggle.xml.h:5 hacks/config/laser.xml.h:5
-#: hacks/config/menger.xml.h:4 hacks/config/munch.xml.h:4
+msgstr "Ligne"
+
+#: hacks/config/attraction.xml.h:16 hacks/config/blocktube.xml.h:5
+#: hacks/config/braid.xml.h:6 hacks/config/cynosure.xml.h:5
+#: hacks/config/drift.xml.h:8 hacks/config/eruption.xml.h:11
+#: hacks/config/euler2d.xml.h:6 hacks/config/fireflies.xml.h:21
+#: hacks/config/fontglide.xml.h:8 hacks/config/galaxy.xml.h:5
+#: hacks/config/juggle.xml.h:5 hacks/config/klein.xml.h:4
+#: hacks/config/laser.xml.h:5 hacks/config/menger.xml.h:4
+#: hacks/config/metaballs.xml.h:5 hacks/config/munch.xml.h:4
 #: hacks/config/nerverot.xml.h:13 hacks/config/petri.xml.h:9
 #: hacks/config/polyominoes.xml.h:4 hacks/config/rotor.xml.h:5
 #: hacks/config/shadebobs.xml.h:4 hacks/config/sierpinski3d.xml.h:3
@@ -1601,18 +1823,19 @@ msgid "Long"
 msgstr "Long(ue)"
 
 #: hacks/config/attraction.xml.h:17 hacks/config/ccurve.xml.h:10
-#: hacks/config/cubenetic.xml.h:12 hacks/config/euler2d.xml.h:7
-#: hacks/config/flame.xml.h:10 hacks/config/goop.xml.h:7
-#: hacks/config/hopalong.xml.h:14 hacks/config/hyperball.xml.h:6
-#: hacks/config/hypercube.xml.h:5 hacks/config/interference.xml.h:9
+#: hacks/config/cloudlife.xml.h:8 hacks/config/cubenetic.xml.h:12
+#: hacks/config/euler2d.xml.h:7 hacks/config/flame.xml.h:10
+#: hacks/config/glslideshow.xml.h:15 hacks/config/goop.xml.h:7
+#: hacks/config/halftone.xml.h:9 hacks/config/hopalong.xml.h:14
+#: hacks/config/hyperball.xml.h:6 hacks/config/hypercube.xml.h:5
+#: hacks/config/interference.xml.h:12 hacks/config/jigglypuff.xml.h:11
 #: hacks/config/kumppa.xml.h:6 hacks/config/lavalite.xml.h:14
 #: hacks/config/nerverot.xml.h:14 hacks/config/petri.xml.h:10
 #: hacks/config/pyro.xml.h:7 hacks/config/qix.xml.h:13
 #: hacks/config/speedmine.xml.h:6 hacks/config/spheremonics.xml.h:8
 #: hacks/config/spiral.xml.h:5 hacks/config/squiral.xml.h:8
-#: hacks/config/strange.xml.h:4 hacks/config/superquadrics.xml.h:5
-#: hacks/config/t3d.xml.h:8 hacks/config/twang.xml.h:7
-#: hacks/config/wander.xml.h:11
+#: hacks/config/superquadrics.xml.h:6 hacks/config/t3d.xml.h:8
+#: hacks/config/twang.xml.h:7 hacks/config/wander.xml.h:11
 msgid "Low"
 msgstr "Bas(se)"
 
@@ -1636,15 +1859,18 @@ msgstr "Rayon"
 msgid "Repulsion Threshold"
 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/euler2d.xml.h:12 hacks/config/galaxy.xml.h:8
+#: hacks/config/attraction.xml.h:25 hacks/config/blocktube.xml.h:7
+#: hacks/config/braid.xml.h:10 hacks/config/cynosure.xml.h:8
+#: hacks/config/drift.xml.h:11 hacks/config/eruption.xml.h:18
+#: hacks/config/euler2d.xml.h:12 hacks/config/fireflies.xml.h:34
+#: hacks/config/galaxy.xml.h:8 hacks/config/klein.xml.h:5
 #: hacks/config/laser.xml.h:9 hacks/config/menger.xml.h:14
-#: hacks/config/munch.xml.h:6 hacks/config/nerverot.xml.h:19
-#: hacks/config/petri.xml.h:22 hacks/config/polyominoes.xml.h:9
-#: hacks/config/rotor.xml.h:9 hacks/config/shadebobs.xml.h:8
-#: hacks/config/sierpinski3d.xml.h:5 hacks/config/spheremonics.xml.h:17
-#: hacks/config/wander.xml.h:12 hacks/config/whirlwindwarp.xml.h:6
+#: hacks/config/metaballs.xml.h:12 hacks/config/munch.xml.h:6
+#: hacks/config/nerverot.xml.h:19 hacks/config/petri.xml.h:22
+#: hacks/config/polyominoes.xml.h:9 hacks/config/rotor.xml.h:9
+#: hacks/config/shadebobs.xml.h:8 hacks/config/sierpinski3d.xml.h:5
+#: hacks/config/spheremonics.xml.h:17 hacks/config/wander.xml.h:12
+#: hacks/config/whirlwindwarp.xml.h:6
 msgid "Short"
 msgstr "Court(e)"
 
@@ -1652,7 +1878,7 @@ msgstr "Court(e)"
 msgid "Splines"
 msgstr "Rayons"
 
-#: hacks/config/attraction.xml.h:30
+#: hacks/config/attraction.xml.h:30 hacks/config/fireflies.xml.h:42
 msgid "Tails"
 msgstr "Queues"
 
@@ -1661,6 +1887,57 @@ msgstr "Queues"
 msgid "Trail Length"
 msgstr "Longueur de la traînée"
 
+#: hacks/config/atunnel.xml.h:1
+msgid "Atunnel"
+msgstr "Tunnel GL"
+
+#: hacks/config/atunnel.xml.h:2
+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 and Roman Podobedov."
+msgstr ""
+"Dessine une animation d'un tunnel texturé en 3D. Nécessite OpenGL et "
+"une machine avec un support matériel puissant pour les textures. Écrit "
+"par Eric Lassauge &lt;lassauge@mail.dotcom.fr&gt; et Roman Podobedov."
+
+#: hacks/config/atunnel.xml.h:4 hacks/config/distort.xml.h:9
+#: hacks/config/glforestfire.xml.h:10 hacks/config/lament.xml.h:4
+#: hacks/config/sballs.xml.h:6
+msgid "Normal"
+msgstr "Normal"
+
+#: hacks/config/atunnel.xml.h:8 hacks/config/glforestfire.xml.h:18
+#: hacks/config/lament.xml.h:8 hacks/config/sballs.xml.h:17
+msgid "Untextured"
+msgstr "Sans texture"
+
+#: hacks/config/atunnel.xml.h:9
+msgid "Use light"
+msgstr "Utiliser l'éclairage"
+
+#: hacks/config/barcode.xml.h:1
+msgid "Barcode"
+msgstr "Codes barre"
+
+#: hacks/config/barcode.xml.h:2
+msgid "Barcode Clock (24 Hour)"
+msgstr "Horloge codes barre (24 heures)"
+
+#: hacks/config/barcode.xml.h:3
+msgid "Barcode Clock (AM/PM)"
+msgstr "Horloge codes barre (AM/PM)"
+
+#: hacks/config/barcode.xml.h:5
+msgid "Scrolling Barcodes"
+msgstr "Codes barre défilants"
+
+#: hacks/config/barcode.xml.h:8
+msgid ""
+"This draws a random sequence of colorful barcodes scrolling across your "
+"screen. CONSUME! By Dan Bornstein."
+msgstr ""
+
 #: hacks/config/blaster.xml.h:1
 msgid "Blaster"
 msgstr "Explosion"
@@ -1687,6 +1964,16 @@ msgstr "Robots"
 msgid "Stars"
 msgstr "Étoiles"
 
+#: hacks/config/blinkbox.xml.h:1
+msgid "BlinkBox"
+msgstr ""
+
+#: hacks/config/blinkbox.xml.h:3
+msgid ""
+"Shows a ball contained inside of a bounding box. Colored blocks blink in "
+"when the ball hits the edges. Written by Jeremy English."
+msgstr ""
+
 #: hacks/config/blitspin.xml.h:1
 msgid "90 deg Rotation Speed"
 msgstr "Vitesse de rotation à 90°"
@@ -1697,11 +1984,11 @@ msgstr "Image 
 
 #: hacks/config/blitspin.xml.h:3
 msgid "BlitSpin"
-msgstr "RotationBitmap"
+msgstr "Rotation Bitmap"
 
 #: hacks/config/blitspin.xml.h:5
 msgid "Fuzzy Rotation Speed"
-msgstr "Vitesse de rotation floue"
+msgstr "Vitesse de rotation du brouillage"
 
 #: hacks/config/blitspin.xml.h:6
 msgid "Grab Screen"
@@ -1719,7 +2006,7 @@ msgid ""
 "provide the image to use, as an XBM or XPM file, or tell it to grab a screen "
 "image and rotate that."
 msgstr ""
-"Le mode RotationBitmap fait pivoter à plusieurs reprises un bitmap de 90° à "
+"Le mode Rotation Bitmap fait pivoter à plusieurs reprises un bitmap de 90° à "
 "l'aide d'opérations logiques: le bitmap est divisé en quadrants, qui "
 "pivotent dans le sens horaire. La même opération est répétée avec des "
 "quadrants progressivement plus petits, à ceci près que tous les sous-"
@@ -1730,6 +2017,32 @@ msgstr ""
 "utiliser, au format XBM ou XPM, ou effectuer une capture d'écran et la faire "
 "pivoter."
 
+#: hacks/config/blocktube.xml.h:1
+msgid "BlockTube"
+msgstr "Tube de blocs"
+
+#: hacks/config/blocktube.xml.h:2
+msgid "Color Change Time"
+msgstr "Durée de changement de couleur"
+
+#: hacks/config/blocktube.xml.h:3
+msgid "Color Hold Time"
+msgstr "Durée de rétention de couleur"
+
+#: hacks/config/blocktube.xml.h:6
+msgid "Reflective Blocks"
+msgstr "Blocs Réflechissants"
+
+#: hacks/config/blocktube.xml.h:10
+msgid "Solid Blocks"
+msgstr "Blocs pleins"
+
+#: hacks/config/blocktube.xml.h:12
+msgid ""
+"This hack draws a swirling, falling tunnel of reflective slabs. They fade "
+"from hue to hue. Written by Lars R. Damerow."
+msgstr ""
+
 #: hacks/config/bouboule.xml.h:1
 msgid "Bouboule"
 msgstr "Bouboule"
@@ -1744,19 +2057,57 @@ msgstr "Nombre de taches"
 
 #: hacks/config/bouboule.xml.h:10
 msgid ""
-"This draws what looks like a spinning, deforming baloon with varying-sized "
+"This draws what looks like a spinning, deforming balloon with varying-sized "
 "spots painted on its invisible surface. Written by Jeremie Petit."
 msgstr ""
 "Dessine une sorte de ballon qui tournoie et se déforme. Des taches de taille "
 "variable sont peintes sur sa surface invisible. Écrit par Jeremie Petit."
 
-#: hacks/config/boxed.xml.h:1 hacks/config/gears.xml.h:1
-#: hacks/config/gflux.xml.h:1 hacks/config/pyro.xml.h:1
-#: hacks/config/rd-bomb.xml.h:6 hacks/config/rocks.xml.h:1
-#: hacks/config/starwars.xml.h:1 hacks/config/xfishtank.xml.h:1
+#: hacks/config/bouncingcow.xml.h:1
+msgid "A Cow. A Trampoline. Together, they fight crime. By Jamie Zawinski."
+msgstr ""
+"Une vache. Un trampoline. Ensemble ils combattent le crime. Écrit par Jamie "
+"Zawinski."
+
+#: hacks/config/bouncingcow.xml.h:2 hacks/config/boxed.xml.h:1
+#: hacks/config/cubestorm.xml.h:1 hacks/config/flyingtoasters.xml.h:3
+#: hacks/config/fontglide.xml.h:1 hacks/config/gears.xml.h:1
+#: hacks/config/gflux.xml.h:1 hacks/config/glknots.xml.h:1
+#: hacks/config/glmatrix.xml.h:1 hacks/config/jigglypuff.xml.h:1
+#: hacks/config/pyro.xml.h:1 hacks/config/rd-bomb.xml.h:6
+#: hacks/config/rocks.xml.h:1 hacks/config/starwars.xml.h:1
+#: hacks/config/xfishtank.xml.h:1
 msgid "Animation Speed"
 msgstr "Vitesse d'animation"
 
+#: hacks/config/bouncingcow.xml.h:3
+msgid "Beefy Cow"
+msgstr "Vache costaude"
+
+#: hacks/config/bouncingcow.xml.h:4
+msgid "Bounce Speed"
+msgstr "Vitesse de rebond"
+
+#: hacks/config/bouncingcow.xml.h:5
+msgid "BouncingCow"
+msgstr "Vache bondissante"
+
+#: hacks/config/bouncingcow.xml.h:7
+msgid "Herd"
+msgstr "Troupeau"
+
+#: hacks/config/bouncingcow.xml.h:8
+msgid "Moo"
+msgstr "Meuh"
+
+#: hacks/config/bouncingcow.xml.h:9
+msgid "Number of Cows"
+msgstr "Nombre de vaches"
+
+#: hacks/config/bouncingcow.xml.h:11
+msgid "Wireframe Cow"
+msgstr "Vache file de fer"
+
 #: hacks/config/boxed.xml.h:2
 msgid "Boxed"
 msgstr "En boîte"
@@ -1781,23 +2132,24 @@ msgstr ""
 "Dessine des cercles concentriques aléatoires entrelacés, avec des cycles de "
 "couleurs. Écrit par John Neil."
 
-#: hacks/config/braid.xml.h:3 hacks/config/bsod.xml.h:8
+#: hacks/config/braid.xml.h:3 hacks/config/bsod.xml.h:9
 #: hacks/config/ccurve.xml.h:7 hacks/config/coral.xml.h:6
 #: hacks/config/cynosure.xml.h:3 hacks/config/deco.xml.h:4
 #: hacks/config/drift.xml.h:2 hacks/config/epicycle.xml.h:3
-#: hacks/config/euler2d.xml.h:1 hacks/config/flame.xml.h:5
-#: hacks/config/galaxy.xml.h:2 hacks/config/glsnake.xml.h:4
-#: hacks/config/helix.xml.h:3 hacks/config/hopalong.xml.h:2
-#: hacks/config/imsmap.xml.h:6 hacks/config/laser.xml.h:2
-#: hacks/config/menger.xml.h:2 hacks/config/moire.xml.h:3
-#: hacks/config/molecule.xml.h:9 hacks/config/munch.xml.h:2
-#: hacks/config/nerverot.xml.h:8 hacks/config/pedal.xml.h:3
-#: hacks/config/penrose.xml.h:5 hacks/config/polyominoes.xml.h:1
-#: hacks/config/rorschach.xml.h:3 hacks/config/rotzoomer.xml.h:5
-#: hacks/config/shadebobs.xml.h:2 hacks/config/sierpinski3d.xml.h:1
-#: hacks/config/spheremonics.xml.h:4 hacks/config/starfish.xml.h:2
-#: hacks/config/vidwhacker.xml.h:3 hacks/config/wander.xml.h:7
-#: hacks/config/xspirograph.xml.h:3
+#: hacks/config/eruption.xml.h:3 hacks/config/euler2d.xml.h:1
+#: hacks/config/flame.xml.h:5 hacks/config/galaxy.xml.h:2
+#: hacks/config/glsnake.xml.h:4 hacks/config/helix.xml.h:3
+#: hacks/config/hopalong.xml.h:2 hacks/config/imsmap.xml.h:6
+#: hacks/config/klein.xml.h:1 hacks/config/laser.xml.h:2
+#: hacks/config/menger.xml.h:2 hacks/config/metaballs.xml.h:3
+#: hacks/config/moire.xml.h:3 hacks/config/molecule.xml.h:9
+#: hacks/config/munch.xml.h:2 hacks/config/nerverot.xml.h:8
+#: hacks/config/pedal.xml.h:3 hacks/config/penrose.xml.h:5
+#: hacks/config/polyominoes.xml.h:1 hacks/config/rorschach.xml.h:3
+#: hacks/config/rotzoomer.xml.h:5 hacks/config/shadebobs.xml.h:2
+#: hacks/config/sierpinski3d.xml.h:1 hacks/config/spheremonics.xml.h:4
+#: hacks/config/starfish.xml.h:2 hacks/config/vidwhacker.xml.h:3
+#: hacks/config/wander.xml.h:7 hacks/config/xspirograph.xml.h:3
 msgid "Duration"
 msgstr "Durée"
 
@@ -1824,65 +2176,92 @@ msgid "AmigaDOS"
 msgstr "Amiga DOS"
 
 #: hacks/config/bsod.xml.h:4
+msgid "Apple II"
+msgstr "Apple ]["
+
+#: hacks/config/bsod.xml.h:5
 msgid "Atari"
 msgstr "Atari"
 
-#: hacks/config/bsod.xml.h:5
+#: hacks/config/bsod.xml.h:6
 msgid "BSD"
 msgstr "BSD"
 
-#: hacks/config/bsod.xml.h:6
+#: hacks/config/bsod.xml.h:7
 msgid "BSOD"
 msgstr "BSOD"
 
-#: hacks/config/bsod.xml.h:7
+#: hacks/config/bsod.xml.h:8
 msgid ""
 "BSOD stands for ``Blue Screen of Death.'' The finest in personal computer "
 "emulation, this hack simulates popular screen savers from a number of less "
 "robust operating systems. Written by Jamie Zawinski."
 msgstr ""
-"BSOD signifie «Blue Screen of Deaths» (écran bleu de la mort). Fine fleur de "
+"BSOD signifie «Blue Screen of Death» (écran bleu de la mort). Fine fleur de "
 "l'émulation PC, ce hack simule des économiseurs d'écran de plusieurs "
 "systèmes d'exploitation moins puissants. Écrit par Jamie Zawinski."
 
-#: hacks/config/bsod.xml.h:9
+#: hacks/config/bsod.xml.h:10
+msgid "HPUX"
+msgstr "HPUX"
+
+#: hacks/config/bsod.xml.h:11
+msgid "HVX/GCOS6"
+msgstr "HVX/GCOS6"
+
+#: hacks/config/bsod.xml.h:12
+msgid "Linux"
+msgstr "Linux"
+
+#: hacks/config/bsod.xml.h:13
 msgid "Mac Bomb"
 msgstr "Bombe Mac"
 
-#: hacks/config/bsod.xml.h:10
+#: hacks/config/bsod.xml.h:14
+msgid "MacOS X"
+msgstr "MacOS X"
+
+#: hacks/config/bsod.xml.h:15
 msgid "MacsBug"
 msgstr "Bogue Mac"
 
-#: hacks/config/bsod.xml.h:11
+#: hacks/config/bsod.xml.h:16
 msgid "NCD X Terminal"
 msgstr "Terminal NCD X"
 
-#: hacks/config/bsod.xml.h:12
+#: hacks/config/bsod.xml.h:17
+msgid "OS/390"
+msgstr "OS/390"
+
+#: hacks/config/bsod.xml.h:18
 msgid "SCO"
 msgstr "SCO"
 
-#: hacks/config/bsod.xml.h:13
+#: hacks/config/bsod.xml.h:19
 msgid "Sad Mac"
 msgstr "Mac Triste"
 
-#: hacks/config/bsod.xml.h:14
+#: hacks/config/bsod.xml.h:20
 msgid "Solaris"
 msgstr "Solaris"
 
-#: hacks/config/bsod.xml.h:15
+#: hacks/config/bsod.xml.h:21
 msgid "Sparc Linux"
 msgstr "Sparc Linux"
 
-#: hacks/config/bsod.xml.h:16
-#, fuzzy
-msgid "Windows"
-msgstr "Windows NT"
+#: hacks/config/bsod.xml.h:22
+msgid "VMS"
+msgstr "VMS"
 
-#: hacks/config/bsod.xml.h:17
+#: hacks/config/bsod.xml.h:23
 msgid "Windows 2000"
 msgstr "Windows 2000"
 
-#: hacks/config/bsod.xml.h:18
+#: hacks/config/bsod.xml.h:24
+msgid "Windows 3.1"
+msgstr "Windows 3.1"
+
+#: hacks/config/bsod.xml.h:25
 msgid "Windows NT"
 msgstr "Windows NT"
 
@@ -1991,7 +2370,7 @@ msgstr "D
 #: hacks/config/ccurve.xml.h:6 hacks/config/coral.xml.h:5
 #: hacks/config/imsmap.xml.h:5 hacks/config/kumppa.xml.h:1
 #: hacks/config/qix.xml.h:6 hacks/config/squiral.xml.h:2
-#: hacks/config/wander.xml.h:4 hacks/config/xmatrix.xml.h:3
+#: hacks/config/wander.xml.h:4 hacks/config/xmatrix.xml.h:2
 msgid "Density"
 msgstr "Densité"
 
@@ -2022,9 +2401,10 @@ msgstr "Couleur en aplat"
 
 #: hacks/config/circuit.xml.h:6
 msgid "Parts"
-msgstr "Parties"
+msgstr "Composants"
 
 #: hacks/config/circuit.xml.h:7 hacks/config/flipscreen3d.xml.h:4
+#: hacks/config/gleidescope.xml.h:9
 msgid "Rotate"
 msgstr "Rotation globale"
 
@@ -2032,19 +2412,54 @@ msgstr "Rotation globale"
 msgid "Rotation Speed"
 msgstr "Vitesse de rotation"
 
-#: hacks/config/circuit.xml.h:12 hacks/config/dangerball.xml.h:9
-#: hacks/config/engine.xml.h:7
+#: hacks/config/circuit.xml.h:12 hacks/config/cubestorm.xml.h:9
+#: hacks/config/dangerball.xml.h:9 hacks/config/engine.xml.h:17
+#: hacks/config/klein.xml.h:9 hacks/config/whirlygig.xml.h:14
 msgid "Spin"
 msgstr "Rotation des objets"
 
+#: hacks/config/cloudlife.xml.h:1 hacks/config/demon.xml.h:2
+#: hacks/config/petri.xml.h:1
+msgid "Cell Size"
+msgstr "Taille des cellules"
+
+#: hacks/config/cloudlife.xml.h:2
+msgid "CloudLife"
+msgstr ""
+
+#: hacks/config/cloudlife.xml.h:4
+msgid ""
+"Generates cloud-like formations based on a variant of Conway's Life. The "
+"difference is that cells have a maximum age, after which they count as 3 for "
+"populating the next generation. This makes long-lived formations explode "
+"instead of just sitting there burning a hole in your screen. Written by Don "
+"Marti."
+msgstr ""
+
+#: hacks/config/cloudlife.xml.h:6
+msgid "Initial Density"
+msgstr "Densité initiale"
+
+#: hacks/config/cloudlife.xml.h:9
+msgid "Max Age"
+msgstr "Age max"
+
+#: hacks/config/cloudlife.xml.h:10
+msgid "Old"
+msgstr "vieux"
+
+#: hacks/config/cloudlife.xml.h:14
+msgid "Young"
+msgstr "jeune"
+
 #: hacks/config/compass.xml.h:1
 msgid "Compass"
 msgstr "Boussole"
 
 #: hacks/config/compass.xml.h:2 hacks/config/deluxe.xml.h:3
-#: hacks/config/interference.xml.h:4 hacks/config/kumppa.xml.h:2
-#: hacks/config/nerverot.xml.h:6 hacks/config/piecewise.xml.h:3
-#: hacks/config/pipes.xml.h:4
+#: hacks/config/fontglide.xml.h:3 hacks/config/interference.xml.h:6
+#: hacks/config/kumppa.xml.h:2 hacks/config/nerverot.xml.h:6
+#: hacks/config/piecewise.xml.h:3 hacks/config/pipes.xml.h:4
 msgid "Double Buffer"
 msgstr "Double tampon"
 
@@ -2101,7 +2516,7 @@ msgstr ""
 #: hacks/config/squiral.xml.h:15 hacks/config/xearth.xml.h:24
 #: hacks/config/xmatrix.xml.h:17
 msgid "Sparse"
-msgstr "Rare"
+msgstr "Faible"
 
 #: hacks/config/cosmos.xml.h:1
 msgid "Cosmos"
@@ -2195,7 +2610,8 @@ msgstr "Afficher les mod
 msgid "Display Wireframe"
 msgstr "Fil de fer"
 
-#: hacks/config/cubenetic.xml.h:6 hacks/config/gltext.xml.h:2
+#: hacks/config/cubenetic.xml.h:6 hacks/config/glblur.xml.h:3
+#: hacks/config/glknots.xml.h:2 hacks/config/gltext.xml.h:2
 #: hacks/config/lavalite.xml.h:7 hacks/config/menger.xml.h:1
 #: hacks/config/molecule.xml.h:4 hacks/config/spheremonics.xml.h:1
 msgid "Don't Rotate"
@@ -2259,24 +2675,49 @@ msgstr "Rotation autour des trois axes"
 
 #: hacks/config/cubenetic.xml.h:25
 msgid "Surface Pattern Complexity"
-msgstr ""
+msgstr "Complexité des modèles de surface"
 
 #: hacks/config/cubenetic.xml.h:26
 msgid "Surface Pattern Overlap"
-msgstr ""
+msgstr "Recouvrement des modèles de surface"
 
 #: hacks/config/cubenetic.xml.h:27
 msgid "Surface Pattern Speed"
-msgstr ""
-
-#: hacks/config/cubenetic.xml.h:28 hacks/config/dangerball.xml.h:10
-#: hacks/config/engine.xml.h:8 hacks/config/glforestfire.xml.h:19
-#: hacks/config/gltext.xml.h:17 hacks/config/lavalite.xml.h:30
-#: hacks/config/menger.xml.h:20 hacks/config/molecule.xml.h:25
-#: hacks/config/spheremonics.xml.h:25 hacks/config/wander.xml.h:15
+msgstr "Vitesse de changement des modèles de surface"
+
+#: hacks/config/cubenetic.xml.h:28 hacks/config/cubestorm.xml.h:13
+#: hacks/config/dangerball.xml.h:10 hacks/config/engine.xml.h:20
+#: hacks/config/glblur.xml.h:19 hacks/config/glforestfire.xml.h:19
+#: hacks/config/glknots.xml.h:22 hacks/config/gltext.xml.h:17
+#: hacks/config/lavalite.xml.h:31 hacks/config/menger.xml.h:20
+#: hacks/config/molecule.xml.h:25 hacks/config/spheremonics.xml.h:25
+#: hacks/config/wander.xml.h:15
 msgid "Wander"
 msgstr "Déplacement"
 
+#: hacks/config/cubestorm.xml.h:2
+msgid "CubeStorm"
+msgstr "Tempête de cubes"
+
+#: hacks/config/cubestorm.xml.h:3
+msgid ""
+"Draws a series of rotating 3D boxes that intersect each other and eventually "
+"fill space. Written by Jamie Zawinski."
+msgstr ""
+
+#: hacks/config/cubestorm.xml.h:5 hacks/config/fontglide.xml.h:9
+#: hacks/config/glknots.xml.h:6
+msgid "Motion Speed"
+msgstr "Vitesse de déplacement"
+
+#: hacks/config/cubestorm.xml.h:6
+msgid "Number of Cubes"
+msgstr "Nombre de cubes"
+
+#: hacks/config/cubestorm.xml.h:10
+msgid "Strut Thickness"
+msgstr "Épaisseur traverse"
+
 #: hacks/config/cynosure.xml.h:1
 msgid ""
 "A hack similar to `greynetic', but less frenetic. The first implementation "
@@ -2378,13 +2819,12 @@ msgid "Stretchy Melt"
 msgstr "Fondu étendu"
 
 #: hacks/config/decayscreen.xml.h:20
-#, fuzzy
 msgid ""
 "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. Written by David Wald "
-"and Vivek Khera."
+"after the screen saver is off, seek medical attention. Written by David "
+"Wald, Vivek Khera, Jamie Zawinski, and Vince Levey."
 msgstr ""
 "Fait fondre une image. Vous avez certainement déjà vu cet effet, mais aucun "
 "programme d'économiseurs d'écran ne pourrait s'en passer. Il fonctionne "
@@ -2418,7 +2858,7 @@ msgstr ""
 "Zawinski, inspiré par un code Java de Michael Bayne."
 
 #: hacks/config/deco.xml.h:11 hacks/config/rd-bomb.xml.h:23
-#: hacks/config/whirlygig.xml.h:7 hacks/config/xearth.xml.h:33
+#: hacks/config/whirlygig.xml.h:20 hacks/config/xearth.xml.h:33
 #: hacks/config/zoom.xml.h:10
 msgid "x"
 msgstr "x"
@@ -2451,10 +2891,6 @@ msgstr ""
 "Automate cellulaire qui commence par un champ aléatoire et s'organise en "
 "bandes et spirales. Écrit par David Bagley."
 
-#: hacks/config/demon.xml.h:2 hacks/config/petri.xml.h:1
-msgid "Cell Size"
-msgstr "Taille de cellule"
-
 #: hacks/config/demon.xml.h:3
 msgid "Demon"
 msgstr "Démon"
@@ -2499,18 +2935,13 @@ msgstr "Taille des lentilles"
 msgid "Magnify"
 msgstr "Agrandir"
 
-#: hacks/config/distort.xml.h:9 hacks/config/glforestfire.xml.h:10
-#: hacks/config/lament.xml.h:4 hacks/config/sballs.xml.h:6
-msgid "Normal"
-msgstr "Normal"
-
 #: hacks/config/distort.xml.h:10
 msgid "Reflect"
 msgstr "Réfléchir"
 
 #: hacks/config/distort.xml.h:14
 msgid "Swamp Thing"
-msgstr "Marais"
+msgstr "Marais(e)"
 
 #: hacks/config/distort.xml.h:15
 msgid ""
@@ -2558,20 +2989,44 @@ msgid "Lissojous Figures"
 msgstr "Figures Lissojous"
 
 #: hacks/config/electricsheep.xml.h:1
-msgid "ElectricSheep"
-msgstr "Mouton électrique"
-
-#: hacks/config/electricsheep.xml.h:2
 msgid ""
 "ElectricSheep is an xscreensaver module that displays mpeg video of an "
 "animated fractal flame. In the background, it contributes render cycles to "
 "the next animation. Periodically it uploades completed frames to the server, "
 "where they are compressed for distribution to all clients. This program is "
-"recommended only if you have a high bandwidth connection to the Internet. By "
-"Scott Draves. You can find it at &lt;http://www.electricsheep.org/&gt;. See "
-"that web site for configuration information."
+"recommended only if you have a high bandwidth, always-on connection to the "
+"Internet. By Scott Draves. You can find it at &lt;http://www.electricsheep."
+"org/&gt;."
 msgstr ""
 
+#: hacks/config/electricsheep.xml.h:2
+msgid "Frame Rate"
+msgstr "Vitesse de trame"
+
+#: hacks/config/electricsheep.xml.h:3
+msgid "Hide Sheep"
+msgstr "Cache le mouton"
+
+#: hacks/config/electricsheep.xml.h:4
+msgid "Megabytes of Local Sheep Storage"
+msgstr "Mégaoctets pour les données locales"
+
+#: hacks/config/electricsheep.xml.h:5
+msgid "Nickname"
+msgstr "Pseudo"
+
+#: hacks/config/electricsheep.xml.h:6
+msgid "Repititions of each Sheep"
+msgstr "Répétitions de chaque mouton"
+
+#: hacks/config/electricsheep.xml.h:7
+msgid "Standalone"
+msgstr "Autonome"
+
+#: hacks/config/electricsheep.xml.h:8
+msgid "URL"
+msgstr "URL"
+
 #: hacks/config/endgame.xml.h:1
 msgid ""
 "Black slips out of three mating nets, but the fourth one holds him tight! A "
@@ -2583,18 +3038,65 @@ msgid "Endgame"
 msgstr "Fin de jeux"
 
 #: hacks/config/engine.xml.h:1
-#, fuzzy
+msgid "Audi Quattro (5 cylinders)"
+msgstr "Audi Quattro (5 cylindres)"
+
+#: hacks/config/engine.xml.h:2
+msgid "BMW M3 (4 cylinders)"
+msgstr "BMW M3 (4 cylindres)"
+
+#: hacks/config/engine.xml.h:3
+msgid "BMW M5 (6 cylinders)"
+msgstr "BMW M5 (6 cylindres)"
+
+#: hacks/config/engine.xml.h:4
+msgid "Corvette Z06 (8 cylinders, V)"
+msgstr "Corvette Z06 (8 cylindres en V)"
+
+#: hacks/config/engine.xml.h:5
+msgid "Dodge Viper (10 cylinders, V)"
+msgstr "Dodge Viper (10 cylindres en V)"
+
+#: hacks/config/engine.xml.h:6
 msgid ""
-"Draws a simple four-stroke engine that floats around the screen. Written by "
-"Ben Buxton."
+"Draws a simple model of an engine that floats around the screen. Written by "
+"Ben Buxton and Ed Beroset."
 msgstr ""
-"Dessine un simple moteur à quatre temps qui flotte sur l'écran. Écrit par "
-"Ben Buxton et Ed Beroset."
+"Dessine un modèle simplifié de moteur qui flotte sur l'écran. Écrit par Ben "
+"Buxton et Ed Beroset."
 
-#: hacks/config/engine.xml.h:2
+#: hacks/config/engine.xml.h:7
 msgid "Engine"
 msgstr "Moteur"
 
+#: hacks/config/engine.xml.h:9
+msgid "Honda Insight (3 cylinders)"
+msgstr "Honda Insight (3 cylindres)"
+
+#: hacks/config/engine.xml.h:10
+msgid "Jaguar XKE (12 cylinders, V)"
+msgstr "Jaguar XKE (12 cylindres en V)"
+
+#: hacks/config/engine.xml.h:11
+msgid "Porsche 911 (6 cylinders, flat)"
+msgstr "Porsche 911 (6 cylindres à plat)"
+
+#: hacks/config/engine.xml.h:12
+msgid "Random Engine"
+msgstr "Moteur aléatoire"
+
+#: hacks/config/engine.xml.h:13
+msgid "Show Engine Name"
+msgstr "Affiche le nom du moteur"
+
+#: hacks/config/engine.xml.h:18
+msgid "Subaru XT (6 cylinders, V)"
+msgstr "Subaru XT (6 cylindres en V)"
+
+#: hacks/config/engine.xml.h:19
+msgid "VW Beetle (4 cylinders, flat)"
+msgstr "VW Beetle (4 cylindres à plat)"
+
 #: hacks/config/epicycle.xml.h:4
 msgid "Epicycle"
 msgstr "Épicycle"
@@ -2615,6 +3117,51 @@ msgstr ""
 "ainsi de suite, plusieurs fois. Il s'agit de la base du modèle pré-"
 "héliocentrique de révolution planétaire. Écrit par James Youngman."
 
+#: hacks/config/eruption.xml.h:1
+msgid "An exposive version of XFlame. By W.P. van Paassen."
+msgstr "Une version explosive de XFishTank. Par W.P. van Paassen."
+
+#: hacks/config/eruption.xml.h:2
+msgid "Cooling factor"
+msgstr "Facteur de refroidissement"
+
+#: hacks/config/eruption.xml.h:4
+msgid "Eruption"
+msgstr "Éruption"
+
+#: hacks/config/eruption.xml.h:7 hacks/config/fluidballs.xml.h:9
+#: hacks/config/qix.xml.h:9 hacks/config/speedmine.xml.h:4
+msgid "Gravity"
+msgstr "Gravité"
+
+#: hacks/config/eruption.xml.h:8
+msgid "Heat"
+msgstr "Chaleur"
+
+#: hacks/config/eruption.xml.h:9
+msgid "Inferno"
+msgstr "Infernale"
+
+#: hacks/config/eruption.xml.h:10
+msgid "Little"
+msgstr "Faible"
+
+#: hacks/config/eruption.xml.h:13
+msgid "Negative"
+msgstr "Négative"
+
+#: hacks/config/eruption.xml.h:15
+msgid "Number of Particles"
+msgstr "Nombre de particules"
+
+#: hacks/config/eruption.xml.h:16
+msgid "Pleasant"
+msgstr "Plaisante"
+
+#: hacks/config/eruption.xml.h:17
+msgid "Positive"
+msgstr "Positive"
+
 #: hacks/config/euler2d.xml.h:2
 msgid "Euler2d"
 msgstr "Euler 2D"
@@ -2665,7 +3212,7 @@ msgstr "H
 msgid "Join Offset"
 msgstr "Décalage de jointure"
 
-#: hacks/config/extrusion.xml.h:8
+#: hacks/config/extrusion.xml.h:8 hacks/config/polytopes.xml.h:16
 msgid "Random Object"
 msgstr "Objet aléatoire"
 
@@ -2694,17 +3241,191 @@ msgstr "Utiliser les couleurs en aplat"
 msgid "Use Lighting"
 msgstr "Utiliser l'éclairage"
 
-#: hacks/config/fadeplot.xml.h:2
-msgid ""
-"Draws what looks like a waving ribbon following a sinusoidal path. Written "
-"by Bas van Gaalen and Charles Vidal."
-msgstr ""
-"Dessine une sorte de ruban ondulant suivant un chemin sinusoïdal. Écrit par "
-"Bas van Gaalen et Charles Vidal."
+#: hacks/config/fadeplot.xml.h:2
+msgid ""
+"Draws what looks like a waving ribbon following a sinusoidal path. Written "
+"by Bas van Gaalen and Charles Vidal."
+msgstr ""
+"Dessine une sorte de ruban ondulant suivant un chemin sinusoïdal. Écrit par "
+"Bas van Gaalen et Charles Vidal."
+
+#: hacks/config/fadeplot.xml.h:3
+msgid "FadePlot"
+msgstr "FadePlot"
+
+#: hacks/config/fireflies.xml.h:1
+msgid "10 times"
+msgstr "10 fois"
+
+#: hacks/config/fireflies.xml.h:2
+msgid ""
+"A bunch of fireflies chase a few baits around the screen, leaving colorful "
+"tails which get blown around by the wind. Written by Matt Perry. This "
+"program is not included with the XScreenSaver package, but if you don't have "
+"it already, you can find it at &lt;http://somewhere.fscked.org/fireflies/"
+"&gt;."
+msgstr ""
+
+#: hacks/config/fireflies.xml.h:3
+msgid "Add some fireflies"
+msgstr "Ajoute des lucioles"
+
+#: hacks/config/fireflies.xml.h:4
+msgid "Bait accel"
+msgstr "Accélération des proies"
+
+#: hacks/config/fireflies.xml.h:5
+msgid "Bait speed"
+msgstr "Vitesse des proies"
+
+#: hacks/config/fireflies.xml.h:6
+msgid "Color cycle speed"
+msgstr "Vitesse du changement de couleur"
+
+#: hacks/config/fireflies.xml.h:7
+msgid "Draw baits"
+msgstr "Dessiner des proies"
+
+#: hacks/config/fireflies.xml.h:8
+msgid "Faded colors"
+msgstr "Couleurs pastels"
+
+#: hacks/config/fireflies.xml.h:9
+msgid "Fast Forward speed"
+msgstr "Avance rapide"
+
+#: hacks/config/fireflies.xml.h:10
+msgid "Fireflies"
+msgstr "Lucioles"
+
+#: hacks/config/fireflies.xml.h:11
+msgid "Firefly accel"
+msgstr "Accélération des lucioles"
+
+#: hacks/config/fireflies.xml.h:12
+msgid "Firefly size"
+msgstr "Taille des lucioles"
+
+#: hacks/config/fireflies.xml.h:13
+msgid "Firefly speed"
+msgstr "Vitesse des lucioles"
+
+#: hacks/config/fireflies.xml.h:14
+msgid "Frames per sec"
+msgstr "Images par seconde (FPS)"
+
+#: hacks/config/fireflies.xml.h:15
+msgid "Glow factor"
+msgstr "Facteur d'éclat (glow)"
+
+#: hacks/config/fireflies.xml.h:16
+msgid "Half"
+msgstr "Moitié"
+
+#: hacks/config/fireflies.xml.h:17
+msgid "Huge"
+msgstr "Énorme"
+
+#: hacks/config/fireflies.xml.h:18 hacks/config/fluidballs.xml.h:10
+msgid "Hurricane"
+msgstr "Ouragan"
+
+#: hacks/config/fireflies.xml.h:19
+msgid "Invisible"
+msgstr "Invisible"
+
+#: hacks/config/fireflies.xml.h:20
+msgid "Kill some fireflies"
+msgstr "Tuer quelques lucioles"
+
+#: hacks/config/fireflies.xml.h:22
+msgid "Make all swarms do something"
+msgstr "Tous les essaims font quelque chose"
+
+#: hacks/config/fireflies.xml.h:23
+msgid "Matrix (pause and rotate)"
+msgstr "Matrice (pause et rotation)"
+
+#: hacks/config/fireflies.xml.h:24
+msgid "Maximum baits"
+msgstr "Nombre max de proies"
+
+#: hacks/config/fireflies.xml.h:25
+msgid "Maximum flies"
+msgstr "Nombre max de lucioles"
+
+#: hacks/config/fireflies.xml.h:26
+msgid "Merge two swarms"
+msgstr "Fusionne deux essaims"
+
+#: hacks/config/fireflies.xml.h:27
+msgid "Minimum baits"
+msgstr "Nombre mini de proies"
+
+#: hacks/config/fireflies.xml.h:28
+msgid "Minimum flies"
+msgstr "Nombre mini de lucioles"
+
+#: hacks/config/fireflies.xml.h:29
+msgid "Narrow"
+msgstr "Proche"
+
+#: hacks/config/fireflies.xml.h:30
+msgid "Never"
+msgstr "Jamais"
+
+#: hacks/config/fireflies.xml.h:31
+msgid "Normal swarm motion"
+msgstr "Mouvement normal des essaims"
+
+#: hacks/config/fireflies.xml.h:33
+msgid "Opaque"
+msgstr "Opaque"
+
+#: hacks/config/fireflies.xml.h:35
+msgid "Split a swarm"
+msgstr "Dédoubler un essaim"
+
+#: hacks/config/fireflies.xml.h:36 hacks/config/fluidballs.xml.h:21
+#: hacks/config/glforestfire.xml.h:16
+msgid "Still"
+msgstr "Tranquille"
+
+#: hacks/config/fireflies.xml.h:37
+msgid "Swarm bursts into rainbow               "
+msgstr "L'essaim éclate en arc-en-ciel"
+
+#: hacks/config/fireflies.xml.h:38
+msgid "Swarm comes to a halt"
+msgstr "L'essaim se fige"
+
+#: hacks/config/fireflies.xml.h:39
+msgid "Swarm does loops"
+msgstr "L'essaim fait des boucles"
+
+#: hacks/config/fireflies.xml.h:40
+msgid "Swarm hyperspeed"
+msgstr "Hypervitesse des essaims"
+
+#: hacks/config/fireflies.xml.h:41
+msgid "Swarm tails glow"
+msgstr "La queue des essaims luie"
+
+#: hacks/config/fireflies.xml.h:43
+msgid "Tiny"
+msgstr "Fin"
+
+#: hacks/config/fireflies.xml.h:44
+msgid "Wide"
+msgstr "Large"
+
+#: hacks/config/fireflies.xml.h:45 hacks/config/fluidballs.xml.h:23
+msgid "Wind"
+msgstr "Vent"
 
-#: hacks/config/fadeplot.xml.h:3
-msgid "FadePlot"
-msgstr "FadePlot"
+#: hacks/config/fireflies.xml.h:46
+msgid "Wind picks up"
+msgstr "Le vent reprend"
 
 #: hacks/config/flag.xml.h:1
 msgid "Bitmap for Flag"
@@ -2738,7 +3459,8 @@ msgstr ""
 msgid "0 Seconds"
 msgstr "0 seconde"
 
-#: hacks/config/flame.xml.h:2 hacks/config/maze.xml.h:2
+#: hacks/config/flame.xml.h:2 hacks/config/gleidescope.xml.h:1
+#: hacks/config/glslideshow.xml.h:2 hacks/config/maze.xml.h:2
 msgid "10 Seconds"
 msgstr "10 secondes"
 
@@ -2746,7 +3468,7 @@ msgstr "10 secondes"
 msgid "Another iterative fractal generator. Written by Scott Draves."
 msgstr "Un autre générateur fractal itératif. Écrit par Scott Draves."
 
-#: hacks/config/flame.xml.h:4
+#: hacks/config/flame.xml.h:4 hacks/config/jigglypuff.xml.h:4
 msgid "Complexity"
 msgstr "Complexité"
 
@@ -2758,6 +3480,20 @@ msgstr "Flamme"
 msgid "Number of Fractals"
 msgstr "Nombre de fractales"
 
+#: hacks/config/flipflop.xml.h:2
+msgid "FlipFlop"
+msgstr ""
+
+#: hacks/config/flipflop.xml.h:3
+msgid ""
+"Flipflop draws a grid of 3D colored tiles that change positions with each "
+"other. Written by Kevin Ogden."
+msgstr ""
+
+#: hacks/config/flipflop.xml.h:6
+msgid "Solid Tiles"
+msgstr "Tuiles pleines"
+
 #: hacks/config/flipscreen3d.xml.h:2
 msgid "Flipscreen3d"
 msgstr "Écran retourné 3D"
@@ -2809,39 +3545,28 @@ msgid "Zoom In and Out"
 msgstr "Zoom avant et arrière"
 
 #: hacks/config/fluidballs.xml.h:1
+msgid "      Freefall"
+msgstr "Chute libre"
+
+#: hacks/config/fluidballs.xml.h:2
 msgid "Ball Size"
 msgstr "Taille des balles"
 
-#: hacks/config/fluidballs.xml.h:5
+#: hacks/config/fluidballs.xml.h:4
+msgid "Clay"
+msgstr "Argile"
+
+#: hacks/config/fluidballs.xml.h:7
 msgid "FluidBalls"
 msgstr "Balles fluides"
 
-#: hacks/config/fluidballs.xml.h:6
-#, fuzzy
-msgid "Freefall"
-msgstr "Chute libre"
-
-#: hacks/config/fluidballs.xml.h:7 hacks/config/twang.xml.h:4
+#: hacks/config/fluidballs.xml.h:8 hacks/config/twang.xml.h:4
 msgid "Friction"
 msgstr "Friction"
 
-#: hacks/config/fluidballs.xml.h:8
-#, fuzzy
-msgid "Glass"
-msgstr "Classique"
-
-#: hacks/config/fluidballs.xml.h:9 hacks/config/qix.xml.h:9
-#: hacks/config/speedmine.xml.h:4
-msgid "Gravity"
-msgstr "Gravité"
-
-#: hacks/config/fluidballs.xml.h:10
-msgid "Hurricane"
-msgstr "Ouragan"
-
 #: hacks/config/fluidballs.xml.h:11
 msgid "Jupiter"
-msgstr "Jupiter"
+msgstr "Jupiterienne"
 
 #: hacks/config/fluidballs.xml.h:14
 msgid ""
@@ -2852,24 +3577,138 @@ msgid ""
 msgstr ""
 
 #: hacks/config/fluidballs.xml.h:15
-msgid "Sandpaper"
-msgstr "Papier abrasif"
+msgid "Rubber"
+msgstr "Caoutchouc"
 
 #: hacks/config/fluidballs.xml.h:16
 msgid "Shake Box"
 msgstr "Remuer la boîte"
 
-#: hacks/config/fluidballs.xml.h:21 hacks/config/glforestfire.xml.h:16
-msgid "Still"
-msgstr "Tranquille"
-
 #: hacks/config/fluidballs.xml.h:22
 msgid "Various Ball Sizes"
 msgstr "Taille des balles variée"
 
-#: hacks/config/fluidballs.xml.h:23
-msgid "Wind"
-msgstr "Vent"
+#: hacks/config/flurry.xml.h:1
+msgid "Binary"
+msgstr "Binaire"
+
+#: hacks/config/flurry.xml.h:2
+msgid "Classic"
+msgstr "Classique"
+
+#: hacks/config/flurry.xml.h:3
+msgid "Fire"
+msgstr "Feux"
+
+#: hacks/config/flurry.xml.h:4
+msgid "Flurry"
+msgstr "Bourrasque"
+
+#: hacks/config/flurry.xml.h:5
+msgid "Insane"
+msgstr "Folie"
+
+#: hacks/config/flurry.xml.h:6
+msgid "Psychedelic"
+msgstr "Psychédélique"
+
+#: hacks/config/flurry.xml.h:7
+msgid "RGB"
+msgstr "RVB"
+
+#: hacks/config/flurry.xml.h:8 hacks/config/fontglide.xml.h:12
+#: hacks/config/jigglypuff.xml.h:13 hacks/config/sballs.xml.h:10
+#: hacks/config/whirlygig.xml.h:12
+msgid "Random"
+msgstr "Aléatoire"
+
+#: hacks/config/flurry.xml.h:10
+msgid ""
+"This port of the OSX screensaver of the same name draws a colourful star"
+"(fish)like flurry of particles. xscreensaver port by Tobias Sargeant &lt;"
+"tobias.sargeant@bigpond.com&gt; Original Mac version by Calum Robinson &lt;"
+"calumr@mac.com&gt; http://homepage.mac.com/calumr"
+msgstr ""
+
+#: hacks/config/flurry.xml.h:11
+msgid "Water"
+msgstr "Eau"
+
+#: hacks/config/flyingtoasters.xml.h:1
+msgid ""
+"A fleet of 3d space-age jet-powered flying toasters (and toast!) Inspired by "
+"the ancient Berkeley Systems After Dark flying toasters. By Jamie Zawinski "
+"and Baconmonkey."
+msgstr ""
+
+#: hacks/config/flyingtoasters.xml.h:2
+msgid "Air Speed"
+msgstr "Vitesse de l'air"
+
+#: hacks/config/flyingtoasters.xml.h:4
+msgid "Chrome Toasters"
+msgstr "Grille-pains chromés"
+
+#: hacks/config/flyingtoasters.xml.h:6
+msgid "Flying Toasters"
+msgstr "Grille-pains volant"
+
+#: hacks/config/flyingtoasters.xml.h:7 hacks/config/glslideshow.xml.h:16
+#: hacks/config/jigglypuff.xml.h:12 hacks/config/juggle.xml.h:6
+#: hacks/config/pipes.xml.h:10
+msgid "None"
+msgstr "Aucun"
+
+#: hacks/config/flyingtoasters.xml.h:8
+msgid "Number of Slices"
+msgstr "Nombre de tranches"
+
+#: hacks/config/flyingtoasters.xml.h:9
+msgid "Number of Toasters"
+msgstr "Nombre de grille-pains"
+
+#: hacks/config/flyingtoasters.xml.h:12
+msgid "Solid Colors"
+msgstr "Couleurs uniformes"
+
+#: hacks/config/flyingtoasters.xml.h:13
+msgid "Swarm"
+msgstr "Essaim"
+
+#: hacks/config/fontglide.xml.h:2
+msgid "Brief"
+msgstr "Brève"
+
+#: hacks/config/fontglide.xml.h:5
+msgid "Font Border Thickness"
+msgstr "Épaisseur de la bordure de la police"
+
+#: hacks/config/fontglide.xml.h:6
+msgid "FontGlide"
+msgstr "Vol plané de texte"
+
+#: hacks/config/fontglide.xml.h:7
+msgid "Horizontally scrolling text"
+msgstr "Défilement horizontal du texte"
+
+#: hacks/config/fontglide.xml.h:10
+msgid "Pages of text"
+msgstr "Pages de texte"
+
+#: hacks/config/fontglide.xml.h:11
+msgid ""
+"Puts text on the screen using large characters that glide in from the edges, "
+"assemble, then disperse. Alternately, it can simply scroll whole sentences "
+"from right to left. By Jamie Zawinski."
+msgstr ""
+
+#: hacks/config/fontglide.xml.h:14
+msgid "Text Linger"
+msgstr "Rémanence du texte"
+
+#: hacks/config/fontglide.xml.h:16
+msgid "Vapor Trails"
+msgstr "Traînées de vapeur"
 
 #: hacks/config/forest.xml.h:2 hacks/config/glforestfire.xml.h:6
 msgid "Forest"
@@ -2889,9 +3728,10 @@ msgstr "Galaxie"
 
 #: hacks/config/galaxy.xml.h:9 hacks/config/lisa.xml.h:7
 #: hacks/config/lissie.xml.h:8 hacks/config/loop.xml.h:6
-#: hacks/config/penrose.xml.h:10 hacks/config/rotor.xml.h:10
-#: hacks/config/rubik.xml.h:8 hacks/config/sproingies.xml.h:5
-#: hacks/config/wander.xml.h:13 hacks/config/worm.xml.h:6
+#: hacks/config/penrose.xml.h:10 hacks/config/pong.xml.h:4
+#: hacks/config/rotor.xml.h:10 hacks/config/rubik.xml.h:8
+#: hacks/config/sproingies.xml.h:5 hacks/config/wander.xml.h:13
+#: hacks/config/worm.xml.h:6
 msgid "Size"
 msgstr "Taille"
 
@@ -2958,11 +3798,11 @@ msgstr "Densit
 msgid "Screen Image"
 msgstr "Image écran"
 
-#: hacks/config/gflux.xml.h:14 hacks/config/interference.xml.h:18
+#: hacks/config/gflux.xml.h:14 hacks/config/interference.xml.h:21
 msgid "Wave Speed"
-msgstr "Vitesse de vague"
+msgstr "Vitesse des vagues"
 
-#: hacks/config/gflux.xml.h:15
+#: hacks/config/gflux.xml.h:15 hacks/config/glmatrix.xml.h:20
 msgid "Waves"
 msgstr "Vagues"
 
@@ -2970,6 +3810,58 @@ msgstr "Vagues"
 msgid "Wire Mesh"
 msgstr "Grille en fil de fer"
 
+#: hacks/config/glblur.xml.h:1
+msgid "Blur Smoothness"
+msgstr "Douceur du flou"
+
+#: hacks/config/glblur.xml.h:5
+msgid "GLBlur"
+msgstr "Flou GL"
+
+#: hacks/config/glblur.xml.h:18
+msgid ""
+"This program draws a box and a few line segments, and generates a radial "
+"blur outward from it. This creates flowing field effects. This is done by "
+"rendering the scene into a small texture, then repeatedly rendering "
+"increasingly-enlarged and increasingly-transparent versions of that texture "
+"onto the frame buffer. As such, it's quite graphics intensive: don't bother "
+"trying to run this if you don't have hardware-accelerated OpenGL texture "
+"support. It will hurt your machine bad."
+msgstr ""
+
+#: hacks/config/gleidescope.xml.h:2 hacks/config/glslideshow.xml.h:6
+msgid "5 Minutes"
+msgstr "5 minutes"
+
+#: hacks/config/gleidescope.xml.h:3
+msgid "An OpenGL Kaleidescope. Written by andrew dean."
+msgstr "Un Kaleïdoscope OpenGL. Écrit par Andrew Dean."
+
+#: hacks/config/gleidescope.xml.h:4
+msgid "Gleidescope"
+msgstr "Kaleïdoscope GL"
+
+#: hacks/config/gleidescope.xml.h:5
+msgid "Image Duration"
+msgstr "Durée de l'image"
+
+#: hacks/config/gleidescope.xml.h:6
+msgid "Image file"
+msgstr "Fichier image"
+
+#: hacks/config/gleidescope.xml.h:8
+msgid "Move"
+msgstr "Déplacement"
+
+#: hacks/config/gleidescope.xml.h:11
+msgid "Size of tube"
+msgstr "Taille du tube"
+
+#: hacks/config/gleidescope.xml.h:13 hacks/config/hyperball.xml.h:16
+#: hacks/config/hypercube.xml.h:16 hacks/config/zoom.xml.h:8
+msgid "Zoom"
+msgstr "Zoom"
+
 #: hacks/config/glforestfire.xml.h:2
 msgid "Desert"
 msgstr "Désert"
@@ -2980,8 +3872,11 @@ msgid ""
 "filled with trees. Requires OpenGL, and a machine with fast hardware support "
 "for texture maps. Written by Eric Lassauge &lt;lassauge@mail.dotcom.fr&gt;."
 msgstr ""
+"Dessine une animation d'un pseudo-feu avec des triangles 3D dans un"
+" paysage arboré. Nécessite OpenGL et une machine avec un support matériel"
+" puissant pour les textures. Écrit par Eric Lassauge &lt;lassauge@mail.dotcom.fr&gt;."
 
-#: hacks/config/glforestfire.xml.h:5
+#: hacks/config/glforestfire.xml.h:5 hacks/config/glmatrix.xml.h:9
 msgid "Fog"
 msgstr "Brouillard"
 
@@ -3046,7 +3941,7 @@ msgstr "Dessiner en fil de fer"
 
 #: hacks/config/glmatrix.xml.h:6
 msgid "Draw Solid Boxes"
-msgstr "Dessiner sans texture" 
+msgstr "Dessiner sans texture"
 
 #: hacks/config/glmatrix.xml.h:7
 msgid ""
@@ -3104,14 +3999,62 @@ msgstr "Plan
 msgid "Image File"
 msgstr "Fichier image"
 
-#: hacks/config/glsnake.xml.h:1 hacks/config/lavalite.xml.h:1
-msgid "1"
-msgstr "1"
+#: hacks/config/glslideshow.xml.h:4 hacks/config/rd-bomb.xml.h:5
+#, no-c-format
+msgid "100%"
+msgstr "100%"
 
-#: hacks/config/glsnake.xml.h:2 hacks/config/penrose.xml.h:2
+#: hacks/config/glslideshow.xml.h:5 hacks/config/glsnake.xml.h:2
+#: hacks/config/penrose.xml.h:2
 msgid "30 Seconds"
 msgstr "30 secondes"
 
+#: hacks/config/glslideshow.xml.h:8
+#, no-c-format
+msgid "50%"
+msgstr "50 %"
+
+#: hacks/config/glslideshow.xml.h:9
+msgid "Always show at least this much of the image:"
+msgstr "Montre au moins ce % de l'image :"
+
+#: hacks/config/glslideshow.xml.h:10
+msgid "Crossfade Duration:"
+msgstr "Durée du fondu enchaîné :"
+
+#: hacks/config/glslideshow.xml.h:11
+msgid "Frame Rate:"
+msgstr "Trames par seconde :"
+
+#: hacks/config/glslideshow.xml.h:12
+msgid "GLSlideshow"
+msgstr "Diaporama GL"
+
+#: hacks/config/glslideshow.xml.h:14
+msgid ""
+"Loads a random sequence of images and smoothly scans and zooms around in "
+"each, fading from pan to pan. You can set the directory from which images "
+"are loaded on the \"Advanced\" tab. This program requires a good video card "
+"capable of supporting large textures. Written by Jamie Zawinski and Mike "
+"Oliphant."
+msgstr ""
+
+#: hacks/config/glslideshow.xml.h:17
+msgid "Pan/Zoom Duration:"
+msgstr "Durée panoramique/zoom :"
+
+#: hacks/config/glslideshow.xml.h:19
+msgid "Show Image Titles"
+msgstr "Montre le titre de l'image"
+
+#: hacks/config/glslideshow.xml.h:20
+msgid "Time until loading a new image:"
+msgstr "Durée avant chargement d'une nouvelle image :"
+
+#: hacks/config/glsnake.xml.h:1 hacks/config/lavalite.xml.h:1
+msgid "1"
+msgstr "1"
+
 #: hacks/config/glsnake.xml.h:3
 msgid ""
 "Draws a simulation of the Rubik's Snake puzzle. Written by Jamie Wilkinson, "
@@ -3130,7 +4073,7 @@ msgstr "
 
 #: hacks/config/glsnake.xml.h:8
 msgid "Packing"
-msgstr "En boule"
+msgstr "Emballage"
 
 #: hacks/config/glsnake.xml.h:9
 msgid "Scary Colors"
@@ -3138,7 +4081,7 @@ msgstr "Couleurs effrayantes"
 
 #: hacks/config/glsnake.xml.h:11
 msgid "Show Labels"
-msgstr "Afficher les étiquettes"
+msgstr "Afficher le nom"
 
 #: hacks/config/glsnake.xml.h:14
 msgid "Tight"
@@ -3269,6 +4212,50 @@ msgstr ""
 "Dessine des rectangles colorés et pointillés de manière aléatoire. Écrit par "
 "Jamie Zawinski."
 
+#: hacks/config/halftone.xml.h:1
+msgid "Delay (Large = low cpu load)"
+msgstr "Délai (élévé = peu de charge processeur)"
+
+#: hacks/config/halftone.xml.h:2
+msgid "Dot fill factor"
+msgstr "Facteur du remplissage par point"
+
+#: hacks/config/halftone.xml.h:3
+msgid "Dot size"
+msgstr "Taille des points"
+
+#: hacks/config/halftone.xml.h:4
+msgid ""
+"Draws the gravity force in each point on the screen seen through a halftone "
+"dot pattern. The gravity force is calculated from a set of moving mass "
+"points. View it from a distance for best effect. Written by Peter Jaric &lt;"
+"peter@jaric.org&gt;."
+msgstr ""
+
+#: hacks/config/halftone.xml.h:5
+msgid "Gravity points"
+msgstr "Gravité des points"
+
+#: hacks/config/halftone.xml.h:6
+msgid "Halftone"
+msgstr "Demi-teintes"
+
+#: hacks/config/halftone.xml.h:10
+msgid "Maximum mass"
+msgstr "Masse max"
+
+#: hacks/config/halftone.xml.h:11
+msgid "Maximum speed"
+msgstr "Vitesse max"
+
+#: hacks/config/halftone.xml.h:12
+msgid "Minimum mass"
+msgstr "Masse min"
+
+#: hacks/config/halftone.xml.h:13
+msgid "Minimum speed"
+msgstr "Vitesse min"
+
 #: hacks/config/halo.xml.h:1
 msgid "Animate Circles"
 msgstr "Cercles animés"
@@ -3281,10 +4268,6 @@ msgstr "Halo"
 msgid "Number of Circles"
 msgstr "Nombre de cercles"
 
-#: hacks/config/halo.xml.h:7 hacks/config/imsmap.xml.h:11
-msgid "Random Mode"
-msgstr "Mode aléatoire"
-
 #: hacks/config/halo.xml.h:8
 msgid "Seuss Mode"
 msgstr "Mode Seuss"
@@ -3378,7 +4361,9 @@ msgstr "Hyperballe"
 msgid ""
 "Hyperball is to hypercube as dodecahedron is to cube: this displays a 2D "
 "projection of the sequence of 3D objects which are the projections of the 4D "
-"analog to the dodecahedron. Written by Joe Keane."
+"analog to the dodecahedron. Technically, it is a \"120 cell polytope.\" "
+"Written by Joe Keane. See also the \"polytopes\" hack for a more general "
+"version of this using OpenGL."
 msgstr ""
 "L'hyperballe est à l'hypercube ce que le dodécaèdre est au cube : il affiche "
 "une projection en 2D de la séquence d'objets 3D qui sont les projections de "
@@ -3412,11 +4397,6 @@ msgstr "Rotation YZ"
 msgid "ZW Rotation"
 msgstr "Rotation ZW"
 
-#: hacks/config/hyperball.xml.h:16 hacks/config/hypercube.xml.h:16
-#: hacks/config/zoom.xml.h:8
-msgid "Zoom"
-msgstr "Zoom"
-
 #: hacks/config/hypercube.xml.h:4
 msgid "Hypercube"
 msgstr "Hypercube"
@@ -3429,7 +4409,9 @@ msgid ""
 "touching four others; a hypercube is composed of eight cubes, each touching "
 "six others. To make it easier to visualize the rotation, it uses a different "
 "color for the edges of each face. Don't think about it too long, or your "
-"brain will melt. Written by Joe Keane, Fritz Mueller, and Jamie Zawinski."
+"brain will melt. Written by Joe Keane, Fritz Mueller, and Jamie Zawinski. "
+"See also the \"polytopes\" hack for a more general version of this using "
+"OpenGL."
 msgstr ""
 "Affiche des projections 2D de la séquence d'objets 3D qui sont les "
 "projections de l'analogie 4D du cube : un carré est composé de quatre "
@@ -3440,6 +4422,99 @@ msgstr ""
 "face. N'y réfléchissez pas trop longtemps, votre cerveau pourrait fondre. "
 "Écrit par Joe Keane, Fritz Mueller et Jamie Zawinski."
 
+#: hacks/config/hypertorus.xml.h:1 hacks/config/polytopes.xml.h:1
+msgid "-4.0"
+msgstr ""
+
+#: hacks/config/hypertorus.xml.h:2 hacks/config/polytopes.xml.h:5
+msgid "4.0"
+msgstr ""
+
+#: hacks/config/hypertorus.xml.h:3
+msgid "4D Hypertorus"
+msgstr "Hypertore 4D"
+
+#: hacks/config/hypertorus.xml.h:4
+msgid "Color Wheel"
+msgstr "Roue des couleurs"
+
+#: hacks/config/hypertorus.xml.h:5 hacks/config/polytopes.xml.h:10
+msgid "Display Speed"
+msgstr "Vitesse d'affichage"
+
+#: hacks/config/hypertorus.xml.h:7 hacks/config/polytopes.xml.h:12
+msgid "Orthographic 3d"
+msgstr "Projection orthographique 3D"
+
+#: hacks/config/hypertorus.xml.h:8 hacks/config/polytopes.xml.h:13
+msgid "Orthographic 4d"
+msgstr "Projection orthographique 4D"
+
+#: hacks/config/hypertorus.xml.h:9 hacks/config/polytopes.xml.h:14
+msgid "Perspective 3d"
+msgstr "Perspective 3D"
+
+#: hacks/config/hypertorus.xml.h:10 hacks/config/polytopes.xml.h:15
+msgid "Perspective 4d"
+msgstr "Perspective 4D"
+
+#: hacks/config/hypertorus.xml.h:11
+msgid "See-Through Bands"
+msgstr "Bandes transparentes"
+
+#: hacks/config/hypertorus.xml.h:14
+msgid "Solid Object"
+msgstr "Objets solides"
+
+#: hacks/config/hypertorus.xml.h:15 hacks/config/mirrorblob.xml.h:17
+#: hacks/config/polytopes.xml.h:21 hacks/config/pulsar.xml.h:16
+msgid "Solid Surface"
+msgstr "Surface solide"
+
+#: hacks/config/hypertorus.xml.h:16
+msgid ""
+"This program shows a rotating Clifford Torus: a torus lying on the \"surface"
+"\" of a 4D hypersphere. Written by Carsten Steger, inspired by Thomas "
+"Banchoff's book \"Beyond the Third Dimension: Geometry, Computer Graphics, "
+"and Higher Dimensions\", Scientific American Library, 1990."
+msgstr ""
+
+#: hacks/config/hypertorus.xml.h:17 hacks/config/polytopes.xml.h:23
+msgid "Transparent Surface"
+msgstr "Surface transparente"
+
+#: hacks/config/hypertorus.xml.h:18
+msgid "Two-Sided"
+msgstr "2 faces"
+
+#: hacks/config/hypertorus.xml.h:19 hacks/config/polytopes.xml.h:24
+msgid "WX Rotation Speed"
+msgstr "Vitesse de rotation WX"
+
+#: hacks/config/hypertorus.xml.h:20 hacks/config/polytopes.xml.h:25
+msgid "WY Rotation Speed"
+msgstr "Vitesse de rotation WY"
+
+#: hacks/config/hypertorus.xml.h:21 hacks/config/polytopes.xml.h:26
+msgid "WZ Rotation Speed"
+msgstr "Vitesse de rotation WZ"
+
+#: hacks/config/hypertorus.xml.h:22 hacks/config/polytopes.xml.h:27
+msgid "Wireframe Mesh"
+msgstr "Fil de fer"
+
+#: hacks/config/hypertorus.xml.h:23 hacks/config/polytopes.xml.h:28
+msgid "XY Rotation Speed"
+msgstr "Vitesse de rotation XY"
+
+#: hacks/config/hypertorus.xml.h:24 hacks/config/polytopes.xml.h:29
+msgid "XZ Rotation Speed"
+msgstr "Vitesse de rotation XZ"
+
+#: hacks/config/hypertorus.xml.h:25 hacks/config/polytopes.xml.h:30
+msgid "YZ Rotation Speed"
+msgstr "Vitesse de rotation YZ"
+
 #: hacks/config/ifs.xml.h:2
 msgid "IFS"
 msgstr "IFS"
@@ -3494,10 +4569,18 @@ msgstr ""
 "ou des tomodensitogrammes. Écrit par Juergen Nickelsen et Jamie Zawinski."
 
 #: hacks/config/interference.xml.h:1
+msgid "0"
+msgstr "0°"
+
+#: hacks/config/interference.xml.h:2
+msgid "360"
+msgstr "360°"
+
+#: hacks/config/interference.xml.h:3
 msgid "Anim Speed"
 msgstr "Vitesse d'animation"
 
-#: hacks/config/interference.xml.h:2
+#: hacks/config/interference.xml.h:4
 msgid ""
 "Another color-field hack, this one works by computing decaying sinusoidal "
 "waves, and allowing them to interfere with each other as their origins move. "
@@ -3508,22 +4591,114 @@ msgstr ""
 "d'interagir à mesure du déplacement de leurs origines. Écrit par Hannu "
 "Mallat."
 
-#: hacks/config/interference.xml.h:7
+#: hacks/config/interference.xml.h:9
+msgid "Hue"
+msgstr "Teinte"
+
+#: hacks/config/interference.xml.h:10
 msgid "Interference"
 msgstr "Interférences"
 
-#: hacks/config/interference.xml.h:10 hacks/config/t3d.xml.h:9
+#: hacks/config/interference.xml.h:13 hacks/config/t3d.xml.h:9
 #: hacks/config/xearth.xml.h:11 hacks/config/zoom.xml.h:5
 msgid "Magnification"
 msgstr "Agrandissement"
 
-#: hacks/config/interference.xml.h:13
+#: hacks/config/interference.xml.h:16
 msgid "Number of Waves"
 msgstr "Nombre de vagues"
 
-#: hacks/config/interference.xml.h:17
+#: hacks/config/interference.xml.h:20
 msgid "Wave Size"
-msgstr "Taille de vague"
+msgstr "Taille des vagues"
+
+#: hacks/config/jigglypuff.xml.h:2
+msgid "Chrome"
+msgstr "Chrome"
+
+#: hacks/config/jigglypuff.xml.h:3
+msgid "Clown barf"
+msgstr "Clown retourné"
+
+#: hacks/config/jigglypuff.xml.h:5
+msgid "Cycle"
+msgstr "Cycles"
+
+#: hacks/config/jigglypuff.xml.h:7
+msgid "Flower box"
+msgstr "Boîte de fleurs"
+
+#: hacks/config/jigglypuff.xml.h:9
+msgid "Inertial damping"
+msgstr "Atténuation inertielle"
+
+#: hacks/config/jigglypuff.xml.h:10
+msgid "JigglyPuff"
+msgstr ""
+
+#: hacks/config/jigglypuff.xml.h:14
+msgid "Rotation speed"
+msgstr "Vitesse de rotation"
+
+#: hacks/config/jigglypuff.xml.h:17 hacks/config/sphere.xml.h:7
+msgid "Sphere"
+msgstr "Sphère"
+
+#: hacks/config/jigglypuff.xml.h:18
+msgid "Sphere strength"
+msgstr "Force des sphères"
+
+#: hacks/config/jigglypuff.xml.h:19
+msgid "Spookiness"
+msgstr ""
+
+#: hacks/config/jigglypuff.xml.h:20
+msgid "Spoooooky"
+msgstr ""
+
+#: hacks/config/jigglypuff.xml.h:21 hacks/config/sballs.xml.h:16
+msgid "Tetrahedron"
+msgstr "Tétraèdre"
+
+#: hacks/config/jigglypuff.xml.h:22
+msgid ""
+"This little gem does bad things with quasi-spherical objects. The gist of it "
+"is that you have what is, structurally, a tetrahedron with tesselated faces. "
+"the vertices on these faces have forces on them in the form of one "
+"proportional to their distance from the surface of a sphere, and one which "
+"is proportional to how far they differ from some ideal distance from their "
+"neighbors. They also have inertia. The forces and distance are parameters "
+"and there are also a couple of visual parameters. The resulting effect can "
+"range from a shape that does nothing, to a frenetic polygon storm. Somewhere "
+"in between there it usually manifests as a blob that jiggles in a kind of "
+"disturbing manner. woo. It doesn't matter, however. You should just pick "
+"'random'. It overrides all the other options, except for fps, delay and "
+"complexity. By Keith Macleod"
+msgstr ""
+
+#: hacks/config/jigglypuff.xml.h:23
+msgid "Vertex-vertex behavior"
+msgstr "Comportement vertex-vertex"
+
+#: hacks/config/jigglypuff.xml.h:24
+msgid "Vertex-vertex force"
+msgstr "Force vertex-vertex"
+
+#: hacks/config/jigglypuff.xml.h:26
+msgid "collapse"
+msgstr "effondrement"
+
+#: hacks/config/jigglypuff.xml.h:27
+msgid "expand"
+msgstr "expansion"
+
+#: hacks/config/jigglypuff.xml.h:28
+msgid "none"
+msgstr "aucune"
+
+#: hacks/config/jigglypuff.xml.h:29
+msgid "strong"
+msgstr "forte"
 
 #: hacks/config/jigsaw.xml.h:4
 msgid "Jigsaw"
@@ -3561,13 +4736,9 @@ msgstr "Dessine un bonhomme jongleur. 
 msgid "Juggle"
 msgstr "Jonglage"
 
-#: hacks/config/juggle.xml.h:6 hacks/config/pipes.xml.h:10
-msgid "None"
-msgstr "Aucun"
-
 #: hacks/config/julia.xml.h:3 hacks/config/rorschach.xml.h:4
 msgid "Iterations"
-msgstr "Itérations"
+msgstr "Itération"
 
 #: hacks/config/julia.xml.h:4
 msgid "Julia"
@@ -3618,6 +4789,24 @@ msgstr "Sym
 msgid "Trails"
 msgstr "Traînées"
 
+#: hacks/config/klein.xml.h:3
+msgid "Klein"
+msgstr "Bouteille de Klein"
+
+#: hacks/config/klein.xml.h:10
+msgid ""
+"This draws a visualization of a Klein bottle or some other interesting "
+"parametric surfaces. Written by Andrey Mirtchovski."
+msgstr ""
+
+#: hacks/config/klein.xml.h:11
+msgid "Use Randomized Surfaces and Primitives"
+msgstr "Utiliser des primitives et surfaces aléatoires"
+
+#: hacks/config/klein.xml.h:12
+msgid "Wander Around the Screen"
+msgstr "Déplacement sur l'écran"
+
 #: hacks/config/kumppa.xml.h:5
 msgid "Kumppa"
 msgstr "Kumppa"
@@ -3642,7 +4831,7 @@ msgid ""
 msgstr ""
 "Anime une simulation du cube de Lemarchand, qui se résout sans cesse. "
 "Nécessite OpenGL et une machine avec prise en charge matérielle rapide des "
-"mappes de texture. Attension : risque d'ouvrir des portes. Écrit par Jamie "
+"mappes de texture. Attention : risque d'ouvrir des portes. Écrit par Jamie "
 "Zawinski."
 
 #: hacks/config/lament.xml.h:3
@@ -3691,7 +4880,7 @@ msgstr ""
 
 #: hacks/config/lavalite.xml.h:9
 msgid "Faceted"
-msgstr "A facette"
+msgstr "A facettes"
 
 #: hacks/config/lavalite.xml.h:11
 msgid "Giant Lavalite"
@@ -3709,18 +4898,10 @@ msgstr "Maximum de blobs"
 msgid "Random Lamp Style"
 msgstr "Style de lampe aléatoire"
 
-#: hacks/config/lavalite.xml.h:17 hacks/config/spheremonics.xml.h:9
-msgid "Resolution"
-msgstr "Résolution"
-
 #: hacks/config/lavalite.xml.h:18
 msgid "Rocket Lavalite"
 msgstr "Lavalite roquette"
 
-#: hacks/config/lavalite.xml.h:27
-msgid "Smooth"
-msgstr "Lisse"
-
 #: hacks/config/lightning.xml.h:2
 msgid "Lightning"
 msgstr "Éclairs"
@@ -3884,6 +5065,98 @@ msgstr ""
 "fractal cubique analogue au tétraèdre de Sierpinski. Écrit par Jamie "
 "Zawinski."
 
+#: hacks/config/metaballs.xml.h:1
+msgid "Big"
+msgstr "Élevé"
+
+#: hacks/config/metaballs.xml.h:2
+msgid ""
+"Draws two dimensional metaballs: overlapping and merging balls with fuzzy "
+"edges. By W.P. van Paassen."
+msgstr ""
+
+#: hacks/config/metaballs.xml.h:7
+msgid "MetaBall Movement"
+msgstr "Mouvement des méta-balles"
+
+#: hacks/config/metaballs.xml.h:8
+msgid "MetaBall Radius"
+msgstr "Rayon des méta-balles"
+
+#: hacks/config/metaballs.xml.h:9
+msgid "MetaBalls"
+msgstr "Méta-balles"
+
+#: hacks/config/metaballs.xml.h:11
+msgid "Number of MetaBalls"
+msgstr "Nombre de méta-balles"
+
+#: hacks/config/mirrorblob.xml.h:1
+msgid "Blobby"
+msgstr ""
+
+#: hacks/config/mirrorblob.xml.h:2 hacks/config/nerverot.xml.h:2
+msgid "Calm"
+msgstr "Calme"
+
+#: hacks/config/mirrorblob.xml.h:3
+msgid ""
+"Draws a wobbly blob that distorts the image behind it. Requires OpenGL "
+"hardware acceleration for nice animation. Written by Jon Dowdall."
+msgstr ""
+
+#: hacks/config/mirrorblob.xml.h:4
+msgid "Enable Background Image"
+msgstr "Autoriser une image d'arrière-plan"
+
+#: hacks/config/mirrorblob.xml.h:5
+msgid "Enable Colouring"
+msgstr "Autoriser la colorisation"
+
+#: hacks/config/mirrorblob.xml.h:6
+msgid "Enable Reflected Image"
+msgstr "Autoriser l'image réfléchie"
+
+#: hacks/config/mirrorblob.xml.h:7
+msgid "Enable Walls"
+msgstr "Autoriser les murs"
+
+#: hacks/config/mirrorblob.xml.h:8
+msgid "Fade Speed"
+msgstr "Vitesse du fondu"
+
+#: hacks/config/mirrorblob.xml.h:10
+msgid "Field Points"
+msgstr "Points"
+
+#: hacks/config/mirrorblob.xml.h:11
+msgid "Frames Between Images"
+msgstr "Trames entre chaque image"
+
+#: hacks/config/mirrorblob.xml.h:12
+msgid "Freaky"
+msgstr ""
+
+#: hacks/config/mirrorblob.xml.h:13
+msgid "MirrorBlob"
+msgstr ""
+
+#: hacks/config/mirrorblob.xml.h:14
+msgid "Offset Texture Coordinates"
+msgstr "Offset des coordonnées de la texture"
+
+#: hacks/config/mirrorblob.xml.h:19
+msgid "Very Freaky"
+msgstr ""
+
+#: hacks/config/mirrorblob.xml.h:21
+msgid "X Resolution"
+msgstr "Résolution X"
+
+#: hacks/config/mirrorblob.xml.h:22
+msgid "Y Resolution"
+msgstr "Résolution Y"
+
 #: hacks/config/moebius.xml.h:1
 msgid ""
 "Another M. C. Escher hack by Marcelo Vianna, this one draws ``Moebius Strip "
@@ -3970,7 +5243,7 @@ msgstr "Dessiner des atomes"
 
 #: hacks/config/molecule.xml.h:7 hacks/config/spheremonics.xml.h:2
 msgid "Draw Bounding Box"
-msgstr "Dessiner un cadre d'objet"
+msgstr "Dessiner le cadre englobant"
 
 #: hacks/config/molecule.xml.h:8
 msgid ""
@@ -3984,7 +5257,7 @@ msgstr ""
 
 #: hacks/config/molecule.xml.h:11
 msgid "Label Atoms"
-msgstr "Étiqueter les atomes"
+msgstr "Affichage du nom des atomes"
 
 #: hacks/config/molecule.xml.h:12
 msgid "Molecule"
@@ -4043,13 +5316,9 @@ msgstr "XOR"
 msgid "Blot Count"
 msgstr "Nombre de traces"
 
-#: hacks/config/nerverot.xml.h:2
-msgid "Calm"
-msgstr "Calme"
-
 #: hacks/config/nerverot.xml.h:3
 msgid "Changes"
-msgstr "Changements"
+msgstr "Changement"
 
 #: hacks/config/nerverot.xml.h:4
 msgid "Colors"
@@ -4057,7 +5326,7 @@ msgstr "Couleurs"
 
 #: hacks/config/nerverot.xml.h:5
 msgid "Crunchiness"
-msgstr "Croquant"
+msgstr ""
 
 #: hacks/config/nerverot.xml.h:7
 msgid ""
@@ -4115,11 +5384,6 @@ msgstr "Nez"
 msgid "Text File"
 msgstr "Fichier texte"
 
-#: hacks/config/noseguy.xml.h:7 hacks/config/phosphor.xml.h:8
-#: hacks/config/starwars.xml.h:17
-msgid "Text Program"
-msgstr "Programme texte"
-
 #: hacks/config/noseguy.xml.h:8
 msgid "Use Text Below"
 msgstr "Utiliser le texte ci-dessous"
@@ -4295,6 +5559,28 @@ msgstr "Phosphore"
 msgid "Scale"
 msgstr "Échelle"
 
+#: hacks/config/piecewise.xml.h:1
+msgid "Color shifting speed"
+msgstr "Vitesse du changement de couleur"
+
+#: hacks/config/piecewise.xml.h:6
+msgid "Maximum radius"
+msgstr "Rayon max"
+
+#: hacks/config/piecewise.xml.h:7
+msgid "Minimum radius"
+msgstr "Rayon min"
+
+#: hacks/config/piecewise.xml.h:8
+msgid "Piecewise"
+msgstr ""
+
+#: hacks/config/piecewise.xml.h:12
+msgid ""
+"This draws a bunch of moving circles which switch from visibility to "
+"invisibility at intersection points. Written by Geoffrey Irving."
+msgstr ""
+
 #: hacks/config/pipes.xml.h:1
 msgid "Allow Tight Turns"
 msgstr "Autoriser des virages serrés"
@@ -4325,7 +5611,7 @@ msgstr ""
 
 #: hacks/config/pipes.xml.h:9
 msgid "Lots"
-msgstr "Lots"
+msgstr "Beaucoup"
 
 #: hacks/config/pipes.xml.h:11
 msgid "Number of Pipe Systems"
@@ -4359,9 +5645,93 @@ msgstr ""
 "Tente sans cesse de remplir entièrement un rectangle à l'aide de pièces de "
 "puzzle de formes irrégulières. Écrit par Stephen Montgomery-Smith."
 
+#: hacks/config/polytopes.xml.h:2
+msgid "120-Cell"
+msgstr "120 cellules"
+
+#: hacks/config/polytopes.xml.h:3
+msgid "16-Cell (Hyper-Octahedron)"
+msgstr "16 cellules (Hyper-Octahèdre)"
+
+#: hacks/config/polytopes.xml.h:4
+msgid "24-Cell"
+msgstr "24 cellules"
+
+#: hacks/config/polytopes.xml.h:6
+msgid "5-Cell (Hyper-Tetrahedron)"
+msgstr "5 cellules (Hyper-Tétrahèdre)"
+
+#: hacks/config/polytopes.xml.h:7
+msgid "600-Cell"
+msgstr "600 cellules"
+
+#: hacks/config/polytopes.xml.h:8
+msgid "8-Cell (Hypercube / Tesseract)"
+msgstr "8 cellules (Hypercube / Tesseract)"
+
+#: hacks/config/polytopes.xml.h:9
+msgid "Colors By 4D Depth"
+msgstr "Couleur en profondeur 4D"
+
+#: hacks/config/polytopes.xml.h:17
+msgid "Regular 4D Polytopes"
+msgstr "Polytupes 4D réguliers"
+
+#: hacks/config/polytopes.xml.h:19
+msgid "Single Color"
+msgstr "Couleur unique"
+
+#: hacks/config/polytopes.xml.h:22
+msgid ""
+"This program shows one of the six regular 4D polytopes rotating in 4D. "
+"Written by Carsten Steger, inspired by H.S.M Coxeter's book \"Regular "
+"Polytopes\", 3rd Edition, Dover Publications, Inc., 1973, and Thomas "
+"Banchoff's book \"Beyond the Third Dimension: Geometry, Computer Graphics, "
+"and Higher Dimensions\", Scientific American Library, 1990."
+msgstr ""
+
+#: hacks/config/pong.xml.h:1
+msgid ""
+"Displays a game of pong. It doesn't keep score because they are not suppose "
+"to miss. Written by Jeremy English."
+msgstr ""
+
+#: hacks/config/pong.xml.h:3
+msgid "Pong"
+msgstr "Pong"
+
+#: hacks/config/popsquares.xml.h:1
+msgid "Border"
+msgstr "Bordure"
+
+#: hacks/config/popsquares.xml.h:2
+msgid "End color"
+msgstr "Couleur de fin"
+
+#: hacks/config/popsquares.xml.h:7
+msgid "Start color"
+msgstr "Couleur de début"
+
+#: hacks/config/popsquares.xml.h:8
+msgid "Subdivision"
+msgstr "Sub-division"
+
+#: hacks/config/popsquares.xml.h:9
+msgid ""
+"This draws a pop-art-ish looking grid of pulsing colors. By Levi Burton."
+msgstr ""
+
+#: hacks/config/popsquares.xml.h:10
+msgid "Twitch"
+msgstr "Mouvement compulsif"
+
+#: hacks/config/popsquares.xml.h:11
+msgid "popsquares"
+msgstr "Carrés pop-art"
+
 #: hacks/config/pulsar.xml.h:1
 msgid "Anti-alias Lines"
-msgstr "Lignes anti-alias"
+msgstr "Lignes anti-aliasées"
 
 #: hacks/config/pulsar.xml.h:3
 msgid ""
@@ -4422,10 +5792,6 @@ msgstr "Production d'explosions"
 msgid "Launch Frequency"
 msgstr "Fréquence de lancement"
 
-#: hacks/config/pyro.xml.h:8
-msgid "Often"
-msgstr "Souvent"
-
 #: hacks/config/pyro.xml.h:9
 msgid "Particle Density"
 msgstr "Densité des particules"
@@ -4510,11 +5876,6 @@ msgstr "/"
 msgid "1%"
 msgstr "1%"
 
-#: hacks/config/rd-bomb.xml.h:5
-#, no-c-format
-msgid "100%"
-msgstr "100%"
-
 #: hacks/config/rd-bomb.xml.h:7
 msgid ""
 "Another variation of the `Bomb' program by Scott Draves. This draws a grid "
@@ -4613,7 +5974,7 @@ msgstr "Rotation"
 
 #: hacks/config/rocks.xml.h:10
 msgid "Steering"
-msgstr "Direction"
+msgstr "Orientation"
 
 #: hacks/config/rocks.xml.h:11
 msgid ""
@@ -4727,6 +6088,9 @@ msgid ""
 "OpenGL, and a machine with fast hardware support for texture maps. Written "
 "by Eric Lassauge &lt;lassauge@mail.dotcom.fr&gt;."
 msgstr ""
+"Dessine une animation de balles texturées qui tournent comme des folles en GL."
+" Nécessite OpenGL et une machine avec un support matériel"
+" puissant pour les textures. Écrit par Eric Lassauge &lt;lassauge@mail.dotcom.fr&gt;."
 
 #: hacks/config/sballs.xml.h:5
 msgid "Icosahedron"
@@ -4744,10 +6108,6 @@ msgstr "Plan"
 msgid "Pyramid"
 msgstr "Pyramide"
 
-#: hacks/config/sballs.xml.h:10
-msgid "Random"
-msgstr "Aléatoire"
-
 #: hacks/config/sballs.xml.h:11
 msgid "Sballs"
 msgstr "Sballs"
@@ -4756,17 +6116,13 @@ msgstr "Sballs"
 msgid "Star"
 msgstr "Étoile"
 
-#: hacks/config/sballs.xml.h:16
-msgid "Tetrahedron"
-msgstr "Tétraèdre"
-
 #: hacks/config/shadebobs.xml.h:7
 msgid "ShadeBobs"
 msgstr "ShadeBobs"
 
 #: hacks/config/shadebobs.xml.h:11
 msgid ""
-"This draws smoothly-shaded oscilating oval patterns, that look something "
+"This draws smoothly-shaded oscillating oval patterns, that look something "
 "like vapor trails or neon tubes. Written by Shane Smit."
 msgstr ""
 "Dessine des formes ovoïdes oscillantes et d'aspect lisse, qui ressemblent un "
@@ -4850,7 +6206,7 @@ msgstr "Sous-r
 
 #: hacks/config/sonar.xml.h:2
 msgid "Simulation Team Members"
-msgstr "Membres de l'équipe de simulation"
+msgstr "Membres de l'équipe simulation"
 
 #: hacks/config/sonar.xml.h:3
 msgid "Sonar"
@@ -4939,10 +6295,6 @@ msgstr ""
 "ombrées en plusieurs couleurs. Son arbre généalogique remonte à Tom Duff en "
 "1982."
 
-#: hacks/config/sphere.xml.h:7
-msgid "Sphere"
-msgstr "Sphère"
-
 #: hacks/config/sphereEversion.xml.h:1
 msgid "SphereEversion"
 msgstr "SphereEversion"
@@ -4960,7 +6312,7 @@ msgstr ""
 
 #: hacks/config/spheremonics.xml.h:20
 msgid "Smoothed Lines"
-msgstr ""
+msgstr "Lignes lissées"
 
 #: hacks/config/spheremonics.xml.h:23
 msgid "Spheremonics"
@@ -4976,7 +6328,7 @@ msgstr ""
 
 #: hacks/config/spiral.xml.h:2 hacks/config/superquadrics.xml.h:2
 msgid "Cycles"
-msgstr "Cycles"
+msgstr "Fréquence des cycles"
 
 #: hacks/config/spiral.xml.h:7
 msgid ""
@@ -4992,8 +6344,8 @@ msgstr "Spirale"
 
 #: hacks/config/spotlight.xml.h:1
 msgid ""
-"Draws a spotlight scanning across a black screen, illumnating the underlying "
-"desktop when it passes. Written by Rick Schultz."
+"Draws a spotlight scanning across a black screen, illuminating the "
+"underlying desktop when it passes. Written by Rick Schultz."
 msgstr ""
 "Trace un faisceau lumineux qui parcourt un écran noir et illumine le bureau "
 "sous-jacent. Écrit par Rick Schultz."
@@ -5030,7 +6382,7 @@ msgstr "Gauche"
 
 #: hacks/config/squiral.xml.h:11 hacks/config/twang.xml.h:8
 msgid "Randomness"
-msgstr "Aléatoire"
+msgstr "Caractère aléatoire"
 
 #: hacks/config/squiral.xml.h:12
 msgid "Right"
@@ -5097,7 +6449,7 @@ msgstr ""
 
 #: hacks/config/starwars.xml.h:2
 msgid "Anti-aliased Lines"
-msgstr "Lignes anti-alias"
+msgstr "Lignes anti-aliassées"
 
 #: hacks/config/starwars.xml.h:3
 msgid "Centered Text"
@@ -5170,15 +6522,11 @@ msgstr ""
 msgid "StonerView"
 msgstr "Spirale psyché"
 
-#: hacks/config/strange.xml.h:1
-msgid "Curviness"
-msgstr "Courbure"
-
-#: hacks/config/strange.xml.h:9
+#: hacks/config/strange.xml.h:6
 msgid "Strange"
 msgstr "Étrange"
 
-#: hacks/config/strange.xml.h:10
+#: hacks/config/strange.xml.h:7
 msgid ""
 "This draws strange attractors: it's a colorful, unpredictably-animating "
 "field of dots that swoops and twists around. The motion is very nice. "
@@ -5188,7 +6536,7 @@ msgstr ""
 "colorés qui tournent et se tortillent de manière imprévisible. Le mouvement "
 "est très beau. Écrit par Massimino Pascal."
 
-#: hacks/config/superquadrics.xml.h:2
+#: hacks/config/superquadrics.xml.h:3
 msgid ""
 "Ed Mackey reports that he wrote the first version of this program in BASIC "
 "on a Commodore 64 in 1987, as a 320x200 black and white wireframe. Now it is "
@@ -5199,7 +6547,7 @@ msgstr ""
 "320x200 noir et blanc. Il est désormais en GL et présente des réflexions "
 "spéculaires."
 
-#: hacks/config/superquadrics.xml.h:10
+#: hacks/config/superquadrics.xml.h:11
 msgid "Superquadrics"
 msgstr "Superquadriques"
 
@@ -5224,7 +6572,7 @@ msgstr "0
 
 #: hacks/config/t3d.xml.h:2
 msgid "5 Minute Tick Marks"
-msgstr "Marques toutes les 5 minutes"
+msgstr "Marque toutes les 5 minutes"
 
 #: hacks/config/t3d.xml.h:3
 msgid "90 deg"
@@ -5240,7 +6588,7 @@ msgstr "Cycle des secondes"
 
 #: hacks/config/t3d.xml.h:10
 msgid "Minute Tick Marks"
-msgstr "Marques toutes les minutes"
+msgstr "Marque toutes les minutes"
 
 #: hacks/config/t3d.xml.h:12
 msgid "Smaller"
@@ -5457,18 +6805,62 @@ msgid "Amplitude"
 msgstr "Amplitude"
 
 #: hacks/config/whirlygig.xml.h:2
+msgid "Circle"
+msgstr "Cercle"
+
+#: hacks/config/whirlygig.xml.h:3
 msgid "Draws zooming chains of sinusoidal spots. Written by Ashton Trey Belew."
 msgstr ""
 "Dessine des chaînes de taches sinusoïdales. Écrit par Ashton Trey Belew."
 
+#: hacks/config/whirlygig.xml.h:4
+msgid "Explain modes"
+msgstr "Expliquer les modes"
+
 #: hacks/config/whirlygig.xml.h:5
+msgid "Fun"
+msgstr ""
+
+#: hacks/config/whirlygig.xml.h:6
+msgid "Funky"
+msgstr ""
+
+#: hacks/config/whirlygig.xml.h:7
+msgid "Innie"
+msgstr ""
+
+#: hacks/config/whirlygig.xml.h:8
+msgid "Leave a trail"
+msgstr "Laisser des traînées"
+
+#: hacks/config/whirlygig.xml.h:9
+msgid "Linear"
+msgstr "Linéaire"
+
+#: hacks/config/whirlygig.xml.h:11
+msgid "Lissajous"
+msgstr "Figures Lissojous"
+
+#: hacks/config/whirlygig.xml.h:15
+msgid "Test"
+msgstr "Test"
+
+#: hacks/config/whirlygig.xml.h:16
+msgid "Use Double Buffering"
+msgstr "Double tampon"
+
+#: hacks/config/whirlygig.xml.h:17
 msgid "Whirlies"
 msgstr "Tourbillons"
 
-#: hacks/config/whirlygig.xml.h:6
+#: hacks/config/whirlygig.xml.h:18
 msgid "WhirlyGig"
 msgstr "WhirlyGig"
 
+#: hacks/config/whirlygig.xml.h:19
+msgid "Wrap the screen"
+msgstr "Faire le tour de l'écran"
+
 #: hacks/config/worm.xml.h:1
 msgid ""
 "An ancient xlock hack that draws multicolored worms that crawl around the "
@@ -5478,6 +6870,19 @@ msgstr ""
 "Ancien hack xlock qui dessine des vers multicolores rampant sur l'écran. "
 "Écrit par Brad Taylor, Dave Lemke, Boris Putanec et Henrik Theiling."
 
+#: hacks/config/xanalogtv.xml.h:1
+msgid "XAnalogTV"
+msgstr ""
+
+#: hacks/config/xanalogtv.xml.h:2
+msgid ""
+"XAnalogTV shows a detailed simulation of an old TV set showing various test "
+"patters, with various picture artifacts like snow, bloom, distortion, "
+"ghosting, and hash noise. It also simulates the TV warming up. It will cycle "
+"through 12 channels, some with images you give it, and some with color bars "
+"or nothing but static. By Trevor Blackwell."
+msgstr ""
+
 #: hacks/config/xaos.xml.h:1
 msgid "XaoS"
 msgstr "XaoS"
@@ -5510,7 +6915,7 @@ msgstr "Afficher les secondes"
 msgid "Huge Font"
 msgstr "Très grande police"
 
-#: hacks/config/xdaliclock.xml.h:6 hacks/config/xmatrix.xml.h:9
+#: hacks/config/xdaliclock.xml.h:6 hacks/config/xmatrix.xml.h:10
 msgid "Large Font"
 msgstr "Grande police"
 
@@ -5697,17 +7102,13 @@ msgstr ""
 msgid "Xlyap"
 msgstr "Xlyap"
 
-#: hacks/config/xmatrix.xml.h:1
+#: hacks/config/xmatrix.xml.h:3
 msgid ""
-"A rendition of the text scrolls seen in the movie ``The Matrix.'' Written by "
-"Jamie Zawinski."
+"Draws dropping characters similar to what is seen on the computer monitors "
+"in \"The Matrix\". See also \"glmatrix\" for a 3D rendering of the similar "
+"effect that appeared in the title sequence of the movie. Written by Jamie "
+"Zawinski."
 msgstr ""
-"Reproduction du texte qui défile à l'écran au début du film «Matrix». Écrit "
-"par Jamie Zawinski."
-
-#: hacks/config/xmatrix.xml.h:2
-msgid "Binary Encoding"
-msgstr "Encodage binaire"
 
 #: hacks/config/xmatrix.xml.h:4
 msgid "Expansion Algorithm"
@@ -5717,35 +7118,27 @@ msgstr "Algorithme d'extension"
 msgid "Full"
 msgstr "Complet"
 
-#: hacks/config/xmatrix.xml.h:7
-msgid "Genetic Encoding"
-msgstr "Encodage génétique"
-
-#: hacks/config/xmatrix.xml.h:8
-msgid "Hexadecimal Encoding"
-msgstr "Encodage hexadécimal"
-
-#: hacks/config/xmatrix.xml.h:10
-msgid "Matrix Encoding"
-msgstr "Encodage Matrix"
+#: hacks/config/xmatrix.xml.h:9
+msgid "Knock Knock"
+msgstr "Toc toc"
 
-#: hacks/config/xmatrix.xml.h:11
+#: hacks/config/xmatrix.xml.h:12
 msgid "Phone Number"
 msgstr "Numéro de téléphone"
 
-#: hacks/config/xmatrix.xml.h:12
+#: hacks/config/xmatrix.xml.h:13
 msgid "Run Trace Program"
 msgstr "Exécuter le programme de suivi"
 
-#: hacks/config/xmatrix.xml.h:13
+#: hacks/config/xmatrix.xml.h:14
 msgid "Slider Algorithm"
 msgstr "Algorithme de glissement"
 
-#: hacks/config/xmatrix.xml.h:18
+#: hacks/config/xmatrix.xml.h:19
 msgid "Synergistic Algorithm"
 msgstr "Algorithme synergique"
 
-#: hacks/config/xmatrix.xml.h:19
+#: hacks/config/xmatrix.xml.h:20
 msgid "Xmatrix"
 msgstr "Xmatrix"
 
@@ -5858,504 +7251,3 @@ msgstr ""
 "Zoome sur une partie de l'écran et se déplace. Avec l'option '-lenses', le "
 "résultat ressemble à la superposition de lentilles plutôt qu'à un simple "
 "zoom. Érit par James Macnicol."
-
-#~ msgid "reason: %s\n"
-#~ msgstr "Raison: %s\n"
-
-#~ msgid "Not"
-#~ msgstr "Non"
-
-#~ msgid "Installed"
-#~ msgstr "Installé"
-
-#~ msgid "Screensaver Preferences"
-#~ msgstr "Préférences Économiseur d'écran"
-
-#~ msgid "Change screensaver properties"
-#~ msgstr "Changer les propriétés de l'économiseur d'écran"
-
-#~ msgid "How long after the screen blanks until a password will be required."
-#~ msgstr "Durée entre le verrouillage et la nécessité d'un mot de passe"
-
-#~ msgid "How long before the screensaver activates."
-#~ msgstr "Combien de temps avant que l'économiseurs s'active."
-
-#~ msgid ""
-#~ "How long each display mode should run before choosing a new one (in "
-#~ "Random mode.)"
-#~ msgstr "Combien de temps avant le changement de mode (en mode Aléatoire)"
-
-#~ msgid "How long until the monitor goes completely black."
-#~ msgstr "Durée avant que le moniteur passe complètement au noir."
-
-#~ msgid ""
-#~ "Not\n"
-#~ "Installed"
-#~ msgstr ""
-#~ "Non\n"
-#~ "Installé"
-
-#~ 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é à utiliser des "
-#~ "images capturées par l'entrée vidéo du système (si il y en a une)."
-
-#~ msgid "not installed"
-#~ msgstr "non installé"
-
-#~ msgid "Rarely"
-#~ msgstr "Rarement"
-
-#~ msgid "Turn speed"
-#~ msgstr "Vitesse de rotation"
-
-#~ msgid "Withdraw freqency"
-#~ msgstr "Fréquence de retrait"
-
-#~ msgid "Draw Eyes"
-#~ msgstr "Dessiner les yeux"
-
-#~ msgid "Atunnel"
-#~ msgstr "Tunnel GL"
-
-#~ msgid "Use light"
-#~ msgstr "Utiliser l'éclairage"
-
-#~ msgid "Barcode"
-#~ msgstr "Code barre"
-
-#~ msgid "Barcode Clock (24 Hour)"
-#~ msgstr "Horloge code barre (24 Heures)"
-
-#~ msgid "Barcode Clock (AM/PM)"
-#~ msgstr "Horloge code barre (12 Heures)"
-
-#~ msgid "Scrolling Barcodes"
-#~ msgstr "Codes barre déroulants"
-
-#~ msgid "BlockTube"
-#~ msgstr "Tube de blocs"
-
-#~ msgid "Color Change Time"
-#~ msgstr "Durée de changement de couleur"
-
-#~ msgid "Color Hold Time"
-#~ msgstr "Durée de rétention de couleur"
-
-#~ msgid "Reflective Blocks"
-#~ msgstr "Blocs réfléchissants"
-
-#~ msgid "Solid Blocks"
-#~ msgstr "Blocs uniforme"
-
-#~ msgid "Beefy Cow"
-#~ msgstr "Vache normande"
-
-#~ msgid "Bounce Speed"
-#~ msgstr "Vitesse de rebond"
-
-#~ msgid "BouncingCow"
-#~ msgstr "Vache bondissante"
-
-#~ msgid "Herd"
-#~ msgstr "Troupeau"
-
-#~ msgid "Moo"
-#~ msgstr "Meuh"
-
-#~ msgid "Number of Cows"
-#~ msgstr "Nombre de vaches"
-
-#~ msgid "Wireframe Cow"
-#~ msgstr "Vache fil de fer"
-
-#~ msgid "Apple II"
-#~ msgstr "Apple II"
-
-#~ msgid "HPUX"
-#~ msgstr "HPUX"
-
-#~ msgid "Linux"
-#~ msgstr "Linux"
-
-#~ msgid "MacOS X"
-#~ msgstr "MacOS X"
-
-#~ msgid "OS/390"
-#~ msgstr "OS/390"
-
-#~ msgid "Windows 3.1"
-#~ msgstr "Windows 3.1"
-
-#~ msgid "Initial Density"
-#~ msgstr "Densité initiale"
-
-#~ msgid "Max Age"
-#~ msgstr "Age max."
-
-#~ msgid "Old"
-#~ msgstr "Vieux"
-
-#~ msgid "Young"
-#~ msgstr "Jeune"
-
-#~ msgid "CubeStorm"
-#~ msgstr "Tempète de cubes"
-
-#~ msgid "Motion Speed"
-#~ msgstr "Vitesse de déplacement"
-
-#~ msgid "Number of Cubes"
-#~ msgstr "Nombre de cubes"
-
-#~ msgid "Strut Thickness"
-#~ msgstr "Épaisseur"
-
-#~ msgid "Frame Rate"
-#~ msgstr "Vitesse"
-
-#~ msgid "Hide Sheep"
-#~ msgstr "Cache le mouton"
-
-#~ msgid "Megabytes of Local Sheep Storage"
-#~ msgstr "Mégaoctet de mémoire pour le mouton"
-
-#~ msgid "Nickname"
-#~ msgstr "Alias"
-
-#~ msgid "Repititions of each Sheep"
-#~ msgstr "Répétition de chaque mouton"
-
-#~ msgid "Audi Quattro (5 cylinders)"
-#~ msgstr "Audi Quattro (5 cylindres)"
-
-#~ msgid "BMW M3 (4 cylinders)"
-#~ msgstr "BMW M3 (4 cylindres)"
-
-#~ msgid "BMW M5 (6 cylinders)"
-#~ msgstr "BMW M5 (6 cylindres)"
-
-#~ msgid "Corvette Z06 (8 cylinders, V)"
-#~ msgstr "Corvette Z06 (8 cylindres en V)"
-
-#~ msgid "Dodge Viper (10 cylinders, V)"
-#~ msgstr "Dodge Viper (10 cylindres en V)"
-
-#~ msgid "Honda Insight (3 cylinders)"
-#~ msgstr "Honda Insight (3 cylindres)"
-
-#~ msgid "Jaguar XKE (12 cylinders, V)"
-#~ msgstr "Jaguar XKE (12 cylindres en V)"
-
-#~ msgid "Porsche 911 (6 cylinders, flat)"
-#~ msgstr "Porsche 911 (6 cylindres à plat)"
-
-#~ msgid "Random Engine"
-#~ msgstr "Engin aléatoire"
-
-#~ msgid "Show Engine Name"
-#~ msgstr "Montre le nom de l'engin"
-
-#~ msgid "Subaru XT (6 cylinders, V)"
-#~ msgstr "Subaru XT (6 cylindres en V)"
-
-#~ msgid "VW Beetle (4 cylinders, flat)"
-#~ msgstr "VW Beetle (4 cylindres à plat)"
-
-#~ msgid "Cooling factor"
-#~ msgstr "Facteur de refroidissement"
-
-#~ msgid "Eruption"
-#~ msgstr "Éruption"
-
-#~ msgid "Heat"
-#~ msgstr "Chaleur"
-
-#~ msgid "Inferno"
-#~ msgstr "Infernale"
-
-#~ msgid "Little"
-#~ msgstr "Peu"
-
-#~ msgid "Negative"
-#~ msgstr "Négative"
-
-#~ msgid "Number of Particles"
-#~ msgstr "Nombre de particules"
-
-#~ msgid "Pleasant"
-#~ msgstr "Plaisante"
-
-#~ msgid "Positive"
-#~ msgstr "Positive"
-
-#~ msgid "Clay"
-#~ msgstr "Argile"
-
-#~ msgid "Rubber"
-#~ msgstr "Caoutchouc"
-
-#~ msgid "Binary"
-#~ msgstr "Binaire"
-
-#~ msgid "Fire"
-#~ msgstr "Feu"
-
-#~ msgid "Flurry"
-#~ msgstr "Bourrasque"
-
-#~ msgid "Insane"
-#~ msgstr "Aliéné"
-
-#~ msgid "Psychedelic"
-#~ msgstr "Psychédélique"
-
-#~ msgid "RGB"
-#~ msgstr "RVB"
-
-#~ msgid "Water"
-#~ msgstr "Eau"
-
-#~ msgid "Air Speed"
-#~ msgstr "Vitesse de l'air"
-
-#~ msgid "Chrome Toasters"
-#~ msgstr "Grille-pain chromé"
-
-#~ msgid "Flying Toasters"
-#~ msgstr "Grille-pain volant"
-
-#~ msgid "Number of Slices"
-#~ msgstr "Nombre de tranches"
-
-#~ msgid "Number of Toasters"
-#~ msgstr "Nombre de grille-pains"
-
-#~ msgid "Solid Colors"
-#~ msgstr "Couleurs unies"
-
-#~ msgid "Swarm"
-#~ msgstr "Essaim"
-
-#~ msgid "Blur Smoothness"
-#~ msgstr "Douceur de flou"
-
-#~ msgid "GLBlur"
-#~ msgstr "Flou GL"
-
-#~ msgid "GLKnots"
-#~ msgstr "Noeuds GL"
-
-#~ msgid ""
-#~ "Generates some twisting 3d knot patterns. Spins 'em around. Written by "
-#~ "Jamie Zawinski."
-#~ msgstr "Génère de nombreux motifs 3D en spirale. Écrit par Jamie Zawinski."
-
-#~ msgid "Segmented"
-#~ msgstr "Segmenté"
-
-#~ msgid "Draw Glyphs"
-#~ msgstr "Dessiner des glyphes"
-
-#~ msgid "Draw Outlines"
-#~ msgstr "Dessiner en fil de fer"
-
-#~ msgid "Draw Solid Boxes"
-#~ msgstr "Dessiner sans texture"
-
-#~ msgid "GLMatrix"
-#~ msgstr "GLMatrix"
-
-#~ msgid "Glyph Density"
-#~ msgstr "Densité des glyphes"
-
-#~ msgid "Glyph Speed"
-#~ msgstr "Vitesse des glyphes"
-
-#~ msgid "Panning"
-#~ msgstr "Panoramique"
-
-#~ msgid "5 Minutes"
-#~ msgstr "5 minutes"
-
-#~ msgid "50%"
-#~ msgstr "50%"
-
-#~ msgid "Always show at least this much of the image:"
-#~ msgstr "Montre au moins ce nombre d'images :"
-
-#~ msgid "Crossfade Duration:"
-#~ msgstr "Durée du fondu :"
-
-#~ msgid "Frame Rate:"
-#~ msgstr "Vitesse d'affichage :"
-
-#~ msgid "GLSlideshow"
-#~ msgstr "Présentation GL"
-
-#~ msgid "Pan/Zoom Duration:"
-#~ msgstr "Durée Pan/Zoom :"
-
-#~ msgid "Time until loading a new image:"
-#~ msgstr "Temps avant le chargement d'une nouvelle image :"
-
-#~ msgid "Dot size"
-#~ msgstr "Taille des points"
-
-#~ msgid "Gravity points"
-#~ msgstr "Points de gravité"
-
-#~ msgid "Halftone"
-#~ msgstr "Tramage"
-
-#~ msgid "Maximum mass"
-#~ msgstr "Masse max."
-
-#~ msgid "Maximum speed"
-#~ msgstr "Vitesse max."
-
-#~ msgid "Minimum mass"
-#~ msgstr "Masse min."
-
-#~ msgid "Minimum speed"
-#~ msgstr "Vitesse min."
-
-#~ msgid "4D Hypertorus"
-#~ msgstr "Hypertore 4D"
-
-#~ msgid "Color Wheel"
-#~ msgstr "Roue des couleurs"
-
-#~ msgid "Display Speed"
-#~ msgstr "Vitesse d'affichage"
-
-#~ msgid "Orthographic 3d"
-#~ msgstr "Projection orthographique 3D"
-
-#~ msgid "Orthographic 4d"
-#~ msgstr "Projection orthographique 4D"
-
-#~ msgid "Perspective 3d"
-#~ msgstr "Perspective 3D"
-
-#~ msgid "Perspective 4d"
-#~ msgstr "Perspective 4D"
-
-#~ msgid "See-Through Bands"
-#~ msgstr "Eléments que l'on peut voir à travers"
-
-#~ msgid "Solid Object"
-#~ msgstr "Objets solides"
-
-#~ msgid "Transparent Surface"
-#~ msgstr "Surface transparente"
-
-#~ msgid "Two-Sided"
-#~ msgstr "2 faces"
-
-#~ msgid "WX Rotation Speed"
-#~ msgstr "Vitesse de rotation X"
-
-#~ msgid "WY Rotation Speed"
-#~ msgstr "Vitesse de rotation Y"
-
-#~ msgid "WZ Rotation Speed"
-#~ msgstr "Vitesse de rotation Z"
-
-#~ msgid "Wireframe Mesh"
-#~ msgstr "Fil de fer"
-
-#~ msgid "XY Rotation Speed"
-#~ msgstr "Vitesse de rotation XY"
-
-#~ msgid "XZ Rotation Speed"
-#~ msgstr "Vitesse de rotation XZ"
-
-#~ msgid "YZ Rotation Speed"
-#~ msgstr "Vitesse de rotation YZ"
-
-#~ msgid "Chrome"
-#~ msgstr "Chrome"
-
-#~ msgid "Clown barf"
-#~ msgstr "Rire de clown"
-
-#~ msgid "Cycle"
-#~ msgstr "Cycles"
-
-#~ msgid "Flower box"
-#~ msgstr "Boîte à fleurs"
-
-#~ msgid "Inertial damping"
-#~ msgstr "Atténuation inertielle"
-
-#~ msgid "JigglyPuff"
-#~ msgstr "JigglyPuff"
-
-#~ msgid "Rotation speed"
-#~ msgstr "Vitesse de rotation"
-
-#~ msgid "Sphere strength"
-#~ msgstr "Force de la sphère"
-
-#~ msgid "none"
-#~ msgstr "Aucun"
-
-#~ msgid "Wander Around the Screen"
-#~ msgstr "Déplacement centré sur l'écran"
-
-#~ msgid "Big"
-#~ msgstr "Élevé"
-
-#~ msgid "MetaBall Movement"
-#~ msgstr "Mouvement méta-balle"
-
-#~ msgid "MetaBall Radius"
-#~ msgstr "Rayon méta-balle"
-
-#~ msgid "MetaBalls"
-#~ msgstr "Méta-Balles"
-
-#~ msgid "Number of MetaBalls"
-#~ msgstr "Nombre de méta-balles"
-
-#~ msgid "Maximum radius"
-#~ msgstr "Rayon max."
-
-#~ msgid "Minimum radius"
-#~ msgstr "Rayon min."
-
-#~ msgid "Border"
-#~ msgstr "Bordure"
-
-#~ msgid "End color"
-#~ msgstr "Couleur finale"
-
-#~ msgid "Start color"
-#~ msgstr "Couleur initiale"
-
-#~ msgid "Subdivision"
-#~ msgstr "Subdivision"
-
-#~ msgid "Twitch"
-#~ msgstr "Mouvement convulsif"
-
-#~ msgid "Circle"
-#~ msgstr "Cercle"
-
-#~ msgid "Leave a trail"
-#~ msgstr "Laisser une traînée"
-
-#~ msgid "Linear"
-#~ msgstr "Linéaire"
-
-#~ msgid "Lissajous"
-#~ msgstr "Figures Lissojous"
-
-#~ msgid "Test"
-#~ msgstr "Test"
-
-#~ msgid "Use Double Buffering"
-#~ msgstr "Double tampon"
index 0a8e8d6cd69e2b34ee4952063d136e7d73b7da5e..1ba36cbe884d9da4034d9c60631cb5a1f5a4d636 100644 (file)
--- a/po/nl.po
+++ b/po/nl.po
@@ -1,18 +1,21 @@
+# translation of nl.po to Nederlands
 # Dutch translation of xscreensaver
-# Copyright (C) 2001 Free Software Foundation, Inc.
+# Copyright (C) 2001, 2004 Free Software Foundation, Inc.
 # Vincent van Adrighem <vincent@dirck.mine.nu>
-# Tino Meinen <a.t.meinen@chello.nl>, 2002
+# Tino Meinen <a.t.meinen@chello.nl>, 2002.
+# Edwin de Jong <g.e.dejong@student.utwente.nl>, 2004.
 #
 msgid ""
 msgstr ""
-"Project-Id-Version: xscreensaver CVS\n"
+"Project-Id-Version: nl\n"
 "POT-Creation-Date: 2003-07-24 19:05+0200\n"
-"PO-Revision-Date: 2002-08-31 08:06+0200\n"
-"Last-Translator: Tino Meinen <a.t.meinen@chello.nl>\n"
-"Language-Team: Dutch <vertaling@nl.linux.org>\n"
+"PO-Revision-Date: 2004-02-23 12:02+0100\n"
+"Last-Translator: Edwin de Jong <g.e.dejong@student.utwente.nl>\n"
+"Language-Team: Nederlands <nl@li.org>\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.0.2\n"
 
 #: driver/demo-Gtk-conf.c:731
 msgid "Browse..."
@@ -35,7 +38,7 @@ msgstr "Fout bij laden pixmap-bestand: %s"
 #: driver/demo-Gtk-support.c:182
 #, c-format
 msgid "reason: %s\n"
-msgstr ""
+msgstr "reden: %s\n"
 
 #: driver/demo-Gtk-widgets.c:155 driver/xscreensaver-demo.glade.h:89
 #: driver/xscreensaver-demo.glade2.h:65
@@ -52,10 +55,8 @@ msgid "_Blank Screen Now"
 msgstr "Het Scherm Nu _Wissen"
 
 #: driver/demo-Gtk-widgets.c:205 driver/xscreensaver-demo.glade.h:2
-msgid ""
-"Activate the XScreenSaver daemon now (locking the screen if so configured.)"
-msgstr ""
-"De XScreenSaver-daemon nu activeren (en het scherm desgewenst vergrendelen.)"
+msgid "Activate the XScreenSaver daemon now (locking the screen if so configured.)"
+msgstr "De XScreenSaver-daemon nu activeren (en het scherm desgewenst vergrendelen.)"
 
 #: driver/demo-Gtk-widgets.c:209 driver/xscreensaver-demo.glade.h:97
 #: driver/xscreensaver-demo.glade2.h:80
@@ -100,7 +101,7 @@ msgstr ""
 
 #: driver/demo-Gtk-widgets.c:270 driver/xscreensaver-demo.glade2.h:77
 msgid "_Help"
-msgstr "_Hulp"
+msgstr "_Help"
 
 #: driver/demo-Gtk-widgets.c:290 driver/xscreensaver-demo.glade.h:92
 #: driver/xscreensaver-demo.glade2.h:66
@@ -109,7 +110,7 @@ msgstr "_Info..."
 
 #: driver/demo-Gtk-widgets.c:299 driver/xscreensaver-demo.glade.h:30
 msgid "Display version information."
-msgstr "Toon versie"
+msgstr "Toon versie."
 
 #: driver/demo-Gtk-widgets.c:303 driver/xscreensaver-demo.glade.h:94
 #: driver/xscreensaver-demo.glade2.h:75
@@ -127,18 +128,15 @@ msgstr "Wisselen Na"
 #: driver/demo-Gtk-widgets.c:364 driver/xscreensaver-demo.glade.h:78
 #: driver/xscreensaver-demo.glade2.h:54
 msgid "Whether a password should be required to un-blank the screen."
-msgstr ""
-"Of een wachtwoord nodig is om het scherm weer te activeren als het zwart is."
+msgstr "Of een wachtwoord nodig is om het scherm te reactiveren als het zwart is."
 
 #: driver/demo-Gtk-widgets.c:366 driver/xscreensaver-demo.glade.h:50
-#, fuzzy
 msgid "Lock Screen After"
-msgstr "Geen Schermbeveiliging"
+msgstr "Vergrendel Scherm Na"
 
 #: driver/demo-Gtk-widgets.c:374 driver/xscreensaver-demo.glade.h:8
-#, fuzzy
 msgid "Blank After"
-msgstr "Sneller"
+msgstr "Scherm Wissen Na"
 
 #: driver/demo-Gtk-widgets.c:397 driver/demo-Gtk-widgets.c:447
 #: driver/demo-Gtk-widgets.c:461 driver/demo-Gtk-widgets.c:1010
@@ -174,7 +172,7 @@ msgstr "Instellingen..."
 #: driver/demo-Gtk-widgets.c:494 driver/xscreensaver-demo.glade.h:17
 #: driver/xscreensaver-demo.glade2.h:9
 msgid "Customization and explanation of the selected screen saver."
-msgstr ""
+msgstr "Aanpassing en uitleg van de geselecteerde scherm beveiliging."
 
 #: driver/demo-Gtk-widgets.c:515 driver/xscreensaver-demo.glade.h:52
 msgid "Mode:"
@@ -182,9 +180,8 @@ msgstr "Modus:"
 
 #: driver/demo-Gtk-widgets.c:533 driver/xscreensaver-demo.glade.h:25
 #: driver/xscreensaver-demo.glade2.h:16
-#, fuzzy
 msgid "Disable Screen Saver"
-msgstr "Scherm Beveiliging"
+msgstr "Zet Scherm Beveiliging Uit"
 
 #: driver/demo-Gtk-widgets.c:536 driver/xscreensaver-demo.glade.h:9
 #: driver/xscreensaver-demo.glade2.h:5
@@ -193,15 +190,13 @@ msgstr "Enkel Leeg Scherm"
 
 #: driver/demo-Gtk-widgets.c:539 driver/xscreensaver-demo.glade.h:56
 #: driver/xscreensaver-demo.glade2.h:42
-#, fuzzy
 msgid "Only One Screen Saver"
-msgstr "Voorbeeld Scherm Beveiliging"
+msgstr "Slechts één Schermbeveiliging"
 
 #: driver/demo-Gtk-widgets.c:542 driver/xscreensaver-demo.glade.h:60
 #: driver/xscreensaver-demo.glade2.h:44
-#, fuzzy
 msgid "Random Screen Saver"
-msgstr "Geen Schermbeveiliging"
+msgstr "Willekeurige Schermbeveiliging"
 
 #: driver/demo-Gtk-widgets.c:565 driver/demo-Gtk.c:2120
 #: driver/xscreensaver-demo.glade.h:75
@@ -245,14 +240,13 @@ msgid "Description"
 msgstr "Beschrijving"
 
 #: driver/demo-Gtk-widgets.c:685 driver/xscreensaver-demo.glade.h:26
-#, fuzzy
 msgid "Display Modes"
-msgstr "Tekent een sonar scoop."
+msgstr "Weergavevormen"
 
 #: driver/demo-Gtk-widgets.c:701 driver/xscreensaver-demo.glade.h:23
 #: driver/xscreensaver-demo.glade2.h:14
 msgid "Diagnostics"
-msgstr "Diagnostiek"
+msgstr "Diagnostieken"
 
 #: driver/demo-Gtk-widgets.c:745 driver/xscreensaver-demo.glade.h:80
 #: driver/xscreensaver-demo.glade2.h:56
@@ -268,19 +262,18 @@ msgstr "Uitgebreide Diagnostiek"
 msgid ""
 "Whether any error output of the display modes should be redirected to the "
 "screen."
-msgstr ""
+msgstr "Of foutboodschappen van de weergavemodussen op het scherm worden weergegeven."
 
 #: driver/demo-Gtk-widgets.c:764 driver/xscreensaver-demo.glade.h:29
-#, fuzzy
 msgid "Display Subprocess Errors"
-msgstr "Teken ruis."
+msgstr "Geef Subprocess-fouten Weer"
 
 #: driver/demo-Gtk-widgets.c:779 driver/xscreensaver-demo.glade.h:87
 #: driver/xscreensaver-demo.glade2.h:63
 msgid ""
 "Whether the splash screen (with the version number and `Help' button) should "
 "be momentarily displayed when the daemon first starts up."
-msgstr ""
+msgstr "Of het opstartscherm (met het versienummer en de 'Help' knop) tijdelijk weergegeven moeten worden als de daemon opstart."
 
 #: driver/demo-Gtk-widgets.c:781 driver/xscreensaver-demo.glade.h:28
 msgid "Display Splash Screen at Startup"
@@ -288,32 +281,30 @@ msgstr "Opstartscherm tonen"
 
 #: driver/demo-Gtk-widgets.c:790 driver/xscreensaver-demo.glade.h:15
 #: driver/xscreensaver-demo.glade2.h:8
-#, fuzzy
 msgid "Colormaps"
-msgstr "Kleuren"
+msgstr "Kleurenkaarten"
 
 #: driver/demo-Gtk-widgets.c:834 driver/xscreensaver-demo.glade.h:88
 #: driver/xscreensaver-demo.glade2.h:64
 msgid ""
 "Whether to install a private colormap when running in 8-bit mode on the "
 "default Visual."
-msgstr ""
+msgstr "Of er een eigen kleurenkaart geinstalleerd moet worden als we in 8-bit mode op de standaard Visual draaien."
 
 #: driver/demo-Gtk-widgets.c:836 driver/xscreensaver-demo.glade.h:48
 msgid "Install Colormap"
-msgstr ""
+msgstr "Installeer een Kleurenkaart."
 
 #: driver/demo-Gtk-widgets.c:859 driver/xscreensaver-demo.glade.h:86
 #: driver/xscreensaver-demo.glade2.h:62
 msgid ""
 "Whether the screen should slowly fade to black when the screen saver "
 "activates."
-msgstr ""
-"Of het scherm langzaam op zwart moet gaan als de schermbeveiliging opstart."
+msgstr "Of het scherm langzaam op zwart moet gaan als de schermbeveiliging opstart."
 
 #: driver/demo-Gtk-widgets.c:861 driver/xscreensaver-demo.glade.h:36
 msgid "Fade To Black When Blanking"
-msgstr ""
+msgstr "Vervaag Naar Zwart-Op Activatie"
 
 #: driver/demo-Gtk-widgets.c:876 driver/xscreensaver-demo.glade.h:85
 #: driver/xscreensaver-demo.glade2.h:61
@@ -326,17 +317,16 @@ msgstr ""
 
 #: driver/demo-Gtk-widgets.c:878 driver/xscreensaver-demo.glade.h:35
 msgid "Fade From Black When Unblanking"
-msgstr ""
+msgstr "Vervaag vanuit zwart bij terugkeer"
 
 #: driver/demo-Gtk-widgets.c:904 driver/xscreensaver-demo.glade.h:34
-#, fuzzy
 msgid "Fade Duration"
-msgstr "Duur"
+msgstr "Vervaagduur"
 
 #: driver/demo-Gtk-widgets.c:922 driver/xscreensaver-demo.glade.h:44
 #: driver/xscreensaver-demo.glade2.h:31
 msgid "How long it should take for the screen to fade in and out."
-msgstr ""
+msgstr "Hoe lang het vervagen duurt."
 
 #: driver/demo-Gtk-widgets.c:926 driver/xscreensaver-demo.glade.h:100
 #: driver/xscreensaver-demo.glade2.h:96
@@ -345,19 +335,17 @@ msgstr "seconden"
 
 #: driver/demo-Gtk-widgets.c:936 driver/xscreensaver-demo.glade.h:27
 #: driver/xscreensaver-demo.glade2.h:17
-#, fuzzy
 msgid "Display Power Management"
-msgstr "Gebruik energie beheer"
+msgstr "Geef Energie Beheer weer"
 
 #: driver/demo-Gtk-widgets.c:980 driver/xscreensaver-demo.glade.h:84
 #: driver/xscreensaver-demo.glade2.h:60
 msgid "Whether the monitor should be powered down after a while."
-msgstr ""
+msgstr "Of de monitor na een tijd uitgezet moet worden."
 
 #: driver/demo-Gtk-widgets.c:982 driver/xscreensaver-demo.glade.h:57
-#, fuzzy
 msgid "Power Management Enabled"
-msgstr "Gebruik energie beheer"
+msgstr "Energie Beheer Aangezet"
 
 #: driver/demo-Gtk-widgets.c:1050 driver/xscreensaver-demo.glade.h:55
 msgid "Off After"
@@ -365,22 +353,21 @@ msgstr "Uit Na"
 
 #: driver/demo-Gtk-widgets.c:1063 driver/xscreensaver-demo.glade.h:70
 msgid "Suspend After"
-msgstr ""
+msgstr "Onderbreken Na"
 
 #: driver/demo-Gtk-widgets.c:1076 driver/xscreensaver-demo.glade.h:68
-#, fuzzy
 msgid "Standby After"
-msgstr "Start Na "
+msgstr "Gereed Voor Actie Na"
 
 #: driver/demo-Gtk-widgets.c:1099 driver/xscreensaver-demo.glade.h:45
 #: driver/xscreensaver-demo.glade2.h:33
 msgid "How long until the monitor goes into power-saving mode."
-msgstr ""
+msgstr "Hoe lang het duurt voordat de monitor in energiezuinige stand gaat."
 
 #: driver/demo-Gtk-widgets.c:1113 driver/xscreensaver-demo.glade.h:46
 #: driver/xscreensaver-demo.glade2.h:34
 msgid "How long until the monitor powers down."
-msgstr ""
+msgstr "Hoe lang het duurt voordat de monitor uitgezet wordt."
 
 #: driver/demo-Gtk-widgets.c:1117 driver/xscreensaver-demo.glade.h:47
 #: driver/xscreensaver-demo.glade2.h:35
@@ -392,34 +379,34 @@ msgstr "Beeldbewerking"
 msgid ""
 "Whether the image-manipulating modes should be allowed to operate on an "
 "image of your desktop."
-msgstr ""
+msgstr "Of de beeldbewerkingsmodussen toestemming hebben om op een beeld van uw bureaublad te werken."
 
 #: driver/demo-Gtk-widgets.c:1163 driver/xscreensaver-demo.glade.h:39
-#, fuzzy
 msgid "Grab Desktop Images"
-msgstr "Scherm Beveiliging"
+msgstr "Neem Bureaublad Beelden"
 
 #: driver/demo-Gtk-widgets.c:1178 driver/xscreensaver-demo.glade.h:82
 msgid ""
 "Whether the image-manipulating modes should operate on images captured from "
 "the system's video input (if there is one)."
 msgstr ""
+"Of de beeldbewerkingsmodussen op beelden van videoinvoer op uw "
+"computer moeten werken (als er 1 is)"
 
 #: driver/demo-Gtk-widgets.c:1180 driver/xscreensaver-demo.glade.h:40
 msgid "Grab Video Frames"
-msgstr ""
+msgstr "Verkrijg Video beelden"
 
 #: driver/demo-Gtk-widgets.c:1195 driver/xscreensaver-demo.glade.h:83
 #: driver/xscreensaver-demo.glade2.h:59
 msgid ""
 "Whether the image-manipulating modes should operate on random images loaded "
 "from disk."
-msgstr ""
+msgstr "Of de beeldbewerkende modussen op willekeurige beelden van de harde schijf moeten werken."
 
 #: driver/demo-Gtk-widgets.c:1197 driver/xscreensaver-demo.glade.h:12
-#, fuzzy
 msgid "Choose Random Image:"
-msgstr "Kies een windowmanager"
+msgstr "Kies Willekeurig Beeld:"
 
 #: driver/demo-Gtk-widgets.c:1230 driver/xscreensaver-demo.glade.h:73
 #: driver/xscreensaver-demo.glade2.h:52
@@ -433,18 +420,16 @@ msgstr "Bladeren"
 #: driver/demo-Gtk-widgets.c:1240 driver/demo-Gtk-widgets.c:1593
 #: driver/xscreensaver-demo.glade.h:3 driver/xscreensaver-demo.glade2.h:2
 msgid "Advanced"
-msgstr "Details"
+msgstr "Geavanceerd"
 
 #: driver/demo-Gtk-widgets.c:1438 driver/xscreensaver-demo.glade.h:90
-#, fuzzy
 msgid "XScreenSaver: Mode-Specific Settings"
-msgstr "Scherm Beveiliging Instellingen"
+msgstr "XScreenSaver: Mode Specifieke Instellingen"
 
 #: driver/demo-Gtk-widgets.c:1460 driver/xscreensaver-demo.glade.h:64
 #: driver/xscreensaver-demo.glade2.h:47
-#, fuzzy
 msgid "Settings"
-msgstr "Instellingen..."
+msgstr "Instellingen"
 
 #: driver/demo-Gtk-widgets.c:1489 driver/xscreensaver-demo.glade.h:66
 #: driver/xscreensaver-demo.glade2.h:49
@@ -459,7 +444,7 @@ msgstr "Visueel:"
 #: driver/demo-Gtk.c:1518 driver/demo-Gtk.c:2850
 #: driver/xscreensaver-demo.glade.h:5 driver/xscreensaver-demo.glade2.h:3
 msgid "Any"
-msgstr "Willekeurig"
+msgstr "Iedere"
 
 #: driver/demo-Gtk-widgets.c:1545 driver/xscreensaver-demo.glade.h:7
 #: driver/xscreensaver-demo.glade2.h:4
@@ -473,9 +458,8 @@ msgstr "Standaardwaarde"
 
 #: driver/demo-Gtk-widgets.c:1547 driver/xscreensaver-demo.glade.h:20
 #: driver/xscreensaver-demo.glade2.h:11
-#, fuzzy
 msgid "Default-N"
-msgstr "Standaard waarde"
+msgstr "Standaardwaarde-N"
 
 #: driver/demo-Gtk-widgets.c:1548 driver/xscreensaver-demo.glade.h:37
 #: driver/xscreensaver-demo.glade2.h:23
@@ -485,31 +469,27 @@ msgstr "GL"
 #: driver/demo-Gtk-widgets.c:1549 driver/xscreensaver-demo.glade.h:74
 #: driver/xscreensaver-demo.glade2.h:53
 msgid "TrueColor"
-msgstr "WareKleur"
+msgstr "TrueColor"
 
 #: driver/demo-Gtk-widgets.c:1550 driver/xscreensaver-demo.glade.h:59
 #: driver/xscreensaver-demo.glade2.h:43
-#, fuzzy
 msgid "PseudoColor"
-msgstr "Kleur"
+msgstr "OnechteKleur"
 
 #: driver/demo-Gtk-widgets.c:1551 driver/xscreensaver-demo.glade.h:69
 #: driver/xscreensaver-demo.glade2.h:50
-#, fuzzy
 msgid "StaticGray"
-msgstr "Ruis."
+msgstr "StatischGrijs"
 
 #: driver/demo-Gtk-widgets.c:1552 driver/xscreensaver-demo.glade.h:42
 #: driver/xscreensaver-demo.glade2.h:27
-#, fuzzy
 msgid "GrayScale"
-msgstr "Geschaald"
+msgstr "Grijswaarde"
 
 #: driver/demo-Gtk-widgets.c:1553 driver/xscreensaver-demo.glade.h:24
 #: driver/xscreensaver-demo.glade2.h:15
-#, fuzzy
 msgid "DirectColor"
-msgstr "Kleur"
+msgstr "DirectColor"
 
 #: driver/demo-Gtk-widgets.c:1554 driver/xscreensaver-demo.glade.h:14
 #: driver/xscreensaver-demo.glade2.h:7
@@ -531,6 +511,9 @@ msgid ""
 "The X visual type that this demo will require.  If that visual is available "
 "it will be used, otherwise, this demo will not be run."
 msgstr ""
+"De X visual type dat deze demo nodig is. Als deze visual beschikbaar "
+"is, dan zal het gebruikt worden, in ieder ander geval zal de demo niet "
+"starten."
 
 #: driver/demo-Gtk-widgets.c:1569 driver/xscreensaver-demo.glade.h:16
 msgid "Command Line:"
@@ -543,12 +526,12 @@ msgstr "Documentatie..."
 #: 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."
 msgstr ""
-"Klik hier om de handleiding te lezen voor deze display-modus, indien er een "
+"Klik hier om de handleiding te lezen voor deze weergave modus, indien er een "
 "is."
 
 #: driver/demo-Gtk-widgets.c:1674 driver/xscreensaver-demo.glade.h:4
 msgid "Advanced >>"
-msgstr "Details >>"
+msgstr "Geavanceerd >>"
 
 #: driver/demo-Gtk-widgets.c:1682 driver/xscreensaver-demo.glade.h:32
 msgid "Edit the command line directly."
@@ -560,7 +543,7 @@ msgstr "Standaard <<"
 
 #: driver/demo-Gtk-widgets.c:1692 driver/xscreensaver-demo.glade.h:6
 msgid "Back to the graphical configuration options."
-msgstr ""
+msgstr "Terug naar de opties van de grafische configuratie."
 
 #: driver/demo-Gtk-widgets.c:1703 driver/demo-Gtk.c:727
 #: driver/xscreensaver-demo.glade.h:54
@@ -573,7 +556,7 @@ msgstr "Annuleren"
 
 #: driver/demo-Gtk.c:632
 msgid "For updates, check http://www.jwz.org/xscreensaver/"
-msgstr ""
+msgstr "Voor bijgewerkte versies, ga naar http://www.jwz.org/xscreensaver/"
 
 #: driver/demo-Gtk.c:765
 msgid ""
@@ -583,7 +566,7 @@ msgid ""
 msgstr ""
 "Fout:\n"
 "\n"
-"Er is geen Hulp-URL opgegeven.\n"
+"Er is geen Help-URL gespecificeerd.\n"
 
 #: driver/demo-Gtk.c:851
 msgid ""
@@ -595,6 +578,7 @@ msgstr ""
 "Fout:\n"
 "\n"
 "De xcsreensaver daemon is niet goed opgestart.\n"
+"\n"
 
 #: driver/demo-Gtk.c:857
 msgid ""
@@ -614,6 +598,22 @@ msgid ""
 "You shouldn't run X as root. Instead, you should log in as a\n"
 "normal user, and `su' as necessary."
 msgstr ""
+"U bent als root bezig. Dit betekend normaalgesproken dat\n"
+"xscreensaver niet in staat was uw X server te bereiken omdat\n"
+"toegangscontrole aangezet is. Probeer dit commando:\n"
+"\n"
+"                        xhost +localhost\n"
+"\n"
+"en selecteer dan `Bestand / Herstart Daemon'.\n"
+"\n"
+"Bedenk wel dat het uitzetten van toegangscontrole iedereen\n "
+"die ingelogged is op deze machine toegang geeft tot uw\n"
+"scherm. Dit zou als een beveiligingsprobleem gezien kunnen\n"
+"worden.Lees a.u.b. de xscreensaver documentatie en FAQ voor\n"
+"meer informatie.\n"
+"\n"
+"U zou X niet als root moeten draaien. U kunt beter als een\n"
+"normale gebruiken inloggen en 'su' gebruiken waar nodig."
 
 #: driver/demo-Gtk.c:873
 msgid "Please check your $PATH and permissions."
@@ -674,17 +674,15 @@ msgstr ""
 
 #: driver/demo-Gtk.c:2532
 msgid "Descriptions not available: no XML support compiled in."
-msgstr ""
-"Beschrijvingen niet beschikbaar: geen XML-ondersteuning meegecompileerd."
+msgstr "Beschrijvingen niet beschikbaar: geen XML-ondersteuning meegecompileerd."
 
 #: driver/demo-Gtk.c:2537
 msgid "No description available."
 msgstr "Geen beschrijving beschikbaar."
 
 #: driver/demo-Gtk.c:2802
-#, fuzzy
 msgid "Blank Screen"
-msgstr "Schermverval"
+msgstr "Start Schermbeveiliging"
 
 #: driver/demo-Gtk.c:2808
 msgid "Screen Saver Disabled"
@@ -702,9 +700,8 @@ msgstr ""
 "bestand \"%s\" is veranderd. bezig met herladen.\n"
 
 #: driver/demo-Gtk.c:3078
-#, fuzzy
 msgid "No Preview"
-msgstr "Voorbeeld"
+msgstr "Geen Voorbeeld"
 
 #: driver/demo-Gtk.c:3078
 msgid "Available"
@@ -712,11 +709,11 @@ msgstr "Beschikbaar"
 
 #: driver/demo-Gtk.c:3079
 msgid "Not"
-msgstr ""
+msgstr "Niet"
 
 #: driver/demo-Gtk.c:3079
 msgid "Installed"
-msgstr ""
+msgstr "Geïnstalleerd"
 
 #: driver/demo-Gtk.c:3780
 #, c-format
@@ -728,8 +725,8 @@ msgid ""
 msgstr ""
 "Waarschuwing:\n"
 "\n"
-"De XScreenSaver daemon loopt kennelijk niet op \n"
-"display \"%s\". Nu opstarten."
+"De XScreenSaver daemon loopt niet op \n"
+"scherm \"%s\". Nu opstarten?"
 
 #: driver/demo-Gtk.c:3790
 #, c-format
@@ -755,7 +752,7 @@ msgstr ""
 "Maar de schermbeveiliging die op scherm \"%s\" loopt\n"
 "is in opdracht van gebruiker \"%s\" op computer \"%s\"/\n"
 "\n"
-"Omdat dit verschullende gebruikers zijn lezen/schrijven ze niet \n"
+"Omdat dit verschillende gebruikers zijn lezen/schrijven ze niet \n"
 "hetzelfde ~/xscreensaver-bestand, dus %s zal niet goed werken.\n"
 "\n"
 "U moet ofwel %s opnieuw opstarten als \"%s\", of de \n"
@@ -778,6 +775,17 @@ msgid ""
 "\n"
 "Restart the daemon on \"%s\" as \"%s\" now?\n"
 msgstr ""
+"Waarschuwing:\n"
+"\n"
+"%s draait als gebruiker \"%s\" op host \"%s\".\n"
+"Maar het xscreensaver management scherm \"%s\"\n"
+"draait als gebruiker \"%s\" op host \"%s\".\n"
+"\n"
+"Als de twee machines geen bestandsysteem met elkaar\n"
+"delen (ze zien niet dezelfde ~%s/.xscreensaver bestand)\n"
+"dan zal %s niet goed werken.\n"
+"\n"
+"Herstart de daemon op \"%s\" als \"%s\" nu?\n"
 
 #: driver/demo-Gtk.c:3837
 #, c-format
@@ -804,13 +812,12 @@ msgid "%s: unknown option: %s\n"
 msgstr "%s: onbekende optie: %s\n"
 
 #: driver/demo-Gtk.c:4335
-#, fuzzy
 msgid "Screensaver Preferences"
-msgstr "Schermbeveiliging"
+msgstr "Schermbeveiliging Voorkeuren"
 
 #: driver/screensaver-properties.desktop.in.h:1
 msgid "Change screensaver properties"
-msgstr ""
+msgstr "Verander schermbeveiliging voorkeuren"
 
 #: driver/screensaver-properties.desktop.in.h:2
 msgid "Screensaver"
@@ -825,109 +832,102 @@ msgid "*"
 msgstr "*"
 
 #: driver/xscreensaver-demo.glade2.h:6
-#, fuzzy
 msgid "Choose _Random Image:"
-msgstr "Kies een windowmanager"
+msgstr "Kies _Willekeurig Beeld:"
 
 #: driver/xscreensaver-demo.glade2.h:18
-#, fuzzy
 msgid "Display Subprocess _Errors"
-msgstr "Teken ruis."
+msgstr "Toon Subprocess _Fouten"
 
 #: driver/xscreensaver-demo.glade2.h:19
-#, fuzzy
 msgid "Display _Splash Screen at Startup"
-msgstr "Scherm Beveiliging"
+msgstr "Toon opstartscherm"
 
 #: driver/xscreensaver-demo.glade2.h:20
-#, fuzzy
 msgid "F_ade Duration"
-msgstr "Duur"
+msgstr "V_ervaagtijd"
 
 #: driver/xscreensaver-demo.glade2.h:21
 msgid "Fade from Black When _Unblanking"
-msgstr ""
+msgstr "Vervaag Vanuit Zwart Bij Afsluiten Screensaver"
 
 #: driver/xscreensaver-demo.glade2.h:22
-#, fuzzy
 msgid "Fade to Black when _Blanking"
-msgstr "Langzaam overgaan naar Zwart bij blank gaan"
+msgstr "Langzaam Naar Zwart Bij Start Screensaver"
 
 #: driver/xscreensaver-demo.glade2.h:24
-#, fuzzy
 msgid "Grab Desktop _Images"
-msgstr "Scherm Beveiliging"
+msgstr "Verkrijg Bureaublad _Beelden"
 
 #: driver/xscreensaver-demo.glade2.h:25
 msgid "Grab _Video Frames"
-msgstr ""
+msgstr "Verkrijg _Video Beelden"
 
 #: driver/xscreensaver-demo.glade2.h:28
 msgid "How long after the screen blanks until a password will be required."
 msgstr ""
+"Hoe lang het duurt nadat de screensaver start voordat een wachtwoord "
+"verwacht wordt."
 
 #: driver/xscreensaver-demo.glade2.h:29
-#, fuzzy
 msgid "How long before the screensaver activates."
-msgstr "Hoe lang voordat de monitor compleet op zwart gaat."
+msgstr "Hoe lang voordat de screensaver geactiveerd wordt."
 
 #: driver/xscreensaver-demo.glade2.h:30
 msgid ""
 "How long each display mode should run before choosing a new one (in Random "
 "mode.)"
-msgstr ""
+msgstr "Hoe lang iedere scherm modus moet draaien voordat er een nieuwe gekozen wordt (in Willekeurige Modus)."
 
 #: driver/xscreensaver-demo.glade2.h:32
-#, fuzzy
 msgid "How long until the monitor goes completely black."
 msgstr "Hoe lang voordat de monitor compleet op zwart gaat."
 
 #: driver/xscreensaver-demo.glade2.h:36
-#, fuzzy
 msgid "Install _Colormap"
-msgstr "Kleuren"
+msgstr "Installeer _Kleurenkaart"
 
 #: driver/xscreensaver-demo.glade2.h:38
-#, fuzzy
 msgid ""
 "No Preview\n"
 "Available"
-msgstr "Voorbeeld"
+msgstr ""
+"Geen Voorbeeld\n"
+"Beschikbaar"
 
 #: driver/xscreensaver-demo.glade2.h:40
 msgid ""
 "Not\n"
 "Installed"
 msgstr ""
+"Niet\n"
+"geïnstalleerd"
 
 #: driver/xscreensaver-demo.glade2.h:48
-#, fuzzy
 msgid "Stand_by After"
-msgstr "Start Na "
+msgstr "Actief Na"
 
 #: driver/xscreensaver-demo.glade2.h:51
-#, fuzzy
 msgid "Sus_pend After"
-msgstr "Start Na "
+msgstr "_Onderbreken Na"
 
 #: driver/xscreensaver-demo.glade2.h:58
 msgid ""
 "Whether the image-manipulating modes should operate on images captured from "
 "the system's video input (if there is one.)"
-msgstr ""
+msgstr "Of de beeldbewerkings modussen moeten bewerken op beelden van de video invoer (als die er is)."
 
 #: driver/xscreensaver-demo.glade2.h:67
 msgid "_Advanced"
-msgstr "_Details"
+msgstr "_Geavanceerd"
 
 #: driver/xscreensaver-demo.glade2.h:68
 msgid "_Advanced >>"
-msgstr "_Details >>"
+msgstr "_Geavanceerd >>"
 
 #: driver/xscreensaver-demo.glade2.h:69
-#, fuzzy
 msgid "_Blank After"
-msgstr "Sneller"
+msgstr "_Zwart Na"
 
 #: driver/xscreensaver-demo.glade2.h:71
 msgid "_Browse"
@@ -946,9 +946,8 @@ msgid "_Display Modes"
 msgstr "_Weergavemodi"
 
 #: driver/xscreensaver-demo.glade2.h:79
-#, fuzzy
 msgid "_Lock Screen After"
-msgstr "Geen Schermbeveiliging"
+msgstr "_Versleutel Scherm Na"
 
 #: driver/xscreensaver-demo.glade2.h:81
 msgid "_Mode:"
@@ -979,9 +978,8 @@ msgid "_Standard <<"
 msgstr "_Standaard <<"
 
 #: driver/xscreensaver-demo.glade2.h:89
-#, fuzzy
 msgid "_Verbose Diagnostics"
-msgstr "Uitgebreide Diagnostiek"
+msgstr "_Uitgebreide Diagnostiek"
 
 #: driver/xscreensaver-demo.glade2.h:90
 msgid "_Visual:"
@@ -989,7 +987,7 @@ msgstr "_Visueel:"
 
 #: driver/xscreensaver-demo.glade2.h:91
 msgid "dialog1"
-msgstr "Dialo"
+msgstr "dialog1"
 
 #: driver/xscreensaver-demo.glade2.h:93
 msgid "no preview"
@@ -997,7 +995,7 @@ msgstr "geen voorbeeld"
 
 #: driver/xscreensaver-demo.glade2.h:94
 msgid "not installed"
-msgstr ""
+msgstr "niet geinstalleerd"
 
 #: driver/xscreensaver-demo.glade2.h:95
 msgid "preview"
@@ -1176,7 +1174,7 @@ msgstr "Vaak"
 
 #: hacks/config/anemone.xml.h:8
 msgid "Rarely"
-msgstr ""
+msgstr "Zelden"
 
 #: hacks/config/anemone.xml.h:9 hacks/config/ant.xml.h:15
 #: hacks/config/apollonian.xml.h:11 hacks/config/atlantis.xml.h:13
@@ -1344,7 +1342,7 @@ msgstr "Dun"
 
 #: hacks/config/anemone.xml.h:15
 msgid "Turn speed"
-msgstr ""
+msgstr "Draaisnelheid"
 
 #: hacks/config/anemone.xml.h:16 hacks/config/ant.xml.h:22
 #: hacks/config/apollonian.xml.h:13 hacks/config/attraction.xml.h:32
@@ -1385,10 +1383,9 @@ msgstr "Friemelende tentakels. Door Gabriel Finch."
 
 #: hacks/config/anemone.xml.h:18
 msgid "Withdraw freqency"
-msgstr ""
+msgstr "Terugtrek Frequentie"
 
 #: hacks/config/ant.xml.h:1
-#, fuzzy
 msgid ""
 "A cellular automaton that is really a two-dimensional Turing machine: as the "
 "heads (``ants'') walk along the screen, they change pixel values in their "
@@ -1413,9 +1410,8 @@ msgid "Ants Count"
 msgstr "Aantal Mieren"
 
 #: hacks/config/ant.xml.h:5
-#, fuzzy
 msgid "Draw Eyes"
-msgstr "Toon Labels"
+msgstr "Toon Ogen"
 
 #: hacks/config/ant.xml.h:7
 msgid "Four Sided Cells"
@@ -1470,7 +1466,7 @@ msgstr "Klein"
 
 #: hacks/config/ant.xml.h:18
 msgid "Three Sided Cells"
-msgstr "Driekantige Cellen"
+msgstr "Driehoekige Cellen"
 
 #: hacks/config/ant.xml.h:19 hacks/config/demon.xml.h:12
 #: hacks/config/discrete.xml.h:10 hacks/config/fadeplot.xml.h:11
@@ -1483,7 +1479,7 @@ msgstr "Timeout"
 
 #: hacks/config/ant.xml.h:20
 msgid "Truchet Lines"
-msgstr "Truchet`Lijnen"
+msgstr "Truchet Lijnen"
 
 #: hacks/config/ant.xml.h:21
 msgid "Twelve Sided Cells"
@@ -1506,7 +1502,6 @@ msgid "Draw Labels"
 msgstr "Toon Labels"
 
 #: hacks/config/apollonian.xml.h:6
-#, fuzzy
 msgid "Include Alternate Geometries"
 msgstr "Afwisselende geometrien bijvoegen"
 
@@ -1515,6 +1510,8 @@ msgid ""
 "Packs a large circle with smaller circles, demonstrating the Descartes "
 "Circle Theorem. Written by Allan R. Wilks and David Bagley."
 msgstr ""
+"Vult een grote cirkel met kleinere, daarbij Descartes Circel Theorie "
+"demonstrerend. Geschreven door Allan R. Wilks en David Bagley."
 
 #: hacks/config/apollonian.xml.h:10
 msgid "Shallow"
@@ -1554,7 +1551,7 @@ msgstr "Snelheid van Haaien"
 
 #: hacks/config/atlantis.xml.h:10
 msgid "Shimmering Water"
-msgstr ""
+msgstr "Glinsterend Water"
 
 #: hacks/config/atlantis.xml.h:11 hacks/config/atunnel.xml.h:5
 #: hacks/config/blocktube.xml.h:8 hacks/config/boxed.xml.h:5
@@ -1606,11 +1603,13 @@ msgid ""
 "dolphins, and whales. The swimming motions are great. Originally written by "
 "Mark Kilgard."
 msgstr ""
+"Dit is xfishtank: een GL animatie met een aantal haaien, dolfijnen, "
+"en walvissen. The zwembewegingen zijn geweldig. Origineel door "
+"Mark Kilgard."
 
 #: hacks/config/atlantis.xml.h:16
-#, fuzzy
 msgid "Whale Speed"
-msgstr "Snelheid"
+msgstr "Walvis Snelheid"
 
 #: hacks/config/atlantis.xml.h:17 hacks/config/atunnel.xml.h:10
 #: hacks/config/blocktube.xml.h:13 hacks/config/boxed.xml.h:8
@@ -1654,18 +1653,16 @@ msgstr "Tegen Muren Stuiteren"
 #: hacks/config/attraction.xml.h:6 hacks/config/hopalong.xml.h:1
 #: hacks/config/interference.xml.h:3 hacks/config/qix.xml.h:2
 #: hacks/config/wander.xml.h:3
-#, fuzzy
 msgid "Color Contrast"
-msgstr "Kleur v/h pad"
+msgstr "Kleur Contrast"
 
 #: hacks/config/attraction.xml.h:7
 msgid "Environmental Viscosity"
 msgstr "Omgevingsviscositeit"
 
 #: hacks/config/attraction.xml.h:9
-#, fuzzy
 msgid "Filled Splines"
-msgstr "Teken gekleurde polylijnen"
+msgstr "Vul buiglijnen"
 
 #: hacks/config/attraction.xml.h:10 hacks/config/ccurve.xml.h:9
 #: hacks/config/cloudlife.xml.h:5 hacks/config/cubenetic.xml.h:10
@@ -1706,6 +1703,18 @@ msgid ""
 "edge of the screen. It looks quite chaotic. Written by Jamie Zawinski, based "
 "on Lisp code by John Pezaris."
 msgstr ""
+"Net zoals qix, gebruikt deze mode een simpel bewegingsmodel "
+"om zodoende veel verschillende scherm modes te tonen. De "
+"controlepunten trekken elkaar aan tot een bepaalde afstand en "
+"stoten elkaar daarna weg. De aantrekking/afstoting is proportioneel "
+"met de afstand tussen de twee objecten, gelijk aan sterke/zwakke "
+"kernkrachten. Eén van de meest interessante manieren om deze "
+"mode te bekijken is simpel als vallende ballen, omdat hun beweging "
+"en interacties zo vreemd zijn. Soms komen twee ballen in nauwe "
+"baan om elkaar om dan te worden onderbroken door een derde, of "
+"door de zijkant van het scherm. Lijkt allemaal heel chaotisch. "
+"Geschreven door Jamie Zawinski gebasseerd op Lisp code van John "
+"Pezaris."
 
 #: hacks/config/attraction.xml.h:15 hacks/config/deluxe.xml.h:5
 #: hacks/config/lmorph.xml.h:7 hacks/config/pedal.xml.h:5
@@ -1756,7 +1765,7 @@ msgstr "Uitgaand"
 
 #: hacks/config/attraction.xml.h:22
 msgid "Polygons"
-msgstr "Polygons"
+msgstr "Polygonen"
 
 #: hacks/config/attraction.xml.h:23 hacks/config/spotlight.xml.h:3
 msgid "Radius"
@@ -1785,7 +1794,6 @@ msgid "Splines"
 msgstr "Splines"
 
 #: hacks/config/attraction.xml.h:30
-#, fuzzy
 msgid "Tails"
 msgstr "Sporen"
 
@@ -1796,19 +1804,17 @@ msgstr "Spoorlengte"
 
 #: hacks/config/atunnel.xml.h:1
 msgid "Atunnel"
-msgstr ""
+msgstr "Atunnel"
 
 #: hacks/config/atunnel.xml.h:2
-#, fuzzy
 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 and Roman Podobedov."
 msgstr ""
-"Toont een simulatie van Lemarchands Kubus. Lost zichzelf herhaaldelijk op. "
-"OpenGL benodigd en een computer met goede hardware ondersteuning voor "
-"texture-maps. Waarschuwing: opent af en toe dueren. Geschreven door Jamie "
-"Zawinski."
+"Tekent een animatie van een tunnel in GL. Is OpenGL nodig en "
+"een machine met snelle hardware voor texture maps. Geschreven "
+"door Eric Lassauge en Roman Podobedov."
 
 #: hacks/config/atunnel.xml.h:4 hacks/config/distort.xml.h:9
 #: hacks/config/glforestfire.xml.h:10 hacks/config/lament.xml.h:4
@@ -1822,37 +1828,36 @@ msgid "Untextured"
 msgstr "Zonder textuur"
 
 #: hacks/config/atunnel.xml.h:9
-#, fuzzy
 msgid "Use light"
-msgstr "Bliksem Gebruiken"
+msgstr "Gebruik Licht"
 
 #: hacks/config/barcode.xml.h:1
-#, fuzzy
 msgid "Barcode"
-msgstr "Bladeren"
+msgstr "Streepjescode"
 
 #: hacks/config/barcode.xml.h:2
 msgid "Barcode Clock (24 Hour)"
-msgstr ""
+msgstr "Spreekjescode Clock (24-uur)"
 
 #: hacks/config/barcode.xml.h:3
 msgid "Barcode Clock (AM/PM)"
-msgstr ""
+msgstr "Streepjescode Klok (AM/PM)"
 
 #: hacks/config/barcode.xml.h:5
 msgid "Scrolling Barcodes"
-msgstr ""
+msgstr "Zwevende Streepjescodes"
 
 #: hacks/config/barcode.xml.h:8
 msgid ""
 "This draws a random sequence of colorful barcodes scrolling across your "
 "screen. CONSUME! By Dan Bornstein."
 msgstr ""
+"Dit tekent een willekeurige streepjescode die over uw scherm zweven. "
+"CONSUMEER! Door Dan Bornstein."
 
 #: hacks/config/blaster.xml.h:1
-#, fuzzy
 msgid "Blaster"
-msgstr "Sneller"
+msgstr "Schieter"
 
 #: hacks/config/blaster.xml.h:2
 msgid ""
@@ -1860,6 +1865,9 @@ msgid ""
 "colored circles) doing battle in front of a moving star field. Written by "
 "Jonathan Lin."
 msgstr ""
+"Tekent een simulatie van vliegende ruimte vecht robots (slim "
+"vermomd als gekleurde cirkels) die vechten over een bewegend "
+"sterrenveld. Geschreven door Jonathan Lin."
 
 #: hacks/config/blaster.xml.h:5 hacks/config/penetrate.xml.h:4
 msgid "Lasers"
@@ -1879,20 +1887,19 @@ msgstr "90 graden draaisnelheid"
 
 #: hacks/config/blitspin.xml.h:2
 msgid "Bitmap to rotate"
-msgstr ""
+msgstr "Bitmap naar rotatie"
 
 #: hacks/config/blitspin.xml.h:3
-#, fuzzy
 msgid "BlitSpin"
 msgstr "Blitspin"
 
 #: hacks/config/blitspin.xml.h:5
 msgid "Fuzzy Rotation Speed"
-msgstr ""
+msgstr "Wazige Rotatie Snelheid"
 
 #: hacks/config/blitspin.xml.h:6
 msgid "Grab Screen"
-msgstr ""
+msgstr "Verkrijg Schermafdruk"
 
 #: hacks/config/blitspin.xml.h:8
 msgid ""
@@ -1906,58 +1913,71 @@ msgid ""
 "provide the image to use, as an XBM or XPM file, or tell it to grab a screen "
 "image and rotate that."
 msgstr ""
+"De 'blitspin' mode draait herhalen een bitmap 90 graden door middel "
+"van logische operaties: de bitmap wordt verdeelt in kwadranten en de "
+"kwadranten worden met de klok mee gedraaid. Dezelfde operatie "
+"wordt met steeds kleinere kwadranten parallel herhaald. Geschreven "
+"door Jamie Zawinski gebasseerd op toffe SmallTalk code gezien in "
+"ByteMagazine in 1981. Als je er naar kijkt lijkt het plaatje te veranderen "
+"in ruis en waarna het zich daarna weer opbouwt, maar geroteerd. U "
+"kan een plaatje meegeven wat gebruikt kan worden of het kan een "
+"plaatje van het scherm gebruiken en dat roteren."
 
 #: hacks/config/blocktube.xml.h:1
 msgid "BlockTube"
-msgstr ""
+msgstr "BlockTube"
 
 #: hacks/config/blocktube.xml.h:2
 msgid "Color Change Time"
-msgstr ""
+msgstr "Kleur Verander Tijd"
 
 #: hacks/config/blocktube.xml.h:3
 msgid "Color Hold Time"
-msgstr ""
+msgstr "Behoud Kleur Tijd"
 
 #: hacks/config/blocktube.xml.h:6
-#, fuzzy
 msgid "Reflective Blocks"
-msgstr "Spiegelingen"
+msgstr "Spiegelende Blokken"
 
 #: hacks/config/blocktube.xml.h:10
-#, fuzzy
 msgid "Solid Blocks"
-msgstr "Vaste Vloer"
+msgstr "Gevulde Blokken"
 
 #: hacks/config/blocktube.xml.h:12
 msgid ""
 "This hack draws a swirling, falling tunnel of reflective slabs. They fade "
 "from hue to hue. Written by Lars R. Damerow."
 msgstr ""
+"Deze mode tekend een draaiende, vallende tunnel van reflecterende "
+"blokken. Ze veranderen van kleur naar kleur. Geschreven door Lars "
+"R. Damerow."
 
 #: hacks/config/bouboule.xml.h:1
 msgid "Bouboule"
 msgstr "Bouboule"
 
 #: hacks/config/bouboule.xml.h:2 hacks/config/rocks.xml.h:3
-#, fuzzy
 msgid "Do Red/Blue 3D seperation"
-msgstr "Gebruik rood/blauw 3D scheiding."
+msgstr "Gebruik rood/blauw 3D scheiding"
 
 #: hacks/config/bouboule.xml.h:7
-#, fuzzy
 msgid "Number of Spots"
-msgstr "Aantal punten."
+msgstr "Aantal punten"
 
 #: hacks/config/bouboule.xml.h:10
 msgid ""
 "This draws what looks like a spinning, deforming baloon with varying-sized "
 "spots painted on its invisible surface. Written by Jeremie Petit."
 msgstr ""
+"Deze mode tekend iets wat lijkt op een draaiende, vervormende balon "
+"met puntjes die verschillen van grote op een onzichtbare bodem. "
+"Geschreven door Jeremie Petit."
 
 #: hacks/config/bouncingcow.xml.h:1
 msgid "A Cow. A Trampoline. Together, they fight crime. By Jamie Zawinski."
 msgstr ""
+"Een koe, een trampoline. Samen komen ze om onrecht te bestrijden. "
+"Door Jamie Zawinski."
 
 #: hacks/config/bouncingcow.xml.h:2 hacks/config/boxed.xml.h:1
 #: hacks/config/cubestorm.xml.h:1 hacks/config/flyingtoasters.xml.h:3
@@ -1971,46 +1991,43 @@ msgstr "Animatiesnelheid"
 
 #: hacks/config/bouncingcow.xml.h:3
 msgid "Beefy Cow"
-msgstr ""
+msgstr "Vlezige Koe"
 
 #: hacks/config/bouncingcow.xml.h:4
-#, fuzzy
 msgid "Bounce Speed"
-msgstr "Snelheid"
+msgstr "Stuitersnelheid"
 
 #: hacks/config/bouncingcow.xml.h:5
 msgid "BouncingCow"
-msgstr ""
+msgstr "StuiterendeKoe"
 
 #: hacks/config/bouncingcow.xml.h:7
 msgid "Herd"
-msgstr ""
+msgstr "Kudde"
 
 #: hacks/config/bouncingcow.xml.h:8
-#, fuzzy
 msgid "Moo"
-msgstr "Mono"
+msgstr "Boe"
 
 #: hacks/config/bouncingcow.xml.h:9
-#, fuzzy
 msgid "Number of Cows"
-msgstr "Aantal Kleuren"
+msgstr "Aantal Koeien"
 
 #: hacks/config/bouncingcow.xml.h:11
-#, fuzzy
 msgid "Wireframe Cow"
-msgstr "Draadraamwerk"
+msgstr "Draadraamwerk-Koe"
 
 #: hacks/config/boxed.xml.h:2
-#, fuzzy
 msgid "Boxed"
-msgstr "B.S.O.D."
+msgstr "In Balk"
 
 #: hacks/config/boxed.xml.h:3
 msgid ""
 "Draws a box full of 3D bouncing balls that explode. Written by Sander van "
 "Grieken."
 msgstr ""
+"Tekend een balk vol met 3D stuiterende ballen die ontploffen. "
+"Geschreven door Sander van Grieken."
 
 #: hacks/config/braid.xml.h:1
 msgid "Braid"
@@ -2021,6 +2038,8 @@ msgid ""
 "Draws random color-cycling inter-braided concentric circles. Written by John "
 "Neil."
 msgstr ""
+"Tekend willekeurige kleuren-draaiende-doorgevlochten-cirkels. "
+"Geschreven door Joh Neil."
 
 #: hacks/config/braid.xml.h:3 hacks/config/bsod.xml.h:9
 #: hacks/config/ccurve.xml.h:7 hacks/config/coral.xml.h:6
@@ -2067,7 +2086,7 @@ msgstr "AmigaDOS"
 
 #: hacks/config/bsod.xml.h:4
 msgid "Apple II"
-msgstr ""
+msgstr "Apple-II"
 
 #: hacks/config/bsod.xml.h:5
 msgid "Atari"
@@ -2093,12 +2112,11 @@ msgstr ""
 
 #: hacks/config/bsod.xml.h:10
 msgid "HPUX"
-msgstr ""
+msgstr "HPUX"
 
 #: hacks/config/bsod.xml.h:11
-#, fuzzy
 msgid "Linux"
-msgstr "Sparc Linux"
+msgstr "Linux"
 
 #: hacks/config/bsod.xml.h:12
 msgid "Mac Bomb"
@@ -2106,7 +2124,7 @@ msgstr "Mac Bomb"
 
 #: hacks/config/bsod.xml.h:13
 msgid "MacOS X"
-msgstr ""
+msgstr "MacOS-X"
 
 #: hacks/config/bsod.xml.h:14
 msgid "MacsBug"
@@ -2118,7 +2136,7 @@ msgstr "NCD X Terminal"
 
 #: hacks/config/bsod.xml.h:16
 msgid "OS/390"
-msgstr ""
+msgstr "OS/390"
 
 #: hacks/config/bsod.xml.h:17
 msgid "SCO"
@@ -2141,9 +2159,8 @@ msgid "Windows 2000"
 msgstr "Windows 2000"
 
 #: hacks/config/bsod.xml.h:22
-#, fuzzy
 msgid "Windows 3.1"
-msgstr "Windows"
+msgstr "Windows-3.1"
 
 #: hacks/config/bsod.xml.h:23
 msgid "Windows NT"
@@ -2158,6 +2175,8 @@ msgid ""
 "Draws a stream of rising, undulating 3D bubbles, rising toward the top of "
 "the screen, with nice specular reflections. Written by Richard Jones."
 msgstr ""
+"Tekend een stroom van bovendrijvende, samensmeltende 3D bubbels, "
+"met mooie reflecties. Geschreven door Richard Jones."
 
 #: hacks/config/bubbles.xml.h:1 hacks/config/xfishtank.xml.h:2
 msgid "Bubbles"
@@ -2184,14 +2203,12 @@ msgid "Don't hide bubbles when they pop"
 msgstr "Bellen niet verstoppen wanneer ze knappen"
 
 #: hacks/config/bubbles.xml.h:7
-#, fuzzy
 msgid "Draw circles instead of pixmap bubbles"
-msgstr "Teken cirkels in plaats van echte plaatjes."
+msgstr "Teken cirkels in plaats van plaatjes"
 
 #: hacks/config/bubbles.xml.h:9
-#, fuzzy
 msgid "Leave Trails"
-msgstr "Sporen"
+msgstr "Laat Sporen Achter"
 
 #: hacks/config/bubbles.xml.h:12
 msgid ""
@@ -2199,6 +2216,9 @@ msgid ""
 "small bubbles appear, and as they get closer to each other, they combine to "
 "form larger bubbles, which eventually pop. Written by James Macnicol."
 msgstr ""
+"Dit simulteerd het bubbelvormingsproces van kokend water. Eerst "
+"komen er kleine bubbels, en als ze dichter bij elkaar komen, vormen "
+"ze grotere, die uiteindelijke knappen. Geschreven door James-Macnicol."
 
 #: hacks/config/bumps.xml.h:1
 msgid ""
@@ -2224,6 +2244,9 @@ msgid ""
 "This draws Escher's ``Impossible Cage,'' a 3d analog of a moebius strip, and "
 "rotates it in three dimensions. Written by Marcelo Vianna."
 msgstr ""
+"Dit tekend Escher's \"Onmogelijke Kooi\": een 3d analoog van de "
+"moebius-strip en roteerd het in 3 dimensies. Geschreven door Marcelo "
+"Vianna."
 
 #: hacks/config/ccurve.xml.h:1
 msgid "0 seconds"
@@ -2257,10 +2280,14 @@ msgid ""
 "Generates self-similar linear fractals, including the classic ``C Curve.'' "
 "Written by Rick Campbell."
 msgstr ""
+"Genereerd zelf replicerende lineare fractals, met inbegrip van de "
+"klasieke \"C-Curve\". Geschreven door Rick Campbell."
 
 #: hacks/config/circuit.xml.h:1
 msgid "Animates a number of 3D electronic components. Written by Ben Buxton."
 msgstr ""
+"Animeerd een aantal electronische componenten in 3D. Geschreven door "
+"Ben Buxton."
 
 #: hacks/config/circuit.xml.h:2
 msgid "Circuit"
@@ -2269,12 +2296,11 @@ msgstr "Circuit"
 #: hacks/config/circuit.xml.h:3 hacks/config/gflux.xml.h:4
 #: hacks/config/pulsar.xml.h:2
 msgid "Directional Lighting"
-msgstr ""
+msgstr "Gerichte belichting"
 
 #: hacks/config/circuit.xml.h:5
-#, fuzzy
 msgid "Flat Coloring"
-msgstr "Doodlopende kleur"
+msgstr "Platte Kleuring"
 
 #: hacks/config/circuit.xml.h:6
 msgid "Parts"
@@ -2285,9 +2311,8 @@ msgid "Rotate"
 msgstr "Draaien"
 
 #: hacks/config/circuit.xml.h:8
-#, fuzzy
 msgid "Rotation Speed"
-msgstr "Rotatie"
+msgstr "Rotatie-Snelheid"
 
 #: hacks/config/circuit.xml.h:12 hacks/config/cubestorm.xml.h:9
 #: hacks/config/dangerball.xml.h:9 hacks/config/engine.xml.h:17
@@ -2302,7 +2327,7 @@ msgstr "Celgrootte"
 
 #: hacks/config/cloudlife.xml.h:2
 msgid "CloudLife"
-msgstr ""
+msgstr "CloudLife"
 
 #: hacks/config/cloudlife.xml.h:4
 msgid ""
@@ -2312,25 +2337,28 @@ msgid ""
 "instead of just sitting there burning a hole in your screen. Written by Don "
 "Marti."
 msgstr ""
+"Genereerd wolk-achtige formaties gebasseerd op een variant van "
+"Conway's Life. Het verschil is dat cellen een maximum leeftijd hebben, "
+"waarna ze tellen als 3 voor het populeren van de volgende generatie. "
+"Dit zorgt ervoor dat formaties met een lange tijdsduur ontploffen in "
+"plaats van enkel op dezelfde plek te blijven. Geschreven door Don "
+"Marti."
 
 #: hacks/config/cloudlife.xml.h:6
-#, fuzzy
 msgid "Initial Density"
-msgstr "Brokstukken op het scherm"
+msgstr "Voorafgaande Dichtheid"
 
 #: hacks/config/cloudlife.xml.h:9
-#, fuzzy
 msgid "Max Age"
-msgstr "Max Grootte"
+msgstr "Max-Leeftijd"
 
 #: hacks/config/cloudlife.xml.h:10
 msgid "Old"
-msgstr ""
+msgstr "Oud"
 
 #: hacks/config/cloudlife.xml.h:14
-#, fuzzy
 msgid "Young"
-msgstr "Lang"
+msgstr "Jong"
 
 #: hacks/config/compass.xml.h:1
 msgid "Compass"
@@ -2348,6 +2376,8 @@ msgid ""
 "This draws a compass, with all elements spinning about randomly, for that "
 "``lost and nauseous'' feeling. Written by Jamie Zawinski."
 msgstr ""
+"Dit tekend een kompas, met alle elementen willekeurig draaiend, voor "
+"het ``verdwaald-en-misselijk'' gevoel. Geschreven door Jamie Zawinski."
 
 #: hacks/config/coral.xml.h:1 hacks/config/deco.xml.h:1
 #: hacks/config/helix.xml.h:1 hacks/config/imsmap.xml.h:1
@@ -2375,7 +2405,6 @@ msgstr "Koraal"
 #: hacks/config/imsmap.xml.h:4 hacks/config/lavalite.xml.h:6
 #: hacks/config/pyro.xml.h:2 hacks/config/qix.xml.h:5
 #: hacks/config/squiral.xml.h:1 hacks/config/xearth.xml.h:4
-#, fuzzy
 msgid "Dense"
 msgstr "Dichter opeen"
 
@@ -2384,9 +2413,10 @@ msgid "Seeds"
 msgstr "Zaadjes"
 
 #: hacks/config/coral.xml.h:11
-msgid ""
-"Simulates coral growth, albeit somewhat slowly. Written by Frederick Roeber."
+msgid "Simulates coral growth, albeit somewhat slowly. Written by Frederick Roeber."
 msgstr ""
+"Simulteerd Koraalgroei, alhoewel wat langzamer. Geschreven door "
+"Frederick-Roeber."
 
 #: hacks/config/coral.xml.h:13 hacks/config/gflux.xml.h:13
 #: hacks/config/glblur.xml.h:16 hacks/config/glmatrix.xml.h:19
@@ -2406,6 +2436,8 @@ msgid ""
 "Draws fireworks and zooming, fading flares. By Tom Campbell. You can find it "
 "at &lt;http://cosmos.dnsalias.net/cosmos/&gt;"
 msgstr ""
+"Tekend vuurwerk en zooming vervagende schitteringen. Door Tom "
+"Campbell. Te vinden op &lt;http://cosmos.dnsalias.net/cosmos/&gt;"
 
 #: hacks/config/critical.xml.h:1
 msgid "Critical"
@@ -2416,6 +2448,9 @@ msgid ""
 "Draws a system of self-organizing lines. It starts out as random squiggles, "
 "but after a few iterations, order begins to appear. Written by Martin Pool."
 msgstr ""
+"Tekend een systeem van zelf-organiserende lijnen. Het begint met "
+"willekeurige dingetjes, maar na een paar iteraties begint er order "
+"te verschijnen. Geschreven door Martin Pool."
 
 #: hacks/config/crystal.xml.h:1
 msgid "Center on Screen"
@@ -2442,9 +2477,8 @@ msgid "Crystal"
 msgstr "Kristal"
 
 #: hacks/config/crystal.xml.h:4
-#, fuzzy
 msgid "Draw Cell"
-msgstr "Cel"
+msgstr "Teken Cel"
 
 #: hacks/config/crystal.xml.h:5 hacks/config/spheremonics.xml.h:3
 #: hacks/config/xearth.xml.h:6
@@ -2452,43 +2486,41 @@ msgid "Draw Grid"
 msgstr "Coördinaatrooster Tonen"
 
 #: hacks/config/crystal.xml.h:7
-#, fuzzy
 msgid "Horizontal Symmetries"
-msgstr "Horizontale gradiënt"
+msgstr "Horizontale symetrieën"
 
 #: hacks/config/crystal.xml.h:9
 msgid ""
 "Moving polygons, similar to a kaleidescope (more like a kaleidescope than "
 "the hack called `kaleid,' actually.) This one by Jouk Jansen."
 msgstr ""
+"Bewegende poligonen, gelijkend een kaleidescope (lijkt meer op een "
+"kaleidescope dan de mode genaamd `kaleid' eigenlijk). Deze is "
+"geschreven door Jouk Jansen."
 
 #: hacks/config/crystal.xml.h:14
 msgid "Vertical Symmetries"
 msgstr "Vertikale Symmetriën"
 
 #: hacks/config/cubenetic.xml.h:1
-#, fuzzy
 msgid "Boxes"
-msgstr "B.S.O.D."
+msgstr "Balken"
 
 #: hacks/config/cubenetic.xml.h:2
 msgid "Cubenetic"
 msgstr "Cubenetic"
 
 #: hacks/config/cubenetic.xml.h:3
-#, fuzzy
 msgid "Display Solid Colors"
-msgstr "Tekent een sonar scoop."
+msgstr "Tekent Vaste Kleuren"
 
 #: hacks/config/cubenetic.xml.h:4
-#, fuzzy
 msgid "Display Surface Patterns"
-msgstr "Teken ruis."
+msgstr "Teken Oppervlakte Patronen"
 
 #: hacks/config/cubenetic.xml.h:5
-#, fuzzy
 msgid "Display Wireframe"
-msgstr "Teken een arcadespelletje"
+msgstr "Teken een gaasnet"
 
 #: hacks/config/cubenetic.xml.h:6 hacks/config/glblur.xml.h:3
 #: hacks/config/glknots.xml.h:2 hacks/config/gltext.xml.h:2
@@ -2503,6 +2535,9 @@ msgid ""
 "undulating across their surfaces. It's sort of a cubist Lavalite. Written by "
 "Jamie Zawinski."
 msgstr ""
+"Tekend een pulserende collectie van overlappende rechthoeken met "
+"constant veranderende klodderachtige patronenen over de oppervlakten. "
+"Een soort van cubist lavalamp. Geschreven door Jamie Zawinski."
 
 #: hacks/config/cubenetic.xml.h:14 hacks/config/glblur.xml.h:6
 #: hacks/config/glknots.xml.h:8 hacks/config/gltext.xml.h:5
@@ -2555,15 +2590,15 @@ msgstr "Roteren rond alle drie assen."
 
 #: hacks/config/cubenetic.xml.h:25
 msgid "Surface Pattern Complexity"
-msgstr ""
+msgstr "Oppervlakte-Patroon-Complexiteit"
 
 #: hacks/config/cubenetic.xml.h:26
 msgid "Surface Pattern Overlap"
-msgstr ""
+msgstr "Oppervlakte-Patroon-Overlap"
 
 #: hacks/config/cubenetic.xml.h:27
 msgid "Surface Pattern Speed"
-msgstr ""
+msgstr "Oppervlakte-Patroon-Snelheid"
 
 #: hacks/config/cubenetic.xml.h:28 hacks/config/cubestorm.xml.h:13
 #: hacks/config/dangerball.xml.h:10 hacks/config/engine.xml.h:20
@@ -2572,35 +2607,32 @@ msgstr ""
 #: hacks/config/lavalite.xml.h:31 hacks/config/menger.xml.h:20
 #: hacks/config/molecule.xml.h:25 hacks/config/spheremonics.xml.h:25
 #: hacks/config/wander.xml.h:15
-#, fuzzy
 msgid "Wander"
-msgstr "handler:"
+msgstr "Doler"
 
 #: hacks/config/cubestorm.xml.h:2
-#, fuzzy
 msgid "CubeStorm"
-msgstr "Storm"
+msgstr "KubusStorm"
 
 #: hacks/config/cubestorm.xml.h:3
 msgid ""
 "Draws a series of rotating 3D boxes that intersect each other and eventually "
 "fill space. Written by Jamie Zawinski."
 msgstr ""
+"Tekend een serie van roterende 3D balken die elkaar doorkruizen en "
+"uiteindelijke de ruimte vullen. Geschreven door Jamie Zawinski."
 
 #: hacks/config/cubestorm.xml.h:5 hacks/config/glknots.xml.h:6
-#, fuzzy
 msgid "Motion Speed"
-msgstr "Rotatie"
+msgstr "Bewegings-Snelheid"
 
 #: hacks/config/cubestorm.xml.h:6
-#, fuzzy
 msgid "Number of Cubes"
-msgstr "Aantal Cirkels"
+msgstr "Aantal-Kubussen"
 
 #: hacks/config/cubestorm.xml.h:10
-#, fuzzy
 msgid "Strut Thickness"
-msgstr "Dikte"
+msgstr "Verstevigings-Dikte"
 
 #: hacks/config/cynosure.xml.h:1
 msgid ""
@@ -2609,6 +2641,10 @@ msgid ""
 "clone. That clone was discovered by Jamie Zawinski, and ported to C for "
 "inclusion here."
 msgstr ""
+"Een mode gelijkend aan `greynetic', maar minder frenetic. De eerste "
+"implementatie was door Stephen Linhart, daarna schreev Ozymandias "
+"G. Desiderata de Java Applet kloon. Deze kloon werd ontdekt door Jamie "
+"Zawinski, en vertaalde het naar C voor inbegrip hier."
 
 #: hacks/config/cynosure.xml.h:2
 msgid "Cynosure"
@@ -2630,78 +2666,73 @@ msgstr "Aantal Speerpunten"
 
 #: hacks/config/dangerball.xml.h:8
 msgid "Spike Growth"
-msgstr ""
+msgstr "Stekel groeisnelheid"
 
 #: hacks/config/decayscreen.xml.h:1
-#, fuzzy
 msgid "DecayScreen"
-msgstr "Schermverval"
+msgstr "SchermVerval"
 
 #: hacks/config/decayscreen.xml.h:3
 msgid "Fuzzy Melt"
-msgstr ""
+msgstr "Wazig Smelten"
 
 #: hacks/config/decayscreen.xml.h:4
 msgid "Melt Away From Center"
-msgstr ""
+msgstr "Smelt Vanuit Het Midden"
 
 #: hacks/config/decayscreen.xml.h:5
 msgid "Melt Down"
-msgstr ""
+msgstr "Smelt Naar Beneden"
 
 #: hacks/config/decayscreen.xml.h:6
 msgid "Melt Down, Left"
-msgstr ""
+msgstr "Smelt Naar Onder, Links"
 
 #: hacks/config/decayscreen.xml.h:7
 msgid "Melt Down, Right"
-msgstr ""
+msgstr "Smelt Naar Onder, Rechts"
 
 #: hacks/config/decayscreen.xml.h:8
-#, fuzzy
 msgid "Melt Left"
-msgstr "Links"
+msgstr "Smelt Links"
 
 #: hacks/config/decayscreen.xml.h:9
-#, fuzzy
 msgid "Melt Right"
-msgstr "Rechts"
+msgstr "Smelt Rechts"
 
 #: hacks/config/decayscreen.xml.h:10
 msgid "Melt Towards Center"
-msgstr ""
+msgstr "Smelt Naar Midden"
 
 #: hacks/config/decayscreen.xml.h:11
 msgid "Melt Up"
-msgstr ""
+msgstr "Smelt naar Boven"
 
 #: hacks/config/decayscreen.xml.h:12
 msgid "Melt Up, Left"
-msgstr ""
+msgstr "Smelt Naar Boven, Links"
 
 #: hacks/config/decayscreen.xml.h:13
 msgid "Melt Up, Right"
-msgstr ""
+msgstr "Smelt naar Boven, Rechts"
 
 #: hacks/config/decayscreen.xml.h:14
 msgid "Melty Melt"
-msgstr ""
+msgstr "Smelterige Smelt"
 
 #: hacks/config/decayscreen.xml.h:15
-#, fuzzy
 msgid "Random Melt Style"
-msgstr "Willekeurige Instellingen"
+msgstr "Willekeurige Smeltstijl"
 
 #: hacks/config/decayscreen.xml.h:16
 msgid "Shuffle Melt"
-msgstr ""
+msgstr "Shuffle Smelt"
 
 #: hacks/config/decayscreen.xml.h:19
 msgid "Stretchy Melt"
-msgstr ""
+msgstr "Rekbare Smelt"
 
 #: hacks/config/decayscreen.xml.h:20
-#, fuzzy
 msgid ""
 "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 "
@@ -2725,9 +2756,8 @@ msgid "Max Depth"
 msgstr "Max Diepte"
 
 #: hacks/config/deco.xml.h:7
-#, fuzzy
 msgid "Min Size"
-msgstr "Grootte"
+msgstr "Minimale Grootte"
 
 #: hacks/config/deco.xml.h:9
 msgid ""
@@ -2760,7 +2790,6 @@ msgid "Transparency"
 msgstr "Transparantie"
 
 #: hacks/config/demon.xml.h:1
-#, fuzzy
 msgid ""
 "A cellular automaton that starts with a random field, and organizes it into "
 "stripes and spirals. Written by David Bagley."
@@ -2773,9 +2802,8 @@ msgid "Demon"
 msgstr "Duivel"
 
 #: hacks/config/demon.xml.h:11
-#, fuzzy
 msgid "States"
-msgstr "Stappen"
+msgstr "Toestanden"
 
 #: hacks/config/discrete.xml.h:1
 msgid "Discrete"
@@ -2800,14 +2828,12 @@ msgid "Distort"
 msgstr "Verstoor"
 
 #: hacks/config/distort.xml.h:6
-#, fuzzy
 msgid "Lens Count"
-msgstr "Aantal"
+msgstr "Aantal Lensen"
 
 #: hacks/config/distort.xml.h:7
-#, fuzzy
 msgid "Lens Size"
-msgstr "Grootte"
+msgstr "Lens Grootte"
 
 #: hacks/config/distort.xml.h:8
 msgid "Magnify"
@@ -2819,7 +2845,7 @@ msgstr "Reflecteren"
 
 #: hacks/config/distort.xml.h:14
 msgid "Swamp Thing"
-msgstr ""
+msgstr "Moeras Ding"
 
 #: hacks/config/distort.xml.h:15
 msgid ""
@@ -2833,7 +2859,7 @@ msgstr ""
 #: hacks/config/rotzoomer.xml.h:10 hacks/config/swirl.xml.h:10
 #: hacks/config/twang.xml.h:15 hacks/config/xflame.xml.h:7
 msgid "Use Shared Memory"
-msgstr ""
+msgstr "Gebruik Gedeeld Geheugen"
 
 #: hacks/config/distort.xml.h:17
 msgid "Vortex"
@@ -2844,13 +2870,12 @@ msgid "Drift"
 msgstr "Drijven"
 
 #: hacks/config/drift.xml.h:4
-#, fuzzy
 msgid "Fractal Growth"
-msgstr "Fractals moeten groeien."
+msgstr "Fractal Groei"
 
 #: hacks/config/drift.xml.h:5
 msgid "High Dimensional Sphere"
-msgstr ""
+msgstr "Hogere Dimensie Bol"
 
 #: hacks/config/drift.xml.h:6
 msgid ""
@@ -2861,7 +2886,7 @@ msgstr ""
 
 #: hacks/config/drift.xml.h:7
 msgid "Lissojous Figures"
-msgstr ""
+msgstr "Lissojous Figuren"
 
 #: hacks/config/electricsheep.xml.h:1
 msgid ""
@@ -2876,33 +2901,31 @@ msgstr ""
 
 #: hacks/config/electricsheep.xml.h:2
 msgid "Frame Rate"
-msgstr ""
+msgstr "Beelden per Seconden"
 
 #: hacks/config/electricsheep.xml.h:3
-#, fuzzy
 msgid "Hide Sheep"
-msgstr "Schijfscherm"
+msgstr "Verberg Schapen"
 
 #: hacks/config/electricsheep.xml.h:4
 msgid "Megabytes of Local Sheep Storage"
-msgstr ""
+msgstr "Megabytes aan Locale Schapen Bewaren"
 
 #: hacks/config/electricsheep.xml.h:5
 msgid "Nickname"
-msgstr ""
+msgstr "Bijnaam (Nickname)"
 
 #: hacks/config/electricsheep.xml.h:6
 msgid "Repititions of each Sheep"
-msgstr ""
+msgstr "Herhalingen van ieder Schaap"
 
 #: hacks/config/electricsheep.xml.h:7
-#, fuzzy
 msgid "Standalone"
-msgstr "Standaard"
+msgstr "Op zichzelf staand"
 
 #: hacks/config/electricsheep.xml.h:8
 msgid "URL"
-msgstr ""
+msgstr "URL"
 
 #: hacks/config/endgame.xml.h:1
 msgid ""
@@ -2912,35 +2935,34 @@ msgstr ""
 
 #: hacks/config/endgame.xml.h:2
 msgid "Endgame"
-msgstr "Endgame"
+msgstr "Eindspel"
 
 #: hacks/config/engine.xml.h:1
 msgid "Audi Quattro (5 cylinders)"
-msgstr ""
+msgstr "Audi Quattro (5 cylinders)"
 
 #: hacks/config/engine.xml.h:2
 msgid "BMW M3 (4 cylinders)"
-msgstr ""
+msgstr "BMW-M3 (4 cylinders)"
 
 #: hacks/config/engine.xml.h:3
 msgid "BMW M5 (6 cylinders)"
-msgstr ""
+msgstr "BMW M5 (6 cylinders)"
 
 #: hacks/config/engine.xml.h:4
 msgid "Corvette Z06 (8 cylinders, V)"
-msgstr ""
+msgstr "Corvette Z06 (8 cylinders, V)"
 
 #: hacks/config/engine.xml.h:5
 msgid "Dodge Viper (10 cylinders, V)"
-msgstr ""
+msgstr "Dodge Viper (10 cylinders, V)"
 
 #: hacks/config/engine.xml.h:6
-#, fuzzy
 msgid ""
 "Draws a simple model of an engine that floats around the screen. Written by "
 "Ben Buxton and Ed Beroset."
 msgstr ""
-"Toont een eenvoudige viertaktmotor die over het scherm zweeft. Geschreven "
+"Toont een motor die over het scherm zweeft. Geschreven "
 "door Ben Buxton."
 
 #: hacks/config/engine.xml.h:7
@@ -2949,43 +2971,41 @@ msgstr "Motor"
 
 #: hacks/config/engine.xml.h:9
 msgid "Honda Insight (3 cylinders)"
-msgstr ""
+msgstr "Honda Insight (3 cylinders)"
 
 #: hacks/config/engine.xml.h:10
 msgid "Jaguar XKE (12 cylinders, V)"
-msgstr ""
+msgstr "Jaguar XKE (12 cylinders, V)"
 
 #: hacks/config/engine.xml.h:11
 msgid "Porsche 911 (6 cylinders, flat)"
-msgstr ""
+msgstr "Porsche 911 (6 cylinders, plat)"
 
 #: hacks/config/engine.xml.h:12
-#, fuzzy
 msgid "Random Engine"
-msgstr "Willekeurig"
+msgstr "Willekeurige Motor"
 
 #: hacks/config/engine.xml.h:13
 msgid "Show Engine Name"
-msgstr ""
+msgstr "Toon naam van Motor"
 
 #: hacks/config/engine.xml.h:18
 msgid "Subaru XT (6 cylinders, V)"
-msgstr ""
+msgstr "Subaru XT (6 cylinders, V)"
 
 #: hacks/config/engine.xml.h:19
 msgid "VW Beetle (4 cylinders, flat)"
-msgstr ""
+msgstr "VW Kever (4 cylinders, plat)"
 
 #: hacks/config/epicycle.xml.h:4
 msgid "Epicycle"
-msgstr "Epicycle"
+msgstr "Epicikel"
 
 #: hacks/config/epicycle.xml.h:6
 msgid "Harmonics"
-msgstr "Harmonischen"
+msgstr "Harmonieen"
 
 #: hacks/config/epicycle.xml.h:12
-#, fuzzy
 msgid ""
 "This program draws the path traced out by a point on the edge of a circle. "
 "That circle rotates around a point on the rim of another circle, and so on, "
@@ -2997,16 +3017,15 @@ msgstr ""
 
 #: hacks/config/eruption.xml.h:1
 msgid "An exposive version of XFlame. By W.P. van Paassen."
-msgstr ""
+msgstr "Een explosieve versie van XFlame, Door W.P. van Paassen"
 
 #: hacks/config/eruption.xml.h:2
 msgid "Cooling factor"
-msgstr ""
+msgstr "Afkoel factor"
 
 #: hacks/config/eruption.xml.h:4
-#, fuzzy
 msgid "Eruption"
-msgstr "Extensie"
+msgstr "Eruptie"
 
 #: hacks/config/eruption.xml.h:7 hacks/config/fluidballs.xml.h:9
 #: hacks/config/qix.xml.h:9 hacks/config/speedmine.xml.h:4
@@ -3015,47 +3034,43 @@ msgstr "Zwaartekracht"
 
 #: hacks/config/eruption.xml.h:8
 msgid "Heat"
-msgstr ""
+msgstr "Hitte"
 
 #: hacks/config/eruption.xml.h:9
-#, fuzzy
 msgid "Inferno"
-msgstr "Interferentie"
+msgstr "Helse Brand"
 
 #: hacks/config/eruption.xml.h:10
 msgid "Little"
-msgstr ""
+msgstr "Beetje"
 
 #: hacks/config/eruption.xml.h:13
 msgid "Negative"
-msgstr ""
+msgstr "Negatief"
 
 #: hacks/config/eruption.xml.h:15
-#, fuzzy
 msgid "Number of Particles"
-msgstr "Aantal Cirkels"
+msgstr "Aantal Deeltjes"
 
 #: hacks/config/eruption.xml.h:16
-#, fuzzy
 msgid "Pleasant"
-msgstr "GLPlaneet"
+msgstr "Aangenaam"
 
 #: hacks/config/eruption.xml.h:17
 msgid "Positive"
-msgstr ""
+msgstr "Positief"
 
 #: hacks/config/euler2d.xml.h:2
 msgid "Euler2d"
 msgstr "Euler2d"
 
 #: hacks/config/euler2d.xml.h:10 hacks/config/whirlwindwarp.xml.h:5
-#, fuzzy
 msgid "Particles"
-msgstr "Brokstukken op het scherm"
+msgstr "Deeltjes"
 
 #: hacks/config/euler2d.xml.h:11
 msgid "Power"
-msgstr "Macht"
+msgstr "Kracht"
 
 #: hacks/config/euler2d.xml.h:13
 msgid ""
@@ -3071,9 +3086,8 @@ msgid ""
 msgstr ""
 
 #: hacks/config/extrusion.xml.h:2
-#, fuzzy
 msgid "Extrusion"
-msgstr "Extensie"
+msgstr "Extractie"
 
 #: hacks/config/extrusion.xml.h:4
 msgid "Helix 2"
@@ -3100,14 +3114,12 @@ msgid "Screw"
 msgstr "Schroef"
 
 #: hacks/config/extrusion.xml.h:14
-#, fuzzy
 msgid "Taper"
-msgstr "Van"
+msgstr "Taps"
 
 #: hacks/config/extrusion.xml.h:15
-#, fuzzy
 msgid "Texture Image"
-msgstr "Gecentreerd."
+msgstr "Textureer Plaatje"
 
 #: hacks/config/extrusion.xml.h:16
 msgid "Twistoid"
@@ -3116,11 +3128,11 @@ msgstr "Draaier"
 #: hacks/config/extrusion.xml.h:17 hacks/config/glplanet.xml.h:9
 #: hacks/config/pulsar.xml.h:19
 msgid "Use Flat Coloring"
-msgstr ""
+msgstr "Gebruik Platte Kleuring"
 
 #: hacks/config/extrusion.xml.h:18 hacks/config/glplanet.xml.h:10
 msgid "Use Lighting"
-msgstr "Bliksem Gebruiken"
+msgstr "Gebruik Verlichting"
 
 #: hacks/config/fadeplot.xml.h:2
 msgid ""
@@ -3131,7 +3143,6 @@ msgstr ""
 "Geschreven door Bas van Gaalen en Charles Vidal.."
 
 #: hacks/config/fadeplot.xml.h:3
-#, fuzzy
 msgid "FadePlot"
 msgstr "Waai-lint"
 
@@ -3189,9 +3200,8 @@ msgid "Number of Fractals"
 msgstr "Aantal Fractals"
 
 #: hacks/config/flipscreen3d.xml.h:2
-#, fuzzy
 msgid "Flipscreen3d"
-msgstr "Schijfscherm"
+msgstr "DraaiScherm3D"
 
 #: hacks/config/flipscreen3d.xml.h:3
 msgid ""
@@ -3211,7 +3221,7 @@ msgstr ""
 
 #: hacks/config/flow.xml.h:5
 msgid "Flow"
-msgstr "Flow"
+msgstr "Stroming"
 
 #: hacks/config/flow.xml.h:6
 msgid "Freeze Some Bees"
@@ -3227,7 +3237,7 @@ msgstr "Om de Aantrekker Heendraaien"
 
 #: hacks/config/flow.xml.h:12
 msgid "Show Bounding Box"
-msgstr "Toon Begrensingskubus."
+msgstr "Toon Begrensingsbalk"
 
 #: hacks/config/flow.xml.h:14
 msgid "Slow Bees with Antifreeze"
@@ -3238,22 +3248,20 @@ msgid "Zoom In and Out"
 msgstr "In en Uitzoomen"
 
 #: hacks/config/fluidballs.xml.h:1
-#, fuzzy
 msgid "      Freefall"
-msgstr "Vrije val"
+msgstr "     Vrije val"
 
 #: hacks/config/fluidballs.xml.h:2
 msgid "Ball Size"
-msgstr "Grootte"
+msgstr "Bal Grootte"
 
 #: hacks/config/fluidballs.xml.h:4
-#, fuzzy
 msgid "Clay"
-msgstr "Vertraging"
+msgstr "Klei"
 
 #: hacks/config/fluidballs.xml.h:7
 msgid "FluidBalls"
-msgstr "FluidBalls"
+msgstr "VloeibareBallen"
 
 #: hacks/config/fluidballs.xml.h:8 hacks/config/twang.xml.h:4
 msgid "Friction"
@@ -3281,23 +3289,20 @@ msgstr ""
 "Jamie Zawinski."
 
 #: hacks/config/fluidballs.xml.h:15
-#, fuzzy
 msgid "Rubber"
-msgstr "Zeepbellen"
+msgstr "Rubber"
 
 #: hacks/config/fluidballs.xml.h:16
-#, fuzzy
 msgid "Shake Box"
-msgstr "Shadebobs"
+msgstr "Schuddende Doos"
 
 #: hacks/config/fluidballs.xml.h:21 hacks/config/glforestfire.xml.h:16
-#, fuzzy
 msgid "Still"
-msgstr "Beweging"
+msgstr "Foto"
 
 #: hacks/config/fluidballs.xml.h:22
 msgid "Various Ball Sizes"
-msgstr ""
+msgstr "Verschillende Bal Grootten"
 
 #: hacks/config/fluidballs.xml.h:23
 msgid "Wind"
@@ -3305,33 +3310,31 @@ msgstr "Wind"
 
 #: hacks/config/flurry.xml.h:1
 msgid "Binary"
-msgstr ""
+msgstr "Binair"
 
 #: hacks/config/flurry.xml.h:2
-#, fuzzy
 msgid "Classic"
-msgstr "Glas"
+msgstr "Klaziek"
 
 #: hacks/config/flurry.xml.h:3
-#, fuzzy
 msgid "Fire"
-msgstr "_Bestand"
+msgstr "Vuur"
 
 #: hacks/config/flurry.xml.h:4
 msgid "Flurry"
-msgstr ""
+msgstr "Vlagen"
 
 #: hacks/config/flurry.xml.h:5
 msgid "Insane"
-msgstr ""
+msgstr "Gestoord"
 
 #: hacks/config/flurry.xml.h:6
 msgid "Psychedelic"
-msgstr ""
+msgstr "Psychedelisch"
 
 #: hacks/config/flurry.xml.h:7
 msgid "RGB"
-msgstr ""
+msgstr "RGB"
 
 #: hacks/config/flurry.xml.h:8 hacks/config/jigglypuff.xml.h:13
 #: hacks/config/sballs.xml.h:10 hacks/config/whirlygig.xml.h:12
@@ -3347,9 +3350,8 @@ msgid ""
 msgstr ""
 
 #: hacks/config/flurry.xml.h:11
-#, fuzzy
 msgid "Water"
-msgstr "handler:"
+msgstr "Water"
 
 #: hacks/config/flyingtoasters.xml.h:1
 msgid ""
@@ -3359,17 +3361,16 @@ msgid ""
 msgstr ""
 
 #: hacks/config/flyingtoasters.xml.h:2
-#, fuzzy
 msgid "Air Speed"
-msgstr "Animatiesnelheid"
+msgstr "Luchtsnelheid"
 
 #: hacks/config/flyingtoasters.xml.h:4
 msgid "Chrome Toasters"
-msgstr ""
+msgstr "Chromen Broodroosters"
 
 #: hacks/config/flyingtoasters.xml.h:6
 msgid "Flying Toasters"
-msgstr ""
+msgstr "Vliegende Broodroosters"
 
 #: hacks/config/flyingtoasters.xml.h:7 hacks/config/glslideshow.xml.h:16
 #: hacks/config/jigglypuff.xml.h:12 hacks/config/juggle.xml.h:6
@@ -3378,24 +3379,20 @@ msgid "None"
 msgstr "Geen"
 
 #: hacks/config/flyingtoasters.xml.h:8
-#, fuzzy
 msgid "Number of Slices"
-msgstr "Aantal Cirkels"
+msgstr "Aantal Sneden"
 
 #: hacks/config/flyingtoasters.xml.h:9
-#, fuzzy
 msgid "Number of Toasters"
-msgstr "Aantal punten."
+msgstr "Aantal broodroosters"
 
 #: hacks/config/flyingtoasters.xml.h:12
-#, fuzzy
 msgid "Solid Colors"
-msgstr "Vaste Vloer"
+msgstr "Vaste Kleuren"
 
 #: hacks/config/flyingtoasters.xml.h:13
-#, fuzzy
 msgid "Swarm"
-msgstr "XRaySwarm"
+msgstr "Zwerm"
 
 #: hacks/config/forest.xml.h:2 hacks/config/glforestfire.xml.h:6
 msgid "Forest"
@@ -3409,7 +3406,7 @@ msgstr ""
 
 #: hacks/config/galaxy.xml.h:4
 msgid "Galaxy"
-msgstr "Melkweg"
+msgstr "Sterrenstelsel"
 
 #: hacks/config/galaxy.xml.h:9 hacks/config/lisa.xml.h:7
 #: hacks/config/lissie.xml.h:8 hacks/config/loop.xml.h:6
@@ -3435,9 +3432,8 @@ msgid "Planetary Gear System"
 msgstr "Planair Raderwerk"
 
 #: hacks/config/gears.xml.h:5 hacks/config/goop.xml.h:9
-#, fuzzy
 msgid "Rotational Speed"
-msgstr "Rotatie"
+msgstr "Rotatiesnelheid"
 
 #: hacks/config/gears.xml.h:9
 msgid ""
@@ -3461,28 +3457,24 @@ msgid ""
 msgstr ""
 
 #: hacks/config/gflux.xml.h:7
-#, fuzzy
 msgid "Flat Lighting"
-msgstr "Bliksem"
+msgstr "Platte Belichting"
 
 #: hacks/config/gflux.xml.h:8
 msgid "GFlux"
 msgstr "GFlux"
 
 #: hacks/config/gflux.xml.h:9
-#, fuzzy
 msgid "Mesh Density"
-msgstr "Dichtheid"
+msgstr "Draadraamwerk Dichtheid"
 
 #: hacks/config/gflux.xml.h:10
-#, fuzzy
 msgid "Screen Image"
-msgstr "Scherm Beveiliging"
+msgstr "Beeld van Scherm"
 
 #: hacks/config/gflux.xml.h:14 hacks/config/interference.xml.h:18
-#, fuzzy
 msgid "Wave Speed"
-msgstr "Snelheid"
+msgstr "Golfsnelheid"
 
 #: hacks/config/gflux.xml.h:15 hacks/config/glmatrix.xml.h:20
 msgid "Waves"
@@ -3490,15 +3482,15 @@ msgstr "Golven"
 
 #: hacks/config/gflux.xml.h:16
 msgid "Wire Mesh"
-msgstr ""
+msgstr "Draadraamwerk"
 
 #: hacks/config/glblur.xml.h:1
 msgid "Blur Smoothness"
-msgstr ""
+msgstr "Gladheid Verdoezeling"
 
 #: hacks/config/glblur.xml.h:5
 msgid "GLBlur"
-msgstr ""
+msgstr "GLVerdoezelen"
 
 #: hacks/config/glblur.xml.h:18
 msgid ""
@@ -3512,9 +3504,8 @@ msgid ""
 msgstr ""
 
 #: hacks/config/glforestfire.xml.h:2
-#, fuzzy
 msgid "Desert"
-msgstr "Dichter opeen"
+msgstr "Woestijn"
 
 #: hacks/config/glforestfire.xml.h:3
 msgid ""
@@ -3528,14 +3519,12 @@ msgid "Fog"
 msgstr "Mist"
 
 #: hacks/config/glforestfire.xml.h:7
-#, fuzzy
 msgid "GLForestFire"
-msgstr "Bos"
+msgstr "GLBosbrand"
 
 #: hacks/config/glforestfire.xml.h:8
-#, fuzzy
 msgid "Huge Fire"
-msgstr "Keuze Lettertype"
+msgstr "Groot Vuur"
 
 #: hacks/config/glforestfire.xml.h:9
 msgid "No shadow"
@@ -3551,12 +3540,11 @@ msgstr "Regen"
 
 #: hacks/config/glforestfire.xml.h:17
 msgid "Track mouse"
-msgstr ""
+msgstr "Volg Muis"
 
 #: hacks/config/glknots.xml.h:4
-#, fuzzy
 msgid "GLKnots"
-msgstr "Punten"
+msgstr "GLKnopen"
 
 #: hacks/config/glknots.xml.h:5
 msgid ""
@@ -3570,9 +3558,8 @@ msgid "Resolution"
 msgstr "Resolutie"
 
 #: hacks/config/glknots.xml.h:15
-#, fuzzy
 msgid "Segmented"
-msgstr "Segmenten"
+msgstr "Gesegmenteerd"
 
 #: hacks/config/glknots.xml.h:18 hacks/config/lavalite.xml.h:28
 msgid "Smooth"
@@ -3583,19 +3570,16 @@ msgid "Binary Encoding"
 msgstr "Binaire Tekenset"
 
 #: hacks/config/glmatrix.xml.h:4
-#, fuzzy
 msgid "Draw Glyphs"
-msgstr "Toon Labels"
+msgstr "Toon Tekens"
 
 #: hacks/config/glmatrix.xml.h:5
-#, fuzzy
 msgid "Draw Outlines"
-msgstr "Mieren tonen"
+msgstr "Toon Kaders"
 
 #: hacks/config/glmatrix.xml.h:6
-#, fuzzy
 msgid "Draw Solid Boxes"
-msgstr "Atoombindingen Weergeven"
+msgstr "Toon Gevulde Balken"
 
 #: hacks/config/glmatrix.xml.h:7
 msgid ""
@@ -3606,23 +3590,20 @@ msgid ""
 msgstr ""
 
 #: hacks/config/glmatrix.xml.h:10
-#, fuzzy
 msgid "GLMatrix"
-msgstr "Xmatrix"
+msgstr "GLMatrix"
 
 #: hacks/config/glmatrix.xml.h:11 hacks/config/xmatrix.xml.h:7
 msgid "Genetic Encoding"
 msgstr "Genetische Tekenset"
 
 #: hacks/config/glmatrix.xml.h:12
-#, fuzzy
 msgid "Glyph Density"
-msgstr "Dichtheid"
+msgstr "Teken Dichtheid"
 
 #: hacks/config/glmatrix.xml.h:13
-#, fuzzy
 msgid "Glyph Speed"
-msgstr "Snelheid"
+msgstr "Teken Snelheid"
 
 #: hacks/config/glmatrix.xml.h:14 hacks/config/xmatrix.xml.h:8
 msgid "Hexadecimal Encoding"
@@ -3634,7 +3615,7 @@ msgstr "Matrix Tekenset"
 
 #: hacks/config/glmatrix.xml.h:16
 msgid "Panning"
-msgstr ""
+msgstr "Meedraaien"
 
 #: hacks/config/glplanet.xml.h:1
 msgid ""
@@ -3663,31 +3644,29 @@ msgid "30 Seconds"
 msgstr "30 Seconden"
 
 #: hacks/config/glslideshow.xml.h:6
-#, fuzzy
 msgid "5 Minutes"
-msgstr "1 Minuut"
+msgstr "5 Minuten"
 
 #: hacks/config/glslideshow.xml.h:8
 #, no-c-format
 msgid "50%"
-msgstr ""
+msgstr "50%"
 
 #: hacks/config/glslideshow.xml.h:9
 msgid "Always show at least this much of the image:"
-msgstr ""
+msgstr "Toon altijd zoveel van het plaatje:"
 
 #: hacks/config/glslideshow.xml.h:10
-#, fuzzy
 msgid "Crossfade Duration:"
-msgstr "Duur"
+msgstr "Crossfade Duur:"
 
 #: hacks/config/glslideshow.xml.h:11
 msgid "Frame Rate:"
-msgstr ""
+msgstr "Beelden/seconde:"
 
 #: hacks/config/glslideshow.xml.h:12
 msgid "GLSlideshow"
-msgstr ""
+msgstr "GLDiaVoorstelling"
 
 #: hacks/config/glslideshow.xml.h:14
 msgid ""
@@ -3699,13 +3678,12 @@ msgid ""
 msgstr ""
 
 #: hacks/config/glslideshow.xml.h:17
-#, fuzzy
 msgid "Pan/Zoom Duration:"
-msgstr "Duur"
+msgstr "Meedraai/Zoom Duur:"
 
 #: hacks/config/glslideshow.xml.h:19
 msgid "Time until loading a new image:"
-msgstr ""
+msgstr "Tijd tot laden nieuw plaatje:"
 
 #: hacks/config/glsnake.xml.h:1 hacks/config/lavalite.xml.h:1
 msgid "1"
@@ -3719,30 +3697,27 @@ msgstr ""
 
 #: hacks/config/glsnake.xml.h:6
 msgid "GlSnake"
-msgstr ""
+msgstr "GLSlang"
 
 #: hacks/config/glsnake.xml.h:7
-#, fuzzy
 msgid "Loose"
-msgstr "Lus"
+msgstr "Los"
 
 #: hacks/config/glsnake.xml.h:8
 msgid "Packing"
-msgstr ""
+msgstr "Samenpakken"
 
 #: hacks/config/glsnake.xml.h:9
-#, fuzzy
 msgid "Scary Colors"
-msgstr "Secundaire kleur"
+msgstr "Enge Kleuren"
 
 #: hacks/config/glsnake.xml.h:11
 msgid "Show Labels"
-msgstr "Labes tonen"
+msgstr "Labels tonen"
 
 #: hacks/config/glsnake.xml.h:14
-#, fuzzy
 msgid "Tight"
-msgstr "Rechts"
+msgstr "Dicht Opeen"
 
 #: hacks/config/glsnake.xml.h:15 hacks/config/rocks.xml.h:13
 msgid "Velocity"
@@ -3785,9 +3760,8 @@ msgid "Additive Colors (reflected light)"
 msgstr "Additieve Kleuren (gereflecteerd licht)"
 
 #: hacks/config/goop.xml.h:2
-#, fuzzy
 msgid "Blob Count"
-msgstr "Aantal"
+msgstr "Aantal Klodders"
 
 #: hacks/config/goop.xml.h:3
 msgid "Elasticity"
@@ -3802,13 +3776,12 @@ msgid "Opaque Blobs"
 msgstr "Ondoorzichtige vlekken"
 
 #: hacks/config/goop.xml.h:12
-#, fuzzy
 msgid "Speed Limit"
-msgstr "Snelheid"
+msgstr "Snelheidslimiet"
 
 #: hacks/config/goop.xml.h:13
 msgid "Subtractive Colors (transmitted light)"
-msgstr ""
+msgstr "Nietdoorlatende Kleuren (verstuurde licht)"
 
 #: hacks/config/goop.xml.h:14
 msgid ""
@@ -3826,23 +3799,20 @@ msgid "Transparent Blobs"
 msgstr "Doorzichtige vlekken"
 
 #: hacks/config/goop.xml.h:16
-#, fuzzy
 msgid "XOR Blobs"
-msgstr "Klont"
+msgstr "XOR-Klonten"
 
 #: hacks/config/grav.xml.h:3
 msgid "Grav"
 msgstr "Zwaartekracht"
 
 #: hacks/config/grav.xml.h:6
-#, fuzzy
 msgid "Object Trails"
-msgstr "Sporen"
+msgstr "Object Sporen"
 
 #: hacks/config/grav.xml.h:7
-#, fuzzy
 msgid "Orbital Decay"
-msgstr "Omloopbaan moet vervallen."
+msgstr "Verval Omloopbaan"
 
 #: hacks/config/grav.xml.h:10
 msgid ""
@@ -3855,24 +3825,22 @@ msgid "Greynetic"
 msgstr "Greynetic"
 
 #: hacks/config/greynetic.xml.h:5
-msgid ""
-"This draws random colored and stippled rectangles. Written by Jamie Zawinski."
+msgid "This draws random colored and stippled rectangles. Written by Jamie Zawinski."
 msgstr ""
 "Deze toont willekeurig gekleurde en gestippelde rechthoeken. Geschreven door "
 "Jamie Zawinski."
 
 #: hacks/config/halftone.xml.h:1
 msgid "Delay (Large = low cpu load)"
-msgstr ""
+msgstr "Tijdsinterval (Groot = laag processorgebruik)"
 
 #: hacks/config/halftone.xml.h:2
 msgid "Dot fill factor"
-msgstr ""
+msgstr "Vullingsfactor Stippen"
 
 #: hacks/config/halftone.xml.h:3
-#, fuzzy
 msgid "Dot size"
-msgstr "Grootte Van Mier"
+msgstr "Stip grootte"
 
 #: hacks/config/halftone.xml.h:4
 msgid ""
@@ -3883,37 +3851,32 @@ msgid ""
 msgstr ""
 
 #: hacks/config/halftone.xml.h:5
-#, fuzzy
 msgid "Gravity points"
-msgstr "Zwaartekracht"
+msgstr "Zwaartekrachtspunten"
 
 #: hacks/config/halftone.xml.h:6
-#, fuzzy
 msgid "Halftone"
-msgstr "Halo"
+msgstr "Halftoon"
 
 #: hacks/config/halftone.xml.h:10
 msgid "Maximum mass"
-msgstr ""
+msgstr "Maximum Massa"
 
 #: hacks/config/halftone.xml.h:11
-#, fuzzy
 msgid "Maximum speed"
-msgstr "Animatiesnelheid"
+msgstr "Maximum Snelheid"
 
 #: hacks/config/halftone.xml.h:12
 msgid "Minimum mass"
-msgstr ""
+msgstr "Minimum Massa"
 
 #: hacks/config/halftone.xml.h:13
-#, fuzzy
 msgid "Minimum speed"
-msgstr "Animatiesnelheid"
+msgstr "Minimum Snelheid"
 
 #: hacks/config/halo.xml.h:1
-#, fuzzy
 msgid "Animate Circles"
-msgstr "Animeer cirkels."
+msgstr "Animeer cirkels"
 
 #: hacks/config/halo.xml.h:3
 msgid "Halo"
@@ -3929,7 +3892,7 @@ msgstr "Willekeurige Modus"
 
 #: hacks/config/halo.xml.h:8
 msgid "Seuss Mode"
-msgstr ""
+msgstr "Seuss Mode"
 
 #: hacks/config/halo.xml.h:11
 msgid ""
@@ -3977,9 +3940,8 @@ msgid "Hopalong"
 msgstr "Hopalong"
 
 #: hacks/config/hopalong.xml.h:12
-#, fuzzy
 msgid "Jong"
-msgstr "Langer"
+msgstr "Jong"
 
 #: hacks/config/hopalong.xml.h:16
 msgid "Martin"
@@ -4068,53 +4030,47 @@ msgstr ""
 
 #: hacks/config/hypertorus.xml.h:1
 msgid "-4.0"
-msgstr ""
+msgstr "-4.0"
 
 #: hacks/config/hypertorus.xml.h:2
 msgid "4.0"
-msgstr ""
+msgstr "4.0"
 
 #: hacks/config/hypertorus.xml.h:3
 msgid "4D Hypertorus"
-msgstr ""
+msgstr "4D Hypertorus"
 
 #: hacks/config/hypertorus.xml.h:4
-#, fuzzy
 msgid "Color Wheel"
-msgstr "Kleur"
+msgstr "Kleurwiel"
 
 #: hacks/config/hypertorus.xml.h:5
-#, fuzzy
 msgid "Display Speed"
-msgstr "Tekent een sonar scoop."
+msgstr "Teken Snelheid"
 
 #: hacks/config/hypertorus.xml.h:7
-#, fuzzy
 msgid "Orthographic 3d"
-msgstr "Orthografische projectie"
+msgstr "Orthografische 3D projectie"
 
 #: hacks/config/hypertorus.xml.h:8
-#, fuzzy
 msgid "Orthographic 4d"
-msgstr "Orthografische projectie"
+msgstr "Orthografische 4D projectie"
 
 #: hacks/config/hypertorus.xml.h:9
 msgid "Perspective 3d"
-msgstr ""
+msgstr "Perspectief 3D"
 
 #: hacks/config/hypertorus.xml.h:10
 msgid "Perspective 4d"
-msgstr ""
+msgstr "Perspectief 4D"
 
 #: hacks/config/hypertorus.xml.h:11
-#, fuzzy
 msgid "See-Through Bands"
-msgstr "Roterende kleuren."
+msgstr "Doorzichtige Banden"
 
 #: hacks/config/hypertorus.xml.h:14
-#, fuzzy
 msgid "Solid Object"
-msgstr "Vaste Objecten"
+msgstr "Vast Object"
 
 #: hacks/config/hypertorus.xml.h:15 hacks/config/pulsar.xml.h:16
 msgid "Solid Surface"
@@ -4129,48 +4085,40 @@ msgid ""
 msgstr ""
 
 #: hacks/config/hypertorus.xml.h:17
-#, fuzzy
 msgid "Transparent Surface"
-msgstr "Transparant"
+msgstr "Transparant Oppervlak"
 
 #: hacks/config/hypertorus.xml.h:18
 msgid "Two-Sided"
-msgstr ""
+msgstr "Tweezijdig"
 
 #: hacks/config/hypertorus.xml.h:19
-#, fuzzy
 msgid "WX Rotation Speed"
-msgstr "Rotatie"
+msgstr "WX Rotatie Snelheid"
 
 #: hacks/config/hypertorus.xml.h:20
-#, fuzzy
 msgid "WY Rotation Speed"
-msgstr "Rotatie"
+msgstr "WY Rotatie Snelheid"
 
 #: hacks/config/hypertorus.xml.h:21
-#, fuzzy
 msgid "WZ Rotation Speed"
-msgstr "Rotatie"
+msgstr "WZ Rotatie Snelheid"
 
 #: hacks/config/hypertorus.xml.h:22
-#, fuzzy
 msgid "Wireframe Mesh"
 msgstr "Draadraamwerk"
 
 #: hacks/config/hypertorus.xml.h:23
-#, fuzzy
 msgid "XY Rotation Speed"
-msgstr "Rotatie"
+msgstr "XY Rotatie Snelheid"
 
 #: hacks/config/hypertorus.xml.h:24
-#, fuzzy
 msgid "XZ Rotation Speed"
-msgstr "Rotatie"
+msgstr "XZ Rotatie Snelheid"
 
 #: hacks/config/hypertorus.xml.h:25
-#, fuzzy
 msgid "YZ Rotation Speed"
-msgstr "Rotatie"
+msgstr "YZ Rotatie Snelheid"
 
 #: hacks/config/ifs.xml.h:2
 msgid "IFS"
@@ -4189,13 +4137,12 @@ msgid "Brightness Gradients"
 msgstr "Helderheidsgrandiënten"
 
 #: hacks/config/imsmap.xml.h:7
-#, fuzzy
 msgid "Hue Gradients"
-msgstr "Vertikale gradiënt"
+msgstr "Kleur Gradienten"
 
 #: hacks/config/imsmap.xml.h:8
 msgid "IMSmap"
-msgstr "IMSmap"
+msgstr "IMSkaart"
 
 #: hacks/config/imsmap.xml.h:12
 msgid "Saturation Gradients"
@@ -4256,33 +4203,31 @@ msgstr "Golfgrootte"
 
 #: hacks/config/jigglypuff.xml.h:2
 msgid "Chrome"
-msgstr ""
+msgstr "Chrome"
 
 #: hacks/config/jigglypuff.xml.h:3
 msgid "Clown barf"
-msgstr ""
+msgstr "Clown overgeven"
 
 #: hacks/config/jigglypuff.xml.h:5
-#, fuzzy
 msgid "Cycle"
-msgstr "Cycli"
+msgstr "Cykel"
 
 #: hacks/config/jigglypuff.xml.h:7
 msgid "Flower box"
-msgstr ""
+msgstr "Bloemenbak"
 
 #: hacks/config/jigglypuff.xml.h:9
 msgid "Inertial damping"
-msgstr ""
+msgstr "Demping Traagheid"
 
 #: hacks/config/jigglypuff.xml.h:10
 msgid "JigglyPuff"
-msgstr ""
+msgstr "JigglyPuff"
 
 #: hacks/config/jigglypuff.xml.h:14
-#, fuzzy
 msgid "Rotation speed"
-msgstr "Rotatie"
+msgstr "Rotatiesnelheid"
 
 #: hacks/config/jigglypuff.xml.h:17 hacks/config/sphere.xml.h:7
 msgid "Sphere"
@@ -4290,16 +4235,15 @@ msgstr "Bol"
 
 #: hacks/config/jigglypuff.xml.h:18
 msgid "Sphere strength"
-msgstr ""
+msgstr "Bol sterkte"
 
 #: hacks/config/jigglypuff.xml.h:19
-#, fuzzy
 msgid "Spookiness"
-msgstr "Splines"
+msgstr "Spookachtigheid"
 
 #: hacks/config/jigglypuff.xml.h:20
 msgid "Spoooooky"
-msgstr ""
+msgstr "Spooooookachtig"
 
 #: hacks/config/jigglypuff.xml.h:21 hacks/config/sballs.xml.h:16
 msgid "Tetrahedron"
@@ -4323,29 +4267,27 @@ msgstr ""
 
 #: hacks/config/jigglypuff.xml.h:23
 msgid "Vertex-vertex behavior"
-msgstr ""
+msgstr "Hoekpunt Hoekpunt gedrag"
 
 #: hacks/config/jigglypuff.xml.h:24
 msgid "Vertex-vertex force"
-msgstr ""
+msgstr "Hoekpunt hoekpunt kracht"
 
 #: hacks/config/jigglypuff.xml.h:26
 msgid "collapse"
-msgstr ""
+msgstr "inelkaar vallen"
 
 #: hacks/config/jigglypuff.xml.h:27
 msgid "expand"
-msgstr ""
+msgstr "vergroten"
 
 #: hacks/config/jigglypuff.xml.h:28
-#, fuzzy
 msgid "none"
-msgstr "Geen"
+msgstr "geen"
 
 #: hacks/config/jigglypuff.xml.h:29
-#, fuzzy
 msgid "strong"
-msgstr "Vreemd"
+msgstr "sterk"
 
 #: hacks/config/jigsaw.xml.h:4
 msgid "Jigsaw"
@@ -4367,7 +4309,7 @@ msgstr ""
 
 #: hacks/config/juggle.xml.h:1
 msgid "Checkered Balls"
-msgstr ""
+msgstr "Schaakbord Ballen"
 
 #: hacks/config/juggle.xml.h:2
 msgid "Draws a juggling stick-man. Written by Tim Auckland."
@@ -4421,7 +4363,7 @@ msgstr "Sporen"
 
 #: hacks/config/klein.xml.h:3
 msgid "Klein"
-msgstr ""
+msgstr "Klein"
 
 #: hacks/config/klein.xml.h:10
 msgid ""
@@ -4431,21 +4373,19 @@ msgstr ""
 
 #: hacks/config/klein.xml.h:11
 msgid "Use Randomized Surfaces and Primitives"
-msgstr ""
+msgstr "Gebruik Willekeurige Oppervlakten en Primitieven"
 
 #: hacks/config/klein.xml.h:12
-#, fuzzy
 msgid "Wander Around the Screen"
-msgstr "Centreren op beeldscherm"
+msgstr "Zwerf Over het Scherm"
 
 #: hacks/config/kumppa.xml.h:5
 msgid "Kumppa"
 msgstr "Kumppa"
 
 #: hacks/config/kumppa.xml.h:7
-#, fuzzy
 msgid "Randomize"
-msgstr "Willekeurig"
+msgstr "Verwillekeur"
 
 #: hacks/config/kumppa.xml.h:10
 msgid ""
@@ -4508,20 +4448,19 @@ msgstr ""
 
 #: hacks/config/lavalite.xml.h:9
 msgid "Faceted"
-msgstr ""
+msgstr "Gemaakt uit facetten"
 
 #: hacks/config/lavalite.xml.h:11
 msgid "Giant Lavalite"
-msgstr "Reuze Lavalite"
+msgstr "Reuze Lavalamp"
 
 #: hacks/config/lavalite.xml.h:13
 msgid "LavaLite"
 msgstr "Lavalamp"
 
 #: hacks/config/lavalite.xml.h:15
-#, fuzzy
 msgid "Max Blobs"
-msgstr "Klont"
+msgstr "Maximaal Klonten"
 
 #: hacks/config/lavalite.xml.h:16
 msgid "Random Lamp Style"
@@ -4567,18 +4506,16 @@ msgid "Lissie"
 msgstr "Lissie"
 
 #: hacks/config/lmorph.xml.h:1
-#, fuzzy
 msgid "Closed Figures"
-msgstr "Dichterbij"
+msgstr "Gesloten Figuren"
 
 #: hacks/config/lmorph.xml.h:2
-#, fuzzy
 msgid "Control Points"
-msgstr "Configuratie Centrum"
+msgstr "Controle Punten"
 
 #: hacks/config/lmorph.xml.h:4
 msgid "Interpolation Steps"
-msgstr "Interpolatiestappen."
+msgstr "Interpolatiestappen"
 
 #: hacks/config/lmorph.xml.h:5
 msgid "LMorph"
@@ -4593,14 +4530,12 @@ msgid "More"
 msgstr "Meer"
 
 #: hacks/config/lmorph.xml.h:9
-#, fuzzy
 msgid "Open Figures"
 msgstr "Open figuren."
 
 #: hacks/config/lmorph.xml.h:10
-#, fuzzy
 msgid "Open and Closed Figures"
-msgstr "Open figuren."
+msgstr "Open en Gesloten Figuren"
 
 #: hacks/config/lmorph.xml.h:15
 msgid ""
@@ -4613,59 +4548,54 @@ msgid "Loop"
 msgstr "Lus"
 
 #: hacks/config/loop.xml.h:10
-#, fuzzy
 msgid ""
 "This one produces loop-shaped colonies that spawn, age, and eventually die. "
 "Written by David Bagley."
-msgstr "Tekent lusvormige coloniën die geboren worden, groeien en uitsterven."
+msgstr ""
 
 #: hacks/config/maze.xml.h:3
 msgid "Backtracking Generator"
-msgstr ""
+msgstr "Backtracking Generator"
 
 #: hacks/config/maze.xml.h:5 hacks/config/slidescreen.xml.h:3
-#, fuzzy
 msgid "Grid Size"
-msgstr "Grootte"
+msgstr "Raamwerk Grootte"
 
 #: hacks/config/maze.xml.h:6
 msgid "Head Toward Exit"
-msgstr ""
+msgstr "Beweeg naar Uitgang"
 
 #: hacks/config/maze.xml.h:7
 msgid "Ignorant of Exit Direction"
-msgstr ""
+msgstr "Onwetend over Uitgang"
 
 #: hacks/config/maze.xml.h:8
 msgid "Joining Generator"
-msgstr ""
+msgstr "Samenvoeg Generator"
 
 #: hacks/config/maze.xml.h:9
 msgid "Maze"
 msgstr "Doolhof"
 
 #: hacks/config/maze.xml.h:10
-#, fuzzy
 msgid "Post-Solve Delay"
 msgstr "Vertraging na oplossen"
 
 #: hacks/config/maze.xml.h:11
-#, fuzzy
 msgid "Pre-Solve Delay"
 msgstr "Vertraging voor oplossen"
 
 #: hacks/config/maze.xml.h:12
 msgid "Random Generator"
-msgstr "Willekeurige Generator"
+msgstr "Willekeur Generator"
 
 #: hacks/config/maze.xml.h:13
 msgid "Seeding Generator"
-msgstr ""
+msgstr "Invoer Willekeur Generator"
 
 #: hacks/config/maze.xml.h:15
-#, fuzzy
 msgid "Solve Speed"
-msgstr "Snelheid"
+msgstr "Oplossingssnelheid"
 
 #: hacks/config/maze.xml.h:16
 msgid ""
@@ -4686,9 +4616,8 @@ msgid ""
 msgstr ""
 
 #: hacks/config/metaballs.xml.h:1
-#, fuzzy
 msgid "Big"
-msgstr "Groter"
+msgstr "Groot"
 
 #: hacks/config/metaballs.xml.h:2
 msgid ""
@@ -4698,22 +4627,19 @@ msgstr ""
 
 #: hacks/config/metaballs.xml.h:7
 msgid "MetaBall Movement"
-msgstr ""
+msgstr "MetaBal-Beweging"
 
 #: hacks/config/metaballs.xml.h:8
-#, fuzzy
 msgid "MetaBall Radius"
-msgstr "Radius"
+msgstr "Metabal Radius"
 
 #: hacks/config/metaballs.xml.h:9
-#, fuzzy
 msgid "MetaBalls"
-msgstr "Ballen"
+msgstr "MetaBallen"
 
 #: hacks/config/metaballs.xml.h:11
-#, fuzzy
 msgid "Number of MetaBalls"
-msgstr "Aantal Fractals"
+msgstr "Aantal MetaBallen"
 
 #: hacks/config/moebius.xml.h:1
 msgid ""
@@ -4727,7 +4653,7 @@ msgstr "Mieren tonen"
 
 #: hacks/config/moebius.xml.h:4
 msgid "Mesh Floor"
-msgstr ""
+msgstr "Draadraamwerk Vloer"
 
 #: hacks/config/moebius.xml.h:5
 msgid "Moebius"
@@ -4787,7 +4713,7 @@ msgstr "Atomen Weergeven"
 
 #: hacks/config/molecule.xml.h:7 hacks/config/spheremonics.xml.h:2
 msgid "Draw Bounding Box"
-msgstr ""
+msgstr "Toon Omgetrokken Balk"
 
 #: hacks/config/molecule.xml.h:8
 msgid ""
@@ -4838,34 +4764,31 @@ msgstr ""
 
 #: hacks/config/munch.xml.h:5
 msgid "Munch"
-msgstr "Munch"
+msgstr "Opeten"
 
 #: hacks/config/munch.xml.h:10 hacks/config/qix.xml.h:26
 msgid "XOR"
 msgstr "XOR"
 
 #: hacks/config/nerverot.xml.h:1
-#, fuzzy
 msgid "Blot Count"
-msgstr "Aantal"
+msgstr "Aantal Blots"
 
 #: hacks/config/nerverot.xml.h:2
 msgid "Calm"
 msgstr "Kalm"
 
 #: hacks/config/nerverot.xml.h:3
-#, fuzzy
 msgid "Changes"
-msgstr "Kooi"
+msgstr "Veranderend"
 
 #: hacks/config/nerverot.xml.h:4
 msgid "Colors"
 msgstr "Kleuren"
 
 #: hacks/config/nerverot.xml.h:5
-#, fuzzy
 msgid "Crunchiness"
-msgstr "Dikte"
+msgstr "Knapperigheid"
 
 #: hacks/config/nerverot.xml.h:7
 msgid ""
@@ -4883,7 +4806,7 @@ msgstr "NerveRot"
 
 #: hacks/config/nerverot.xml.h:17
 msgid "Nervousness"
-msgstr ""
+msgstr "Nerveusheid"
 
 #: hacks/config/nerverot.xml.h:18 hacks/config/pyro.xml.h:12
 msgid "Seldom"
@@ -4948,7 +4871,7 @@ msgstr "Explosies"
 
 #: hacks/config/penetrate.xml.h:5
 msgid "Penetrate"
-msgstr "Penetrate"
+msgstr "Penetratie"
 
 #: hacks/config/penetrate.xml.h:7
 msgid "Start badly, but learn"
@@ -4962,7 +4885,7 @@ msgstr ""
 
 #: hacks/config/penrose.xml.h:3
 msgid "Draw Ammann Lines"
-msgstr ""
+msgstr "Teken Ammann Lijnen"
 
 #: hacks/config/penrose.xml.h:4
 msgid ""
@@ -5001,36 +4924,31 @@ msgstr "Vruchtbaarheid"
 
 #: hacks/config/petri.xml.h:12
 msgid "Maxium Lifespan"
-msgstr ""
+msgstr "Maximale Levensduur"
 
 #: hacks/config/petri.xml.h:13
-#, fuzzy
 msgid "Maxium Rate of Death"
-msgstr "Blue Screen Of Death"
+msgstr "Maximum Doodssnelheid"
 
 #: hacks/config/petri.xml.h:14
-#, fuzzy
 msgid "Maxium Rate of Growth"
-msgstr "Simuleert koraalgroei"
+msgstr "Maximum Groeisnelheid"
 
 #: hacks/config/petri.xml.h:15
 msgid "Minium Lifespan"
 msgstr "Minimum Levensverwachting"
 
 #: hacks/config/petri.xml.h:16
-#, fuzzy
 msgid "Minium Rate of Death"
-msgstr "Blue Screen Of Death"
+msgstr "Minimum Snelheid van Doodgaan"
 
 #: hacks/config/petri.xml.h:17
-#, fuzzy
 msgid "Minium Rate of Growth"
-msgstr "Simuleert koraalgroei"
+msgstr "Minimum Groeisnelheid"
 
 #: hacks/config/petri.xml.h:18
-#, fuzzy
 msgid "Mold Varieties"
-msgstr "Muis eigenschappen"
+msgstr "Schimmelvarieteiten"
 
 #: hacks/config/petri.xml.h:19
 msgid "Offspring"
@@ -5060,7 +4978,6 @@ msgid ""
 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. "
@@ -5070,35 +4987,32 @@ msgstr ""
 "fosfor."
 
 #: hacks/config/phosphor.xml.h:2
-#, fuzzy
 msgid "Fade"
-msgstr "Waai-lint"
+msgstr "Vervaag"
 
 #: hacks/config/phosphor.xml.h:4
 msgid "Phosphor"
 msgstr "Fosfor"
 
 #: hacks/config/phosphor.xml.h:5
-#, fuzzy
 msgid "Scale"
-msgstr "Geschaald"
+msgstr "Schaal"
 
 #: hacks/config/piecewise.xml.h:1
 msgid "Color shifting speed"
-msgstr ""
+msgstr "Kleurveranderingssnelheid"
 
 #: hacks/config/piecewise.xml.h:6
 msgid "Maximum radius"
-msgstr ""
+msgstr "Maximum Radius"
 
 #: hacks/config/piecewise.xml.h:7
-#, fuzzy
 msgid "Minimum radius"
-msgstr "Minimum Levensverwachting"
+msgstr "Minimum radius"
 
 #: hacks/config/piecewise.xml.h:8
 msgid "Piecewise"
-msgstr ""
+msgstr "Stuksgewijs"
 
 #: hacks/config/piecewise.xml.h:12
 msgid ""
@@ -5111,9 +5025,8 @@ msgid "Allow Tight Turns"
 msgstr "Scherpe Bochten Toestaan"
 
 #: hacks/config/pipes.xml.h:2
-#, fuzzy
 msgid "Ball Joints"
-msgstr "Dialoog aanwijzingen"
+msgstr "Bal Verbindingen"
 
 #: hacks/config/pipes.xml.h:3
 msgid "Curved Pipes"
@@ -5121,11 +5034,11 @@ msgstr "Gebogen Pijpen"
 
 #: hacks/config/pipes.xml.h:6
 msgid "Fisheye Lens"
-msgstr ""
+msgstr "Vissenoog Lens"
 
 #: hacks/config/pipes.xml.h:7
 msgid "Gadgetry"
-msgstr ""
+msgstr "Instrumentjes"
 
 #: hacks/config/pipes.xml.h:8
 msgid ""
@@ -5134,19 +5047,16 @@ msgid ""
 msgstr ""
 
 #: hacks/config/pipes.xml.h:9
-#, fuzzy
 msgid "Lots"
-msgstr "Punten"
+msgstr "Vele"
 
 #: hacks/config/pipes.xml.h:11
-#, fuzzy
 msgid "Number of Pipe Systems"
-msgstr "Aantal zaadjes"
+msgstr "Aantal Pijpsystemen"
 
 #: hacks/config/pipes.xml.h:12
-#, fuzzy
 msgid "Pipe Fittings"
-msgstr "Instellingen"
+msgstr "Pijp Verbindingen"
 
 #: hacks/config/pipes.xml.h:13
 msgid "Pipes"
@@ -5154,7 +5064,7 @@ msgstr "Pijpen"
 
 #: hacks/config/pipes.xml.h:17
 msgid "System Length"
-msgstr ""
+msgstr "Systeem Lengte"
 
 #: hacks/config/polyominoes.xml.h:3
 msgid "Identical Pieces"
@@ -5171,40 +5081,36 @@ msgid ""
 msgstr ""
 
 #: hacks/config/popsquares.xml.h:1
-#, fuzzy
 msgid "Border"
-msgstr "Hoeken"
+msgstr "Grens"
 
 #: hacks/config/popsquares.xml.h:2
 msgid "End color"
-msgstr ""
+msgstr "Eindkleur"
 
 #: hacks/config/popsquares.xml.h:7
-#, fuzzy
 msgid "Start color"
-msgstr "Secundaire kleur"
+msgstr "Startkleur"
 
 #: hacks/config/popsquares.xml.h:8
 msgid "Subdivision"
-msgstr ""
+msgstr "Onderverdeling"
 
 #: hacks/config/popsquares.xml.h:9
-msgid ""
-"This draws a pop-art-ish looking grid of pulsing colors. By Levi Burton."
+msgid "This draws a pop-art-ish looking grid of pulsing colors. By Levi Burton."
 msgstr ""
 
 #: hacks/config/popsquares.xml.h:10
 msgid "Twitch"
-msgstr ""
+msgstr "Zenuwtrekking"
 
 #: hacks/config/popsquares.xml.h:11
-#, fuzzy
 msgid "popsquares"
-msgstr "Vierkant"
+msgstr "popsquares"
 
 #: hacks/config/pulsar.xml.h:1
 msgid "Anti-alias Lines"
-msgstr ""
+msgstr "Anti-alias lijnen"
 
 #: hacks/config/pulsar.xml.h:3
 msgid ""
@@ -5215,71 +5121,63 @@ msgstr ""
 
 #: hacks/config/pulsar.xml.h:4
 msgid "Enable Blending"
-msgstr ""
+msgstr "Sta Mengen Toe"
 
 #: hacks/config/pulsar.xml.h:5
 msgid "Enable Depth Buffer"
-msgstr ""
+msgstr "Gebruik Diepte Buffer"
 
 #: hacks/config/pulsar.xml.h:6
 msgid "Enable Fog"
-msgstr ""
+msgstr "Gebruik Mist"
 
 #: hacks/config/pulsar.xml.h:7
-#, fuzzy
 msgid "Enable Lighting"
-msgstr "Bliksem"
+msgstr "Gebruik Belichting"
 
 #: hacks/config/pulsar.xml.h:8
 msgid "Enable Texture Filtering"
-msgstr ""
+msgstr "Gebruik Textuur Filter"
 
 #: hacks/config/pulsar.xml.h:9
-#, fuzzy
 msgid "Enable Texture Mipmaps"
-msgstr "Automatisch herhalen inschakelen"
+msgstr "Gebruik Textuur Mipmaps"
 
 #: hacks/config/pulsar.xml.h:10
 msgid "Enable Texturing"
-msgstr ""
+msgstr "Gebruik Texturen"
 
 #: hacks/config/pulsar.xml.h:12
-#, fuzzy
 msgid "Pulsar"
-msgstr "Afspelen"
+msgstr "Pulsar"
 
 #: hacks/config/pulsar.xml.h:13
-#, fuzzy
 msgid "Quad Count"
-msgstr "Aantal"
+msgstr "Quad-Aantal"
 
 #: hacks/config/pulsar.xml.h:18
 msgid "Texture PPM File"
-msgstr ""
+msgstr "Textuur PPM Bestand"
 
 #: hacks/config/pyro.xml.h:3
 msgid "Explosive Yield"
-msgstr ""
+msgstr "Explosieven Opbrengst"
 
 #: hacks/config/pyro.xml.h:6
-#, fuzzy
 msgid "Launch Frequency"
-msgstr "Frequentie"
+msgstr "Lanceer Frequentie"
 
 #: hacks/config/pyro.xml.h:9
-#, fuzzy
 msgid "Particle Density"
-msgstr "Brokstukken op het scherm"
+msgstr "Deeltjes dichtheid"
 
 #: hacks/config/pyro.xml.h:10
 msgid "Pyro"
 msgstr "Pyro"
 
 #: hacks/config/pyro.xml.h:11
-msgid ""
-"Pyro draws exploding fireworks. Blah blah blah. Written by Jamie Zawinski."
-msgstr ""
-"Pyro toont een vuurwerk. Blah Blah Blah. Geschreven door Jamie Zawinski."
+msgid "Pyro draws exploding fireworks. Blah blah blah. Written by Jamie Zawinski."
+msgstr "Pyro toont een vuurwerk. Blah Blah Blah. Geschreven door Jamie Zawinski."
 
 #: hacks/config/qix.xml.h:1
 msgid "Additive Colors"
@@ -5290,9 +5188,8 @@ msgid "Corners"
 msgstr "Hoeken"
 
 #: hacks/config/qix.xml.h:11
-#, fuzzy
 msgid "Line Segments"
-msgstr "Segmenten"
+msgstr "Lijnsegmenten"
 
 #: hacks/config/qix.xml.h:12
 msgid "Linear Motion"
@@ -5358,25 +5255,23 @@ msgstr ""
 
 #: hacks/config/rd-bomb.xml.h:8
 msgid "Epoch"
-msgstr ""
+msgstr "Tijdperk"
 
 #: hacks/config/rd-bomb.xml.h:10
 msgid "Fill Screen"
-msgstr ""
+msgstr "Vul Scherm"
 
 #: hacks/config/rd-bomb.xml.h:14
-#, fuzzy
 msgid "RD-Bomb"
-msgstr "Rd-bom"
+msgstr "Rd-Bom"
 
 #: hacks/config/rd-bomb.xml.h:15
 msgid "Reaction/Difusion"
 msgstr "Reactie/Diffusie"
 
 #: hacks/config/rd-bomb.xml.h:16
-#, fuzzy
 msgid "Seed Radius"
-msgstr "Radius"
+msgstr "Verzadigings Radius"
 
 #: hacks/config/rd-bomb.xml.h:19 hacks/config/twang.xml.h:12
 msgid "Tile Size"
@@ -5384,48 +5279,43 @@ msgstr "Tegelgrootte"
 
 #: hacks/config/rd-bomb.xml.h:22
 msgid "Wander Speed"
-msgstr ""
+msgstr "Zwerfsnelheid"
 
 #: hacks/config/ripples.xml.h:1
 msgid "Big Drops"
 msgstr "Grote Druppels"
 
 #: hacks/config/ripples.xml.h:2
-#, fuzzy
 msgid "Colors    Two"
-msgstr "Kleuren"
+msgstr "Kleuren    Twee"
 
 #: hacks/config/ripples.xml.h:3
 msgid "Drizzle"
-msgstr ""
+msgstr "Motregen"
 
 #: hacks/config/ripples.xml.h:5
-#, fuzzy
 msgid "Grab Screen Image"
-msgstr "Scherm Beveiliging"
+msgstr "Verkrijg Beeld v. Scherm"
 
 #: hacks/config/ripples.xml.h:6
-#, fuzzy
 msgid "Lighting Effect"
-msgstr "Bliksem"
+msgstr "Belichtingseffect"
 
 #: hacks/config/ripples.xml.h:8
-#, fuzzy
 msgid "Moving Splashes"
-msgstr "Van vorm veranderende lijnen."
+msgstr "Bewegende Vlekken"
 
 #: hacks/config/ripples.xml.h:9
 msgid "Psychedelic Colors"
-msgstr ""
+msgstr "Psychedelische Kleuren"
 
 #: hacks/config/ripples.xml.h:10
 msgid "Ripples"
 msgstr "Rimpels"
 
 #: hacks/config/ripples.xml.h:12
-#, fuzzy
 msgid "Small Drops"
-msgstr "Kleiner"
+msgstr "Kleine Druppels"
 
 #: hacks/config/ripples.xml.h:13
 msgid "Storm"
@@ -5447,9 +5337,8 @@ msgid "Rotation"
 msgstr "Rotatie"
 
 #: hacks/config/rocks.xml.h:10
-#, fuzzy
 msgid "Steering"
-msgstr "Vreemd"
+msgstr "Besturing"
 
 #: hacks/config/rocks.xml.h:11
 msgid ""
@@ -5473,11 +5362,11 @@ msgstr ""
 
 #: hacks/config/rorschach.xml.h:10
 msgid "With X Symmetry"
-msgstr "Met X-symmetrie"
+msgstr "Met X-Symmetrie"
 
 #: hacks/config/rorschach.xml.h:11
 msgid "With Y Symmetry"
-msgstr "Met Y-symmetrie"
+msgstr "Met Y-Symmetrie"
 
 #: hacks/config/rotor.xml.h:1
 msgid ""
@@ -5510,9 +5399,8 @@ msgid "Rectangle Count"
 msgstr "Aantal Rechthoeken"
 
 #: hacks/config/rotzoomer.xml.h:7
-#, fuzzy
 msgid "RotZoomer"
-msgstr "Rotor"
+msgstr "RotZoomer"
 
 #: hacks/config/rotzoomer.xml.h:8
 msgid "Stationary Rectangles"
@@ -5520,11 +5408,11 @@ msgstr "Stationaire Rechthoeken"
 
 #: hacks/config/rotzoomer.xml.h:9
 msgid "Sweeping Arcs"
-msgstr ""
+msgstr "Bewegende Bogen"
 
 #: hacks/config/rotzoomer.xml.h:11
 msgid "Wandering Rectangles"
-msgstr ""
+msgstr "Zwervende Rechthoeken"
 
 #: hacks/config/rubik.xml.h:2
 msgid ""
@@ -5538,7 +5426,7 @@ msgstr "Rubik"
 
 #: hacks/config/rubik.xml.h:7
 msgid "Show Shuffling"
-msgstr ""
+msgstr "Toon Dooreenschuiven"
 
 #: hacks/config/sballs.xml.h:1
 msgid "Cube"
@@ -5564,30 +5452,26 @@ msgid "Octahedron"
 msgstr "Octaëder"
 
 #: hacks/config/sballs.xml.h:8
-#, fuzzy
 msgid "Plane"
-msgstr "GLPlaneet"
+msgstr "Vlak"
 
 #: hacks/config/sballs.xml.h:9
 msgid "Pyramid"
 msgstr "Pyramide"
 
 #: hacks/config/sballs.xml.h:11
-#, fuzzy
 msgid "Sballs"
-msgstr "Klein"
+msgstr "Sballen"
 
 #: hacks/config/sballs.xml.h:15
 msgid "Star"
 msgstr "Ster"
 
 #: hacks/config/shadebobs.xml.h:7
-#, fuzzy
 msgid "ShadeBobs"
-msgstr "Shadebobs"
+msgstr "ShadeBobs"
 
 #: hacks/config/shadebobs.xml.h:11
-#, fuzzy
 msgid ""
 "This draws smoothly-shaded oscilating oval patterns, that look something "
 "like vapor trails or neon tubes. Written by Shane Smit."
@@ -5618,17 +5502,15 @@ msgstr ""
 #: hacks/config/slidescreen.xml.h:1 hacks/config/twang.xml.h:1
 #: hacks/config/zoom.xml.h:1
 msgid "Border Width"
-msgstr ""
+msgstr "Grensbreedte"
 
 #: hacks/config/slidescreen.xml.h:4
-#, fuzzy
 msgid "Slide Speed"
-msgstr "Schijfscherm"
+msgstr "Schuifsnelheid"
 
 #: hacks/config/slidescreen.xml.h:5
-#, fuzzy
 msgid "SlideScreen"
-msgstr "Schijfscherm"
+msgstr "SchuifScherm"
 
 #: hacks/config/slidescreen.xml.h:8
 msgid ""
@@ -5665,7 +5547,7 @@ msgstr "Ping het Subnet"
 
 #: hacks/config/sonar.xml.h:2
 msgid "Simulation Team Members"
-msgstr ""
+msgstr "Simuleer Teamleden"
 
 #: hacks/config/sonar.xml.h:3
 msgid "Sonar"
@@ -5673,11 +5555,11 @@ msgstr "Sonar"
 
 #: hacks/config/sonar.xml.h:4
 msgid "Team A Name"
-msgstr ""
+msgstr "Naam Team A"
 
 #: hacks/config/sonar.xml.h:5
 msgid "Team B Name"
-msgstr ""
+msgstr "Naam Team B"
 
 #: hacks/config/sonar.xml.h:6
 msgid ""
@@ -5698,9 +5580,8 @@ msgid "Allow Wall Collisions"
 msgstr "Botsingen Met Muur Toestaan"
 
 #: hacks/config/speedmine.xml.h:2
-#, fuzzy
 msgid "Display Crosshair"
-msgstr "Teken ruis."
+msgstr "Teken Richtkruis"
 
 #: hacks/config/speedmine.xml.h:7
 msgid "Max Velocity"
@@ -5712,12 +5593,11 @@ msgstr "Mijnschacht"
 
 #: hacks/config/speedmine.xml.h:9
 msgid "Present Bonuses"
-msgstr ""
+msgstr "Bonussen Aanwezig"
 
 #: hacks/config/speedmine.xml.h:10
-#, fuzzy
 msgid "Rocky Walls"
-msgstr "Stenen"
+msgstr "Stenen Muren"
 
 #: hacks/config/speedmine.xml.h:12
 msgid ""
@@ -5726,9 +5606,8 @@ msgid ""
 msgstr ""
 
 #: hacks/config/speedmine.xml.h:16
-#, fuzzy
 msgid "SpeedMine"
-msgstr "Snelheid"
+msgstr "SnelleSchacht"
 
 #: hacks/config/speedmine.xml.h:17
 msgid "Thrust"
@@ -5749,9 +5628,8 @@ msgstr ""
 "terug te traceren naar Tom Duff in 1982."
 
 #: hacks/config/sphereEversion.xml.h:1
-#, fuzzy
 msgid "SphereEversion"
-msgstr "Bol"
+msgstr "BolBinnenstebuiten"
 
 #: hacks/config/sphereEversion.xml.h:2
 msgid ""
@@ -5766,12 +5644,11 @@ msgstr ""
 
 #: hacks/config/spheremonics.xml.h:20
 msgid "Smoothed Lines"
-msgstr ""
+msgstr "Zachte Lijnen"
 
 #: hacks/config/spheremonics.xml.h:23
-#, fuzzy
 msgid "Spheremonics"
-msgstr "Bol"
+msgstr "Spheremonics"
 
 #: hacks/config/spheremonics.xml.h:24
 msgid ""
@@ -5822,7 +5699,7 @@ msgstr ""
 
 #: hacks/config/squiral.xml.h:5
 msgid "Handedness"
-msgstr ""
+msgstr "Links/Rechtshandig"
 
 #: hacks/config/squiral.xml.h:7
 msgid "Left"
@@ -5867,17 +5744,15 @@ msgstr "Trappen"
 msgid ""
 "by Marcelo Vianna's third Escher GL hack, this one draws an ``infinite'' "
 "staircase."
-msgstr ""
-"Derde Escher GL hack door Marcelo Vianna. Deze tekent een \"oneindige\" trap."
+msgstr "Derde Escher GL hack door Marcelo Vianna. Deze tekent een \"oneindige\" trap."
 
 #: hacks/config/starfish.xml.h:1
-#, fuzzy
 msgid "Color Gradients"
-msgstr "Horizontale gradiënt"
+msgstr "Kleurgradiënten"
 
 #: hacks/config/starfish.xml.h:7
 msgid "Pulsating Blob"
-msgstr ""
+msgstr "Pulserende Vlek"
 
 #: hacks/config/starfish.xml.h:10
 msgid "Starfish"
@@ -5893,7 +5768,7 @@ msgstr ""
 
 #: hacks/config/starwars.xml.h:2
 msgid "Anti-aliased Lines"
-msgstr ""
+msgstr "Anti Alias Lijnen"
 
 #: hacks/config/starwars.xml.h:3
 msgid "Centered Text"
@@ -5912,15 +5787,15 @@ msgstr "Vervagen"
 
 #: hacks/config/starwars.xml.h:7
 msgid "Flush Left Text"
-msgstr ""
+msgstr "Stroom Text naar Links"
 
 #: hacks/config/starwars.xml.h:8
 msgid "Flush Right Text"
-msgstr ""
+msgstr "Stroom Tekst naar Rechts"
 
 #: hacks/config/starwars.xml.h:9
 msgid "Font Point Size"
-msgstr ""
+msgstr "Puntgrootte Lettertype"
 
 #: hacks/config/starwars.xml.h:10
 msgid "Scroll Speed"
@@ -5928,7 +5803,7 @@ msgstr "Schuifsnelheid"
 
 #: hacks/config/starwars.xml.h:13
 msgid "Star Rotation Speed"
-msgstr ""
+msgstr "Rotatiesnelheid Sterren"
 
 #: hacks/config/starwars.xml.h:14
 msgid "StarWars"
@@ -5936,21 +5811,19 @@ msgstr "StarWars"
 
 #: hacks/config/starwars.xml.h:15
 msgid "Text Columns"
-msgstr ""
+msgstr "Tekst Kolommen"
 
 #: hacks/config/starwars.xml.h:16
-#, fuzzy
 msgid "Text Lines"
-msgstr "Instellingen testen"
+msgstr "Tekst Lijnen"
 
 #: hacks/config/starwars.xml.h:18
 msgid "Thick Lines"
 msgstr "Dikke Lijnen"
 
 #: hacks/config/starwars.xml.h:19
-#, fuzzy
 msgid "Wrap Long Lines"
-msgstr "Van vorm veranderende lijnen."
+msgstr "Breek Lange Regels"
 
 #: hacks/config/stonerview.xml.h:1
 msgid ""
@@ -6017,9 +5890,8 @@ msgid "Bigger"
 msgstr "Groter"
 
 #: hacks/config/t3d.xml.h:5
-#, fuzzy
 msgid "Cycle Seconds"
-msgstr "Roteer modi."
+msgstr "Seconden per Cykel"
 
 #: hacks/config/t3d.xml.h:10
 msgid "Minute Tick Marks"
@@ -6034,16 +5906,14 @@ msgid "T3D"
 msgstr "T3D"
 
 #: hacks/config/t3d.xml.h:15
-#, fuzzy
 msgid ""
 "This draws a working analog clock composed of floating, throbbing bubbles. "
 "Written by Bernd Paysan."
-msgstr ""
-"Dit tekent een werkende analoge klok van drijvende wiebelende zeepbellen."
+msgstr "Dit tekent een werkende analoge klok van drijvende wiebelende zeepbellen."
 
 #: hacks/config/t3d.xml.h:16
 msgid "Turn Side-to-Side"
-msgstr ""
+msgstr "Draai Zijkant naar Zijkant"
 
 #: hacks/config/t3d.xml.h:17
 msgid "Wobbliness"
@@ -6064,12 +5934,10 @@ msgid "Thornbird"
 msgstr "Doornvogel"
 
 #: hacks/config/triangle.xml.h:2
-#, fuzzy
 msgid ""
 "Generates random mountain ranges using iterative subdivision of triangles. "
 "Written by Tobias Gloth."
-msgstr ""
-"Tekent willekeurige bergkammen door driehoeken telkens weer op te delen."
+msgstr "Tekent willekeurige bergkammen door driehoeken telkens weer op te delen."
 
 #: hacks/config/triangle.xml.h:7
 msgid "Triangle"
@@ -6086,24 +5954,20 @@ msgid "Truchet"
 msgstr "Truchet"
 
 #: hacks/config/twang.xml.h:2
-msgid ""
-"Divides the screen into a grid, and plucks them. Written by Dan Bornstein."
+msgid "Divides the screen into a grid, and plucks them. Written by Dan Bornstein."
 msgstr ""
 
 #: hacks/config/twang.xml.h:6
-#, fuzzy
 msgid "Jumpy"
-msgstr "Bobbels"
+msgstr "Springerig"
 
 #: hacks/config/twang.xml.h:11
-#, fuzzy
 msgid "Springiness"
-msgstr "Sproingies"
+msgstr "Spingerigheid"
 
 #: hacks/config/twang.xml.h:13
-#, fuzzy
 msgid "Transference"
-msgstr "Transparant"
+msgstr "Overbrenging"
 
 #: hacks/config/twang.xml.h:14
 msgid "Twang"
@@ -6115,7 +5979,7 @@ msgstr ""
 
 #: hacks/config/vermiculate.xml.h:2
 msgid "Vermiculate"
-msgstr ""
+msgstr "Vermicelieer"
 
 #: hacks/config/vidwhacker.xml.h:2 hacks/config/webcollage.xml.h:2
 msgid "2 seconds"
@@ -6123,7 +5987,7 @@ msgstr "2 seconden"
 
 #: hacks/config/vidwhacker.xml.h:4
 msgid "Image Directory"
-msgstr ""
+msgstr "Directory met Beelden"
 
 #: hacks/config/vidwhacker.xml.h:5
 msgid ""
@@ -6148,21 +6012,19 @@ msgstr ""
 
 #: hacks/config/vines.xml.h:8
 msgid "Vines"
-msgstr "Vines"
+msgstr "Klimplanten"
 
 #: hacks/config/wander.xml.h:5
 msgid "Draw Spots"
-msgstr ""
+msgstr "Teken Stippen"
 
 #: hacks/config/wander.xml.h:6
-msgid ""
-"Draws a colorful random-walk, in various forms. Written by Rick Campbell."
+msgid "Draws a colorful random-walk, in various forms. Written by Rick Campbell."
 msgstr ""
 
 #: hacks/config/wander.xml.h:14
-#, fuzzy
 msgid "Sustain"
-msgstr "Berg"
+msgstr "Dragen"
 
 #: hacks/config/webcollage.xml.h:3
 msgid "Dictionary File"
@@ -6170,11 +6032,11 @@ msgstr "Woordenboekbestand"
 
 #: hacks/config/webcollage.xml.h:5
 msgid "Overall Filter Program"
-msgstr ""
+msgstr "Overall Filter Programma"
 
 #: hacks/config/webcollage.xml.h:6
 msgid "Per-Image Filter Program"
-msgstr ""
+msgstr "Per Beeld Filter Programma"
 
 #: hacks/config/webcollage.xml.h:9
 msgid ""
@@ -6203,80 +6065,72 @@ msgid ""
 msgstr ""
 
 #: hacks/config/whirlwindwarp.xml.h:7
-#, fuzzy
 msgid "Trail Size"
-msgstr "Spoor"
+msgstr "Spoorgrootte"
 
 #: hacks/config/whirlwindwarp.xml.h:8
 msgid "WhirlwindWarp"
-msgstr ""
+msgstr "WervelwindWarp"
 
 #: hacks/config/whirlygig.xml.h:1
 msgid "Amplitude"
 msgstr "Amplitude"
 
 #: hacks/config/whirlygig.xml.h:2
-#, fuzzy
 msgid "Circle"
-msgstr "Cycli"
+msgstr "Cirkel"
 
 #: hacks/config/whirlygig.xml.h:3
 msgid "Draws zooming chains of sinusoidal spots. Written by Ashton Trey Belew."
 msgstr ""
 
 #: hacks/config/whirlygig.xml.h:4
-#, fuzzy
 msgid "Explain modes"
-msgstr "Tekent een sonar scoop."
+msgstr "Leg modi uit"
 
 #: hacks/config/whirlygig.xml.h:5
 msgid "Fun"
-msgstr ""
+msgstr "Lol"
 
 #: hacks/config/whirlygig.xml.h:6
 msgid "Funky"
-msgstr ""
+msgstr "Funky"
 
 #: hacks/config/whirlygig.xml.h:7
 msgid "Innie"
-msgstr ""
+msgstr "Innie"
 
 #: hacks/config/whirlygig.xml.h:8
-#, fuzzy
 msgid "Leave a trail"
-msgstr "Sporen"
+msgstr "Laat spoor achter"
 
 #: hacks/config/whirlygig.xml.h:9
-#, fuzzy
 msgid "Linear"
-msgstr "Lijnen"
+msgstr "Lineair"
 
 #: hacks/config/whirlygig.xml.h:11
-#, fuzzy
 msgid "Lissajous"
-msgstr "Lisa"
+msgstr "Lissajous"
 
 #: hacks/config/whirlygig.xml.h:15
-#, fuzzy
 msgid "Test"
-msgstr "Beste"
+msgstr "Test"
 
 #: hacks/config/whirlygig.xml.h:16
-#, fuzzy
 msgid "Use Double Buffering"
-msgstr "Dubbele buffer"
+msgstr "Gebruik Dubbele Buffer"
 
 #: hacks/config/whirlygig.xml.h:17
 msgid "Whirlies"
-msgstr ""
+msgstr "Draaiers"
 
 #: hacks/config/whirlygig.xml.h:18
 msgid "WhirlyGig"
-msgstr ""
+msgstr "DraaierGig"
 
 #: hacks/config/whirlygig.xml.h:19
 msgid "Wrap the screen"
-msgstr ""
+msgstr "'Wrap' het scherm"
 
 #: hacks/config/worm.xml.h:1
 msgid ""
@@ -6306,19 +6160,16 @@ msgid "24-Hour Time"
 msgstr "24-Uurs Tijd"
 
 #: hacks/config/xdaliclock.xml.h:3
-#, fuzzy
 msgid "Cycle Colors"
-msgstr "Roteer modi."
+msgstr "Roteer kleuren"
 
 #: hacks/config/xdaliclock.xml.h:4
-#, fuzzy
 msgid "Display Seconds"
-msgstr "Tekent een sonar scoop."
+msgstr "Toon seconden"
 
 #: hacks/config/xdaliclock.xml.h:5
-#, fuzzy
 msgid "Huge Font"
-msgstr "Keuze Lettertype"
+msgstr "Gigantisch Lettertype"
 
 #: hacks/config/xdaliclock.xml.h:6 hacks/config/xmatrix.xml.h:10
 msgid "Large Font"
@@ -6326,16 +6177,15 @@ msgstr "Groot lettertype"
 
 #: hacks/config/xdaliclock.xml.h:7
 msgid "Medium Font"
-msgstr "Medium Lettertype"
+msgstr "Middelmatig Lettertype"
 
 #: hacks/config/xdaliclock.xml.h:8 hacks/config/xmatrix.xml.h:16
 msgid "Small Font"
 msgstr "Klein Lettertype"
 
 #: hacks/config/xdaliclock.xml.h:9
-#, fuzzy
 msgid "XDaliClock"
-msgstr "3D klok"
+msgstr "XDaliKlok"
 
 #: hacks/config/xdaliclock.xml.h:10
 msgid ""
@@ -6355,12 +6205,11 @@ msgstr "Datum/Tijd Stempel"
 
 #: hacks/config/xearth.xml.h:3
 msgid "Day  Dim"
-msgstr ""
+msgstr "Dag Avond"
 
 #: hacks/config/xearth.xml.h:5
-#, fuzzy
 msgid "Display Stars"
-msgstr "Teken ruis."
+msgstr "Teken Trappen"
 
 #: hacks/config/xearth.xml.h:8
 msgid "Label Cities"
@@ -6368,11 +6217,11 @@ msgstr "Steden labelen"
 
 #: hacks/config/xearth.xml.h:9
 msgid "Lower Left"
-msgstr ""
+msgstr "Links-onder"
 
 #: hacks/config/xearth.xml.h:10
 msgid "Lower Right"
-msgstr "Rechts onder"
+msgstr "Rechts-onder"
 
 #: hacks/config/xearth.xml.h:13
 msgid "Mercator Projection"
@@ -6380,7 +6229,7 @@ msgstr "Mercatorprojectie"
 
 #: hacks/config/xearth.xml.h:14
 msgid "Night   Dim"
-msgstr ""
+msgstr "Nacht   Ochtend"
 
 #: hacks/config/xearth.xml.h:15
 msgid "No Stars"
@@ -6400,20 +6249,19 @@ msgstr "Real Time"
 
 #: hacks/config/xearth.xml.h:20
 msgid "Shaded Image"
-msgstr ""
+msgstr "Verduisterd Plaatje"
 
 #: hacks/config/xearth.xml.h:21
-#, fuzzy
 msgid "Sharp"
-msgstr "Sonar"
+msgstr "Scherp"
 
 #: hacks/config/xearth.xml.h:23
 msgid "Spacing"
-msgstr ""
+msgstr "Verdeling"
 
 #: hacks/config/xearth.xml.h:26
 msgid "Terminator   Blurry"
-msgstr "Wazige terminator"
+msgstr "Beeindiger   Wazig"
 
 #: hacks/config/xearth.xml.h:27
 msgid "Time Warp"
@@ -6438,16 +6286,15 @@ msgstr ""
 
 #: hacks/config/xearth.xml.h:32
 msgid "Xearth"
-msgstr "Xearth"
+msgstr "Xaarde"
 
 #: hacks/config/xfishtank.xml.h:5
 msgid "Fish"
 msgstr "Vissen"
 
 #: hacks/config/xfishtank.xml.h:6
-#, fuzzy
 msgid "Fish Speed"
-msgstr "Snelheid"
+msgstr "Vis snelheid"
 
 #: hacks/config/xfishtank.xml.h:7
 msgid ""
@@ -6472,11 +6319,11 @@ msgstr ""
 
 #: hacks/config/xflame.xml.h:3
 msgid "Enable Blooming"
-msgstr ""
+msgstr "Toon bloeien"
 
 #: hacks/config/xflame.xml.h:8
 msgid "Xflame"
-msgstr "Xflame"
+msgstr "Xvlam"
 
 #: hacks/config/xjack.xml.h:4
 msgid ""
@@ -6523,7 +6370,7 @@ msgstr "Vol"
 
 #: hacks/config/xmatrix.xml.h:9
 msgid "Knock Knock"
-msgstr ""
+msgstr "Klop Klop"
 
 #: hacks/config/xmatrix.xml.h:12
 msgid "Phone Number"
@@ -6550,13 +6397,12 @@ msgid "Reflections"
 msgstr "Spiegelingen"
 
 #: hacks/config/xmountains.xml.h:3
-#, fuzzy
 msgid "Side View"
-msgstr "Gebruik programma"
+msgstr "Zijaanzicht"
 
 #: hacks/config/xmountains.xml.h:6
 msgid "Top View"
-msgstr ""
+msgstr "Bovenaanzicht"
 
 #: hacks/config/xmountains.xml.h:7
 msgid ""
@@ -6569,9 +6415,8 @@ msgid ""
 msgstr ""
 
 #: hacks/config/xmountains.xml.h:8
-#, fuzzy
 msgid "Xmountains"
-msgstr "Berg"
+msgstr "XBergen"
 
 #: hacks/config/xrayswarm.xml.h:1
 msgid ""
@@ -6581,7 +6426,7 @@ msgstr ""
 
 #: hacks/config/xrayswarm.xml.h:5
 msgid "XRaySwarm"
-msgstr "XRaySwarm"
+msgstr "XStraalZwerm"
 
 #: hacks/config/xsnow.xml.h:1
 msgid ""
@@ -6614,39 +6459,36 @@ msgid "Color Bars Enabled"
 msgstr "Kleurenbalken Aan"
 
 #: hacks/config/xteevee.xml.h:2
-#, fuzzy
 msgid "Cycle Through Modes"
-msgstr "Roterende kleuren."
+msgstr "Ga Door de Verschillende Modi"
 
 #: hacks/config/xteevee.xml.h:3
 msgid "Rolling Enabled"
 msgstr "Beeldschermrollen Aan"
 
 #: hacks/config/xteevee.xml.h:4
-#, fuzzy
 msgid "Static Enabled"
-msgstr "Ruis"
+msgstr "Ruis aan"
 
 #: hacks/config/xteevee.xml.h:5
 msgid "XTeeVee"
 msgstr "XTeeVee"
 
 #: hacks/config/xteevee.xml.h:6
-#, fuzzy
 msgid ""
 "XTeeVee simulates various television problems, including static, loss of "
 "vertical hold, and a test pattern. By Greg Knauss."
 msgstr ""
-"Simuleert diverse tv problemen zoals ruis, vertikaal rollen en testbeelden."
+"XTeeVee simuleert diverse tv problemen zoals ruis, vertikaal rollen en "
+"testbeelden."
 
 #: hacks/config/zoom.xml.h:3
-#, fuzzy
 msgid "Lens Offset"
-msgstr "Offset"
+msgstr "Lensverschuiving"
 
 #: hacks/config/zoom.xml.h:4
 msgid "Lenses"
-msgstr ""
+msgstr "Lensen"
 
 #: hacks/config/zoom.xml.h:9
 msgid ""
@@ -6657,3 +6499,4 @@ msgstr ""
 "Zoomt in op een deel van het scherm en gaat dan rondbewegen. Met de optie -"
 "lenses is het resultaat alsof je door overlappende lenzen kijkt in plaats "
 "van een eenvoudige zoom. Geschreven door James Macnicol."
+
index b6eb530a7e33cebe0a1bde064ce42a0936f31ce9..88a0140f6e1d8f117ea99e236071888ede1b77e2 100644 (file)
--- a/setup.com
+++ b/setup.com
@@ -66,12 +66,14 @@ $ lmorph    :== $'mydir'lmorph
 $ loop         :== $'mydir'loop
 $ maze         :== $'mydir'maze
 $ metaballs    :== $'mydir'metaballs
+$ mismunch     :== $'mydir'mismunch
 $ moire2       :== $'mydir'moire2
 $ moire                :== $'mydir'moire
 $ mountain     :== $'mydir'mountain
 $ munch                :== $'mydir'munch
 $ nerverot     :== $'mydir'nerverot
 $ noseguy      :== $'mydir'noseguy
+$ pacman       :== $'mydir'pacman
 $ pedal                :== $'mydir'pedal
 $ penetrate    :== $'mydir'penetrate
 $ penrose      :== $'mydir'penrose
@@ -113,6 +115,7 @@ $ wander    :== $'mydir'wander
 $ webcollage-helper    :== $'mydir'webcollage-helper
 $ whirlwindwarp        :== $'mydir'whirlwindwarp
 $ whirlygig    :== $'mydir'whirlygig
+$ wormhole     :== $'mydir'wormhole
 $ worm         :== $'mydir'worm
 $ xanalogtv    :== $'mydir'xanalogtv
 $ xflame       :== $'mydir'xflame
index 0568d9b911557479c89c795d5fe4399e42efc1d0..7b5298dffd156f653653a550fae454f332de4dab 100644 (file)
 #include "vroot.h"
 #include <X11/Xatom.h>
 
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+#ifdef HAVE_SYS_WAIT_H
+# include <sys/wait.h>         /* for waitpid() and associated macros */
+#endif
+
+
 extern char *progname;
 
 
@@ -176,6 +184,56 @@ hack_subproc_environment (Display *dpy)
 }
 
 
+/* Spawn a program, and wait for it to finish.
+   If we just use system() for this, then sometimes the subprocess
+   doesn't die when *this* process is sent a TERM signal.  Perhaps
+   this is due to the intermediate /bin/sh that system() uses to
+   parse arguments?  I'm not sure.  But using fork() and execvp()
+   here seems to close the race.
+ */
+
+static void
+exec_simple_command (const char *command)
+{
+  char *av[1024];
+  int ac = 0;
+  char *token = strtok (strdup(command), " \t");
+  while (token)
+    {
+      av[ac++] = token;
+      token = strtok(0, " \t");
+    }
+  av[ac] = 0;
+
+  execvp (av[0], av);  /* shouldn't return. */
+}
+
+static void
+fork_exec_wait (const char *command)
+{
+  char buf [255];
+  pid_t forked;
+  int status;
+
+  switch ((int) (forked = fork ()))
+    {
+    case -1:
+      sprintf (buf, "%s: couldn't fork", progname);
+      perror (buf);
+      return;
+
+    case 0:
+      exec_simple_command (command);
+      exit (1);  /* exits child fork */
+      break;
+
+    default:
+      waitpid (forked, &status, 0);
+      break;
+    }
+}
+
+
 /* Loads an image into the Drawable.
    When grabbing desktop images, the Window will be unmapped first.
  */
@@ -216,7 +274,7 @@ load_random_image (Screen *screen, Window window, Drawable drawable,
 
   XSync (dpy, True);
   hack_subproc_environment (dpy);
-  system (cmd);
+  fork_exec_wait (cmd);
   free (cmd);
   XSync (dpy, True);
 
index 9efafdeffc4c6de97fd5762bb9da26af39f19605..fa2d6fd15ecc937fe0cbde58673ba9987c6ebe9d 100644 (file)
@@ -1,2 +1,2 @@
 static const char screensaver_id[] =
-       "@(#)xscreensaver 4.14 (25-Oct-2003), by Jamie Zawinski (jwz@jwz.org)";
+       "@(#)xscreensaver 4.15 (26-Feb-2004), by Jamie Zawinski (jwz@jwz.org)";
index 3b58b8aea49ac40fdfa28837e1dd13ea8ea85401..fc994ac82466a55237f8689685a83ffd0f58d155 100644 (file)
@@ -1,7 +1,7 @@
 Begin3
 Title:          xscreensaver
-Version:        4.14
-Entered-date:   25OCT03
+Version:        4.15
+Entered-date:   26FEB04
 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/
-                3988K xscreensaver-4.14.tar.gz
-                66K   xscreensaver.README
+                4090K xscreensaver-4.15.tar.gz
+                67K   xscreensaver.README
                 1K    xscreensaver.lsm
 Alternate-site: sunsite.unc.edu /pub/Linux/X11/screensavers/
-                3988K xscreensaver-4.14.tar.gz
-                66K   xscreensaver.README
+                4090K xscreensaver-4.15.tar.gz
+                67K   xscreensaver.README
                 1K    xscreensaver.lsm
 Alternate-site: ftp.x.org /contrib/applications/
-                3988K xscreensaver-4.14.tar.gz
-                66K   xscreensaver.README
+                4090K xscreensaver-4.15.tar.gz
+                67K   xscreensaver.README
                 1K    xscreensaver.lsm
 Platforms:      Linux, Irix, SunOS, Solaris, HPUX, AIX, FreeBSD, NetBSD,
                 BSDI, SCO, OSF1, Ultrix, VMS.
index d51bffad1e031cde878b2ba94c5a0caa980f539a..0978d16c7c8c61c5d518be76c00a079fddcfca11 100644 (file)
@@ -1,7 +1,7 @@
 %define        name            xscreensaver
-%define        version         4.14
+%define        version         4.15
 %define        release         1
-%define        serial          1
+%define        epoch           1
 %define        x11_prefix      /usr/X11R6
 %define        gnome_prefix    /usr
 %define        kde_prefix      /usr
@@ -18,10 +18,10 @@ Summary(fr):        Economiseur d'
 Name:          %{name}
 Version:       %{version}
 Release:       %{release}
-Serial:                %{serial}
+Epoch:         %{epoch}
 Group:         Amusements/Graphics
-Copyright:     BSD
-URL:           http://www.jwz.org/xscreensaver
+License:       BSD
+URL:           http://www.jwz.org/xscreensaver/
 Vendor:                Jamie Zawinski <jwz@jwz.org>
 Source:                %{name}-%{version}.tar.gz
 Buildroot:     %{_tmppath}/%{name}-%{version}-root
@@ -48,7 +48,7 @@ Plus de 175 modes d'affichage sont inclus dans ce paquet.
 
 %{?USE_GL:%package gl}
 %{?USE_GL:Group:       Amusements/Graphics}
-%{?USE_GL:Requires:    xscreensaver = %{version}}
+%{?USE_GL:Requires:     xscreensaver = %{epoch}:%{version}-%{release}}
 %{?USE_GL:Summary:     A set of GL screensavers}
 %{?USE_GL:Summary(fr): Un ensemble d'économiseurs d'écran OpenGL}
 %{?USE_GL:%description gl}