http://ftp.ksu.edu.tw/FTP/FreeBSD/distfiles/xscreensaver-4.20.tar.gz
authorZygo Blaxell <zblaxell@hungrycats.org>
Mon, 2 Mar 2009 05:43:26 +0000 (00:43 -0500)
committerZygo Blaxell <zblaxell@faye.furryterror.org>
Fri, 8 Feb 2013 17:54:19 +0000 (12:54 -0500)
-rw-r--r-- 1 zblaxell zblaxell 4437919 Mar 14  2005 xscreensaver-4.20.tar.gz
304da3cfa2c02aa4cedca85b48005b4163d94452  xscreensaver-4.20.tar.gz

178 files changed:
Makefile.in
README
configure
configure.in
driver/Makefile.in
driver/XScreenSaver.ad.in
driver/XScreenSaver_ad.h
driver/demo-Gtk.c
driver/demo-Xm.c
driver/splash.c
driver/test-apm.c
driver/test-randr.c
driver/xscreensaver-command.c
driver/xscreensaver-command.man
driver/xscreensaver-demo.glade2
driver/xscreensaver-demo.man
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 [deleted file]
driver/xscreensaver.man
hacks/Makefile.in
hacks/apple2-main.c
hacks/apple2.man
hacks/blitspin.c
hacks/boxfit.c [new file with mode: 0644]
hacks/boxfit.man [new file with mode: 0644]
hacks/bsod.c
hacks/bsod.man
hacks/bumps.c
hacks/compile_axp.com
hacks/compile_decc.com
hacks/config/README
hacks/config/boing.xml [new file with mode: 0644]
hacks/config/boxfit.xml [new file with mode: 0644]
hacks/config/bsod.xml
hacks/config/carousel.xml [new file with mode: 0644]
hacks/config/distort.xml
hacks/config/extrusion.xml
hacks/config/fiberlamp.xml [new file with mode: 0644]
hacks/config/glslideshow.xml
hacks/config/juggle.xml
hacks/config/pipes.xml
hacks/config/sonar.xml
hacks/config/starwars.xml
hacks/config/substrate.xml
hacks/config/webcollage.xml
hacks/decayscreen.c
hacks/distort.c
hacks/fiberlamp.c [new file with mode: 0644]
hacks/fiberlamp.man [new file with mode: 0644]
hacks/fireworkx.c
hacks/glx/Makefile.in
hacks/glx/antinspect.c
hacks/glx/antspotlight.c
hacks/glx/boing.c [new file with mode: 0644]
hacks/glx/boing.man [new file with mode: 0644]
hacks/glx/bouncingcow.c
hacks/glx/carousel.c [new file with mode: 0644]
hacks/glx/carousel.man [new file with mode: 0644]
hacks/glx/cubenetic.c
hacks/glx/cubestorm.c
hacks/glx/dangerball.c
hacks/glx/endgame.c
hacks/glx/engine.c
hacks/glx/extrusion-helix2.c
hacks/glx/extrusion-helix3.c
hacks/glx/extrusion-helix4.c
hacks/glx/extrusion-joinoffset.c
hacks/glx/extrusion-screw.c
hacks/glx/extrusion-taper.c
hacks/glx/extrusion-twistoid.c
hacks/glx/extrusion.c
hacks/glx/flipflop.c
hacks/glx/flipscreen3d.c
hacks/glx/flyingtoasters.c
hacks/glx/font-ximage.c
hacks/glx/fps.c
hacks/glx/gears.c
hacks/glx/gflux.c
hacks/glx/glblur.c
hacks/glx/gleidescope.c
hacks/glx/glknots.c
hacks/glx/glmatrix.c
hacks/glx/glplanet.c
hacks/glx/glslideshow.c
hacks/glx/glslideshow.man
hacks/glx/glsnake.c
hacks/glx/gltext.c
hacks/glx/gltrackball.c
hacks/glx/gltrackball.h
hacks/glx/glut_roman.h
hacks/glx/glxfonts.c [new file with mode: 0644]
hacks/glx/glxfonts.h [new file with mode: 0644]
hacks/glx/grab-ximage.c
hacks/glx/grab-ximage.h
hacks/glx/jigglypuff.c
hacks/glx/klein.c
hacks/glx/lament.c
hacks/glx/lavalite.c
hacks/glx/marching.c
hacks/glx/menger.c
hacks/glx/mirrorblob.c
hacks/glx/moebius.c
hacks/glx/molecule.c
hacks/glx/normals.c [new file with mode: 0644]
hacks/glx/normals.h [new file with mode: 0644]
hacks/glx/pinion.c
hacks/glx/pipes.c
hacks/glx/polyhedra-gl.c
hacks/glx/queens.c
hacks/glx/sierpinski3d.c
hacks/glx/spheremonics.c
hacks/glx/starwars.c
hacks/glx/starwars.man
hacks/glx/starwars.txt [new file with mode: 0644]
hacks/glx/texfont.c [new file with mode: 0644]
hacks/glx/texfont.h [new file with mode: 0644]
hacks/intermomentary.c
hacks/jigsaw.c
hacks/juggle.c
hacks/juggle.man
hacks/lightning.c
hacks/pong.c
hacks/ripples.c
hacks/rotzoomer.c
hacks/slidescreen.c
hacks/slip.c
hacks/sonar.c
hacks/sonar.man
hacks/spotlight.c
hacks/substrate.c
hacks/substrate.man
hacks/twang.c
hacks/webcollage
hacks/webcollage-helper.c
hacks/webcollage.man
hacks/xanalogtv.c
hacks/xlockmore.c
hacks/xteevee.c
hacks/zoom.c
po/POTFILES.in
po/ca.po
po/da.po
po/de.po
po/es.po
po/et.po
po/fi.po
po/fr.po
po/hu.po
po/it.po
po/ja.po
po/ko.po
po/nl.po
po/no.po
po/pl.po
po/pt.po
po/pt_BR.po
po/ru.po
po/sk.po
po/sv.po
po/vi.po
po/wa.po
po/zh_CN.po
po/zh_TW.po
setup.com
utils/Makefile.in
utils/grabclient.c
utils/grabscreen.h
utils/version.h
utils/vroot.h
utils/xshm.c
xscreensaver.lsm [deleted file]
xscreensaver.lsm.sh [deleted file]
xscreensaver.spec

index e085de53a6fd9cefb244db1a1ad7aa3cc1a14480..c2153f57ebe72301f1590ca9ded7e60da807d321 100644 (file)
@@ -1,4 +1,4 @@
-# Makefile.in --- xscreensaver, Copyright (c) 1999-2004 Jamie Zawinski.
+# Makefile.in --- xscreensaver, Copyright (c) 1999-2005 Jamie Zawinski.
 # the `../configure' script generates `Makefile' from this file.
 
 @SET_MAKE@
 # the `../configure' script generates `Makefile' from this file.
 
 @SET_MAKE@
@@ -7,12 +7,12 @@ VPATH         = @srcdir@
 
 SHELL          = /bin/sh
 SUBDIRS                = utils driver hacks hacks/glx po
 
 SHELL          = /bin/sh
 SUBDIRS                = utils driver hacks hacks/glx po
-TARFILES       = README README.VMS README.debugging INSTALL xscreensaver.lsm \
+TARFILES       = README README.VMS README.debugging INSTALL \
                  configure configure.in Makefile.in config.h.in \
                  config.h-vms install-sh setup.com config.guess aclocal.m4 \
                  config.sub makevms.com \
                  intltool-merge.in intltool-extract.in intltool-update.in \
                  configure configure.in Makefile.in config.h.in \
                  config.h-vms install-sh setup.com config.guess aclocal.m4 \
                  config.sub makevms.com \
                  intltool-merge.in intltool-extract.in intltool-update.in \
-                 xscreensaver.lsm.sh xscreensaver.spec \
+                 xscreensaver.spec \
 
 TAR            = tar
 
 
 TAR            = tar
 
@@ -59,8 +59,6 @@ tar::
   rm -f configure ;                                                        \
   $(MAKE) configure ;                                                      \
   $(MAKE) distdepend ;                                                     \
   rm -f configure ;                                                        \
   $(MAKE) configure ;                                                      \
   $(MAKE) distdepend ;                                                     \
-  sh xscreensaver.lsm.sh > xscreensaver.lsm.$$$$ ;                         \
-  mv xscreensaver.lsm.$$$$ xscreensaver.lsm ;                              \
   NAME=`sed -n                                                             \
   's/[^0-9]*\([0-9]\.[0-9][0-9]*b\?[0-9]*\).*/xscreensaver-\1/p'           \
        utils/version.h` ;                                                  \
   NAME=`sed -n                                                             \
   's/[^0-9]*\([0-9]\.[0-9][0-9]*b\?[0-9]*\).*/xscreensaver-\1/p'           \
        utils/version.h` ;                                                  \
diff --git a/README b/README
index 31b0366f110585e6d4100fca199355cbcd367506..6c5827d757fbb45fb3db7d6ca8f144fda6c24f4c 100644 (file)
--- a/README
+++ b/README
@@ -65,7 +65,7 @@ there's no need to recompile or reinstall anything.
 Along with the xscreensaver daemon itself, this package also includes
 numerous graphics hacks for use as screensavers.  There is nothing
 magic about these: they are just programs that draw on the root window.
 Along with the xscreensaver daemon itself, this package also includes
 numerous graphics hacks for use as screensavers.  There is nothing
 magic about these: they are just programs that draw on the root window.
-More than 180 such programs are included.  For details, see the
+More than 190 such programs are included.  For details, see the
 xscreensaver web page, or the enclosed manual pages.
 
 The latest version of xscreensaver is always available on the web at
 xscreensaver web page, or the enclosed manual pages.
 
 The latest version of xscreensaver is always available on the web at
@@ -76,6 +76,15 @@ the XScreenSaver FAQ about that: http://www.jwz.org/xscreensaver/faq.html
 
                               ============
 
 
                               ============
 
+Changes since 4.19:   * New hacks, `fiberlamp', `boing', `boxfit', and
+                        `carousel'.
+                      * Rewrote `glslideshow' again: should be faster now.
+                      * Sped up loading of images in GL programs.
+                      * `starwars' uses texture-mapped fonts now.
+                      * New `bsod' modes: tru64, hppa, and nvidia.
+                      * Updates to `webcollage', `juggle', `pinion',
+                        `fireworkx', `sonar', `extrusion', `substrate', and
+                        `pong'.
 Changes since 4.18:   * New hacks, `substrate', `intermomentary', `fireworkx',
                         and `pinion'.
                       * New version of `flow'.
 Changes since 4.18:   * New hacks, `substrate', `intermomentary', `fireworkx',
                         and `pinion'.
                       * New version of `flow'.
index b8c26708b83ada18ebd6e3b0d38871c7621b401f..61c6116d696658eb7d1080fc0a164842a51cb6cb 100755 (executable)
--- a/configure
+++ b/configure
@@ -309,7 +309,7 @@ ac_includes_default="\
 # include <unistd.h>
 #endif"
 
 # 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 have_gnome_help 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_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 gnome_open_program gnome_url_show_program 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 GNOME24 GNOME22 NOGNOME 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.
 ac_subst_files=''
 
 # Initialize some variables set by options.
@@ -14796,7 +14796,7 @@ if test "$with_gtk" = yes; then
   pkg_check_version            gtk+-2.0  2.0.1  ; ac_gtk_version_string="$vers"
   pkg_check_version         gmodule-2.0  2.0.0
   pkg_check_version          libxml-2.0  2.4.6
   pkg_check_version            gtk+-2.0  2.0.1  ; ac_gtk_version_string="$vers"
   pkg_check_version         gmodule-2.0  2.0.0
   pkg_check_version          libxml-2.0  2.4.6
-  pkg_check_version        libglade-2.0  2.0.0
+  pkg_check_version        libglade-2.0  1.99.0
   pkg_check_version      gdk-pixbuf-2.0  2.0.0
   pkg_check_version gdk-pixbuf-xlib-2.0  2.0.0
   have_gtk="$ok"
   pkg_check_version      gdk-pixbuf-2.0  2.0.0
   pkg_check_version gdk-pixbuf-xlib-2.0  2.0.0
   have_gtk="$ok"
@@ -14864,20 +14864,20 @@ _ACEOF
 fi
 
 
 fi
 
 
-# Check for the Gnome Help Browser.
+# Check for the various Gnome help and URL loading programs.
 #
 if test "$have_gtk" = yes; then
 #
 if test "$have_gtk" = yes; then
-  for ac_prog in yelp gnome-help-browser
+  for ac_prog in gnome-open
 do
   # Extract the first word of "$ac_prog", so it can be a program name with args.
 set dummy $ac_prog; ac_word=$2
 echo "$as_me:$LINENO: checking for $ac_word" >&5
 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
 do
   # Extract the first word of "$ac_prog", so it can be a program name with args.
 set dummy $ac_prog; ac_word=$2
 echo "$as_me:$LINENO: checking for $ac_word" >&5
 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
-if test "${ac_cv_prog_have_gnome_help+set}" = set; then
+if test "${ac_cv_prog_gnome_open_program+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  if test -n "$have_gnome_help"; then
-  ac_cv_prog_have_gnome_help="$have_gnome_help" # Let the user override the test.
+  if test -n "$gnome_open_program"; then
+  ac_cv_prog_gnome_open_program="$gnome_open_program" # Let the user override the test.
 else
 as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
 for as_dir in $PATH
 else
 as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
 for as_dir in $PATH
@@ -14886,7 +14886,7 @@ do
   test -z "$as_dir" && as_dir=.
   for ac_exec_ext in '' $ac_executable_extensions; do
   if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
   test -z "$as_dir" && as_dir=.
   for ac_exec_ext in '' $ac_executable_extensions; do
   if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_have_gnome_help="$ac_prog"
+    ac_cv_prog_gnome_open_program="$ac_prog"
     echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
     echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
@@ -14895,22 +14895,58 @@ done
 
 fi
 fi
 
 fi
 fi
-have_gnome_help=$ac_cv_prog_have_gnome_help
-if test -n "$have_gnome_help"; then
-  echo "$as_me:$LINENO: result: $have_gnome_help" >&5
-echo "${ECHO_T}$have_gnome_help" >&6
+gnome_open_program=$ac_cv_prog_gnome_open_program
+if test -n "$gnome_open_program"; then
+  echo "$as_me:$LINENO: result: $gnome_open_program" >&5
+echo "${ECHO_T}$gnome_open_program" >&6
 else
   echo "$as_me:$LINENO: result: no" >&5
 echo "${ECHO_T}no" >&6
 fi
 
 else
   echo "$as_me:$LINENO: result: no" >&5
 echo "${ECHO_T}no" >&6
 fi
 
-  test -n "$have_gnome_help" && break
+  test -n "$gnome_open_program" && break
 done
 done
-test -n "$have_gnome_help" || have_gnome_help="no"
 
 
-  if test "$have_gnome_help" != no; then
-    have_gnome_help=yes
+  for ac_prog in gnome-url-show
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_gnome_url_show_program+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$gnome_url_show_program"; then
+  ac_cv_prog_gnome_url_show_program="$gnome_url_show_program" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_gnome_url_show_program="$ac_prog"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
   fi
   fi
+done
+done
+
+fi
+fi
+gnome_url_show_program=$ac_cv_prog_gnome_url_show_program
+if test -n "$gnome_url_show_program"; then
+  echo "$as_me:$LINENO: result: $gnome_url_show_program" >&5
+echo "${ECHO_T}$gnome_url_show_program" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  test -n "$gnome_url_show_program" && break
+done
+
 fi
 
 
 fi
 
 
@@ -16215,7 +16251,7 @@ if test "${ac_cv_mesagl_version_string+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat > conftest.$ac_ext <<EOF
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 16224 "configure"
+#line 16260 "configure"
 #include "confdefs.h"
 #include <GL/gl.h>
 #ifndef MESA_MAJOR_VERSION
 #include "confdefs.h"
 #include <GL/gl.h>
 #ifndef MESA_MAJOR_VERSION
 
 # Another substitution in the XScreenSaver.ad.in file:
 #
 
 # Another substitution in the XScreenSaver.ad.in file:
 #
-if test "$have_gnome_help" = yes; then
-  GNOMEHELP_Y=''
-  GNOMEHELP_N='!    '
+if test "$gnome_open_program" != ''; then
+  GNOME24=''
+  GNOME22='!   '
+  NOGNOME='!   '
+elif test "$gnome_url_show_program" != ''; then
+  GNOME24='!   '
+  GNOME22=''
+  NOGNOME='!   '
 else
 else
-  GNOMEHELP_Y='!    '
-  GNOMEHELP_N=''
+  GNOME24='!   '
+  GNOME22='!   '
+  NOGNOME=''
 fi
 
 
 fi
 
 
@@ -19864,6 +19906,7 @@ INCLUDES=`echo "$INCLUDES" | sed 's@ -I${prefix}/include@@g;'`
 
 
 
 
 
 
+
 
 
 APPDEFAULTS=$ac_x_app_defaults
 
 
 APPDEFAULTS=$ac_x_app_defaults
@@ -19874,7 +19917,7 @@ APPDEFAULTS=$ac_x_app_defaults
 
 
 
 
 
 
-                                                                                ac_config_files="$ac_config_files Makefile utils/Makefile driver/Makefile hacks/Makefile hacks/glx/Makefile po/Makefile.in driver/XScreenSaver.ad driver/xscreensaver.kss"
+                                                                      ac_config_files="$ac_config_files Makefile utils/Makefile driver/Makefile hacks/Makefile hacks/glx/Makefile po/Makefile.in driver/XScreenSaver.ad"
 cat >confcache <<\_ACEOF
 # This file is a shell script that caches the results of configure
 # tests run on this system so they can be shared between configure
 cat >confcache <<\_ACEOF
 # This file is a shell script that caches the results of configure
 # tests run on this system so they can be shared between configure
@@ -20425,7 +20468,6 @@ do
   "hacks/glx/Makefile" ) CONFIG_FILES="$CONFIG_FILES hacks/glx/Makefile" ;;
   "po/Makefile.in" ) CONFIG_FILES="$CONFIG_FILES po/Makefile.in" ;;
   "driver/XScreenSaver.ad" ) CONFIG_FILES="$CONFIG_FILES driver/XScreenSaver.ad" ;;
   "hacks/glx/Makefile" ) CONFIG_FILES="$CONFIG_FILES hacks/glx/Makefile" ;;
   "po/Makefile.in" ) CONFIG_FILES="$CONFIG_FILES po/Makefile.in" ;;
   "driver/XScreenSaver.ad" ) CONFIG_FILES="$CONFIG_FILES driver/XScreenSaver.ad" ;;
-  "driver/xscreensaver.kss" ) CONFIG_FILES="$CONFIG_FILES driver/xscreensaver.kss" ;;
   "default-1" ) CONFIG_COMMANDS="$CONFIG_COMMANDS default-1" ;;
   "default-2" ) CONFIG_COMMANDS="$CONFIG_COMMANDS default-2" ;;
   "config.h" ) CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;;
   "default-1" ) CONFIG_COMMANDS="$CONFIG_COMMANDS default-1" ;;
   "default-2" ) CONFIG_COMMANDS="$CONFIG_COMMANDS default-2" ;;
   "config.h" ) CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;;
@@ -20575,7 +20617,8 @@ s,@POFILES@,$POFILES,;t t
 s,@POSUB@,$POSUB,;t t
 s,@MKINSTALLDIRS@,$MKINSTALLDIRS,;t t
 s,@pkg_config@,$pkg_config,;t t
 s,@POSUB@,$POSUB,;t t
 s,@MKINSTALLDIRS@,$MKINSTALLDIRS,;t t
 s,@pkg_config@,$pkg_config,;t t
-s,@have_gnome_help@,$have_gnome_help,;t t
+s,@gnome_open_program@,$gnome_open_program,;t t
+s,@gnome_url_show_program@,$gnome_url_show_program,;t t
 s,@fortune_tmp@,$fortune_tmp,;t t
 s,@INCLUDES@,$INCLUDES,;t t
 s,@PREFERRED_DEMO_PROGRAM@,$PREFERRED_DEMO_PROGRAM,;t t
 s,@fortune_tmp@,$fortune_tmp,;t t
 s,@INCLUDES@,$INCLUDES,;t t
 s,@PREFERRED_DEMO_PROGRAM@,$PREFERRED_DEMO_PROGRAM,;t t
@@ -20618,8 +20661,9 @@ s,@GL_MEN@,$GL_MEN,;t t
 s,@GL_KLUDGE@,$GL_KLUDGE,;t t
 s,@GLE_EXES@,$GLE_EXES,;t t
 s,@GLE_KLUDGE@,$GLE_KLUDGE,;t t
 s,@GL_KLUDGE@,$GL_KLUDGE,;t t
 s,@GLE_EXES@,$GLE_EXES,;t t
 s,@GLE_KLUDGE@,$GLE_KLUDGE,;t t
-s,@GNOMEHELP_Y@,$GNOMEHELP_Y,;t t
-s,@GNOMEHELP_N@,$GNOMEHELP_N,;t t
+s,@GNOME24@,$GNOME24,;t t
+s,@GNOME22@,$GNOME22,;t t
+s,@NOGNOME@,$NOGNOME,;t t
 s,@HACKDIR@,$HACKDIR,;t t
 s,@GNOME_DATADIR@,$GNOME_DATADIR,;t t
 s,@GLADE_DATADIR@,$GLADE_DATADIR,;t t
 s,@HACKDIR@,$HACKDIR,;t t
 s,@GNOME_DATADIR@,$GNOME_DATADIR,;t t
 s,@GLADE_DATADIR@,$GLADE_DATADIR,;t t
@@ -21375,6 +21419,19 @@ if test "$with_proc_interrupts_req" = yes -a "$have_proc_interrupts" = no; then
   warn "Checking of /proc/interrupts was requested, but it's bogus."
 fi
 
   warn "Checking of /proc/interrupts was requested, but it's bogus."
 fi
 
+if test "$pkg_config" = false ; then
+  warnL 'The "pkg-config" program was not found.  Without that,'
+  warn2 "detection of the various GTK libraries won't work."
+else
+  pkgerr=`$pkg_config --list-all 2>&1 >/dev/null`
+  if test "x$pkgerr" != "x" ; then
+    warnL 'The "pkg-config" program produces errors.  This often causes'
+    warn2 "detection of the various GTK libraries to malfunction."
+    warn2 "The errors are:"
+    echo ''
+    echo "$pkgerr" | sed 's/^/             > /g'
+  fi
+fi
 
 if test "$gtk_halfassed" != no ; then
   warnL "GTK version $gtk_halfassed was found, but at least one supporting"
 
 if test "$gtk_halfassed" != no ; then
   warnL "GTK version $gtk_halfassed was found, but at least one supporting"
@@ -21727,12 +21784,11 @@ if test \! -z "$rpmv" ; then
 
   if test "$rpmbdir" = "$rpmhdir" ; then
     warn2 "The RPM version was installed in $rpmbdir/."
 
   if test "$rpmbdir" = "$rpmhdir" ; then
     warn2 "The RPM version was installed in $rpmbdir/."
+    do_dir_warning=yes
   else
     warn2 "The RPM version was installed in $rpmbdir/,"
     warn2 "with demos in $rpmhdir/."
   fi
   else
     warn2 "The RPM version was installed in $rpmbdir/,"
     warn2 "with demos in $rpmhdir/."
   fi
-
-  do_dir_warning=yes
 fi
 
 
 fi
 
 
@@ -21748,7 +21804,7 @@ if test "$do_dir_warning" = yes; then
   echo '      "xscreensaver-demo", and "xscreensaver-command" executables'
   echo "      will be installed in ${bindir}/."
   echo ""
   echo '      "xscreensaver-demo", and "xscreensaver-command" executables'
   echo "      will be installed in ${bindir}/."
   echo ""
-  echo "      The various graphics demos (180+ different executables) will"
+  echo "      The various graphics demos (190+ different executables) will"
   echo "      be installed in ${HACKDIR}/."
   echo ""
   echo "      If you would prefer the demos to be installed elsewhere,"
   echo "      be installed in ${HACKDIR}/."
   echo ""
   echo "      If you would prefer the demos to be installed elsewhere,"
index 7559754d5c89c658714445dc22366a704899dd59..7e3d2e5ab983a93db667eb2ba2673337861d7720 100644 (file)
@@ -1,4 +1,4 @@
-# configure.in --- xscreensaver, Copyright (c) 1997-2004 Jamie Zawinski.
+# configure.in --- xscreensaver, Copyright (c) 1997-2005 Jamie Zawinski.
 #
 
 AC_PREREQ(2.52)
 #
 
 AC_PREREQ(2.52)
@@ -2104,7 +2104,7 @@ if test "$with_gtk" = yes; then
   pkg_check_version            gtk+-2.0  2.0.1  ; ac_gtk_version_string="$vers"
   pkg_check_version         gmodule-2.0  2.0.0
   pkg_check_version          libxml-2.0  2.4.6
   pkg_check_version            gtk+-2.0  2.0.1  ; ac_gtk_version_string="$vers"
   pkg_check_version         gmodule-2.0  2.0.0
   pkg_check_version          libxml-2.0  2.4.6
-  pkg_check_version        libglade-2.0  2.0.0
+  pkg_check_version        libglade-2.0  1.99.0
   pkg_check_version      gdk-pixbuf-2.0  2.0.0
   pkg_check_version gdk-pixbuf-xlib-2.0  2.0.0
   have_gtk="$ok"
   pkg_check_version      gdk-pixbuf-2.0  2.0.0
   pkg_check_version gdk-pixbuf-xlib-2.0  2.0.0
   have_gtk="$ok"
@@ -2149,13 +2149,11 @@ if test "$with_gtk" = yes; then
 fi
 
 
 fi
 
 
-# Check for the Gnome Help Browser.
+# Check for the various Gnome help and URL loading programs.
 #
 if test "$have_gtk" = yes; then
 #
 if test "$have_gtk" = yes; then
-  AC_CHECK_PROGS(have_gnome_help, yelp gnome-help-browser, no)
-  if test "$have_gnome_help" != no; then
-    have_gnome_help=yes
-  fi
+  AC_CHECK_PROGS(gnome_open_program,     gnome-open)
+  AC_CHECK_PROGS(gnome_url_show_program, gnome-url-show)
 fi
 
 
 fi
 
 
@@ -3162,12 +3160,18 @@ fi
 
 # Another substitution in the XScreenSaver.ad.in file:
 #
 
 # Another substitution in the XScreenSaver.ad.in file:
 #
-if test "$have_gnome_help" = yes; then
-  GNOMEHELP_Y=''
-  GNOMEHELP_N='!    '
+if test "$gnome_open_program" != ''; then
+  GNOME24=''
+  GNOME22='!   '
+  NOGNOME='!   '
+elif test "$gnome_url_show_program" != ''; then
+  GNOME24='!   '
+  GNOME22=''
+  NOGNOME='!   '
 else
 else
-  GNOMEHELP_Y='!    '
-  GNOMEHELP_N=''
+  GNOME24='!   '
+  GNOME22='!   '
+  NOGNOME=''
 fi
 
 
 fi
 
 
@@ -3294,8 +3298,9 @@ AC_SUBST(GL_MEN)
 AC_SUBST(GL_KLUDGE)
 AC_SUBST(GLE_EXES)
 AC_SUBST(GLE_KLUDGE)
 AC_SUBST(GL_KLUDGE)
 AC_SUBST(GLE_EXES)
 AC_SUBST(GLE_KLUDGE)
-AC_SUBST(GNOMEHELP_Y)
-AC_SUBST(GNOMEHELP_N)
+AC_SUBST(GNOME24)
+AC_SUBST(GNOME22)
+AC_SUBST(NOGNOME)
 AC_SUBST(HACKDIR)
 AC_SUBST(GNOME_DATADIR)
 AC_SUBST(GLADE_DATADIR)
 AC_SUBST(HACKDIR)
 AC_SUBST(GNOME_DATADIR)
 AC_SUBST(GLADE_DATADIR)
@@ -3318,8 +3323,7 @@ AC_OUTPUT(Makefile
           hacks/Makefile
           hacks/glx/Makefile
           po/Makefile.in
           hacks/Makefile
           hacks/glx/Makefile
           po/Makefile.in
-          driver/XScreenSaver.ad
-          driver/xscreensaver.kss)
+          driver/XScreenSaver.ad)
 
 ###############################################################################
 #
 
 ###############################################################################
 #
@@ -3421,6 +3425,19 @@ if test "$with_proc_interrupts_req" = yes -a "$have_proc_interrupts" = no; then
   warn "Checking of /proc/interrupts was requested, but it's bogus."
 fi
 
   warn "Checking of /proc/interrupts was requested, but it's bogus."
 fi
 
+if test "$pkg_config" = false ; then
+  warnL 'The "pkg-config" program was not found.  Without that,'
+  warn2 "detection of the various GTK libraries won't work."
+else
+  pkgerr=`$pkg_config --list-all 2>&1 >/dev/null`
+  if test "x$pkgerr" != "x" ; then
+    warnL 'The "pkg-config" program produces errors.  This often causes'
+    warn2 "detection of the various GTK libraries to malfunction."
+    warn2 "The errors are:"
+    echo ''
+    echo "$pkgerr" | sed 's/^/             > /g'
+  fi
+fi
 
 if test "$gtk_halfassed" != no ; then
   warnL "GTK version $gtk_halfassed was found, but at least one supporting"
 
 if test "$gtk_halfassed" != no ; then
   warnL "GTK version $gtk_halfassed was found, but at least one supporting"
@@ -3768,12 +3785,11 @@ if test \! -z "$rpmv" ; then
 
   if test "$rpmbdir" = "$rpmhdir" ; then
     warn2 "The RPM version was installed in $rpmbdir/."
 
   if test "$rpmbdir" = "$rpmhdir" ; then
     warn2 "The RPM version was installed in $rpmbdir/."
+    do_dir_warning=yes
   else
     warn2 "The RPM version was installed in $rpmbdir/,"
     warn2 "with demos in $rpmhdir/."
   fi
   else
     warn2 "The RPM version was installed in $rpmbdir/,"
     warn2 "with demos in $rpmhdir/."
   fi
-
-  do_dir_warning=yes
 fi
 
 
 fi
 
 
@@ -3789,7 +3805,7 @@ if test "$do_dir_warning" = yes; then
   echo '      "xscreensaver-demo", and "xscreensaver-command" executables'
   echo "      will be installed in ${bindir}/."
   echo ""
   echo '      "xscreensaver-demo", and "xscreensaver-command" executables'
   echo "      will be installed in ${bindir}/."
   echo ""
-  echo "      The various graphics demos (180+ different executables) will"
+  echo "      The various graphics demos (190+ different executables) will"
   echo "      be installed in ${HACKDIR}/."
   echo ""
   echo "      If you would prefer the demos to be installed elsewhere,"
   echo "      be installed in ${HACKDIR}/."
   echo ""
   echo "      If you would prefer the demos to be installed elsewhere,"
index 2830471053e7c9ffa7692d9def6bf4c68f6bbc3e..f1d0ca549a9bb2fc88acf5f2636b64ba432db24a 100644 (file)
@@ -1,4 +1,4 @@
-# driver/Makefile.in --- xscreensaver, Copyright (c) 1997-2004 Jamie Zawinski.
+# driver/Makefile.in --- xscreensaver, Copyright (c) 1997-2005 Jamie Zawinski.
 # the `../configure' script generates `driver/Makefile' from this file.
 
 @SET_MAKE@
 # the `../configure' script generates `driver/Makefile' from this file.
 
 @SET_MAKE@
@@ -238,7 +238,6 @@ EXTRAS              = README Makefile.in XScreenSaver.ad.in xscreensaver.pam \
                  xscreensaver-demo.glade2p \
                  screensaver-properties.desktop.in \
                  screensaver-properties-capplet \
                  xscreensaver-demo.glade2p \
                  screensaver-properties.desktop.in \
                  screensaver-properties-capplet \
-                 xscreensaver.kss.in \
                  .gdbinit
 VMSFILES       = compile_axp.com compile_decc.com link_axp.com link_decc.com \
                  vms-getpwnam.c vms-pwd.h vms-hpwd.c vms-validate.c \
                  .gdbinit
 VMSFILES       = compile_axp.com compile_decc.com link_axp.com link_decc.com \
                  vms-getpwnam.c vms-pwd.h vms-hpwd.c vms-validate.c \
@@ -257,9 +256,9 @@ all: $(EXES) $(EXES2)
 tests: $(TEST_EXES)
 
 install:   install-program   install-ad    install-scripts \
 tests: $(TEST_EXES)
 
 install:   install-program   install-ad    install-scripts \
-          install-gnome     install-kde   install-man   @INSTALL_PAM@
+          install-gnome     install-man   @INSTALL_PAM@
 uninstall: uninstall-program uninstall-ad  \
 uninstall: uninstall-program uninstall-ad  \
-          uninstall-gnome   uninstall-kde uninstall-man
+          uninstall-gnome   uninstall-man
 
 install-strip:
        $(MAKE) INSTALL_PROGRAM='$(INSTALL_PROGRAM) -s' \
 
 install-strip:
        $(MAKE) INSTALL_PROGRAM='$(INSTALL_PROGRAM) -s' \
@@ -678,42 +677,6 @@ uninstall-gnome::
           done                                                              ;\
         fi
 
           done                                                              ;\
         fi
 
-# xscreensaver.kss
-install-kde:
-       @src="xscreensaver.kss" ;                                             \
-       if [ "$$KDEDIR" != "" ]; then                                         \
-         dir="$(install_prefix)$$KDEDIR/bin" ;                               \
-         dest="$$dir/$$src" ;                                                \
-         echo $(INSTALL_SCRIPT) $$src $$dest ;                               \
-         if $(INSTALL_SCRIPT) $$src $$dest ; then                            \
-           true ;                                                            \
-         else                                                                \
-           e=echo ;                                                          \
- $$e ""                                                                             ;\
- $$e "  ####################################################################";\
- $$e "  Warning: unable to install $$dest"                                  ;\
-           if [ ! -d $(install_prefix)$$KDEDIR ]; then                       \
- $$e "           $(install_prefix)$$KDEDIR (\$$KDEDIR) does not exist."             ;\
-           elif [ ! -d $(install_prefix)$$KDEDIR/bin ]; then                 \
- $$e "           $(install_prefix)$$KDEDIR/bin (\$$KDEDIR/bin) does not exist.";\
-           elif [ -f $$dest ]; then                                          \
- $$e "           That file exists, and is unwritable."                      ;\
-           else                                                              \
- $$e "           The directory is unwritable."                              ;\
-           fi                                                               ;\
- $$e "  ####################################################################";\
- $$e ""                                                                             ;\
-           exit 1 ;                                                          \
-         fi ;                                                                \
-       fi
-
-uninstall-kde:
-       @if [ "$$KDEDIR" != "" ]; then                                  \
-         dest="$(install_prefix)$$KDEDIR/bin/xscreensaver.kss" ;       \
-         echo rm -f $$dest ;                                           \
-         rm -f $$dest ;                                                \
-       fi
-
 clean:
        -rm -f *.o a.out core $(EXES) $(EXES2) $(TEST_EXES) XScreenSaver_ad.h
 
 clean:
        -rm -f *.o a.out core $(EXES) $(EXES2) $(TEST_EXES) XScreenSaver_ad.h
 
index 5fb206bccc5d348c54b325e0f8e1b0214d778280..25f99c323d8984b4cdc3cb912f209c8335da3750 100644 (file)
@@ -4,8 +4,8 @@
 !            a screen saver and locker for the X window system
 !                            by Jamie Zawinski
 !
 !            a screen saver and locker for the X window system
 !                            by Jamie Zawinski
 !
-!                              version 4.19
-!                              16-Dec-2004
+!                              version 4.20
+!                              23-Feb-2005
 !
 ! See "man xscreensaver" for more info.  The latest version is always
 ! available at http://www.jwz.org/xscreensaver/
 !
 ! See "man xscreensaver" for more info.  The latest version is always
 ! available at http://www.jwz.org/xscreensaver/
@@ -77,19 +77,37 @@ GetViewPortIsFullOfLies: False
 ! This is what the "Prefs" button on the splash screen runs (/bin/sh syntax.)
 *prefsCommand: xscreensaver-demo -prefs
 
 ! This is what the "Prefs" button on the splash screen runs (/bin/sh syntax.)
 *prefsCommand: xscreensaver-demo -prefs
 
-! This is the URL that the "Help" button on the splash screen loads.
+! This is the URL loaded by the "Help" button on the splash screen,
+! and by the "Documentation" menu item in xscreensaver-demo.
 *helpURL: http://www.jwz.org/xscreensaver/man.html
 
 *helpURL: http://www.jwz.org/xscreensaver/man.html
 
-! This is how the "Help" button loads URLs (/bin/sh syntax.)
-! The "helpURL" will be substituted for up to two occurrences of "%s".
-@GNOMEHELP_N@*loadURL: mozilla '%s' || netscape '%s'
-@GNOMEHELP_Y@*loadURL: gnome-url-show '%s' || gnome-moz-remote --newwin '%s'
-
-! This is what the "Manual" button in xscreensaver-demo runs (/bin/sh syntax.)
-@GNOMEHELP_N@*manualCommand: xterm -sb -fg black -bg gray75 -T '%s manual' \
-@GNOMEHELP_N@        -e /bin/sh -c 'man "%s" ; read foo'
-! For GNOME systems:
-@GNOMEHELP_Y@*manualCommand: yelp 'man:%s' || gnome-help-browser 'man:%s'
+! loadURL       -- how the "Help" buttons load the helpURL (/bin/sh syntax.)
+! manualCommand -- how the "Documentation" buttons display man pages.
+!
+! And there are so very many options to choose from!
+!
+!   Gnome 2.4, 2.6: (yelp can't display man pages, as of 2.6.3)
+!
+@GNOME24@*loadURL: gnome-open '%s'
+@GNOME24@*manualCommand: gnome-terminal --title '%s manual' \
+@GNOME24@              --command '/bin/sh -c "man %s; read foo"'
+!
+!   Gnome 2.2:
+!
+@GNOME22@*loadURL: gnome-url-show '%s'
+@GNOME22@*manualCommand: gnome-terminal --title '%s manual' \
+@GNOME22@              --command '/bin/sh -c "man %s; read foo"'
+!
+!   Gnome 1.4:
+!
+!      *loadURL: gnome-moz-remote --newwin '%s'
+!      *manualCommand: gnome-help-browser 'man:%s'
+!
+!   non-Gnome systems:
+!
+@NOGNOME@*loadURL: firefox '%s' || mozilla '%s' || netscape '%s'
+@NOGNOME@*manualCommand: xterm -sb -fg black -bg gray75 -T '%s manual' \
+@NOGNOME@                  -e /bin/sh -c 'man "%s" ; read foo'
 
 
 ! The format used for printing the date and time in the password dialog box
 
 
 ! The format used for printing the date and time in the password dialog box
@@ -282,8 +300,11 @@ GetViewPortIsFullOfLies: False
                                anemotaxis -root                            \n\
                                memscroller -root                           \n\
                                substrate -root                             \n\
                                anemotaxis -root                            \n\
                                memscroller -root                           \n\
                                substrate -root                             \n\
+        "Substrate (circles)"  substrate -root -circle-percent 33          \n\
                                intermomentary -root                        \n\
                                fireworkx -root                             \n\
                                intermomentary -root                        \n\
                                fireworkx -root                             \n\
+                               fiberlamp -root                             \n\
+                               boxfit -root                                \n\
 - default-n:                   webcollage -root                            \n\
 - default-n:  "WebCollage (whacked)"                                         \
                                webcollage -root -filter                      \
 - default-n:                   webcollage -root                            \n\
 - default-n:  "WebCollage (whacked)"                                         \
                                webcollage -root -filter                      \
@@ -360,8 +381,9 @@ GetViewPortIsFullOfLies: False
 -         GL:                  antinspect -root                            \n\
 @GL_KLUDGE@ GL:                        providence -root                            \n\
 @GL_KLUDGE@ GL:        "Pinion (large gears)"  pinion -root                        \n\
 -         GL:                  antinspect -root                            \n\
 @GL_KLUDGE@ GL:                        providence -root                            \n\
 @GL_KLUDGE@ GL:        "Pinion (large gears)"  pinion -root                        \n\
-@GL_KLUDGE@ GL:        "Pinion (small gears)"  pinion -root -size 0.2              \n\
-@GL_KLUDGE@ GL:                        pinion -root                                \n\
+@GL_KLUDGE@ GL:        "Pinion (small gears)"  pinion -root -size 0.2 -scroll 0.3  \n\
+@GL_KLUDGE@ GL:                        boing -root -lighting -smooth               \n\
+-         GL:                  carousel -root                             \n
                                                                              \
 -                              xdaliclock -root -builtin3 -cycle           \n\
 - default-n:                   xearth -nofork -nostars -ncolors 50           \
                                                                              \
 -                              xdaliclock -root -builtin3 -cycle           \n\
 - default-n:                   xearth -nofork -nostars -ncolors 50           \
@@ -432,7 +454,7 @@ XScreenSaver.bourneShell:           /bin/sh
 *passwd.thermometer.width:     8
 
 *splash.heading.label:         XScreenSaver %s
 *passwd.thermometer.width:     8
 
 *splash.heading.label:         XScreenSaver %s
-*splash.body.label:            Copyright © 1991-2004 by
+*splash.body.label:            Copyright © 1991-2005 by
 *splash.body2.label:           Jamie Zawinski <jwz@jwz.org>
 *splash.demo.label:            Settings
 *splash.help.label:            Help
 *splash.body2.label:           Jamie Zawinski <jwz@jwz.org>
 *splash.demo.label:            Settings
 *splash.help.label:            Help
@@ -625,6 +647,7 @@ XScreenSaver*doc.fontList:       *-helvetica-medium-r-*-*-*-100-*-*-*-iso8859-1
 *hacks.blinkbox.name:       BlinkBox
 *hacks.fuzzyflakes.name:    FuzzyFlakes
 *hacks.memscroller.name:    MemScroller
 *hacks.blinkbox.name:       BlinkBox
 *hacks.fuzzyflakes.name:    FuzzyFlakes
 *hacks.memscroller.name:    MemScroller
+*hacks.boxfit.name:         BoxFit
 
 ! obsolete, but still used by xscreensaver-demo-Xm.
 *hacks.documentation.isInstalled: True
 
 ! obsolete, but still used by xscreensaver-demo-Xm.
 *hacks.documentation.isInstalled: True
index 9a42c77a7b0b9b5348bbc0bb301ca57721a389d2..c070ae6bcd93ec068e5f3f515887c351fad60c22 100644 (file)
@@ -40,8 +40,9 @@
 "*demoCommand: xscreensaver-demo",
 "*prefsCommand: xscreensaver-demo -prefs",
 "*helpURL: http://www.jwz.org/xscreensaver/man.html",
 "*demoCommand: xscreensaver-demo",
 "*prefsCommand: xscreensaver-demo -prefs",
 "*helpURL: http://www.jwz.org/xscreensaver/man.html",
-"*loadURL: gnome-url-show '%s' || gnome-moz-remote --newwin '%s'",
-"*manualCommand: yelp 'man:%s' || gnome-help-browser 'man:%s'",
+"*loadURL: gnome-open '%s'",
+"*manualCommand: gnome-terminal --title '%s manual' \
+               --command '/bin/sh -c \"man %s; read foo\"'",
 "*dateFormat:          %d-%b-%y (%a); %I:%M %p",
 "*installColormap:     True",
 "*programs:                                                                  \
 "*dateFormat:          %d-%b-%y (%a); %I:%M %p",
 "*installColormap:     True",
 "*programs:                                                                  \
                                anemotaxis -root                            \\n\
                                memscroller -root                           \\n\
                                substrate -root                             \\n\
                                anemotaxis -root                            \\n\
                                memscroller -root                           \\n\
                                substrate -root                             \\n\
+        \"Substrate (circles)\"  substrate -root -circle-percent 33          \\n\
                                intermomentary -root                        \\n\
                                fireworkx -root                             \\n\
                                intermomentary -root                        \\n\
                                fireworkx -root                             \\n\
+                               fiberlamp -root                             \\n\
+                               boxfit -root                                \\n\
 - default-n:                   webcollage -root                            \\n\
 - default-n:  \"WebCollage (whacked)\"                                       \
                                webcollage -root -filter                      \
 - default-n:                   webcollage -root                            \\n\
 - default-n:  \"WebCollage (whacked)\"                                       \
                                webcollage -root -filter                      \
 -         GL:     \"Pulsar (textures)\"                                              \
                                  pulsar -root -texture -mipmap               \
                                  -texture_quality -light -fog              \\n\
 -         GL:     \"Pulsar (textures)\"                                              \
                                  pulsar -root -texture -mipmap               \
                                  -texture_quality -light -fog              \\n\
--         GL:                  extrusion -root                             \\n\
+          GL:                  extrusion -root                             \\n\
           GL:                  sierpinski3d -root                          \\n\
           GL:                  menger -root                                \\n\
           GL:   \"GFlux\"      gflux -root                                 \\n\
           GL:                  sierpinski3d -root                          \\n\
           GL:                  menger -root                                \\n\
           GL:   \"GFlux\"      gflux -root                                 \\n\
 -         GL:                  antinspect -root                            \\n\
           GL:                  providence -root                            \\n\
           GL:  \"Pinion (large gears)\"        pinion -root                        \\n\
 -         GL:                  antinspect -root                            \\n\
           GL:                  providence -root                            \\n\
           GL:  \"Pinion (large gears)\"        pinion -root                        \\n\
-          GL:  \"Pinion (small gears)\"        pinion -root -size 0.2              \\n\
-          GL:                  pinion -root                                \\n\
-                                                                             \
+          GL:  \"Pinion (small gears)\"        pinion -root -size 0.2 -scroll 0.3  \\n\
+          GL:                  boing -root -lighting -smooth               \\n\
+-         GL:                  carousel -root                             \\n",
+"                                                                            \
 -                              xdaliclock -root -builtin3 -cycle           \\n\
 - default-n:                   xearth -nofork -nostars -ncolors 50           \
                                  -night 3 -wait 0 -timewarp 400.0 -pos       \
 -                              xdaliclock -root -builtin3 -cycle           \\n\
 - default-n:                   xearth -nofork -nostars -ncolors 50           \
                                  -night 3 -wait 0 -timewarp 400.0 -pos       \
 "*passwd.passwdFont:           *-courier-medium-r-*-*-*-140-*-*-*-iso8859-1",
 "*passwd.thermometer.width:    8",
 "*splash.heading.label:                XScreenSaver %s",
 "*passwd.passwdFont:           *-courier-medium-r-*-*-*-140-*-*-*-iso8859-1",
 "*passwd.thermometer.width:    8",
 "*splash.heading.label:                XScreenSaver %s",
-"*splash.body.label:           Copyright © 1991-2004 by",
+"*splash.body.label:           Copyright © 1991-2005 by",
 "*splash.body2.label:          Jamie Zawinski <jwz@jwz.org>",
 "*splash.demo.label:           Settings",
 "*splash.help.label:           Help",
 "*splash.body2.label:          Jamie Zawinski <jwz@jwz.org>",
 "*splash.demo.label:           Settings",
 "*splash.help.label:           Help",
 "*hacks.blinkbox.name:       BlinkBox",
 "*hacks.fuzzyflakes.name:    FuzzyFlakes",
 "*hacks.memscroller.name:    MemScroller",
 "*hacks.blinkbox.name:       BlinkBox",
 "*hacks.fuzzyflakes.name:    FuzzyFlakes",
 "*hacks.memscroller.name:    MemScroller",
+"*hacks.boxfit.name:         BoxFit",
 "*hacks.documentation.isInstalled: True",
 "*hacks.documentation.isInstalled: True",
index c9cfbce278975fcf6cefdc2c2baefd6730b9872b..f9c066c3d81dc0c280350e8c1aeb42025ad49e3b 100644 (file)
@@ -1,5 +1,5 @@
 /* demo-Gtk.c --- implements the interactive demo-mode and options dialogs.
 /* demo-Gtk.c --- implements the interactive demo-mode and options dialogs.
- * xscreensaver, Copyright (c) 1993-2004 Jamie Zawinski <jwz@jwz.org>
+ * xscreensaver, Copyright (c) 1993-2005 Jamie Zawinski <jwz@jwz.org>
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
  * documentation for any purpose is hereby granted without fee, provided that
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
  * documentation for any purpose is hereby granted without fee, provided that
@@ -665,9 +665,9 @@ about_menu_cb (GtkMenuItem *menuitem, gpointer user_data)
      look as good in the plain-old default Latin1 "C" locale.)
    */
 #ifdef HAVE_GTK2
      look as good in the plain-old default Latin1 "C" locale.)
    */
 #ifdef HAVE_GTK2
-  sprintf(copy, ("Copyright \xC2\xA9 1991-2004 %s"), s);
+  sprintf(copy, ("Copyright \xC2\xA9 1991-2005 %s"), s);
 #else  /* !HAVE_GTK2 */
 #else  /* !HAVE_GTK2 */
-  sprintf(copy, ("Copyright \251 1991-2004 %s"), s);
+  sprintf(copy, ("Copyright \251 1991-2005 %s"), s);
 #endif /* !HAVE_GTK2 */
 
   sprintf (msg, "%s\n\n%s", copy, desc);
 #endif /* !HAVE_GTK2 */
 
   sprintf (msg, "%s\n\n%s", copy, desc);
@@ -789,10 +789,11 @@ doc_menu_cb (GtkMenuItem *menuitem, gpointer user_data)
     }
 
   help_command = (char *) malloc (strlen (p->load_url_command) +
     }
 
   help_command = (char *) malloc (strlen (p->load_url_command) +
-                                 (strlen (p->help_url) * 2) + 20);
+                                 (strlen (p->help_url) * 4) + 20);
   strcpy (help_command, "( ");
   sprintf (help_command + strlen(help_command),
   strcpy (help_command, "( ");
   sprintf (help_command + strlen(help_command),
-           p->load_url_command, p->help_url, p->help_url);
+           p->load_url_command,
+           p->help_url, p->help_url, p->help_url, p->help_url);
   strcat (help_command, " ) &");
   system (help_command);
   free (help_command);
   strcat (help_command, " ) &");
   system (help_command);
   free (help_command);
@@ -984,7 +985,7 @@ manual_cb (GtkButton *button, gpointer user_data)
   cmd = get_string_resource ("manualCommand", "ManualCommand");
   if (cmd)
     {
   cmd = get_string_resource ("manualCommand", "ManualCommand");
   if (cmd)
     {
-      char *cmd2 = (char *) malloc (strlen (cmd) + strlen (name2) + 100);
+      char *cmd2 = (char *) malloc (strlen (cmd) + (strlen (name2) * 4) + 100);
       strcpy (cmd2, "( ");
       sprintf (cmd2 + strlen (cmd2),
                cmd,
       strcpy (cmd2, "( ");
       sprintf (cmd2 + strlen (cmd2),
                cmd,
@@ -2442,6 +2443,7 @@ populate_prefs_page (state *s)
 
   {
     Bool found_any_writable_cells = False;
 
   {
     Bool found_any_writable_cells = False;
+    Bool fading_possible = False;
     Bool dpms_supported = False;
 
     Display *dpy = GDK_DISPLAY();
     Bool dpms_supported = False;
 
     Display *dpy = GDK_DISPLAY();
@@ -2457,8 +2459,9 @@ populate_prefs_page (state *s)
          }
       }
 
          }
       }
 
+    fading_possible = found_any_writable_cells;
 #ifdef HAVE_XF86VMODE_GAMMA
 #ifdef HAVE_XF86VMODE_GAMMA
-    found_any_writable_cells = True;  /* if we can gamma fade, go for it */
+    fading_possible = True;
 #endif
 
 #ifdef HAVE_DPMS_EXTENSION
 #endif
 
 #ifdef HAVE_DPMS_EXTENSION
@@ -2495,14 +2498,14 @@ populate_prefs_page (state *s)
 
     /* Colormaps
      */
 
     /* Colormaps
      */
-    SENSITIZE ("cmap_frame",      found_any_writable_cells);
+    SENSITIZE ("cmap_frame",      found_any_writable_cells || fading_possible);
     SENSITIZE ("install_button",  found_any_writable_cells);
     SENSITIZE ("install_button",  found_any_writable_cells);
-    SENSITIZE ("fade_button",     found_any_writable_cells);
-    SENSITIZE ("unfade_button",   found_any_writable_cells);
+    SENSITIZE ("fade_button",     fading_possible);
+    SENSITIZE ("unfade_button",   fading_possible);
 
 
-    SENSITIZE ("fade_label",      (found_any_writable_cells &&
+    SENSITIZE ("fade_label",      (fading_possible &&
                                    (p->fade_p || p->unfade_p)));
                                    (p->fade_p || p->unfade_p)));
-    SENSITIZE ("fade_spinbutton", (found_any_writable_cells &&
+    SENSITIZE ("fade_spinbutton", (fading_possible &&
                                    (p->fade_p || p->unfade_p)));
 
 # undef SENSITIZE
                                    (p->fade_p || p->unfade_p)));
 
 # undef SENSITIZE
index c0f72e3a772c74990417e9c96ba8c7fbccb0624b..b5eebb4ee0b3369519efcbc1699545162e525ec1 100644 (file)
@@ -385,10 +385,11 @@ doc_menu_cb (Widget button, XtPointer client_data, XtPointer ignored)
     }
 
   help_command = (char *) malloc (strlen (p->load_url_command) +
     }
 
   help_command = (char *) malloc (strlen (p->load_url_command) +
-                                 (strlen (p->help_url) * 2) + 20);
+                                 (strlen (p->help_url) * 4) + 20);
   strcpy (help_command, "( ");
   sprintf (help_command + strlen(help_command),
   strcpy (help_command, "( ");
   sprintf (help_command + strlen(help_command),
-           p->load_url_command, p->help_url, p->help_url);
+           p->load_url_command,
+           p->help_url, p->help_url, p->help_url, p->help_url);
   strcat (help_command, " ) &");
   system (help_command);
   free (help_command);
   strcat (help_command, " ) &");
   system (help_command);
   free (help_command);
@@ -674,7 +675,7 @@ manual_cb (Widget button, XtPointer client_data, XtPointer ignored)
   cmd = get_string_resource ("manualCommand", "ManualCommand");
   if (cmd)
     {
   cmd = get_string_resource ("manualCommand", "ManualCommand");
   if (cmd)
     {
-      char *cmd2 = (char *) malloc (strlen (cmd) + strlen (name2) + 100);
+      char *cmd2 = (char *) malloc (strlen (cmd) + (strlen (name2) * 4) + 100);
       strcpy (cmd2, "( ");
       sprintf (cmd2 + strlen (cmd2),
                cmd,
       strcpy (cmd2, "( ");
       sprintf (cmd2 + strlen (cmd2),
                cmd,
index debeaff44bd5ded32f125a3db94aabd982fc4c0b..59816a32eea2dcbc3016bd1764fa36af9f3dd461 100644 (file)
@@ -1,4 +1,4 @@
-/* xscreensaver, Copyright (c) 1991-2003 Jamie Zawinski <jwz@netscape.com>
+/* xscreensaver, Copyright (c) 1991-2005 Jamie Zawinski <jwz@netscape.com>
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
  * documentation for any purpose is hereby granted without fee, provided that
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
  * documentation for any purpose is hereby granted without fee, provided that
@@ -854,8 +854,9 @@ do_help (saver_info *si)
     }
 
   help_command = (char *) malloc (strlen (p->load_url_command) +
     }
 
   help_command = (char *) malloc (strlen (p->load_url_command) +
-                                 (strlen (p->help_url) * 2) + 10);
-  sprintf (help_command, p->load_url_command, p->help_url, p->help_url);
+                                 (strlen (p->help_url) * 4) + 10);
+  sprintf (help_command, p->load_url_command,
+           p->help_url, p->help_url, p->help_url, p->help_url);
   fork_and_exec (si, help_command, "URL-loading");
   free (help_command);
 }
   fork_and_exec (si, help_command, "URL-loading");
   free (help_command);
 }
index 108905f0fd6fdade85859ec0d57d36e4f7c59cea..6b87c7e708426b12ec9b914e8b4b8014a256b8ab 100644 (file)
@@ -20,6 +20,7 @@
 #endif
 
 #include <stdio.h>
 #endif
 
 #include <stdio.h>
+#include <time.h>
 #include <sys/time.h>
 
 #include <X11/Xlib.h>
 #include <sys/time.h>
 
 #include <X11/Xlib.h>
index 5ba24b4a9d1ab2a16df126c81a0a67915ccb76f7..da86e04d79d78779064c1102ceb9d079496141a2 100644 (file)
@@ -1,5 +1,5 @@
 /* test-randr.c --- playing with the Resize And Rotate extension.
 /* test-randr.c --- playing with the Resize And Rotate extension.
- * xscreensaver, Copyright (c) 2004 Jamie Zawinski <jwz@jwz.org>
+ * xscreensaver, Copyright (c) 2004, 2005 Jamie Zawinski <jwz@jwz.org>
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
  * documentation for any purpose is hereby granted without fee, provided that
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
  * documentation for any purpose is hereby granted without fee, provided that
@@ -134,6 +134,9 @@ main (int argc, char **argv)
             XRRConfigCurrentConfiguration (rrc, &current_rotation);
 
           /* Times */
             XRRConfigCurrentConfiguration (rrc, &current_rotation);
 
           /* Times */
+# if 0    /* #### This is wrong -- I don't understand what these two
+                  timestamp numbers represent, or how they correlate
+                  to the wall clock or to each other. */
           {
             Time server_time, config_time;
             server_time = XRRConfigTimes (rrc, &config_time);
           {
             Time server_time, config_time;
             server_time = XRRConfigTimes (rrc, &config_time);
@@ -144,6 +147,7 @@ main (int argc, char **argv)
               fprintf (stderr, "%s:   config changed %lu seconds ago\n",
                        blurb(), (unsigned long) (server_time - config_time));
           }
               fprintf (stderr, "%s:   config changed %lu seconds ago\n",
                        blurb(), (unsigned long) (server_time - config_time));
           }
+# endif
 
           /* Rotations */
           {
 
           /* Rotations */
           {
index c80eb29dc5d2842f1b57c90f2fa13f8379feb144..fe08d2ea640a8efbe005a9576f4d688853c26055 100644 (file)
@@ -57,7 +57,7 @@ static char *usage = "\n\
 usage: %s -<option>\n\
 \n\
   This program provides external control of a running xscreensaver process.\n\
 usage: %s -<option>\n\
 \n\
   This program provides external control of a running xscreensaver process.\n\
-  Version %s, copyright (c) 1991-2003 Jamie Zawinski <jwz@jwz.org>.\n\
+  Version %s, copyright (c) 1991-2005 Jamie Zawinski <jwz@jwz.org>.\n\
 \n\
   The xscreensaver program is a daemon that runs in the background.\n\
   You control a running xscreensaver process by sending it messages\n\
 \n\
   The xscreensaver program is a daemon that runs in the background.\n\
   You control a running xscreensaver process by sending it messages\n\
index 00a39a51bd6b814a1e60a56c420488e003c97108..9c30af47251430b8e64d182ab8e38853a57d1d70 100644 (file)
@@ -11,7 +11,7 @@
 .if n .sp 1
 .if t .sp .5
 ..
 .if n .sp 1
 .if t .sp .5
 ..
-.TH XScreenSaver 1 "16-Dec-2004 (4.19)" "X Version 11"
+.TH XScreenSaver 1 "23-Feb-2005 (4.20)" "X Version 11"
 .SH NAME
 xscreensaver-command - control a running xscreensaver process
 .SH SYNOPSIS
 .SH NAME
 xscreensaver-command - control a running xscreensaver process
 .SH SYNOPSIS
@@ -260,7 +260,7 @@ and related tools can always be found at http://www.jwz.org/xscreensaver/
 .BR xscreensaver\-demo (1),
 .BR xset (1)
 .SH COPYRIGHT
 .BR xscreensaver\-demo (1),
 .BR xset (1)
 .SH COPYRIGHT
-Copyright \(co 1992, 1993, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004
+Copyright \(co 1992, 1993, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
 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
 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 7ad902197b4ae4313460a0d0d171ce3e93d542d9..02e796fc2a39b7a8921a03b0cc0c33135f391dc3 100644 (file)
   <property name="modal">False</property>
   <property name="resizable">True</property>
   <property name="destroy_with_parent">False</property>
   <property name="modal">False</property>
   <property name="resizable">True</property>
   <property name="destroy_with_parent">False</property>
+  <property name="decorated">True</property>
+  <property name="skip_taskbar_hint">False</property>
+  <property name="skip_pager_hint">False</property>
+  <property name="type_hint">GDK_WINDOW_TYPE_HINT_NORMAL</property>
+  <property name="gravity">GDK_GRAVITY_NORTH_WEST</property>
 
   <child>
     <widget class="GtkVBox" id="outer_vbox">
 
   <child>
     <widget class="GtkVBox" id="outer_vbox">
                        <widget class="GtkEventBox" id="lock_button_eventbox">
                          <property name="visible">True</property>
                          <property name="tooltip" translatable="yes">Whether a password should be required to un-blank the screen.</property>
                        <widget class="GtkEventBox" id="lock_button_eventbox">
                          <property name="visible">True</property>
                          <property name="tooltip" translatable="yes">Whether a password should be required to un-blank the screen.</property>
+                         <property name="visible_window">True</property>
+                         <property name="above_child">False</property>
 
                          <child>
                            <widget class="GtkCheckButton" id="lock_button">
 
                          <child>
                            <widget class="GtkCheckButton" id="lock_button">
                              <property name="label" translatable="yes">_Lock Screen After</property>
                              <property name="use_underline">True</property>
                              <property name="relief">GTK_RELIEF_NORMAL</property>
                              <property name="label" translatable="yes">_Lock Screen After</property>
                              <property name="use_underline">True</property>
                              <property name="relief">GTK_RELIEF_NORMAL</property>
+                             <property name="focus_on_click">True</property>
                              <property name="active">False</property>
                              <property name="inconsistent">False</property>
                              <property name="draw_indicator">True</property>
                              <property name="active">False</property>
                              <property name="inconsistent">False</property>
                              <property name="draw_indicator">True</property>
                          <property name="label" translatable="yes">_Preview</property>
                          <property name="use_underline">True</property>
                          <property name="relief">GTK_RELIEF_NORMAL</property>
                          <property name="label" translatable="yes">_Preview</property>
                          <property name="use_underline">True</property>
                          <property name="relief">GTK_RELIEF_NORMAL</property>
+                         <property name="focus_on_click">True</property>
                          <signal name="clicked" handler="run_this_cb"/>
                        </widget>
                      </child>
                          <signal name="clicked" handler="run_this_cb"/>
                        </widget>
                      </child>
                          <property name="label" translatable="yes">_Settings...</property>
                          <property name="use_underline">True</property>
                          <property name="relief">GTK_RELIEF_NORMAL</property>
                          <property name="label" translatable="yes">_Settings...</property>
                          <property name="use_underline">True</property>
                          <property name="relief">GTK_RELIEF_NORMAL</property>
+                         <property name="focus_on_click">True</property>
                          <signal name="clicked" handler="settings_cb"/>
                        </widget>
                      </child>
                          <signal name="clicked" handler="settings_cb"/>
                        </widget>
                      </child>
                                  <property name="tooltip" translatable="yes">Run the next screen saver in the list in full-screen mode (click the mouse to return.)</property>
                                  <property name="can_focus">True</property>
                                  <property name="relief">GTK_RELIEF_NORMAL</property>
                                  <property name="tooltip" translatable="yes">Run the next screen saver in the list in full-screen mode (click the mouse to return.)</property>
                                  <property name="can_focus">True</property>
                                  <property name="relief">GTK_RELIEF_NORMAL</property>
+                                 <property name="focus_on_click">True</property>
                                  <signal name="clicked" handler="run_next_cb"/>
 
                                  <child>
                                  <signal name="clicked" handler="run_next_cb"/>
 
                                  <child>
                                  <property name="tooltip" translatable="yes">Run the previous screen saver in the list in full-screen mode (click the mouse to return.)</property>
                                  <property name="can_focus">True</property>
                                  <property name="relief">GTK_RELIEF_NORMAL</property>
                                  <property name="tooltip" translatable="yes">Run the previous screen saver in the list in full-screen mode (click the mouse to return.)</property>
                                  <property name="can_focus">True</property>
                                  <property name="relief">GTK_RELIEF_NORMAL</property>
+                                 <property name="focus_on_click">True</property>
                                  <signal name="clicked" handler="run_prev_cb"/>
 
                                  <child>
                                  <signal name="clicked" handler="run_prev_cb"/>
 
                                  <child>
@@ -901,6 +913,7 @@ Installed</property>
                                  <property name="label" translatable="yes">Grab Desktop _Images</property>
                                  <property name="use_underline">True</property>
                                  <property name="relief">GTK_RELIEF_NORMAL</property>
                                  <property name="label" translatable="yes">Grab Desktop _Images</property>
                                  <property name="use_underline">True</property>
                                  <property name="relief">GTK_RELIEF_NORMAL</property>
+                                 <property name="focus_on_click">True</property>
                                  <property name="active">False</property>
                                  <property name="inconsistent">False</property>
                                  <property name="draw_indicator">True</property>
                                  <property name="active">False</property>
                                  <property name="inconsistent">False</property>
                                  <property name="draw_indicator">True</property>
@@ -921,6 +934,7 @@ Installed</property>
                                  <property name="label" translatable="yes">Grab _Video Frames</property>
                                  <property name="use_underline">True</property>
                                  <property name="relief">GTK_RELIEF_NORMAL</property>
                                  <property name="label" translatable="yes">Grab _Video Frames</property>
                                  <property name="use_underline">True</property>
                                  <property name="relief">GTK_RELIEF_NORMAL</property>
+                                 <property name="focus_on_click">True</property>
                                  <property name="active">False</property>
                                  <property name="inconsistent">False</property>
                                  <property name="draw_indicator">True</property>
                                  <property name="active">False</property>
                                  <property name="inconsistent">False</property>
                                  <property name="draw_indicator">True</property>
@@ -941,6 +955,7 @@ Installed</property>
                                  <property name="label" translatable="yes">Choose _Random Image:</property>
                                  <property name="use_underline">True</property>
                                  <property name="relief">GTK_RELIEF_NORMAL</property>
                                  <property name="label" translatable="yes">Choose _Random Image:</property>
                                  <property name="use_underline">True</property>
                                  <property name="relief">GTK_RELIEF_NORMAL</property>
+                                 <property name="focus_on_click">True</property>
                                  <property name="active">False</property>
                                  <property name="inconsistent">False</property>
                                  <property name="draw_indicator">True</property>
                                  <property name="active">False</property>
                                  <property name="inconsistent">False</property>
                                  <property name="draw_indicator">True</property>
@@ -1009,6 +1024,7 @@ Installed</property>
                                      <property name="label" translatable="yes">_Browse</property>
                                      <property name="use_underline">True</property>
                                      <property name="relief">GTK_RELIEF_NORMAL</property>
                                      <property name="label" translatable="yes">_Browse</property>
                                      <property name="use_underline">True</property>
                                      <property name="relief">GTK_RELIEF_NORMAL</property>
+                                     <property name="focus_on_click">True</property>
                                      <signal name="clicked" handler="browse_image_dir_cb"/>
                                    </widget>
                                    <packing>
                                      <signal name="clicked" handler="browse_image_dir_cb"/>
                                    </widget>
                                    <packing>
@@ -1106,6 +1122,7 @@ Installed</property>
                                  <property name="label" translatable="yes">_Verbose Diagnostics</property>
                                  <property name="use_underline">True</property>
                                  <property name="relief">GTK_RELIEF_NORMAL</property>
                                  <property name="label" translatable="yes">_Verbose Diagnostics</property>
                                  <property name="use_underline">True</property>
                                  <property name="relief">GTK_RELIEF_NORMAL</property>
+                                 <property name="focus_on_click">True</property>
                                  <property name="active">False</property>
                                  <property name="inconsistent">False</property>
                                  <property name="draw_indicator">True</property>
                                  <property name="active">False</property>
                                  <property name="inconsistent">False</property>
                                  <property name="draw_indicator">True</property>
@@ -1126,6 +1143,7 @@ Installed</property>
                                  <property name="label" translatable="yes">Display Subprocess _Errors</property>
                                  <property name="use_underline">True</property>
                                  <property name="relief">GTK_RELIEF_NORMAL</property>
                                  <property name="label" translatable="yes">Display Subprocess _Errors</property>
                                  <property name="use_underline">True</property>
                                  <property name="relief">GTK_RELIEF_NORMAL</property>
+                                 <property name="focus_on_click">True</property>
                                  <property name="active">False</property>
                                  <property name="inconsistent">False</property>
                                  <property name="draw_indicator">True</property>
                                  <property name="active">False</property>
                                  <property name="inconsistent">False</property>
                                  <property name="draw_indicator">True</property>
@@ -1146,6 +1164,7 @@ Installed</property>
                                  <property name="label" translatable="yes">Display _Splash Screen at Startup</property>
                                  <property name="use_underline">True</property>
                                  <property name="relief">GTK_RELIEF_NORMAL</property>
                                  <property name="label" translatable="yes">Display _Splash Screen at Startup</property>
                                  <property name="use_underline">True</property>
                                  <property name="relief">GTK_RELIEF_NORMAL</property>
+                                 <property name="focus_on_click">True</property>
                                  <property name="active">False</property>
                                  <property name="inconsistent">False</property>
                                  <property name="draw_indicator">True</property>
                                  <property name="active">False</property>
                                  <property name="inconsistent">False</property>
                                  <property name="draw_indicator">True</property>
@@ -1239,6 +1258,7 @@ Installed</property>
                                  <property name="label" translatable="yes">_Power Management Enabled</property>
                                  <property name="use_underline">True</property>
                                  <property name="relief">GTK_RELIEF_NORMAL</property>
                                  <property name="label" translatable="yes">_Power Management Enabled</property>
                                  <property name="use_underline">True</property>
                                  <property name="relief">GTK_RELIEF_NORMAL</property>
+                                 <property name="focus_on_click">True</property>
                                  <property name="active">True</property>
                                  <property name="inconsistent">False</property>
                                  <property name="draw_indicator">True</property>
                                  <property name="active">True</property>
                                  <property name="inconsistent">False</property>
                                  <property name="draw_indicator">True</property>
@@ -1574,6 +1594,7 @@ Installed</property>
                                  <property name="label" translatable="yes">Install _Colormap</property>
                                  <property name="use_underline">True</property>
                                  <property name="relief">GTK_RELIEF_NORMAL</property>
                                  <property name="label" translatable="yes">Install _Colormap</property>
                                  <property name="use_underline">True</property>
                                  <property name="relief">GTK_RELIEF_NORMAL</property>
+                                 <property name="focus_on_click">True</property>
                                  <property name="active">False</property>
                                  <property name="inconsistent">False</property>
                                  <property name="draw_indicator">True</property>
                                  <property name="active">False</property>
                                  <property name="inconsistent">False</property>
                                  <property name="draw_indicator">True</property>
@@ -1605,6 +1626,7 @@ Installed</property>
                                  <property name="label" translatable="yes">Fade to Black when _Blanking</property>
                                  <property name="use_underline">True</property>
                                  <property name="relief">GTK_RELIEF_NORMAL</property>
                                  <property name="label" translatable="yes">Fade to Black when _Blanking</property>
                                  <property name="use_underline">True</property>
                                  <property name="relief">GTK_RELIEF_NORMAL</property>
+                                 <property name="focus_on_click">True</property>
                                  <property name="active">False</property>
                                  <property name="inconsistent">False</property>
                                  <property name="draw_indicator">True</property>
                                  <property name="active">False</property>
                                  <property name="inconsistent">False</property>
                                  <property name="draw_indicator">True</property>
@@ -1625,6 +1647,7 @@ Installed</property>
                                  <property name="label" translatable="yes">Fade from Black When _Unblanking</property>
                                  <property name="use_underline">True</property>
                                  <property name="relief">GTK_RELIEF_NORMAL</property>
                                  <property name="label" translatable="yes">Fade from Black When _Unblanking</property>
                                  <property name="use_underline">True</property>
                                  <property name="relief">GTK_RELIEF_NORMAL</property>
+                                 <property name="focus_on_click">True</property>
                                  <property name="active">False</property>
                                  <property name="inconsistent">False</property>
                                  <property name="draw_indicator">True</property>
                                  <property name="active">False</property>
                                  <property name="inconsistent">False</property>
                                  <property name="draw_indicator">True</property>
@@ -1814,6 +1837,46 @@ Installed</property>
          <property name="fill">True</property>
        </packing>
       </child>
          <property name="fill">True</property>
        </packing>
       </child>
+
+      <child>
+       <widget class="GtkHButtonBox" id="hbuttonbox2">
+         <property name="border_width">5</property>
+         <property name="layout_style">GTK_BUTTONBOX_EDGE</property>
+         <property name="spacing">10</property>
+
+         <child>
+           <widget class="GtkButton" id="helpbutton">
+             <property name="visible">True</property>
+             <property name="can_default">True</property>
+             <property name="can_focus">True</property>
+             <property name="label">gtk-help</property>
+             <property name="use_stock">True</property>
+             <property name="relief">GTK_RELIEF_NORMAL</property>
+             <property name="focus_on_click">True</property>
+             <signal name="clicked" handler="doc_menu_cb"/>
+           </widget>
+         </child>
+
+         <child>
+           <widget class="GtkButton" id="closebutton">
+             <property name="visible">True</property>
+             <property name="can_default">True</property>
+             <property name="can_focus">True</property>
+             <property name="label">gtk-close</property>
+             <property name="use_stock">True</property>
+             <property name="relief">GTK_RELIEF_NORMAL</property>
+             <property name="focus_on_click">True</property>
+             <signal name="clicked" handler="exit_menu_cb"/>
+           </widget>
+         </child>
+       </widget>
+       <packing>
+         <property name="padding">0</property>
+         <property name="expand">False</property>
+         <property name="fill">True</property>
+         <property name="pack_type">GTK_PACK_END</property>
+       </packing>
+      </child>
     </widget>
   </child>
 </widget>
     </widget>
   </child>
 </widget>
@@ -1825,6 +1888,11 @@ Installed</property>
   <property name="modal">False</property>
   <property name="resizable">True</property>
   <property name="destroy_with_parent">False</property>
   <property name="modal">False</property>
   <property name="resizable">True</property>
   <property name="destroy_with_parent">False</property>
+  <property name="decorated">True</property>
+  <property name="skip_taskbar_hint">False</property>
+  <property name="skip_pager_hint">False</property>
+  <property name="type_hint">GDK_WINDOW_TYPE_HINT_DIALOG</property>
+  <property name="gravity">GDK_GRAVITY_NORTH_WEST</property>
   <property name="has_separator">False</property>
 
   <child internal-child="vbox">
   <property name="has_separator">False</property>
 
   <child internal-child="vbox">
@@ -1846,6 +1914,7 @@ Installed</property>
              <property name="label" translatable="yes">_Advanced &gt;&gt;</property>
              <property name="use_underline">True</property>
              <property name="relief">GTK_RELIEF_NORMAL</property>
              <property name="label" translatable="yes">_Advanced &gt;&gt;</property>
              <property name="use_underline">True</property>
              <property name="relief">GTK_RELIEF_NORMAL</property>
+             <property name="focus_on_click">True</property>
              <property name="response_id">0</property>
              <signal name="clicked" handler="settings_adv_cb"/>
            </widget>
              <property name="response_id">0</property>
              <signal name="clicked" handler="settings_adv_cb"/>
            </widget>
@@ -1859,6 +1928,7 @@ Installed</property>
              <property name="label" translatable="yes">_Standard &lt;&lt;</property>
              <property name="use_underline">True</property>
              <property name="relief">GTK_RELIEF_NORMAL</property>
              <property name="label" translatable="yes">_Standard &lt;&lt;</property>
              <property name="use_underline">True</property>
              <property name="relief">GTK_RELIEF_NORMAL</property>
+             <property name="focus_on_click">True</property>
              <property name="response_id">0</property>
              <signal name="clicked" handler="settings_std_cb"/>
            </widget>
              <property name="response_id">0</property>
              <signal name="clicked" handler="settings_std_cb"/>
            </widget>
@@ -1872,6 +1942,7 @@ Installed</property>
              <property name="label">gtk-cancel</property>
              <property name="use_stock">True</property>
              <property name="relief">GTK_RELIEF_NORMAL</property>
              <property name="label">gtk-cancel</property>
              <property name="use_stock">True</property>
              <property name="relief">GTK_RELIEF_NORMAL</property>
+             <property name="focus_on_click">True</property>
              <property name="response_id">-6</property>
              <signal name="clicked" handler="settings_cancel_cb"/>
            </widget>
              <property name="response_id">-6</property>
              <signal name="clicked" handler="settings_cancel_cb"/>
            </widget>
@@ -1885,6 +1956,7 @@ Installed</property>
              <property name="label">gtk-ok</property>
              <property name="use_stock">True</property>
              <property name="relief">GTK_RELIEF_NORMAL</property>
              <property name="label">gtk-ok</property>
              <property name="use_stock">True</property>
              <property name="relief">GTK_RELIEF_NORMAL</property>
+             <property name="focus_on_click">True</property>
              <property name="response_id">-5</property>
              <signal name="clicked" handler="settings_ok_cb"/>
            </widget>
              <property name="response_id">-5</property>
              <signal name="clicked" handler="settings_ok_cb"/>
            </widget>
@@ -2328,6 +2400,7 @@ Installed</property>
                      <property name="label" translatable="yes">_Documentation...</property>
                      <property name="use_underline">True</property>
                      <property name="relief">GTK_RELIEF_NORMAL</property>
                      <property name="label" translatable="yes">_Documentation...</property>
                      <property name="use_underline">True</property>
                      <property name="relief">GTK_RELIEF_NORMAL</property>
+                     <property name="focus_on_click">True</property>
                      <signal name="clicked" handler="manual_cb"/>
                    </widget>
                    <packing>
                      <signal name="clicked" handler="manual_cb"/>
                    </widget>
                    <packing>
index 115260120679f7645638f0456edda5a71c7cc8e4..5fb6630447997532f1b7cd999b4c2ec18a582cac 100644 (file)
@@ -11,7 +11,7 @@
 .if n .sp 1
 .if t .sp .5
 ..
 .if n .sp 1
 .if t .sp .5
 ..
-.TH XScreenSaver 1 "16-Dec-2004 (4.19)" "X Version 11"
+.TH XScreenSaver 1 "23-Feb-2005 (4.20)" "X Version 11"
 .SH NAME
 xscreensaver-demo - interactively control the background xscreensaver daemon
 .SH SYNOPSIS
 .SH NAME
 xscreensaver-demo - interactively control the background xscreensaver daemon
 .SH SYNOPSIS
@@ -333,7 +333,7 @@ http://www.jwz.org/xscreensaver/
 .BR xscreensaver\-command (1),
 .BR xscreensaver\-getimage (1)
 .SH COPYRIGHT
 .BR xscreensaver\-command (1),
 .BR xscreensaver\-getimage (1)
 .SH COPYRIGHT
-Copyright \(co 1992, 1993, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004
+Copyright \(co 1992, 1993, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
 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
 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 46432d50dca338b02c72f606bd8071fca867ce7e..f95dc3cf943d51bdc0bdf3db14fb7b7af12675fd 100644 (file)
@@ -1,4 +1,4 @@
-.TH XScreenSaver 1 "16-Dec-2004 (4.19)" "X Version 11"
+.TH XScreenSaver 1 "23-Feb-2005 (4.20)" "X Version 11"
 .SH NAME
 xscreensaver-getimage-file - put a randomly-selected image on the root window
 .SH SYNOPSIS
 .SH NAME
 xscreensaver-getimage-file - put a randomly-selected image on the root window
 .SH SYNOPSIS
index f8474670cca37a567ef68d4f1c8f282449a2de20..15c5a9ef6e3aefe28de4dffebd317cf75ecd61fc 100755 (executable)
@@ -1,5 +1,5 @@
 #!/usr/bin/perl -w
 #!/usr/bin/perl -w
-# Copyright © 2001, 2002, 2003 Jamie Zawinski <jwz@jwz.org>.
+# Copyright © 2001, 2002, 2003, 2005 Jamie Zawinski <jwz@jwz.org>.
 #
 # Permission to use, copy, modify, distribute, and sell this software and its
 # documentation for any purpose is hereby granted without fee, provided that
 #
 # Permission to use, copy, modify, distribute, and sell this software and its
 # documentation for any purpose is hereby granted without fee, provided that
@@ -22,7 +22,7 @@
 # value of the "grabVideoFrames" setting in the ~/.xscreensaver file
 # (or in /usr/lib/X11/app-defaults/XScreenSaver).
 #
 # value of the "grabVideoFrames" setting in the ~/.xscreensaver file
 # (or in /usr/lib/X11/app-defaults/XScreenSaver).
 #
-# Created: 13-Apr-01.
+# Created: 13-Apr-2001.
 
 require 5;
 use diagnostics;
 
 require 5;
 use diagnostics;
@@ -33,23 +33,17 @@ my $version = q{ $Revision: 1.13 $ }; $version =~ s/^[^0-9]+([0-9.]+).*$/$1/;
 
 my $verbose = 0;
 
 
 my $verbose = 0;
 
+my $tmpdir  = $ENV{TMPDIR} || "/tmp";
+my $tmpfile = sprintf ("%s/xssgv.%08x.ppm", $tmpdir, rand(0xFFFFFFFF));
+
+
 # These are programs that can be used to grab a video frame.  The first one
 # of these programs that exists on $PATH will be used, and the image file
 # These are programs that can be used to grab a video frame.  The first one
 # of these programs that exists on $PATH will be used, and the image file
-# is assumed to be written to stdout (in some image format acceptable to
+# is assumed to be written to $tmpfile (in some image format acceptable to
 # "xscreensaver-getimage-file", e.g., PPM or JPEG.)
 #
 # If you add other programs to this list, please let me know!
 #
 # "xscreensaver-getimage-file", e.g., PPM or JPEG.)
 #
 # If you add other programs to this list, please let me know!
 #
-
-my $tmpdir = $ENV{TMPDIR};
-$tmpdir = "/tmp" unless $tmpdir;
-
-my $tmpfile = 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.
-my $sgi_bogosity = "$tmpfile-00000.rgb";
-
 my @programs = (
 
   "bttvgrab -d q -Q -l 1 -o ppm -f $tmpfile",  # BTTV
 my @programs = (
 
   "bttvgrab -d q -Q -l 1 -o ppm -f $tmpfile",  # BTTV
@@ -61,13 +55,16 @@ my @programs = (
 
   "atitv snap $tmpfile",                       # ATI video capture card
 
 
   "atitv snap $tmpfile",                       # ATI video capture card
 
-  "grab -type ppm -format ntsc -source 1 " .
-        "-settle 0.75 -output $tmpfile",       # *BSD BT848 module
+  "grab -type ppm -format ntsc -source 1 " .   # *BSD BT848 module
+       "-settle 0.75 -output $tmpfile",
 
 
-  "motioneye -j $tmpfile",                      # Sony Vaio MotionEye
+  "motioneye -j $tmpfile",                     # Sony Vaio MotionEye
                                                # (hardware jpeg encoder)
 
                                                # (hardware jpeg encoder)
 
-  "vidtomem -f $tmpfile 2>&- && mv $sgi_bogosity $tmpfile",  # Silicon Graphics
+  "vidcat -b -f ppm -s 640x480 > $tmpfile 2>-",        # w3cam/ovcam
+
+  "vidtomem -f $tmpfile 2>&- " .               # Silicon Graphics
+       "&& mv $tmpfile-00000.rgb $tmpfile",
 );
 
 
 );
 
 
index 2c57eb1d62cb6730803373cf72d36a623780cd00..4ce4d4b8b616e50ad4333156703681b11ec03029 100644 (file)
@@ -1,4 +1,4 @@
-.TH XScreenSaver 1 "16-Dec-2004 (4.19)" "X Version 11"
+.TH XScreenSaver 1 "23-Feb-2005 (4.20)" "X Version 11"
 .SH NAME
 xscreensaver-getimage-video - put a video frame on the root window
 .SH SYNOPSIS
 .SH NAME
 xscreensaver-getimage-video - put a video frame on the root window
 .SH SYNOPSIS
index 7b8919774ae422c63b7d3534ae2ad9dc1cc28522..bf0feef95785248736844599af396396086a9e44 100644 (file)
@@ -285,8 +285,8 @@ compute_image_scaling (int src_w, int src_h,
   *scaled_to_y_ret = desty;
 
   if (verbose_p)
   *scaled_to_y_ret = desty;
 
   if (verbose_p)
-    fprintf (stderr, "%s: displaying %dx%d image at %d,%d.\n",
-             progname, src_w, src_h, destx, desty);
+    fprintf (stderr, "%s: displaying %dx%d image at %d,%d in %dx%d.\n",
+             progname, src_w, src_h, destx, desty, dest_w, dest_h);
 }
 
 
 }
 
 
@@ -351,7 +351,8 @@ scale_ximage (Screen *screen, Visual *visual,
  */
 static Bool
 read_file_gdk (Screen *screen, Window window, Drawable drawable,
  */
 static Bool
 read_file_gdk (Screen *screen, Window window, Drawable drawable,
-               const char *filename, Bool verbose_p)
+               const char *filename, Bool verbose_p,
+               XRectangle *geom_ret)
 {
   GdkPixbuf *pb;
   Display *dpy = DisplayOfScreen (screen);
 {
   GdkPixbuf *pb;
   Display *dpy = DisplayOfScreen (screen);
@@ -451,6 +452,14 @@ read_file_gdk (Screen *screen, Window window, Drawable drawable,
           XSetWindowBackgroundPixmap (dpy, window, drawable);
           XClearWindow (dpy, window);
         }
           XSetWindowBackgroundPixmap (dpy, window, drawable);
           XClearWindow (dpy, window);
         }
+
+      if (geom_ret)
+        {
+          geom_ret->x = destx;
+          geom_ret->y = desty;
+          geom_ret->width  = w;
+          geom_ret->height = h;
+        }
     }
 
   XSync (dpy, False);
     }
 
   XSync (dpy, False);
@@ -951,7 +960,8 @@ read_jpeg_ximage (Screen *screen, Visual *visual, Drawable drawable,
  */
 static Bool
 read_file_jpeglib (Screen *screen, Window window, Drawable drawable,
  */
 static Bool
 read_file_jpeglib (Screen *screen, Window window, Drawable drawable,
-                   const char *filename, Bool verbose_p)
+                   const char *filename, Bool verbose_p,
+                   XRectangle *geom_ret)
 {
   Display *dpy = DisplayOfScreen (screen);
   XImage *ximage;
 {
   Display *dpy = DisplayOfScreen (screen);
   XImage *ximage;
@@ -1042,6 +1052,14 @@ read_file_jpeglib (Screen *screen, Window window, Drawable drawable,
     XFreeGC (dpy, gc);
   }
 
     XFreeGC (dpy, gc);
   }
 
+  if (geom_ret)
+    {
+      geom_ret->x = destx;
+      geom_ret->y = desty;
+      geom_ret->width  = ximage->width;
+      geom_ret->height = ximage->height;
+    }
+
   free (ximage->data);
   ximage->data = 0;
   XDestroyImage (ximage);
   free (ximage->data);
   ximage->data = 0;
   XDestroyImage (ximage);
@@ -1057,16 +1075,18 @@ read_file_jpeglib (Screen *screen, Window window, Drawable drawable,
  */
 static Bool
 display_file (Screen *screen, Window window, Drawable drawable,
  */
 static Bool
 display_file (Screen *screen, Window window, Drawable drawable,
-              const char *filename, Bool verbose_p)
+              const char *filename, Bool verbose_p,
+              XRectangle *geom_ret)
 {
   if (verbose_p)
     fprintf (stderr, "%s: loading \"%s\"\n", progname, filename);
 
 # if defined(HAVE_GDK_PIXBUF)
 {
   if (verbose_p)
     fprintf (stderr, "%s: loading \"%s\"\n", progname, filename);
 
 # if defined(HAVE_GDK_PIXBUF)
-  if (read_file_gdk (screen, window, drawable, filename, verbose_p))
+  if (read_file_gdk (screen, window, drawable, filename, verbose_p, geom_ret))
     return True;
 # elif defined(HAVE_JPEGLIB)
     return True;
 # elif defined(HAVE_JPEGLIB)
-  if (read_file_jpeglib (screen, window, drawable, filename, verbose_p))
+  if (read_file_jpeglib (screen, window, drawable, filename, verbose_p,
+                         geom_ret))
     return True;
 # else  /* !(HAVE_GDK_PIXBUF || HAVE_JPEGLIB) */
   /* shouldn't get here if we have no image-loading methods available. */
     return True;
 # else  /* !(HAVE_GDK_PIXBUF || HAVE_JPEGLIB) */
   /* shouldn't get here if we have no image-loading methods available. */
@@ -1078,7 +1098,7 @@ display_file (Screen *screen, Window window, Drawable drawable,
 
 
 /* Invokes a sub-process and returns its output (presumably, a file to
 
 
 /* Invokes a sub-process and returns its output (presumably, a file to
-   load.)  Free the string when done.  video_p controls which program
+   load.)  Free the string when done.  'grab_type' controls which program
    to run.
  */
 static char *
    to run.
  */
 static char *
@@ -1239,7 +1259,7 @@ get_desktop_filename (Screen *screen, Bool verbose_p)
  */
 static Bool
 display_video (Screen *screen, Window window, Drawable drawable,
  */
 static Bool
 display_video (Screen *screen, Window window, Drawable drawable,
-               Bool verbose_p)
+               Bool verbose_p, XRectangle *geom_ret)
 {
   char *filename = get_video_filename (screen, verbose_p);
   Bool status;
 {
   char *filename = get_video_filename (screen, verbose_p);
   Bool status;
@@ -1251,7 +1271,8 @@ display_video (Screen *screen, Window window, Drawable drawable,
       return False;
     }
 
       return False;
     }
 
-  status = display_file (screen, window, drawable, filename, verbose_p);
+  status = display_file (screen, window, drawable, filename, verbose_p,
+                         geom_ret);
 
   if (unlink (filename))
     {
 
   if (unlink (filename))
     {
@@ -1274,7 +1295,7 @@ display_video (Screen *screen, Window window, Drawable drawable,
  */
 static Bool
 display_desktop (Screen *screen, Window window, Drawable drawable,
  */
 static Bool
 display_desktop (Screen *screen, Window window, Drawable drawable,
-                 Bool verbose_p)
+                 Bool verbose_p, XRectangle *geom_ret)
 {
 # ifdef USE_EXTERNAL_SCREEN_GRABBER
 
 {
 # ifdef USE_EXTERNAL_SCREEN_GRABBER
 
@@ -1310,7 +1331,8 @@ display_desktop (Screen *screen, Window window, Drawable drawable,
       return False;
     }
 
       return False;
     }
 
-  status = display_file (screen, window, drawable, filename, verbose_p);
+  status = display_file (screen, window, drawable, filename, verbose_p,
+                         geom_ret);
 
   if (unlink (filename))
     {
 
   if (unlink (filename))
     {
@@ -1398,6 +1420,14 @@ display_desktop (Screen *screen, Window window, Drawable drawable,
       XFreeGC (dpy, gc);
     }
 
       XFreeGC (dpy, gc);
     }
 
+  if (geom_ret)
+    {
+      geom_ret->x = destx;
+      geom_ret->y = desty;
+      geom_ret->width  = w2;
+      geom_ret->height = h2;
+    }
+
   XSync (dpy, False);
   return True;
 
   XSync (dpy, False);
   return True;
 
@@ -1424,6 +1454,7 @@ get_image (Screen *screen,
   int count = 0;
   struct stat st;
   const char *file_prop = 0;
   int count = 0;
   struct stat st;
   const char *file_prop = 0;
+  XRectangle geom = { 0, 0, 0, 0 };
 
   if (! drawable_window_p (dpy, window))
     {
 
   if (! drawable_window_p (dpy, window))
     {
@@ -1567,19 +1598,19 @@ get_image (Screen *screen,
       break;
 
     case GRAB_DESK:
       break;
 
     case GRAB_DESK:
-      if (! display_desktop (screen, window, drawable, verbose_p))
+      if (! display_desktop (screen, window, drawable, verbose_p, &geom))
         goto COLORBARS;
       file_prop = "desktop";
       break;
 
     case GRAB_FILE:
         goto COLORBARS;
       file_prop = "desktop";
       break;
 
     case GRAB_FILE:
-      if (! display_file (screen, window, drawable, file, verbose_p))
+      if (! display_file (screen, window, drawable, file, verbose_p, &geom))
         goto COLORBARS;
       file_prop = file;
       break;
 
     case GRAB_VIDEO:
         goto COLORBARS;
       file_prop = file;
       break;
 
     case GRAB_VIDEO:
-      if (! display_video (screen, window, drawable, verbose_p))
+      if (! display_video (screen, window, drawable, verbose_p, &geom))
         goto COLORBARS;
       file_prop = "video";
       break;
         goto COLORBARS;
       file_prop = "video";
       break;
@@ -1596,6 +1627,17 @@ get_image (Screen *screen,
                        (unsigned char *) file_prop, strlen(file_prop));
     else
       XDeleteProperty (dpy, window, a);
                        (unsigned char *) file_prop, strlen(file_prop));
     else
       XDeleteProperty (dpy, window, a);
+
+    a = XInternAtom (dpy, XA_XSCREENSAVER_IMAGE_GEOMETRY, False);
+    if (geom.width > 0)
+      {
+        char gstr[30];
+        sprintf (gstr, "%dx%d+%d+%d", geom.width, geom.height, geom.x, geom.y);
+        XChangeProperty (dpy, window, a, XA_STRING, 8, PropModeReplace, 
+                         (unsigned char *) gstr, strlen (gstr));
+      }
+    else
+      XDeleteProperty (dpy, window, a);
   }
 
   XSync (dpy, False);
   }
 
   XSync (dpy, False);
index 398f21f390aa773501f1f360960f4d0fd8fad502..735d7799f3226ec144fdcdb338a80de196cc6281 100644 (file)
@@ -1,4 +1,4 @@
-.TH XScreenSaver 1 "16-Dec-2004 (4.19)" "X Version 11"
+.TH XScreenSaver 1 "23-Feb-2005 (4.20)" "X Version 11"
 .SH NAME
 xscreensaver-getimage - put some randomly-selected image on the root window
 .SH SYNOPSIS
 .SH NAME
 xscreensaver-getimage - put some randomly-selected image on the root window
 .SH SYNOPSIS
index 1badde0719764cd87c84ecfeac50c88d67363689..61eb69c5267c5ee4a514ae40865d3c377ba5d541 100644 (file)
@@ -1,4 +1,4 @@
-/* xscreensaver, Copyright (c) 1991-2003 Jamie Zawinski <jwz@jwz.org>
+/* xscreensaver, Copyright (c) 1991-2005 Jamie Zawinski <jwz@jwz.org>
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
  * documentation for any purpose is hereby granted without fee, provided that
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
  * documentation for any purpose is hereby granted without fee, provided that
@@ -255,7 +255,7 @@ do_help (saver_info *si)
   fflush (stdout);
   fflush (stderr);
   fprintf (stdout, "\
   fflush (stdout);
   fflush (stderr);
   fprintf (stdout, "\
-xscreensaver %s, copyright (c) 1991-2004 by Jamie Zawinski <jwz@jwz.org>\n\
+xscreensaver %s, copyright (c) 1991-2005 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\
 \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,
 
   if (p->verbose_p)
     fprintf (stderr,
-            "%s %s, copyright (c) 1991-2004 "
+            "%s %s, copyright (c) 1991-2005 "
             "by Jamie Zawinski <jwz@jwz.org>.\n",
             progname, si->version);
 
             "by Jamie Zawinski <jwz@jwz.org>.\n",
             progname, si->version);
 
diff --git a/driver/xscreensaver.kss.in b/driver/xscreensaver.kss.in
deleted file mode 100755 (executable)
index 28cda06..0000000
+++ /dev/null
@@ -1,149 +0,0 @@
-#!/bin/sh -
-
-# script - "xscreensaver.kss"
-#
-# Author: Shane Smit <shane_smit@calderasystems.com>
-#
-# Modification History:
-#  [08/23/1999] - Shane Smit: Creation
-#
-# Description:
-#  This script file enables users to use XScreenSaver via the
-#  KDE Display Properties. 
-
-# 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.
-
-
-# Locking is turned off by default.
-lockmode="-no-lock-mode"
-
-prefix="@prefix@"
-exec_prefix="@exec_prefix@"
-bindir="@bindir@"
-hackdir="@HACKDIR@"
-
-while [ -n "$1" ]; do
-  case "$1" in
-
-    -desc) 
-      # This is the name in the list box.
-      echo "XScreenSaver"
-      exit
-      ;;
-
-    -preview)
-      # This simply runs xflame in the preview window.  For this to be "real",
-      # it needs to run xscreensaver with a -window-id parameter for each hack.
-      # There are two ways to do this:
-      # 1) Hack xscreensaver to allow global parameters.
-      # 2) Hack xscreensaver to accept alternate setup files, and create one on
-      #    the fly here.
-      shift
-      $hackdir/xflame -delay 1 -window-id $1 &                       # Start new preview 
-      echo "$!" > $HOME/.kss-preview$1.pid.`hostname`                # Write PID 
-      wait $!                                                       # Wait for it to get killed
-      exit
-      ;;
-
-    -setup)
-      $bindir/xscreensaver -no-splash &            # daemon must be started
-      $bindir/xscreensaver-demo                    # or the setup will produce
-      kill $!                                      # a warning.
-      exit
-      ;;
-
-# 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"
-#      ;;
-    -delay)
-      shift
-      timeout="-timeout $1"
-      ;;
-    -install)
-      Install="TRUE"
-      ;;
-    -lock)
-#      if [ ! -f "/etc/shadow" ]; then      
-        lockmode="-lock-mode"
-#      fi
-      ;;
-#    -allow-root)
-#      echo "Not yet supported"
-#      ;;
-    -nice)
-      shift
-      Nice="-nice $1"
-      ;;
-#    -inroot)
-#      echo "Not yet supported"
-#      ;;
-    *)
-      echo "Unknown parameter: $1"
-      ;;
-  esac
-  shift
-done
-
-if [ -n "$Install" ] ; then
-  PID_FILE=$HOME/.kss-install.pid.`hostname`
-  if [ -r "$PID_FILE" ] ; then
-    kill `cat $PID_FILE`                                # Kill old screensaver 
-  fi
-  echo "$$" > $PID_FILE                                 # Write PID of this script
-  $bindir/xscreensaver -no-splash $timeout $lockmode $Nice &    # Start XScreenSaver daemon
-  trap "kill $!" SIGTERM                                # Set these to kill the daemon
-  trap "kill $!" SIGKILL
-
-# KDE sends SIGUSER1 to indicate the user has hit the "lock" button.
-  trap "$bindir/xscreensaver-command -lock" SIGUSR1
-
-  wait $!                                               # Do not exit, just wait for signals.
-
-else
-  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"
-#  echo "                     x = l  lock screen"
-#  echo "                    order: top-left, top-right, bottom-left, bottom-right"
-  echo "  -delay num        Amount of idle time before screen saver starts  (default 10min)"
-  echo "  -desc             Print the screen saver's description to stdout"
-  echo "  -install          Install screen saver"
-  echo "  -lock             Require password to stop screen saver"
-#  echo "  -allow-root       Accept root password to unlock"
-  echo "  -nice num         Run with specified nice value"
-  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"
-fi
-
-# End of script - "xscreensaver.kss"
index 25919f72cf22f9e14fcbb3f05e1a6d38c11c329f..ac47595ade0da16c65a8280e22c64caf7d05b28f 100644 (file)
@@ -11,7 +11,7 @@
 .if n .sp 1
 .if t .sp .5
 ..
 .if n .sp 1
 .if t .sp .5
 ..
-.TH XScreenSaver 1 "16-Dec-2004 (4.19)" "X Version 11"
+.TH XScreenSaver 1 "23-Feb-2005 (4.20)" "X Version 11"
 .SH NAME
 xscreensaver - extensible screen saver framework, plus locking
 .SH SYNOPSIS
 .SH NAME
 xscreensaver - extensible screen saver framework, plus locking
 .SH SYNOPSIS
@@ -1319,14 +1319,13 @@ 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,
 .BR zoom (1)
 .SH COPYRIGHT
 Copyright \(co 1991, 1992, 1993, 1994, 1995, 1996, 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 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.
+2000, 2001, 2002, 2003, 2004, 2005 by Jamie Zawinski.  Permission to use,
+copy, modify, distribute, and sell this software and its documentation for
+any purpose is hereby granted without fee, provided that the above copyright
+notice appear in all copies and that both that copyright notice and this
+permission notice appear in supporting documentation.  No representations are
+made about the suitability of this software for any purpose.  It is provided
+"as is" without express or implied warranty.
 .SH AUTHOR
 Jamie Zawinski <jwz@jwz.org>.  Written in late 1991; version 1.0 posted
 to comp.sources.x on 17-Aug-1992.
 .SH AUTHOR
 Jamie Zawinski <jwz@jwz.org>.  Written in late 1991; version 1.0 posted
 to comp.sources.x on 17-Aug-1992.
index 660c3944b80af9733ecd0421b94ae97708b0cad0..7be4629d37ea772c0644373365d7a1275693cc07 100644 (file)
@@ -1,4 +1,4 @@
-# hacks/Makefile.in --- xscreensaver, Copyright (c) 1997-2004 Jamie Zawinski.
+# hacks/Makefile.in --- xscreensaver, Copyright (c) 1997-2005 Jamie Zawinski.
 # the `../configure' script generates `hacks/Makefile' from this file.
 
 @SET_MAKE@
 # the `../configure' script generates `hacks/Makefile' from this file.
 
 @SET_MAKE@
@@ -103,7 +103,7 @@ SRCS                = attraction.c blitspin.c bouboule.c braid.c bubbles.c \
                  apple2-main.c analogtv.c xanalogtv.c pong.c wormhole.c \
                  mismunch.c pacman.c pacman_ai.c pacman_level.c \
                  fuzzyflakes.c anemotaxis.c memscroller.c substrate.c \
                  apple2-main.c analogtv.c xanalogtv.c pong.c wormhole.c \
                  mismunch.c pacman.c pacman_ai.c pacman_level.c \
                  fuzzyflakes.c anemotaxis.c memscroller.c substrate.c \
-                 intermomentary.c fireworkx.c
+                 intermomentary.c fireworkx.c fiberlamp.c boxfit.c
 SCRIPTS                = vidwhacker webcollage ljlatest
 
 OBJS           = attraction.o blitspin.o bouboule.o braid.o bubbles.o \
 SCRIPTS                = vidwhacker webcollage ljlatest
 
 OBJS           = attraction.o blitspin.o bouboule.o braid.o bubbles.o \
@@ -132,7 +132,7 @@ OBJS                = attraction.o blitspin.o bouboule.o braid.o bubbles.o \
                  apple2-main.o analogtv.o xanalogtv.o pong.o wormhole.o \
                  mismunch.o pacman.o pacman_ai.o pacman_level.o \
                  fuzzyflakes.o anemotaxis.o memscroller.o substrate.o \
                  apple2-main.o analogtv.o xanalogtv.o pong.o wormhole.o \
                  mismunch.o pacman.o pacman_ai.o pacman_level.o \
                  fuzzyflakes.o anemotaxis.o memscroller.o substrate.o \
-                 intermomentary.o fireworkx.o
+                 intermomentary.o fireworkx.o fiberlamp.o boxfit.o
 
 NEXES          = attraction blitspin bouboule braid bubbles decayscreen deco \
                  drift flag flame forest vines galaxy grav greynetic halo \
 
 NEXES          = attraction blitspin bouboule braid bubbles decayscreen deco \
                  drift flag flame forest vines galaxy grav greynetic halo \
@@ -152,7 +152,7 @@ NEXES               = attraction blitspin bouboule braid bubbles decayscreen deco \
                  metaballs eruption popsquares barcode piecewise cloudlife \
                  fontglide apple2 xanalogtv pong  wormhole mismunch \
                  pacman fuzzyflakes anemotaxis memscroller substrate \
                  metaballs eruption popsquares barcode piecewise cloudlife \
                  fontglide apple2 xanalogtv pong  wormhole mismunch \
                  pacman fuzzyflakes anemotaxis memscroller substrate \
-                 intermomentary fireworkx \
+                 intermomentary fireworkx fiberlamp boxfit \
                  @JPEG_EXES@
 SEXES          = sonar
 JPEG_EXES      = webcollage-helper
                  @JPEG_EXES@
 SEXES          = sonar
 JPEG_EXES      = webcollage-helper
@@ -199,7 +199,7 @@ MEN         = anemone.man ant.man apollonian.man attraction.man \
                  fontglide.man apple2.man xanalogtv.man pong.man \
                  wormhole.man mismunch.man pacman.man fuzzyflakes.man \
                  anemotaxis.man memscroller.man substrate.man \
                  fontglide.man apple2.man xanalogtv.man pong.man \
                  wormhole.man mismunch.man pacman.man fuzzyflakes.man \
                  anemotaxis.man memscroller.man substrate.man \
-                 intermomentary.man fireworkx.man
+                 intermomentary.man fireworkx.man fiberlamp.man boxfit.man
 STAR           = *
 EXTRAS         = README Makefile.in xlock_23.h xml2man.pl .gdbinit \
                  euler2d.tex \
 STAR           = *
 EXTRAS         = README Makefile.in xlock_23.h xml2man.pl .gdbinit \
                  euler2d.tex \
@@ -287,10 +287,7 @@ munge-scripts: $(SCRIPTS)
        for program in $(SCRIPTS); do                                   \
          sed "s@^\(#!\)\(/[^ ]*/perl[^ ]*\)\(.*\)\$$@\1$$perl\3@"      \
              < $(srcdir)/$$program > $$tmp ;                           \
        for program in $(SCRIPTS); do                                   \
          sed "s@^\(#!\)\(/[^ ]*/perl[^ ]*\)\(.*\)\$$@\1$$perl\3@"      \
              < $(srcdir)/$$program > $$tmp ;                           \
-         if cmp -s $(srcdir)/$$program $$tmp ; then                    \
-           echo "$$program unchanged" ;                                \
-           true ;                                                      \
-         else                                                          \
+         if ! cmp -s $(srcdir)/$$program $$tmp ; then                  \
            echo "$$program: setting interpreter to $$perl" ;           \
            cat $$tmp > ./$$program ;                                   \
          fi ;                                                          \
            echo "$$program: setting interpreter to $$perl" ;           \
            cat $$tmp > ./$$program ;                                   \
          fi ;                                                          \
@@ -513,6 +510,10 @@ screenhack-xlock.o: screenhack.c
        $(CC) -o $@ -c $(INCLUDES) $(DEFS) $(CFLAGS) $(X_CFLAGS) \
        -DXLOCKMORE $(srcdir)/screenhack.c
 
        $(CC) -o $@ -c $(INCLUDES) $(DEFS) $(CFLAGS) $(X_CFLAGS) \
        -DXLOCKMORE $(srcdir)/screenhack.c
 
+# Make sure these are regenerated when the version number ticks.
+screenhack.o: $(UTILS_SRC)/version.h
+screenhack-xlock.o: $(UTILS_SRC)/version.h
+
 # Some abbreviations to keep the lines short...
 XPM            = xpm-pixmap.o
 ALP            = $(UTILS_BIN)/alpha.o
 # Some abbreviations to keep the lines short...
 XPM            = xpm-pixmap.o
 ALP            = $(UTILS_BIN)/alpha.o
@@ -809,6 +810,7 @@ fireworkx:  fireworkx.o      $(HACK_OBJS) $(COL)
        $(CC_HACK) -o $@ $@.o    $(HACK_OBJS) $(COL) $(HACK_LIBS)
 
 
        $(CC_HACK) -o $@ $@.o    $(HACK_OBJS) $(COL) $(HACK_LIBS)
 
 
+
 # The rules for those hacks which follow the `xlockmore' API.
 #
 
 # The rules for those hacks which follow the `xlockmore' API.
 #
 
@@ -930,6 +932,11 @@ PACOBJS=pacman_ai.o pacman_level.o
 pacman:                pacman.o        $(PACOBJS) $(XLOCK_OBJS) $(XPM)
        $(CC_HACK) -o $@ $@.o   $(PACOBJS) $(XLOCK_OBJS) $(XPM) $(XPM_LIBS)
 
 pacman:                pacman.o        $(PACOBJS) $(XLOCK_OBJS) $(XPM)
        $(CC_HACK) -o $@ $@.o   $(PACOBJS) $(XLOCK_OBJS) $(XPM) $(XPM_LIBS)
 
+fiberlamp:     fiberlamp.o     $(XLOCK_OBJS)
+       $(CC_HACK) -o $@ $@.o   $(XLOCK_OBJS) $(HACK_LIBS)
+
+boxfit:                boxfit.o         $(HACK_OBJS) $(COL)
+       $(CC_HACK) -o $@ $@.o    $(HACK_OBJS) $(COL) $(HACK_LIBS)
 
 # These are not like the others.
 #
 
 # These are not like the others.
 #
@@ -981,6 +988,8 @@ bouboule.o: ../config.h
 bouboule.o: $(srcdir)/screenhack.h
 bouboule.o: $(srcdir)/xlockmore.h
 bouboule.o: $(srcdir)/xlockmoreI.h
 bouboule.o: $(srcdir)/screenhack.h
 bouboule.o: $(srcdir)/xlockmore.h
 bouboule.o: $(srcdir)/xlockmoreI.h
+boxfit.o: ../config.h
+boxfit.o: $(srcdir)/screenhack.h
 braid.o: ../config.h
 braid.o: $(srcdir)/screenhack.h
 braid.o: $(srcdir)/xlockmore.h
 braid.o: ../config.h
 braid.o: $(srcdir)/screenhack.h
 braid.o: $(srcdir)/xlockmore.h
@@ -1097,6 +1106,10 @@ fadeplot.o: ../config.h
 fadeplot.o: $(srcdir)/screenhack.h
 fadeplot.o: $(srcdir)/xlockmore.h
 fadeplot.o: $(srcdir)/xlockmoreI.h
 fadeplot.o: $(srcdir)/screenhack.h
 fadeplot.o: $(srcdir)/xlockmore.h
 fadeplot.o: $(srcdir)/xlockmoreI.h
+fiberlamp.o: ../config.h
+fiberlamp.o: $(srcdir)/screenhack.h
+fiberlamp.o: $(srcdir)/xlockmore.h
+fiberlamp.o: $(srcdir)/xlockmoreI.h
 fireworkx.o: ../config.h
 fireworkx.o: $(srcdir)/screenhack.h
 flag.o: ../config.h
 fireworkx.o: ../config.h
 fireworkx.o: $(srcdir)/screenhack.h
 flag.o: ../config.h
index f183409939578677a29cceb91dd38675b406036a..883e42b02be876c4f75f0106a7c01d77559961b9 100644 (file)
@@ -1,4 +1,4 @@
-/* xscreensaver, Copyright (c) 1998-2004 Jamie Zawinski <jwz@jwz.org>
+/* xscreensaver, Copyright (c) 1998-2005 Jamie Zawinski <jwz@jwz.org>
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
  * documentation for any purpose is hereby granted without fee, provided that
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
  * documentation for any purpose is hereby granted without fee, provided that
@@ -539,7 +539,7 @@ load_image (Display *dpy, Window window, char **image_filename_r)
 
   XGetWindowAttributes (dpy, window, &xgwa);
   p = XCreatePixmap (dpy, window, xgwa.width, xgwa.height, xgwa.depth);
 
   XGetWindowAttributes (dpy, window, &xgwa);
   p = XCreatePixmap (dpy, window, xgwa.width, xgwa.height, xgwa.depth);
-  load_random_image (xgwa.screen, window, p, image_filename_r);
+  load_random_image (xgwa.screen, window, p, image_filename_r, NULL);
   image = XGetImage (dpy, p, 0, 0, xgwa.width, xgwa.height, ~0, ZPixmap);
   XFreePixmap (dpy, p);
   p = 0;
   image = XGetImage (dpy, p, 0, 0, xgwa.width, xgwa.height, ~0, ZPixmap);
   XFreePixmap (dpy, p);
   p = 0;
index 97652696a9d7b4b4b40cf0113482046bed194071..b962add95ada4fc6534e4657fd5f6d99d694f7ae 100644 (file)
@@ -91,7 +91,7 @@ apple2 -text \\
        -program 'cat /usr/src/linux*/README | fold -sw40'
 apple2 -text -program 'ping apple.com'
 apple2 -text -program 'ps -e'
        -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 -program 'od -txCz -w7 /dev/urandom'
 apple2 -text -program 'cat /dev/random'
 apple2 -text -fast -program 'xemacs -nw -q -f life'
 apple2 -text -fast \\
 apple2 -text -program 'cat /dev/random'
 apple2 -text -fast -program 'xemacs -nw -q -f life'
 apple2 -text -fast \\
@@ -103,7 +103,7 @@ and
 .BR gnome-terminal (1)
 terminal emulators:
 .EX
 .BR gnome-terminal (1)
 terminal emulators:
 .EX
-apple2 -fast -program tcsh
+apple2 -text -fast -program tcsh
 .EE
 .TP 8
 .B \-pty
 .EE
 .TP 8
 .B \-pty
index 1eebcb820f957747ce22215dfa2fda5e1e099b67..18a26484af8791231cc93a4383ba4d526c72e0df 100644 (file)
@@ -1,4 +1,4 @@
-/* xscreensaver, Copyright (c) 1992-1997, 2003 Jamie Zawinski <jwz@jwz.org>
+/* xscreensaver, Copyright (c) 1992-2005 Jamie Zawinski <jwz@jwz.org>
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
  * documentation for any purpose is hereby granted without fee, provided that
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
  * documentation for any purpose is hereby granted without fee, provided that
@@ -94,7 +94,7 @@ read_screen (Display *dpy, Window window, int *widthP, int *heightP)
   gcv.function = GXcopy;
   gc = XCreateGC (dpy, window, GCFunction, &gcv);
 
   gcv.function = GXcopy;
   gc = XCreateGC (dpy, window, GCFunction, &gcv);
 
-  load_random_image (xgwa.screen, window, p, NULL);
+  load_random_image (xgwa.screen, window, p, NULL, NULL);
 
   /* Reset the window's background color... */
   XSetWindowBackground (dpy, window,
 
   /* Reset the window's background color... */
   XSetWindowBackground (dpy, window,
diff --git a/hacks/boxfit.c b/hacks/boxfit.c
new file mode 100644 (file)
index 0000000..34b9d7d
--- /dev/null
@@ -0,0 +1,459 @@
+/* xscreensaver, Copyright (c) 2005 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.
+ *
+ * Boxfit -- fills space with a gradient of growing boxes or circles.
+ *
+ * Written by jwz, 21-Feb-2005.
+ *
+ * Inspired by http://www.levitated.net/daily/levBoxFitting.html
+ */
+
+#include "screenhack.h"
+#include <stdio.h>
+#include <X11/Xutil.h>
+
+#define ALIVE   1
+#define CHANGED 2
+
+typedef struct {
+  unsigned long fill_color;
+  short x, y, w, h;
+  char flags;
+} box;
+
+typedef struct {
+  Display *dpy;
+  Window window;
+  XWindowAttributes xgwa;
+  GC gc;
+  unsigned long bg_color;
+  int border_size;
+  int spacing;
+  int inc;
+
+  Bool circles_p;
+  Bool growing_p;
+  Bool color_horiz_p;
+
+  int box_count;
+  int boxes_size;
+  int nboxes;
+  box *boxes;
+
+  int ncolors;
+  XColor *colors;
+} state;
+
+
+static void
+reset_boxes (state *st)
+{
+  static Bool once = False;
+  int mode = -1;
+
+  st->nboxes = 0;
+  st->growing_p = True;
+  st->color_horiz_p = random() & 1;
+
+  if (once)
+    free_colors (st->dpy, st->xgwa.colormap, st->colors, st->ncolors);
+
+  if (!once)
+    {
+      char *s = get_string_resource ("mode", "Mode");
+      if (!s || !*s || !strcasecmp (s, "random"))
+        mode = -1;
+      else if (!strcasecmp (s, "squares") || !strcasecmp (s, "square"))
+        mode = 0;
+      else if (!strcasecmp (s, "circles") || !strcasecmp (s, "circle"))
+        mode = 1;
+      else
+        {
+          fprintf (stderr,
+                   "%s: mode must be random, squares, or circles, not '%s'\n",
+                   progname, s);
+          exit (1);
+        }
+    }
+
+  if (mode == -1)
+    st->circles_p = random() & 1;
+  else
+    st->circles_p = (mode == 1);
+
+  once = True;
+
+  st->ncolors = get_integer_resource ("colors", "Colors");  /* re-get this */
+  make_smooth_colormap (st->dpy, st->xgwa.visual, st->xgwa.colormap,
+                        st->colors, &st->ncolors, True, 0, False);
+  XClearWindow (st->dpy, st->window);
+}
+
+
+state *
+init_boxes (Display *dpy, Window window)
+{
+  XGCValues gcv;
+  state *st = (state *) calloc (1, sizeof (*st));
+
+  st->dpy = dpy;
+  st->window = window;
+
+  XGetWindowAttributes (st->dpy, st->window, &st->xgwa);
+  XSelectInput (dpy, window, st->xgwa.your_event_mask | ExposureMask);
+
+  st->ncolors = get_integer_resource ("colors", "Colors");
+  if (st->ncolors < 1) st->ncolors = 1;
+  st->colors = (XColor *) malloc (sizeof(XColor) * st->ncolors);
+
+  st->inc = get_integer_resource ("growBy", "GrowBy");
+  st->spacing = get_integer_resource ("spacing", "Spacing");
+  st->border_size = get_integer_resource ("borderSize", "BorderSize");
+  st->bg_color = get_pixel_resource ("background", "Background",
+                                     st->dpy, st->xgwa.colormap);
+  if (st->inc < 1) st->inc = 1;
+  if (st->border_size < 0) st->border_size = 0;
+
+  gcv.line_width = st->border_size;
+  gcv.background = st->bg_color;
+  st->gc = XCreateGC (st->dpy, st->window, GCBackground|GCLineWidth, &gcv);
+
+  st->box_count = get_integer_resource ("boxCount", "BoxCount");
+  if (st->box_count < 1) st->box_count = 1;
+
+  st->nboxes = 0;
+  st->boxes_size = st->box_count * 2;
+  st->boxes = (box *) calloc (st->boxes_size, sizeof(*st->boxes));
+
+  reset_boxes (st);
+
+  return st;
+}
+
+static void
+reshape_boxes (state *st)
+{
+  int i;
+  XGetWindowAttributes (st->dpy, st->window, &st->xgwa);
+  for (i = 0; i < st->nboxes; i++)
+    {
+      box *b = &st->boxes[i];
+      b->flags |= CHANGED;
+    }
+}
+
+
+static Bool
+boxes_overlap_p (box *a, box *b, int pad)
+{
+  /* Two rectangles overlap if the max of the tops is less than the
+     min of the bottoms and the max of the lefts is less than the min
+     of the rights.
+   */
+# undef MAX
+# undef MIN
+# define MAX(A,B) ((A)>(B)?(A):(B))
+# define MIN(A,B) ((A)<(B)?(A):(B))
+
+  int maxleft  = MAX(a->x - pad, b->x);
+  int maxtop   = MAX(a->y - pad, b->y);
+  int minright = MIN(a->x + a->w + pad + pad - 1, b->x + b->w);
+  int minbot   = MIN(a->y + a->h + pad + pad - 1, b->y + b->h);
+  return (maxtop < minbot && maxleft < minright);
+}
+
+
+static Bool
+circles_overlap_p (box *a, box *b, int pad)
+{
+  int ar = a->w/2;     /* radius */
+  int br = b->w/2;
+  int ax = a->x + ar;  /* center */
+  int ay = a->y + ar;
+  int bx = b->x + br;
+  int by = b->y + br;
+  int d2 = (((bx - ax) * (bx - ax)) +  /* distance between centers squared */
+            ((by - ay) * (by - ay)));
+  int r2 = ((ar + br + pad) *          /* sum of radii squared */
+            (ar + br + pad));
+  return (d2 < r2);
+}
+
+
+static Bool
+box_collides_p (state *st, box *a, int pad)
+{
+  int i;
+
+  /* collide with wall */
+  if (a->x - pad < 0 ||
+      a->y - pad < 0 ||
+      a->x + a->w + pad + pad >= st->xgwa.width ||
+      a->y + a->h + pad + pad >= st->xgwa.height)
+    return True;
+
+  /* collide with another box */
+  for (i = 0; i < st->nboxes; i++)
+    {
+      box *b = &st->boxes[i];
+      if (a != b &&
+          (st->circles_p
+           ? circles_overlap_p (a, b, pad)
+           : boxes_overlap_p (a, b, pad)))
+        return True;
+    }
+
+  return False;
+}
+
+
+static void
+grow_boxes (state *st)
+{
+  int inc2 = st->inc + st->spacing + st->border_size;
+  int i;
+  int live_count = 0;
+
+  /* check box collisions, and grow if none.
+   */
+  for (i = 0; i < st->nboxes; i++)
+    {
+      box *a = &st->boxes[i];
+      if (!(a->flags & ALIVE)) continue;
+
+      if (box_collides_p (st, a, inc2))
+        {
+          a->flags &= ~ALIVE;
+          continue;
+        }
+      
+      live_count++;
+      a->x -= st->inc;
+      a->y -= st->inc;
+      a->w += st->inc + st->inc;
+      a->h += st->inc + st->inc;
+      a->flags |= CHANGED;
+    }
+
+  /* Add more boxes.
+   */
+  while (live_count < st->box_count)
+    {
+      box *a;
+      st->nboxes++;
+      if (st->boxes_size <= st->nboxes)
+        {
+          st->boxes_size = (st->boxes_size * 1.2) + st->nboxes;
+          st->boxes = (box *)
+            realloc (st->boxes, st->boxes_size * sizeof(*st->boxes));
+          if (! st->boxes)
+            {
+              fprintf (stderr, "%s: out of memory (%d boxes)\n",
+                       progname, st->boxes_size);
+              exit (1);
+            }
+        }
+
+      a = &st->boxes[st->nboxes-1];
+      a->flags |= CHANGED;
+
+      for (i = 0; i < 10000; i++)
+        {
+          a->x = inc2 + (random() % (st->xgwa.width  - inc2));
+          a->y = inc2 + (random() % (st->xgwa.height - inc2));
+          a->w = 0;
+          a->h = 0;
+
+          if (! box_collides_p (st, a, inc2))
+            {
+              a->flags |= ALIVE;
+              live_count++;
+              break;
+            }
+        }
+
+      if (! (a->flags & ALIVE) ||      /* too many retries; */
+          st->nboxes > 65535)          /* that's about 1MB of box structs. */
+        {
+          st->nboxes--;                        /* go into "fade out" mode now. */
+          st->growing_p = False;
+
+          XSync (st->dpy, False);
+          sleep (1);
+
+          break;
+        }
+
+      /* Pick colors for this box */
+      {
+        int n = (st->color_horiz_p
+                 ? (a->x * st->ncolors / st->xgwa.width)
+                 : (a->y * st->ncolors / st->xgwa.height));
+        a->fill_color   = st->colors [n % st->ncolors].pixel;
+      }
+    }
+}
+
+
+static void
+shrink_boxes (state *st)
+{
+  int i;
+  int remaining = 0;
+
+  for (i = 0; i < st->nboxes; i++)
+    {
+      box *a = &st->boxes[i];
+
+      if (a->w <= 0 || a->h <= 0) continue;
+
+      a->x += st->inc;
+      a->y += st->inc;
+      a->w -= st->inc + st->inc;
+      a->h -= st->inc + st->inc;
+      a->flags |= CHANGED;
+      if (a->w < 0) a->w = 0;
+      if (a->h < 0) a->h = 0;
+
+      if (a->w > 0 && a->h > 0)
+        remaining++;
+    }
+
+  if (remaining == 0)
+    reset_boxes (st);
+}
+
+
+static void
+draw_boxes (state *st)
+{
+  int i;
+  for (i = 0; i < st->nboxes; i++)
+    {
+      box *b = &st->boxes[i];
+
+      if (!st->growing_p)
+        {
+          /* When shrinking, black out an area outside of the border
+             before re-drawing the box.
+           */
+          XSetForeground (st->dpy, st->gc, st->bg_color);
+          XSetLineAttributes (st->dpy, st->gc,
+                              (st->inc + st->border_size) * 2,
+                              LineSolid, CapButt, JoinMiter);
+
+          if (st->circles_p)
+            XDrawArc (st->dpy, st->window, st->gc,
+                      b->x, b->y,
+                      (b->w > 0 ? b->w : 1),
+                      (b->h > 0 ? b->h : 1),
+                      0, 360*64);
+          else
+            XDrawRectangle (st->dpy, st->window, st->gc,
+                            b->x, b->y,
+                            (b->w > 0 ? b->w : 1),
+                            (b->h > 0 ? b->h : 1));
+          XSetLineAttributes (st->dpy, st->gc, st->border_size,
+                              LineSolid, CapButt, JoinMiter);
+        }
+
+      if (b->w <= 0 || b->h <= 0) continue;
+      if (! (b->flags & CHANGED)) continue;
+      b->flags &= ~CHANGED;
+
+      XSetForeground (st->dpy, st->gc, b->fill_color);
+
+      if (st->circles_p)
+        XFillArc (st->dpy, st->window, st->gc, b->x, b->y, b->w, b->h,
+                  0, 360*64);
+      else
+        XFillRectangle (st->dpy, st->window, st->gc, b->x, b->y, b->w, b->h);
+
+      if (st->border_size > 0)
+        {
+          unsigned long bd = st->colors [(b->fill_color + st->ncolors/2)
+                                         % st->ncolors].pixel;
+          XSetForeground (st->dpy, st->gc, bd);
+          if (st->circles_p)
+            XDrawArc (st->dpy, st->window, st->gc, b->x, b->y, b->w, b->h,
+                      0, 360*64);
+          else
+            XDrawRectangle (st->dpy, st->window, st->gc,
+                            b->x, b->y, b->w, b->h);
+        }
+    }
+}
+
+static void
+handle_events (state *st)
+{
+  XSync (st->dpy, False);
+  while (XPending (st->dpy))
+    {
+      XEvent event;
+      XNextEvent (st->dpy, &event);
+      if (event.xany.type == ConfigureNotify ||
+          event.xany.type == Expose)
+        reshape_boxes (st);
+      else if (event.xany.type == ButtonPress)
+        st->growing_p = !st->growing_p;
+
+      screenhack_handle_event (st->dpy, &event);
+    }
+}
+
+
+\f
+char *progclass = "BoxFit";
+
+char *defaults [] = {
+  ".background:                   black",
+  "*delay:                20000",
+  "*mode:                 random",
+  "*colors:               64",
+  "*boxCount:             50",
+  "*growBy:               1",
+  "*spacing:              1",
+  "*borderSize:                   1",
+  0
+};
+
+XrmOptionDescRec options [] = {
+  { "-delay",          ".delay",               XrmoptionSepArg, 0 },
+  { "-colors",         ".colors",              XrmoptionSepArg, 0 },
+  { "-count",          ".boxCount",            XrmoptionSepArg, 0 },
+  { "-growby",         ".growBy",              XrmoptionSepArg, 0 },
+  { "-spacing",                ".spacing",             XrmoptionSepArg, 0 },
+  { "-border",         ".borderSize",          XrmoptionSepArg, 0 },
+  { "-circles",                ".mode",                XrmoptionNoArg, "circles" },
+  { "-squares",                ".mode",                XrmoptionNoArg, "squares" },
+  { "-random",         ".mode",                XrmoptionNoArg, "random"  },
+  { 0, 0, 0, 0 }
+};
+
+
+void
+screenhack (Display *dpy, Window window)
+{
+  state *st = init_boxes (dpy, window);
+  int delay = get_integer_resource ("delay", "Integer");
+  reshape_boxes (st);
+  while (1)
+    {
+      if (st->growing_p)
+        grow_boxes (st);
+      else
+        shrink_boxes (st);
+
+      draw_boxes (st);
+      handle_events (st);
+      if (delay) usleep (delay);
+    }
+}
diff --git a/hacks/boxfit.man b/hacks/boxfit.man
new file mode 100644 (file)
index 0000000..49b4f57
--- /dev/null
@@ -0,0 +1,73 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+boxfit - fills space with a gradient of growing boxes or circles.
+.SH SYNOPSIS
+.B boxfit
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay \fIusecs\fP]
+[\-count \fIint\fP]
+[\-growby \fIint\fP]
+[\-spacing \fIint\fP]
+[\-border \fIint\fP]
+[\-circles | \-squares | \-random]
+.SH DESCRIPTION
+Packs the screen with growing boxes or circles, colored according to a
+horizontal or vertical gradient.  The objects grow until they touch,
+then stop.  When the screen is full, they shrink away and the process
+restarts.
+.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 \fImicroseconds\fP
+How much of a delay should be introduced between steps of the animation.
+Default 20000, or about 0.02 seconds.
+.TP 8
+.B \-count \fIint\fP
+How many boxes or circles to animate simultaneously; default 50.
+Smaller numbers yield larger boxes/circles.
+.TP 8
+.B \-growby \fIint\fP
+How many pixels the objects should grow by, each frame.  Default 1.
+.TP 8
+.B \-spacing \fIint\fP
+How many pixels of space should be left between the objects.  Default 1.
+.TP 8
+.B \-border \fIint\fP
+Thickness of the colored border around each object.  Default 1.
+.TP 8
+.B \-circles\fB | \-squares\fP | \-random\fP
+Draw circles, squares, or choose randomly (the 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 2005 by Jamie Zawinski.  Permission to use, copy, modify, 
+distribute, and sell this software and its documentation for any purpose is 
+hereby granted without fee, provided that the above copyright notice appear 
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation.  No representations are made about the 
+suitability of this software for any purpose.  It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Jamie Zawinski <jwz@jwz.org>
index 7019b1176ee525e7bc74c8262b95d3027221700a..eb1fee355e06a7dd36e11abaf6f345c914364a1f 100644 (file)
@@ -1,4 +1,4 @@
-/* xscreensaver, Copyright (c) 1998-2004 Jamie Zawinski <jwz@jwz.org>
+/* xscreensaver, Copyright (c) 1998-2005 Jamie Zawinski <jwz@jwz.org>
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
  * documentation for any purpose is hereby granted without fee, provided that
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
  * documentation for any purpose is hereby granted without fee, provided that
@@ -1506,7 +1506,7 @@ blitdamage (Display *dpy, Window window, int delay)
   
   XGetWindowAttributes(dpy, window, &xwa);
 
   
   XGetWindowAttributes(dpy, window, &xwa);
 
-  load_random_image (xwa.screen, window, window, NULL);
+  load_random_image (xwa.screen, window, window, NULL, NULL);
 
   w = xwa.width;
   h = xwa.height;
 
   w = xwa.width;
   h = xwa.height;
@@ -1556,6 +1556,177 @@ blitdamage (Display *dpy, Window window, int delay)
   XFreeGC(dpy, gc0);
 }
 
   XFreeGC(dpy, gc0);
 }
 
+\f
+/* nvidia, by jwz.
+ *
+ * This is what happens if an Nvidia card goes into some crazy text mode.
+ * Most often seen on the second screen of a dual-head system when the
+ * proper driver isn't loaded.
+ */
+typedef struct { int fg; int bg; int bit; Bool blink; } nvcell;
+
+static void
+nvspatter (nvcell *grid, int rows, int cols, int ncolors, int nbits,
+           Bool fill_p)
+{
+  int max = rows * cols;
+  int from = fill_p ?   0 : random() % (max - 1);
+  int len  = fill_p ? max : random() % (cols * 4);
+  int to = from + len;
+  int i;
+  Bool noisy = ((random() % 4) == 0);
+  Bool diag = (noisy || fill_p) ? 0 : ((random() % 4) == 0);
+
+  int fg = random() % ncolors;
+  int bg = random() % ncolors;
+  int blink = ((random() % 4) == 0);
+  int bit = (random() % nbits);
+
+  if (to > max) to = max;
+
+  if (diag)
+    {
+      int src = random() % (rows * cols);
+      int len2 = (cols / 2) - (random() % 5);
+      int j = src;
+      for (i = from; i < to; i++, j++)
+        {
+          if (j > src + len2 || j >= max)
+            j = src;
+          if (i >= max) abort();
+          if (j >= max) abort();
+          grid[j] = grid[i];
+        }
+    }
+  else
+    for (i = from; i < to; i++)
+      {
+        nvcell *cell = &grid[i];
+        cell->fg = fg;
+        cell->bg = bg;
+        cell->bit = bit;
+        cell->blink = blink;
+
+        if (noisy)
+          {
+            fg = random() % ncolors;
+            bg = random() % ncolors;
+            blink = ((random() % 8) == 0);
+          }
+      }
+}
+
+
+static void
+nvidia (Display *dpy, Window window, int delay)
+{
+  XGCValues gcv;
+  XWindowAttributes xgwa;
+  int cols, rows;
+  int cellw, cellh;
+  unsigned long colors[256];
+  int ncolors;
+  GC gc, gc1 = 0;
+  int x, y, i;
+  int tick = 0;
+  nvcell *grid;
+  Pixmap bits[5];
+
+  XGetWindowAttributes (dpy, window, &xgwa);
+
+  cols = 80;
+  rows = 25;
+  cellw = xgwa.width  / cols;
+  cellh = xgwa.height / rows;
+  if (cellw < 8 || cellh < 18)
+    cellw = 8, cellh = 18;
+  cols = (xgwa.width  / cellw) + 1;
+  rows = (xgwa.height / cellh) + 1;
+
+  grid = (nvcell *) calloc (sizeof(*grid), rows * cols);
+  gc = XCreateGC (dpy, window, 0, &gcv);
+
+  /* Allocate colors
+   */
+  ncolors = 16;
+  for (i = 0; i < ncolors; i++)
+    {
+      XColor c;
+      c.red   = random() & 0xFFFF;
+      c.green = random() & 0xFFFF;
+      c.blue  = random() & 0xFFFF;
+      c.flags = DoRed|DoGreen|DoBlue;
+      XAllocColor (dpy, xgwa.colormap, &c);
+      colors[i] = c.pixel;
+    }
+
+  /* Construct corrupted character bitmaps
+   */
+  for (i = 0; i < countof(bits); i++)
+    {
+      int j;
+
+      bits[i] = XCreatePixmap (dpy, window, cellw, cellh, 1);
+      if (!gc1) gc1 = XCreateGC (dpy, bits[i], 0, &gcv);
+
+      XSetForeground (dpy, gc1, 0);
+      XFillRectangle (dpy, bits[i], gc1, 0, 0, cellw, cellh);
+      XSetForeground (dpy, gc1, ~0L);
+
+      if ((random() % 40) != 0)
+        for (j = 0; j < ((cellw * cellh) / 16); j++)
+          XFillRectangle (dpy, bits[i], gc1,
+                          (random() % (cellw-2)) & ~1,
+                          (random() % (cellh-2)) & ~1,
+                          2, 2);
+    }
+
+  /* Randomize the grid
+   */
+  nvspatter (grid, rows, cols, ncolors, countof(bits), True);
+  for (i = 0; i < 20; i++)
+    nvspatter (grid, rows, cols, ncolors, countof(bits), False);
+
+
+  /* Redisplay loop: blink 3x/second
+   */
+  while (1)
+    {
+      for (y = 0; y < rows; y++)
+        for (x = 0; x < cols; x++)
+          {
+            nvcell *cell = &grid[y * cols + x];
+            unsigned long fg = colors[cell->fg];
+            unsigned long bg = colors[cell->bg];
+            Bool flip = cell->blink && (tick & 1);
+            XSetForeground (dpy, gc, flip ? fg : bg);
+            XSetBackground (dpy, gc, flip ? bg : fg);
+            XCopyPlane (dpy, bits[cell->bit], window, gc,
+                        0, 0, cellw, cellh,
+                        x * cellw, y * cellh, 1L);
+          }
+
+      if ((random() % 5) == 0)    /* change the display */
+        nvspatter (grid, rows, cols, ncolors, countof(bits), False);
+
+      XSync (dpy, False);
+      usleep (333333);
+      if (bsod_sleep(dpy, 0))
+        goto DONE;
+      if (tick / 3 >= delay)
+        goto DONE;
+      tick++;
+    }
+
+ DONE:
+  XFreeColors (dpy, xgwa.colormap, colors, ncolors, 0);
+  for (i = 0; i < countof(bits); i++)
+    XFreePixmap (dpy, bits[i]);
+  XFreeGC (dpy, gc);
+  XFreeGC (dpy, gc1);
+  free (grid);
+}
+
 \f
 /*
  * SPARC Solaris panic. Should look pretty authentic on Solaris boxes.
 \f
 /*
  * SPARC Solaris panic. Should look pretty authentic on Solaris boxes.
@@ -1640,7 +1811,7 @@ make_scrolling_window (Display *dpy, Window window,
   if (!grab_screen_p) ts->sub_height += ts->sub_y, ts->sub_y = 0;
 
   if (grab_screen_p)
   if (!grab_screen_p) ts->sub_height += ts->sub_y, ts->sub_y = 0;
 
   if (grab_screen_p)
-    load_random_image (xgwa.screen, window, window, NULL);
+    load_random_image (xgwa.screen, window, window, NULL, NULL);
 
   sprintf (buf1, "%.50s.background", name);
   sprintf (buf2, "%.50s.Background", name);
 
   sprintf (buf1, "%.50s.background", name);
   sprintf (buf2, "%.50s.Background", name);
@@ -2189,6 +2360,208 @@ linux_fsck (Display *dpy, Window window, int delay)
   XClearWindow(dpy, window);
 }
 
   XClearWindow(dpy, window);
 }
 
+\f
+
+/*
+ * Linux (hppa) panic, by Stuart Brady <sdbrady@ntlworld.com>
+ * Output courtesy of M. Grabert
+ */
+static void
+hppa_linux (Display *dpy, Window window, int delay)
+{
+  XWindowAttributes xgwa;
+  scrolling_window *ts;
+  int i=0;
+  const char *sysname;
+  long int linedelay=0;
+
+# ifdef __GNUC__
+  __extension__   /* don't warn about "string length is greater than the
+                     length ISO C89 compilers are required to support"
+                     in the following string constant... */
+# endif
+
+  struct { long int delay; const char *string; } linux_panic[] =
+    {{ 0, "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"
+          "\n\n\n\n\n\n\n\n\n\n\n\n\n" },
+     { 0, "Linux version 2.6.0-test11-pa2 (root@%s) "
+          "(gcc version 3.3.2 (Debian)) #2 Mon Dec 8 06:09:27 GMT 2003\n" },
+     { 4000, "FP[0] enabled: Rev 1 Model 16\n" },
+     { 10, "The 32-bit Kernel has started...\n" },
+     { -1, "Determining PDC firmware type: System Map.\n" },
+     { -1, "model 00005bb0 00000481 00000000 00000002 7778df9f 100000f0 "
+           "00000008 000000b2 000000b2\n" },
+     { -1, "vers  00000203\n" },
+     { -1, "CPUID vers 17 rev 7 (0x00000227)\n" },
+     { -1, "capabilities 0x3\n" },
+     { -1, "model 9000/785/C3000\n" },
+     { -1, "Total Memory: 1024 Mb\n" },
+     { -1, "On node 0 totalpages: 262144\n" },
+     { -1, "  DMA zone: 262144 pages, LIFO batch:16\n" },
+     { -1, "  Normal zone: 0 pages, LIFO batch:1\n" },
+     { -1, "  HighMem zone: 0 pages, LIFO batch:1\n" },
+     { -1, "LCD display at f05d0008,f05d0000 registered\n" },
+     { -1, "Building zonelist for node : 0\n" },
+     { -1, "Kernel command line: ide=nodma root=/dev/sda3 HOME=/ ip=off "
+           "console=ttyS0 TERM=vt102 palo_kernel=2/vmlinux-2.6\n" },
+     { -1, "ide_setup: ide=nodmaIDE: Prevented DMA\n" },
+     { -1, "PID hash table entries: 16 (order 4: 128 bytes)\n" },
+     {500, "Console: colour dummy device 160x64\n" },
+     { 10, "Memory: 1034036k available\n" },
+     { -1, "Calibrating delay loop... 796.67 BogoMIPS\n" },
+     { -1, "Dentry cache hash table entries: 131072 (order: 7, 524288 "
+           "bytes)\n" },
+     { -1, "Inode-cache hash table entries: 65536 (order: 6, 262144 "
+           "bytes)\n" },
+     { -1, "Mount-cache hash table entries: 512 (order: 0, 4096 bytes)\n" },
+     { -1, "POSIX conformance testing by UNIFIX\n" },
+     { -1, "NET: Registered protocol family 16\n" },
+     { 100, "Searching for devices...\n" },
+     { 25, "Found devices:\n" },
+     { 10, "1. Astro BC Runway Port at 0xfed00000 [10] "
+           "{ 12, 0x0, 0x582, 0x0000b }\n" },
+     { -1, "2. Elroy PCI Bridge at 0xfed30000 [10/0] "
+           "{ 13, 0x0, 0x782, 0x0000a }\n" },
+     { -1, "3. Elroy PCI Bridge at 0xfed32000 [10/1] "
+           "{ 13, 0x0, 0x782, 0x0000a }\n" },
+     { -1, "4. Elroy PCI Bridge at 0xfed38000 [10/4] "
+           "{ 13, 0x0, 0x782, 0x0000a }\n" },
+     { -1, "5. Elroy PCI Bridge at 0xfed3c000 [10/6] "
+           "{ 13, 0x0, 0x782, 0x0000a }\n" },
+     { -1, "6. AllegroHigh W at 0xfffa0000 [32] "
+           "{ 0, 0x0, 0x5bb, 0x00004 }\n" },
+     { -1, "7. Memory at 0xfed10200 [49] { 1, 0x0, 0x086, 0x00009 }\n" },
+     { -1, "CPU(s): 1 x PA8500 (PCX-W) at 400.000000 MHz\n" },
+     { -1, "SBA found Astro 2.1 at 0xfed00000\n" },
+     { -1, "lba version TR2.1 (0x2) found at 0xfed30000\n" },
+     { -1, "lba version TR2.1 (0x2) found at 0xfed32000\n" },
+     { -1, "lba version TR2.1 (0x2) found at 0xfed38000\n" },
+     { -1, "lba version TR2.1 (0x2) found at 0xfed3c000\n" },
+     { 100, "SCSI subsystem initialized\n" },
+     { 10, "drivers/usb/core/usb.c: registered new driver usbfs\n" },
+     { -1, "drivers/usb/core/usb.c: registered new driver hub\n" },
+     { -1, "ikconfig 0.7 with /proc/config*\n" },
+     { -1, "Initializing Cryptographic API\n" },
+     { 250, "SuperIO: probe of 0000:00:0e.0 failed with error -1\n" },
+     { 20, "SuperIO: Found NS87560 Legacy I/O device at 0000:00:0e.1 "
+           "(IRQ 64)\n" },
+     { -1, "SuperIO: Serial port 1 at 0x3f8\n" },
+     { -1, "SuperIO: Serial port 2 at 0x2f8\n" },
+     { -1, "SuperIO: Parallel port at 0x378\n" },
+     { -1, "SuperIO: Floppy controller at 0x3f0\n" },
+     { -1, "SuperIO: ACPI at 0x7e0\n" },
+     { -1, "SuperIO: USB regulator enabled\n" },
+     { -1, "SuperIO: probe of 0000:00:0e.2 failed with error -1\n" },
+     { -1, "Soft power switch enabled, polling @ 0xf0400804.\n" },
+     { -1, "pty: 256 Unix98 ptys configured\n" },
+     { -1, "Generic RTC Driver v1.07\n" },
+     { -1, "Serial: 8250/16550 driver $Revision: 1.63 $ 13 ports, "
+           "IRQ sharing disabled\n" },
+     { -1, "ttyS0 at I/O 0x3f8 (irq = 0) is a 16550A\n" },
+     { -1, "ttyS1 at I/O 0x2f8 (irq = 0) is a 16550A\n" },
+     { -1, "Linux Tulip driver version 1.1.13 (May 11, 2002)\n" },
+     { 150, "tulip0: no phy info, aborting mtable build\n" },
+     { 10, "tulip0:  MII transceiver #1 config 1000 status 782d "
+           "advertising 01e1.\n" },
+     { -1, "eth0: Digital DS21143 Tulip rev 65 at 0xf4008000, "
+           "00:10:83:F9:B4:34, IRQ 66.\n" },
+     { -1, "Uniform Multi-Platform E-IDE driver Revision: 7.00alpha2\n" },
+     { -1, "ide: Assuming 33MHz system bus speed for PIO modes; "
+           "override with idebus=xx\n" },
+     { 100, "SiI680: IDE controller at PCI slot 0000:01:06.0\n" },
+     { 10, "SiI680: chipset revision 2\n" },
+     { -1, "SiI680: BASE CLOCK == 133\n" },
+     { -1, "SiI680: 100% native mode on irq 128\n" },
+     { -1, "    ide0: MMIO-DMA at 0xf4800000-0xf4800007 -- "
+           "Error, MMIO ports already in use.\n" },
+     { -1, "    ide1: MMIO-DMA at 0xf4800008-0xf480000f -- "
+           "Error, MMIO ports already in use.\n" },
+     { 5, "hda: TS130220A2, ATA DISK drive\n" },
+     { -1, "      _______________________________\n" },
+     { -1, "     < Your System ate a SPARC! Gah! >\n" },
+     { -1, "      -------------------------------\n" },
+     { -1, "             \\   ^__^\n" },
+     { -1, "              \\  (xx)\\_______\n" },
+     { -1, "                 (__)\\       )\\/\\\n" },
+     { -1, "                  U  ||----w |\n" },
+     { -1, "                     ||     ||\n" },
+     { -1, "swapper (pid 1): Breakpoint (code 0)\n" },
+     { -1, "\n" },
+     { -1, "     YZrvWESTHLNXBCVMcbcbcbcbOGFRQPDI\n" },
+     { -1, "PSW: 00000000000001001111111100001111 Not tainted\n" },
+     { -1, "r00-03  4d6f6f21 1032f010 10208f34 103fc2e0\n" },
+     { -1, "r04-07  103fc230 00000001 00000001 0000000f\n" },
+     { -1, "r08-11  103454f8 000f41fa 372d3980 103ee404\n" },
+     { -1, "r12-15  3ccbf700 10344810 103ee010 f0400004\n" },
+     { -1, "r16-19  f00008c4 f000017c f0000174 00000000\n" },
+     { -1, "r20-23  fed32840 fed32800 00000000 0000000a\n" },
+     { -1, "r24-27  0000ffa0 000000ff 103fc2e0 10326010\n" },
+     { -1, "r28-31  00000000 00061a80 4ff98340 10208f34\n" },
+     { -1, "sr0-3   00000000 00000000 00000000 00000000\n" },
+     { -1, "sr4-7   00000000 00000000 00000000 00000000\n" },
+     { -1, "\n" },
+     { -1, "IASQ: 00000000 00000000 IAOQ: 00000000 00000004\n" },
+     { -1, " IIR: 00000000    ISR: 00000000  IOR: 00000000\n" },
+     { -1, " CPU:        0   CR30: 4ff98000 CR31: 1037c000\n" },
+     { -1, " ORIG_R28: 55555555\n" },
+     { -1, " IAOQ[0]: 0x0\n" },
+     { -1, " IAOQ[1]: 0x4\n" },
+     { -1, " RP(r2): probe_hwif+0x218/0x44c\n" },
+     { -1, "Kernel panic: Attempted to kill init!\n" },
+     { 0, NULL }};
+
+  XGetWindowAttributes (dpy, window, &xgwa);
+  XSetWindowBackground (dpy, window, 
+                        get_pixel_resource("HPPALinux.background",
+                                           "HPPALinux.Background",
+                                           dpy, xgwa.colormap));
+  XClearWindow(dpy, window);
+
+  sysname = "hppa";
+# ifdef HAVE_UNAME
+  {
+    struct utsname uts;
+    char *s;
+    if (uname (&uts) >= 0)
+      sysname = uts.nodename;
+    s = strchr (sysname, '.');
+    if (s) *s = 0;
+  }
+# endif        /* !HAVE_UNAME */
+
+  /* Insert current host name into banner on line 2 */
+  {
+    static char ss[1024];
+    sprintf (ss, linux_panic[1].string, sysname);
+    linux_panic[1].string = ss;
+  }
+
+  ts = make_scrolling_window (dpy, window, "HPPALinux", False);
+
+  usleep (100000);
+  while (linux_panic[i].string)
+    {
+      if (linux_panic[i].delay != -1)
+        linedelay = linux_panic[i].delay * 1000;
+      usleep (linedelay);
+      scrolling_puts (ts, linux_panic[i].string, 0);
+      XSync(dpy, False);
+      if (bsod_sleep (dpy, 0))
+        goto DONE;
+      i++;
+    }
+
+  if (bsod_sleep (dpy, 4))
+    goto DONE;
+
+  XSync(dpy, False);
+  bsod_sleep(dpy, delay);
+
+ DONE:
+  free_scrolling_window (ts);
+  XClearWindow(dpy, window);
+}
+
 /* VMS by jwz (text sent by Roland Barmettler <roli@barmettler.net>)
  */
 static void
 /* VMS by jwz (text sent by Roland Barmettler <roli@barmettler.net>)
  */
 static void
@@ -2678,6 +3051,125 @@ DONE:
 }
 
 
 }
 
 
+\f
+
+/* Compaq Tru64 Unix panic, by jwz as described by
+   Tobias Klausmann <klausman@schwarzvogel.de>
+ */
+
+static void
+tru64 (Display* dpy, Window window, int delay)
+{
+  XWindowAttributes xgwa;
+  scrolling_window *ts;
+  const char *sysname;
+  char buf[2048];
+
+# ifdef __GNUC__
+  __extension__   /* don't warn about "string length is greater than the
+                     length ISO C89 compilers are required to support"
+                     in the following string constant... */
+# endif
+
+  const char *msg1 =
+   ("panic (cpu 0): trap: illegal instruction\n"
+    "kernel inst fault=gentrap, ps=0x5, pc=0xfffffc0000593878, inst=0xaa\n"
+    "kernel inst fault=gentrap, ps=0x5, pc=0xfffffc0000593878, inst=0xaa\n"
+    "                                                                   \n"
+    "DUMP: blocks available:  1571600\n"
+    "DUMP: blocks wanted:      100802 (partial compressed dump) [OKAY]\n"
+    "DUMP: Device     Disk Blocks Available\n"
+    "DUMP: ------     ---------------------\n"
+    "DUMP: 0x1300023  1182795 - 1571597 (of 1571598) [primary swap]\n"
+    "DUMP.prom: Open: dev 0x5100041, block 2102016: SCSI 0 11 0 2 200 0 0\n"
+    "DUMP: Writing header... [1024 bytes at dev 0x1300023, block 1571598]\n"
+    "DUMP: Writing data");
+  const char *msg2 =
+   ("DUMP: Writing header... [1024 bytes at dev 0x1300023, block 1571598]\n"
+    "DUMP: crash dump complete.\n"
+    "kernel inst fault=gentrap, ps=0x5, pc=0xfffffc0000593878, inst=0xaa\n"
+    "                                                                   \n"
+    "DUMP: second crash dump skipped: 'dump_savecnt' enforced.\n");
+  const char *msg3 =
+   ("\n"
+    "halted CPU 0\n"
+    "\n"
+    "halt code = 5\n"
+    "HALT instruction executed\n"
+    "PC = fffffc00005863b0\n");
+  const char *msg4 =
+   ("\n"   
+    "CPU 0 booting\n"
+    "\n"
+    "\n"
+    "\n");
+
+  XGetWindowAttributes (dpy, window, &xgwa);
+  ts = make_scrolling_window (dpy, window, "Tru64", False);
+  XClearWindow(dpy,window);
+  ts->columns = 10000;  /* never wrap */
+  ts->sub_x = 0;
+  ts->sub_y = 0;
+  ts->sub_width = xgwa.width;
+  ts->sub_height = xgwa.height;
+
+  sysname = "127.0.0.1";
+# ifdef HAVE_UNAME
+  {
+    struct utsname uts;
+    if (uname (&uts) >= 0)
+      sysname = uts.nodename;
+  }
+# endif        /* !HAVE_UNAME */
+
+  if (bsod_sleep (dpy, 1))
+    goto DONE;
+  
+      
+
+  sprintf (buf,
+           "Compaq Tru64 UNIX V5.1B (Rev. 2650) (%.100s) console\n"
+           "\n"
+           "login: ",
+           sysname);
+  scrolling_puts (ts, buf, 0);
+  if (bsod_sleep (dpy, 6))
+    goto DONE;
+
+  scrolling_puts (ts, msg1, 0);
+  {
+    int i;
+    int steps = 4 + (random() % 8);
+    for (i = 0; i < steps; i++)
+      {
+        scrolling_puts (ts, ".", 0);
+        XSync (dpy, False);
+        if (bsod_sleep (dpy, 1))
+          goto DONE;
+      }
+    sprintf (buf, "[%dMB]\n", steps);
+    scrolling_puts (ts, buf, 0);
+  }
+
+  scrolling_puts (ts, msg2, 0);
+  XSync(dpy, False);
+  if (bsod_sleep (dpy, 4))
+    goto DONE;
+
+  scrolling_puts (ts, msg3, 0);
+  XSync(dpy, False);
+  if (bsod_sleep (dpy, 3))
+    goto DONE;
+
+  scrolling_puts (ts, msg4, 0);
+  XSync(dpy, False);
+  bsod_sleep(dpy, delay);
+
+ DONE:
+  free_scrolling_window (ts);
+}
+
+
 \f
 /*
  * Simulate various Apple ][ crashes. The memory map encouraged many programs
 \f
 /*
  * Simulate various Apple ][ crashes. The memory map encouraged many programs
@@ -3025,9 +3517,11 @@ char *defaults [] = {
   "*doBSD:                False",      /* boring */
   "*doLinux:              True",
   "*doSparcLinux:         False",      /* boring */
   "*doBSD:                False",      /* boring */
   "*doLinux:              True",
   "*doSparcLinux:         False",      /* boring */
+  "*doHPPALinux:          True",
   "*doBlitDamage:          True",
   "*doSolaris:             True",
   "*doHPUX:                True",
   "*doBlitDamage:          True",
   "*doSolaris:             True",
   "*doHPUX:                True",
+  "*doTru64:               True",
   "*doApple2:              True",
   "*doOS390:               True",
   "*doVMS:                True",
   "*doApple2:              True",
   "*doOS390:               True",
   "*doVMS:                True",
@@ -3083,6 +3577,11 @@ char *defaults [] = {
   ".Linux.foreground:      White",
   ".Linux.background:      Black",
 
   ".Linux.foreground:      White",
   ".Linux.background:      Black",
 
+  ".HPPALinux.font:       -*-courier-bold-r-*-*-*-120-*-*-m-*-*-*",
+  ".HPPALinux.font2:      -*-courier-bold-r-*-*-*-140-*-*-m-*-*-*",
+  ".HPPALinux.foreground:  White",
+  ".HPPALinux.background:  Black",
+
   ".SparcLinux.font:      -*-courier-bold-r-*-*-*-120-*-*-m-*-*-*",
   ".SparcLinux.font2:     -*-courier-bold-r-*-*-*-140-*-*-m-*-*-*",
   ".SparcLinux.foreground: White",
   ".SparcLinux.font:      -*-courier-bold-r-*-*-*-120-*-*-m-*-*-*",
   ".SparcLinux.font2:     -*-courier-bold-r-*-*-*-140-*-*-m-*-*-*",
   ".SparcLinux.foreground: White",
@@ -3111,6 +3610,11 @@ char *defaults [] = {
   ".OS390.background:     Black",
   ".OS390.foreground:     Red",
 
   ".OS390.background:     Black",
   ".OS390.foreground:     Red",
 
+  ".Tru64.font:                   9x15bold",
+  ".Tru64.font2:          -*-courier-bold-r-*-*-*-140-*-*-m-*-*-*",
+  ".Tru64.foreground:     White",
+  ".Tru64.background:     #0000AA",    /* EGA color 0x01. */
+
   "*apple2TVColor:         50",
   "*apple2TVTint:          5",
   "*apple2TVBrightness:    10",
   "*apple2TVColor:         50",
   "*apple2TVTint:          5",
   "*apple2TVBrightness:    10",
@@ -3166,16 +3670,22 @@ XrmOptionDescRec options [] = {
   { "-no-bsd",         ".doBSD",               XrmoptionNoArg,  "False" },
   { "-linux",          ".doLinux",             XrmoptionNoArg,  "True"  },
   { "-no-linux",       ".doLinux",             XrmoptionNoArg,  "False" },
   { "-no-bsd",         ".doBSD",               XrmoptionNoArg,  "False" },
   { "-linux",          ".doLinux",             XrmoptionNoArg,  "True"  },
   { "-no-linux",       ".doLinux",             XrmoptionNoArg,  "False" },
+  { "-hppalinux",      ".doHPPALinux",         XrmoptionNoArg,  "True"  },
+  { "-no-hppalinux",   ".doHPPALinux",         XrmoptionNoArg,  "False" },
   { "-sparclinux",     ".doSparcLinux",        XrmoptionNoArg,  "True"  },
   { "-no-sparclinux",  ".doSparcLinux",        XrmoptionNoArg,  "False" },
   { "-blitdamage",     ".doBlitDamage",        XrmoptionNoArg,  "True"  },
   { "-no-blitdamage",  ".doBlitDamage",        XrmoptionNoArg,  "False" },
   { "-sparclinux",     ".doSparcLinux",        XrmoptionNoArg,  "True"  },
   { "-no-sparclinux",  ".doSparcLinux",        XrmoptionNoArg,  "False" },
   { "-blitdamage",     ".doBlitDamage",        XrmoptionNoArg,  "True"  },
   { "-no-blitdamage",  ".doBlitDamage",        XrmoptionNoArg,  "False" },
+  { "-nvidia",         ".doNvidia",            XrmoptionNoArg,  "True"  },
+  { "-no-nvidia",      ".doNvidia",            XrmoptionNoArg,  "False" },
   { "-solaris",                ".doSolaris",           XrmoptionNoArg,  "True"  },
   { "-no-solaris",     ".doSolaris",           XrmoptionNoArg,  "False" },
   { "-hpux",           ".doHPUX",              XrmoptionNoArg,  "True"  },
   { "-no-hpux",                ".doHPUX",              XrmoptionNoArg,  "False" },
   { "-os390",          ".doOS390",             XrmoptionNoArg,  "True"  },
   { "-no-os390",       ".doOS390",             XrmoptionNoArg,  "False" },
   { "-solaris",                ".doSolaris",           XrmoptionNoArg,  "True"  },
   { "-no-solaris",     ".doSolaris",           XrmoptionNoArg,  "False" },
   { "-hpux",           ".doHPUX",              XrmoptionNoArg,  "True"  },
   { "-no-hpux",                ".doHPUX",              XrmoptionNoArg,  "False" },
   { "-os390",          ".doOS390",             XrmoptionNoArg,  "True"  },
   { "-no-os390",       ".doOS390",             XrmoptionNoArg,  "False" },
+  { "-tru64",          ".doHPUX",              XrmoptionNoArg,  "True"  },
+  { "-no-tru64",       ".doTru64",             XrmoptionNoArg,  "False" },
   { "-vms",            ".doVMS",               XrmoptionNoArg,  "True"  },
   { "-no-vms",         ".doVMS",               XrmoptionNoArg,  "False" },
   { "-msdos",          ".doMSDOS",             XrmoptionNoArg,  "True"  },
   { "-vms",            ".doVMS",               XrmoptionNoArg,  "True"  },
   { "-no-vms",         ".doVMS",               XrmoptionNoArg,  "False" },
   { "-msdos",          ".doMSDOS",             XrmoptionNoArg,  "True"  },
@@ -3199,14 +3709,17 @@ static struct {
   { "MacX",            macx },
   { "SCO",             sco },
   { "HVX",             hvx },
   { "MacX",            macx },
   { "SCO",             sco },
   { "HVX",             hvx },
+  { "HPPALinux",       hppa_linux },
   { "SparcLinux",      sparc_linux },
   { "BSD",             bsd },
   { "Atari",           atari },
   { "BlitDamage",      blitdamage },
   { "SparcLinux",      sparc_linux },
   { "BSD",             bsd },
   { "Atari",           atari },
   { "BlitDamage",      blitdamage },
+  { "Nvidia",          nvidia },
   { "Solaris",         sparc_solaris },
   { "Linux",           linux_fsck },
   { "HPUX",            hpux },
   { "OS390",           os390 },
   { "Solaris",         sparc_solaris },
   { "Linux",           linux_fsck },
   { "HPUX",            hpux },
   { "OS390",           os390 },
+  { "Tru64",           tru64 },
   { "Apple2",          apple2crash },
   { "VMS",             vms },
   { "MSDOS",           msdos },
   { "Apple2",          apple2crash },
   { "VMS",             vms },
   { "MSDOS",           msdos },
index 26572de7a2cd3daa30e1c9565416d0d65997cfaa..d04456d55e13e75b56622c1c64e9474a80f73296 100644 (file)
@@ -28,7 +28,7 @@ program is the finest in personal computer emulation.
 steps through a set of screens, each one a recreation of a different failure
 mode of an operating system.  Systems depicted include
 Windows 3.1, Windows 95, Windows NT, MS-DOS, AmigaDOS 1.3, Linux,
 steps through a set of screens, each one a recreation of a different failure
 mode of an operating system.  Systems depicted include
 Windows 3.1, Windows 95, Windows NT, MS-DOS, AmigaDOS 1.3, Linux,
-SCO UNIX, BSD UNIX, HPUX, Solaris, VMS, HVX/GCOS6, IBM OS/390, 
+SCO UNIX, BSD UNIX, HPUX, Solaris, Tru64, VMS, HVX/GCOS6, IBM OS/390, 
 MacOS (MacsBug, Bomb, Sad Mac, and OSX), Atari ST, Apple ][+, and
 NCD X Terminals.
 .PP
 MacOS (MacsBug, Bomb, Sad Mac, and OSX), Atari ST, Apple ][+, and
 NCD X Terminals.
 .PP
@@ -82,19 +82,21 @@ hacks are displayed and which aren't.
 .BR doBSD ,
 .BR doLinux ,
 .BR doSparcLinux ,
 .BR doBSD ,
 .BR doLinux ,
 .BR doSparcLinux ,
+.BR doHPPALinux ,
 .BR doBlitDamage ,
 .BR doSolaris ,
 .BR doHPUX ,
 .BR doApple2 ,
 .BR doOS390 ,
 .BR doBlitDamage ,
 .BR doSolaris ,
 .BR doHPUX ,
 .BR doApple2 ,
 .BR doOS390 ,
+.BR doTru64 ,
 .BR doVMS ,
 .BR doMSDOS ,
 and
 .BR doHVX .
 Each of these is a Boolean resource, they all default to true, except
 .BR doVMS ,
 .BR doMSDOS ,
 and
 .BR doHVX .
 Each of these is a Boolean resource, they all default to true, except
-for doAtari, doBSD, and doSparcLinux, which are turned off by default,
-because they're really not all that interesting looking unless you're a
-fan of those systems.  
+for doAtari, doBSD, doSparcLinux, and doHPPALinux, which are turned off
+by default, because they're really not all that interesting looking
+unless you're a fan of those systems.  
 
 There are command-line options for all of these:
 e.g., \fI\-bsd\fP, \fI\-no-bsd\fP.  (Also note the \fI\-only\fP option.)
 
 There are command-line options for all of these:
 e.g., \fI\-bsd\fP, \fI\-no-bsd\fP.  (Also note the \fI\-only\fP option.)
index 5b73e7c569002079a56035bae2f705590c9021c2..64a02482748e95535f2d5d5300097319bb79cf10 100644 (file)
@@ -313,7 +313,7 @@ void InitBumpMap( SBumps *pBumps, XWindowAttributes *pXWinAttribs )
     p = XCreatePixmap(pBumps->pDisplay, pBumps->Win,
                       pXWinAttribs->width, pXWinAttribs->height,
                       pXWinAttribs->depth);
     p = XCreatePixmap(pBumps->pDisplay, pBumps->Win,
                       pXWinAttribs->width, pXWinAttribs->height,
                       pXWinAttribs->depth);
-    load_random_image (pXWinAttribs->screen, pBumps->Win, p, NULL);
+    load_random_image (pXWinAttribs->screen, pBumps->Win, p, NULL, NULL);
 
        pScreenImage = XGetImage( pBumps->pDisplay, p, 0, 0, pBumps->iWinWidth, pBumps->iWinHeight, ~0L, ZPixmap );
     XFreePixmap (pBumps->pDisplay, p);
 
        pScreenImage = XGetImage( pBumps->pDisplay, p, 0, 0, pBumps->iWinWidth, pBumps->iWinHeight, ~0L, ZPixmap );
     XFreePixmap (pBumps->pDisplay, p);
index 33b7890a4765a2db62f77defe518a18248222cc0..28723d04e90d0bf7dd9e000b05bd22200e62ba8f 100644 (file)
@@ -10,6 +10,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]) BLASTER.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) BLITSPIN.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) BOUBOULE.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) BLASTER.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) BLITSPIN.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) BOUBOULE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) BOXFIT.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) BRAID.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) BSOD.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) BUBBLES.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) BRAID.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) BSOD.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) BUBBLES.C
@@ -33,6 +34,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]) ERUPTION.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) EULER2D.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) FADEPLOT.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) ERUPTION.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) EULER2D.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) FADEPLOT.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) FIBERLAMP.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) FIREWORKX.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) FLAG.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) FLAME.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) FIREWORKX.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) FLAG.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) FLAME.C
index 33b7890a4765a2db62f77defe518a18248222cc0..28723d04e90d0bf7dd9e000b05bd22200e62ba8f 100644 (file)
@@ -10,6 +10,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]) BLASTER.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) BLITSPIN.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) BOUBOULE.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) BLASTER.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) BLITSPIN.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) BOUBOULE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) BOXFIT.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) BRAID.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) BSOD.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) BUBBLES.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) BRAID.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) BSOD.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) BUBBLES.C
@@ -33,6 +34,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]) ERUPTION.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) EULER2D.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) FADEPLOT.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) ERUPTION.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) EULER2D.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) FADEPLOT.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) FIBERLAMP.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) FIREWORKX.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) FLAG.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) FLAME.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) FIREWORKX.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) FLAG.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) FLAME.C
index 83f9700b93c4a60add6629fcdb54b66fc5352ead..2e9b7d430c432b6ed1526df7441617aa5c70d1ff 100644 (file)
@@ -4,8 +4,8 @@
             a screen saver and locker for the X window system
                             by Jamie Zawinski
 
             a screen saver and locker for the X window system
                             by Jamie Zawinski
 
-                              version 4.19
-                               16-Dec-2004
+                              version 4.20
+                               23-Feb-2005
 
                      http://www.jwz.org/xscreensaver/
 
 
                      http://www.jwz.org/xscreensaver/
 
@@ -131,10 +131,9 @@ The tags and parameters used here are:
 
         This creates a selection popup menu.
 
 
         This creates a selection popup menu.
 
-        Options should have _arg-set, and never _arg-unset.
+        Options should have _arg-set (_arg-unset is not used here.)
 
 
-        One of the menu items (the default) should have no
-        _arg-set.
+        One of the menu items (the default) should have no _arg-set.
 
 -----------------------------------------------------------------------
 
 
 -----------------------------------------------------------------------
 
@@ -143,7 +142,7 @@ The tags and parameters used here are:
            arg="-SWITCH %"
            />
 
            arg="-SWITCH %"
            />
 
-        This creates a text entry field.  Options should be obvious.
+        This creates a text entry field.
 
 -----------------------------------------------------------------------
 
 
 -----------------------------------------------------------------------
 
diff --git a/hacks/config/boing.xml b/hacks/config/boing.xml
new file mode 100644 (file)
index 0000000..6a741c3
--- /dev/null
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="boing" _label="Boing">
+
+  <command arg="-root"/>
+
+  <number id="size" type="slider" arg="-size %"
+          _label="Size" _low-label="Tiny" _high-label="Huge"
+          low="0.02" high="0.9" default="0.5"/>
+
+  <number id="speed" type="slider" arg="-speed %"
+          _label="Speed" _low-label="Slow" _high-label="Fast"
+          low="0.1" high="10.0" default="1.0"/>
+
+  <vgroup>
+   <hgroup>
+    <number id="meridians" type="spinbutton" arg="-meridians %"
+            _label="Meridians" low="1" high="90" default="8"/>
+    <number id="parallels" type="spinbutton" arg="-parallels %"
+            _label="Parallels" low="1" high="90" default="16"/>
+   </hgroup>
+   <hgroup>
+    <boolean id="smoothing" _label="Smoothing" arg-set="-smooth"/>
+    <boolean id="lighting"  _label="Lighting" arg-set="-lighting"/>
+    <boolean id="scanlines" _label="Scanlines" arg-set="-scanlines"/>
+   </hgroup>
+   <hgroup>
+    <boolean id="wire"      _label="Wireframe" arg-set="-wireframe"/>
+    <boolean id="showfps"   _label="Show Frames-per-Second" arg-set="-fps"/>
+   </hgroup>
+  </vgroup>
+
+  <_description>
+
+This bouncing ball is a clone of the first graphics demo for the Amiga
+1000, which was written by Dale Luck and RJ Mical during a break at
+the 1984 Consumer Electronics Show (or so the legend goes.)
+
+This looks like the original Amiga demo if you turn off "smoothing"
+and "lighting" and turn on "scanlines".
+
+Written by Jamie Zawinski.
+  </_description>
+</screensaver>
diff --git a/hacks/config/boxfit.xml b/hacks/config/boxfit.xml
new file mode 100644 (file)
index 0000000..db07f56
--- /dev/null
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="boxfit" _label="BoxFit">
+
+  <command arg="-root"/>
+
+  <number id="delay" type="slider" arg="-delay %"
+          _label="Speed" _low-label="Slow" _high-label="Fast"
+          low="0" high="50000" default="20000"
+          convert="invert"/>
+
+  <hgroup>
+   <number id="count" type="spinbutton" arg="-count %"
+           _label="Boxes" low="1" high="1000" default="50"/>
+
+   <number id="growby" type="spinbutton" arg="-growby %"
+           _label="Grow By" low="1" high="10" default="1"/>
+  </hgroup>
+
+  <hgroup>
+   <number id="spacing" type="spinbutton" arg="-spacing %"
+           _label="Spacing" low="1" high="10" default="1"/>
+
+   <number id="border" type="spinbutton" arg="-border %"
+           _label="Border" low="1" high="10" default="1"/>
+  </hgroup>
+
+  <select id="mode">
+    <option id="random"  _label="Boxes or Circles"/>
+    <option id="boxes"   _label="Boxes Only" arg-set="-boxes"/>
+    <option id="circles" _label="Circles Only" arg-set="-circles"/>
+  </select>
+
+  <_description>
+Packs the screen with growing boxes or circles, colored according to a
+horizontal or vertical gradient.  The objects grow until they touch,
+then stop.  When the screen is full, they shrink away and the process
+restarts.  Written by Jamie Zawinski.
+  </_description>
+</screensaver>
index fb9143563375e82404d7efd570ced5d6c0763a39..17d2d02fd8c4d2580070255674dd733da21ed7e9 100644 (file)
    <vgroup>
      <boolean id="windows"    _label="Windows 3.1"  arg-unset="-no-windows"/>
      <boolean id="nt"         _label="Windows NT"   arg-unset="-no-nt"/>
    <vgroup>
      <boolean id="windows"    _label="Windows 3.1"  arg-unset="-no-windows"/>
      <boolean id="nt"         _label="Windows NT"   arg-unset="-no-nt"/>
-     <boolean id="2k"         _label="Windows 2000" arg-unset="-no-2k"/>
+     <boolean id="2k"         _label="Windows 2000  " arg-unset="-no-2k"/>
      <boolean id="msdos"      _label="MS-DOS"       arg-unset="-no-msdos"/>
      <boolean id="msdos"      _label="MS-DOS"       arg-unset="-no-msdos"/>
+     <boolean id="amiga"      _label="AmigaDOS"     arg-unset="-no-amiga"/>
+     <boolean id="atari"      _label="Atari"        arg-set="-atari"/>
+     <boolean id="apple2"     _label="Apple II"     arg-unset="-no-apple2"/>
+     <boolean id="nvidia"     _label="Nvidia"       arg-unset="-no-nvidia"/>
+   </vgroup>
+   <vgroup>
      <boolean id="mac"        _label="Sad Mac"      arg-unset="-no-mac"/>
      <boolean id="mac1"       _label="Mac Bomb"     arg-unset="-no-mac1"/>
      <boolean id="macsbug"    _label="MacsBug"      arg-unset="-no-macsbug"/>
      <boolean id="macx"       _label="MacOS X"      arg-unset="-no-macx"/>
      <boolean id="mac"        _label="Sad Mac"      arg-unset="-no-mac"/>
      <boolean id="mac1"       _label="Mac Bomb"     arg-unset="-no-mac1"/>
      <boolean id="macsbug"    _label="MacsBug"      arg-unset="-no-macsbug"/>
      <boolean id="macx"       _label="MacOS X"      arg-unset="-no-macx"/>
-     <boolean id="blitdamage" _label="NCD X Terminal" arg-unset="-no-blitdamage"/>
      <boolean id="os390"      _label="OS/390"       arg-unset="-no-os390"/>
      <boolean id="vms"        _label="VMS"          arg-unset="-no-vms"/>
      <boolean id="os390"      _label="OS/390"       arg-unset="-no-os390"/>
      <boolean id="vms"        _label="VMS"          arg-unset="-no-vms"/>
+     <boolean id="hvx"        _label="HVX/GCOS6"    arg-unset="-no-hvx"/>
+     <boolean id="blitdamage" _label="NCD X Terminal  " arg-unset="-no-blitdamage"/>
    </vgroup>
    <vgroup>
      <boolean id="bsd"        _label="BSD"          arg-set="-bsd"/>
    </vgroup>
    <vgroup>
      <boolean id="bsd"        _label="BSD"          arg-set="-bsd"/>
-     <boolean id="linux"      _label="Linux"        arg-unset="-no-linux"/>
-     <boolean id="sparclinux" _label="Sparc Linux"  arg-set="-sparclinux"/>
+     <boolean id="linux"      _label="Linux (fsck)" arg-unset="-no-linux"/>
+     <boolean id="sparclinux" _label="Linux (sparc)" arg-set="-sparclinux"/>
+     <boolean id="hppalinux"  _label="Linux (hppa)" arg-unset="-no-hppalinux"/>
      <boolean id="solaris"    _label="Solaris"      arg-unset="-no-solaris"/>
      <boolean id="sco"        _label="SCO"          arg-unset="-no-sco"/>
      <boolean id="solaris"    _label="Solaris"      arg-unset="-no-solaris"/>
      <boolean id="sco"        _label="SCO"          arg-unset="-no-sco"/>
-     <boolean id="hvx"        _label="HVX/GCOS6"    arg-unset="-no-hvx"/>
      <boolean id="hpux"       _label="HPUX"         arg-unset="-no-hpux"/>
      <boolean id="hpux"       _label="HPUX"         arg-unset="-no-hpux"/>
-     <boolean id="amiga"      _label="AmigaDOS"     arg-unset="-no-amiga"/>
-     <boolean id="atari"      _label="Atari"        arg-set="-atari"/>
-     <boolean id="apple2"     _label="Apple II"     arg-unset="-no-apple2"/>
+     <boolean id="tru64"      _label="Tru64"        arg-unset="-no-tru64"/>
    </vgroup>
   </hgroup>
 
    </vgroup>
   </hgroup>
 
+
+
   <_description>
 BSOD stands for ``Blue Screen of Death.''  The finest in personal
 computer emulation, this hack simulates popular screen savers from a
   <_description>
 BSOD stands for ``Blue Screen of Death.''  The finest in personal
 computer emulation, this hack simulates popular screen savers from a
diff --git a/hacks/config/carousel.xml b/hacks/config/carousel.xml
new file mode 100644 (file)
index 0000000..a15f1fc
--- /dev/null
@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="carousel" _label="Carousel">
+
+  <command arg="-root"/>
+
+  <hgroup>
+    <number id="count" type="spinbutton" arg="-count %"
+            _label="Number of Images:" low="1" high="20" default="7"/>
+  </hgroup>
+
+  <number id="duration" type="slider" arg="-duration %"
+          _label="Time until loading a new image:"
+          _low-label="5 Seconds" _high-label="1 Minute"
+          low="5" high="60" default="20"/>
+
+  <number id="speed" type="slider" arg="-speed %"
+          _label="Animation Speed" _low-label="Slow" _high-label="Fast"
+          low="0.1" high="8.0" default="1.0"/>
+
+  <number id="delay" type="slider" arg="-delay %"
+          _label="Frame Rate" _low-label="Low" _high-label="High"
+          low="0" high="100000" default="20000"
+          convert="invert"/>
+
+  <select id="mode">
+    <option id="tiltxy"  _label="Tilt In/Out and Left/Right"/>
+    <option id="tiltx"   _label="Tilt In/Out Only"     arg-set="-tilt x"/>
+    <option id="tilty"   _label="Tilt Left/Right Only" arg-set="-tilt y"/>
+    <option id="notilt"  _label="No Tilting"           arg-set="-no-tilt"/>
+  </select>
+
+  <boolean id="zoom" _label="Zoom In/Out" arg-unset="-no-zoom"/>
+  <boolean id="titles" _label="Show Image Titles" arg-unset="-no-titles"/>
+
+  <boolean id="showfps" _label="Show Frames-per-Second" arg-set="-fps"/>
+
+  <_description>
+Loads several random images, and displays them flying in a circular
+formation.  The circle changes speed and direction randomly, tilts on
+its axis, and the images move in and out.
+
+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 tab at the top of the *other* window.)
+
+This program requires a good video card capable of supporting large
+textures.
+
+Written by Jamie Zawinski.
+  </_description>
+</screensaver>
index 88c75598dd488bd57c5fd134a472a71313ee60b3..493b0e8a91284352efdf427ba8422f9a47fc2cfe 100644 (file)
@@ -6,7 +6,7 @@
 
   <number id="delay" type="slider" arg="-delay %"
           _label="Speed" _low-label="Slow" _high-label="Fast"
 
   <number id="delay" type="slider" arg="-delay %"
           _label="Speed" _low-label="Slow" _high-label="Fast"
-          low="0" high="200000" default="1000"
+          low="0" high="200000" default="20000"
           convert="invert"/>
 
   <!-- #### -speed [0] -->
           convert="invert"/>
 
   <!-- #### -speed [0] -->
index 18deb09c96bb06b555595b5be1aeaf1389942233..f8eb4bdb600024eddeab03f16325fcde297ff0e3 100644 (file)
@@ -6,7 +6,7 @@
 
   <number id="delay" type="slider" arg="-delay %"
           _label="Speed" _low-label="Slow" _high-label="Fast"
 
   <number id="delay" type="slider" arg="-delay %"
           _label="Speed" _low-label="Slow" _high-label="Fast"
-          low="0" high="20000" default="10000"
+          low="0" high="40000" default="20000"
           convert="invert"/>
 
   <select id="mode">
           convert="invert"/>
 
   <select id="mode">
diff --git a/hacks/config/fiberlamp.xml b/hacks/config/fiberlamp.xml
new file mode 100644 (file)
index 0000000..23c8f44
--- /dev/null
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="fiberlamp" _label="Fiberlamp">
+
+  <command arg="-root"/>
+
+  <number id="count" type="slider" arg="-count %"
+          _label="Fibers" _low-label="Few" _high-label="Many"
+          low="10" high="500" default="500"/>
+
+  <number id="cycles" type="slider" arg="-cycles %"
+          _label="Time between Knocks" _low-label="Short" _high-label="Long"
+          low="100" high="10000" default="10000"/>
+
+  <_description>
+Draws a groovy rotating fiber optic lamp.  Written by Tim Auckland.
+  </_description>
+</screensaver>
index d5ce80e298ab7b0bb44dc372e4ff8cd65a65e83a..2e9f65131a72026235f21db886f9d73572a3a319 100644 (file)
@@ -29,6 +29,8 @@
           low="0" high="100000" default="20000"
           convert="invert"/>
 
           low="0" high="100000" default="20000"
           convert="invert"/>
 
+  <boolean id="letterbox" _label="Letterbox" arg-unset="-clip"/>
+
   <boolean id="titles" _label="Show Image Titles" arg-set="-titles"/>
 
   <boolean id="showfps" _label="Show Frames-per-Second" arg-set="-fps"/>
   <boolean id="titles" _label="Show Image Titles" arg-set="-titles"/>
 
   <boolean id="showfps" _label="Show Frames-per-Second" arg-set="-fps"/>
index 54a03a47777723e23078ba23c41f447e74770ae2..40f291a100e6bc0dfbd5a3f48568c6ac65ea4bee 100644 (file)
@@ -6,17 +6,27 @@
 
   <number id="count" type="slider" arg="-count %"
           _label="Speed" _low-label="Slow" _high-label="Fast"
 
   <number id="count" type="slider" arg="-count %"
           _label="Speed" _low-label="Slow" _high-label="Fast"
-          low="50" high="1000" default="150"
+          low="50" high="1000" default="200"
           convert="invert"/>
 
           convert="invert"/>
 
-  <number id="trails" type="slider" arg="-trail %"
+  <number id="cycles" type="slider" arg="-cycles %"
+          _label="Performance Length" _low-label="Short" _high-label="Long"
+          low="50" high="1000" default="1000"/>
+
+  <number id="tail" type="slider" arg="-tail %"
           _label="Trail Length" _low-label="None" _high-label="Long"
           low="0" high="100" default="0"/>
 
           _label="Trail Length" _low-label="None" _high-label="Long"
           low="0" high="100" default="0"/>
 
-  <boolean id="solid" _label="Checkered Balls" arg-unset="-solid"/>
+  <boolean id="describe" _label="turn on/off pattern descriptions." arg-unset="-no-describe"/>
+
+  <boolean id="balls" _label="turn on/off Balls." arg-unset="-no-balls"/>
+  <boolean id="clubs" _label="turn on/off Clubs." arg-unset="-no-clubs"/>
+  <boolean id="torches" _label="turn on/off Flaming Torches." arg-unset="-no-torches"/>
+  <boolean id="knives" _label="turn on/off Knives." arg-unset="-no-knives"/>
+  <boolean id="rings" _label="turn on/off Rings." arg-unset="-no-rings"/>
+  <boolean id="bballs" _label="turn on/off Bowling Balls." arg-unset="-no-bballs"/>
 
 
-<!-- I can't figure out what -cycles does -->
-<!-- -pattern would be a really long, confusing option menu -->
+  <string id="pattern" _label="Use Pattern " arg="-pattern %" />
 
   <_description>
 Draws a juggling stick-man.  Written by Tim Auckland.
 
   <_description>
 Draws a juggling stick-man.  Written by Tim Auckland.
index 0673c1697cec78e857f5a3ea464a5a09ddcdc353..70ca51bf944cad8440fb7ac2afa3fe54c9ceaa0f 100644 (file)
@@ -29,7 +29,7 @@
 
   <number id="delay" type="slider" arg="-delay %"
           _label="Speed" _low-label="Slow" _high-label="Fast"
 
   <number id="delay" type="slider" arg="-delay %"
           _label="Speed" _low-label="Slow" _high-label="Fast"
-          low="0" high="10000" default="100"
+          low="0" high="80000" default="10000"
           convert="invert"/>
 
   <boolean id="fisheye" _label="Fisheye Lens" arg-unset="-no-fisheye"/>
           convert="invert"/>
 
   <boolean id="fisheye" _label="Fisheye Lens" arg-unset="-no-fisheye"/>
index e642d6148f59692bdb17688a099bfa94f0b2687d..47a0f69eec8c6392a4451fb35d4a0d8ae655b066 100644 (file)
@@ -28,7 +28,8 @@
   <string id="aname" _label="Team A Name" arg="-team-a-name %"/>
   <string id="bname" _label="Team B Name" arg="-team-b-name %"/>
 
   <string id="aname" _label="Team A Name" arg="-team-a-name %"/>
   <string id="bname" _label="Team B Name" arg="-team-b-name %"/>
 
-  <boolean id="dns" _label="Resolve Host Names" arg-unset="-no-dns"/>
+  <boolean id="dns"   _label="Resolve Host Names" arg-unset="-no-dns"/>
+  <boolean id="times" _label="Show Ping Times"    arg-unset="-no-times"/>
 
   <!-- #### -ping-timeout [3000] -->
   <!-- #### -ttl [90] -->
 
   <!-- #### -ping-timeout [3000] -->
   <!-- #### -ttl [90] -->
index af4caddf2de8bb8b9e3b90f5d4048f5678280b12..89879f88752849d1b570a43089ecbc029ea11aae 100644 (file)
@@ -43,8 +43,9 @@
     <boolean id="smooth" _label="Anti-aliased Lines" arg-unset="-no-smooth"/>
     <boolean id="fade"   _label="Thick Lines"        arg-unset="-no-thick"/>
   </hgroup>
     <boolean id="smooth" _label="Anti-aliased Lines" arg-unset="-no-smooth"/>
     <boolean id="fade"   _label="Thick Lines"        arg-unset="-no-thick"/>
   </hgroup>
-  <boolean id="fade"   _label="Fade Out"           arg-unset="-no-fade"/>
 
 
+  <boolean id="texture" _label="Texture-Mapped Font" arg-unset="-no-texture"/>
+  <boolean id="fade"   _label="Fade Out"           arg-unset="-no-fade"/>
   <boolean id="showfps" _label="Show Frames-per-Second" arg-set="-fps"/>
 
   <_description>
   <boolean id="showfps" _label="Show Frames-per-Second" arg-set="-fps"/>
 
   <_description>
index ebbebd2aece715cce7cd87c434941a913a41d604..34294f255cc7921e71976c0c8d09b2456b955872 100644 (file)
   <number id="sandg" type="slider" arg="-sand-grains %"
           _label="Sandgrains" _low-label="Few" _high-label="Lots"
           low="16" high="128" default="64" />
   <number id="sandg" type="slider" arg="-sand-grains %"
           _label="Sandgrains" _low-label="Few" _high-label="Lots"
           low="16" high="128" default="64" />
+
+  <number id="curve" type="slider" arg="-circle-percent %"
+          _label="Circle Percentage" _low-label="0%" _high-label="100%"
+          low="0" high="100" default="0" />
   
   <boolean id="wire" _label="Wireframe only" arg-set="-wireframe" />
 
   
   <boolean id="wire" _label="Wireframe only" arg-set="-wireframe" />
 
index 04bc23045e116ca73715d4ebfa4de4bb99667967..c305e2c8c2e3f2e67e33d12b0947774ac8403dfb 100644 (file)
@@ -5,29 +5,35 @@
   <command arg="-root"/>
 
   <number id="timeout" type="slider" arg="-timeout %"
   <command arg="-root"/>
 
   <number id="timeout" type="slider" arg="-timeout %"
-          _label="URL Timeout" _low-label="2 seconds" _high-label="2 minutes"
+          _low-label="URL Timeout:     2 secs" _high-label="2 min"
           low="2" high="120" default="30"/>
 
   <number id="delay" type="slider" arg="-delay %"
           low="2" high="120" default="30"/>
 
   <number id="delay" type="slider" arg="-delay %"
-          _label="Speed" _low-label="Slow" _high-label="Fast"
-          low="0" high="30" default="1"
-          convert="invert"/>
+          _low-label="Delay:                    None" _high-label="30 secs"
+          low="0" high="30" default="2"/>
+
+  <number id="opacity" type="slider" arg="-opacity %"
+          _low-label="Opacity:      Transparent" _high-label="Solid"
+          low="0.1" high="1.0" default="0.85"/>
 
   <string id="filter"  _label="Per-Image Filter Program" arg="-filter %"/>
 
   <string id="filter2" _label="Overall Filter Program" arg="-filter2 %"/>
 
 
   <string id="filter"  _label="Per-Image Filter Program" arg="-filter %"/>
 
   <string id="filter2" _label="Overall Filter Program" arg="-filter2 %"/>
 
-  <file id="dictionary" _label="Dictionary File" arg="-dictionary %"/>
+<!-- <file id="dictionary" _label="Dictionary File" arg="-dictionary %"/> -->
 
   <_description>
 This program makes collages out of random images pulled off of the
 World Wide Web.  It finds these images by doing random web searches,
 
   <_description>
 This program makes collages out of random images pulled off of the
 World Wide Web.  It finds these images by doing random web searches,
-and then extracting images from the returned pages.  It can also be set
-up to filter the images through the `VidWhacker' program, above, which
-looks really great.
+and then extracting images from the returned pages.  It can also be
+set up to filter the images through the `VidWhacker' program.
+
+WARNING: THE INTERNET SOMETIMES CONTAINS PORNOGRAPHY.
+
+The Internet being what it is, absolutely anything might show up in the
+collage including -- quite possibly -- pornography, or even nudity.
+Please act accordingly.
 
 
-(Note that most of the images it finds are text, and not pictures.
-This is because most of the web is pictures of text.  Which is pretty
-sad.)  Written by Jamie Zawinski.
+Written by Jamie Zawinski.
   </_description>
 </screensaver>
   </_description>
 </screensaver>
index fa6561c1dae1a2e160ab87edc466193a9b972e27..d4b95f1c1b1d300625bcf9fb1a1d99f9a2f73ca2 100644 (file)
@@ -1,4 +1,4 @@
-/* xscreensaver, Copyright (c) 1992, 1993, 1994, 1996, 1997 
+/* xscreensaver, Copyright (c) 1992, 1993, 1994, 1996, 1997, 2005 
  * Jamie Zawinski <jwz@jwz.org>
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
  * Jamie Zawinski <jwz@jwz.org>
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
@@ -110,7 +110,7 @@ init_decay (Display *dpy, Window window)
   sizex = xgwa.width;
   sizey = xgwa.height;
 
   sizex = xgwa.width;
   sizey = xgwa.height;
 
-  load_random_image (xgwa.screen, window, window, NULL);
+  load_random_image (xgwa.screen, window, window, NULL, NULL);
   
   if (mode == MELT || mode == STRETCH) {
     /* make sure screen eventually turns background color */
   
   if (mode == MELT || mode == STRETCH) {
     /* make sure screen eventually turns background color */
index 54a12fa9d3e6623a10ff7bf91f914f31b47c4605..919aa4bd83219f88daab240017cfc0ea85c3f207 100644 (file)
@@ -1,6 +1,5 @@
 /* -*- mode: C; tab-width: 4 -*-
 /* -*- mode: C; tab-width: 4 -*-
- * xscreensaver, Copyright (c) 1992, 1993, 1994, 1996, 1997, 1998, 2002, 2003
- * Jamie Zawinski <jwz@jwz.org>
+ * xscreensaver, Copyright (c) 1992-2005 Jamie Zawinski <jwz@jwz.org>
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
  * documentation for any purpose is hereby granted without fee, provided that
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
  * documentation for any purpose is hereby granted without fee, provided that
@@ -248,7 +247,7 @@ static void init_distort(Display *dpy, Window window)
                gcflags |= GCSubwindowMode;
        gc = XCreateGC (dpy, window, gcflags, &gcv);
 
                gcflags |= GCSubwindowMode;
        gc = XCreateGC (dpy, window, gcflags, &gcv);
 
-    load_random_image (xgwa.screen, window, window, NULL);
+    load_random_image (xgwa.screen, window, window, NULL, NULL);
 
        buffer_map = 0;
        orig_map = XGetImage(dpy, window, 0, 0, xgwa.width, xgwa.height,
 
        buffer_map = 0;
        orig_map = XGetImage(dpy, window, 0, 0, xgwa.width, xgwa.height,
@@ -709,7 +708,7 @@ char *defaults [] = {
        "*visualID:                     Best",
 #endif
 
        "*visualID:                     Best",
 #endif
 
-       "*delay:                        1000",
+       "*delay:                        20000",
        "*radius:                       0",
        "*speed:                        0",
        "*number:                       0",
        "*radius:                       0",
        "*speed:                        0",
        "*number:                       0",
diff --git a/hacks/fiberlamp.c b/hacks/fiberlamp.c
new file mode 100644 (file)
index 0000000..9e27e7e
--- /dev/null
@@ -0,0 +1,449 @@
+/* -*- Mode: C; tab-width: 4 -*- */
+/* fiberlamp --- A Fiber Optic Lamp */
+
+#if !defined( lint ) && !defined( SABER )
+static const char sccsid[] = "@(#)fiberlamp.c  5.00 2000/11/01 xlockmore";
+
+#endif
+
+/*-
+ * Copyright (c) 2005 by Tim Auckland <Tim.Auckland@Procket.com>
+ *
+ * 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.
+ *
+ * "fiberlamp" shows Fiber Optic Lamp.  Since there is no closed-form
+ * solution to the large-amplitude cantilever equation, the flexible
+ * fiber is modeled as a set of descrete nodes.
+ *
+ * Revision History:
+ * 13-Jan-2005: Initial development.
+ */
+
+#ifdef STANDALONE
+#define MODE_fiberlamp
+#define PROGCLASS "Fiberlamp"
+#define HACK_INIT init_fiberlamp
+#define HACK_DRAW draw_fiberlamp
+#define HACK_RESHAPE reshape_fiberlamp
+#define _no_HACK_FREE release_fiberlamp
+#define fiberlamp_opts xlockmore_opts
+#define DEFAULTS "*delay: 10000 \n" \
+ "*count: 500 \n" \
+ "*cycles: 10000 \n" \
+ "*ncolors: 64 \n"
+#define UNIFORM_COLORS
+#include "xlockmore.h"         /* in xscreensaver distribution */
+# ifndef MI_DEPTH
+#  define MI_DEPTH MI_WIN_DEPTH
+# endif
+#else /* STANDALONE */
+#include "xlock.h"             /* in xlockmore distribution */
+#endif /* STANDALONE */
+
+#ifdef MODE_fiberlamp
+
+ModeSpecOpt fiberlamp_opts =
+{0, (XrmOptionDescRec *) NULL, 0, (argtype *) NULL, (OptionStruct *) NULL};
+
+#ifdef USE_MODULES
+ModStruct   fiberlamp_description =
+{"fiberlamp", "init_fiberlamp", "draw_fiberlamp", "release_fiberlamp",
+ "draw_fiberlamp", "change_fiberlamp", (char *) NULL, &fiberlamp_opts,
+ 1000, 500, 10000, 0, 64, 1.0, "", "Shows a Fiber Optic Lamp", 0, NULL};
+
+#endif
+
+#define SPREAD (30.0) /* Angular spread at the base */
+#define SCALE (MI_WIDTH(mi)/2) /* Screen size */
+#define NODES (20) /* Number of nodes in a fiber.  Variable with range
+                                         10 .. 30, if desired.  High values have
+                                         stability problems unless you use small DT */
+
+/* Physics parameters.  Tune carefully to keep realism and avoid instability*/
+#define DT (0.5) /* Time increment: Low is slow, High is less stable. */
+#define PY (0.12) /* Rigidity: Low droops, High is stiff. */
+#define DAMPING (0.055) /* Damping: Low allows oscillations, High is boring. */
+
+#undef PLAN /* Plan view (for debugging) */
+#undef CHECKCOLORWHEEL /* Plan view with no spread */
+
+#define DRAND(v)       (LRAND()/MAXRAND*(v))   /* double random 0 - v */
+
+/* Length of nodes.  Uniform except for shorter notes at the tips for
+   colour highlights.  Sum from 0..NODES-1 should exactly 1.0 */
+#define LEN(A) ((A<NODES-3) ? 1.0/(NODES-2.5) : 0.25/(NODES-2.5))
+
+typedef struct {
+  double phi, phidash;
+  double eta, etadash;
+  double x;
+  double y;
+  double z;
+} nodestruct;
+
+typedef struct {
+  nodestruct *node;
+  XPoint *draw;
+  XPoint *erase;
+} fiberstruct;
+
+typedef struct {
+  double  psi;
+  double  dpsi;
+  int     count, nfibers;
+  double  cx;
+  double  rx, ry; /* Coordinates relative to root */
+  fiberstruct *fiber;
+  Pixmap      buffer; /* Double Buffer */
+  long    bright, medium, dim; /* "White" colors */
+} fiberlampstruct;
+
+static fiberlampstruct *fiberlamps = (fiberlampstruct *) NULL;
+
+void
+change_fiberlamp(ModeInfo * mi)
+{
+  fiberlampstruct *fl;
+  if (fiberlamps == NULL)
+       return;
+  fl = &fiberlamps[MI_SCREEN(mi)];
+  fl->cx = (DRAND(SCALE/4)-SCALE/8)/SCALE; /* Knock the lamp */
+  fl->count = 0; /* Reset counter */
+  XSetForeground(MI_DISPLAY(mi), MI_GC(mi), MI_BLACK_PIXEL(mi));
+  XFillRectangle(MI_DISPLAY(mi), fl->buffer, MI_GC(mi), 0, 0,
+                                MI_WIDTH(mi), MI_HEIGHT(mi));
+}
+
+static void
+free_fiber(fiberlampstruct *fl)
+{
+       if (fl->fiber) {
+               int f;
+
+               for (f = 0; f < fl->nfibers; f++) {
+                       fiberstruct *fs = fl->fiber + f;
+
+                       if (fs->node)
+                               free(fs->node);
+                       if (fs->draw)
+                               free(fs->draw);
+                       if (fs->erase)
+                               free(fs->erase);
+               }
+               free(fl->fiber);
+               fl->fiber = NULL;
+       }
+}
+
+static void
+free_fiberlamp(Display *display, fiberlampstruct *fl)
+{
+       if (fl->buffer != None) {
+                XFreePixmap(display, fl->buffer);
+                fl->buffer = None;
+        }
+       free_fiber(fl);
+}
+
+void
+init_fiberlamp(ModeInfo * mi)
+{
+  fiberlampstruct *fl;
+  Bool init = False;
+
+  if (fiberlamps == NULL) {
+       init = True;
+       if ((fiberlamps =
+                (fiberlampstruct *) calloc(MI_NUM_SCREENS(mi),
+                       sizeof (fiberlampstruct))) == NULL)
+         return;
+  }
+  fl = &fiberlamps[MI_SCREEN(mi)];
+
+  /* Create or Resize double buffer */
+  if(fl->buffer != None)
+       XFreePixmap(MI_DISPLAY(mi), fl->buffer);
+  fl->buffer = XCreatePixmap(MI_DISPLAY(mi), MI_WINDOW(mi),
+               MI_WIDTH(mi), MI_HEIGHT(mi), MI_DEPTH(mi));
+  if (fl->buffer == None) {
+       free_fiberlamp(MI_DISPLAY(mi), fl);
+       return;
+  }
+  XSetForeground(MI_DISPLAY(mi), MI_GC(mi), MI_BLACK_PIXEL(mi));
+  XFillRectangle(MI_DISPLAY(mi), fl->buffer, MI_GC(mi), 0, 0,
+                                MI_WIDTH(mi), MI_HEIGHT(mi));
+
+  if(!init) /* Nothing else to do (probably a resize) */
+       return;
+
+  fl->nfibers = MI_COUNT(mi);
+  /* Allocate fibers */
+  if((fl->fiber =
+         (fiberstruct*) calloc(fl->nfibers, sizeof (fiberstruct))) == NULL) {
+       free_fiberlamp(MI_DISPLAY(mi), fl);
+       return;
+  } else {
+       int f;
+       for(f = 0; f < fl->nfibers; f++) {
+         fiberstruct *fs = fl->fiber + f;
+         if((fs->node =
+                 (nodestruct*) calloc(NODES, sizeof (nodestruct))) == NULL
+                ||(fs->draw =
+                       (XPoint*) calloc(NODES, sizeof (XPoint))) == NULL
+                ||(fs->erase =
+                       (XPoint*) calloc(NODES, sizeof (XPoint))) == NULL) {
+               free_fiberlamp(MI_DISPLAY(mi), fl);
+               return;
+         }
+       }
+  }
+
+  {
+       int f, i;
+       for(f = 0; f < fl->nfibers; f++) {
+         double phi = M_PI/180 * DRAND(SPREAD);
+         double eta = DRAND(2*M_PI) - M_PI;
+         for(i = 0; i < NODES; i++) {
+               nodestruct *n = &fl->fiber[f].node[i];
+               n->phi = phi;
+               n->phidash = 0;
+               n->eta = eta;
+               n->etadash = 0;
+         }
+         fl->fiber[f].node[0].etadash = 0.002/DT;
+         fl->fiber[f].node[0].y = 0;
+         fl->fiber[f].node[0].z = 0;
+       }
+
+  }
+
+  /* Set up rotation */
+  fl->psi = DRAND(2*M_PI);
+  fl->dpsi = 0.01;
+
+  /* no "NoExpose" events from XCopyArea wanted */
+  XSetGraphicsExposures(MI_DISPLAY(mi), MI_GC(mi), False);
+
+  /* Make sure we're using 'thin' lines */
+  XSetLineAttributes(MI_DISPLAY(mi), MI_GC(mi), 0, LineSolid, CapNotLast,
+                                        JoinMiter);
+#ifdef CHECKCOLORWHEEL
+  /* Only interested in tips, leave the rest black */
+  fl->bright = fl->medium = fl->dim = MI_BLACK_PIXEL(mi);
+#else
+  if(MI_NPIXELS(mi) > 2) {
+       /* Set up colours for the fiber bodies.  Tips handled seperately */
+       XColor c, t;
+       if(XAllocNamedColor(MI_DISPLAY(mi), MI_COLORMAP(mi), "#E0E0C0", &c, &t)){
+         fl->bright = c.pixel;
+       } else {
+         fl->bright = MI_WHITE_PIXEL(mi);
+       }
+       if(XAllocNamedColor(MI_DISPLAY(mi), MI_COLORMAP(mi), "#808070", &c, &t)){
+         fl->medium = c.pixel;
+       } else {
+         fl->medium = MI_WHITE_PIXEL(mi);
+       }
+       if(XAllocNamedColor(MI_DISPLAY(mi), MI_COLORMAP(mi), "#404020", &c, &t)){
+         fl->dim = c.pixel;
+       } else {
+         fl->dim = MI_BLACK_PIXEL(mi);
+       }
+  } else {
+       fl->bright = MI_WHITE_PIXEL(mi);
+       fl->medium = MI_WHITE_PIXEL(mi);
+       fl->dim = MI_BLACK_PIXEL(mi);
+  }
+#endif
+
+  /* Clear the background. */
+  MI_CLEARWINDOW(mi);
+  change_fiberlamp(mi);
+}
+
+#ifdef STANDALONE
+/* Used by xscreensaver.  xlock just uses init_fiberlamp */
+void
+reshape_fiberlamp(ModeInfo * mi, int width, int height)
+{
+  init_fiberlamp(mi);
+}
+#endif
+
+void
+draw_fiberlamp(ModeInfo * mi)
+{
+  fiberlampstruct *fl;
+  int f, i;
+  int x, y;
+  Window unused;
+
+  short cx = MI_WIDTH(mi)/2;
+#if defined PLAN || defined CHECKCOLORWHEEL
+  short cy = MI_HEIGHT(mi)/2;
+#else
+  short cy = MI_HEIGHT(mi);
+#endif
+
+  if (fiberlamps == NULL)
+       return;
+  fl = &fiberlamps[MI_SCREEN(mi)];
+
+  fl->psi += fl->dpsi;     /* turn colorwheel */
+
+  XTranslateCoordinates(MI_DISPLAY(mi), MI_WINDOW(mi),
+                                               RootWindow(MI_DISPLAY(mi),MI_SCREEN(mi)),
+                                               cx, cy, &x, &y, &unused);
+
+  for(f = 0; f < fl->nfibers; f++) {
+       fiberstruct *fs = fl->fiber + f;
+
+       fs->node[0].eta += DT*fs->node[0].etadash;
+       fs->node[0].x = fl->cx; /* Handle center movement */
+       /* Handle window move.  NOTE, only x is deflected, since y doesn't
+        directly affect the physics */
+       fs->node[NODES-2].x *= 0.1*(fl->ry - y);
+       fs->node[NODES-2].x += 0.05*(fl->rx - x);
+
+       /* 2nd order diff equation */
+       for(i = 1; i < NODES; i++) {
+         nodestruct *n = fs->node+i;
+         nodestruct *p = fs->node+i-1;
+         double pload = 0;
+         double eload = 0;
+         double pstress = (n->phi - p->phi)*PY;
+         double estress = (n->eta - p->eta)*PY;
+         double dxi = n->x - p->x;
+         double dzi = n->z - p->z;
+         double li = sqrt(dxi*dxi + dzi*dzi)/LEN(i);
+         double drag = DAMPING*LEN(i)*LEN(i)*NODES*NODES;
+
+         if(li > 0) {
+               int j;
+               for(j = i+1; j < NODES; j++) {
+                 nodestruct *nn = fs->node+j;
+                 double dxj = nn->x - n->x;
+                 double dzj = nn->z - n->z;
+
+                 pload += LEN(j)*(dxi*dxj + dzi*dzj)/li; /* Radial load */
+                 eload += LEN(j)*(dxi*dzj - dzi*dxj)/li; /* Transverse load */
+                 /* Not a perfect simulation: in reality the transverse load
+                        is only indirectly coupled to the eta deflection, but of
+                        all the approaches I've tried this produces the most
+                        stable model and looks the most realistic. */
+               }
+         }
+
+#ifndef CHECKCOLORWHEEL
+         n->phidash += DT*(pload - pstress - drag*n->phidash)/LEN(i);
+         n->phi += DT*n->phidash;
+#endif
+
+         n->etadash += DT*(eload - estress - drag*n->etadash)/LEN(i);
+         n->eta += DT*n->etadash;
+
+         {
+               double sp = sin(p->phi);
+               double cp = cos(p->phi);
+               double se = sin(p->eta);
+               double ce = cos(p->eta);
+
+               n->x = p->x + LEN(i-1) * ce * sp;
+               n->y = p->y - LEN(i-1) * cp;
+               n->z = p->z + LEN(i-1) * se * sp;
+         }
+
+         fs->draw[i-1].x = cx + MI_WIDTH(mi)/2*n->x;
+#if defined PLAN || defined CHECKCOLORWHEEL /* Plan */
+         fs->draw[i-1].y = cy + MI_WIDTH(mi)/2*n->z;
+#else /* Elevation */
+         fs->draw[i-1].y = cy + MI_WIDTH(mi)/2*n->y;
+#endif
+       }
+       MI_IS_DRAWN(mi) = True;
+
+       /* Erase: this may only be erasing an off-screen buffer, but on a
+          slow system it may still be faster than XFillRectangle() */
+       XSetForeground(MI_DISPLAY(mi), MI_GC(mi), MI_BLACK_PIXEL(mi));
+       XDrawLines(MI_DISPLAY(mi), fl->buffer, MI_GC(mi),
+                          fs->erase, NODES-1, CoordModeOrigin);
+
+       {
+         double x = fs->node[1].x - fl->cx + 0.025;
+         double y = fs->node[1].z + 0.02;
+         double angle = atan2(y, x) + fl->psi;
+         int tipcolor = MI_PIXEL(mi,
+               (int)(MI_NPIXELS(mi)*angle/(2*M_PI)) % MI_NPIXELS(mi));
+         int fibercolor;
+         int tiplen;
+
+         if(fs->node[1].z < 0.0) { /* Back */
+               tiplen = 2;
+               fibercolor = fl->dim;
+         }else if(fs->node[NODES-1].z < 0.7) { /* Middle */
+               tiplen = 3;
+               fibercolor = fl->medium;
+         } else {                 /* Front */
+               tiplen = 3;
+               fibercolor = fl->bright;
+         }
+
+         XSetForeground(MI_DISPLAY(mi), MI_GC(mi), fibercolor);
+         XDrawLines(MI_DISPLAY(mi), fl->buffer, MI_GC(mi),
+                                fs->draw, NODES-tiplen, CoordModeOrigin);
+
+         XSetForeground(MI_DISPLAY(mi), MI_GC(mi), tipcolor);
+         XDrawLines(MI_DISPLAY(mi), fl->buffer, MI_GC(mi),
+                                fs->draw+NODES-1-tiplen, tiplen, CoordModeOrigin);
+       }
+
+       { /* Switch buffers */
+         XPoint *buffer = fs->draw;
+         fs->draw = fs->erase;
+         fs->erase = buffer;
+       }
+  }
+
+  /* Update the screen from the double-buffer */
+  XCopyArea(MI_DISPLAY(mi), fl->buffer, MI_WINDOW(mi), MI_GC(mi), 0, 0,
+                       MI_WIDTH(mi), MI_HEIGHT(mi), 0, 0);
+
+  fl->rx = x;
+  fl->ry = y;
+
+  if(fl->count++ > MI_CYCLES(mi)) {
+       change_fiberlamp(mi);
+  }
+}
+
+void
+release_fiberlamp(ModeInfo * mi)
+{
+       if (fiberlamps != NULL) {
+               int         screen;
+
+               for (screen = 0; screen < MI_NUM_SCREENS(mi); screen++)
+                       free_fiberlamp(MI_DISPLAY(mi), &fiberlamps[screen]);
+               free(fiberlamps);
+               fiberlamps = (fiberlampstruct *) NULL;
+       }
+}
+
+#if 0
+void
+refresh_fiberlamp(ModeInfo * mi)
+{
+       MI_CLEARWINDOW(mi);
+}
+#endif
+#endif /* MODE_fiberlamp */
diff --git a/hacks/fiberlamp.man b/hacks/fiberlamp.man
new file mode 100644 (file)
index 0000000..a270a47
--- /dev/null
@@ -0,0 +1,61 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+fiberlamp - Fiber Optic Lamp
+.SH SYNOPSIS
+.B fiberlamp
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-count \fInumber\fP]
+[\-cycles \fInumber\fP]
+[\-delay \fInumber\fP]
+[\-ncolors \fInumber\fP]
+.SH DESCRIPTION
+Displays a Fiber Optic Lamp.
+.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 \-count \fInumber\fP
+Number of Fibers.  10 - 500.  Default: 500.
+.TP 8
+.B \-cycles \fInumber\fP
+Number of cycles before the lamp is knowcked sideways.  100 - 10000.
+Default: 10000.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds.  Default: 10000 (0.01 seconds.).
+.TP 8
+.B \-ncolors \fInumber\fP
+Number of Colors.  Default: 64.
+.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 2005 by Tim Auckland.  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
+Tim Auckland.
index 7f1002e60812a07a8a154d976256875f1518f52a..78a4e9017c7bf08674cafe5a0d930eb4a3cabb83 100644 (file)
@@ -17,6 +17,9 @@
  * Support for different display color modes: 
  * Jean-Pierre Demailly <Jean-Pierre.Demailly@ujf-grenoble.fr>
  *
  * Support for different display color modes: 
  * Jean-Pierre Demailly <Jean-Pierre.Demailly@ujf-grenoble.fr>
  *
+ * Fixed array access problems by beating on it with a large hammer.
+ * Nicholas Miell <nmiell@gmail.com>
+ *
  */
 
 #include <math.h>
  */
 
 #include <math.h>
@@ -48,6 +51,8 @@ static int fsc_height= 0;
 static int rndlife = RNDLIFE1;
 static int minlife = MINLIFE1;
 static float light_fade = 0.99;
 static int rndlife = RNDLIFE1;
 static int minlife = MINLIFE1;
 static float light_fade = 0.99;
+static unsigned char *real_palaka1 = NULL;
+static unsigned char *real_palaka2 = NULL;
 static unsigned char *palaka1=NULL;
 static unsigned char *palaka2=NULL;
 static XImage *xim=NULL;
 static unsigned char *palaka1=NULL;
 static unsigned char *palaka2=NULL;
 static XImage *xim=NULL;
@@ -147,7 +152,7 @@ void recycle(fireshell *fs,int x,int y)
 
 void blur_best(void)
 {
 
 void blur_best(void)
 {
-  unsigned int n;
+  int n;
   unsigned int w = fsc_width;
   unsigned int h = fsc_height;
   unsigned char *pa, *pb, *pm;
   unsigned int w = fsc_width;
   unsigned int h = fsc_height;
   unsigned char *pa, *pb, *pm;
@@ -232,18 +237,21 @@ void resize(Display *display, Window win)
   if (xim) {
   if (xim->data==(char *)palaka2) xim->data=NULL;  
   XDestroyImage(xim);
   if (xim) {
   if (xim->data==(char *)palaka2) xim->data=NULL;  
   XDestroyImage(xim);
-  if (palaka2!=palaka1) free(palaka2);
-  free(palaka1); 
+  if (palaka2!=palaka1) free(real_palaka2);
+  free(real_palaka1); 
   }
   palaka1 = NULL;     
   palaka2 = NULL; 
   xim = XCreateImage(display, xwa.visual, xwa.depth, ZPixmap, 0, 0,
                     fsc_width, fsc_height, 32, 0);
   }
   palaka1 = NULL;     
   palaka2 = NULL; 
   xim = XCreateImage(display, xwa.visual, xwa.depth, ZPixmap, 0, 0,
                     fsc_width, fsc_height, 32, 0);
-  palaka1 = calloc(xim->height,xim->width*4);
-  if(light_on)
-  palaka2 = calloc(xim->height,xim->width*4);
-  else
-  palaka2 = palaka1;
+  real_palaka1 = calloc(xim->height + 4,xim->width*4);
+  palaka1 = real_palaka1 + xim->width * 4 * 2;
+  if(light_on) {
+       real_palaka2 = calloc(xim->height + 4,xim->width*4);
+       palaka2 = real_palaka2 + xim->width * 4 * 2;
+  } else {
+       palaka2 = palaka1;
+  }
   if (depth>=24)
   xim->data = (char *)palaka2;
   else
   if (depth>=24)
   xim->data = (char *)palaka2;
   else
index 3f0dc40ba5791e2a48284c421e12bf1d72a8d4a2..5f34fb64b84988a2f170fcb047d1145680a2daae 100644 (file)
@@ -1,4 +1,4 @@
-# hacks/glx/Makefile.in --- xscreensaver, Copyright (c) 1999-2004
+# hacks/glx/Makefile.in --- xscreensaver, Copyright (c) 1999-2005
 #  by Jamie Zawinski.
 # the `../../configure' script generates `hacks/glx/Makefile' from this file.
 
 #  by Jamie Zawinski.
 # the `../../configure' script generates `hacks/glx/Makefile' from this file.
 
@@ -63,13 +63,13 @@ INCLUDES    = -I. -I$(srcdir) -I$(UTILS_SRC) -I$(HACK_SRC) -I../.. @INCLUDES@
 UTIL_SRCS      = $(UTILS_SRC)/colors.c $(UTILS_SRC)/hsv.c \
                  $(UTILS_SRC)/resources.c $(UTILS_SRC)/usleep.c \
                  $(UTILS_SRC)/visual.c $(UTILS_SRC)/visual-gl.c \
 UTIL_SRCS      = $(UTILS_SRC)/colors.c $(UTILS_SRC)/hsv.c \
                  $(UTILS_SRC)/resources.c $(UTILS_SRC)/usleep.c \
                  $(UTILS_SRC)/visual.c $(UTILS_SRC)/visual-gl.c \
-                 $(UTILS_SRC)/yarandom.c
+                 $(UTILS_SRC)/yarandom.c $(UTILS_SRC)/xshm.c
 UTIL_OBJS      = $(UTILS_SRC)/colors.o $(UTILS_SRC)/hsv.o \
                  $(UTILS_SRC)/resources.o $(UTILS_SRC)/usleep.o \
                  $(UTILS_SRC)/visual.o $(UTILS_SRC)/visual-gl.o \
 UTIL_OBJS      = $(UTILS_SRC)/colors.o $(UTILS_SRC)/hsv.o \
                  $(UTILS_SRC)/resources.o $(UTILS_SRC)/usleep.o \
                  $(UTILS_SRC)/visual.o $(UTILS_SRC)/visual-gl.o \
-                  $(UTILS_SRC)/yarandom.o
+                  $(UTILS_SRC)/yarandom.o $(UTILS_SRC)/xshm.o
 
 
-SRCS           = xscreensaver-gl-helper.c \
+SRCS           = xscreensaver-gl-helper.c normals.c glxfonts.c \
                  atlantis.c b_draw.c b_lockglue.c b_sphere.c bubble3d.c \
                  buildlwo.c cage.c dolphin.c gears.c lament.c moebius.c \
                  morph3d.c pipeobjs.c pipes.c rubik.c s1_1.c s1_2.c s1_3.c \
                  atlantis.c b_draw.c b_lockglue.c b_sphere.c bubble3d.c \
                  buildlwo.c cage.c dolphin.c gears.c lament.c moebius.c \
                  morph3d.c pipeobjs.c pipes.c rubik.c s1_1.c s1_2.c s1_3.c \
@@ -96,9 +96,11 @@ SRCS         = xscreensaver-gl-helper.c \
                  hypertorus.c glmatrix.c cubestorm.c glknots.c blocktube.c \
                  flipflop.c antspotlight.c polytopes.c gleidescope.c \
                  mirrorblob.c blinkbox.c noof.c polyhedra.c polyhedra-gl.c \
                  hypertorus.c glmatrix.c cubestorm.c glknots.c blocktube.c \
                  flipflop.c antspotlight.c polytopes.c gleidescope.c \
                  mirrorblob.c blinkbox.c noof.c polyhedra.c polyhedra-gl.c \
-                 antinspect.c providence.c pinion.c
+                 antinspect.c providence.c pinion.c boing.c texfont.c \
+                 carousel.c
 
 
-OBJS           = xscreensaver-gl-helper.o \
+
+OBJS           = xscreensaver-gl-helper.o normals.o glxfonts.o \
                  atlantis.o b_draw.o b_lockglue.o b_sphere.o bubble3d.o \
                  buildlwo.o cage.o dolphin.o gears.o lament.o moebius.o \
                  morph3d.o pipeobjs.o pipes.o rubik.o s1_1.o s1_2.o s1_3.o \
                  atlantis.o b_draw.o b_lockglue.o b_sphere.o bubble3d.o \
                  buildlwo.o cage.o dolphin.o gears.o lament.o moebius.o \
                  morph3d.o pipeobjs.o pipes.o rubik.o s1_1.o s1_2.o s1_3.o \
@@ -125,7 +127,8 @@ OBJS                = xscreensaver-gl-helper.o \
                  hypertorus.o glmatrix.o cubestorm.o glknots.o blocktube.o \
                  flipflop.o antspotlight.o polytopes.o gleidescope.o \
                  mirrorblob.o blinkbox.o noof.o polyhedra.o polyhedra-gl.o \
                  hypertorus.o glmatrix.o cubestorm.o glknots.o blocktube.o \
                  flipflop.o antspotlight.o polytopes.o gleidescope.o \
                  mirrorblob.o blinkbox.o noof.o polyhedra.o polyhedra-gl.o \
-                 antinspect.o providence.o pinion.o
+                 antinspect.o providence.o pinion.o boing.o texfont.o \
+                 carousel.o
 
 GL_EXES                = cage gears moebius pipes sproingies stairs superquadrics \
                  morph3d rubik atlantis lament bubble3d glplanet pulsar \
 
 GL_EXES                = cage gears moebius pipes sproingies stairs superquadrics \
                  morph3d rubik atlantis lament bubble3d glplanet pulsar \
@@ -136,11 +139,12 @@ GL_EXES           = cage gears moebius pipes sproingies stairs superquadrics \
                  glslideshow jigglypuff klein hypertorus glmatrix cubestorm \
                  glknots blocktube flipflop antspotlight polytopes \
                  gleidescope mirrorblob blinkbox noof polyhedra \
                  glslideshow jigglypuff klein hypertorus glmatrix cubestorm \
                  glknots blocktube flipflop antspotlight polytopes \
                  gleidescope mirrorblob blinkbox noof polyhedra \
-                 antinspect providence pinion
+                 antinspect providence pinion boing carousel
 GLE_EXES       = extrusion
 GL_UTIL_EXES   = xscreensaver-gl-helper
 HACK_EXES      = @GL_EXES@ @GLE_EXES@
 GLE_EXES       = extrusion
 GL_UTIL_EXES   = xscreensaver-gl-helper
 HACK_EXES      = @GL_EXES@ @GLE_EXES@
-GRAB_OBJS      = $(UTILS_BIN)/grabclient.o grab-ximage.o
+XSHM_OBJS      = $(UTILS_BIN)/xshm.o
+GRAB_OBJS      = $(UTILS_BIN)/grabclient.o grab-ximage.o $(XSHM_OBJS)
 EXES           = @GL_UTIL_EXES@ $(HACK_EXES)
 
 HACK_OBJS      = screenhack-gl.o xlock-gl.o fps.o $(HACK_BIN)/xlockmore.o \
 EXES           = @GL_UTIL_EXES@ $(HACK_EXES)
 
 HACK_OBJS      = screenhack-gl.o xlock-gl.o fps.o $(HACK_BIN)/xlockmore.o \
@@ -154,7 +158,7 @@ HDRS                = atlantis.h bubble3d.h buildlwo.h e_textures.h xpm-ximage.h \
                  stonerview-move.h stonerview-osc.h glutstroke.h \
                  glut_roman.h marching.h rotator.h trackball.h gltrackball.h \
                  chessmodels.h chessgames.h gllist.h flurry.h tunnel_draw.h \
                  stonerview-move.h stonerview-osc.h glutstroke.h \
                  glut_roman.h marching.h rotator.h trackball.h gltrackball.h \
                  chessmodels.h chessgames.h gllist.h flurry.h tunnel_draw.h \
-                 ants.h polyhedra.h
+                 ants.h polyhedra.h normals.h glxfonts.h texfont.h
 GL_MEN         = atlantis.man boxed.man bubble3d.man cage.man circuit.man \
                  cubenetic.man dangerball.man engine.man extrusion.man \
                  flipscreen3d.man gears.man gflux.man glforestfire.man \
 GL_MEN         = atlantis.man boxed.man bubble3d.man cage.man circuit.man \
                  cubenetic.man dangerball.man engine.man extrusion.man \
                  flipscreen3d.man gears.man gflux.man glforestfire.man \
@@ -169,9 +173,10 @@ GL_MEN             = atlantis.man boxed.man bubble3d.man cage.man circuit.man \
                  cubestorm.man glknots.man blocktube.man flipflop.man \
                  antspotlight.man polytopes.man gleidescope.man \
                  mirrorblob.man blinkbox.man noof.man polyhedra.man \
                  cubestorm.man glknots.man blocktube.man flipflop.man \
                  antspotlight.man polytopes.man gleidescope.man \
                  mirrorblob.man blinkbox.man noof.man polyhedra.man \
-                 antinspect.man providence.man pinion.man
+                 antinspect.man providence.man pinion.man boing.man \
+                 carousel.man
 MEN            = @GL_MEN@
 MEN            = @GL_MEN@
-EXTRAS         = README Makefile.in dxf2gl.pl
+EXTRAS         = README Makefile.in dxf2gl.pl starwars.txt
 
 TARFILES       = $(SRCS) $(HDRS) $(MEN) $(EXTRAS)
 
 
 TARFILES       = $(SRCS) $(HDRS) $(MEN) $(EXTRAS)
 
@@ -344,12 +349,14 @@ distdepend:: check_men check_xml
 # to the rules in their own Makefile...
 #
 $(UTILS_BIN)/colors.o:         $(UTILS_SRC)/colors.c
 # to the rules in their own Makefile...
 #
 $(UTILS_BIN)/colors.o:         $(UTILS_SRC)/colors.c
+$(UTILS_BIN)/grabclient.o:     $(UTILS_SRC)/grabclient.c
 $(UTILS_BIN)/hsv.o:            $(UTILS_SRC)/hsv.c
 $(UTILS_BIN)/resources.o:      $(UTILS_SRC)/resources.c
 $(UTILS_BIN)/usleep.o:         $(UTILS_SRC)/usleep.c
 $(UTILS_BIN)/visual.o:         $(UTILS_SRC)/visual.c
 $(UTILS_BIN)/visual-gl.o:      $(UTILS_SRC)/visual-gl.c
 $(UTILS_BIN)/yarandom.o:       $(UTILS_SRC)/yarandom.c
 $(UTILS_BIN)/hsv.o:            $(UTILS_SRC)/hsv.c
 $(UTILS_BIN)/resources.o:      $(UTILS_SRC)/resources.c
 $(UTILS_BIN)/usleep.o:         $(UTILS_SRC)/usleep.c
 $(UTILS_BIN)/visual.o:         $(UTILS_SRC)/visual.c
 $(UTILS_BIN)/visual-gl.o:      $(UTILS_SRC)/visual-gl.c
 $(UTILS_BIN)/yarandom.o:       $(UTILS_SRC)/yarandom.c
+$(UTILS_BIN)/xshm.o:           $(UTILS_SRC)/xshm.c
 
 $(UTIL_OBJS):
        cd $(UTILS_BIN) ; \
 
 $(UTIL_OBJS):
        cd $(UTILS_BIN) ; \
@@ -383,13 +390,16 @@ screenhack-gl.o: $(HACK_SRC)/screenhack.c
 CC_HACK                = $(CC) $(LDFLAGS)
 
 TRACK_OBJS=rotator.o trackball.o gltrackball.o
 CC_HACK                = $(CC) $(LDFLAGS)
 
 TRACK_OBJS=rotator.o trackball.o gltrackball.o
+HACK_TRACK_OBJS=$(HACK_OBJS) $(TRACK_OBJS)
+HACK_GRAB_OBJS=$(HACK_OBJS) $(GRAB_OBJS)
+HACK_TRACK_GRAB_OBJS=$(HACK_TRACK_OBJS) $(GRAB_OBJS)
 
 ATLANTIS_OBJS = $(HACK_OBJS) dolphin.o shark.o swim.o whale.o xpm-ximage.o
 atlantis:      atlantis.o      $(ATLANTIS_OBJS)
        $(CC_HACK) -o $@ $@.o   $(ATLANTIS_OBJS) $(XPM_LIBS)
 
 ATUNNEL_OBJS = $(HACK_OBJS) tunnel_draw.o xpm-ximage.o
 
 ATLANTIS_OBJS = $(HACK_OBJS) dolphin.o shark.o swim.o whale.o xpm-ximage.o
 atlantis:      atlantis.o      $(ATLANTIS_OBJS)
        $(CC_HACK) -o $@ $@.o   $(ATLANTIS_OBJS) $(XPM_LIBS)
 
 ATUNNEL_OBJS = $(HACK_OBJS) tunnel_draw.o xpm-ximage.o
-atunnel:       atunnel.o $(ATUNNEL_OBJS)
+atunnel:       atunnel.o       $(ATUNNEL_OBJS)
        $(CC_HACK) -o $@ $@.o   $(ATUNNEL_OBJS) $(XPM_LIBS)
 
 cage:          cage.o          $(HACK_OBJS)
        $(CC_HACK) -o $@ $@.o   $(ATUNNEL_OBJS) $(XPM_LIBS)
 
 cage:          cage.o          $(HACK_OBJS)
@@ -398,18 +408,17 @@ cage:             cage.o          $(HACK_OBJS)
 FLURRY_OBJS_1 = flurry-smoke.o flurry-spark.o flurry-star.o flurry-texture.o
 FLURRY_OBJS = $(FLURRY_OBJS_1) $(HACK_OBJS)
 
 FLURRY_OBJS_1 = flurry-smoke.o flurry-spark.o flurry-star.o flurry-texture.o
 FLURRY_OBJS = $(FLURRY_OBJS_1) $(HACK_OBJS)
 
-flurry:                flurry.o $(FLURRY_OBJS)
+flurry:                flurry.o        $(FLURRY_OBJS)
        $(CC_HACK) -o $@ $@.o   $(FLURRY_OBJS) $(HACK_LIBS) -lm
 
        $(CC_HACK) -o $@ $@.o   $(FLURRY_OBJS) $(HACK_LIBS) -lm
 
-gears:         gears.o         $(HACK_OBJS) $(TRACK_OBJS)
-       $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(TRACK_OBJS) $(HACK_LIBS)
+gears:         gears.o         $(HACK_TRACK_OBJS)
+       $(CC_HACK) -o $@ $@.o   $(HACK_TRACK_OBJS) $(HACK_LIBS)
 
 
-moebius:       moebius.o       $(TRACK_OBJS) $(HACK_OBJS)
-       $(CC_HACK) -o $@ $@.o   $(TRACK_OBJS) $(HACK_OBJS) $(HACK_LIBS)
+moebius:       moebius.o       $(HACK_TRACK_OBJS)
+       $(CC_HACK) -o $@ $@.o   $(HACK_TRACK_OBJS) $(HACK_LIBS)
 
 
-pipes:         pipes.o         $(HACK_OBJS) pipeobjs.o buildlwo.o
-       $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) pipeobjs.o buildlwo.o \
-         $(HACK_LIBS)
+pipes:         pipes.o         pipeobjs.o buildlwo.o $(HACK_OBJS)
+       $(CC_HACK) -o $@ $@.o   pipeobjs.o buildlwo.o $(HACK_OBJS) $(HACK_LIBS)
 
 superquadrics: superquadrics.o $(HACK_OBJS)
        $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(HACK_LIBS)
 
 superquadrics: superquadrics.o $(HACK_OBJS)
        $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(HACK_LIBS)
@@ -417,7 +426,7 @@ superquadrics:      superquadrics.o $(HACK_OBJS)
 morph3d:       morph3d.o       $(HACK_OBJS)
        $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(HACK_LIBS)
 
 morph3d:       morph3d.o       $(HACK_OBJS)
        $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(HACK_LIBS)
 
-rubik:         rubik.o $(HACK_OBJS)
+rubik:         rubik.o         $(HACK_OBJS)
        $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(HACK_LIBS)
 
 stairs:                stairs.o        $(HACK_OBJS)
        $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(HACK_LIBS)
 
 stairs:                stairs.o        $(HACK_OBJS)
@@ -425,134 +434,135 @@ stairs:         stairs.o        $(HACK_OBJS)
 
 SPROINGIES = sproingiewrap.o gllist.o \
             s1_1.o s1_2.o s1_3.o s1_4.o s1_5.o s1_6.o s1_b.o
 
 SPROINGIES = sproingiewrap.o gllist.o \
             s1_1.o s1_2.o s1_3.o s1_4.o s1_5.o s1_6.o s1_b.o
-sproingies: sproingies.o $(HACK_OBJS) $(SPROINGIES)
+sproingies: sproingies.o       $(HACK_OBJS) $(SPROINGIES)
        $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(SPROINGIES) $(HACK_LIBS)
 
        $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(SPROINGIES) $(HACK_LIBS)
 
-lament:                lament.o        $(TRACK_OBJS) xpm-ximage.o $(HACK_OBJS)
-       $(CC_HACK) -o $@ $@.o   $(TRACK_OBJS) xpm-ximage.o $(HACK_OBJS) $(XPM_LIBS)
+LAMENTOBJS = $(HACK_TRACK_OBJS) xpm-ximage.o normals.o
+lament:                lament.o        $(LAMENTOBJS)
+       $(CC_HACK) -o $@ $@.o   $(LAMENTOBJS) $(XPM_LIBS)
 
 
-B3D = b_sphere.o b_draw.o b_lockglue.o
-bubble3d:      bubble3d.o      $(HACK_OBJS) $(B3D)
-       $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(B3D) $(HACK_LIBS)
+B3D_OBJS = b_sphere.o b_draw.o b_lockglue.o $(HACK_OBJS)
+bubble3d:      bubble3d.o      $(B3D_OBJS)
+       $(CC_HACK) -o $@ $@.o   $(B3D_OBJS) $(HACK_LIBS)
 
 
-PLANETHACKS=sphere.o xpm-ximage.o $(TRACK_OBJS)
-glplanet:      glplanet.o      $(PLANETHACKS) $(HACK_OBJS)
-       $(CC_HACK) -o $@ $@.o   $(PLANETHACKS) $(HACK_OBJS) $(XPM_LIBS)
+PLANET_OBJS=sphere.o xpm-ximage.o $(HACK_TRACK_OBJS)
+glplanet:      glplanet.o      $(PLANET_OBJS)
+       $(CC_HACK) -o $@ $@.o   $(PLANET_OBJS) $(XPM_LIBS)
 
 pulsar:                pulsar.o        $(HACK_OBJS) xpm-ximage.o
        $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) xpm-ximage.o $(XPM_LIBS)
 
 EXTRUSION_OBJS=extrusion.o extrusion-helix2.o extrusion-helix3.o    \
        extrusion-helix4.o extrusion-joinoffset.o extrusion-screw.o \
 
 pulsar:                pulsar.o        $(HACK_OBJS) xpm-ximage.o
        $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) xpm-ximage.o $(XPM_LIBS)
 
 EXTRUSION_OBJS=extrusion.o extrusion-helix2.o extrusion-helix3.o    \
        extrusion-helix4.o extrusion-joinoffset.o extrusion-screw.o \
-       extrusion-taper.o extrusion-twistoid.o xpm-ximage.o $(TRACK_OBJS)
-extrusion:     $(EXTRUSION_OBJS) $(HACK_OBJS)
-       $(CC_HACK) -o $@ $(EXTRUSION_OBJS) $(HACK_OBJS) $(XPM_LIBS) $(GLE_LIBS)
+       extrusion-taper.o extrusion-twistoid.o xpm-ximage.o \
+       $(HACK_TRACK_OBJS)
+extrusion:                     $(EXTRUSION_OBJS)
+       $(CC_HACK) -o $@        $(EXTRUSION_OBJS) $(XPM_LIBS) $(GLE_LIBS)
 
 
-sierpinski3d:  sierpinski3d.o  $(HACK_OBJS) $(TRACK_OBJS)
-       $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(TRACK_OBJS) $(HACK_LIBS)
+sierpinski3d:  sierpinski3d.o  $(HACK_TRACK_OBJS)
+       $(CC_HACK) -o $@ $@.o   $(HACK_TRACK_OBJS) $(HACK_LIBS)
 
 
-gflux:         gflux.o         $(HACK_OBJS) $(TRACK_OBJS) $(GRAB_OBJS)
-       $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(TRACK_OBJS) $(GRAB_OBJS) $(HACK_LIBS)
+gflux:         gflux.o         $(HACK_TRACK_GRAB_OBJS)
+       $(CC_HACK) -o $@ $@.o   $(HACK_TRACK_GRAB_OBJS) $(HACK_LIBS)
 
 
-SW_OBJS=starwars.o glut_stroke.o glut_swidth.o
-starwars:      $(SW_OBJS) $(HACK_OBJS)
-       $(CC_HACK) -o $@ $(SW_OBJS) $(HACK_OBJS) $(HACK_LIBS)
+SW_OBJS=starwars.o glut_stroke.o glut_swidth.o texfont.o $(HACK_OBJS)
+starwars:                      $(SW_OBJS)
+       $(CC_HACK) -o $@        $(SW_OBJS) $(HACK_LIBS)
 
 
-GLT_OBJS=gltext.o glut_stroke.o glut_swidth.o tube.o $(TRACK_OBJS)
-gltext:        $(GLT_OBJS) $(HACK_OBJS)
-       $(CC_HACK) -o $@ $(GLT_OBJS) $(HACK_OBJS) $(HACK_LIBS)
+GLT_OBJS=gltext.o glut_stroke.o glut_swidth.o tube.o $(HACK_TRACK_OBJS)
+gltext:                                $(GLT_OBJS)
+       $(CC_HACK) -o $@        $(GLT_OBJS) $(HACK_LIBS)
 
 
-DB_OBJS=sphere.o tube.o $(TRACK_OBJS)
-dangerball:    dangerball.o    $(DB_OBJS) $(HACK_OBJS)
-       $(CC_HACK) -o $@ $@.o   $(DB_OBJS) $(HACK_OBJS) $(HACK_LIBS)
+DB_OBJS=sphere.o tube.o $(HACK_TRACK_OBJS)
+dangerball:    dangerball.o    $(DB_OBJS)
+       $(CC_HACK) -o $@ $@.o   $(DB_OBJS) $(HACK_LIBS)
 
 
-circuit:       circuit.o       $(HACK_OBJS) font-ximage.o
-       $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) font-ximage.o $(HACK_LIBS)
+circuit:       circuit.o       font-ximage.o $(HACK_OBJS)
+       $(CC_HACK) -o $@ $@.o   font-ximage.o $(HACK_OBJS) $(HACK_LIBS)
 
 
-menger:                menger.o        $(HACK_OBJS) $(TRACK_OBJS)
-       $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(TRACK_OBJS) $(HACK_LIBS)
+menger:                menger.o        $(HACK_TRACK_OBJS)
+       $(CC_HACK) -o $@ $@.o   $(HACK_TRACK_OBJS) $(HACK_LIBS)
 
 
-engine:                engine.o        $(HACK_OBJS) $(TRACK_OBJS)
-       $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(TRACK_OBJS) $(HACK_LIBS)
+engine:                engine.o        glxfonts.o $(HACK_TRACK_OBJS)
+       $(CC_HACK) -o $@ $@.o   glxfonts.o $(HACK_TRACK_OBJS) $(HACK_LIBS)
 
 
-flipscreen3d:  flipscreen3d.o  $(HACK_OBJS) $(GRAB_OBJS) $(TRACK_OBJS)
-       $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(GRAB_OBJS) $(TRACK_OBJS) $(HACK_LIBS)
+flipscreen3d:  flipscreen3d.o  $(HACK_TRACK_GRAB_OBJS)
+       $(CC_HACK) -o $@ $@.o   $(HACK_TRACK_GRAB_OBJS) $(HACK_LIBS)
 
 
-glsnake:       glsnake.o       $(HACK_OBJS)
-       $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(HACK_LIBS)
+glsnake:       glsnake.o       glxfonts.o $(HACK_OBJS)
+       $(CC_HACK) -o $@ $@.o   glxfonts.o $(HACK_OBJS) $(HACK_LIBS)
 
 boxed:         boxed.o         $(HACK_OBJS)
        $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(HACK_LIBS)
 
 
 boxed:         boxed.o         $(HACK_OBJS)
        $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(HACK_LIBS)
 
-glforestfire:  glforestfire.o  $(HACK_OBJS) xpm-ximage.o
-       $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) xpm-ximage.o $(XPM_LIBS)
+glforestfire:  glforestfire.o  xpm-ximage.o $(HACK_OBJS)
+       $(CC_HACK) -o $@ $@.o   xpm-ximage.o $(HACK_OBJS) $(XPM_LIBS)
 
 
-sballs:                sballs.o        $(HACK_OBJS) xpm-ximage.o
-       $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) xpm-ximage.o $(XPM_LIBS)
+sballs:                sballs.o        xpm-ximage.o $(HACK_OBJS)
+       $(CC_HACK) -o $@ $@.o   xpm-ximage.o $(HACK_OBJS) $(XPM_LIBS)
 
 
-cubenetic:     cubenetic.o     $(HACK_OBJS) $(TRACK_OBJS)
-       $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(TRACK_OBJS) $(HACK_LIBS)
+cubenetic:     cubenetic.o     $(HACK_TRACK_OBJS)
+       $(CC_HACK) -o $@ $@.o   $(HACK_TRACK_OBJS) $(HACK_LIBS)
 
 
-spheremonics:  spheremonics.o  $(HACK_OBJS) $(TRACK_OBJS)
-       $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(TRACK_OBJS) $(HACK_LIBS)
+spheremonics:  spheremonics.o  normals.o glxfonts.o $(HACK_TRACK_OBJS)
+       $(CC_HACK) -o $@ $@.o   normals.o glxfonts.o $(HACK_TRACK_OBJS) $(HACK_LIBS)
 
 
-LLOBJS=marching.o xpm-ximage.o $(TRACK_OBJS) $(HACK_OBJS)
-lavalite:      lavalite.o      $(LLOBJS)
-       $(CC_HACK) -o $@ $@.o   $(LLOBJS)  $(XPM_LIBS)
+LL_OBJS=marching.o xpm-ximage.o normals.o $(HACK_TRACK_OBJS)
+lavalite:      lavalite.o      $(LL_OBJS)
+       $(CC_HACK) -o $@ $@.o   $(LL_OBJS) $(XPM_LIBS)
 
 
-queens:                queens.o        $(TRACK_OBJS) $(HACK_OBJS)
-       $(CC_HACK) -o $@ $@.o   $(TRACK_OBJS) $(HACK_OBJS) $(HACK_LIBS)
+queens:                queens.o        $(HACK_TRACK_OBJS)
+       $(CC_HACK) -o $@ $@.o   $(HACK_TRACK_OBJS) $(HACK_LIBS)
 
 
-CHESSOBJS=chessmodels.o $(TRACK_OBJS) $(HACK_OBJS)
-endgame:       endgame.o       $(CHESSOBJS)
-       $(CC_HACK) -o $@ $@.o   $(CHESSOBJS) $(HACK_LIBS)
+endgame:       endgame.o       chessmodels.o $(HACK_TRACK_OBJS)
+       $(CC_HACK) -o $@ $@.o   chessmodels.o $(HACK_TRACK_OBJS) $(HACK_LIBS)
 
 
-glblur:        glblur.o                $(HACK_OBJS) $(TRACK_OBJS)
-       $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(TRACK_OBJS) $(HACK_LIBS)
+glblur:        glblur.o                $(HACK_TRACK_OBJS)
+       $(CC_HACK) -o $@ $@.o   $(HACK_TRACK_OBJS) $(HACK_LIBS)
 
 
-TOASTOBJS1=\
+TOAST_OBJS=\
   toaster.o toaster_base.o toaster_handle.o toaster_handle2.o \
   toaster_jet.o toaster_knob.o toaster_slots.o toaster_wing.o \
   toaster.o toaster_base.o toaster_handle.o toaster_handle2.o \
   toaster_jet.o toaster_knob.o toaster_slots.o toaster_wing.o \
-  toast.o toast2.o
-TOASTOBJS=flyingtoasters.o gllist.o $(TOASTOBJS1) xpm-ximage.o
-flyingtoasters:        $(TOASTOBJS)          $(TRACK_OBJS) $(HACK_OBJS)
-       $(CC_HACK) -o $@ $(TOASTOBJS) $(TRACK_OBJS) $(HACK_OBJS) $(XPM_LIBS)
+  toast.o toast2.o \
+  flyingtoasters.o gllist.o xpm-ximage.o $(HACK_TRACK_OBJS)
+flyingtoasters:                        $(TOAST_OBJS)
+       $(CC_HACK) -o $@        $(TOAST_OBJS) $(XPM_LIBS)
 
 
-COWOBJS1=\
-  cow_face.o cow_hide.o cow_hoofs.o cow_horns.o cow_tail.o cow_udder.o
-COWOBJS=bouncingcow.o gllist.o $(COWOBJS1) xpm-ximage.o
-bouncingcow:   $(COWOBJS)          $(TRACK_OBJS) $(HACK_OBJS)
-       $(CC_HACK) -o $@ $(COWOBJS) $(TRACK_OBJS) $(HACK_OBJS) $(XPM_LIBS)
+COW_OBJS=\
+  cow_face.o cow_hide.o cow_hoofs.o cow_horns.o cow_tail.o cow_udder.o \
+  bouncingcow.o gllist.o xpm-ximage.o $(HACK_TRACK_OBJS)
+bouncingcow:                   $(COW_OBJS)         
+       $(CC_HACK) -o $@        $(COW_OBJS) $(XPM_LIBS)
 
 
-glslideshow:   glslideshow.o   $(HACK_OBJS) $(GRAB_OBJS)
-       $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(GRAB_OBJS) $(HACK_LIBS)
+glslideshow:   glslideshow.o   glxfonts.o $(HACK_GRAB_OBJS)
+       $(CC_HACK) -o $@ $@.o   glxfonts.o $(HACK_GRAB_OBJS) $(HACK_LIBS)
 
 
-jigglypuff:    jigglypuff.o    xpm-ximage.o $(HACK_OBJS) $(TRACK_OBJS)
-       $(CC_HACK) -o $@ $@.o   xpm-ximage.o $(HACK_OBJS) $(TRACK_OBJS) $(XPM_LIBS)
+jigglypuff:    jigglypuff.o    xpm-ximage.o $(HACK_TRACK_OBJS)
+       $(CC_HACK) -o $@ $@.o   xpm-ximage.o $(HACK_TRACK_OBJS) $(XPM_LIBS)
 
 
-klein:         klein.o         $(HACK_OBJS) $(TRACK_OBJS)
-       $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(TRACK_OBJS) $(HACK_LIBS)
+klein:         klein.o         $(HACK_TRACK_OBJS)
+       $(CC_HACK) -o $@ $@.o   $(HACK_TRACK_OBJS) $(HACK_LIBS)
 
 hypertorus:    hypertorus.o    $(HACK_OBJS)
        $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(HACK_LIBS)
 
 
 hypertorus:    hypertorus.o    $(HACK_OBJS)
        $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(HACK_LIBS)
 
-glmatrix:      glmatrix.o      $(HACK_OBJS) xpm-ximage.o
-       $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) xpm-ximage.o $(XPM_LIBS)
+glmatrix:      glmatrix.o      xpm-ximage.o $(HACK_OBJS)
+       $(CC_HACK) -o $@ $@.o   xpm-ximage.o $(HACK_OBJS) $(XPM_LIBS)
 
 
-cubestorm:     cubestorm.o     $(TRACK_OBJS) $(HACK_OBJS)
-       $(CC_HACK) -o $@ $@.o   $(TRACK_OBJS) $(HACK_OBJS) $(HACK_LIBS)
+cubestorm:     cubestorm.o     $(HACK_TRACK_OBJS)
+       $(CC_HACK) -o $@ $@.o   $(HACK_TRACK_OBJS) $(HACK_LIBS)
 
 
-glknots:       glknots.o       tube.o $(TRACK_OBJS) $(HACK_OBJS)
-       $(CC_HACK) -o $@ $@.o   tube.o $(TRACK_OBJS) $(HACK_OBJS) $(HACK_LIBS)
+glknots:       glknots.o       tube.o $(HACK_TRACK_OBJS)
+       $(CC_HACK) -o $@ $@.o   tube.o $(HACK_TRACK_OBJS) $(HACK_LIBS)
 
 
-blocktube:     blocktube.o     $(HACK_OBJS) xpm-ximage.o
-       $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) xpm-ximage.o $(XPM_LIBS)
+blocktube:     blocktube.o     xpm-ximage.o $(HACK_OBJS)
+       $(CC_HACK) -o $@ $@.o   xpm-ximage.o $(HACK_OBJS) $(XPM_LIBS)
 
 
-flipflop:      flipflop.o      $(TRACK_OBJS) $(HACK_OBJS)
-       $(CC_HACK) -o $@ $@.o   $(TRACK_OBJS) $(HACK_OBJS) $(HACK_LIBS)
+flipflop:      flipflop.o      $(HACK_TRACK_OBJS)
+       $(CC_HACK) -o $@ $@.o   $(HACK_TRACK_OBJS) $(HACK_LIBS)
 
 
-antspotlight:  antspotlight.o  $(TRACK_OBJS) $(GRAB_OBJS) $(HACK_OBJS)
-       $(CC_HACK) -o $@ $@.o   $(TRACK_OBJS) $(GRAB_OBJS) $(HACK_OBJS) $(HACK_LIBS)
+antspotlight:  antspotlight.o  $(HACK_TRACK_GRAB_OBJS)
+       $(CC_HACK) -o $@ $@.o   $(HACK_TRACK_GRAB_OBJS) $(HACK_LIBS)
 
 polytopes:     polytopes.o     $(HACK_OBJS)
        $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(HACK_LIBS)
 
 polytopes:     polytopes.o     $(HACK_OBJS)
        $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(HACK_LIBS)
@@ -561,8 +571,8 @@ polytopes:  polytopes.o     $(HACK_OBJS)
 #
 STONER_OBJS=stonerview.o stonerview-move.o stonerview-osc.o stonerview-view.o \
            $(UTILS_BIN)/yarandom.o $(UTILS_BIN)/usleep.o
 #
 STONER_OBJS=stonerview.o stonerview-move.o stonerview-osc.o stonerview-view.o \
            $(UTILS_BIN)/yarandom.o $(UTILS_BIN)/usleep.o
-stonerview:    $(STONER_OBJS)
-       $(CC_HACK) -o $@ $(STONER_OBJS) $(HACK_LIBS)
+stonerview:                    $(STONER_OBJS)
+       $(CC_HACK) -o $@        $(STONER_OBJS) $(HACK_LIBS)
 
 molecules.h:
        @tmp=molecules.h.$$$$ ;                                         \
 
 molecules.h:
        @tmp=molecules.h.$$$$ ;                                         \
@@ -575,15 +585,15 @@ molecules.h:
        done ;                                                          \
        mv $$tmp molecules.h
 
        done ;                                                          \
        mv $$tmp molecules.h
 
-MOLECULEOBJS=sphere.o tube.o $(TRACK_OBJS)
-molecule:      molecule.o      $(MOLECULEOBJS) $(HACK_OBJS)
-       $(CC_HACK) -o $@ $@.o   $(MOLECULEOBJS) $(HACK_OBJS) $(HACK_LIBS)
+MOLECULE_OBJS=sphere.o tube.o glxfonts.o $(HACK_TRACK_OBJS)
+molecule:      molecule.o      $(MOLECULE_OBJS)
+       $(CC_HACK) -o $@ $@.o   $(MOLECULE_OBJS) $(HACK_LIBS)
 
 
-gleidescope:   gleidescope.o xpm-ximage.o $(HACK_OBJS) $(GRAB_OBJS)
-       $(CC_HACK) -o $@ $@.o xpm-ximage.o $(HACK_OBJS) $(GRAB_OBJS) $(XPM_LIBS)
+gleidescope:   gleidescope.o   xpm-ximage.o $(HACK_GRAB_OBJS)
+       $(CC_HACK) -o $@ $@.o   xpm-ximage.o $(HACK_GRAB_OBJS) $(XPM_LIBS)
 
 
-mirrorblob:    mirrorblob.o    $(HACK_OBJS) $(GRAB_OBJS)
-       $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(GRAB_OBJS) $(XPM_LIBS)
+mirrorblob:    mirrorblob.o    $(HACK_GRAB_OBJS)
+       $(CC_HACK) -o $@ $@.o   $(HACK_GRAB_OBJS) $(XPM_LIBS)
 
 blinkbox:      blinkbox.o      sphere.o $(HACK_OBJS)
        $(CC_HACK) -o $@ $@.o   sphere.o $(HACK_OBJS) $(HACK_LIBS)
 
 blinkbox:      blinkbox.o      sphere.o $(HACK_OBJS)
        $(CC_HACK) -o $@ $@.o   sphere.o $(HACK_OBJS) $(HACK_LIBS)
@@ -591,21 +601,27 @@ blinkbox: blinkbox.o      sphere.o $(HACK_OBJS)
 noof:  noof.o                  $(HACK_OBJS)
        $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(HACK_LIBS)
 
 noof:  noof.o                  $(HACK_OBJS)
        $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(HACK_LIBS)
 
-PH_OBJS=polyhedra-gl.o $(TRACK_OBJS)
-polyhedra:     polyhedra.o     $(PH_OBJS) $(HACK_OBJS)
-       $(CC_HACK) -o $@ $@.o   $(PH_OBJS) $(HACK_OBJS) $(HACK_LIBS)
+PH_OBJS=polyhedra-gl.o normals.o glxfonts.o $(HACK_TRACK_OBJS)
+polyhedra:     polyhedra.o     $(PH_OBJS)
+       $(CC_HACK) -o $@ $@.o   $(PH_OBJS) $(HACK_LIBS)
+
+antinspect:    antinspect.o    $(HACK_TRACK_OBJS)
+       $(CC_HACK) -o $@ $@.o   $(HACK_TRACK_OBJS) $(HACK_LIBS)
+
+providence:    providence.o    $(HACK_TRACK_OBJS)
+       $(CC_HACK) -o $@ $@.o   $(HACK_TRACK_OBJS) $(HACK_LIBS)
 
 
-antinspect:    antinspect.o    $(TRACK_OBJS) $(HACK_OBJS)
-       $(CC_HACK) -o $@ $@.o   $(TRACK_OBJS) $(HACK_OBJS) $(HACK_LIBS)
+pinion:                pinion.o        normals.o glxfonts.o $(HACK_TRACK_OBJS)
+       $(CC_HACK) -o $@ $@.o   normals.o glxfonts.o $(HACK_TRACK_OBJS) $(HACK_LIBS)
 
 
-providence:    providence.o    $(TRACK_OBJS) $(HACK_OBJS)
-       $(CC_HACK) -o $@ $@.o   $(TRACK_OBJS) $(HACK_OBJS) $(HACK_LIBS)
+boing:         boing.o         normals.o $(HACK_TRACK_OBJS)
+       $(CC_HACK) -o $@ $@.o   normals.o $(HACK_TRACK_OBJS) $(HACK_LIBS)
 
 
-pinion:                pinion.o        $(TRACK_OBJS) $(HACK_OBJS)
-       $(CC_HACK) -o $@ $@.o   $(TRACK_OBJS) $(HACK_OBJS) $(HACK_LIBS)
+carousel:      carousel.o      texfont.o $(HACK_TRACK_GRAB_OBJS)
+       $(CC_HACK) -o $@ $@.o   texfont.o $(HACK_TRACK_GRAB_OBJS) $(HACK_LIBS)
 
 
-dnalogo:       dnalogo.o       tube.o $(TRACK_OBJS) $(HACK_OBJS)
-       $(CC_HACK) -o $@ $@.o   tube.o $(TRACK_OBJS) $(HACK_OBJS) $(HACK_LIBS)
+dnalogo:       dnalogo.o      tube.o normals.o $(HACK_TRACK_OBJS)
+       $(CC_HACK) -o $@ $@.o  tube.o normals.o $(HACK_TRACK_OBJS) $(HACK_LIBS)
 
 ##############################################################################
 #
 
 ##############################################################################
 #
@@ -640,6 +656,8 @@ b_lockglue.o: ../../config.h
 blocktube.o: ../../config.h
 blocktube.o: $(HACK_SRC)/images/blocktube.xpm
 blocktube.o: $(srcdir)/xpm-ximage.h
 blocktube.o: ../../config.h
 blocktube.o: $(HACK_SRC)/images/blocktube.xpm
 blocktube.o: $(srcdir)/xpm-ximage.h
+boing.o: ../../config.h
+boing.o: $(srcdir)/gltrackball.h
 bouncingcow.o: ../../config.h
 bouncingcow.o: $(srcdir)/gllist.h
 bouncingcow.o: $(srcdir)/gltrackball.h
 bouncingcow.o: ../../config.h
 bouncingcow.o: $(srcdir)/gllist.h
 bouncingcow.o: $(srcdir)/gltrackball.h
@@ -654,6 +672,11 @@ bubble3d.o: ../../config.h
 buildlwo.o: $(srcdir)/buildlwo.h
 cage.o: ../../config.h
 cage.o: $(srcdir)/e_textures.h
 buildlwo.o: $(srcdir)/buildlwo.h
 cage.o: ../../config.h
 cage.o: $(srcdir)/e_textures.h
+carousel.o: ../../config.h
+carousel.o: $(srcdir)/gltrackball.h
+carousel.o: $(srcdir)/grab-ximage.h
+carousel.o: $(srcdir)/rotator.h
+carousel.o: $(srcdir)/texfont.h
 chessmodels.o: $(srcdir)/chessmodels.h
 circuit.o: ../../config.h
 circuit.o: $(srcdir)/font-ximage.h
 chessmodels.o: $(srcdir)/chessmodels.h
 circuit.o: ../../config.h
 circuit.o: $(srcdir)/font-ximage.h
@@ -681,12 +704,14 @@ endgame.o: ../../config.h
 endgame.o: $(srcdir)/gltrackball.h
 engine.o: ../../config.h
 engine.o: $(srcdir)/gltrackball.h
 endgame.o: $(srcdir)/gltrackball.h
 engine.o: ../../config.h
 engine.o: $(srcdir)/gltrackball.h
+engine.o: $(srcdir)/glxfonts.h
 engine.o: $(srcdir)/rotator.h
 extrusion-helix2.o: ../../config.h
 extrusion-helix3.o: ../../config.h
 extrusion-helix4.o: ../../config.h
 extrusion-joinoffset.o: ../../config.h
 extrusion.o: ../../config.h
 engine.o: $(srcdir)/rotator.h
 extrusion-helix2.o: ../../config.h
 extrusion-helix3.o: ../../config.h
 extrusion-helix4.o: ../../config.h
 extrusion-joinoffset.o: ../../config.h
 extrusion.o: ../../config.h
+extrusion.o: $(srcdir)/gltrackball.h
 extrusion.o: $(srcdir)/rotator.h
 extrusion.o: $(srcdir)/xpm-ximage.h
 extrusion-screw.o: ../../config.h
 extrusion.o: $(srcdir)/rotator.h
 extrusion.o: $(srcdir)/xpm-ximage.h
 extrusion-screw.o: ../../config.h
@@ -757,8 +782,10 @@ glplanet.o: $(srcdir)/rotator.h
 glplanet.o: $(srcdir)/sphere.h
 glplanet.o: $(srcdir)/xpm-ximage.h
 glslideshow.o: ../../config.h
 glplanet.o: $(srcdir)/sphere.h
 glplanet.o: $(srcdir)/xpm-ximage.h
 glslideshow.o: ../../config.h
+glslideshow.o: $(srcdir)/glxfonts.h
 glslideshow.o: $(srcdir)/grab-ximage.h
 glsnake.o: ../../config.h
 glslideshow.o: $(srcdir)/grab-ximage.h
 glsnake.o: ../../config.h
+glsnake.o: $(srcdir)/glxfonts.h
 gltext.o: ../../config.h
 gltext.o: $(srcdir)/gltrackball.h
 gltext.o: $(srcdir)/glut_roman.h
 gltext.o: ../../config.h
 gltext.o: $(srcdir)/gltrackball.h
 gltext.o: $(srcdir)/glut_roman.h
@@ -772,6 +799,8 @@ glut_stroke.o: ../../config.h
 glut_stroke.o: $(srcdir)/glutstroke.h
 glut_swidth.o: ../../config.h
 glut_swidth.o: $(srcdir)/glutstroke.h
 glut_stroke.o: $(srcdir)/glutstroke.h
 glut_swidth.o: ../../config.h
 glut_swidth.o: $(srcdir)/glutstroke.h
+glxfonts.o: ../../config.h
+glxfonts.o: $(srcdir)/glxfonts.h
 grab-ximage.o: ../../config.h
 hypertorus.o: ../../config.h
 jigglypuff.o: ../../config.h
 grab-ximage.o: ../../config.h
 hypertorus.o: ../../config.h
 jigglypuff.o: ../../config.h
@@ -784,6 +813,7 @@ klein.o: $(srcdir)/rotator.h
 lament.o: ../../config.h
 lament.o: $(srcdir)/gltrackball.h
 lament.o: $(HACK_SRC)/images/lament.xpm
 lament.o: ../../config.h
 lament.o: $(srcdir)/gltrackball.h
 lament.o: $(HACK_SRC)/images/lament.xpm
+lament.o: $(srcdir)/normals.h
 lament.o: $(srcdir)/rotator.h
 lament.o: $(srcdir)/xpm-ximage.h
 lavalite.o: ../../config.h
 lament.o: $(srcdir)/rotator.h
 lament.o: $(srcdir)/xpm-ximage.h
 lavalite.o: ../../config.h
@@ -793,6 +823,7 @@ lavalite.o: $(srcdir)/rotator.h
 lavalite.o: $(srcdir)/xpm-ximage.h
 marching.o: ../../config.h
 marching.o: $(srcdir)/marching.h
 lavalite.o: $(srcdir)/xpm-ximage.h
 marching.o: ../../config.h
 marching.o: $(srcdir)/marching.h
+marching.o: $(srcdir)/normals.h
 menger.o: ../../config.h
 menger.o: $(srcdir)/gltrackball.h
 menger.o: $(srcdir)/rotator.h
 menger.o: ../../config.h
 menger.o: $(srcdir)/gltrackball.h
 menger.o: $(srcdir)/rotator.h
@@ -804,19 +835,26 @@ moebius.o: $(srcdir)/gltrackball.h
 moebius.o: $(srcdir)/rotator.h
 molecule.o: ../../config.h
 molecule.o: $(srcdir)/gltrackball.h
 moebius.o: $(srcdir)/rotator.h
 molecule.o: ../../config.h
 molecule.o: $(srcdir)/gltrackball.h
+molecule.o: $(srcdir)/glxfonts.h
 molecule.o: molecules.h
 molecule.o: $(srcdir)/rotator.h
 molecule.o: $(srcdir)/sphere.h
 molecule.o: $(srcdir)/tube.h
 morph3d.o: ../../config.h
 noof.o: ../../config.h
 molecule.o: molecules.h
 molecule.o: $(srcdir)/rotator.h
 molecule.o: $(srcdir)/sphere.h
 molecule.o: $(srcdir)/tube.h
 morph3d.o: ../../config.h
 noof.o: ../../config.h
+normals.o: ../../config.h
+normals.o: $(srcdir)/normals.h
 pinion.o: ../../config.h
 pinion.o: $(srcdir)/gltrackball.h
 pinion.o: ../../config.h
 pinion.o: $(srcdir)/gltrackball.h
+pinion.o: $(srcdir)/glxfonts.h
+pinion.o: $(srcdir)/normals.h
 pipeobjs.o: $(srcdir)/buildlwo.h
 pipes.o: $(srcdir)/buildlwo.h
 pipes.o: ../../config.h
 polyhedra-gl.o: ../../config.h
 polyhedra-gl.o: $(srcdir)/gltrackball.h
 pipeobjs.o: $(srcdir)/buildlwo.h
 pipes.o: $(srcdir)/buildlwo.h
 pipes.o: ../../config.h
 polyhedra-gl.o: ../../config.h
 polyhedra-gl.o: $(srcdir)/gltrackball.h
+polyhedra-gl.o: $(srcdir)/glxfonts.h
+polyhedra-gl.o: $(srcdir)/normals.h
 polyhedra-gl.o: $(srcdir)/polyhedra.h
 polyhedra-gl.o: $(srcdir)/rotator.h
 polyhedra.o: ../../config.h
 polyhedra-gl.o: $(srcdir)/polyhedra.h
 polyhedra-gl.o: $(srcdir)/rotator.h
 polyhedra.o: ../../config.h
@@ -848,6 +886,8 @@ sierpinski3d.o: $(srcdir)/gltrackball.h
 sierpinski3d.o: $(srcdir)/rotator.h
 spheremonics.o: ../../config.h
 spheremonics.o: $(srcdir)/gltrackball.h
 sierpinski3d.o: $(srcdir)/rotator.h
 spheremonics.o: ../../config.h
 spheremonics.o: $(srcdir)/gltrackball.h
+spheremonics.o: $(srcdir)/glxfonts.h
+spheremonics.o: $(srcdir)/normals.h
 spheremonics.o: $(srcdir)/rotator.h
 sphere.o: ../../config.h
 sproingies.o: ../../config.h
 spheremonics.o: $(srcdir)/rotator.h
 sphere.o: ../../config.h
 sproingies.o: ../../config.h
@@ -858,6 +898,7 @@ stairs.o: $(srcdir)/e_textures.h
 starwars.o: ../../config.h
 starwars.o: $(srcdir)/glut_roman.h
 starwars.o: $(srcdir)/glutstroke.h
 starwars.o: ../../config.h
 starwars.o: $(srcdir)/glut_roman.h
 starwars.o: $(srcdir)/glutstroke.h
+starwars.o: $(srcdir)/texfont.h
 stonerview-move.o: ../../config.h
 stonerview-move.o: $(srcdir)/stonerview-move.h
 stonerview-move.o: $(srcdir)/stonerview-osc.h
 stonerview-move.o: ../../config.h
 stonerview-move.o: $(srcdir)/stonerview-move.h
 stonerview-move.o: $(srcdir)/stonerview-osc.h
@@ -871,6 +912,8 @@ stonerview-view.o: $(srcdir)/stonerview-osc.h
 superquadrics.o: ../../config.h
 swim.o: $(srcdir)/atlantis.h
 swim.o: ../../config.h
 superquadrics.o: ../../config.h
 swim.o: $(srcdir)/atlantis.h
 swim.o: ../../config.h
+texfont.o: ../../config.h
+texfont.o: $(srcdir)/texfont.h
 toast2.o: $(srcdir)/gllist.h
 toaster_base.o: $(srcdir)/gllist.h
 toaster_handle2.o: $(srcdir)/gllist.h
 toast2.o: $(srcdir)/gllist.h
 toaster_base.o: $(srcdir)/gllist.h
 toaster_handle2.o: $(srcdir)/gllist.h
index 777ddbecfca55dfccfb14007e5f0e58aca22b568..3f3dc9ebcd5feff65b0f07b43d3a382c58e17593 100644 (file)
@@ -555,7 +555,7 @@ void release_antinspect(ModeInfo * mi) {
 Bool antinspect_handle_event (ModeInfo *mi, XEvent *event) {
   antinspectstruct *mp = &antinspect[MI_SCREEN(mi)];
   
 Bool antinspect_handle_event (ModeInfo *mi, XEvent *event) {
   antinspectstruct *mp = &antinspect[MI_SCREEN(mi)];
   
-  if(event->xany.type == ButtonPress && event->xbutton.button & Button1) {
+  if(event->xany.type == ButtonPress && event->xbutton.button == Button1) {
        mp->button_down_p = True;
        gltrackball_start(mp->trackball,
                                          event->xbutton.x, event->xbutton.y,
        mp->button_down_p = True;
        gltrackball_start(mp->trackball,
                                          event->xbutton.x, event->xbutton.y,
@@ -563,10 +563,18 @@ Bool antinspect_handle_event (ModeInfo *mi, XEvent *event) {
        return True;
   }
   else if(event->xany.type == ButtonRelease && 
        return True;
   }
   else if(event->xany.type == ButtonRelease && 
-                 event->xbutton.button & Button1) {
+                 event->xbutton.button == Button1) {
        mp->button_down_p = False;
        return True;
   }
        mp->button_down_p = False;
        return True;
   }
+  else if (event->xany.type == ButtonPress &&
+           (event->xbutton.button == Button4 ||
+            event->xbutton.button == Button5))
+    {
+      gltrackball_mousewheel (mp->trackball, event->xbutton.button, 5,
+                              !event->xbutton.state);
+      return True;
+    }
   else if(event->xany.type == MotionNotify && mp->button_down_p) {
        gltrackball_track (mp->trackball,
                                           event->xmotion.x, event->xmotion.y,
   else if(event->xany.type == MotionNotify && mp->button_down_p) {
        gltrackball_track (mp->trackball,
                                           event->xmotion.x, event->xmotion.y,
index 3c48951ee2e5caea33a7e527e44248271670801f..4337165849a50247a3951a69d73d501265d544b5 100644 (file)
@@ -25,7 +25,8 @@
 #define EVENT_MASK         PointerMotionMask
 #define antspotlight_opts          xlockmore_opts
 #define DEFAULTS           "*delay:   20000   \n" \
 #define EVENT_MASK         PointerMotionMask
 #define antspotlight_opts          xlockmore_opts
 #define DEFAULTS           "*delay:   20000   \n" \
-                           "*showFPS: False   \n"
+                           "*showFPS: False   \n" \
+                            "*useSHM:  True    \n"
 
 #include "xlockmore.h"
 #else
 
 #include "xlockmore.h"
 #else
@@ -58,19 +59,11 @@ ModStruct   antspotlight_description = {
 #define Pi M_PI
 #endif
 
 #define Pi M_PI
 #endif
 
-int winw, winh;
-int tw, th; /* texture width, height */
-int tx, ty;
 GLfloat max_tx, max_ty;
 GLfloat max_tx, max_ty;
-#define QW 12
-#define QH 12
-GLfloat qw = QW, qh = QH; /* for the quad we'll draw */
-GLfloat qx = -6 , qy = 6;
 int mono = 0, wire = 0, ticks = 0;
 GLuint screentexture;
 
 typedef struct {
 int mono = 0, wire = 0, ticks = 0;
 GLuint screentexture;
 
 typedef struct {
-  GLint       WindH, WindW;
   GLXContext *glx_context;
   rotator    *rot;
   trackball_state *trackball;
   GLXContext *glx_context;
   rotator    *rot;
   trackball_state *trackball;
@@ -86,7 +79,8 @@ static antspotlightstruct *antspotlight = (antspotlightstruct *) NULL;
 
 /* draw method for ant */
 Bool draw_ant(GLfloat *Material, int mono, int shadow, 
 
 /* draw method for ant */
 Bool draw_ant(GLfloat *Material, int mono, int shadow, 
-             float ant_step, Bool (*sphere)(float), Bool (*cone)(float)) {
+             float ant_step, Bool (*sphere)(float), Bool (*cone)(float))
+{
   
   float cos1 = cos(ant_step);
   float cos2 = cos(ant_step + 2 * Pi / 3);
   
   float cos1 = cos(ant_step);
   float cos2 = cos(ant_step + 2 * Pi / 3);
@@ -219,7 +213,8 @@ Bool draw_ant(GLfloat *Material, int mono, int shadow,
 }
 
 /* filled sphere */
 }
 
 /* filled sphere */
-static Bool mySphere(float radius) {
+static Bool mySphere(float radius)
+{
   GLUquadricObj *quadObj;
   
   if((quadObj = gluNewQuadric()) == 0)
   GLUquadricObj *quadObj;
   
   if((quadObj = gluNewQuadric()) == 0)
@@ -233,7 +228,8 @@ static Bool mySphere(float radius) {
 }
 
 /* silhouette sphere */
 }
 
 /* silhouette sphere */
-static Bool mySphere2(float radius) {
+static Bool mySphere2(float radius)
+{
   GLUquadricObj *quadObj;
 
   if((quadObj = gluNewQuadric()) == 0)
   GLUquadricObj *quadObj;
 
   if((quadObj = gluNewQuadric()) == 0)
@@ -255,7 +251,8 @@ double boardsize = 8.0;
 
 GLfloat spot_direction[3];
 
 
 GLfloat spot_direction[3];
 
-void draw_board(void) {
+void draw_board(void)
+{
   int i, j;
   double cutoff = Pi/3.0;
   double center[3];
   int i, j;
   double cutoff = Pi/3.0;
   double center[3];
@@ -292,6 +289,7 @@ void draw_board(void) {
 
     glBegin(GL_TRIANGLE_STRIP);
     glNormal3f(0.0, 1.0, 0.0);
 
     glBegin(GL_TRIANGLE_STRIP);
     glNormal3f(0.0, 1.0, 0.0);
+
     glTexCoord2f(centertex[0], centertex[1]);
     glVertex3f(center[0], 0.01, center[2]);
 
     glTexCoord2f(centertex[0], centertex[1]);
     glVertex3f(center[0], 0.01, center[2]);
 
@@ -308,7 +306,7 @@ void draw_board(void) {
       point[2] = center[2] - fj*sin(theta1);
 
       tex[0] = (boardsize/2.0+point[0]) * max_tx / boardsize;
       point[2] = center[2] - fj*sin(theta1);
 
       tex[0] = (boardsize/2.0+point[0]) * max_tx / boardsize;
-      tex[1] = max_ty - ((boardsize/2.0+point[2]) * max_ty / boardsize);
+      tex[1] = (boardsize/2.0+point[2]) * max_ty / boardsize;
 
       glTexCoord2f(tex[0], tex[1]);
       glVertex3f(point[0], point[1], point[2]);
 
       glTexCoord2f(tex[0], tex[1]);
       glVertex3f(point[0], point[1], point[2]);
@@ -318,7 +316,7 @@ void draw_board(void) {
       point[2] = center[2] - fj*sin(theta2);
 
       tex[0] = (boardsize/2.0+point[0]) * max_tx / boardsize;
       point[2] = center[2] - fj*sin(theta2);
 
       tex[0] = (boardsize/2.0+point[0]) * max_tx / boardsize;
-      tex[1] = max_ty - ((boardsize/2.0+point[2]) * max_ty / boardsize);
+      tex[1] = (boardsize/2.0+point[2]) * max_ty / boardsize;
 
       glTexCoord2f(tex[0], tex[1]);
       glVertex3f(point[0], point[1], point[2]);
 
       glTexCoord2f(tex[0], tex[1]);
       glVertex3f(point[0], point[1], point[2]);
@@ -331,14 +329,16 @@ void draw_board(void) {
 }
 
 /* return euclidean distance between two points */
 }
 
 /* return euclidean distance between two points */
-double distance(double x[3], double y[3]) {
+double distance(double x[3], double y[3])
+{
   double dx = x[0] - y[0];
   double dz = x[2] - y[2];
   return sqrt(dx*dx + dz*dz);
 }
 
 /* determine a new goal */
   double dx = x[0] - y[0];
   double dz = x[2] - y[2];
   return sqrt(dx*dx + dz*dz);
 }
 
 /* determine a new goal */
-void find_goal(void) {
+void find_goal(void)
+{
   do {
     ant->goal[0] = random()%((int)(boardsize+0.5)-2) - boardsize/2.0 + 1.0;
     ant->goal[1] = 0.0;
   do {
     ant->goal[0] = random()%((int)(boardsize+0.5)-2) - boardsize/2.0 + 1.0;
     ant->goal[1] = 0.0;
@@ -348,7 +348,8 @@ void find_goal(void) {
 }
 
 /* construct our ant */
 }
 
 /* construct our ant */
-void build_ant(void) {
+void build_ant(void)
+{
   ant = (Ant *) malloc(sizeof (Ant));
   ant->position[0] = 0.0;
   ant->position[1] = 0.0;
   ant = (Ant *) malloc(sizeof (Ant));
   ant->position[0] = 0.0;
   ant->position[1] = 0.0;
@@ -362,25 +363,30 @@ void build_ant(void) {
 
 #define EPSILON 0.01
 
 
 #define EPSILON 0.01
 
-double sign(double d) {
+double sign(double d)
+{
   return d < 0.0 ? -1.0 : 1.0;
 }
 
   return d < 0.0 ? -1.0 : 1.0;
 }
 
-double min(double a, double b) {
+double min(double a, double b)
+{
   return a < b ? a : b;
 }
 
   return a < b ? a : b;
 }
 
-double max(double a, double b) {
+double max(double a, double b)
+{
   return a > b ? a : b;
 }
 
 /* find a new goal and reset steps */
   return a > b ? a : b;
 }
 
 /* find a new goal and reset steps */
-void reset_ant(void) {
+void reset_ant(void)
+{
   find_goal();
 }
 
 /* draw ant composed of skeleton and glass */
   find_goal();
 }
 
 /* draw ant composed of skeleton and glass */
-void show_ant(void) {
+void show_ant(void)
+{
 
   glPushMatrix();
 
 
   glPushMatrix();
 
@@ -404,7 +410,8 @@ void show_ant(void) {
   glPopMatrix();
 }
 
   glPopMatrix();
 }
 
-void draw_antspotlight_strip(ModeInfo *mi) {
+void draw_antspotlight_strip(ModeInfo *mi)
+{
 
   /* compute spotlight position and direction */
   GLfloat light1_position[4];
 
   /* compute spotlight position and direction */
   GLfloat light1_position[4];
@@ -483,12 +490,11 @@ void draw_antspotlight_strip(ModeInfo *mi) {
     ant->step -= 2*Pi;
 }
 
     ant->step -= 2*Pi;
 }
 
-void reshape_antspotlight(ModeInfo * mi, int width, int height) {
+void reshape_antspotlight(ModeInfo * mi, int width, int height)
+{
   double h = (GLfloat) height / (GLfloat) width;  
   int size = 2;
   double h = (GLfloat) height / (GLfloat) width;  
   int size = 2;
-  antspotlightstruct *mp = &antspotlight[MI_SCREEN(mi)];
-
-  glViewport(0, 0, mp->WindW = (GLint) width, mp->WindH = (GLint) height);
+  glViewport(0, 0, width, height);
   glMatrixMode(GL_PROJECTION);
   glLoadIdentity();
 
   glMatrixMode(GL_PROJECTION);
   glLoadIdentity();
 
@@ -512,7 +518,8 @@ GLfloat lmodel_twoside[] = {GL_TRUE};
 GLfloat spotlight_ambient[] = { 0.0, 0.0, 0.0, 1.0 };
 GLfloat spotlight_diffuse[] = { 1.0, 1.0, 1.0, 1.0 };
 
 GLfloat spotlight_ambient[] = { 0.0, 0.0, 0.0, 1.0 };
 GLfloat spotlight_diffuse[] = { 1.0, 1.0, 1.0, 1.0 };
 
-static void pinit(void) {
+static void pinit(void)
+{
   glClearDepth(1.0);
   glClearColor(0.0, 0.0, 0.0, 1.0);
   
   glClearDepth(1.0);
   glClearColor(0.0, 0.0, 0.0, 1.0);
   
@@ -553,7 +560,8 @@ static void pinit(void) {
 }
 
 /* cleanup routine */
 }
 
 /* cleanup routine */
-void release_antspotlight(ModeInfo * mi) {
+void release_antspotlight(ModeInfo * mi)
+{
 
   if(antspotlight) {
     free((void *) antspotlight);
 
   if(antspotlight) {
     free((void *) antspotlight);
@@ -569,7 +577,8 @@ int mag = 1;
 #define min(a, b) a < b ? a : b
 
 /* event handling */
 #define min(a, b) a < b ? a : b
 
 /* event handling */
-Bool antspotlight_handle_event(ModeInfo *mi, XEvent *event) {
+Bool antspotlight_handle_event(ModeInfo *mi, XEvent *event)
+{
   antspotlightstruct *mp = &antspotlight[MI_SCREEN(mi)];
 
   switch(event->xany.type) {
   antspotlightstruct *mp = &antspotlight[MI_SCREEN(mi)];
 
   switch(event->xany.type) {
@@ -620,62 +629,28 @@ Bool antspotlight_handle_event(ModeInfo *mi, XEvent *event) {
 }
 
 /* get screenshot */
 }
 
 /* get screenshot */
-void get_snapshot(ModeInfo *modeinfo) {
-  XImage *ximage;
-  int status;
+void get_snapshot(ModeInfo *modeinfo)
+{
+  Bool mipmap_p = True;
+  int iw, ih, tw, th;
 
 
-  if(MI_IS_WIREFRAME(modeinfo))
+  if (MI_IS_WIREFRAME(modeinfo))
     return;
 
     return;
 
-  ximage = screen_to_ximage(modeinfo->xgwa.screen, modeinfo->window, NULL);
-
-  qw = QW; qh = QH;
-  tw = modeinfo->xgwa.width;
-  th = modeinfo->xgwa.height;
-  
-#if 0  /* jwz: this makes the image start off the bottom right of the screen */
-  qx += (qw*tw/winw);
-  qy -= (qh*th/winh);
-#endif
-
-  qw *= (GLfloat)tw/winw;
-  qh *= (GLfloat)th/winh;
+  if (! screen_to_texture (modeinfo->xgwa.screen, modeinfo->window, 0, 0,
+                           mipmap_p, NULL, NULL, &iw, &ih, &tw, &th))
+    exit (1);
 
 
-  max_tx = (GLfloat) tw / (GLfloat) ximage->width;
-  max_ty = (GLfloat) th / (GLfloat) ximage->height;
+  max_tx = (GLfloat) iw / tw;
+  max_ty = (GLfloat) ih / th;
 
 
-  glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
-  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
-                  GL_LINEAR_MIPMAP_LINEAR);
-  
-  clear_gl_error();
-  status = gluBuild2DMipmaps(GL_TEXTURE_2D, 3,
-                            ximage->width, ximage->height,
-                            GL_RGBA, GL_UNSIGNED_BYTE, ximage->data);
-  
-  if (!status && glGetError())
-    /* Some implementations of gluBuild2DMipmaps(), but set a GL error anyway.
-       We could just call check_gl_error(), but that would exit. */
-    status = -1;
-  
-  if(status) {
-    const unsigned char *s = gluErrorString(status);
-    fprintf(stderr, "%s: error mipmapping %dx%d texture: %s\n",
-           progname, ximage->width, ximage->height,
-           (s ? s : (unsigned char *) "(unknown)"));
-    fprintf(stderr, "%s: turning on -wireframe.\n", progname);
-    MI_IS_WIREFRAME(modeinfo) = 1;
-    clear_gl_error();
-  }
-  check_gl_error("mipmapping");  /* should get a return code instead of a
-                                   GL error, but just in case... */
-  
-  free(ximage->data);
-  ximage->data = 0;
-  XDestroyImage (ximage);
+  glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+  glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
+                   (mipmap_p ? GL_LINEAR_MIPMAP_LINEAR : GL_LINEAR));
 }
 
 }
 
-void init_antspotlight(ModeInfo *mi) {
+void init_antspotlight(ModeInfo *mi)
+{
   double rot_speed = 0.3;
 
   antspotlightstruct *mp;
   double rot_speed = 0.3;
 
   antspotlightstruct *mp;
@@ -710,7 +685,8 @@ void init_antspotlight(ModeInfo *mi) {
 /*   glEndList(); */
 }
 
 /*   glEndList(); */
 }
 
-void draw_antspotlight(ModeInfo * mi) {
+void draw_antspotlight(ModeInfo * mi)
+{
   antspotlightstruct *mp;
   
   Display    *display = MI_DISPLAY(mi);
   antspotlightstruct *mp;
   
   Display    *display = MI_DISPLAY(mi);
@@ -757,7 +733,8 @@ void draw_antspotlight(ModeInfo * mi) {
   glXSwapBuffers(display, window);
 }
 
   glXSwapBuffers(display, window);
 }
 
-void change_antspotlight(ModeInfo * mi) {
+void change_antspotlight(ModeInfo * mi)
+{
   antspotlightstruct *mp = &antspotlight[MI_SCREEN(mi)];
   
   if (!mp->glx_context)
   antspotlightstruct *mp = &antspotlight[MI_SCREEN(mi)];
   
   if (!mp->glx_context)
diff --git a/hacks/glx/boing.c b/hacks/glx/boing.c
new file mode 100644 (file)
index 0000000..b315a64
--- /dev/null
@@ -0,0 +1,674 @@
+/* boing, Copyright (c) 2005 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.
+ *
+ * A clone of the Amiga 1000 "Boing" demo.  This was the first graphics demo
+ * for the Amiga, written by Dale Luck and RJ Mical during a break at the 1984
+ * Consumer Electronics Show (or so the legend goes.)  The boing ball was
+ * briefly the official logo of Amiga Inc., until they were bought by
+ * Commodore later that year.
+ *
+ * With no arguments, this program looks a lot like the original Amiga demo.
+ * With "-smooth -lighting", it looks... less old.
+ *
+ * The amiga version made noise when the ball hit the walls.  This version
+ * does not, obviously.
+ */
+
+#include <X11/Intrinsic.h>
+
+extern XtAppContext app;
+
+#define PROGCLASS      "Boing"
+#define HACK_INIT      init_boing
+#define HACK_DRAW      draw_boing
+#define HACK_RESHAPE   reshape_boing
+#define HACK_HANDLE_EVENT boing_handle_event
+#define EVENT_MASK      PointerMotionMask
+#define sws_opts       xlockmore_opts
+
+#define DEF_SPIN        "True"
+#define DEF_LIGHTING    "False"
+#define DEF_SMOOTH      "False"
+#define DEF_SCANLINES   "False"
+#define DEF_SPEED       "1.0"
+#define DEF_SIZE        "0.5"
+#define DEF_ANGLE       "15"
+#define DEF_MERIDIANS   "16"
+#define DEF_PARALLELS   "8"
+#define DEF_TILES       "12"
+#define DEF_THICKNESS   "0.05"
+
+#define DEF_BALL_COLOR1  "#CC1919"
+#define DEF_BALL_COLOR2  "#F2F2F2"
+#define DEF_GRID_COLOR   "#991999"
+#define DEF_SHADOW_COLOR "#303030"
+#define DEF_BACKGROUND   "#8C8C8C"
+
+#define DEFAULTS       "*delay:        30000            \n" \
+                       "*showFPS:      False            \n" \
+                       "*wireframe:    False            \n" \
+                       "*spin:       " DEF_SPIN        "\n" \
+                       "*lighting:   " DEF_LIGHTING    "\n" \
+                       "*smooth:     " DEF_SMOOTH      "\n" \
+                       "*scanlines:  " DEF_SCANLINES   "\n" \
+                       "*speed:      " DEF_SPEED       "\n" \
+                       "*angle:      " DEF_ANGLE       "\n" \
+                       "*ballSize:   " DEF_SIZE        "\n" \
+                       "*meridians:  " DEF_MERIDIANS   "\n" \
+                       "*parallels:  " DEF_PARALLELS   "\n" \
+                       "*tiles:      " DEF_TILES       "\n" \
+                       "*thickness:  " DEF_THICKNESS   "\n" \
+                       "*ballColor1: " DEF_BALL_COLOR1 "\n" \
+                       "*ballColor2: " DEF_BALL_COLOR2 "\n" \
+                       "*gridColor:  " DEF_GRID_COLOR  "\n" \
+                       "*shadowColor:" DEF_SHADOW_COLOR"\n" \
+                       ".background: " DEF_BACKGROUND  "\n" \
+
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+#include "xlockmore.h"
+#include "gltrackball.h"
+#include <ctype.h>
+
+#ifdef USE_GL /* whole file */
+
+#include <GL/glu.h>
+
+typedef struct { GLfloat x, y, z; } XYZ;
+
+typedef struct {
+  GLXContext *glx_context;
+  trackball_state *trackball;
+  Bool button_down_p;
+
+  GLuint ball_list;
+  double ball_x,   ball_y,   ball_z,   ball_th;
+  double ball_dx,  ball_dy,  ball_dz,  ball_dth;
+  double ball_ddx, ball_ddy, ball_ddz;
+
+  GLfloat ball_color1[4], ball_color2[4], grid_color[4];
+  GLfloat bg_color[4], shadow_color[4];
+  GLfloat lightpos[4];
+
+} boing_configuration;
+
+static boing_configuration *bps = NULL;
+
+static Bool spin;
+static Bool lighting_p;
+static Bool smooth_p;
+static Bool scanlines_p;
+static GLfloat speed;
+static int angle;
+static GLfloat ball_size;
+static unsigned int meridians;
+static unsigned int parallels;
+static unsigned int tiles;
+static GLfloat thickness;
+static char *ball_color1_str, *ball_color2_str, *grid_color_str,
+  *shadow_str, *bg_str;
+
+static XrmOptionDescRec opts[] = {
+  { "-spin",       ".spin",      XrmoptionNoArg,  "True"  },
+  { "+spin",       ".spin",      XrmoptionNoArg,  "False" },
+  { "-lighting",   ".lighting",  XrmoptionNoArg,  "True"  },
+  { "+lighting",   ".lighting",  XrmoptionNoArg,  "False" },
+  { "-smooth",     ".smooth",    XrmoptionNoArg,  "True"  },
+  { "+smooth",     ".smooth",    XrmoptionNoArg,  "False" },
+  { "-scanlines",  ".scanlines", XrmoptionNoArg,  "True"  },
+  { "+scanlines",  ".scanlines", XrmoptionNoArg,  "False" },
+  { "-speed",      ".speed",     XrmoptionSepArg, 0 },
+  { "-angle",      ".angle",     XrmoptionSepArg, 0 },
+  { "-size",       ".ballSize",  XrmoptionSepArg, 0 },
+  { "-meridians",  ".meridians", XrmoptionSepArg, 0 },
+  { "-parallels",  ".parallels", XrmoptionSepArg, 0 },
+  { "-tiles",      ".tiles",     XrmoptionSepArg, 0 },
+  { "-thickness",  ".thickness", XrmoptionSepArg, 0 },
+  { "-ball-color1",".ballColor1",XrmoptionSepArg, 0 },
+  { "-ball-color2",".ballColor2",XrmoptionSepArg, 0 },
+  { "-grid-color", ".gridColor", XrmoptionSepArg, 0 },
+  { "-shadow-color",".shadowColor",XrmoptionSepArg, 0 },
+};
+
+static argtype vars[] = {
+  {&spin,      "spin",      "Spin",       DEF_SPIN,      t_Bool},
+  {&lighting_p,"lighting",  "Lighting",   DEF_LIGHTING,  t_Bool},
+  {&smooth_p,  "smooth",    "Smooth",     DEF_SMOOTH,    t_Bool},
+  {&scanlines_p,"scanlines","Scanlines",  DEF_SCANLINES, t_Bool},
+  {&speed,     "speed",     "Speed",      DEF_SPEED,     t_Float},
+  {&angle,     "angle",     "Angle",      DEF_ANGLE,     t_Int},
+  {&ball_size, "ballSize",  "BallSize",   DEF_SIZE,      t_Float},
+  {&meridians, "meridians", "meridians",  DEF_MERIDIANS, t_Int},
+  {&parallels, "parallels", "parallels",  DEF_PARALLELS, t_Int},
+  {&tiles,     "tiles",     "Tiles",      DEF_TILES,     t_Int},
+  {&thickness, "thickness", "Thickness",  DEF_THICKNESS, t_Float},
+  {&ball_color1_str, "ballColor1", "BallColor1", DEF_BALL_COLOR1, t_String},
+  {&ball_color2_str, "ballColor2", "BallColor2", DEF_BALL_COLOR2, t_String},
+  {&grid_color_str,  "gridColor",  "GridColor",  DEF_GRID_COLOR,  t_String},
+  {&shadow_str,      "shadowColor","ShadowColor",DEF_SHADOW_COLOR,t_String},
+  {&bg_str,          "background", "Background", DEF_BACKGROUND,  t_String},
+};
+
+ModeSpecOpt sws_opts = {countof(opts), opts, countof(vars), vars, NULL};
+
+static void
+parse_color (ModeInfo *mi, const char *name, const char *s, GLfloat *a)
+{
+  XColor c;
+  a[3] = 1.0;  /* alpha */
+
+  if (! XParseColor (MI_DISPLAY(mi), MI_COLORMAP(mi), s, &c))
+    {
+      fprintf (stderr, "%s: can't parse %s color %s", progname, name, s);
+      exit (1);
+    }
+  a[0] = c.red   / 65536.0;
+  a[1] = c.green / 65536.0;
+  a[2] = c.blue  / 65536.0;
+}
+
+
+static void
+draw_grid (ModeInfo *mi)
+{
+  boing_configuration *bp = &bps[MI_SCREEN(mi)];
+  int x, y;
+  GLfloat t2  = (GLfloat) tiles / 2;
+  GLfloat s = 1.0 / (tiles + thickness);
+  GLfloat z = 0;
+
+  GLfloat lw = MI_HEIGHT(mi) * 0.06 * thickness;
+
+  glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, bp->grid_color);
+  glColor3fv (bp->grid_color);
+
+  glPushMatrix();
+  glScalef(s, s, s);
+  glTranslatef (-t2, -t2, 0);
+
+  glLineWidth (lw);
+  glBegin (GL_LINES);
+  for (y = 0; y <= tiles; y++)
+    {
+      glVertex3f (0,     y, z);
+      glVertex3f (tiles, y, z);
+      /*mi->polygon_count++;*/
+    }
+  for (x = 0; x <= tiles; x++)
+    {
+      glVertex3f (x, tiles, z);
+      glVertex3f (x, 0,     z);
+      /*mi->polygon_count++;*/
+    }
+
+  glEnd();
+  glPopMatrix();
+}
+
+
+static void
+draw_box (ModeInfo *mi)
+{
+  /* boing_configuration *bp = &bps[MI_SCREEN(mi)]; */
+  glPushMatrix();
+  glTranslatef (0, 0, -0.5);
+  glFrontFace (GL_CCW);
+  draw_grid (mi);
+  glPopMatrix();
+
+  glPushMatrix();
+  glRotatef (90, 1, 0, 0);
+  glTranslatef (0, 0, 0.5);
+  glFrontFace (GL_CW);
+  draw_grid (mi);
+  glPopMatrix();
+}
+
+
+static void
+draw_ball (ModeInfo *mi)
+{
+  boing_configuration *bp = &bps[MI_SCREEN(mi)];
+  int wire = MI_IS_WIREFRAME(mi);
+  int x, y;
+  int xx = meridians;
+  int yy = parallels;
+  int scale = (smooth_p ? 5 : 1);
+
+  if (lighting_p && !wire)
+    glEnable (GL_LIGHTING);
+
+  if (parallels < 3)
+    scale *= 2;
+
+  xx *= scale;
+  yy *= scale;
+
+  glFrontFace (GL_CW);
+
+  glPushMatrix();
+  glTranslatef (bp->ball_x, bp->ball_y, bp->ball_z);
+  glScalef (ball_size, ball_size, ball_size);
+  glRotatef (-angle,      0, 0, 1);
+  glRotatef (bp->ball_th, 0, 1, 0);
+
+  for (y = 0; y < yy; y++)
+    {
+      GLfloat thy0 = y     * (M_PI * 2) / (yy * 2) + M_PI_2;
+      GLfloat thy1 = (y+1) * (M_PI * 2) / (yy * 2) + M_PI_2;
+
+      for (x = 0; x < xx; x++)
+        {
+          GLfloat thx0 = x     * (M_PI * 2) / xx;
+          GLfloat thx1 = (x+1) * (M_PI * 2) / xx;
+          XYZ p;
+          Bool bgp = ((x/scale) & 1) ^ ((y/scale) & 1);
+
+          if (wire && bgp) continue;
+
+          glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE,
+                        (bgp ? bp->ball_color2 : bp->ball_color1));
+          glColor3fv (bgp ? bp->ball_color2 : bp->ball_color1);
+
+          glBegin (wire ? GL_LINE_LOOP : GL_QUADS);
+
+          if (!smooth_p)
+            {
+              p.x = cos((thy0+thy1)/2) * cos((thx0+thx1)/2);
+              p.y = sin((thy0+thy1)/2);
+              p.z = cos((thy0+thy1)/2) * sin((thx0+thx1)/2);
+              glNormal3f (-p.x, -p.y, -p.z);
+            }
+
+          p.x = cos(thy0) * cos(thx0) / 2;
+          p.y = sin(thy0)             / 2;
+          p.z = cos(thy0) * sin(thx0) / 2;
+          if (smooth_p)
+            glNormal3f (-p.x, -p.y, -p.z);
+          glVertex3f (p.x, p.y, p.z);
+
+          p.x = cos(thy1) * cos(thx0) / 2;
+          p.y = sin(thy1)             / 2;
+          p.z = cos(thy1) * sin(thx0) / 2;
+          if (smooth_p)
+            glNormal3f (-p.x, -p.y, -p.z);
+          glVertex3f (p.x, p.y, p.z);
+
+          p.x = cos(thy1) * cos(thx1) / 2;
+          p.y = sin(thy1)             / 2;
+          p.z = cos(thy1) * sin(thx1) / 2;
+          if (smooth_p)
+            glNormal3f (-p.x, -p.y, -p.z);
+          glVertex3f (p.x, p.y, p.z);
+
+          p.x = cos(thy0) * cos(thx1) / 2;
+          p.y = sin(thy0)             / 2;
+          p.z = cos(thy0) * sin(thx1) / 2;
+          if (smooth_p)
+            glNormal3f (-p.x, -p.y, -p.z);
+          glVertex3f (p.x, p.y, p.z);
+
+          glEnd ();
+          mi->polygon_count++;
+        }
+    }
+
+  glPopMatrix();
+
+  if (lighting_p && !wire)
+    glDisable(GL_LIGHTING);
+}
+
+
+static void
+draw_shadow (ModeInfo *mi)
+{
+  boing_configuration *bp = &bps[MI_SCREEN(mi)];
+  int wire = MI_IS_WIREFRAME(mi);
+  GLfloat xoff = 0.14;
+  GLfloat yoff = 0.07;
+  int y;
+  int yy = parallels;
+  int scale = (smooth_p ? 5 : 1);
+
+  if (lighting_p && !wire)
+    glEnable (GL_BLEND);
+
+  if (parallels < 3)
+    scale *= 2;
+
+  yy *= scale;
+
+  glPushMatrix();
+  glTranslatef (bp->ball_x + xoff, bp->ball_y + yoff, -0.49);
+  glScalef (ball_size, ball_size, ball_size);
+  glRotatef (-angle, 0, 0, 1);
+
+  glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, bp->shadow_color);
+  glColor4fv (bp->shadow_color);
+
+  glFrontFace (GL_CCW);
+  glNormal3f (0, 0, 1);
+  glBegin (wire ? GL_LINE_LOOP : GL_TRIANGLE_FAN);
+  if (!wire) glVertex3f (0, 0, 0);
+
+  for (y = 0; y < yy*2+1; y++)
+    {
+      GLfloat thy0 = y * (M_PI * 2) / (yy * 2) + M_PI_2;
+      glVertex3f (cos(thy0) / 2, sin(thy0) / 2, 0);
+      mi->polygon_count++;
+    }
+
+  glEnd ();
+
+  glPopMatrix();
+
+  if (lighting_p && !wire)
+    glDisable (GL_BLEND);
+}
+
+
+static void
+draw_scanlines (ModeInfo *mi)
+{
+  /* boing_configuration *bp = &bps[MI_SCREEN(mi)]; */
+  int wire = MI_IS_WIREFRAME(mi);
+  int w = MI_WIDTH(mi);
+  int h = MI_HEIGHT(mi);
+
+  if (h <= 300) return;
+
+  if (!wire)
+    {
+      glEnable (GL_BLEND);
+      glDisable (GL_DEPTH_TEST);
+    }
+
+  glMatrixMode(GL_PROJECTION);
+  glPushMatrix();
+  {
+    glLoadIdentity();
+    glMatrixMode(GL_MODELVIEW);
+    glPushMatrix();
+    {
+      int lh, ls;
+      int y;
+      glLoadIdentity();
+      gluOrtho2D (0, w, 0, h);
+
+      if      (h > 500) lh = 4, ls = 4;
+      else if (h > 300) lh = 2, ls = 1;
+      else              lh = 1, ls = 1;
+
+      if (lh == 1)
+        glDisable (GL_BLEND);
+
+      glLineWidth (lh);
+      glColor4f (0, 0, 0, 0.3);
+
+      glBegin(GL_LINES);
+      for (y = 0; y < h; y += lh + ls)
+        {
+          glVertex3f (0, y, 0);
+          glVertex3f (w, y, 0);
+        }
+      glEnd();
+    }
+    glPopMatrix();
+  }
+  glMatrixMode(GL_PROJECTION);
+  glPopMatrix();
+  glMatrixMode(GL_MODELVIEW);
+
+  if (!wire)
+    {
+      glDisable (GL_BLEND);
+      glEnable (GL_DEPTH_TEST);
+    }
+}
+
+
+
+static void
+tick_physics (ModeInfo *mi)
+{
+  boing_configuration *bp = &bps[MI_SCREEN(mi)];
+  GLfloat s2 = ball_size / 2;
+  GLfloat max = 0.5 - s2;
+  GLfloat min = -max;
+
+  bp->ball_th += bp->ball_dth;
+  while (bp->ball_th > 360) bp->ball_th -= 360;
+  while (bp->ball_th < 0)   bp->ball_th += 360;
+
+  bp->ball_dx += bp->ball_ddx;
+  bp->ball_x  += bp->ball_dx;
+  if      (bp->ball_x < min) bp->ball_x = min, bp->ball_dx = -bp->ball_dx,
+    bp->ball_dth = -bp->ball_dth,
+    bp->ball_dx += (frand(speed/2) - speed);
+  else if (bp->ball_x > max) bp->ball_x = max, bp->ball_dx = -bp->ball_dx,
+    bp->ball_dth = -bp->ball_dth,
+    bp->ball_dx += (frand(speed/2) - speed);
+
+  bp->ball_dy += bp->ball_ddy;
+  bp->ball_y  += bp->ball_dy;
+  if      (bp->ball_y < min) bp->ball_y = min, bp->ball_dy = -bp->ball_dy;
+  else if (bp->ball_y > max) bp->ball_y = max, bp->ball_dy = -bp->ball_dy;
+
+  bp->ball_dz += bp->ball_ddz;
+  bp->ball_z  += bp->ball_dz;
+  if      (bp->ball_z < min) bp->ball_z = min, bp->ball_dz = -bp->ball_dz;
+  else if (bp->ball_z > max) bp->ball_z = max, bp->ball_dz = -bp->ball_dz;
+}
+
+
+
+/* Window management, etc
+ */
+void
+reshape_boing (ModeInfo *mi, int width, int height)
+{
+  GLfloat h = (GLfloat) height / (GLfloat) width;
+
+  h *= 4.0 / 3.0;   /* Back in the caveman days we couldn't even afford
+                       square pixels! */
+
+  glViewport (0, 0, (GLint) width, (GLint) height);
+
+  glMatrixMode(GL_PROJECTION);
+  glLoadIdentity();
+  gluPerspective (8.0, 1/h, 1.0, 10.0);
+
+  glMatrixMode(GL_MODELVIEW);
+  glLoadIdentity();
+  gluLookAt (0.0, 0.0, 8.0,
+             0.0, 0.0, 0.0,
+             0.0, 1.0, 0.0);
+
+  glClear(GL_COLOR_BUFFER_BIT);
+}
+
+
+Bool
+boing_handle_event (ModeInfo *mi, XEvent *event)
+{
+  boing_configuration *bp = &bps[MI_SCREEN(mi)];
+
+  if (event->xany.type == ButtonPress &&
+      event->xbutton.button == Button1)
+    {
+      bp->button_down_p = True;
+      gltrackball_start (bp->trackball,
+                         event->xbutton.x, event->xbutton.y,
+                         MI_WIDTH (mi), MI_HEIGHT (mi));
+      return True;
+    }
+  else if (event->xany.type == ButtonRelease &&
+           event->xbutton.button == Button1)
+    {
+      bp->button_down_p = False;
+      return True;
+    }
+  else if (event->xany.type == ButtonPress &&
+           (event->xbutton.button == Button4 ||
+            event->xbutton.button == Button5))
+    {
+      gltrackball_mousewheel (bp->trackball, event->xbutton.button, 10,
+                              !!event->xbutton.state);
+      return True;
+    }
+  else if (event->xany.type == MotionNotify &&
+           bp->button_down_p)
+    {
+      gltrackball_track (bp->trackball,
+                         event->xmotion.x, event->xmotion.y,
+                         MI_WIDTH (mi), MI_HEIGHT (mi));
+      return True;
+    }
+
+  return False;
+}
+
+
+void 
+init_boing (ModeInfo *mi)
+{
+  boing_configuration *bp;
+  int wire = MI_IS_WIREFRAME(mi);
+
+  if (!bps) {
+    bps = (boing_configuration *)
+      calloc (MI_NUM_SCREENS(mi), sizeof (boing_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);
+
+  if (tiles < 1) tiles = 1;
+
+  if (smooth_p)
+    {
+      if (meridians < 1) meridians = 1;
+      if (parallels < 1) parallels = 1;
+    }
+  else
+    {
+      if (meridians < 3) meridians = 3;
+      if (parallels < 2) parallels = 2;
+    }
+
+  if (meridians > 1 && meridians & 1) meridians++;  /* odd numbers look bad */
+
+
+  if (thickness <= 0) thickness = 0.001;
+  else if (thickness > 1) thickness = 1;
+
+  reshape_boing (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+
+  parse_color (mi, "ballColor1",  ball_color1_str,  bp->ball_color1);
+  parse_color (mi, "ballColor2",  ball_color2_str,  bp->ball_color2);
+  parse_color (mi, "gridColor",   grid_color_str,   bp->grid_color);
+  parse_color (mi, "shadowColor", shadow_str,       bp->shadow_color);
+  parse_color (mi, "background",  bg_str,           bp->bg_color);
+
+  bp->shadow_color[3] = 0.9;
+
+  glClearColor (bp->bg_color[0], bp->bg_color[1], bp->bg_color[2], 1);
+
+  if (!wire)
+    {
+      glEnable(GL_DEPTH_TEST);
+      glEnable(GL_CULL_FACE);
+    }
+
+  bp->lightpos[0] = 0.5;
+  bp->lightpos[1] = 0.5;
+  bp->lightpos[2] = -1;
+  bp->lightpos[3] = 0;
+
+  if (lighting_p && !wire)
+    {
+      GLfloat amb[4] = {0, 0, 0, 1};
+      GLfloat dif[4] = {1, 1, 1, 1};
+      GLfloat spc[4] = {1, 1, 1, 1};
+      glEnable(GL_LIGHT0);
+      glLightfv(GL_LIGHT0, GL_AMBIENT,  amb);
+      glLightfv(GL_LIGHT0, GL_DIFFUSE,  dif);
+      glLightfv(GL_LIGHT0, GL_SPECULAR, spc);
+    }
+
+  glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+
+  speed = speed / 800.0;
+
+  bp->ball_dth = (spin ? -speed * 7 * 360 : 0);
+
+  bp->ball_x   = 0.5 - ((ball_size/2) + frand(1-ball_size));
+  bp->ball_y   = 0.2;
+  bp->ball_dx  = speed * 6 + frand(speed);
+  bp->ball_ddy = -speed;
+
+  bp->ball_dz  = speed * 6 + frand(speed);
+
+  bp->trackball = gltrackball_init ();
+}
+
+
+void
+draw_boing (ModeInfo *mi)
+{
+  boing_configuration *bp = &bps[MI_SCREEN(mi)];
+  Display *dpy = MI_DISPLAY(mi);
+  Window window = MI_WINDOW(mi);
+
+  if (!bp->glx_context)
+    return;
+
+  mi->polygon_count = 0;
+
+  glShadeModel(GL_SMOOTH);
+
+  glEnable(GL_NORMALIZE);
+  glEnable(GL_CULL_FACE);
+  glEnable (GL_DEPTH_TEST);
+
+  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+  if (! bp->button_down_p)
+    tick_physics (mi);
+
+  glPushMatrix ();
+  gltrackball_rotate (bp->trackball);
+
+  glLightfv (GL_LIGHT0, GL_POSITION, bp->lightpos);
+
+  draw_box (mi);
+  draw_shadow (mi);
+  draw_ball (mi);
+  if (scanlines_p)
+    draw_scanlines (mi);
+
+  glPopMatrix ();
+
+  if (mi->fps_p) do_fps (mi);
+  glFinish();
+
+  glXSwapBuffers(dpy, window);
+}
+
+#endif /* USE_GL */
diff --git a/hacks/glx/boing.man b/hacks/glx/boing.man
new file mode 100644 (file)
index 0000000..bb34d46
--- /dev/null
@@ -0,0 +1,107 @@
+.TH XScreenSaver 1 "30-Oct-99" "X Version 11"
+.SH NAME
+boing - draws a bouncing ball like the ancient Amiga demo
+.SH SYNOPSIS
+.B boing
+[\-display \fIhost:display.screen\fP] [\-window] [\-root] [\-install]
+[\-visual \fIvisual\fP] 
+[\-delay \fIusecs\fP] 
+[\-smooth]
+[\-lighting]
+[\-scanlines]
+[\-speed]
+[\-no\-spin]
+[\-angle \fIdegrees\fP]
+[\-size \fIratio\fP]
+[\-parallels \fIn\fP]
+[\-meridians \fIn\fP]
+[\-wireframe]
+[\-fps]
+.SH DESCRIPTION
+The \fIboing\fP program draws a bouncing checkered ball on a grid.
+
+This is a clone of the first graphics demo for the Amiga 1000, which
+was written by Dale Luck and RJ Mical during a break at the 1984
+Consumer Electronics Show (or so the legend goes.)  The boing ball was
+briefly the official logo of Amiga Inc., until they were bought by
+Commodore later that year.
+
+With no arguments, this program looks a lot like the original Amiga
+demo. With "-smooth -lighting", it looks... less old.
+.SH OPTIONS
+.I boing
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window.  This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP\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 frames of the animation, in microseconds: default 15000.
+.TP 8
+.B \-smooth
+Draw a smooth sphere instead of a faceted polyhedron.
+.TP 8
+.B \-lighting
+Do shaded lighting instead of flat colors.
+.TP 8
+.B \-scanlines
+If the window is large enough, draw horizontal lines to simulate the
+scanlines on a low resolution monitor.
+.TP 8
+.B \-speed \fIratio\fP
+Change the animation speed; 0.5 to go half as fast, 2.0 to go twice as fast.
+.TP 8
+.B \-no\-spin
+Don't rotate the ball.
+.TP 8
+.B \-angle \fIdegrees\fP
+The jaunty angle at which the ball sits.  Default 15 degrees.
+.TP 8
+.B \-size \fIratio\fP
+How big the ball is; default 0.5 meaning about half the size of the window.
+.TP 8
+.B \-parallels \fIn\fP
+.B \-meridians \fIn\fP
+The pattern of rectangles on the ball.  Default 8x16.
+.TP 8
+.B \-wireframe
+Look crummy.
+.TP 8
+.B \-fps
+Display a running tally of how many frames per second are being rendered.
+In conjunction with \fB\-delay 0\fP, this can be a useful benchmark of
+your GL performance.
+.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 bsod (1),
+.BR pong (1),
+.BR xscreensaver (1),
+.BR X (1)
+.SH COPYRIGHT
+Copyright \(co 2005 by Jamie Zawinski.  Permission to use, copy, modify, 
+distribute, and sell this software and its documentation for any purpose is 
+hereby granted without fee, provided that the above copyright notice appear 
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation.  No representations are made about the 
+suitability of this software for any purpose.  It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Jamie Zawinski <jwz@jwz.org>, 19-Feb-2005.
index 1c9e92bcf95bf75b37807aaa41d2cae57bd2a0ab..71bb56cbf6fcd190e449a3500661a2918652a1ba 100644 (file)
@@ -196,7 +196,7 @@ cow_handle_event (ModeInfo *mi, XEvent *event)
   cow_configuration *bp = &bps[MI_SCREEN(mi)];
 
   if (event->xany.type == ButtonPress &&
   cow_configuration *bp = &bps[MI_SCREEN(mi)];
 
   if (event->xany.type == ButtonPress &&
-      event->xbutton.button & Button1)
+      event->xbutton.button == Button1)
     {
       bp->button_down_p = True;
       gltrackball_start (bp->trackball,
     {
       bp->button_down_p = True;
       gltrackball_start (bp->trackball,
@@ -205,11 +205,19 @@ cow_handle_event (ModeInfo *mi, XEvent *event)
       return True;
     }
   else if (event->xany.type == ButtonRelease &&
       return True;
     }
   else if (event->xany.type == ButtonRelease &&
-           event->xbutton.button & Button1)
+           event->xbutton.button == Button1)
     {
       bp->button_down_p = False;
       return True;
     }
     {
       bp->button_down_p = False;
       return True;
     }
+  else if (event->xany.type == ButtonPress &&
+           (event->xbutton.button == Button4 ||
+            event->xbutton.button == Button5))
+    {
+      gltrackball_mousewheel (bp->trackball, event->xbutton.button, 10,
+                              !event->xbutton.state);
+      return True;
+    }
   else if (event->xany.type == MotionNotify &&
            bp->button_down_p)
     {
   else if (event->xany.type == MotionNotify &&
            bp->button_down_p)
     {
diff --git a/hacks/glx/carousel.c b/hacks/glx/carousel.c
new file mode 100644 (file)
index 0000000..192a997
--- /dev/null
@@ -0,0 +1,901 @@
+/* carousel, Copyright (c) 2005 Jamie Zawinski <jwz@jwz.org>
+ * Loads a sequence of images and rotates them around.
+ *
+ * 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.
+ *
+ * Created: 21-Feb-2005
+ */
+
+#include <X11/Intrinsic.h>
+
+# define PROGCLASS "Carousel"
+# define HACK_INIT init_carousel
+# define HACK_DRAW draw_carousel
+# define HACK_RESHAPE reshape_carousel
+# define HACK_HANDLE_EVENT carousel_handle_event
+# define EVENT_MASK        PointerMotionMask
+# define carousel_opts xlockmore_opts
+
+# define DEF_SPEED          "1.0"
+# define DEF_DURATION      "20"
+# define DEF_TITLES         "True"
+# define DEF_ZOOM           "True"
+# define DEF_TILT           "XY"
+# define DEF_MIPMAP         "True"
+# define DEF_DEBUG          "False"
+
+#define DEF_FONT "-*-times-bold-r-normal-*-180-*"
+
+#define DEFAULTS  "*count:           7                    \n" \
+                 "*delay:           10000                \n" \
+                 "*speed:         " DEF_SPEED           "\n" \
+                 "*duration:      " DEF_DURATION        "\n" \
+                 "*titles:        " DEF_TITLES          "\n" \
+                 "*zoom:          " DEF_ZOOM            "\n" \
+                 "*tilt:          " DEF_TILT            "\n" \
+                 "*debug:         " DEF_DEBUG           "\n" \
+                 "*mipmap:        " DEF_MIPMAP          "\n" \
+                 "*wireframe:       False                \n" \
+                  "*showFPS:         False                \n" \
+                 "*fpsSolid:        True                 \n" \
+                 "*useSHM:          True                 \n" \
+                 "*font:          " DEF_FONT            "\n" \
+                  "*desktopGrabber:  xscreensaver-getimage -no-desktop %s\n"
+
+# include "xlockmore.h"
+
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+#ifdef USE_GL
+
+#include <GL/glu.h>
+#include <math.h>
+#include <sys/time.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include "rotator.h"
+#include "gltrackball.h"
+#include "grab-ximage.h"
+#include "texfont.h"
+
+extern XtAppContext app;
+
+typedef struct {
+  double x, y, w, h;
+} rect;
+
+typedef enum { NORMAL, OUT, LOADING, IN, DEAD } fade_mode;
+static int fade_ticks = 60;
+
+typedef struct {
+  ModeInfo *mi;
+
+  char *title;                 /* the filename of this image */
+  int w, h;                    /* size in pixels of the image */
+  int tw, th;                  /* size in pixels of the texture */
+  XRectangle geom;             /* where in the image the bits are */
+  GLuint texid;                        /* which texture contains the image */
+
+  GLfloat r, theta;            /* radius and rotation on the tube */
+  rotator *rot;                        /* for zoomery */
+  Bool from_top_p;             /* whether this image drops in or rises up */
+  time_t expires;              /* when this image should be replaced */
+  fade_mode mode;              /* in/out animation state */
+  int mode_tick;
+  Bool loaded_p;               /* whether background load is done */
+
+} image;
+
+
+typedef struct {
+  GLXContext *glx_context;
+  rotator *rot;
+  trackball_state *trackball;
+  Bool button_down_p;
+  time_t button_down_time;
+
+  int nimages;                 /* how many images are loaded */
+  int images_size;
+  image **images;              /* pointers to the images */
+
+  texture_font_data *texfont;
+
+  fade_mode mode;
+  int mode_tick;
+
+} carousel_state;
+
+static carousel_state *sss = NULL;
+
+
+/* Command-line arguments
+ */
+static GLfloat speed;      /* animation speed scale factor */
+static int duration;       /* reload images after this long */
+static Bool mipmap_p;      /* Use mipmaps instead of single textures. */
+static Bool titles_p;      /* Display image titles. */
+static Bool zoom_p;        /* Throb the images in and out as they spin. */
+static char *tilt_str;
+static Bool tilt_x_p;      /* Tilt axis towards the viewer */
+static Bool tilt_y_p;      /* Tilt axis side to side */
+static Bool debug_p;       /* Be loud and do weird things. */
+
+
+static XrmOptionDescRec opts[] = {
+  {"-zoom",         ".zoom",          XrmoptionNoArg, "True"  },
+  {"-no-zoom",      ".zoom",          XrmoptionNoArg, "False"  },
+  {"-tilt",         ".tilt",          XrmoptionSepArg, 0  },
+  {"-no-tilt",      ".tilt",          XrmoptionNoArg, ""  },
+  {"-titles",       ".titles",        XrmoptionNoArg, "True"  },
+  {"-no-titles",    ".titles",        XrmoptionNoArg, "True"  },
+  {"-mipmaps",      ".mipmap",        XrmoptionNoArg, "True"  },
+  {"-no-mipmaps",   ".mipmap",        XrmoptionNoArg, "False" },
+  {"-duration",            ".duration",      XrmoptionSepArg, 0 },
+  {"-debug",        ".debug",         XrmoptionNoArg, "True"  },
+  {"-font",         ".font",          XrmoptionSepArg, 0 },
+  {"-speed",        ".speed",         XrmoptionSepArg, 0 },
+};
+
+static argtype vars[] = {
+  { &mipmap_p,      "mipmap",       "Mipmap",       DEF_MIPMAP,      t_Bool},
+  { &debug_p,       "debug",        "Debug",        DEF_DEBUG,       t_Bool},
+  { &titles_p,      "titles",       "Titles",       DEF_TITLES,      t_Bool},
+  { &zoom_p,        "zoom",         "Zoom",         DEF_ZOOM,        t_Bool},
+  { &tilt_str,      "tilt",         "Tilt",         DEF_TILT,        t_String},
+  { &speed,         "speed",        "Speed",        DEF_SPEED,       t_Float},
+  { &duration,      "duration",     "Duration",     DEF_DURATION,    t_Int},
+};
+
+ModeSpecOpt carousel_opts = {countof(opts), opts, countof(vars), vars, NULL};
+
+
+/* Allocates an image structure and stores it in the list.
+ */
+static image *
+alloc_image (ModeInfo *mi)
+{
+  carousel_state *ss = &sss[MI_SCREEN(mi)];
+  image *img = (image *) calloc (1, sizeof (*img));
+
+  img->mi = mi;
+  img->rot = make_rotator (0, 0, 0, 0, 0.04 * frand(1.0) * speed, False);
+
+  glGenTextures (1, &img->texid);
+  if (img->texid <= 0) abort();
+
+  if (ss->images_size <= ss->nimages)
+    {
+      ss->images_size = (ss->images_size * 1.2) + ss->nimages;
+      ss->images = (image **)
+        realloc (ss->images, ss->images_size * sizeof(*ss->images));
+      if (! ss->images)
+        {
+          fprintf (stderr, "%s: out of memory (%d images)\n",
+                   progname, ss->images_size);
+          exit (1);
+        }
+    }
+
+  ss->images[ss->nimages++] = img;
+
+  return img;
+}
+
+
+static void image_loaded_cb (const char *filename, XRectangle *geom,
+                             int image_width, int image_height,
+                             int texture_width, int texture_height,
+                             void *closure);
+
+
+/* Load a new file into the given image struct.
+ */
+static void
+load_image (ModeInfo *mi, image *img, Bool force_sync_p)
+{
+  carousel_state *ss = &sss[MI_SCREEN(mi)];
+  int wire = MI_IS_WIREFRAME(mi);
+  Bool async_p = !force_sync_p;
+  int i;
+
+  if (debug_p && !wire && img->w != 0)
+    fprintf (stderr, "%s:  dropped %4d x %-4d  %4d x %-4d  \"%s\"\n",
+             progname, img->geom.width, img->geom.height, img->tw, img->th,
+             (img->title ? img->title : "(null)"));
+
+  if (img->title)
+    {
+      free (img->title);
+      img->title = 0;
+    }
+
+  img->mode = LOADING;
+
+  if (wire)
+    image_loaded_cb (0, 0, 0, 0, 0, 0, img);
+  else if (async_p)
+    screen_to_texture_async (mi->xgwa.screen, mi->window,
+                             MI_WIDTH(mi)/2-1,
+                             MI_HEIGHT(mi)/2-1,
+                             mipmap_p, img->texid, image_loaded_cb, img);
+  else
+    {
+      char *filename = 0;
+      XRectangle geom;
+      int iw=0, ih=0, tw=0, th=0;
+      time_t start = time((time_t *) 0);
+      time_t end;
+
+      glBindTexture (GL_TEXTURE_2D, img->texid);
+      if (! screen_to_texture (mi->xgwa.screen, mi->window,
+                               MI_WIDTH(mi)/2-1,
+                               MI_HEIGHT(mi)/2-1,
+                               mipmap_p, &filename, &geom, &iw, &ih, &tw, &th))
+        exit(1);
+      image_loaded_cb (filename, &geom, iw, ih, tw, th, img);
+      if (filename) free (filename);
+
+      /* Push the expire times of all images forward by the amount of time
+         it took to load *this* image, so that we don't count image-loading
+         time against image duration.
+      */
+      end = time((time_t *) 0);
+      for (i = 0; i < ss->nimages; i++)
+        ss->images[i]->expires += end - start;
+    }
+}
+
+
+/* Callback that tells us that the texture has been loaded.
+ */
+static void
+image_loaded_cb (const char *filename, XRectangle *geom,
+                 int image_width, int image_height,
+                 int texture_width, int texture_height,
+                 void *closure)
+{
+  image *img = (image *) closure;
+  ModeInfo *mi = img->mi;
+  /* slideshow_state *ss = &sss[MI_SCREEN(mi)]; */
+  int wire = MI_IS_WIREFRAME(mi);
+
+  if (wire)
+    {
+      img->w = MI_WIDTH (mi) * (0.5 + frand (1.0));
+      img->h = MI_HEIGHT (mi);
+      img->geom.width  = img->w;
+      img->geom.height = img->h;
+      goto DONE;
+    }
+
+  if (image_width == 0 || image_height == 0)
+    exit (1);
+
+  glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+  glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
+                   mipmap_p ? GL_LINEAR_MIPMAP_LINEAR : GL_LINEAR);
+
+  glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
+  glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
+
+  img->w  = image_width;
+  img->h  = image_height;
+  img->tw = texture_width;
+  img->th = texture_height;
+  img->geom = *geom;
+  img->title = (filename ? strdup (filename) : 0);
+
+  if (img->title)   /* strip filename to part after last /. */
+    {
+      char *s = strrchr (img->title, '/');
+      if (s) strcpy (img->title, s+1);
+    }
+
+  if (debug_p)
+    fprintf (stderr, "%s:   loaded %4d x %-4d  %4d x %-4d  \"%s\"\n",
+             progname,
+             img->geom.width, img->geom.height, img->tw, img->th,
+             (img->title ? img->title : "(null)"));
+
+ DONE:
+
+  /* This image expires N seconds after it finished loading. */
+  img->expires = time((time_t *) 0) + (duration * MI_COUNT(mi));
+
+  img->mode = IN;
+  img->mode_tick = fade_ticks * speed;
+  img->from_top_p = random() & 1;
+  img->loaded_p = True;
+}
+
+
+
+
+/* Free the image and texture, after nobody is referencing it.
+ */
+#if 0
+static void
+destroy_image (ModeInfo *mi, image *img)
+{
+  carousel_state *ss = &sss[MI_SCREEN(mi)];
+  Bool freed_p = False;
+  int i;
+
+  if (!img) abort();
+  if (img->texid <= 0) abort();
+
+  for (i = 0; i < ss->nimages; i++)            /* unlink it from the list */
+    if (ss->images[i] == img)
+      {
+        int j;
+        for (j = i; j < ss->nimages-1; j++)    /* pull remainder forward */
+          ss->images[j] = ss->images[j+1];
+        ss->images[j] = 0;
+        ss->nimages--;
+        freed_p = True;
+        break;
+      }
+
+  if (!freed_p) abort();
+
+  if (debug_p)
+    fprintf (stderr, "%s: unloaded %4d x %-4d  %4d x %-4d  \"%s\"\n",
+             progname,
+             img->geom.width, img->geom.height, img->tw, img->th,
+             (img->title ? img->title : "(null)"));
+
+  if (img->title) free (img->title);
+  glDeleteTextures (1, &img->texid);
+  free (img);
+}
+#endif
+
+
+static void loading_msg (ModeInfo *mi, int n);
+
+static void
+load_initial_images (ModeInfo *mi)
+{
+  carousel_state *ss = &sss[MI_SCREEN(mi)];
+  int i;
+  time_t now;
+  Bool async_p = True;   /* computed after first image */
+
+  for (i = 0; i < MI_COUNT(mi); i++)
+    {
+      image *img;
+      loading_msg (mi, (async_p ? 0 : i));
+      img = alloc_image (mi);
+      img->r = 1.0;
+      img->theta = i * 360.0 / MI_COUNT(mi);
+
+      load_image (mi, img, True);
+      if (i == 0)
+        async_p = !img->loaded_p;
+    }
+
+  /* Wait for the images to load...
+   */
+  while (1)
+    {
+      int j;
+      int count = 0;
+
+      for (j = 0; j < MI_COUNT(mi); j++)
+        if (ss->images[j]->loaded_p)
+          count++;
+      if (count == MI_COUNT(mi))
+        break;
+      loading_msg (mi, count);
+
+      usleep (100000);         /* check every 1/10th sec */
+      if (i++ > 600) abort();  /* if a minute has passed, we're broken */
+
+      while (XtAppPending (app) & (XtIMTimer|XtIMAlternateInput))
+        XtAppProcessEvent (app, XtIMTimer|XtIMAlternateInput);
+    }
+
+  /* Stagger expire times of the first batch of images.
+   */
+  now = time((time_t *) 0);
+  for (i = 0; i < ss->nimages; i++)
+    {
+      image *img = ss->images[i];
+      img->expires = now + (duration * (i + 1));
+      img->mode = NORMAL;
+    }
+
+  /* Instead of always going clockwise, shuffle the expire times
+     of the images so that they drop out in a random order.
+  */
+  for (i = 0; i < ss->nimages; i++)
+    {
+      image *img1 = ss->images[i];
+      image *img2 = ss->images[random() % ss->nimages];
+      time_t swap = img1->expires;
+      img1->expires = img2->expires;
+      img2->expires = swap;
+    }
+}
+
+
+void
+reshape_carousel (ModeInfo *mi, int width, int height)
+{
+  GLfloat h = (GLfloat) height / (GLfloat) width;
+
+  glViewport (0, 0, (GLint) width, (GLint) height);
+
+  glMatrixMode(GL_PROJECTION);
+  glLoadIdentity();
+  gluPerspective (60.0, 1/h, 1.0, 8.0);
+
+  glMatrixMode(GL_MODELVIEW);
+  glLoadIdentity();
+  gluLookAt( 0.0, 0.0, 2.6,
+             0.0, 0.0, 0.0,
+             0.0, 1.0, 0.0);
+
+  glClear(GL_COLOR_BUFFER_BIT);
+}
+
+
+Bool
+carousel_handle_event (ModeInfo *mi, XEvent *event)
+{
+  carousel_state *ss = &sss[MI_SCREEN(mi)];
+
+  if (event->xany.type == ButtonPress &&
+      event->xbutton.button == Button1)
+    {
+      if (! ss->button_down_p)
+        ss->button_down_time = time((time_t *) 0);
+      ss->button_down_p = True;
+      gltrackball_start (ss->trackball,
+                         event->xbutton.x, event->xbutton.y,
+                         MI_WIDTH (mi), MI_HEIGHT (mi));
+      return True;
+    }
+  else if (event->xany.type == ButtonRelease &&
+           event->xbutton.button == Button1)
+    {
+      if (ss->button_down_p)
+        {
+          /* Add the time the mouse was held to the expire times of all
+             images, so that mouse-dragging doesn't count against
+             image expiration.
+           */
+          int secs = time((time_t *) 0) - ss->button_down_time;
+          int i;
+          for (i = 0; i < ss->nimages; i++)
+            ss->images[i]->expires += secs;
+        }
+      ss->button_down_p = False;
+      return True;
+    }
+  else if (event->xany.type == ButtonPress &&
+           (event->xbutton.button == Button4 ||
+            event->xbutton.button == Button5))
+    {
+      gltrackball_mousewheel (ss->trackball, event->xbutton.button, 5,
+                              !event->xbutton.state);
+      return True;
+    }
+  else if (event->xany.type == MotionNotify &&
+           ss->button_down_p)
+    {
+      gltrackball_track (ss->trackball,
+                         event->xmotion.x, event->xmotion.y,
+                         MI_WIDTH (mi), MI_HEIGHT (mi));
+      return True;
+    }
+
+  return False;
+}
+
+
+/* Kludge to add "-v" to invocation of "xscreensaver-getimage" in -debug mode
+ */
+static void
+hack_resources (void)
+{
+#if 0
+  char *res = "desktopGrabber";
+  char *val = get_string_resource (res, "DesktopGrabber");
+  char buf1[255];
+  char buf2[255];
+  XrmValue value;
+  sprintf (buf1, "%.100s.%.100s", progclass, res);
+  sprintf (buf2, "%.200s -v", val);
+  value.addr = buf2;
+  value.size = strlen(buf2);
+  XrmPutResource (&db, buf1, "String", &value);
+#endif
+}
+
+
+static void
+loading_msg (ModeInfo *mi, int n)
+{
+  carousel_state *ss = &sss[MI_SCREEN(mi)];
+  int wire = MI_IS_WIREFRAME(mi);
+  char text[100];
+  static int sw=0, sh=0;
+  GLfloat scale;
+
+  if (wire) return;
+
+  if (n == 0)
+    sprintf (text, "Loading images...");
+  else
+    sprintf (text, "Loading images...  (%d%%)",
+             (int) (n * 100 / MI_COUNT(mi)));
+
+  if (sw == 0)    /* only do this once, so that the string doesn't move. */
+    sw = texture_string_width (ss->texfont, text, &sh);
+
+  scale = sh / (GLfloat) MI_HEIGHT(mi);
+
+  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+  glMatrixMode(GL_PROJECTION);
+  glPushMatrix();
+  glLoadIdentity();
+
+  glMatrixMode(GL_MODELVIEW);
+  glPushMatrix();
+  glLoadIdentity();
+  gluOrtho2D(0, MI_WIDTH(mi), 0, MI_HEIGHT(mi));
+
+  glTranslatef ((MI_WIDTH(mi)  - sw) / 2,
+                (MI_HEIGHT(mi) - sh) / 2,
+                0);
+  glColor3f (1, 1, 0);
+  glEnable (GL_TEXTURE_2D);
+  print_texture_string (ss->texfont, text);
+  glPopMatrix();
+
+  glMatrixMode(GL_PROJECTION);
+  glPopMatrix();
+
+  glMatrixMode(GL_MODELVIEW);
+
+  glFinish();
+  glXSwapBuffers (MI_DISPLAY (mi), MI_WINDOW(mi));
+}
+
+
+void
+init_carousel (ModeInfo *mi)
+{
+  int screen = MI_SCREEN(mi);
+  carousel_state *ss;
+  int wire = MI_IS_WIREFRAME(mi);
+  
+  if (sss == NULL) {
+    if ((sss = (carousel_state *)
+         calloc (MI_NUM_SCREENS(mi), sizeof(carousel_state))) == NULL)
+      return;
+  }
+  ss = &sss[screen];
+
+  if ((ss->glx_context = init_GL(mi)) != NULL) {
+    reshape_carousel (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+  } else {
+    MI_CLEARWINDOW(mi);
+  }
+
+  if (!tilt_str || !*tilt_str)
+    ;
+  else if (!strcasecmp (tilt_str, "X"))
+    tilt_x_p = 1;
+  else if (!strcasecmp (tilt_str, "Y"))
+    tilt_y_p = 1;
+  else if (!strcasecmp (tilt_str, "XY"))
+    tilt_x_p = tilt_y_p = 1;
+  else
+    {
+      fprintf (stderr, "%s: tilt must be 'X', 'Y', 'XY' or '', not '%s'\n",
+               progname, tilt_str);
+      exit (1);
+    }
+
+  {
+    double spin_speed   = speed * 0.2;    /* rotation of tube around axis */
+    double spin_accel   = speed * 0.1;
+    double wander_speed = speed * 0.001;  /* tilting of axis */
+
+    spin_speed   *= 0.9 + frand(0.2);
+    wander_speed *= 0.9 + frand(0.2);
+
+    ss->rot = make_rotator (spin_speed, spin_speed, spin_speed,
+                            spin_accel, wander_speed, True);
+
+    ss->trackball = gltrackball_init ();
+  }
+
+  glDisable (GL_LIGHTING);
+  glEnable (GL_DEPTH_TEST);
+  glDisable (GL_CULL_FACE);
+
+  if (! wire)
+    {
+      glShadeModel (GL_SMOOTH);
+      glEnable (GL_LINE_SMOOTH);
+      /* This gives us a transparent diagonal slice through each image! */
+      /* glEnable (GL_POLYGON_SMOOTH); */
+      glHint (GL_LINE_SMOOTH_HINT, GL_NICEST);
+      glEnable (GL_BLEND);
+      glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+      glEnable (GL_ALPHA_TEST);
+
+      glEnable (GL_POLYGON_OFFSET_FILL);
+      glPolygonOffset (1.0, 1.0);
+
+    }
+
+  ss->texfont = load_texture_font (MI_DISPLAY(mi), "font");
+
+  if (debug_p)
+    hack_resources();
+
+  ss->nimages = 0;
+  ss->images_size = 10;
+  ss->images = (image **) calloc (1, ss->images_size * sizeof(*ss->images));
+
+  ss->mode = IN;
+  ss->mode_tick = fade_ticks * speed;
+
+  load_initial_images (mi);
+}
+
+
+void
+draw_carousel (ModeInfo *mi)
+{
+  carousel_state *ss = &sss[MI_SCREEN(mi)];
+  int wire = MI_IS_WIREFRAME(mi);
+  static time_t last_time = 0;
+  static time_t now = 0;
+  int i;
+
+  if (!ss->glx_context)
+    return;
+
+  /* Only check the wall clock every 10 frames */
+  {
+    static int tick = 0;
+    if (now == 0 || tick++ > 10)
+      {
+        now = time((time_t *) 0);
+        if (last_time == 0) last_time = now;
+        tick = 0;
+      }
+  }
+
+
+  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+  glPushMatrix();
+
+
+  /* Run the startup "un-shrink" animation.
+   */
+  switch (ss->mode)
+    {
+    case IN:
+      if (--ss->mode_tick <= 0)
+        {
+          ss->mode = NORMAL;
+          last_time = time((time_t *) 0);
+        }
+      break;
+    case NORMAL:
+      break;
+    default:
+      abort();
+    }
+
+
+  /* Scale as per the startup "un-shrink" animation.
+   */
+  if (ss->mode != NORMAL)
+    {
+      GLfloat s = (ss->mode == OUT
+                   ? ss->mode_tick / (fade_ticks * speed)
+                   : (((fade_ticks * speed) - ss->mode_tick + 1) /
+                      (fade_ticks * speed)));
+      glScalef (s, s, s);
+    }
+
+  /* Rotate and tilt as per the user, and the motion modeller.
+   */
+  {
+    double x, y, z;
+    gltrackball_rotate (ss->trackball);
+
+    /* Tilt the tube up or down by up to 30 degrees */
+    get_position (ss->rot, &x, &y, &z, !ss->button_down_p);
+    if (tilt_x_p)
+      glRotatef (15 - (x * 30), 1, 0, 0);
+    if (tilt_y_p)
+      glRotatef (7  - (y * 14), 0, 0, 1);
+
+    /* Only use the Y component of the rotator. */
+    get_rotation (ss->rot, &x, &y, &z, !ss->button_down_p);
+    glRotatef (y * 360, 0, 1, 0);
+  }
+
+  /* Render and update each image on the disc.
+   */
+  for (i = 0; i < ss->nimages; i++)
+    {
+      image *img = ss->images[i];
+      GLfloat texw  = img->geom.width  / (GLfloat) img->tw;
+      GLfloat texh  = img->geom.height / (GLfloat) img->th;
+      GLfloat texx1 = img->geom.x / (GLfloat) img->tw;
+      GLfloat texy1 = img->geom.y / (GLfloat) img->th;
+      GLfloat texx2 = texx1 + texw;
+      GLfloat texy2 = texy1 + texh;
+      GLfloat aspect = img->geom.height / (GLfloat) img->geom.width;
+
+      glBindTexture (GL_TEXTURE_2D, img->texid);
+
+      glPushMatrix();
+
+      /* Position this image on the wheel.
+       */
+      glRotatef (img->theta, 0, 1, 0);
+      glTranslatef (0, 0, img->r);
+
+      /* Scale down the image so that all N images fit on the wheel
+         without bumping in to each other.
+      */
+      {
+        GLfloat t, s;
+        switch (ss->nimages)
+          {
+          case 1:  t = -1.0; s = 1.7; break;
+          case 2:  t = -0.8; s = 1.6; break;
+          case 3:  t = -0.4; s = 1.5; break;
+          case 4:  t = -0.2; s = 1.3; break;
+          default: t =  0.0; s = 6.0 / ss->nimages; break;
+          }
+        glTranslatef (0, 0, t);
+        glScalef (s, s, s);
+      }
+
+      /* Center this image on the wheel plane.
+       */
+      glTranslatef (-0.5, -(aspect/2), 0);
+
+      /* Move as per the "zoom in and out" setting.
+       */
+      if (zoom_p)
+        {
+          double x, y, z;
+          /* Only use the Z component of the rotator for in/out position. */
+          get_position (img->rot, &x, &y, &z, !ss->button_down_p);
+          glTranslatef (0, 0, z/2);
+        }
+
+      /* Compute the "drop in and out" state.
+       */
+      switch (img->mode)
+        {
+        case NORMAL:
+          if (!ss->button_down_p &&
+              now >= img->expires)
+            {
+              img->mode = OUT;
+              img->mode_tick = fade_ticks * speed;
+            }
+          break;
+        case OUT:
+          if (--img->mode_tick <= 0)
+            load_image (mi, img, False);
+          break;
+        case LOADING:
+          /* just wait, with the image off screen. */
+          break;
+        case IN:
+          if (--img->mode_tick <= 0)
+            img->mode = NORMAL;
+          break;
+        default:
+          abort();
+        }
+
+      /* Now drop in/out.
+       */
+      if (img->mode != NORMAL)
+        {
+          GLfloat t = (img->mode == LOADING
+                       ? -100
+                       : img->mode == OUT
+                       ? img->mode_tick / (fade_ticks * speed)
+                       : (((fade_ticks * speed) - img->mode_tick + 1) /
+                          (fade_ticks * speed)));
+          t = 5 * (1 - t);
+          if (img->from_top_p) t = -t;
+          glTranslatef (0, t, 0);
+        }
+
+      /* Draw the image quad.
+       */
+      if (! wire)
+        {
+          glColor3f (1, 1, 1);
+          glNormal3f (0, 0, 1);
+          glEnable (GL_TEXTURE_2D);
+          glBegin (GL_QUADS);
+          glNormal3f (0, 0, 1);
+          glTexCoord2f (texx1, texy2); glVertex3f (0, 0, 0);
+          glTexCoord2f (texx2, texy2); glVertex3f (1, 0, 0);
+          glTexCoord2f (texx2, texy1); glVertex3f (1, aspect, 0);
+          glTexCoord2f (texx1, texy1); glVertex3f (0, aspect, 0);
+          glEnd();
+        }
+
+      /* Draw a box around it.
+       */
+      glLineWidth (2.0);
+      glColor3f (0.5, 0.5, 0.5);
+      glDisable (GL_TEXTURE_2D);
+      glBegin (GL_LINE_LOOP);
+      glVertex3f (0, 0, 0);
+      glVertex3f (1, 0, 0);
+      glVertex3f (1, aspect, 0);
+      glVertex3f (0, aspect, 0);
+      glEnd();
+
+      /* Draw a title under the image.
+       */
+      if (titles_p)
+        {
+          int sw, sh;
+          GLfloat scale = 0.05;
+          char *title = img->title ? img->title : "(untitled)";
+          sw = texture_string_width (ss->texfont, title, &sh);
+
+          glTranslatef (0, -scale, 0);
+
+          scale /= sh;
+          glScalef (scale, scale, scale);
+
+          glTranslatef (((1/scale) - sw) / 2, 0, 0);
+          glColor3f (1, 1, 1);
+
+          if (!wire)
+            {
+              glEnable (GL_TEXTURE_2D);
+              print_texture_string (ss->texfont, title);
+            }
+          else
+            {
+              glBegin (GL_LINE_LOOP);
+              glVertex3f (0,  0,  0);
+              glVertex3f (sw, 0,  0);
+              glVertex3f (sw, sh, 0);
+              glVertex3f (0,  sh, 0);
+              glEnd();
+            }
+        }
+
+      glPopMatrix();
+    }
+  glPopMatrix();
+
+  if (mi->fps_p) do_fps (mi);
+  glFinish();
+  glXSwapBuffers (MI_DISPLAY (mi), MI_WINDOW(mi));
+}
+
+#endif /* USE_GL */
diff --git a/hacks/glx/carousel.man b/hacks/glx/carousel.man
new file mode 100644 (file)
index 0000000..86f5a79
--- /dev/null
@@ -0,0 +1,108 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+carousel - displays multiple images rotating in a circular formation
+.SH SYNOPSIS
+.B carousel
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-count \fIint\fP]
+[\-zoom | \-no\-zoom]
+[\-tilt \fIXY\fP]
+[\-titles | \-no\-titles]
+[\-font \fIfont\fP]
+[\-speed \fIratio\fP]
+[\-duration \fIseconds\fP]
+[\-fps]
+[\-debug]
+[\-wireframe]
+.SH DESCRIPTION
+Loads several random images, and displays them flying in a circular
+formation.  The circle changes speed and direction randomly, tilts on
+its axis, and the images move in and out.
+
+This program requires a good video card capable of supporting large
+textures.
+
+To specify the directory that images are loaded from, run
+.BR xscreensaver-demo (1)
+and click on the "Advanced" tab.
+.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 \-count \fIint\fP
+How many images to display.  Default 7.
+.TP 8
+.B \-zoom \fB| \-no\-zoom\fP
+Whether the images should move in and out (toward and away from the
+axis of rotation).  Default true.
+.TP 8
+.B \-tilt \fIXY\fP \fB| \-no\-tilt\fP
+Whether the axis of rotation should tilt, and how.  \fB-tilt X\fP
+means that it will tilt toward and away from the viewer.  
+\fB-tilt Y\fP means that it will tilt to the left and right of the
+screen.  \fB-tilt XY\fP (the default) means it will do both.
+.TP 8
+.B \-titles \fB| \-no\-titles\fP
+Whether to display the file names of the images beneath them.  Default: yes.
+.TP 8
+.B \-font \fIfont-name\fP
+The font to use for titles.  Note that the size of the font affects
+the clarity of the characters, not their size (it is auto-scaled.)
+.TP 8
+.B \-duration \fIseconds\fP
+Every \fIduration\fP seconds, one of the images will be replaced
+with a new one.  Default 20 seconds.
+.TP 8
+.B \-speed \fIratio\fP
+Speed up or slow down the animation.  0.5 means half as fast as the
+default; 2.0 means twice as fast.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds.  Default: 20000 (0.02 seconds.).
+.TP 8
+.B \-fps
+Whether to show a frames-per-second display at the bottom of the screen.
+.TP 8
+.B \-debug
+Prints debugging info to stderr.
+.TP 8
+.B \-wireframe
+Another debug mode.
+.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-demo (1)
+.BR xscreensaver-getimage (1)
+.BR xscreensaver (1)
+.BR glslideshow (1)
+.SH COPYRIGHT
+Copyright \(co 2005 by Jamie Zawinski.
+
+Permission to use, copy, modify, distribute, and sell this software and
+its documentation for any purpose is hereby granted without fee,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation.  No representations are made about the
+suitability of this software for any purpose.  It is provided "as is"
+without express or implied warranty.
+.SH AUTHOR
+Jamie Zawinski.
index 84e2726490f1ccf03d3fe1cae51e87b085e61ef8..44f2b73f9b9e28f6726dee966840a9c1195d82c5 100644 (file)
@@ -349,7 +349,7 @@ cube_handle_event (ModeInfo *mi, XEvent *event)
   cube_configuration *cc = &ccs[MI_SCREEN(mi)];
 
   if (event->xany.type == ButtonPress &&
   cube_configuration *cc = &ccs[MI_SCREEN(mi)];
 
   if (event->xany.type == ButtonPress &&
-      event->xbutton.button & Button1)
+      event->xbutton.button == Button1)
     {
       cc->button_down_p = True;
       gltrackball_start (cc->trackball,
     {
       cc->button_down_p = True;
       gltrackball_start (cc->trackball,
@@ -358,11 +358,19 @@ cube_handle_event (ModeInfo *mi, XEvent *event)
       return True;
     }
   else if (event->xany.type == ButtonRelease &&
       return True;
     }
   else if (event->xany.type == ButtonRelease &&
-           event->xbutton.button & Button1)
+           event->xbutton.button == Button1)
     {
       cc->button_down_p = False;
       return True;
     }
     {
       cc->button_down_p = False;
       return True;
     }
+  else if (event->xany.type == ButtonPress &&
+           (event->xbutton.button == Button4 ||
+            event->xbutton.button == Button5))
+    {
+      gltrackball_mousewheel (cc->trackball, event->xbutton.button, 10,
+                              !!event->xbutton.state);
+      return True;
+    }
   else if (event->xany.type == MotionNotify &&
            cc->button_down_p)
     {
   else if (event->xany.type == MotionNotify &&
            cc->button_down_p)
     {
index e6801b9a47bf1589fa57494fa1b3523de3135c60..e4c879ba7988bf3aef341d519585228956518aa2 100644 (file)
@@ -196,7 +196,7 @@ cube_handle_event (ModeInfo *mi, XEvent *event)
   cube_configuration *bp = &bps[MI_SCREEN(mi)];
 
   if (event->xany.type == ButtonPress &&
   cube_configuration *bp = &bps[MI_SCREEN(mi)];
 
   if (event->xany.type == ButtonPress &&
-      event->xbutton.button & Button1)
+      event->xbutton.button == Button1)
     {
       bp->button_down_p = True;
       gltrackball_start (bp->trackball,
     {
       bp->button_down_p = True;
       gltrackball_start (bp->trackball,
@@ -205,11 +205,19 @@ cube_handle_event (ModeInfo *mi, XEvent *event)
       return True;
     }
   else if (event->xany.type == ButtonRelease &&
       return True;
     }
   else if (event->xany.type == ButtonRelease &&
-           event->xbutton.button & Button1)
+           event->xbutton.button == Button1)
     {
       bp->button_down_p = False;
       return True;
     }
     {
       bp->button_down_p = False;
       return True;
     }
+  else if (event->xany.type == ButtonPress &&
+           (event->xbutton.button == Button4 ||
+            event->xbutton.button == Button5))
+    {
+      gltrackball_mousewheel (bp->trackball, event->xbutton.button, 10,
+                              !!event->xbutton.state);
+      return True;
+    }
   else if (event->xany.type == MotionNotify &&
            bp->button_down_p)
     {
   else if (event->xany.type == MotionNotify &&
            bp->button_down_p)
     {
index 32483a1dce2db772ecf470ccc30f60ca6896d85f..31a67419865b107730efc7ba30850bf23b5232ce 100644 (file)
@@ -196,7 +196,7 @@ ball_handle_event (ModeInfo *mi, XEvent *event)
   ball_configuration *bp = &bps[MI_SCREEN(mi)];
 
   if (event->xany.type == ButtonPress &&
   ball_configuration *bp = &bps[MI_SCREEN(mi)];
 
   if (event->xany.type == ButtonPress &&
-      event->xbutton.button & Button1)
+      event->xbutton.button == Button1)
     {
       bp->button_down_p = True;
       gltrackball_start (bp->trackball,
     {
       bp->button_down_p = True;
       gltrackball_start (bp->trackball,
@@ -205,11 +205,19 @@ ball_handle_event (ModeInfo *mi, XEvent *event)
       return True;
     }
   else if (event->xany.type == ButtonRelease &&
       return True;
     }
   else if (event->xany.type == ButtonRelease &&
-           event->xbutton.button & Button1)
+           event->xbutton.button == Button1)
     {
       bp->button_down_p = False;
       return True;
     }
     {
       bp->button_down_p = False;
       return True;
     }
+  else if (event->xany.type == ButtonPress &&
+           (event->xbutton.button == Button4 ||
+            event->xbutton.button == Button5))
+    {
+      gltrackball_mousewheel (bp->trackball, event->xbutton.button, 10,
+                              !!event->xbutton.state);
+      return True;
+    }
   else if (event->xany.type == MotionNotify &&
            bp->button_down_p)
     {
   else if (event->xany.type == MotionNotify &&
            bp->button_down_p)
     {
index 25335a7097e1a351c1e520ef3f085a7998fb357d..4393a6783f6a659e12fd6ff6dd4422acc1b3f428 100644 (file)
@@ -206,7 +206,7 @@ double theta = 0.0;
 Bool chess_handle_event (ModeInfo *mi, XEvent *event) {
   Chesscreen *c = &qs[MI_SCREEN(mi)];
 
 Bool chess_handle_event (ModeInfo *mi, XEvent *event) {
   Chesscreen *c = &qs[MI_SCREEN(mi)];
 
-  if(event->xany.type == ButtonPress && event->xbutton.button & Button1) {
+  if(event->xany.type == ButtonPress && event->xbutton.button == Button1) {
     c->button_down_p = True;
     gltrackball_start (c->trackball,
                       event->xbutton.x, event->xbutton.y,
     c->button_down_p = True;
     gltrackball_start (c->trackball,
                       event->xbutton.x, event->xbutton.y,
@@ -214,10 +214,18 @@ Bool chess_handle_event (ModeInfo *mi, XEvent *event) {
     return True;
   }
   else if(event->xany.type == ButtonRelease 
     return True;
   }
   else if(event->xany.type == ButtonRelease 
-         && event->xbutton.button & Button1) {
+         && event->xbutton.button == Button1) {
     c->button_down_p = False;
     return True;
   }
     c->button_down_p = False;
     return True;
   }
+  else if (event->xany.type == ButtonPress &&
+           (event->xbutton.button == Button4 ||
+            event->xbutton.button == Button5))
+    {
+      gltrackball_mousewheel (c->trackball, event->xbutton.button, 5,
+                              !event->xbutton.state);
+      return True;
+    }
   else if(event->xany.type == MotionNotify && c->button_down_p) {
     gltrackball_track (c->trackball,
                       event->xmotion.x, event->xmotion.y,
   else if(event->xany.type == MotionNotify && c->button_down_p) {
     gltrackball_track (c->trackball,
                       event->xmotion.x, event->xmotion.y,
index 892524a73da216e4e0590f3d9f2ee0b527cfded3..9b82f7d717e1e64cd3b3c0a36f9063dece85f561 100644 (file)
@@ -52,6 +52,7 @@
 # include "xlock.h"                  /* from the xlockmore distribution */
 #endif /* !STANDALONE */
 
 # include "xlock.h"                  /* from the xlockmore distribution */
 #endif /* !STANDALONE */
 
+#include "glxfonts.h"
 #include "rotator.h"
 #include "gltrackball.h"
 
 #include "rotator.h"
 #include "gltrackball.h"
 
@@ -822,90 +823,6 @@ void makeshaft (void)
   glEndList();
 }
 
   glEndList();
 }
 
-static void
-load_font (ModeInfo *mi, char *res, XFontStruct **fontP, GLuint *dlistP)
-{
-  const char *font = get_string_resource (res, "Font");
-  XFontStruct *f;
-  Font id;
-  int first, last;
-
-  if (!font) font = "-*-times-bold-r-normal-*-180-*";
-
-  f = XLoadQueryFont(mi->dpy, font);
-  if (!f) f = XLoadQueryFont(mi->dpy, "fixed");
-
-  id = f->fid;
-  first = f->min_char_or_byte2;
-  last = f->max_char_or_byte2;
-  
-  clear_gl_error ();
-  *dlistP = glGenLists ((GLuint) last+1);
-  check_gl_error ("glGenLists");
-  glXUseXFont(id, first, last-first+1, *dlistP + first);
-  check_gl_error ("glXUseXFont");
-
-  *fontP = f;
-}
-
-
-static void
-print_title_string (ModeInfo *mi, const char *string, GLfloat x, GLfloat y)
-{
-  Engine *e = &engine[MI_SCREEN(mi)];
-  XFontStruct *font = e->xfont;
-  GLfloat line_height = font->ascent + font->descent;
-
-  y -= line_height;
-
-  glPushAttrib (GL_TRANSFORM_BIT |  /* for matrix contents */
-                GL_ENABLE_BIT);     /* for various glDisable calls */
-  glDisable (GL_LIGHTING);
-  glDisable (GL_DEPTH_TEST);
-  {
-    glMatrixMode(GL_PROJECTION);
-    glPushMatrix();
-    {
-      glLoadIdentity();
-
-      glMatrixMode(GL_MODELVIEW);
-      glPushMatrix();
-      {
-        unsigned int i;
-        int x2 = x;
-        glLoadIdentity();
-
-        gluOrtho2D (0, mi->xgwa.width, 0, mi->xgwa.height);
-
-        glRasterPos2f (x, y);
-        for (i = 0; i < strlen(string); i++)
-          {
-            char c = string[i];
-            if (c == '\n')
-              {
-                glRasterPos2f (x, (y -= line_height));
-                x2 = x;
-              }
-            else
-              {
-                glCallList (e->font_dlist + (int)(c));
-                x2 += (font->per_char
-                       ? font->per_char[c - font->min_char_or_byte2].width
-                       : font->min_bounds.width);
-              }
-          }
-      }
-      glPopMatrix();
-    }
-    glMatrixMode(GL_PROJECTION);
-    glPopMatrix();
-  }
-  glPopAttrib();
-
-  glMatrixMode(GL_MODELVIEW);
-}
-
-
 
 void reshape_engine(ModeInfo *mi, int width, int height)
 {
 
 void reshape_engine(ModeInfo *mi, int width, int height)
 {
@@ -991,7 +908,7 @@ void init_engine(ModeInfo *mi)
 
  makeshaft();
  makepiston();
 
  makeshaft();
  makepiston();
- load_font (mi, "titleFont", &e->xfont, &e->font_dlist);
+ load_font (mi->dpy, "titleFont", &e->xfont, &e->font_dlist);
 }
 
 Bool engine_handle_event (ModeInfo *mi, XEvent *event)
 }
 
 Bool engine_handle_event (ModeInfo *mi, XEvent *event)
@@ -999,7 +916,7 @@ Bool engine_handle_event (ModeInfo *mi, XEvent *event)
    Engine *e = &engine[MI_SCREEN(mi)];
 
    if (event->xany.type == ButtonPress &&
    Engine *e = &engine[MI_SCREEN(mi)];
 
    if (event->xany.type == ButtonPress &&
-       event->xbutton.button & Button1)
+       event->xbutton.button == Button1)
    {
        e->button_down_p = True;
        gltrackball_start (e->trackball,
    {
        e->button_down_p = True;
        gltrackball_start (e->trackball,
@@ -1009,11 +926,19 @@ Bool engine_handle_event (ModeInfo *mi, XEvent *event)
        return True;
    }
    else if (event->xany.type == ButtonRelease &&
        return True;
    }
    else if (event->xany.type == ButtonRelease &&
-            event->xbutton.button & Button1) {
+            event->xbutton.button == Button1) {
        e->button_down_p = False;
        movepaused = 0;
        return True;
    }
        e->button_down_p = False;
        movepaused = 0;
        return True;
    }
+  else if (event->xany.type == ButtonPress &&
+           (event->xbutton.button == Button4 ||
+            event->xbutton.button == Button5))
+    {
+      gltrackball_mousewheel (e->trackball, event->xbutton.button, 10,
+                              !!event->xbutton.state);
+      return True;
+    }
    else if (event->xany.type == MotionNotify &&
             e->button_down_p) {
       gltrackball_track (e->trackball,
    else if (event->xany.type == MotionNotify &&
             e->button_down_p) {
       gltrackball_track (e->trackball,
@@ -1039,8 +964,10 @@ void draw_engine(ModeInfo *mi)
   display(e);
 
   if (do_titles)
   display(e);
 
   if (do_titles)
-    print_title_string (mi, e->engine_name,
-                        10, mi->xgwa.height - 10);
+      print_gl_string (mi->dpy, e->xfont, e->font_dlist,
+                       mi->xgwa.width, mi->xgwa.height,
+                       10, mi->xgwa.height - 10,
+                       e->engine_name);
 
   if(mi->fps_p) do_fps(mi);
   glFinish(); 
 
   if(mi->fps_p) do_fps(mi);
   glFinish(); 
index 605badcd46e503456586616194f4931a2b0dc42f..8b426ff7bb9938788b19faace4b3fce9e039e756 100644 (file)
 #include <GL/tube.h>
 #endif
 
 #include <GL/tube.h>
 #endif
 
-/*  most recent mouse postion */
+/* controls shape of object */
 extern float lastx;
 extern float lasty;
 extern float lastx;
 extern float lasty;
-extern float rot_x;
-extern float rot_y;
-extern float rot_z;
 
 void InitStuff_helix2 (void) 
 {
 
 void InitStuff_helix2 (void) 
 {
@@ -45,12 +42,9 @@ void DrawStuff_helix2 (void)
 
    /* set up some matrices so that the object spins with the mouse */
    glPushMatrix ();
 
    /* set up some matrices so that the object spins with the mouse */
    glPushMatrix ();
-   glTranslatef (0.0, 0.0, -80.0);
-   glRotatef(rot_x, 1, 0, 0);
-   glRotatef(rot_y, 0, 1, 0);
-   glRotatef(rot_z, 0, 0, 1);
-/*     glRotatef (220.0, 0.0, 1.0, 0.0); */
-/*     glRotatef (65.0, 1.0, 0.0, 0.0); */
+/* glTranslatef (0.0, 0.0, -80.0);   */
+/* glRotatef (220.0, 0.0, 1.0, 0.0); */
+/* glRotatef (65.0, 1.0, 0.0, 0.0);  */
 
    /* Phew. FINALLY, Draw the helix  -- */
    gleSetJoinStyle (TUBE_NORM_EDGE | TUBE_JN_ANGLE | TUBE_JN_CAP);
 
    /* Phew. FINALLY, Draw the helix  -- */
    gleSetJoinStyle (TUBE_NORM_EDGE | TUBE_JN_ANGLE | TUBE_JN_CAP);
index 34ae2960e60e2af2e52312c9bd87b5bc2e7c07be..aea83d5cd2799ace65cac83a89d624510206c3e8 100644 (file)
 #include <GL/tube.h>
 #endif
 
 #include <GL/tube.h>
 #endif
 
-/*  most recent mouse postion */
+/* controls shape of object */
 extern float lastx;
 extern float lasty;
 extern float lastx;
 extern float lasty;
-extern float rot_x;
-extern float rot_y;
-extern float rot_z;
 
 void InitStuff_helix3 (void) 
 {
 
 void InitStuff_helix3 (void) 
 {
@@ -45,12 +42,9 @@ void DrawStuff_helix3 (void)
 
    /* set up some matrices so that the object spins with the mouse */
    glPushMatrix ();
 
    /* set up some matrices so that the object spins with the mouse */
    glPushMatrix ();
-   glTranslatef (0.0, 0.0, -80.0);
-   glRotatef(rot_x, 1, 0, 0);
-   glRotatef(rot_y, 0, 1, 0);
-   glRotatef(rot_z, 0, 0, 1);
-/*     glRotatef (220.0, 0.0, 1.0, 0.0); */
-/*     glRotatef (65.0, 1.0, 0.0, 0.0); */
+/* glTranslatef (0.0, 0.0, -80.0); */
+/* glRotatef (220.0, 0.0, 1.0, 0.0); */
+/* glRotatef (65.0, 1.0, 0.0, 0.0); */
 
    /* Phew. FINALLY, Draw the helix  -- */
    gleSetJoinStyle (TUBE_NORM_EDGE | TUBE_JN_ANGLE | TUBE_JN_CAP);
 
    /* Phew. FINALLY, Draw the helix  -- */
    gleSetJoinStyle (TUBE_NORM_EDGE | TUBE_JN_ANGLE | TUBE_JN_CAP);
index c74fc59c8678e998305c4a42ce3c666c4ff0eb3e..de040273ab4a8cfb552779a38099d71838a80471 100644 (file)
 #include <GL/tube.h>
 #endif
 
 #include <GL/tube.h>
 #endif
 
-/*  most recent mouse postion */
+/* controls shape of object */
 extern float lastx;
 extern float lasty;
 extern float lastx;
 extern float lasty;
-extern float rot_x;
-extern float rot_y;
-extern float rot_z;
 
 void InitStuff_helix4 (void) 
 {
 
 void InitStuff_helix4 (void) 
 {
@@ -48,12 +45,9 @@ void DrawStuff_helix4 (void)
 
    /* set up some matrices so that the object spins with the mouse */
    glPushMatrix ();
 
    /* set up some matrices so that the object spins with the mouse */
    glPushMatrix ();
-   glTranslatef (0.0, 0.0, -80.0);
-   glRotatef(rot_x, 1, 0, 0);
-   glRotatef(rot_y, 0, 1, 0);
-   glRotatef(rot_z, 0, 0, 1);
-/*     glRotatef (220.0, 0.0, 1.0, 0.0); */
-/*     glRotatef (65.0, 1.0, 0.0, 0.0); */
+/* glTranslatef (0.0, 0.0, -80.0); */
+/* glRotatef (220.0, 0.0, 1.0, 0.0); */
+/* glRotatef (65.0, 1.0, 0.0, 0.0); */
 
    /* Phew. FINALLY, Draw the helix  -- */
    affine [0][0] = 1.0/ (0.01*lastx);
 
    /* Phew. FINALLY, Draw the helix  -- */
    affine [0][0] = 1.0/ (0.01*lastx);
index 5b0b332b9d1ea15030abe4c12bfa096d407b7c6d..5895c3c0690e9e5f23ec19d73a9c79405024cc95 100644 (file)
@@ -101,6 +101,7 @@ void InitStuff_joinoffset (void)
 
 static double up_vector[3] = {1.0, 0.0, 0.0};
 
 
 static double up_vector[3] = {1.0, 0.0, 0.0};
 
+/* controls shape of object */
 extern float lastx;
 extern float lasty;
 
 extern float lastx;
 extern float lasty;
 
@@ -122,8 +123,10 @@ void DrawStuff_joinoffset (void)
 
    /* set up some matrices so that the object spins with the mouse */
    glPushMatrix ();
 
    /* set up some matrices so that the object spins with the mouse */
    glPushMatrix ();
-   glTranslatef (0.0, 4.0, -80.0);
-   glRotatef (0.5*lastx, 0.0, 1.0, 0.0);
+   glScalef (0.5, 0.5, 0.5);
+   glTranslatef (0, 4, 0);
+   /* glTranslatef (0.0, 4.0, -80.0); */
+   /* glRotatef (0.5*lastx, 0.0, 1.0, 0.0); */
 
    gleExtrusion (cidx, moved_contour, contour_points, up_vector, 
                  idx, points, colors);
 
    gleExtrusion (cidx, moved_contour, contour_points, up_vector, 
                  idx, points, colors);
@@ -134,8 +137,10 @@ void DrawStuff_joinoffset (void)
    /* draw a seond copy, this time with the raw style, to compare
     * things against */
    glPushMatrix ();
    /* draw a seond copy, this time with the raw style, to compare
     * things against */
    glPushMatrix ();
-   glTranslatef (0.0, -4.0, -80.0);
-   glRotatef (0.5*lastx, 0.0, 1.0, 0.0);
+   glScalef (0.5, 0.5, 0.5);
+   glTranslatef (0, -4, 0);
+   /* glTranslatef (0.0, -4.0, -80.0); */
+   /* glRotatef (0.5*lastx, 0.0, 1.0, 0.0); */
 
    save_style = gleGetJoinStyle ();
    style = save_style;
 
    save_style = gleGetJoinStyle ();
    style = save_style;
index cfae296844ef55848df7749cc9c874df8d66a45d..0b90bec92722c30e9f09d16fc51e95b31bc141dc 100644 (file)
@@ -88,11 +88,9 @@ static void init_contour (void)
    
 /* =========================================================== */
 
    
 /* =========================================================== */
 
+/* controls shape of object */
 extern float lastx;
 extern float lasty;
 extern float lastx;
 extern float lasty;
-extern float rot_x;
-extern float rot_y;
-extern float rot_z;
 
 void InitStuff_screw (void)
 {
 
 void InitStuff_screw (void)
 {
@@ -117,12 +115,9 @@ void DrawStuff_screw (void) {
 
    /* set up some matrices so that the object spins with the mouse */
    glPushMatrix ();
 
    /* set up some matrices so that the object spins with the mouse */
    glPushMatrix ();
-   glTranslatef (0.0, 0.0, -80.0);
-   glRotatef(rot_x, 1, 0, 0);
-   glRotatef(rot_y, 0, 1, 0);
-   glRotatef(rot_z, 0, 0, 1);
-/*     glRotatef (130.0, 0.0, 1.0, 0.0); */
-/*     glRotatef (65.0, 1.0, 0.0, 0.0); */
+   /* glTranslatef (0.0, 0.0, -80.0); */
+   /* glRotatef (130.0, 0.0, 1.0, 0.0); */
+   /* glRotatef (65.0, 1.0, 0.0, 0.0); */
 
    /* draw the brand and the handle */
    gleScrew (20, contour, norms, 
 
    /* draw the brand and the handle */
    gleScrew (20, contour, norms, 
index 8aa07ab0a03752b70d437f6c64d40f60d3f37d4b..e642ef142251c9729fb61d3e8746ce4e21759922 100644 (file)
@@ -128,11 +128,9 @@ static void init_taper (void) {
 
 /* =========================================================== */
 
 
 /* =========================================================== */
 
+/* controls shape of object */
 extern float lastx;
 extern float lasty;
 extern float lastx;
 extern float lasty;
-extern float rot_x;
-extern float rot_y;
-extern float rot_z;
 
 void InitStuff_taper (void)
 {
 
 void InitStuff_taper (void)
 {
@@ -217,13 +215,9 @@ void DrawStuff_taper (void) {
 
    /* set up some matrices so that the object spins with the mouse */
    glPushMatrix ();
 
    /* set up some matrices so that the object spins with the mouse */
    glPushMatrix ();
-   glTranslatef (0.0, 0.0, -80.0);
-   glRotatef(rot_x, 1, 0, 0);
-   glRotatef(rot_y, 0, 1, 0);
-   glRotatef(rot_z, 0, 0, 1);
-
-/*     glRotatef (130.0, 0.0, 1.0, 0.0); */
-/*     glRotatef (65.0, 1.0, 0.0, 0.0); */
+   /* glTranslatef (0.0, 0.0, -80.0); */
+   /* glRotatef (130.0, 0.0, 1.0, 0.0); */
+   /* glRotatef (65.0, 1.0, 0.0, 0.0); */
 
    /* draw the brand and the handle */
    gleTaper (20, contour, norms,  NULL, 40, path, NULL, taper, twist);
 
    /* draw the brand and the handle */
    gleTaper (20, contour, norms,  NULL, 40, path, NULL, taper, twist);
index f5e4965e908dae9c2137a7ac340581598098a17c..c3a247f3b00d9948255434ef040e5e8842402766 100644 (file)
 #define M_PI 3.14159265358979323846
 #endif
 
 #define M_PI 3.14159265358979323846
 #endif
 
+/* controls shape of object */
 extern float lastx;
 extern float lasty;
 extern float lastx;
 extern float lasty;
-extern float rot_x;
-extern float rot_y;
-extern float rot_z;
 
 #define OPENGL_10
 /* =========================================================== */
 
 #define OPENGL_10
 /* =========================================================== */
@@ -184,14 +182,13 @@ void DrawStuff_twistoid (void) {
 #ifdef OPENGL_10
    glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
 
 #ifdef OPENGL_10
    glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
 
+  glFrontFace(GL_CW);  /* jwz */
+
    /* set up some matrices so that the object spins with the mouse */
    glPushMatrix ();
    /* set up some matrices so that the object spins with the mouse */
    glPushMatrix ();
-   glTranslatef (0.0, 0.0, -80.0);
-   glRotatef(rot_x, 1, 0, 0);
-   glRotatef(rot_y, 0, 1, 0);
-   glRotatef(rot_z, 0, 0, 1);
-/*     glRotated (43.0, 1.0, 0.0, 0.0); */
-/*     glRotated (43.0, 0.0, 1.0, 0.0); */
+/* glTranslatef (0.0, 0.0, -80.0); */
+/* glRotated (43.0, 1.0, 0.0, 0.0); */
+/* glRotated (43.0, 0.0, 1.0, 0.0); */
    glScaled (1.8, 1.8, 1.8);
    gleTwistExtrusion (NUM_TWIS_PTS, twistation, twist_normal, 
               NULL, NUM_TOID1_PTS, toid1_points, NULL, toid1_twists);
    glScaled (1.8, 1.8, 1.8);
    gleTwistExtrusion (NUM_TWIS_PTS, twistation, twist_normal, 
               NULL, NUM_TOID1_PTS, toid1_points, NULL, toid1_twists);
index 32f8e6946d39e0c43921994986b54108ee7d2f6f..1930f4e49d78dc68c1da5aa051cc17b1e5d61f01 100644 (file)
@@ -34,7 +34,7 @@
 # define HACK_HANDLE_EVENT                             screensaver_handle_event
 # define EVENT_MASK                                            PointerMotionMask
 # define screensaver_opts                              xlockmore_opts
 # define HACK_HANDLE_EVENT                             screensaver_handle_event
 # define EVENT_MASK                                            PointerMotionMask
 # define screensaver_opts                              xlockmore_opts
-#define        DEFAULTS                        "*delay:                        10000   \n" \
+#define        DEFAULTS                        "*delay:                        20000   \n" \
                                                                                "*showFPS:              False   \n" \
                                                                                "*light:                        True    \n" \
                                         "*wire:                                False   \n" \
                                                                                "*showFPS:              False   \n" \
                                                                                "*light:                        True    \n" \
                                         "*wire:                                False   \n" \
@@ -75,6 +75,7 @@
 
 #include "xpm-ximage.h"
 #include "rotator.h"
 
 #include "xpm-ximage.h"
 #include "rotator.h"
+#include "gltrackball.h"
 
 #define checkImageWidth 64
 #define checkImageHeight 64
 
 #define checkImageWidth 64
 #define checkImageHeight 64
@@ -103,7 +104,7 @@ extern void DrawStuff_twistoid(void);
 #define DEF_LIGHT              "True"
 #define DEF_WIRE               "False"
 #define DEF_TEXTURE            "False"
 #define DEF_LIGHT              "True"
 #define DEF_WIRE               "False"
 #define DEF_TEXTURE            "False"
-#define DEF_TEXTURE_QUALITY   "False"
+#define DEF_TEX_QUAL   "False"
 #define DEF_MIPMAP     "False"
 #define DEF_NAME        "RANDOM"
 #define DEF_IMAGE      "BUILTIN"
 #define DEF_MIPMAP     "False"
 #define DEF_NAME        "RANDOM"
 #define DEF_IMAGE      "BUILTIN"
@@ -111,36 +112,36 @@ extern void DrawStuff_twistoid(void);
 static int do_light;
 static int do_wire;
 static int do_texture;
 static int do_light;
 static int do_wire;
 static int do_texture;
-static int do_texture_quality;
+static int do_tex_qual;
 static int do_mipmap;
 static char *which_name;
 static char *which_image;
 
 static XrmOptionDescRec opts[] = {
 static int do_mipmap;
 static char *which_name;
 static char *which_image;
 
 static XrmOptionDescRec opts[] = {
-  {"-light",   ".extrusion.light",     XrmoptionNoArg, "true" },
-  {"+light",   ".extrusion.light",     XrmoptionNoArg, "false" },
-  {"-wire",    ".extrusion.wire",      XrmoptionNoArg, "true" },
-  {"+wire",    ".extrusion.wire",      XrmoptionNoArg, "false" },
-  {"-texture", ".extrusion.texture",   XrmoptionNoArg, "true" },
-  {"+texture", ".extrusion.texture",   XrmoptionNoArg, "false" },
-  {"-texture", ".extrusion.texture",   XrmoptionNoArg, "true" },
-  {"+texture_quality", ".extrusion.texture",   XrmoptionNoArg, "false" },
-  {"-texture_quality", ".extrusion.texture",   XrmoptionNoArg, "true" },
-  {"+mipmap", ".extrusion.mipmap",   XrmoptionNoArg, "false" },
-  {"-mipmap", ".extrusion.mipmap",   XrmoptionNoArg, "true" },
-  {"-name",   ".extrusion.name",  XrmoptionSepArg, 0 },
-  {"-image",   ".extrusion.image",  XrmoptionSepArg, 0 },
+  {"-light",           ".extrusion.light",   XrmoptionNoArg, "true" },
+  {"+light",           ".extrusion.light",   XrmoptionNoArg, "false" },
+  {"-wire",            ".extrusion.wire",    XrmoptionNoArg, "true" },
+  {"+wire",            ".extrusion.wire",    XrmoptionNoArg, "false" },
+  {"-texture",         ".extrusion.texture", XrmoptionNoArg, "true" },
+  {"+texture",         ".extrusion.texture", XrmoptionNoArg, "false" },
+  {"-texture",         ".extrusion.texture", XrmoptionNoArg, "true" },
+  {"+texture_quality", ".extrusion.texture", XrmoptionNoArg, "false" },
+  {"-texture_quality", ".extrusion.texture", XrmoptionNoArg, "true" },
+  {"+mipmap",          ".extrusion.mipmap",  XrmoptionNoArg, "false" },
+  {"-mipmap",          ".extrusion.mipmap",  XrmoptionNoArg, "true" },
+  {"-name",            ".extrusion.name",    XrmoptionSepArg, 0 },
+  {"-image",           ".extrusion.image",   XrmoptionSepArg, 0 },
 };
 
 
 static argtype vars[] = {
 };
 
 
 static argtype vars[] = {
-  {&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},
+  {&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_tex_qual, "texture_quality", "Texture_Quality", DEF_TEX_QUAL, 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},
 };
 
 
 };
 
 
@@ -171,30 +172,31 @@ typedef struct {
   int screen_width, screen_height;
   GLXContext *glx_context;
   rotator *rot;
   int screen_width, screen_height;
   GLXContext *glx_context;
   rotator *rot;
+  trackball_state *trackball;
   Bool button_down_p;
   Bool button_down_p;
+  Bool button2_down_p;
+  int mouse_start_x, mouse_start_y;
   int mouse_x, mouse_y;
   int mouse_x, mouse_y;
+  int mouse_dx, mouse_dy;
   Window window;
   XColor fg, bg;
 } screensaverstruct;
   Window window;
   XColor fg, bg;
 } screensaverstruct;
-static screensaverstruct *Screensaver = NULL;
-
 
 
+static screensaverstruct *Screensaver = NULL;
 
 
 
 
-/* convenient access to the screen width */
-static int global_width=640, global_height=480;
 
 /* set up a light */
 static GLfloat lightOnePosition[] = {40.0, 40, 100.0, 0.0};
 
 /* set up a light */
 static GLfloat lightOnePosition[] = {40.0, 40, 100.0, 0.0};
-static GLfloat lightOneColor[] = {0.99, 0.99, 0.99, 1.0}; 
+static GLfloat lightOneColor[] = {0.99, 0.99, 0.00, 1.0}; 
 
 static GLfloat lightTwoPosition[] = {-40.0, 40, 100.0, 0.0};
 
 static GLfloat lightTwoPosition[] = {-40.0, 40, 100.0, 0.0};
-static GLfloat lightTwoColor[] = {0.99, 0.99, 0.99, 1.0}; 
+static GLfloat lightTwoColor[] = {0.00, 0.99, 0.99, 1.0}; 
 
 float rot_x=0, rot_y=0, rot_z=0;
 float lastx=0, lasty=0;
 
 
 float rot_x=0, rot_y=0, rot_z=0;
 float lastx=0, lasty=0;
 
-static float max_lastx=300, max_lasty=400;
+static float max_lastx=400,  max_lasty=400;
 static float min_lastx=-400, min_lasty=-400;
 
 static int screensaver_number;
 static float min_lastx=-400, min_lasty=-400;
 
 static int screensaver_number;
@@ -280,7 +282,7 @@ void Create_Texture(ModeInfo *mi, const char *filename)
   /* perhaps we can edge a bit more speed at the expense of quality */
   glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_FASTEST);
 
   /* perhaps we can edge a bit more speed at the expense of quality */
   glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_FASTEST);
 
-  if (do_texture_quality) {
+  if (do_tex_qual) {
        /* with texture_quality, the min and mag filters look *much* nice but are *much* slower */
        glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
        glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
        /* with texture_quality, the min and mag filters look *much* nice but are *much* slower */
        glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
        glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
@@ -323,8 +325,12 @@ static void
 init_rotation (ModeInfo *mi)
 {
   screensaverstruct *gp = &Screensaver[MI_SCREEN(mi)];
 init_rotation (ModeInfo *mi)
 {
   screensaverstruct *gp = &Screensaver[MI_SCREEN(mi)];
-  double spin_speed = 1.0;
-  gp->rot = make_rotator (spin_speed, spin_speed, spin_speed, 1.0, 0.0, True);
+  double spin_speed = 0.5;
+  gp->rot = make_rotator (spin_speed, spin_speed, spin_speed,
+                          0.2,
+                          0.005,
+                          True);
+  gp->trackball = gltrackball_init ();
 
   lastx = (random() % (int) (max_lastx - min_lastx)) + min_lastx;
   lasty = (random() % (int) (max_lasty - min_lasty)) + min_lasty;
 
   lastx = (random() % (int) (max_lastx - min_lastx)) + min_lastx;
   lasty = (random() % (int) (max_lasty - min_lasty)) + min_lasty;
@@ -332,44 +338,69 @@ init_rotation (ModeInfo *mi)
 
 
 /* draw the screensaver once */
 
 
 /* draw the screensaver once */
-void draw_screensaver(ModeInfo * mi)
+void
+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);
 
+  static GLfloat color[4] = {0.6, 0.6, 0.4, 1.0};
+  /* static GLfloat spec[4]  = {0.6, 0.6, 0.6, 1.0}; */
+  /* static GLfloat shiny    = 40.0; */
+
+  double x, y, z;
+
   if (!gp->glx_context)
        return;
 
   if (!gp->glx_context)
        return;
 
-  glXMakeCurrent(display, window, *(gp->glx_context));
+  glPushMatrix();
+
+  gltrackball_rotate (gp->trackball);
+
+  get_rotation (gp->rot, &x, &y, &z,
+                !(gp->button_down_p || gp->button2_down_p));
+  glRotatef (x * 360, 1.0, 0.0, 0.0);
+  glRotatef (y * 360, 0.0, 1.0, 0.0);
+  glRotatef (z * 360, 0.0, 0.0, 1.0);
 
 
-  funcs_ptr[screensaver_number].DrawStuff();
-         
   /* track the mouse only if a button is down. */
   /* track the mouse only if a button is down. */
-  if (gp->button_down_p)
+  if (gp->button2_down_p)
     {
     {
-      lastx = gp->mouse_x;
-      lasty = gp->mouse_y;
-    }
-  else
-    {
-      float scale = (max_lastx - min_lastx);
-      double x, y, z;
-      get_rotation (gp->rot, &x, &y, &z, True);
-      rot_x = x * 360;
-      rot_y = y * 360;
-      rot_z = z * 360;
-      lastx = x * scale + min_lastx;
-      lasty = y * scale + min_lasty;
+      gp->mouse_dx += gp->mouse_x - gp->mouse_start_x;
+      gp->mouse_dy += gp->mouse_y - gp->mouse_start_y;
+      gp->mouse_start_x = gp->mouse_x;
+      gp->mouse_start_y = gp->mouse_y;
     }
 
     }
 
+  {
+    float scale = (max_lastx - min_lastx);
+    get_position (gp->rot, &x, &y, &z,
+                  !(gp->button_down_p || gp->button2_down_p));
+    lastx = x * scale + min_lastx + gp->mouse_dx;
+    lasty = y * scale + min_lasty + gp->mouse_dy;
+  }
+
+  glScalef(0.5, 0.5, 0.5);
+
+  /* glMaterialfv (GL_FRONT_AND_BACK, GL_SPECULAR,            spec); */
+  /* glMateriali  (GL_FRONT_AND_BACK, GL_SHININESS,           shiny); */
+
+  glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, color);
+  glFrontFace(GL_CCW);
+
+  funcs_ptr[screensaver_number].DrawStuff();
+         
+  glPopMatrix();
+
   if (mi->fps_p) do_fps (mi);
   glXSwapBuffers(display, window);
 }
 
 
 /* set up lighting conditions */
   if (mi->fps_p) do_fps (mi);
   glXSwapBuffers(display, window);
 }
 
 
 /* set up lighting conditions */
-static void SetupLight(void)
+static void
+SetupLight(void)
 {
   glLightfv (GL_LIGHT0, GL_POSITION, lightOnePosition);
   glLightfv (GL_LIGHT0, GL_DIFFUSE, lightOneColor);
 {
   glLightfv (GL_LIGHT0, GL_POSITION, lightOnePosition);
   glLightfv (GL_LIGHT0, GL_DIFFUSE, lightOneColor);
@@ -385,28 +416,31 @@ static void SetupLight(void)
   glEnable (GL_COLOR_MATERIAL);
 }
 
   glEnable (GL_COLOR_MATERIAL);
 }
 
-/* reset the projection matrix */
-static void resetProjection(void) {
+/* Standard reshape function */
+void
+reshape_screensaver (ModeInfo *mi, int width, int height)
+{
+  GLfloat h = (GLfloat) height / (GLfloat) width;
+
+  glViewport (0, 0, (GLint) width, (GLint) height);
+
   glMatrixMode(GL_PROJECTION);
   glLoadIdentity();
   glMatrixMode(GL_PROJECTION);
   glLoadIdentity();
-  glFrustum (-9, 9, -9, 9, 50, 150.0);
+  gluPerspective (30.0, 1/h, 1.0, 100.0);
+
   glMatrixMode(GL_MODELVIEW);
   glLoadIdentity();
   glMatrixMode(GL_MODELVIEW);
   glLoadIdentity();
-}
+  gluLookAt( 0.0, 0.0, 30.0,
+             0.0, 0.0, 0.0,
+             0.0, 1.0, 0.0);
 
 
-/* Standard reshape function */
-void
-reshape_screensaver(ModeInfo *mi, int width, int height)
-{
-  global_width=width;
-  global_height=height;
-  glViewport( 0, 0, global_width, global_height );
-  resetProjection();
+  glClear(GL_COLOR_BUFFER_BIT);
 }
 
 
 /* decide which screensaver example to run */
 }
 
 
 /* decide which screensaver example to run */
-static void chooseScreensaverExample(ModeInfo *mi)
+static void
+chooseScreensaverExample (ModeInfo *mi)
 {
   int i;
   /* call the extrusion init routine */
 {
   int i;
   /* call the extrusion init routine */
@@ -434,6 +468,7 @@ static void chooseScreensaverExample(ModeInfo *mi)
   funcs_ptr[screensaver_number].InitStuff();
 }
 
   funcs_ptr[screensaver_number].InitStuff();
 }
 
+
 /* main OpenGL initialization routine */
 static void
 initializeGL(ModeInfo *mi, GLsizei width, GLsizei height) 
 /* main OpenGL initialization routine */
 static void
 initializeGL(ModeInfo *mi, GLsizei width, GLsizei height) 
@@ -446,8 +481,7 @@ initializeGL(ModeInfo *mi, GLsizei width, GLsizei height)
 
   glEnable(GL_DEPTH_TEST);
   glClearColor(0,0,0,0);
 
   glEnable(GL_DEPTH_TEST);
   glClearColor(0,0,0,0);
-/*    glCullFace(GL_BACK); */
-/*    glEnable(GL_CULL_FACE); */
+  glDisable (GL_CULL_FACE);
   glLightModeli (GL_LIGHT_MODEL_TWO_SIDE, True);
   glShadeModel(GL_SMOOTH);
 
   glLightModeli (GL_LIGHT_MODEL_TWO_SIDE, True);
   glShadeModel(GL_SMOOTH);
 
@@ -484,23 +518,53 @@ screensaver_handle_event (ModeInfo *mi, XEvent *event)
   screensaverstruct *gp = &Screensaver[MI_SCREEN(mi)];
 
   if (event->xany.type == ButtonPress &&
   screensaverstruct *gp = &Screensaver[MI_SCREEN(mi)];
 
   if (event->xany.type == ButtonPress &&
-      event->xbutton.button & Button1)
+      event->xbutton.button == Button1)
     {
       gp->button_down_p = True;
     {
       gp->button_down_p = True;
-      gp->mouse_x = event->xbutton.x;
-      gp->mouse_y = event->xbutton.y;
+      gltrackball_start (gp->trackball,
+                         event->xbutton.x, event->xbutton.y,
+                         MI_WIDTH (mi), MI_HEIGHT (mi));
       return True;
     }
   else if (event->xany.type == ButtonRelease &&
       return True;
     }
   else if (event->xany.type == ButtonRelease &&
-           event->xbutton.button & Button1)
+           event->xbutton.button == Button1)
     {
       gp->button_down_p = False;
       return True;
     }
     {
       gp->button_down_p = False;
       return True;
     }
+  else if (event->xany.type == ButtonPress &&
+           (event->xbutton.button == Button4 ||
+            event->xbutton.button == Button5))
+    {
+      gltrackball_mousewheel (gp->trackball, event->xbutton.button, 10,
+                              !!event->xbutton.state);
+      return True;
+    }
+  else if (event->xany.type == ButtonPress &&
+           event->xbutton.button != Button1)
+    {
+      gp->button2_down_p = True;
+      gp->mouse_start_x = gp->mouse_x = event->xbutton.x;
+      gp->mouse_start_y = gp->mouse_y = event->xbutton.y;
+      return True;
+    }
+  else if (event->xany.type == ButtonRelease &&
+           event->xbutton.button != Button1)
+    {
+      gp->button2_down_p = False;
+      return True;
+    }
   else if (event->xany.type == MotionNotify)
     {
   else if (event->xany.type == MotionNotify)
     {
-      gp->mouse_x = event->xmotion.x;
-      gp->mouse_y = event->xmotion.y;
+      if (gp->button_down_p)
+        gltrackball_track (gp->trackball,
+                           event->xmotion.x, event->xmotion.y,
+                           MI_WIDTH (mi), MI_HEIGHT (mi));
+      if (gp->button2_down_p)
+        {
+          gp->mouse_x = event->xmotion.x;
+          gp->mouse_y = event->xmotion.y;
+        }
       return True;
     }
 
       return True;
     }
 
@@ -508,15 +572,18 @@ screensaver_handle_event (ModeInfo *mi, XEvent *event)
 }
 
 
 }
 
 
-
 /* xscreensaver initialization routine */
 /* xscreensaver initialization routine */
-void init_screensaver(ModeInfo * mi)
+void
+init_screensaver (ModeInfo * mi)
 {
   int screen = MI_SCREEN(mi);
   screensaverstruct *gp;
 
 {
   int screen = MI_SCREEN(mi);
   screensaverstruct *gp;
 
+  if (do_wire) do_light = 0;
+
   if (Screensaver == NULL) {
   if (Screensaver == NULL) {
-       if ((Screensaver = (screensaverstruct *) calloc(MI_NUM_SCREENS(mi), sizeof (screensaverstruct))) == NULL)
+       if ((Screensaver = (screensaverstruct *)
+         calloc(MI_NUM_SCREENS(mi), sizeof (screensaverstruct))) == NULL)
          return;
   }
   gp = &Screensaver[screen];
          return;
   }
   gp = &Screensaver[screen];
@@ -532,18 +599,4 @@ void init_screensaver(ModeInfo * mi)
 
 }
 
 
 }
 
-/* all sorts of nice cleanup code should go here! */
-void release_screensaver(ModeInfo * mi)
-{
-  int screen;
-  if (Screensaver != NULL) {
-       for (screen = 0; screen < MI_NUM_SCREENS(mi); screen++) {
-         /*      screensaverstruct *gp = &Screensaver[screen];*/
-       }
-       (void) free((void *) Screensaver);
-       Screensaver = NULL;
-  }
-  FreeAllGL(mi);
-}
-#endif
-
+#endif  /* USE_GL */
index 1aadee77de347218b97282688a1375577650b5af..af671ca802aa3f52899c153b2ea1f91de5accd95 100644 (file)
@@ -146,7 +146,7 @@ flipflop_handle_event (ModeInfo *mi, XEvent *event)
   Flipflopcreen *c = &qs[MI_SCREEN(mi)];
 
   if (event->xany.type == ButtonPress &&
   Flipflopcreen *c = &qs[MI_SCREEN(mi)];
 
   if (event->xany.type == ButtonPress &&
-      event->xbutton.button & Button1)
+      event->xbutton.button == Button1)
     {
       c->button_down_p = True;
       gltrackball_start (c->trackball,
     {
       c->button_down_p = True;
       gltrackball_start (c->trackball,
@@ -155,11 +155,19 @@ flipflop_handle_event (ModeInfo *mi, XEvent *event)
       return True;
     }
   else if (event->xany.type == ButtonRelease &&
       return True;
     }
   else if (event->xany.type == ButtonRelease &&
-           event->xbutton.button & Button1)
+           event->xbutton.button == Button1)
     {
       c->button_down_p = False;
       return True;
     }
     {
       c->button_down_p = False;
       return True;
     }
+  else if (event->xany.type == ButtonPress &&
+           (event->xbutton.button == Button4 ||
+            event->xbutton.button == Button5))
+    {
+      gltrackball_mousewheel (c->trackball, event->xbutton.button, 5,
+                              !event->xbutton.state);
+      return True;
+    }
   else if (event->xany.type == MotionNotify &&
            c->button_down_p)
     {
   else if (event->xany.type == MotionNotify &&
            c->button_down_p)
     {
index 4cee56ee262011142accee066014dd53add1e138..7d17818889ca5e1e3928f6679bb48f4a0f365d34 100644 (file)
 # define screenflip_opts                                     xlockmore_opts
 /* insert defaults here */
 
 # define screenflip_opts                                     xlockmore_opts
 /* insert defaults here */
 
-#define DEFAULTS       "*delay:       20000       \n" \
-                        "*showFPS:       False       \n" \
-                        "*rotate:       True       \n" \
-                       "*wireframe:    False   \n"     \
+#define DEFAULTS "*delay:     20000 \n" \
+                 "*showFPS:   False \n" \
+                 "*rotate:    True  \n" \
+                 "*wireframe: False \n" \
+                 "*useSHM:    True  \n"
 
 # include "xlockmore.h"                         /* from the xscreensaver distribution */
 #else  /* !STANDALONE */
 
 # include "xlockmore.h"                         /* from the xscreensaver distribution */
 #else  /* !STANDALONE */
@@ -51,6 +52,7 @@ int rotate;
 int winw, winh;
 int tw, th; /* texture width, height */
 int tx, ty;
 int winw, winh;
 int tw, th; /* texture width, height */
 int tx, ty;
+GLfloat min_tx, min_ty;
 GLfloat max_tx, max_ty;
 
 #define QW 12
 GLfloat max_tx, max_ty;
 
 #define QW 12
@@ -118,7 +120,7 @@ Bool
 screenflip_handle_event (ModeInfo *mi, XEvent *event)
 {
   if (event->xany.type == ButtonPress &&
 screenflip_handle_event (ModeInfo *mi, XEvent *event)
 {
   if (event->xany.type == ButtonPress &&
-      event->xbutton.button & Button1)
+      event->xbutton.button == Button1)
     {
       button_down_p = True;
       gltrackball_start (trackball,
     {
       button_down_p = True;
       gltrackball_start (trackball,
@@ -127,11 +129,19 @@ screenflip_handle_event (ModeInfo *mi, XEvent *event)
       return True;
     }
   else if (event->xany.type == ButtonRelease &&
       return True;
     }
   else if (event->xany.type == ButtonRelease &&
-           event->xbutton.button & Button1)
+           event->xbutton.button == Button1)
     {
       button_down_p = False;
       return True;
     }
     {
       button_down_p = False;
       return True;
     }
+  else if (event->xany.type == ButtonPress &&
+           (event->xbutton.button == Button4 ||
+            event->xbutton.button == Button5))
+    {
+      gltrackball_mousewheel (trackball, event->xbutton.button, 10,
+                              !!event->xbutton.state);
+      return True;
+    }
   else if (event->xany.type == MotionNotify &&
            button_down_p)
     {
   else if (event->xany.type == MotionNotify &&
            button_down_p)
     {
@@ -149,7 +159,6 @@ screenflip_handle_event (ModeInfo *mi, XEvent *event)
 void showscreen(int frozen, int wire)
 {
   static GLfloat r = 1, g = 1, b = 1, a = 1;
 void showscreen(int frozen, int wire)
 {
   static GLfloat r = 1, g = 1, b = 1, a = 1;
-  GLfloat qxw, qyh;
   GLfloat x, y, w, h;
   /* static int stretch; */
   static GLfloat stretch_val_x = 0, stretch_val_y = 0;
   GLfloat x, y, w, h;
   /* static int stretch; */
   static GLfloat stretch_val_x = 0, stretch_val_y = 0;
@@ -172,10 +181,10 @@ void showscreen(int frozen, int wire)
   if (stretch_val_dy == 0 && !frozen && !(random() % 25))
     stretch_val_dy = (float)(random() % 100) / 5000;
     
   if (stretch_val_dy == 0 && !frozen && !(random() % 25))
     stretch_val_dy = (float)(random() % 100) / 5000;
     
-  qxw = qx+qw;
-  qyh = qy-qh;
-  x = qx; y = qy;
-  w = qxw; h = qyh;
+  x = qx;
+  y = qy;
+  w = qx+qw;
+  h = qy-qh;
 
   if (!frozen) {
      w *= sin (stretch_val_x) + 1;
 
   if (!frozen) {
      w *= sin (stretch_val_x) + 1;
@@ -212,33 +221,16 @@ void showscreen(int frozen, int wire)
   glBegin(wire ? GL_LINE_LOOP : GL_QUADS);
 
   glNormal3f(0, 0, 1);
   glBegin(wire ? GL_LINE_LOOP : GL_QUADS);
 
   glNormal3f(0, 0, 1);
-
-  glTexCoord2f(0, max_ty);
-  glVertex3f(x, y, 0);
-
-  glTexCoord2f(max_tx, max_ty);
-  glVertex3f(w, y, 0);
-
-  glTexCoord2f(max_tx, 0);
-  glVertex3f(w, h, 0);
-
-  glTexCoord2f(0, 0);
-  glVertex3f(x, h, 0);
+  glTexCoord2f(max_tx, max_ty); glVertex3f(w, h, 0);
+  glTexCoord2f(max_tx, min_ty); glVertex3f(w, y, 0);
+  glTexCoord2f(min_tx, min_ty); glVertex3f(x, y, 0);
+  glTexCoord2f(min_tx, max_ty); glVertex3f(x, h, 0);
 
   glNormal3f(0, 0, -1);
 
   glNormal3f(0, 0, -1);
-
-  glTexCoord2f(0, max_ty);
-  glVertex3f(x, y, -0.05);
-
-  glTexCoord2f(0, 0);
-  glVertex3f(x, h, -0.05);
-
-  glTexCoord2f(max_tx, 0);
-  glVertex3f(w, h, -0.05);
-
-  glTexCoord2f(max_tx, max_ty);
-  glVertex3f(w, y, -0.05);
-
+  glTexCoord2f(min_tx, min_ty); glVertex3f(x, y, -0.05);
+  glTexCoord2f(max_tx, min_ty); glVertex3f(w, y, -0.05);
+  glTexCoord2f(max_tx, max_ty); glVertex3f(w, h, -0.05);
+  glTexCoord2f(min_tx, max_ty); glVertex3f(x, h, -0.05);
   glEnd();
 
 
   glEnd();
 
 
@@ -399,60 +391,30 @@ void reshape_screenflip(ModeInfo *mi, int width, int height)
 
 void getSnapshot (ModeInfo *modeinfo)
 {
 
 void getSnapshot (ModeInfo *modeinfo)
 {
-  XImage *ximage;
-  int status;
+  Bool mipmap_p = True;
+  XRectangle geom;
+  int iw, ih;
 
   if (MI_IS_WIREFRAME(modeinfo))
     return;
 
 
   if (MI_IS_WIREFRAME(modeinfo))
     return;
 
- ximage = screen_to_ximage (modeinfo->xgwa.screen, modeinfo->window, NULL);
-
-  qw = QW; qh = QH;
-  tw = modeinfo->xgwa.width;
-  th = modeinfo->xgwa.height;
-
-#if 0  /* jwz: this makes the image start off the bottom right of the screen */
-  qx += (qw*tw/winw);
-  qy -= (qh*th/winh);
-#endif
-
-  qw *= (GLfloat)tw/winw;
-  qh *= (GLfloat)th/winh;
-
-  max_tx = (GLfloat) tw / (GLfloat) ximage->width;
-  max_ty = (GLfloat) th / (GLfloat) ximage->height;
+  if (! screen_to_texture (modeinfo->xgwa.screen, modeinfo->window, 0, 0,
+                           mipmap_p, NULL, &geom, &iw, &ih, &tw, &th))
+    exit (1);
 
 
+  min_tx = (GLfloat) geom.x / tw;
+  min_ty = (GLfloat) geom.y / th;
+  max_tx = (GLfloat) (geom.x + geom.width)  / tw;
+  max_ty = (GLfloat) (geom.y + geom.height) / th;
 
 
- glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
-                  GL_LINEAR_MIPMAP_LINEAR);
-
- clear_gl_error();
- status = gluBuild2DMipmaps(GL_TEXTURE_2D, 3,
-                            ximage->width, ximage->height,
-                            GL_RGBA, GL_UNSIGNED_BYTE, ximage->data);
-
- if (!status && glGetError())
-   /* Some implementations of gluBuild2DMipmaps(), but set a GL error anyway.
-      We could just call check_gl_error(), but that would exit. */
-   status = -1;
-
- if (status)
-   {
-     const char *s = (char *) gluErrorString (status);
-     fprintf (stderr, "%s: error mipmapping %dx%d texture: %s\n",
-              progname, ximage->width, ximage->height,
-              (s ? s : "(unknown)"));
-     fprintf (stderr, "%s: turning on -wireframe.\n", progname);
-     MI_IS_WIREFRAME(modeinfo) = 1;
-     clear_gl_error();
-   }
- check_gl_error("mipmapping");  /* should get a return code instead of a
-                                   GL error, but just in case... */
+  qx = -QW/2 + ((GLfloat) geom.x * QW / iw);
+  qy =  QH/2 - ((GLfloat) geom.y * QH / ih);
+  qw = QW * ((GLfloat) geom.width  / iw);
+  qh = QH * ((GLfloat) geom.height / ih);
 
 
free(ximage->data);
- ximage->data = 0;
XDestroyImage (ximage);
 glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+  glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
                  (mipmap_p ? GL_LINEAR_MIPMAP_LINEAR : GL_LINEAR));
 }
 
 void init_screenflip(ModeInfo *mi)
 }
 
 void init_screenflip(ModeInfo *mi)
@@ -485,7 +447,7 @@ void init_screenflip(ModeInfo *mi)
      glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);
      glEnable(GL_DEPTH_TEST);
      glEnable(GL_CULL_FACE);
      glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);
      glEnable(GL_DEPTH_TEST);
      glEnable(GL_CULL_FACE);
-     glCullFace(GL_FRONT);
+     glCullFace(GL_BACK);
      glDisable(GL_LIGHTING);
    }
 
      glDisable(GL_LIGHTING);
    }
 
index e9fd5a8ec1b89f7119beb887e8382c98a1457c6f..31563189af84bdfc919408b7d57fa8ff751e97e5 100644 (file)
@@ -324,7 +324,7 @@ toaster_handle_event (ModeInfo *mi, XEvent *event)
   toaster_configuration *bp = &bps[MI_SCREEN(mi)];
 
   if (event->xany.type == ButtonPress &&
   toaster_configuration *bp = &bps[MI_SCREEN(mi)];
 
   if (event->xany.type == ButtonPress &&
-      event->xbutton.button & Button1)
+      event->xbutton.button == Button1)
     {
       bp->button_down_p = True;
       gltrackball_start (bp->user_trackball,
     {
       bp->button_down_p = True;
       gltrackball_start (bp->user_trackball,
@@ -333,11 +333,19 @@ toaster_handle_event (ModeInfo *mi, XEvent *event)
       return True;
     }
   else if (event->xany.type == ButtonRelease &&
       return True;
     }
   else if (event->xany.type == ButtonRelease &&
-           event->xbutton.button & Button1)
+           event->xbutton.button == Button1)
     {
       bp->button_down_p = False;
       return True;
     }
     {
       bp->button_down_p = False;
       return True;
     }
+  else if (event->xany.type == ButtonPress &&
+           (event->xbutton.button == Button4 ||
+            event->xbutton.button == Button5))
+    {
+      gltrackball_mousewheel (bp->user_trackball, event->xbutton.button, 5,
+                              !event->xbutton.state);
+      return True;
+    }
   else if (event->xany.type == MotionNotify &&
            bp->button_down_p)
     {
   else if (event->xany.type == MotionNotify &&
            bp->button_down_p)
     {
index 47e8a700dbaf3159b8b4895bfb31300318db599a..c0321e7ae4c4dffb8170cfc00fa85ad7022a8899 100644 (file)
@@ -230,8 +230,6 @@ text_to_ximage (Screen *screen, Visual *visual,
                      XGetPixel (ximage1, x, y2) ? fg : bg);
       }
 
                      XGetPixel (ximage1, x, y2) ? fg : bg);
       }
 
-    free (ximage1->data);
-    ximage1->data = 0;
     XDestroyImage (ximage1);
 
 #if 0
     XDestroyImage (ximage1);
 
 #if 0
index 237ef1fef6daf9bab1a6d5d79e6e9af977727e7d..9d50cad5213e8d25785e2abab5886db5ffa6064c 100644 (file)
@@ -91,22 +91,23 @@ fps_print_string (ModeInfo *mi, GLfloat x, GLfloat y, const char *string)
      here, which would kind of defeat the purpose of centralizing this
      code in one file.
    */
      here, which would kind of defeat the purpose of centralizing this
      code in one file.
    */
-  glPushAttrib(GL_TRANSFORM_BIT |  /* for matrix contents */
-               GL_ENABLE_BIT |     /* for various glDisable calls */
-               GL_CURRENT_BIT |    /* for glColor3f() */
-               GL_LIST_BIT);       /* for glListBase() */
+  glPushAttrib (GL_TRANSFORM_BIT |  /* for matrix contents */
+                GL_ENABLE_BIT |     /* for various glDisable calls */
+                GL_CURRENT_BIT |    /* for glColor3f() */
+                GL_LIST_BIT);       /* for glListBase() */
   {
 # ifdef DEBUG
     check_gl_error ("glPushAttrib");
 # endif
 
     /* disable lighting and texturing when drawing bitmaps!
   {
 # ifdef DEBUG
     check_gl_error ("glPushAttrib");
 # endif
 
     /* disable lighting and texturing when drawing bitmaps!
-       (glPopAttrib() restores these, I believe.)
+       (glPopAttrib() restores these.)
      */
      */
-    glDisable(GL_TEXTURE_2D);
-    glDisable(GL_LIGHTING);
-    glDisable(GL_BLEND);
-    glDisable(GL_DEPTH_TEST);
+    glDisable (GL_TEXTURE_2D);
+    glDisable (GL_LIGHTING);
+    glDisable (GL_BLEND);
+    glDisable (GL_DEPTH_TEST);
+    glDisable (GL_CULL_FACE);
 
     /* glPopAttrib() does not restore matrix changes, so we must
        push/pop the matrix stacks to be non-intrusive there.
 
     /* glPopAttrib() does not restore matrix changes, so we must
        push/pop the matrix stacks to be non-intrusive there.
index b9a8871ecdfff670609b2c1bba0a59a3a2ea82a9..15d99dba5a345052e895a42c3d62586d40bba40f 100644 (file)
@@ -919,7 +919,7 @@ gears_handle_event (ModeInfo *mi, XEvent *event)
   gearsstruct *gp = &gears[MI_SCREEN(mi)];
 
   if (event->xany.type == ButtonPress &&
   gearsstruct *gp = &gears[MI_SCREEN(mi)];
 
   if (event->xany.type == ButtonPress &&
-      event->xbutton.button & Button1)
+      event->xbutton.button == Button1)
     {
       gp->button_down_p = True;
       gltrackball_start (gp->trackball,
     {
       gp->button_down_p = True;
       gltrackball_start (gp->trackball,
@@ -928,11 +928,19 @@ gears_handle_event (ModeInfo *mi, XEvent *event)
       return True;
     }
   else if (event->xany.type == ButtonRelease &&
       return True;
     }
   else if (event->xany.type == ButtonRelease &&
-           event->xbutton.button & Button1)
+           event->xbutton.button == Button1)
     {
       gp->button_down_p = False;
       return True;
     }
     {
       gp->button_down_p = False;
       return True;
     }
+  else if (event->xany.type == ButtonPress &&
+           (event->xbutton.button == Button4 ||
+            event->xbutton.button == Button5))
+    {
+      gltrackball_mousewheel (gp->trackball, event->xbutton.button, 10,
+                              !!event->xbutton.state);
+      return True;
+    }
   else if (event->xany.type == MotionNotify &&
            gp->button_down_p)
     {
   else if (event->xany.type == MotionNotify &&
            gp->button_down_p)
     {
index 51aa59778b31c20fecd18daba5bc961b8045cbc4..bbe655f8ca36d89dcc29c599927d2ca230480a2d 100644 (file)
@@ -61,7 +61,8 @@
                                         "*waveChange:   50      \n" \
                                         "*waveHeight:  0.8      \n" \
                                         "*waveFreq:    3.0      \n" \
                                         "*waveChange:   50      \n" \
                                         "*waveHeight:  0.8      \n" \
                                         "*waveFreq:    3.0      \n" \
-                                        "*zoom:        1.0      \n" 
+                                        "*zoom:        1.0      \n" \
+                                        "*useSHM:      True     \n" 
 
 
 # include "xlockmore.h"                                /* from the xscreensaver distribution */
 
 
 # include "xlockmore.h"                                /* from the xscreensaver distribution */
 # endif /* VMS */
 #endif
 
 # endif /* VMS */
 #endif
 
-#ifdef HAVE_PPM
-#include <ppm.h>
-#endif
-
 #undef countof
 #define countof(x) (sizeof((x))/sizeof((*x)))
 
 #undef countof
 #define countof(x) (sizeof((x))/sizeof((*x)))
 
@@ -99,7 +96,7 @@
 #include "gltrackball.h"
 
 
 #include "gltrackball.h"
 
 
-static enum {wire=0,solid,light,checker,textured,grab} _draw; /* draw style */
+static enum {wire=0,solid,light,checker,grab} _draw; /* draw style */
 static int _squares = 19;                                 /* grid size */
 static int _resolution = 4;                    /* wireframe resolution */
 static int _flat = 0;
 static int _squares = 19;                                 /* grid size */
 static int _resolution = 4;                    /* wireframe resolution */
 static int _flat = 0;
@@ -196,26 +193,17 @@ typedef struct {
     double dispy[MAXWAVES];
     double dispx[MAXWAVES];
     GLfloat colour[3];
     double dispy[MAXWAVES];
     double dispx[MAXWAVES];
     GLfloat colour[3];
-    int imageWidth;
-    int imageHeight;
-#ifdef HAVE_PPM
-       pixval imageMax;
-    pixel **image;
-#else
-       int imageMax;
-       GLubyte *image;
-#endif
     GLuint texName;
     GLfloat tex_xscale;
     GLfloat tex_yscale;
     GLuint texName;
     GLfloat tex_xscale;
     GLfloat tex_yscale;
+    XRectangle img_geom;
+    int img_width, img_height;
     void (*drawFunc)(void);
 } gfluxstruct;
 static gfluxstruct *gflux = NULL;
 
 /* prototypes */
 void initLighting(void);
     void (*drawFunc)(void);
 } gfluxstruct;
 static gfluxstruct *gflux = NULL;
 
 /* prototypes */
 void initLighting(void);
-void initTexture(void);
-void loadTexture(void);
 void grabTexture(void);
 void createTexture(void);
 void displaySolid(void);            /* drawFunc implementations */
 void grabTexture(void);
 void createTexture(void);
 void displaySolid(void);            /* drawFunc implementations */
@@ -242,7 +230,7 @@ Bool
 gflux_handle_event (ModeInfo *mi, XEvent *event)
 {
   if (event->xany.type == ButtonPress &&
 gflux_handle_event (ModeInfo *mi, XEvent *event)
 {
   if (event->xany.type == ButtonPress &&
-      event->xbutton.button & Button1)
+      event->xbutton.button == Button1)
     {
       button_down_p = True;
       gltrackball_start (trackball,
     {
       button_down_p = True;
       gltrackball_start (trackball,
@@ -251,11 +239,19 @@ gflux_handle_event (ModeInfo *mi, XEvent *event)
       return True;
     }
   else if (event->xany.type == ButtonRelease &&
       return True;
     }
   else if (event->xany.type == ButtonRelease &&
-           event->xbutton.button & Button1)
+           event->xbutton.button == Button1)
     {
       button_down_p = False;
       return True;
     }
     {
       button_down_p = False;
       return True;
     }
+  else if (event->xany.type == ButtonPress &&
+           (event->xbutton.button == Button4 ||
+            event->xbutton.button == Button5))
+    {
+      gltrackball_mousewheel (trackball, event->xbutton.button, 10,
+                              !!event->xbutton.state);
+      return True;
+    }
   else if (event->xany.type == MotionNotify &&
            button_down_p)
     {
   else if (event->xany.type == MotionNotify &&
            button_down_p)
     {
@@ -335,21 +331,12 @@ void initializeGL(ModeInfo *mi, GLsizei width, GLsizei height)
       gflux->drawFunc = (displayTexture);
       glEnable(GL_DEPTH_TEST);
       createTexture();
       gflux->drawFunc = (displayTexture);
       glEnable(GL_DEPTH_TEST);
       createTexture();
-      initTexture();
-      initLighting();
-    break;
-       case textured :
-      gflux->drawFunc = (displayTexture);
-      glEnable(GL_DEPTH_TEST);
-      loadTexture();
-      initTexture();
       initLighting();
     break;
        case grab :
       gflux->drawFunc = (displayTexture);
       glEnable(GL_DEPTH_TEST);
       grabTexture();
       initLighting();
     break;
        case grab :
       gflux->drawFunc = (displayTexture);
       glEnable(GL_DEPTH_TEST);
       grabTexture();
-      initTexture();
       initLighting();
     break;
     case wire :
       initLighting();
     break;
     case wire :
@@ -387,7 +374,6 @@ void init_gflux(ModeInfo * mi)
       else if (!strcasecmp (s, "solid"))   _draw = solid;
       else if (!strcasecmp (s, "light"))   _draw = light;
       else if (!strcasecmp (s, "checker")) _draw = checker;
       else if (!strcasecmp (s, "solid"))   _draw = solid;
       else if (!strcasecmp (s, "light"))   _draw = light;
       else if (!strcasecmp (s, "checker")) _draw = checker;
-      else if (!strcasecmp (s, "stdin"))   _draw = textured;
       else if (!strcasecmp (s, "grab"))    _draw = grab;
       else
         {
       else if (!strcasecmp (s, "grab"))    _draw = grab;
       else
         {
@@ -412,7 +398,6 @@ void init_gflux(ModeInfo * mi)
 /* cleanup code */
 void release_gflux(ModeInfo * mi)
 {
 /* cleanup code */
 void release_gflux(ModeInfo * mi)
 {
-    if(gflux->image!=NULL) free(gflux->image);
     if(gflux->glx_context!=NULL) free(gflux->glx_context);
     if (gflux != NULL) {
         (void) free((void *) gflux);
     if(gflux->glx_context!=NULL) free(gflux->glx_context);
     if (gflux != NULL) {
         (void) free((void *) gflux);
@@ -421,273 +406,55 @@ void release_gflux(ModeInfo * mi)
     FreeAllGL(mi);
 }
 
     FreeAllGL(mi);
 }
 
-#ifdef HAVE_PPM
 
 
-/* load pnm from stdin using pnm libs */
-void loadTexture(void)
-{
-    FILE *file = stdin;
-       gflux->image = ppm_readppm( file, 
-                       &(gflux->imageHeight), &(gflux->imageWidth), &(gflux->imageMax) );
-}
 
 
-/* creates an image for texture mapping */
 void createTexture(void)
 {
 void createTexture(void)
 {
-    int i,j,c;
-    pixel **result;
+  int size = 4;
+  unsigned int data[] = { 0xFFFFFFFF, 0xAAAAAAAA, 0xFFFFFFFF, 0xAAAAAAAA,
+                          0xAAAAAAAA, 0xFFFFFFFF, 0xAAAAAAAA, 0xFFFFFFFF,
+                          0xFFFFFFFF, 0xAAAAAAAA, 0xFFFFFFFF, 0xAAAAAAAA,
+                          0xAAAAAAAA, 0xFFFFFFFF, 0xAAAAAAAA, 0xFFFFFFFF };
 
 
-       gflux->imageHeight = gflux->imageWidth = 8;
+  gflux->tex_xscale = size;
+  gflux->tex_yscale = size;
 
 
-       result = ppm_allocarray(gflux->imageHeight,gflux->imageWidth);
-    for(i=0;i<gflux->imageHeight;i++) {
-        for(j=0;j<gflux->imageWidth;j++) {
-            c = (((i)%2 ^ (j)%2) ? 100 : 200 );
-                       PPM_ASSIGN( result[i][j] , c, c, c );
-        }
-    }
-       gflux->image = result;
-}
+  glGenTextures (1, &gflux->texName);
+  glBindTexture (GL_TEXTURE_2D, gflux->texName);
 
 
-/* specifies image as texture */    
-void initTexture(void)
-{
-       glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
-       glGenTextures(1, &gflux->texName);
-       glBindTexture(GL_TEXTURE_2D, gflux->texName);
-       glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
-       glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
-       glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
-       glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
-
-    clear_gl_error();
-       glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, gflux->imageWidth,
-                       gflux->imageHeight, 0, GL_RGB, GL_UNSIGNED_BYTE, *(gflux->image));
-    check_gl_error("texture");
-}
-
-#else /* HAVE_PPM FALSE */
-
-#define presult(A,B,C) (*(result+(A)*(gflux->imageWidth)*4+(B)*4+(C)))
-void loadTexture(void)
-{
-    int i, j, levels, width, height;
-    int red,green,blue;
-    char s[4];
-    int ppmType=0;
-    FILE *file = stdin;
-    GLubyte *result;
-
-    fgets(s,4,file);
-
-    if(!strncmp(s,"P6",2)) ppmType=6;
-    if(!strncmp(s,"P5",2)) ppmType=5;
-    if(!strncmp(s,"P3",2)) ppmType=3;
-    if(!strncmp(s,"P2",2)) ppmType=2;
-    if(!ppmType)exit(1);
-
-    while((i=getc(file))=='#')
-    {
-        while(getc(file)!='\n');
-    }
-    ungetc(i,file);
-
-    fscanf(file,"%d %d %d",&width,&height,&levels);
-
-    result = malloc(sizeof(GLubyte)*4*width*height);
-    gflux->imageWidth = width;
-    gflux->imageHeight = height;
-
-    switch(ppmType) {
-        case 2 :    /* ASCII grey */
-            for(i=0;i<height;i++) {
-                for(j=0;j<width;j++) {
-                    fscanf(file,"%d",&red);
-                    presult(j,i,0) = red;
-                    presult(j,i,1) = red;
-                    presult(j,i,2) = red;
-                }
-            }
-            break;
-        case 3 :    /* ASCII rgb */
-            for(i=0;i<height;i++) {
-                for(j=0;j<width;j++) {
-                   fscanf(file,"%d %d %d",&red,&green,&blue);
-                    presult(j,i,0) = red;
-                    presult(j,i,1) = green;
-                    presult(j,i,2) = blue;
-                }
-            }
-            break;
-        case 5 :    /* Binary grey */
-            getc(file); /* seems nessessary */
-            for(i=0;i<height;i++) {
-                for(j=0;j<width;j++) {
-                    red = getc(file);
-                    presult(j,i,0) = red;
-                    presult(j,i,1) = red;
-                    presult(j,i,2) = red;
-                }
-            }
-        break;
-        case 6 :    /* Binary rgb */
-            getc(file); /* seems nessessary */
-            for(i=0;i<height;i++) {
-                for(j=0;j<width;j++) {
-                    red = getc(file);
-                    green = getc(file);
-                    blue = getc(file);
-                    presult(j,i,0) = red;
-                    presult(j,i,1) = green;
-                    presult(j,i,2) = blue;
-                }
-            }
-        break;
-    }
-    gflux->image = result;
-}
-
-void createTexture(void)
-{
-    int i,j,c;
-    GLubyte *result;
-
-    gflux->imageHeight = gflux->imageWidth = 8;
-
-    result = malloc(sizeof(GLubyte)*4*gflux->imageHeight*gflux->imageWidth);
-    for(i=0;i<gflux->imageHeight;i++) {
-        for(j=0;j<gflux->imageWidth;j++) {
-            c = (((i)%2 ^ (j)%2) ? 100 : 200 );
-            presult(i,j,0) = (GLubyte) c;
-            presult(i,j,1) = (GLubyte) c;
-            presult(i,j,2) = (GLubyte) c;
-            presult(i,j,3) = (GLubyte) 255;
-        }
-    }
-    gflux->image = result;
-}
+  glTexImage2D (GL_TEXTURE_2D, 0, 3, size, size, 0,
+                GL_RGBA, GL_UNSIGNED_BYTE, data);
 
 
-/* specifies image as texture */
-void initTexture(void)
-{
-    clear_gl_error();
-    glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
-    glGenTextures(1, &gflux->texName);
-    glBindTexture(GL_TEXTURE_2D, gflux->texName);
-    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
-    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
-    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
-    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
-    check_gl_error("texture parameter");
-
-    /* Bail out if the texture is too large. */
-    {
-      GLint width;
-      glTexImage2D(GL_PROXY_TEXTURE_2D, 0, GL_RGBA, gflux->imageWidth,
-                   gflux->imageHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
-      glGetTexLevelParameteriv (GL_PROXY_TEXTURE_2D, 0,
-                                GL_TEXTURE_WIDTH, &width);
-      if (width <= 0)
-        {
-          glGetIntegerv (GL_MAX_TEXTURE_SIZE, &width);
-          fprintf (stderr,
-                   "%s: texture too large (%dx%d -- probable max %dx%d)\n",
-                   progname, gflux->imageWidth, gflux->imageHeight,
-                   width, width);
-          return;
-        }
-    }
+  glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+  glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
 
 
-    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, gflux->imageWidth,
-            gflux->imageHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, gflux->image);
-    check_gl_error("texture creation");
+  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
+  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
 }
 
 }
 
-#undef presult
-#endif
-
 
 void
 grabTexture(void)
 {
 
 void
 grabTexture(void)
 {
-  int real_width  = gflux->modeinfo->xgwa.width;
-  int real_height = gflux->modeinfo->xgwa.height;
-  XImage *ximage = screen_to_ximage (gflux->modeinfo->xgwa.screen,
-                                     gflux->window,
-                                     NULL);
-  Bool bigimage = False;
-  int size = 0;
-
-  if (ximage->width > 1280 ||   /* that's too damned big... */
-      ximage->height > 1280)
-    {
-      Display *dpy = gflux->modeinfo->dpy;
-      Visual *v = gflux->modeinfo->xgwa.visual;
-      int real_size = (ximage->width < ximage->height ?
-                       real_width : real_height);
-      XImage *x2;
-      int x, y, xoff, yoff;
-      size = (ximage->width < ximage->height ?
-              ximage->width : ximage->height);
-      bigimage = True;
-
-      if (size > 1024) size = 1024;
-
-      x2 = XCreateImage (dpy, v, 32, ZPixmap, 0, 0, size, size, 32, 0);
-      xoff = (real_width  > size ? (random() % (real_width  - size)) : 0);
-      yoff = (real_height > size ? (random() % (real_height - size)) : 0);
-
-# if 0
-      fprintf(stderr, "%s: cropping texture from %dx%d to %dx%d @ %d,%d\n",
-              progname, ximage->width, ximage->height, x2->width, x2->height,
-              xoff, yoff);
-# endif
-      x2->data = ximage->data;  /* we can reuse the same array */
-      for (y = 0; y < x2->height; y++)
-        for (x = 0; x < x2->width; x++)
-          XPutPixel (x2, x, y, XGetPixel (ximage, x+xoff, y+yoff));
-
-      real_width = real_height = real_size;
-      ximage->data = 0;
-      XDestroyImage (ximage);
-      ximage = x2;
-    }
-
-  /* Add a border. */
-  {
-    unsigned long gray = 0xAAAAAAAAL;  /* so shoot me */
-    int width  = (bigimage ? size : real_width);
-    int height = (bigimage ? size : real_height);
-    int i;
-    for (i = 0; i < real_height; i++)
-      {
-        XPutPixel (ximage, 0, i, gray);
-        XPutPixel (ximage, width-1, i, gray);
-      }
-    for (i = 0; i < real_width; i++)
-      {
-        XPutPixel (ximage, i, 0, gray);
-        XPutPixel (ximage, i, height-1, gray);
-      }
-  }
-
-  gflux->imageWidth  = ximage->width;
-  gflux->imageHeight = ximage->height;
-  gflux->image = (GLubyte *) ximage->data;
-
-  if (bigimage)  /* don't scale really large images */
-    {
-      gflux->tex_xscale = 1;
-      gflux->tex_yscale = 1;
-    }
-  else
-    {
-      gflux->tex_xscale = ((GLfloat) real_width  / (GLfloat) ximage->width);
-      gflux->tex_yscale = ((GLfloat) real_height / (GLfloat) ximage->height);
-    }
-
-  ximage->data = 0;
-  XDestroyImage (ximage);
+  Bool mipmap_p = True;
+  int iw, ih, tw, th;
+
+  if (MI_IS_WIREFRAME(gflux->modeinfo))
+    return;
+
+  if (! screen_to_texture (gflux->modeinfo->xgwa.screen,
+                           gflux->modeinfo->window, 0, 0, mipmap_p,
+                           NULL, &gflux->img_geom, &iw, &ih, &tw, &th))
+    exit (1);
+
+  gflux->tex_xscale =  (GLfloat) iw / tw;
+  gflux->tex_yscale = -(GLfloat) ih / th;
+  gflux->img_width  = iw;
+  gflux->img_height = ih;
+   
+  glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+  glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
+                   (mipmap_p ? GL_LINEAR_MIPMAP_LINEAR : GL_LINEAR));
 }
 
 
 }
 
 
@@ -745,6 +512,31 @@ void displayTexture(void)
     double xs = gflux->tex_xscale;
     double ys = gflux->tex_yscale;
 
     double xs = gflux->tex_xscale;
     double ys = gflux->tex_yscale;
 
+    double minx, miny, maxx, maxy;
+    double minu, minv;
+
+#if 0
+    minx = (GLfloat) gflux->img_geom.x / gflux->img_width;
+    miny = (GLfloat) gflux->img_geom.y / gflux->img_height;
+    maxx = ((GLfloat) (gflux->img_geom.x + gflux->img_geom.width) /
+            gflux->img_width);
+    maxy = ((GLfloat) (gflux->img_geom.y + gflux->img_geom.height) /
+            gflux->img_height);
+    minu = minx;
+    minv = miny;
+    minx = (minx * 2) - 1;
+    miny = (miny * 2) - 1;
+    maxx = (maxx * 2) - 1;
+    maxy = (maxy * 2) - 1;
+#else
+    minx = -1;
+    miny = -1;
+    maxx = 1;
+    maxy = 1;
+    minv = 0;
+    minu = 0;
+#endif
+
        glMatrixMode (GL_TEXTURE);
        glLoadIdentity ();
        glTranslatef(-1,-1,0);
        glMatrixMode (GL_TEXTURE);
        glLoadIdentity ();
        glTranslatef(-1,-1,0);
@@ -752,10 +544,10 @@ void displayTexture(void)
        glMatrixMode (GL_MODELVIEW);
 
     glLoadIdentity();
        glMatrixMode (GL_MODELVIEW);
 
     glLoadIdentity();
+    userRot();
     glRotatef(anglex,1,0,0);
     glRotatef(angley,0,1,0);
     glRotatef(anglez,0,0,1);
     glRotatef(anglex,1,0,0);
     glRotatef(angley,0,1,0);
     glRotatef(anglez,0,0,1);
-    userRot();
     glScalef(1,1,(GLfloat)_waveHeight);
     glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
        glEnable(GL_TEXTURE_2D);
     glScalef(1,1,(GLfloat)_waveHeight);
     glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
        glEnable(GL_TEXTURE_2D);
@@ -767,13 +559,11 @@ void displayTexture(void)
 
        glColor3f(0.5,0.5,0.5);
  
 
        glColor3f(0.5,0.5,0.5);
  
-    for(x=-1,u= 0;x<0.9999;x+=dx,u+=du) {
+    for(x = minx, u = minu; x < maxx - 0.01; x += dx, u += du) {
         glBegin(GL_QUAD_STRIP);
         glBegin(GL_QUAD_STRIP);
-        for(y=-1,v= 0;y<=1;y+=dy,v+=dv) {
+        for (y = miny, v = minv; y <= maxy + 0.01; y += dy, v += dv) {
             z = getGrid(x,y,time);
             z = getGrid(x,y,time);
-        /*  genColour(z);
-            glColor3fv(gflux->colour);
-        */  glTexCoord2f(u*xs,v*ys);
+            glTexCoord2f(u*xs,v*ys);
             glNormal3f(
                 getGrid(x+dx,y,time)-getGrid(x-dx,y,time),
                 getGrid(x,y+dy,time)-getGrid(x,y-dy,time),
             glNormal3f(
                 getGrid(x+dx,y,time)-getGrid(x-dx,y,time),
                 getGrid(x,y+dy,time)-getGrid(x,y-dy,time),
@@ -782,9 +572,7 @@ void displayTexture(void)
             glVertex3f(x,y,z);
 
             z = getGrid(x+dx,y,time);
             glVertex3f(x,y,z);
 
             z = getGrid(x+dx,y,time);
-        /*  genColour(z);
-            glColor3fv(gflux->colour);
-        */  glTexCoord2f((u+du)*xs,v*ys);
+            glTexCoord2f((u+du)*xs,v*ys);
             glNormal3f(
                 getGrid(x+dx+dx,y,time)-getGrid(x,y,time),
                 getGrid(x+dx,y+dy,time)-getGrid(x+dx,y-dy,time),
             glNormal3f(
                 getGrid(x+dx+dx,y,time)-getGrid(x,y,time),
                 getGrid(x+dx,y+dy,time)-getGrid(x+dx,y-dy,time),
@@ -795,6 +583,29 @@ void displayTexture(void)
         glEnd();
     }
 
         glEnd();
     }
 
+    /* Draw a border around the grid.
+     */
+    glColor3f(0.4, 0.4, 0.4);
+    glDisable(GL_TEXTURE_2D);
+    glEnable (GL_LINE_SMOOTH);
+
+    glBegin(GL_LINE_LOOP);
+    y = miny;
+    for (x = minx; x <= maxx; x += dx)
+      glVertex3f (x, y, getGrid (x, y, time));
+    x = maxx;
+    for (y = miny; y <= maxy; y += dy)
+      glVertex3f (x, y, getGrid (x, y, time));
+    y = maxy;
+    for (x = maxx; x >= minx; x -= dx)
+      glVertex3f (x, y, getGrid (x, y, time));
+    x = minx;
+    for (y = maxy; y >= miny; y -= dy)
+      glVertex3f (x, y, getGrid (x, y, time));
+
+    glEnd();
+    glEnable(GL_TEXTURE_2D);
+
     if (! button_down_p) {
       time -= _speed;
       anglex -= _rotationx;
     if (! button_down_p) {
       time -= _speed;
       anglex -= _rotationx;
index 59b0870d31ada815b1c40a079d6c7c7545b70709..9395d7c6997771dd0bf788f37b187a47153e9265 100644 (file)
@@ -363,7 +363,7 @@ glblur_handle_event (ModeInfo *mi, XEvent *event)
   glblur_configuration *bp = &bps[MI_SCREEN(mi)];
 
   if (event->xany.type == ButtonPress &&
   glblur_configuration *bp = &bps[MI_SCREEN(mi)];
 
   if (event->xany.type == ButtonPress &&
-      event->xbutton.button & Button1)
+      event->xbutton.button == Button1)
     {
       bp->button_down_p = True;
       gltrackball_start (bp->trackball,
     {
       bp->button_down_p = True;
       gltrackball_start (bp->trackball,
@@ -372,11 +372,19 @@ glblur_handle_event (ModeInfo *mi, XEvent *event)
       return True;
     }
   else if (event->xany.type == ButtonRelease &&
       return True;
     }
   else if (event->xany.type == ButtonRelease &&
-           event->xbutton.button & Button1)
+           event->xbutton.button == Button1)
     {
       bp->button_down_p = False;
       return True;
     }
     {
       bp->button_down_p = False;
       return True;
     }
+  else if (event->xany.type == ButtonPress &&
+           (event->xbutton.button == Button4 ||
+            event->xbutton.button == Button5))
+    {
+      gltrackball_mousewheel (bp->trackball, event->xbutton.button, 10,
+                              !!event->xbutton.state);
+      return True;
+    }
   else if (event->xany.type == MotionNotify &&
            bp->button_down_p)
     {
   else if (event->xany.type == MotionNotify &&
            bp->button_down_p)
     {
index 2c9fb3de2e517fc22c10ea19697878dcc053147c..e9863a227baf9f5cde874c9ba787f4a0c34029f4 100644 (file)
@@ -1,7 +1,7 @@
 /* -*- Mode: C; tab-width: 4 -*- */
 
 #if !defined( lint ) && !defined( SABER )
 /* -*- Mode: C; tab-width: 4 -*- */
 
 #if !defined( lint ) && !defined( SABER )
-static const char sccsid[] = "@(#)gleidescope.c        1.0 03/06/27 xlockmore";
+/*static const char sccsid[] = "@(#)gleidescope.c      1.0 03/06/27 xlockmore";*/
 #endif
 
 /* enable -grab switch */
 #endif
 
 /* enable -grab switch */
@@ -70,6 +70,7 @@ static const char sccsid[] = "@(#)gleidescope.c       1.0 03/06/27 xlockmore";
                "*image:                DEFAULT         \n"     \
                "*size:                 -1                      \n"     \
                "*duration:             30                      \n" \
                "*image:                DEFAULT         \n"     \
                "*size:                 -1                      \n"     \
                "*duration:             30                      \n" \
+               "*useSHM:               True            \n"
 
 # include "xlockmore.h"                                /* from the xscreensaver distribution */
 #else  /* !STANDALONE */
 
 # include "xlockmore.h"                                /* from the xscreensaver distribution */
 #else  /* !STANDALONE */
@@ -417,7 +418,8 @@ gleidescope_handle_event(ModeInfo *mi, XEvent *event)
        {
                case ButtonPress:
 
        {
                case ButtonPress:
 
-                       if (event->xbutton.button == Button1 || event->xbutton.button == Button3)
+                       if (event->xbutton.button == Button1 ||
+                event->xbutton.button == Button3)
                        {
                                /* store initial values of mouse */
                                xstart = event->xbutton.x;
                        {
                                /* store initial values of mouse */
                                xstart = event->xbutton.x;
@@ -443,7 +445,8 @@ gleidescope_handle_event(ModeInfo *mi, XEvent *event)
 
                case ButtonRelease:
 
 
                case ButtonRelease:
 
-                       if (event->xbutton.button == Button1 || event->xbutton.button == Button3)
+                       if (event->xbutton.button == Button1 ||
+                event->xbutton.button == Button3)
                        {
                                /* button is up */
                                gp->button_down_p = False;
                        {
                                /* button is up */
                                gp->button_down_p = False;
@@ -474,59 +477,24 @@ gleidescope_handle_event(ModeInfo *mi, XEvent *event)
 static void
 getSnapshot(ModeInfo *mi, GLuint name)
 {
 static void
 getSnapshot(ModeInfo *mi, GLuint name)
 {
-       XImage  *ximage;
-       int     status;
-       int     tw, th;
+    Bool mipmap_p = True;
+       int     iw, ih, tw, th;
        gleidestruct *gp = &gleidescope[MI_SCREEN(mi)];
 
        if (MI_IS_WIREFRAME(mi))
                return;
 
        gleidestruct *gp = &gleidescope[MI_SCREEN(mi)];
 
        if (MI_IS_WIREFRAME(mi))
                return;
 
-       ximage = screen_to_ximage(mi->xgwa.screen, mi->window, 0);
-
-       tw = mi->xgwa.width;
-       th = mi->xgwa.height;
-
-       gp->max_tx = (GLfloat) tw / (GLfloat) ximage->width;
-       gp->max_ty = (GLfloat) th / (GLfloat) ximage->height;
-
        glBindTexture (GL_TEXTURE_2D, name);
        glBindTexture (GL_TEXTURE_2D, name);
+    if (! screen_to_texture (mi->xgwa.screen, mi->window, 0, 0,
+                             mipmap_p, NULL, NULL, &iw, &ih, &tw, &th))
+      exit (1);
 
 
-       glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
-       glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
-                       GL_LINEAR_MIPMAP_LINEAR);
-
-       clear_gl_error();
-       status = gluBuild2DMipmaps(GL_TEXTURE_2D, 3,
-                       ximage->width, ximage->height,
-                       GL_RGBA, GL_UNSIGNED_BYTE, ximage->data);
-
-       if (!status && glGetError())
-               /* Some implementations of gluBuild2DMipmaps(), but set a GL error anyway.
-               **            We could just call check_gl_error(), but that would exit. */
-               status = -1;
-
-       if (status)
-       {
-               const GLubyte *s = gluErrorString (status);
-               if (s)
-               {
-                       fprintf (stderr, "%s: error mipmapping %dx%d texture: %s\n",
-                                       progname, ximage->width, ximage->height, s);
-               }
-               else
-               {
-                       fprintf (stderr, "%s: error mipmapping %dx%d texture: (unknown)\n",
-                                       progname, ximage->width, ximage->height);
-               }
-               clear_gl_error();
-       }
-       check_gl_error("mipmapping");  /* should get a return code instead of a
-                                                                         GL error, but just in case... */
+    gp->max_tx = (GLfloat) iw / tw;
+    gp->max_ty = (GLfloat) ih / th;
 
 
-       free(ximage->data);
-       ximage->data = 0;
-       XDestroyImage (ximage);
+    glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+    glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
+                     (mipmap_p ? GL_LINEAR_MIPMAP_LINEAR : GL_LINEAR));
 
        /* remember time of last image change */
        gp->start_time = time ((time_t *) 0);
 
        /* remember time of last image change */
        gp->start_time = time ((time_t *) 0);
index 255bc36b488395a51f060ac0766998e942daf957..3c0366efaaec98a2b0b7b0ccf12e097fc2412c95 100644 (file)
@@ -245,7 +245,7 @@ knot_handle_event (ModeInfo *mi, XEvent *event)
   knot_configuration *bp = &bps[MI_SCREEN(mi)];
 
   if (event->xany.type == ButtonPress &&
   knot_configuration *bp = &bps[MI_SCREEN(mi)];
 
   if (event->xany.type == ButtonPress &&
-      event->xbutton.button & Button1)
+      event->xbutton.button == Button1)
     {
       bp->button_down_p = True;
       gltrackball_start (bp->trackball,
     {
       bp->button_down_p = True;
       gltrackball_start (bp->trackball,
@@ -254,11 +254,19 @@ knot_handle_event (ModeInfo *mi, XEvent *event)
       return True;
     }
   else if (event->xany.type == ButtonRelease &&
       return True;
     }
   else if (event->xany.type == ButtonRelease &&
-           event->xbutton.button & Button1)
+           event->xbutton.button == Button1)
     {
       bp->button_down_p = False;
       return True;
     }
     {
       bp->button_down_p = False;
       return True;
     }
+  else if (event->xany.type == ButtonPress &&
+           (event->xbutton.button == Button4 ||
+            event->xbutton.button == Button5))
+    {
+      gltrackball_mousewheel (bp->trackball, event->xbutton.button, 5,
+                              !!event->xbutton.state);
+      return True;
+    }
   else if (event->xany.type == MotionNotify &&
            bp->button_down_p)
     {
   else if (event->xany.type == MotionNotify &&
            bp->button_down_p)
     {
index 85f33050914a2487c1186537ed352059ebb339a9..99157b516299041bc2a0474088a2071b799376b7 100644 (file)
@@ -626,13 +626,13 @@ matrix_handle_event (ModeInfo *mi, XEvent *event)
   matrix_configuration *mp = &mps[MI_SCREEN(mi)];
 
   if (event->xany.type == ButtonPress &&
   matrix_configuration *mp = &mps[MI_SCREEN(mi)];
 
   if (event->xany.type == ButtonPress &&
-      event->xbutton.button & Button1)
+      event->xbutton.button == Button1)
     {
       mp->button_down_p = True;
       return True;
     }
   else if (event->xany.type == ButtonRelease &&
     {
       mp->button_down_p = True;
       return True;
     }
   else if (event->xany.type == ButtonRelease &&
-           event->xbutton.button & Button1)
+           event->xbutton.button == Button1)
     {
       mp->button_down_p = False;
       return True;
     {
       mp->button_down_p = False;
       return True;
@@ -831,7 +831,6 @@ load_textures (ModeInfo *mi, Bool flip_p)
   glPixelStorei (GL_UNPACK_ALIGNMENT, 1);
   check_gl_error ("texture param");
 
   glPixelStorei (GL_UNPACK_ALIGNMENT, 1);
   check_gl_error ("texture param");
 
-  xi->data = 0;  /* don't free the texture data */
   XDestroyImage (xi);
 }
 
   XDestroyImage (xi);
 }
 
index e81199956d56fe22f00d4b17329297fd1ea059e0..91b4ad0ccc7087dc1a6d567f46b41270813204c7 100644 (file)
@@ -183,25 +183,6 @@ typedef struct {
 static planetstruct *planets = NULL;
 
 
 static planetstruct *planets = NULL;
 
 
-static inline void
-normalize(GLfloat v[3])
-{
-  GLfloat d = (GLfloat) sqrt((double) (v[0] * v[0] +
-                                       v[1] * v[1] +
-                                       v[2] * v[2]));
-  if (d != 0)
-    {
-      v[0] /= d;
-      v[1] /= d;
-      v[2] /= d;
-       }
-  else
-    {
-      v[0] = v[1] = v[2] = 0;
-       }
-}
-
-
 /* Set up and enable texturing on our object */
 static void
 setup_xpm_texture (ModeInfo *mi, char **xpm_data)
 /* Set up and enable texturing on our object */
 static void
 setup_xpm_texture (ModeInfo *mi, char **xpm_data)
@@ -467,7 +448,7 @@ planet_handle_event (ModeInfo *mi, XEvent *event)
   planetstruct *gp = &planets[MI_SCREEN(mi)];
 
   if (event->xany.type == ButtonPress &&
   planetstruct *gp = &planets[MI_SCREEN(mi)];
 
   if (event->xany.type == ButtonPress &&
-      event->xbutton.button & Button1)
+      event->xbutton.button == Button1)
     {
       gp->button_down_p = True;
       gltrackball_start (gp->trackball,
     {
       gp->button_down_p = True;
       gltrackball_start (gp->trackball,
@@ -476,11 +457,19 @@ planet_handle_event (ModeInfo *mi, XEvent *event)
       return True;
     }
   else if (event->xany.type == ButtonRelease &&
       return True;
     }
   else if (event->xany.type == ButtonRelease &&
-           event->xbutton.button & Button1)
+           event->xbutton.button == Button1)
     {
       gp->button_down_p = False;
       return True;
     }
     {
       gp->button_down_p = False;
       return True;
     }
+  else if (event->xany.type == ButtonPress &&
+           (event->xbutton.button == Button4 ||
+            event->xbutton.button == Button5))
+    {
+      gltrackball_mousewheel (gp->trackball, event->xbutton.button, 10,
+                              !!event->xbutton.state);
+      return True;
+    }
   else if (event->xany.type == MotionNotify &&
            gp->button_down_p)
     {
   else if (event->xany.type == MotionNotify &&
            gp->button_down_p)
     {
index 51817877a6e3820e9562cf44e1a060728b5c0cdd..c02f5aff25486ea28aa30eafc534e51707a41ea4 100644 (file)
@@ -1,11 +1,10 @@
-/* glslideshow, Copyright (c) 2003, 2004 Jamie Zawinski <jwz@jwz.org>
+/* glslideshow, Copyright (c) 2003-2005 Jamie Zawinski <jwz@jwz.org>
  * Loads a sequence of images and smoothly pans around them; crossfades
  * when loading new images.
  *
  * Loads a sequence of images and smoothly pans around them; crossfades
  * when loading new images.
  *
- * First version Copyright (c) 2002, 2003 Mike Oliphant (oliphant@gtk.org)
- * based on flipscreen3d, Copyright (C) 2001 Ben Buxton (bb@cactii.net).
- *
- * Almost entirely rewritten by jwz, 21-Jun-2003.
+ * Originally written by Mike Oliphant <oliphant@gtk.org> (c) 2002, 2003.
+ * Rewritten by jwz, 21-Jun-2003.
+ * Rewritten by jwz again, 6-Feb-2005.
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
  * documentation for any purpose is hereby granted without fee, provided that
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
  * documentation for any purpose is hereby granted without fee, provided that
  * software for any purpose.  It is provided "as is" without express or
  * implied warranty.
  *
  * software for any purpose.  It is provided "as is" without express or
  * implied warranty.
  *
- * TODO:
- *
- * - Resizing the window makes everything go black forevermore.  No idea why.
+ *****************************************************************************
  *
  *
+ * TODO:
  *
  * - When a new image is loaded, there is a glitch: animation pauses during
  *   the period when we're loading the image-to-fade-in.  On fast (2GHz)
  *
  * - When a new image is loaded, there is a glitch: animation pauses during
  *   the period when we're loading the image-to-fade-in.  On fast (2GHz)
- *   machines, this stutter is short but noticable (usually less than half a
+ *   machines, this stutter is short but noticable (usually around 1/10th
  *   second.)  On slower machines, it can be much more pronounced.
  *   second.)  On slower machines, it can be much more pronounced.
+ *   This turns out to be hard to fix...
+ *
+ *   Image loading happens in three stages:
+ *
+ *    1: Fork a process and run xscreensaver-getimage in the background.
+ *       This writes image data to a server-side X pixmap.
+ *
+ *    2: When that completes, a callback informs us that the pixmap is ready.
+ *       We must then download the pixmap data from the server with XGetImage
+ *       (or XShmGetImage.)
  *
  *
- *   In xscreensaver 4.17, I added the new functions fork_load_random_image()
- *   and fork_screen_to_ximage() to make it possible to do image loading in
- *   the background, in an attempt to solve this (the idea being to only swap
- *   in the new image once it has been loaded.)  Using those routines, we
- *   continue animating while the file system is being searched for an image
- *   file; while that image data is read, parsed, and decompressed; while that
- *   data is placed on a Pixmap in the X server.
+ *    3: Once we have the bits, we must convert them from server-native bitmap
+ *       layout to 32 bit RGBA in client-endianness, to make them usable as
+ *       OpenGL textures.
  *
  *
- *   However, two things still happen in the "parent" (glslideshow) process:
- *   converting that server-side Pixmap to a client-side XImage (XGetImage);
- *   and converting that XImage to an OpenGL texture (gluBuild2DMipmaps).
- *   It's possible that some new code would allow us to do the Pixmap-to-XImage
- *   conversion in the forked process (feed it back upstream through a pipe or
- *   SHM segment or something); however, it turns out that significant
- *   parent-process image-loading time is being spent in gluBuild2DMipmaps().
+ *    4: We must actually construct a texture.
  *
  *
- *   So, the next step would be to figure out some way to create a texture on
- *   the other end of the fork that would be usable by the parent process.  Is
- *   that even possible?  Is it possible to use a single GLX context in a
- *   multithreaded way like that?  (Or use a second GLX context, but allow the
- *   two contexts to share data?)
+ *   So, the speed of step 1 doesn't really matter, since that happens in
+ *   the background.  But steps 2, 3, and 4 happen in *this* process, and
+ *   cause the visible glitch.
  *
  *
- *   Another question remains: is the stalling happening in the GL/GLX
- *   libraries, or are we actually seeing a stall on the graphics pipeline?
- *   If the latter, then no amount of threading would help, because the
- *   bottleneck is pushing the bits from system memory to the graphics card.
+ *   Step 2 can't be moved to another process without opening a second
+ *   connection to the X server, which is pretty heavy-weight.  (That would
+ *   be possible, though; the other process could open an X connection,
+ *   retrieve the pixmap, and feed it back to us through a pipe or
+ *   something.)
  *
  *
- *   How does Apple do this with their MacOSX slideshow screen saver?  Perhaps
- *   it's easier for them because their OpenGL libraries have thread support
- *   at a lower level?
+ *   Step 3 might be able to be optimized by coding tuned versions of
+ *   grab-ximage.c:copy_ximage() for the most common depths and bit orders.
+ *   (Or by moving it into the other process along with step 2.)
  *
  *
+ *   Step 4 is the hard one, though.  It might be possible to speed up this
+ *   step if there is some way to allow two GL processes share texture
+ *   data.  Unless, of course, all the time being consumed by step 4 is
+ *   because the graphics pipeline is flooded, in which case, that other
+ *   process would starve the screen anyway.
  *
  *
- * - Even if the glitch was solved, there's still a bug in the background
- *   loading of images: as soon as the image comes in, we slap it into place
- *   in the target quad.  This can lead to an image being changed while it is
- *   still being drawn, if that quad happens to be visible already.  Instead,
- *   when the callback goes off, we should make sure to load it into the
- *   invisible quad, or if both are visible, we should wait until one goes
- *   invisible and then load it there (in other words, wait for the next
- *   fade-out to end.)
+ *   Is it possible to use a single GLX context in a multithreaded way?
+ *   Or use a second GLX context, but allow the two contexts to share data?
+ *   I can't find any documentation about this.
+ *
+ *   How does Apple do this with their MacOSX slideshow screen saver?
+ *   Perhaps it's easier for them because their OpenGL libraries have
+ *   thread support at a lower level?
  */
 
 #include <X11/Intrinsic.h>
 
  */
 
 #include <X11/Intrinsic.h>
 
-
 # define PROGCLASS "GLSlideshow"
 # define HACK_INIT init_slideshow
 # define HACK_DRAW draw_slideshow
 # define PROGCLASS "GLSlideshow"
 # define HACK_INIT init_slideshow
 # define HACK_DRAW draw_slideshow
 # define DEF_ZOOM           "75"
 # define DEF_FPS_CUTOFF     "5"
 # define DEF_TITLES         "False"
 # define DEF_ZOOM           "75"
 # define DEF_FPS_CUTOFF     "5"
 # define DEF_TITLES         "False"
+# define DEF_LETTERBOX      "True"
 # define DEF_DEBUG          "False"
 # define DEF_DEBUG          "False"
+# define DEF_MIPMAP         "True"
 
 #define DEFAULTS  "*delay:           20000                \n" \
                   "*fadeDuration:  " DEF_FADE_DURATION   "\n" \
                   "*panDuration:   " DEF_PAN_DURATION    "\n" \
                   "*imageDuration: " DEF_IMAGE_DURATION  "\n" \
                   "*zoom:          " DEF_ZOOM            "\n" \
 
 #define DEFAULTS  "*delay:           20000                \n" \
                   "*fadeDuration:  " DEF_FADE_DURATION   "\n" \
                   "*panDuration:   " DEF_PAN_DURATION    "\n" \
                   "*imageDuration: " DEF_IMAGE_DURATION  "\n" \
                   "*zoom:          " DEF_ZOOM            "\n" \
+                 "*titles:        " DEF_TITLES          "\n" \
                   "*FPScutoff:     " DEF_FPS_CUTOFF      "\n" \
                   "*FPScutoff:     " DEF_FPS_CUTOFF      "\n" \
-                 "*debug   :      " DEF_DEBUG           "\n" \
+                 "*letterbox:     " DEF_LETTERBOX       "\n" \
+                 "*debug:         " DEF_DEBUG           "\n" \
+                 "*mipmap:        " DEF_MIPMAP          "\n" \
                  "*wireframe:       False                \n" \
                   "*showFPS:         False                \n" \
                  "*fpsSolid:        True                 \n" \
                  "*wireframe:       False                \n" \
                   "*showFPS:         False                \n" \
                  "*fpsSolid:        True                 \n" \
-                 "*titles:        " DEF_TITLES  "\n" \
+                 "*useSHM:          True                 \n" \
                  "*titleFont:       -*-times-bold-r-normal-*-180-*\n" \
                   "*desktopGrabber:  xscreensaver-getimage -no-desktop %s\n"
 
                  "*titleFont:       -*-times-bold-r-normal-*-180-*\n" \
                   "*desktopGrabber:  xscreensaver-getimage -no-desktop %s\n"
 
 #include <stdio.h>
 #include <stdlib.h>
 #include "grab-ximage.h"
 #include <stdio.h>
 #include <stdlib.h>
 #include "grab-ximage.h"
+#include "glxfonts.h"
+
+extern XtAppContext app;
 
 typedef struct {
 
 typedef struct {
-  GLfloat x, y, w, h;
+  double x, y, w, h;
 } rect;
 
 typedef struct {
 } rect;
 
 typedef struct {
-  GLuint texid;                           /* which texture to draw */
-  enum { IN, OUT, DEAD } state;    /* how to draw it */
-  rect from, to;                  /* the journey this quad is taking */
-  char *title;
-} gls_quad;
+  ModeInfo *mi;
+  int id;                         /* unique number for debugging */
+  char *title;                    /* the filename of this image */
+  int w, h;                       /* size in pixels of the image */
+  int tw, th;                     /* size in pixels of the texture */
+  XRectangle geom;                /* where in the image the bits are */
+  Bool loaded_p;                  /* whether the image has finished loading */
+  Bool used_p;                    /* whether the image has yet appeared
+                                      on screen */
+  GLuint texid;                           /* which texture contains the image */
+  int refcount;                           /* how many sprites refer to this image */
+} image;
+
 
 
+typedef enum { NEW, IN, FULL, OUT, DEAD } sprite_state;
 
 typedef struct {
 
 typedef struct {
-  GLXContext *glx_context;
-  time_t start_time;           /* when we started displaying this image */
+  int id;                         /* unique number for debugging */
+  image *img;                     /* which image this animation displays */
+  GLfloat opacity;                /* how to render it */
+  double start_time;              /* when this animation began */
+  rect from, to, current;         /* the journey this image is taking */
+  sprite_state state;             /* the state we're in right now */
+  sprite_state prev_state;        /* the state we were in previously */
+  double state_time;              /* time of last state change */
+  int frame_count;                /* frames since last state change */
+} sprite;
 
 
-  int motion_frames;            /* how many frames each pan takes */
-  int fade_frames;              /* how many frames fading in/out takes */
 
 
-  gls_quad quads[2];           /* the (up to) 2 quads we animate */
-  GLuint texids[2];            /* textures: "old" and "new" */
-  GLuint current_texid;         /* the "new" one */
+typedef struct {
+  GLXContext *glx_context;
+  int nimages;                 /* how many images are loaded or loading now */
+  image *images[10];           /* pointers to the images */
 
 
-  int img_w, img_h;            /* Size (pixels) of currently-loaded image */
+  int nsprites;                        /* how many sprites are animating right now */
+  sprite *sprites[10];         /* pointers to the live sprites */
 
   double now;                  /* current time in seconds */
 
   double now;                  /* current time in seconds */
-  double pan_start_time;       /* when this pan began */
-  double image_start_time;     /* when this image was loaded */
   double dawn_of_time;         /* when the program launched */
   double dawn_of_time;         /* when the program launched */
+  double image_load_time;      /* time when we last loaded a new image */
+  double prev_frame_time;      /* time when we last drew a frame */
 
   Bool redisplay_needed_p;     /* Sometimes we can get away with not
                                    re-painting.  Tick this if a redisplay
                                    is required. */
 
   Bool redisplay_needed_p;     /* Sometimes we can get away with not
                                    re-painting.  Tick this if a redisplay
                                    is required. */
+  Bool change_now_p;           /* Set when the user clicks to ask for a new
+                                   image right now. */
 
   GLfloat fps;                  /* approximate frame rate we're achieving */
 
   GLfloat fps;                  /* approximate frame rate we're achieving */
-  int pan_frame_count;         /* More frame-rate stats */
-  int fade_frame_count;
-  Bool low_fps_p;              /* Whether we have compensated for a low
+  GLfloat theoretical_fps;      /* maximum frame rate that might be possible */
+  Bool checked_fps_p;          /* Whether we have checked for a low
                                    frame rate. */
 
                                    frame rate. */
 
-  Bool fork_p;                 /* threaded image loading; #### still buggy */
-
-  XFontStruct *xfont;
+  XFontStruct *xfont;          /* for printing image file names */
   GLuint font_dlist;
 
   GLuint font_dlist;
 
+  int sprite_id, image_id;      /* debugging id counters */
+
 } slideshow_state;
 
 static slideshow_state *sss = NULL;
 } slideshow_state;
 
 static slideshow_state *sss = NULL;
@@ -176,19 +202,27 @@ static int zoom;            /* How far in to zoom when panning, in percent of
                              */
 static int fps_cutoff;      /* If the frame-rate falls below this, turn off
                                zooming.*/
                              */
 static int fps_cutoff;      /* If the frame-rate falls below this, turn off
                                zooming.*/
+static Bool letterbox_p;    /* When a loaded image is not the same aspect
+                               ratio as the window, whether to display black
+                               bars.
+                             */
+static Bool mipmap_p;      /* Use mipmaps instead of single textures. */
 static Bool do_titles;     /* Display image titles. */
 static Bool debug_p;       /* Be loud and do weird things. */
 
 
 static XrmOptionDescRec opts[] = {
 static Bool do_titles;     /* Display image titles. */
 static Bool debug_p;       /* Be loud and do weird things. */
 
 
 static XrmOptionDescRec opts[] = {
-  {"-fade",     ".slideshow.fadeDuration",  XrmoptionSepArg, 0     },
-  {"-pan",      ".slideshow.panDuration",   XrmoptionSepArg, 0     },
-  {"-duration", ".slideshow.imageDuration", XrmoptionSepArg, 0     },
-  {"-zoom",     ".slideshow.zoom",          XrmoptionSepArg, 0     },
-  {"-cutoff",   ".slideshow.FPScutoff",     XrmoptionSepArg, 0     },
-  {"-titles",   ".slideshow.titles",        XrmoptionNoArg, "True" },
-  {"+titles",   ".slideshow.titles",        XrmoptionNoArg, "True" },
-  {"-debug",    ".slideshow.debug",         XrmoptionNoArg, "True" },
+  {"-fade",         ".fadeDuration",  XrmoptionSepArg, 0      },
+  {"-pan",          ".panDuration",   XrmoptionSepArg, 0      },
+  {"-duration",     ".imageDuration", XrmoptionSepArg, 0      },
+  {"-zoom",         ".zoom",          XrmoptionSepArg, 0      },
+  {"-cutoff",       ".FPScutoff",     XrmoptionSepArg, 0      },
+  {"-titles",       ".titles",        XrmoptionNoArg, "True"  },
+  {"-letterbox",    ".letterbox",     XrmoptionNoArg, "True"  },
+  {"-clip",         ".letterbox",     XrmoptionNoArg, "False"  },
+  {"-mipmaps",      ".mipmap",        XrmoptionNoArg, "True"  },
+  {"-no-mipmaps",   ".mipmap",        XrmoptionNoArg, "False" },
+  {"-debug",        ".debug",         XrmoptionNoArg, "True"  },
 };
 
 static argtype vars[] = {
 };
 
 static argtype vars[] = {
@@ -196,6 +230,8 @@ static argtype vars[] = {
   { &pan_seconds,   "panDuration",  "PanDuration",  DEF_PAN_DURATION,   t_Int},
   { &image_seconds, "imageDuration","ImageDuration",DEF_IMAGE_DURATION, t_Int},
   { &zoom,          "zoom",         "Zoom",         DEF_ZOOM,           t_Int},
   { &pan_seconds,   "panDuration",  "PanDuration",  DEF_PAN_DURATION,   t_Int},
   { &image_seconds, "imageDuration","ImageDuration",DEF_IMAGE_DURATION, t_Int},
   { &zoom,          "zoom",         "Zoom",         DEF_ZOOM,           t_Int},
+  { &mipmap_p,      "mipmap",       "Mipmap",       DEF_MIPMAP,        t_Bool},
+  { &letterbox_p,   "letterbox",    "Letterbox",    DEF_LETTERBOX,     t_Bool},
   { &fps_cutoff,    "FPScutoff",    "FPSCutoff",    DEF_FPS_CUTOFF,     t_Int},
   { &debug_p,       "debug",        "Debug",        DEF_DEBUG,         t_Bool},
   { &do_titles,     "titles",       "Titles",       DEF_TITLES,        t_Bool},
   { &fps_cutoff,    "FPScutoff",    "FPSCutoff",    DEF_FPS_CUTOFF,     t_Int},
   { &debug_p,       "debug",        "Debug",        DEF_DEBUG,         t_Bool},
   { &do_titles,     "titles",       "Titles",       DEF_TITLES,        t_Bool},
@@ -238,556 +274,651 @@ double_time (void)
 }
 
 
 }
 
 
-static void
-load_font (ModeInfo *mi, char *res, XFontStruct **fontP, GLuint *dlistP)
+static void image_loaded_cb (const char *filename, XRectangle *geom,
+                             int image_width, int image_height,
+                             int texture_width, int texture_height,
+                             void *closure);
+
+
+/* Allocate an image structure and start a file loading in the background.
+ */
+static image *
+alloc_image (ModeInfo *mi)
 {
 {
-  const char *font = get_string_resource (res, "Font");
-  XFontStruct *f;
-  Font id;
-  int first, last;
+  slideshow_state *ss = &sss[MI_SCREEN(mi)];
+  int wire = MI_IS_WIREFRAME(mi);
+  image *img = (image *) calloc (1, sizeof (*img));
+  Bool async_p = True;
 
 
-  if (!font) font = "-*-times-bold-r-normal-*-180-*";
+  img->id = ++ss->image_id;
+  img->loaded_p = False;
+  img->used_p = False;
+  img->mi = mi;
 
 
-  f = XLoadQueryFont(mi->dpy, font);
-  if (!f) f = XLoadQueryFont(mi->dpy, "fixed");
+  glGenTextures (1, &img->texid);
+  if (img->texid <= 0) abort();
 
 
-  id = f->fid;
-  first = f->min_char_or_byte2;
-  last = f->max_char_or_byte2;
-  
-  clear_gl_error ();
-  *dlistP = glGenLists ((GLuint) last+1);
-  check_gl_error ("glGenLists");
-  glXUseXFont(id, first, last-first+1, *dlistP + first);
-  check_gl_error ("glXUseXFont");
+  ss->image_load_time = ss->now;
 
 
-  *fontP = f;
+  if (wire)
+    image_loaded_cb (0, 0, 0, 0, 0, 0, img);
+  else if (async_p)
+    screen_to_texture_async (mi->xgwa.screen, mi->window, 0, 0, mipmap_p,
+                             img->texid, image_loaded_cb, img);
+  else
+    {
+      char *filename = 0;
+      XRectangle geom;
+      int iw=0, ih=0, tw=0, th=0;
+      glBindTexture (GL_TEXTURE_2D, img->texid);
+
+      if (! screen_to_texture (mi->xgwa.screen, mi->window, 0, 0, mipmap_p,
+                               &filename, &geom, &iw, &ih, &tw, &th))
+        exit(1);
+      image_loaded_cb (filename, &geom, iw, ih, tw, th, img);
+      if (filename) free (filename);
+    }
+
+  ss->images[ss->nimages++] = img;
+  if (ss->nimages >= countof(ss->images)) abort();
+
+  return img;
 }
 
 
 }
 
 
+/* Block until the first image is completely loaded.
+   We normally load images in the background, but we have nothing to draw
+   until we get that first image...
+ */
 static void
 static void
-print_title_string (ModeInfo *mi, const char *string, GLfloat x, GLfloat y)
+await_first_image (ModeInfo *mi)
 {
   slideshow_state *ss = &sss[MI_SCREEN(mi)];
 {
   slideshow_state *ss = &sss[MI_SCREEN(mi)];
-  XFontStruct *font = ss->xfont;
-  GLfloat line_height = font->ascent + font->descent;
+  image *img;
+  int i = 0;
+  if (ss->nimages != 0) abort();
+  img = alloc_image (mi);
 
 
-  y -= line_height;
+  while (! img->loaded_p)
+    {
+      usleep (100000);         /* check every 1/10th sec */
+      if (i++ > 600) abort();  /* if a minute has passed, we're broken */
 
 
-  glPushAttrib (GL_TRANSFORM_BIT |  /* for matrix contents */
-                GL_ENABLE_BIT);     /* for various glDisable calls */
-  glDisable (GL_LIGHTING);
-  glDisable (GL_DEPTH_TEST);
-  {
-    glMatrixMode(GL_PROJECTION);
-    glPushMatrix();
+      while (XtAppPending (app) & (XtIMTimer|XtIMAlternateInput))
+        XtAppProcessEvent (app, XtIMTimer|XtIMAlternateInput);
+    }
+
+  if (debug_p)
+    fprintf (stderr, "\n");
+}
+
+
+/* Callback that tells us that the texture has been loaded.
+ */
+static void
+image_loaded_cb (const char *filename, XRectangle *geom,
+                 int image_width, int image_height,
+                 int texture_width, int texture_height,
+                 void *closure)
+{
+  image *img = (image *) closure;
+  ModeInfo *mi = img->mi;
+  /* slideshow_state *ss = &sss[MI_SCREEN(mi)]; */
+
+  int wire = MI_IS_WIREFRAME(mi);
+
+  if (wire)
     {
     {
-      glLoadIdentity();
+      img->w = MI_WIDTH (mi) * (0.5 + frand (1.0));
+      img->h = MI_HEIGHT (mi);
+      img->geom.width  = img->w;
+      img->geom.height = img->h;
+      goto DONE;
+    }
 
 
-      glMatrixMode(GL_MODELVIEW);
-      glPushMatrix();
-      {
-        unsigned int i;
-        int x2 = x;
-        glLoadIdentity();
+  if (image_width == 0 || image_height == 0)
+    exit (1);
 
 
-        gluOrtho2D (0, mi->xgwa.width, 0, mi->xgwa.height);
+  glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+  glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
+                   mipmap_p ? GL_LINEAR_MIPMAP_LINEAR : GL_LINEAR);
 
 
-        glRasterPos2f (x, y);
-        for (i = 0; i < strlen(string); i++)
-          {
-            char c = string[i];
-            if (c == '\n')
-              {
-                glRasterPos2f (x, (y -= line_height));
-                x2 = x;
-              }
-            else
-              {
-                glCallList (ss->font_dlist + (int)(c));
-                x2 += (font->per_char
-                       ? font->per_char[c - font->min_char_or_byte2].width
-                       : font->min_bounds.width);
-              }
-          }
-      }
-      glPopMatrix();
+  glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
+  glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
+
+  img->w  = image_width;
+  img->h  = image_height;
+  img->tw = texture_width;
+  img->th = texture_height;
+  img->geom = *geom;
+  img->title = (filename ? strdup (filename) : 0);
+
+  if (img->title)   /* strip filename to part after last /. */
+    {
+      char *s = strrchr (img->title, '/');
+      if (s) strcpy (img->title, s+1);
     }
     }
-    glMatrixMode(GL_PROJECTION);
-    glPopMatrix();
-  }
-  glPopAttrib();
 
 
-  glMatrixMode(GL_MODELVIEW);
+  if (debug_p)
+    fprintf (stderr, "%s: loaded   img %2d: \"%s\"\n",
+             blurb(), img->id, (img->title ? img->title : "(null)"));
+ DONE:
+
+  img->loaded_p = True;
 }
 
 
 }
 
 
+
+/* Free the image and texture, after nobody is referencing it.
+ */
 static void
 static void
-draw_quad (ModeInfo *mi, gls_quad *q)
+destroy_image (ModeInfo *mi, image *img)
 {
   slideshow_state *ss = &sss[MI_SCREEN(mi)];
 {
   slideshow_state *ss = &sss[MI_SCREEN(mi)];
-  int wire = MI_IS_WIREFRAME(mi);
-  GLfloat ratio;
-  rect current;
-  GLfloat opacity;
-  double secs;
-  GLfloat texw = 0;
-  GLfloat texh = 0;
+  Bool freed_p = False;
+  int i;
 
 
-  if (q->state == DEAD)
-    return;
+  if (!img) abort();
+  if (!img->loaded_p) abort();
+  if (!img->used_p) abort();
+  if (img->texid <= 0) abort();
+  if (img->refcount != 0) abort();
 
 
-  secs = ss->now - ss->pan_start_time;
+  for (i = 0; i < ss->nimages; i++)            /* unlink it from the list */
+    if (ss->images[i] == img)
+      {
+        int j;
+        for (j = i; j < ss->nimages-1; j++)    /* pull remainder forward */
+          ss->images[j] = ss->images[j+1];
+        ss->images[j] = 0;
+        ss->nimages--;
+        freed_p = True;
+        break;
+      }
 
 
-  if (q->state == OUT)
-    secs += pan_seconds;
+  if (!freed_p) abort();
 
 
-  ratio = secs / (pan_seconds + fade_seconds);
+  if (debug_p)
+    fprintf (stderr, "%s: unloaded img %2d: \"%s\"\n",
+             blurb(), img->id, (img->title ? img->title : "(null)"));
 
 
-  current.x = q->from.x + ratio * (q->to.x - q->from.x);
-  current.y = q->from.y + ratio * (q->to.y - q->from.y);
-  current.w = q->from.w + ratio * (q->to.w - q->from.w);
-  current.h = q->from.h + ratio * (q->to.h - q->from.h);
+  if (img->title) free (img->title);
+  glDeleteTextures (1, &img->texid);
+  free (img);
+}
 
 
-  if (secs < fade_seconds)
-    opacity = secs / (GLfloat) fade_seconds;    /* fading in or out... */
-  else if (secs < pan_seconds)
-    opacity = 1;                               /* panning opaquely. */
-  else
-    opacity = 1 - ((secs - pan_seconds) /
-                   (GLfloat) fade_seconds);    /* fading in or out... */
 
 
-  if (q->state == OUT && opacity < 0.0001)
-    q->state = DEAD;
+/* Return an image to use for a sprite.
+   If it's time for a new one, get a new one.
+   Otherwise, use an old one.
+   Might return 0 if the machine is really slow.
+ */
+static image *
+get_image (ModeInfo *mi)
+{
+  slideshow_state *ss = &sss[MI_SCREEN(mi)];
+  image *img = 0;
+  double now = ss->now;
+  Bool want_new_p = (ss->change_now_p ||
+                     ss->image_load_time + image_seconds <= now);
+  image *new_img = 0;
+  image *old_img = 0;
+  image *loading_img = 0;
+  int i;
 
 
-  glPushMatrix();
+  for (i = 0; i < ss->nimages; i++)
+    {
+      image *img2 = ss->images[i];
+      if (!img2) abort();
+      if (!img2->loaded_p)
+        loading_img = img2;
+      else if (!img2->used_p)
+        new_img = img2;
+      else
+        old_img = img2;
+    }
 
 
-  glTranslatef (current.x, current.y, 0);
-  glScalef (current.w, current.h, 1);
+  if (want_new_p && new_img)
+    img = new_img, new_img = 0, ss->change_now_p = False;
+  else if (old_img)
+    img = old_img, old_img = 0;
+  else if (new_img)
+    img = new_img, new_img = 0, ss->change_now_p = False;
 
 
-  if (!wire)
-    {
-      texw = mi->xgwa.width  / (GLfloat) ss->img_w;
-      texh = mi->xgwa.height / (GLfloat) ss->img_h;
+  /* Make sure that there is always one unused image in the pipe.
+   */
+  if (!new_img && !loading_img)
+    alloc_image (mi);
 
 
-      glEnable (GL_TEXTURE_2D);
-      glEnable (GL_BLEND);
-      glBindTexture (GL_TEXTURE_2D, q->texid);
-      glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
-      glDepthMask (GL_FALSE);
+  return img;
+}
 
 
-      /* Draw the texture quad
-       */
-      glColor4f (1, 1, 1, opacity);
-      glNormal3f (0, 0, 1);
-      glBegin (GL_QUADS);
-      glTexCoord2f (0,    0);    glVertex3f (0, 0, 0);
-      glTexCoord2f (0,    texh); glVertex3f (0, 1, 0);
-      glTexCoord2f (texw, texh); glVertex3f (1, 1, 0);
-      glTexCoord2f (texw, 0);    glVertex3f (1, 0, 0);
-      glEnd();
 
 
-      glDisable (GL_TEXTURE_2D);
-      glDisable (GL_BLEND);
+/* Pick random starting and ending positions for the given sprite.
+ */
+static void
+randomize_sprite (ModeInfo *mi, sprite *sp)
+{
+  int vp_w = MI_WIDTH(mi);
+  int vp_h = MI_HEIGHT(mi);
+  int img_w = sp->img->geom.width;
+  int img_h = sp->img->geom.height;
+  int min_w, min_h, max_w, max_h;
+  double ratio = (double) img_h / img_w;
+
+  if (letterbox_p)
+    {
+      min_w = img_w;
+      min_h = img_h;
     }
     }
-
-  if (wire)
-    glColor4f ((q->texid == ss->texids[0] ? opacity : 0), 0,
-               (q->texid == ss->texids[0] ? 0 : opacity),
-               opacity);
   else
   else
-    glColor4f (1, 1, 1, opacity);
+    {
+      if (img_w < vp_w)
+        {
+          min_w = vp_w;
+          min_h = img_h * (float) vp_w / img_w;
+        }
+      else
+        {
+          min_w = img_w * (float) vp_h / img_h;
+          min_h = vp_h;
+        }
+    }
 
 
+  max_w = min_w * 100 / zoom;
+  max_h = min_h * 100 / zoom;
 
 
-  /* Draw a grid inside the box
-   */
-  if (wire)
+  sp->from.w = min_w + frand ((max_w - min_w) * 0.4);
+  sp->to.w   = max_w - frand ((max_w - min_w) * 0.4);
+  sp->from.h = sp->from.w * ratio;
+  sp->to.h   = sp->to.w   * ratio;
+
+  if (zoom == 100)     /* only one box, and it is centered */
     {
     {
-      GLfloat d = 0.1;
-      GLfloat x, y;
-      glBegin(GL_LINES);
-      glVertex3f (0, 0, 0); glVertex3f (1, 1, 0);
-      glVertex3f (1, 0, 0); glVertex3f (0, 1, 0);
-
-      for (y = 0; y < 1+d; y += d)
-        for (x = 0; x < 1+d; x += d)
-          {
-            glVertex3f (0, y, 0); glVertex3f (1, y, 0);
-            glVertex3f (x, 0, 0); glVertex3f (x, 1, 0);
-          }
-      glEnd();
+      sp->from.x = (sp->from.w > vp_w
+                    ? -(sp->from.w - vp_w) / 2
+                    :  (vp_w - sp->from.w) / 2);
+      sp->from.y = (sp->from.h > vp_h
+                    ? -(sp->from.h - vp_h) / 2
+                    :  (vp_h - sp->from.h) / 2);
+      sp->to = sp->from;
+    }
+  else                 /* position both boxes randomly */
+    {
+      sp->from.x = (sp->from.w > vp_w
+                    ? -frand (sp->from.w - vp_w)
+                    :  frand (vp_w - sp->from.w));
+      sp->from.y = (sp->from.h > vp_h
+                    ? -frand (sp->from.h - vp_h)
+                    :  frand (vp_h - sp->from.h));
+      sp->to.x   = (sp->to.w > vp_w
+                    ? -frand (sp->to.w - vp_w)
+                    :  frand (vp_w - sp->to.w));
+      sp->to.y   = (sp->to.h > vp_h
+                    ? -frand (sp->to.h - vp_h)
+                    :  frand (vp_h - sp->to.h));
     }
 
     }
 
-  if (do_titles &&
-      q->state != DEAD &&
-      q->title && *q->title)
+  if (random() & 1)
     {
     {
-      /* #### this is wrong -- I really want to draw this with
-         "1,1,1,opacity", so that the text gets laid down on top
-         of the image with alpha, but that doesn't work, and I
-         don't know why...
-       */
-      glColor4f (opacity, opacity, opacity, 1);
-      print_title_string (mi, q->title,
-                          10, mi->xgwa.height - 10);
+      rect swap = sp->to;
+      sp->to = sp->from;
+      sp->from = swap;
     }
 
     }
 
-  glPopMatrix();
+  /* Make sure the aspect ratios are within 0.0001 of each other.
+   */
+  if ((int) (0.5 + (sp->from.w * 1000 / sp->from.h)) !=
+      (int) (0.5 + (sp->to.w   * 1000 / sp->to.h)))
+    abort();
+
+  sp->from.x /= vp_w;
+  sp->from.y /= vp_h;
+  sp->from.w /= vp_w;
+  sp->from.h /= vp_h;
+  sp->to.x   /= vp_w;
+  sp->to.y   /= vp_h;
+  sp->to.w   /= vp_w;
+  sp->to.h   /= vp_h;
+}
 
 
-  if (debug_p)
-    {
-      /* Draw the "from" and "to" boxes
-       */
-      glColor4f ((q->texid == ss->texids[0] ? opacity : 0), 0,
-                 (q->texid == ss->texids[0] ? 0 : opacity),
-                 opacity);
 
 
-      glBegin (GL_LINE_LOOP);
-      glVertex3f (q->from.x,             q->from.y,             0);
-      glVertex3f (q->from.x + q->from.w, q->from.y,             0);
-      glVertex3f (q->from.x + q->from.w, q->from.y + q->from.h, 0);
-      glVertex3f (q->from.x,             q->from.y + q->from.h, 0);
-      glEnd();
+/* Allocate a new sprite and start its animation going.
+ */
+static sprite *
+new_sprite (ModeInfo *mi)
+{
+  slideshow_state *ss = &sss[MI_SCREEN(mi)];
+  image *img = get_image (mi);
+  sprite *sp;
 
 
-      glBegin (GL_LINE_LOOP);
-      glVertex3f (q->to.x,               q->to.y,               0);
-      glVertex3f (q->to.x + q->to.w,     q->to.y,               0);
-      glVertex3f (q->to.x + q->to.w,     q->to.y + q->to.h,     0);
-      glVertex3f (q->to.x,               q->to.y + q->to.h,     0);
-      glEnd();
+  if (!img)
+    {
+      /* Oops, no images yet!  The machine is probably hurting bad.
+         Let's give it some time before thrashing again. */
+      usleep (250000);
+      return 0;
     }
     }
+
+  sp = (sprite *) calloc (1, sizeof (*sp));
+  sp->id = ++ss->sprite_id;
+  sp->start_time = ss->now;
+  sp->state_time = sp->start_time;
+  sp->state = sp->prev_state = NEW;
+  sp->img = img;
+
+  sp->img->refcount++;
+  sp->img->used_p = True;
+
+  ss->sprites[ss->nsprites++] = sp;
+  if (ss->nsprites >= countof(ss->sprites)) abort();
+
+  randomize_sprite (mi, sp);
+
+  return sp;
 }
 
 
 }
 
 
+/* Free the given sprite, and decrement the reference count on its image.
+ */
 static void
 static void
-draw_quads (ModeInfo *mi)
+destroy_sprite (ModeInfo *mi, sprite *sp)
 {
   slideshow_state *ss = &sss[MI_SCREEN(mi)];
 {
   slideshow_state *ss = &sss[MI_SCREEN(mi)];
-  GLfloat s, o;
+  Bool freed_p = False;
+  image *img;
   int i;
 
   int i;
 
-  glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
-
-  glPushMatrix();
-
-  s = (100.0 / zoom);
-  o = (1-s)/2;
-  glTranslatef (o, o, 0);
-  glScalef (s, s, s);
+  if (!sp) abort();
+  if (sp->state != DEAD) abort();
+  img = sp->img;
+  if (!img) abort();
+  if (!img->loaded_p) abort();
+  if (!img->used_p) abort();
+  if (img->refcount <= 0) abort();
 
 
-  for (i = 0; i < countof(ss->quads); i++)
-    draw_quad (mi, &ss->quads[i]);
+  for (i = 0; i < ss->nsprites; i++)           /* unlink it from the list */
+    if (ss->sprites[i] == sp)
+      {
+        int j;
+        for (j = i; j < ss->nsprites-1; j++)   /* pull remainder forward */
+          ss->sprites[j] = ss->sprites[j+1];
+        ss->sprites[j] = 0;
+        ss->nsprites--;
+        freed_p = True;
+        break;
+      }
 
 
-  glPopMatrix();
+  if (!freed_p) abort();
+  free (sp);
+  sp = 0;
 
 
-  if (debug_p)
-    {
-      glColor4f (1, 1, 1, 1);
-      glBegin (GL_LINE_LOOP);
-      glVertex3f (0, 0, 0);
-      glVertex3f (0, 1, 0);
-      glVertex3f (1, 1, 0);
-      glVertex3f (1, 0, 0);
-      glEnd();
-    }
+  img->refcount--;
+  if (img->refcount < 0) abort();
+  if (img->refcount == 0)
+    destroy_image (mi, img);
 }
 
 
 }
 
 
-/* Re-randomize the state of the given quad.
+/* Updates the sprite for the current frame of the animation based on
+   its creation time compared to the current wall clock.
  */
 static void
  */
 static void
-reset_quad (ModeInfo *mi, gls_quad *q)
+tick_sprite (ModeInfo *mi, sprite *sp)
 {
 {
-/*  slideshow_state *ss = &sss[MI_SCREEN(mi)];*/
+  slideshow_state *ss = &sss[MI_SCREEN(mi)];
+  image *img = sp->img;
+  double now = ss->now;
+  double secs;
+  double ratio;
+  rect prev_rect = sp->current;
+  GLfloat prev_opacity = sp->opacity;
 
 
-  GLfloat mid_w = (zoom / 100.0);
-  GLfloat mid_h = (zoom / 100.0);
-  GLfloat mid_x = (1 - mid_w) / 2;
-  GLfloat mid_y = (1 - mid_h) / 2;
+  if (! sp->img) abort();
+  if (! img->loaded_p) abort();
 
 
-  GLfloat small = mid_w + frand ((1 - mid_w) * 0.3);
-#if 0
-  GLfloat large = small + frand ((1 - small) / 2) + ((1 - small) / 2);
-#else
-  GLfloat large = small + frand (1 - small);
-#endif
+  secs = now - sp->start_time;
+  ratio = secs / (pan_seconds + fade_seconds);
+  if (ratio > 1) ratio = 1;
 
 
-  if (q->state != DEAD)
-    abort();    /* we should only be resetting a quad when it's not visible. */
+  sp->current.x = sp->from.x + ratio * (sp->to.x - sp->from.x);
+  sp->current.y = sp->from.y + ratio * (sp->to.y - sp->from.y);
+  sp->current.w = sp->from.w + ratio * (sp->to.w - sp->from.w);
+  sp->current.h = sp->from.h + ratio * (sp->to.h - sp->from.h);
 
 
-  /* Possible box sizes range between "zoom" and "100%".
-     Pick a small box size, and a large box size.
-     Assign each a random position within the 1x1 box,
-     such that they encompass the middle "zoom" percentage.
-     One of those is the start, and one is the end.
-     Each frame will transition between one and the other.
-   */
+  sp->prev_state = sp->state;
 
 
-  if (random() & 1)
+  if (secs < fade_seconds)
+    {
+      sp->state = IN;
+      sp->opacity = secs / (GLfloat) fade_seconds;
+    }
+  else if (secs < pan_seconds)
+    {
+      sp->state = FULL;
+      sp->opacity = 1;
+    }
+  else if (secs < pan_seconds + fade_seconds)
     {
     {
-      q->from.w = small; q->from.h = small;
-      q->to.w   = large; q->to.h   = large;
+      sp->state = OUT;
+      sp->opacity = 1 - ((secs - pan_seconds) / (GLfloat) fade_seconds);
     }
   else
     {
     }
   else
     {
-      q->from.w = large; q->from.h = large;
-      q->to.w   = small; q->to.h   = small;
+      sp->state = DEAD;
+      sp->opacity = 0;
     }
 
     }
 
-  q->from.x = mid_x - frand (q->from.w - mid_w);
-  q->from.y = mid_y - frand (q->from.h - mid_h);
-  q->to.x   = mid_x - frand (q->to.w - mid_w);
-  q->to.y   = mid_y - frand (q->to.w - mid_h);
-
-  q->state = IN;
-}
-
+  if (sp->state != sp->prev_state &&
+      (sp->prev_state == IN ||
+       sp->prev_state == FULL))
+    {
+      double secs = now - sp->state_time;
 
 
-/* Shrinks the XImage by a factor of two.
- */
-static void
-shrink_image (ModeInfo *mi, XImage *ximage)
-{
-  int w2 = ximage->width/2;
-  int h2 = ximage->height/2;
-  int x, y;
-  XImage *ximage2;
+      if (debug_p)
+        fprintf (stderr,
+                 "%s: %s %3d frames %2.0f sec %5.1f fps (%.1f fps?)\n",
+                 blurb(),
+                 (sp->prev_state == IN ? "fade" : "pan "),
+                 sp->frame_count,
+                 secs,
+                 sp->frame_count / secs,
+                 ss->theoretical_fps);
+
+      sp->state_time = now;
+      sp->frame_count = 0;
+    }
 
 
-  if (w2 <= 32 || h2 <= 32)   /* let's not go crazy here, man. */
-    return;
+  sp->frame_count++;
 
 
-  if (debug_p)
-    fprintf (stderr, "%s: debug: shrinking image %dx%d -> %dx%d\n",
-             blurb(), ximage->width, ximage->height, w2, h2);
-
-  ximage2 = XCreateImage (MI_DISPLAY (mi), mi->xgwa.visual,
-                          32, ZPixmap, 0, 0,
-                          w2, h2, 32, 0);
-  ximage2->data = (char *) calloc (h2, ximage2->bytes_per_line);
-  if (!ximage2->data)
-    {
-      fprintf (stderr, "%s: out of memory (scaling %dx%d image to %dx%d)\n",
-               blurb(), ximage->width, ximage->height, w2, h2);
-      exit (1);
-    }
-  for (y = 0; y < h2; y++)
-    for (x = 0; x < w2; x++)
-      XPutPixel (ximage2, x, y, XGetPixel (ximage, x*2, y*2));
-  free (ximage->data);
-  *ximage = *ximage2;
-  ximage2->data = 0;
-  XFree (ximage2);
+  if (sp->state != DEAD &&
+      (prev_rect.x != sp->current.x ||
+       prev_rect.y != sp->current.y ||
+       prev_rect.w != sp->current.w ||
+       prev_rect.h != sp->current.h ||
+       prev_opacity != sp->opacity))
+    ss->redisplay_needed_p = True;
 }
 
 
 }
 
 
-/* Load a new image into a texture for the given quad.
+/* Draw the given sprite at the phase of its animation dictated by
+   its creation time compared to the current wall clock.
  */
 static void
  */
 static void
-load_quad_1 (ModeInfo *mi, gls_quad *q, XImage *ximage,
-             const char *filename, double start_time, double cvt_time)
+draw_sprite (ModeInfo *mi, sprite *sp)
 {
   slideshow_state *ss = &sss[MI_SCREEN(mi)];
 {
   slideshow_state *ss = &sss[MI_SCREEN(mi)];
-  int status;
-  int max_reduction = 7;
-  int err_count = 0;
   int wire = MI_IS_WIREFRAME(mi);
   int wire = MI_IS_WIREFRAME(mi);
-  double load_time=0, mipmap_time=0;   /* for debugging messages */
+  image *img = sp->img;
 
 
-  /* if (q->state != DEAD) abort(); */
+  if (! sp->img) abort();
+  if (! img->loaded_p) abort();
 
 
-  /* Figure out which texid is currently in use, and pick the other one.
-   */
+  glPushMatrix();
   {
   {
-    GLuint tid = 0;
-    int i;
-    if (ss->current_texid == 0)
-      tid = ss->texids[0];
-    else
-      for (i = 0; i < countof(ss->texids); i++)
-        if (ss->texids[i] != ss->current_texid)
-          {
-            tid = ss->texids[i];
-            break;
-          }
-
-    if (tid == 0) abort();   /* both textures in use by visible quads? */
-    q->texid = tid;
-    ss->current_texid = tid;
-  }
-
-  if (wire)
-    goto DONE;
+    glTranslatef (sp->current.x, sp->current.y, 0);
+    glScalef (sp->current.w, sp->current.h, 1);
 
 
-  if (q->title) free (q->title);
-  q->title = (filename ? strdup (filename) : 0);
-
-  if (q->title)   /* strip filename to part after last /. */
-    {
-      char *s = strrchr (q->title, '/');
-      if (s) strcpy (q->title, s+1);
-    }
-
-  if (debug_p)
-    {
-      fprintf (stderr, "%s: debug: loaded    image %d: \"%s\"\n",
-               blurb(), q->texid, (q->title ? q->title : "(null)"));
-      load_time = double_time();
-    }
-
-  glBindTexture (GL_TEXTURE_2D, q->texid);
-  glPixelStorei (GL_UNPACK_ALIGNMENT, 1);
-  glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
-                   GL_LINEAR_MIPMAP_LINEAR);
-  
-  ss->img_w = ximage->width;
-  ss->img_h = ximage->height;
+    if (wire)                  /* Draw a grid inside the box */
+      {
+        GLfloat dy = 0.1;
+        GLfloat dx = dy * img->w / img->h;
+        GLfloat x, y;
 
 
- AGAIN:
+        if (sp->id & 1)
+          glColor4f (sp->opacity, 0, 0, 1);
+        else
+          glColor4f (0, 0, sp->opacity, 1);
 
 
-  clear_gl_error();
-  status = gluBuild2DMipmaps (GL_TEXTURE_2D, 3,
-                              ximage->width, ximage->height,
-                              GL_RGBA, GL_UNSIGNED_BYTE, ximage->data);
-  
-  if(!status && glGetError())
-   /* Some implementations of gluBuild2DMipmaps(), but set a GL error anyway.
-      We could just call check_gl_error(), but that would exit. */
-    status = -1;
+        glBegin(GL_LINES);
+        glVertex3f (0, 0, 0); glVertex3f (1, 1, 0);
+        glVertex3f (1, 0, 0); glVertex3f (0, 1, 0);
 
 
-  if (status)
-    {
-      char buf[100];
-      const char *s = (char *) gluErrorString (status);
+        for (y = 0; y < 1+dy; y += dy)
+          {
+            GLfloat yy = (y > 1 ? 1 : y);
+            for (x = 0.5; x < 1+dx; x += dx)
+              {
+                GLfloat xx = (x > 1 ? 1 : x);
+                glVertex3f (0, xx, 0); glVertex3f (1, xx, 0);
+                glVertex3f (yy, 0, 0); glVertex3f (yy, 1, 0);
+              }
+            for (x = 0.5; x > -dx; x -= dx)
+              {
+                GLfloat xx = (x < 0 ? 0 : x);
+                glVertex3f (0, xx, 0); glVertex3f (1, xx, 0);
+                glVertex3f (yy, 0, 0); glVertex3f (yy, 1, 0);
+              }
+          }
+        glEnd();
+      }
+    else                       /* Draw the texture quad */
+      {
+        GLfloat texw  = img->geom.width  / (GLfloat) img->tw;
+        GLfloat texh  = img->geom.height / (GLfloat) img->th;
+        GLfloat texx1 = img->geom.x / (GLfloat) img->tw;
+        GLfloat texy1 = img->geom.y / (GLfloat) img->th;
+        GLfloat texx2 = texx1 + texw;
+        GLfloat texy2 = texy1 + texh;
+
+        glBindTexture (GL_TEXTURE_2D, img->texid);
+        glColor4f (1, 1, 1, sp->opacity);
+        glNormal3f (0, 0, 1);
+        glBegin (GL_QUADS);
+        glTexCoord2f (texx1, texy2); glVertex3f (0, 0, 0);
+        glTexCoord2f (texx2, texy2); glVertex3f (1, 0, 0);
+        glTexCoord2f (texx2, texy1); glVertex3f (1, 1, 0);
+        glTexCoord2f (texx1, texy1); glVertex3f (0, 1, 0);
+        glEnd();
+
+        if (debug_p)           /* Draw a border around the image */
+          {
+            if (!wire) glDisable (GL_TEXTURE_2D);
 
 
-      if (!s || !*s)
-        {
-          sprintf (buf, "unknown error %d", status);
-          s = buf;
-        }
+            if (sp->id & 1)
+              glColor4f (sp->opacity, 0, 0, 1);
+            else
+              glColor4f (0, 0, sp->opacity, 1);
 
 
-      clear_gl_error();
+            glBegin (GL_LINE_LOOP);
+            glVertex3f (0, 0, 0);
+            glVertex3f (0, 1, 0);
+            glVertex3f (1, 1, 0);
+            glVertex3f (1, 0, 0);
+            glEnd();
 
 
-      if (++err_count > max_reduction)
-        {
-          fprintf(stderr,
-                  "\n"
-                  "%s: %dx%d texture failed, even after reducing to %dx%d:\n"
-                  "%s: GLU said: \"%s\".\n"
-                  "%s: probably this means "
-                  "\"your video card is worthless and weak\"?\n\n",
-                  blurb(), MI_WIDTH(mi), MI_HEIGHT(mi),
-                  ximage->width, ximage->height,
-                  blurb(), s,
-                  blurb());
-          exit (1);
-        }
-      else
-        {
-          if (debug_p)
-            fprintf (stderr, "%s: debug: mipmap error (%dx%d): %s\n",
-                     blurb(), ximage->width, ximage->height, s);
-          shrink_image (mi, ximage);
-          goto AGAIN;
-        }
-    }
+            if (!wire) glEnable (GL_TEXTURE_2D);
+          }
+      }
 
 
-  check_gl_error("mipmapping");  /* should get a return code instead of a
-                                   GL error, but just in case... */
 
 
-  free(ximage->data);
-  ximage->data = 0;
-  XDestroyImage(ximage);
+    if (do_titles &&
+        img->title && *img->title)
+      {
+        int x = 10;
+        int y = mi->xgwa.height - 10;
+        glColor4f (0, 0, 0, sp->opacity);   /* cheap-assed dropshadow */
+        print_gl_string (mi->dpy, ss->xfont, ss->font_dlist,
+                         mi->xgwa.width, mi->xgwa.height, x, y,
+                         img->title);
+        x++; y++;
+        glColor4f (1, 1, 1, sp->opacity);
+        print_gl_string (mi->dpy, ss->xfont, ss->font_dlist,
+                         mi->xgwa.width, mi->xgwa.height, x, y,
+                         img->title);
+      }
+  }
+  glPopMatrix();
 
   if (debug_p)
     {
 
   if (debug_p)
     {
-      fprintf (stderr, "%s: debug: mipmapped image %d: %dx%d\n",
-               blurb(), q->texid, mi->xgwa.width, mi->xgwa.height);
-      mipmap_time = double_time();
-    }
+      if (!wire) glDisable (GL_TEXTURE_2D);
 
 
-  if (cvt_time == 0)
-    cvt_time = load_time;
-  if (debug_p)
-    fprintf (stderr,
-             "%s: debug: load time elapsed: %.2f + %.2f + %.2f = %.2f sec\n",
-             blurb(),
-             cvt_time    - start_time,
-             load_time   - cvt_time,
-             mipmap_time - load_time,
-             mipmap_time - start_time);
+      if (sp->id & 1)
+        glColor4f (1, 0, 0, 1);
+      else
+        glColor4f (0, 0, 1, 1);
 
 
- DONE:
+      /* Draw the "from" and "to" boxes
+       */
+      glBegin (GL_LINE_LOOP);
+      glVertex3f (sp->from.x,              sp->from.y,              0);
+      glVertex3f (sp->from.x + sp->from.w, sp->from.y,              0);
+      glVertex3f (sp->from.x + sp->from.w, sp->from.y + sp->from.h, 0);
+      glVertex3f (sp->from.x,              sp->from.y + sp->from.h, 0);
+      glEnd();
 
 
-  /* Re-set "now" so that time spent loading the image file does not count
-     against the time remaining in this stage of the animation: image loading,
-     if it takes a perceptible amount of time, will cause the animation to
-     pause, but will not cause it to drop frames.
-   */
-  ss->now = double_time ();
-  ss->image_start_time = ss->now;
+      glBegin (GL_LINE_LOOP);
+      glVertex3f (sp->to.x,                sp->to.y,                0);
+      glVertex3f (sp->to.x + sp->to.w,     sp->to.y,                0);
+      glVertex3f (sp->to.x + sp->to.w,     sp->to.y + sp->to.h,     0);
+      glVertex3f (sp->to.x,                sp->to.y + sp->to.h,     0);
+      glEnd();
 
 
-  ss->redisplay_needed_p = True;
+      if (!wire) glEnable (GL_TEXTURE_2D);
+    }
 }
 
 
 }
 
 
-static void slideshow_load_cb (Screen *, Window, XImage *,
-                               const char *filename, void *closure,
-                               double cvt_time);
-
-typedef struct {
-  ModeInfo *mi;
-  gls_quad *q;
-  double start_time;
-} img_load_closure;
-
-
-/* Load a new image into a texture for the given quad.
- */
 static void
 static void
-load_quad (ModeInfo *mi, gls_quad *q)
+tick_sprites (ModeInfo *mi)
 {
   slideshow_state *ss = &sss[MI_SCREEN(mi)];
 {
   slideshow_state *ss = &sss[MI_SCREEN(mi)];
-  img_load_closure *data;
+  int i;
+  for (i = 0; i < ss->nsprites; i++)
+      tick_sprite (mi, ss->sprites[i]);
+}
 
 
-  if (debug_p)
-    fprintf (stderr, "%s: debug: loading   image %d: %dx%d\n",
-             blurb(), q->texid, mi->xgwa.width, mi->xgwa.height);
 
 
-  if (q->state != DEAD) abort();
-  if (q->title) free (q->title);
-  q->title = 0;
+static void
+draw_sprites (ModeInfo *mi)
+{
+  slideshow_state *ss = &sss[MI_SCREEN(mi)];
+  int i;
 
 
-  if (MI_IS_WIREFRAME(mi))
-    return;
+  glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
 
 
-  data = (img_load_closure *) calloc (1, sizeof(*data));
-  data->mi = mi;
-  data->q = q;
-  data->start_time = double_time();
+  glPushMatrix();
+  for (i = 0; i < ss->nsprites; i++)
+    draw_sprite (mi, ss->sprites[i]);
+  glPopMatrix();
 
 
-  if (ss->fork_p)
+  if (debug_p)                         /* draw a white box (the "screen") */
     {
     {
-      fork_screen_to_ximage (mi->xgwa.screen, mi->window,
-                             slideshow_load_cb, data);
-    }
-  else
-    {
-      char *title = 0;
-      XImage *ximage = screen_to_ximage (mi->xgwa.screen, mi->window, &title);
-      slideshow_load_cb (mi->xgwa.screen, mi->window, ximage, title, data, 0);
-    }
-}
+      int wire = MI_IS_WIREFRAME(mi);
 
 
+      if (!wire) glDisable (GL_TEXTURE_2D);
 
 
-static void
-slideshow_load_cb (Screen *screen, Window window, XImage *ximage,
-                   const char *filename, void *closure, double cvt_time)
-{
-  img_load_closure *data = (img_load_closure *) closure;
-  load_quad_1 (data->mi, data->q, ximage, filename,
-               data->start_time, cvt_time);
-  memset (data, 0, sizeof (*data));
-  free (data);
+      glColor4f (1, 1, 1, 1);
+      glBegin (GL_LINE_LOOP);
+      glVertex3f (0, 0, 0);
+      glVertex3f (0, 1, 0);
+      glVertex3f (1, 1, 0);
+      glVertex3f (1, 0, 0);
+      glEnd();
+
+      if (!wire) glEnable (GL_TEXTURE_2D);
+    }
 }
 
 
 }
 
 
@@ -824,15 +955,33 @@ glslideshow_handle_event (ModeInfo *mi, XEvent *event)
 {
   slideshow_state *ss = &sss[MI_SCREEN(mi)];
 
 {
   slideshow_state *ss = &sss[MI_SCREEN(mi)];
 
-  if (event->xany.type == Expose ||
-      event->xany.type == GraphicsExpose ||
-      event->xany.type == VisibilityNotify)
+  if (event->xany.type == ButtonPress &&
+      event->xbutton.button == Button1)
     {
     {
-      if (debug_p)
-        fprintf (stderr, "%s: debug: exposure\n", blurb());
-      ss->redisplay_needed_p = True;
+      ss->change_now_p = True;
       return True;
     }
       return True;
     }
+  else if (event->xany.type == KeyPress)
+    {
+      KeySym keysym;
+      char c = 0;
+      XLookupString (&event->xkey, &c, 1, &keysym, 0);
+      if (c == ' ' || c == '\r' || c == '\n' || c == '\t')
+        {
+          ss->change_now_p = True;
+          return True;
+        }
+    }
+  else if (event->xany.type == Expose ||
+           event->xany.type == GraphicsExpose ||
+           event->xany.type == VisibilityNotify)
+    {
+      ss->redisplay_needed_p = True;
+      if (debug_p)
+        fprintf (stderr, "%s: exposure\n", blurb());
+      return False;
+    }
+
   return False;
 }
 
   return False;
 }
 
@@ -864,11 +1013,72 @@ sanity_check (ModeInfo *mi)
   if (zoom == 100 && pan_seconds < image_seconds)
     pan_seconds = image_seconds;
 
   if (zoom == 100 && pan_seconds < image_seconds)
     pan_seconds = image_seconds;
 
+  /* No need to use mipmaps if we're not changing the image size much */
+  if (zoom >= 80) mipmap_p = False;
+
   if      (fps_cutoff < 0)  fps_cutoff = 0;
   else if (fps_cutoff > 30) fps_cutoff = 30;
 }
 
 
   if      (fps_cutoff < 0)  fps_cutoff = 0;
   else if (fps_cutoff > 30) fps_cutoff = 30;
 }
 
 
+static void
+check_fps (ModeInfo *mi)
+{
+  slideshow_state *ss = &sss[MI_SCREEN(mi)];
+
+  static double time_elapsed = 0;
+  static int frames_elapsed = 0;
+  double start_time, end_time, wall_elapsed, frame_duration, fps;
+  int i;
+
+  start_time = ss->now;
+  end_time = double_time();
+  frame_duration = end_time - start_time;   /* time spent drawing this frame */
+  time_elapsed += frame_duration;           /* time spent drawing all frames */
+  frames_elapsed++;
+
+  wall_elapsed = end_time - ss->dawn_of_time;
+  fps = frames_elapsed / time_elapsed;
+  ss->theoretical_fps = fps;
+
+  if (ss->checked_fps_p) return;
+
+  if (wall_elapsed <= 8)    /* too early to be sure */
+    return;
+
+  ss->checked_fps_p = True;
+
+  if (fps >= fps_cutoff)
+    {
+      if (debug_p)
+        fprintf (stderr,
+                 "%s: %.1f fps is fast enough (with %d frames in %.1f secs)\n",
+                 blurb(), fps, frames_elapsed, wall_elapsed);
+      return;
+    }
+
+  fprintf (stderr,
+           "%s: only %.1f fps!  Turning off pan/fade to compensate...\n",
+           blurb(), fps);
+  zoom = 100;
+  fade_seconds = 0;
+
+  sanity_check (mi);
+
+  for (i = 0; i < ss->nsprites; i++)
+    {
+      sprite *sp = ss->sprites[i];
+      randomize_sprite (mi, sp);
+      sp->state = FULL;
+    }
+
+  ss->redisplay_needed_p = True;
+
+  /* Need this in case zoom changed. */
+  reshape_slideshow (mi, mi->xgwa.width, mi->xgwa.height);
+}
+
+
 /* Kludge to add "-v" to invocation of "xscreensaver-getimage" in -debug mode
  */
 static void
 /* Kludge to add "-v" to invocation of "xscreensaver-getimage" in -debug mode
  */
 static void
@@ -895,7 +1105,6 @@ init_slideshow (ModeInfo *mi)
   int screen = MI_SCREEN(mi);
   slideshow_state *ss;
   int wire = MI_IS_WIREFRAME(mi);
   int screen = MI_SCREEN(mi);
   slideshow_state *ss;
   int wire = MI_IS_WIREFRAME(mi);
-  int i;
   
   if (sss == NULL) {
     if ((sss = (slideshow_state *)
   
   if (sss == NULL) {
     if ((sss = (slideshow_state *)
@@ -911,132 +1120,46 @@ init_slideshow (ModeInfo *mi)
   }
 
   if (debug_p)
   }
 
   if (debug_p)
-    fprintf (stderr, "%s: debug: pan: %d; fade: %d; img: %d; zoom: %d%%\n",
+    fprintf (stderr, "%s: pan: %d; fade: %d; img: %d; zoom: %d%%\n",
              blurb(), pan_seconds, fade_seconds, image_seconds, zoom);
 
   sanity_check(mi);
 
   if (debug_p)
              blurb(), pan_seconds, fade_seconds, image_seconds, zoom);
 
   sanity_check(mi);
 
   if (debug_p)
-    fprintf (stderr, "%s: debug: pan: %d; fade: %d; img: %d; zoom: %d%%\n",
+    fprintf (stderr, "%s: pan: %d; fade: %d; img: %d; zoom: %d%%\n\n",
              blurb(), pan_seconds, fade_seconds, image_seconds, zoom);
 
              blurb(), pan_seconds, fade_seconds, image_seconds, zoom);
 
+  glDisable (GL_LIGHTING);
+  glDisable (GL_DEPTH_TEST);
+  glDepthMask (GL_FALSE);
+  glEnable (GL_CULL_FACE);
+  glCullFace (GL_BACK);
+
   if (! wire)
     {
   if (! wire)
     {
+      glEnable (GL_TEXTURE_2D);
       glShadeModel (GL_SMOOTH);
       glShadeModel (GL_SMOOTH);
-      glPolygonMode (GL_FRONT_AND_BACK,GL_FILL);
-      glEnable (GL_DEPTH_TEST);
-      glEnable (GL_CULL_FACE);
-      glCullFace (GL_FRONT);
-      glDisable (GL_LIGHTING);
+      glEnable (GL_BLEND);
+      glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
     }
 
     }
 
-  ss->now = double_time ();
-  ss->dawn_of_time = ss->now;
-
   if (debug_p) glLineWidth (3);
 
   if (debug_p) glLineWidth (3);
 
-  ss->pan_start_time   = ss->now;
-  ss->image_start_time = ss->now;
-
-  load_font (mi, "titleFont", &ss->xfont, &ss->font_dlist);
-
-  for (i = 0; i < countof(ss->texids); i++)
-    glGenTextures (1, &ss->texids[i]);
-  ss->current_texid = 0;
-
-  for (i = 0; i < countof(ss->quads); i++)
-    {
-      gls_quad *q = &ss->quads[i];
-      q->texid = ss->current_texid;
-      q->state = DEAD;
-      reset_quad (mi, q);
-      q->state = DEAD;
-    }
+  load_font (mi->dpy, "titleFont", &ss->xfont, &ss->font_dlist);
 
   if (debug_p)
     hack_resources();
 
 
   if (debug_p)
     hack_resources();
 
-  load_quad (mi, &ss->quads[0]);
-  ss->quads[0].state = IN;
-
-  ss->image_start_time -= pan_seconds;  /* fudge needed for first image */
-
-  ss->redisplay_needed_p = True;
-
-  ss->fork_p = 0; /* #### buggy */
-
-}
-
-
-/* Call this each time we change from one state to another.
-   It gathers statistics on the frame rate of the previous state,
-   and if it's bad, turn things off (under the assumption that
-   we're running on sucky hardware.)
- */
-static void
-ponder_state_change (ModeInfo *mi)
-{
-  slideshow_state *ss = &sss[MI_SCREEN(mi)];
-  const char *which;
-  int frames, secs;
-  GLfloat fps;
-
-  if (ss->fade_frame_count && ss->pan_frame_count)
-    abort();  /* one of these should be zero! */
-  else if (ss->fade_frame_count)   /* just finished fading */
-    {
-      which = "faded ";
-      secs = fade_seconds;
-      frames = ss->fade_frame_count;
-      ss->fade_frame_count = 0;
-    }
-  else if (ss->pan_frame_count)   /* just finished panning */
-    {
-      which = "panned";
-      secs = pan_seconds;
-      frames = ss->pan_frame_count;
-      ss->pan_frame_count = 0;
-    }
-  else
-    return;  /* One of those should be non-zero! Maybe we just started,
-                and the machine is insanely slow. */
-
-  fps = frames / (GLfloat) secs;
-
-  if (debug_p)
-    fprintf (stderr, "%s: debug: %s %3d frames %2d sec %4.1f fps\n",
-             blurb(), which, frames, secs, fps);
-
-
-  if (fps < fps_cutoff && !ss->low_fps_p)   /* oops, this computer sucks! */
-    {
-      int i;
-
-      fprintf (stderr,
-               "%s: only %.1f fps!  Turning off pan/fade to compensate...\n",
-               blurb(), fps);
-      zoom = 100;
-      fade_seconds = 0;
-      ss->low_fps_p = True;
-
-      sanity_check (mi);
+  ss->now = double_time();
+  ss->dawn_of_time = ss->now;
+  ss->prev_frame_time = ss->now;
 
 
-      /* Reset all quads, and mark only #0 as active. */
-      for (i = 0; i < countof(ss->quads); i++)
-        {
-          gls_quad *q = &ss->quads[i];
-          q->state = DEAD;
-          reset_quad (mi, q);
-          q->texid = ss->current_texid;
-          q->state = (i == 0 ? IN : DEAD);
-        }
+  await_first_image (mi);   /* wait for first image to fully load */
 
 
-      ss->pan_start_time = ss->now;
-      ss->redisplay_needed_p = True;
+  ss->now = double_time();
+  ss->dawn_of_time = ss->now;
 
 
-      /* Need this in case zoom changed. */
-      reshape_slideshow (mi, mi->xgwa.width, mi->xgwa.height);
-    }
+  new_sprite (mi);          /* start first sprite fading in */
 }
 
 
 }
 
 
@@ -1044,114 +1167,74 @@ void
 draw_slideshow (ModeInfo *mi)
 {
   slideshow_state *ss = &sss[MI_SCREEN(mi)];
 draw_slideshow (ModeInfo *mi)
 {
   slideshow_state *ss = &sss[MI_SCREEN(mi)];
-  Window w = MI_WINDOW(mi);
-  double secs;
+  int i;
 
   if (!ss->glx_context)
     return;
 
 
   if (!ss->glx_context)
     return;
 
-  if (zoom < 100)
-    ss->redisplay_needed_p = True;
-
-  /* States:
-      0: - A invisible,  B invisible
-         - A fading in,  B invisible
+  ss->now = double_time();
 
 
-      1: - A opaque,     B invisible
-         - A fading out, B fading in
-         - A invisible, gets reset
-         - A invisible,  B opaque
+  /* Each sprite has three states: fading in, full, fading out.
+     The in/out states overlap like this:
 
 
-      2: - A invisible,  B opaque
-         - A fading in,  B fading out
-         - B invisible, gets reset
-         - A opaque,     B invisible (goto 1)
-  */
+     iiiiiiFFFFFFFFFFFFoooooo  . . . . . . . . . . . . . . . . . 
+     . . . . . . . . . iiiiiiFFFFFFFFFFFFoooooo  . . . . . . . .
+     . . . . . . . . . . . . . . . . . . iiiiiiFFFFFFFFFFFFooooo
 
 
-  ss->now = double_time();
+     So as soon as a sprite goes into the "out" state, we create
+     a new sprite (in the "in" state.)
+   */
 
 
-  secs = ss->now - ss->pan_start_time;
+  if (ss->nsprites > 2) abort();
 
 
-  if (secs < fade_seconds)
-    {
-      /* We are in the midst of a fade:
-         one quad is fading in, the other is fading out.
-         (If this is the very first time, then the one
-         fading out is already out.)
-       */
-      ss->redisplay_needed_p = True;
-      ss->fade_frame_count++;
-
-      if (! ((ss->quads[0].state == IN && ss->quads[1].state == OUT) ||
-             (ss->quads[1].state == IN && ss->quads[0].state == OUT) ||
-             (ss->quads[0].state == IN && ss->quads[1].state == DEAD)))
-        abort();
-    }
-  else if (secs < pan_seconds)
+  /* If a sprite is just entering the fade-out state,
+     then add a new sprite in the fade-in state.
+   */
+  for (i = 0; i < ss->nsprites; i++)
     {
     {
-      /* One quad is visible and in motion, the other is not.
-      */
-      if (ss->fade_frame_count != 0)  /* we just switched from fade to pan */
-        ponder_state_change (mi);
-      ss->pan_frame_count++;
+      sprite *sp = ss->sprites[i];
+      if (sp->state != sp->prev_state &&
+          sp->state == (fade_seconds == 0 ? DEAD : OUT))
+        new_sprite (mi);
     }
     }
-  else
-    {
-      /* One quad is visible and in motion, the other is not.
-         It's time to begin fading the visible one out, and the
-         invisible one in.  (Reset the invisible one first.)
-       */
-      gls_quad *vq, *iq;
 
 
-      ponder_state_change (mi);
+  tick_sprites (mi);
 
 
-      if (ss->quads[0].state == IN)
-        {
-          vq = &ss->quads[0];
-          iq = &ss->quads[1];
-        }
-      else
+  /* Now garbage collect the dead sprites.
+   */
+  for (i = 0; i < ss->nsprites; i++)
+    {
+      sprite *sp = ss->sprites[i];
+      if (sp->state == DEAD)
         {
         {
-          vq = &ss->quads[1];
-          iq = &ss->quads[0];
+          destroy_sprite (mi, sp);
+          i--;
         }
         }
-
-      if (vq->state != IN)   abort();
-
-      /* I don't understand why sometimes iq is still OUT and not DEAD. */
-      if (iq->state == OUT)  iq->state = DEAD;
-      if (iq->state != DEAD) abort();
-
-      vq->state = OUT;
-
-      if (ss->image_start_time + image_seconds <= ss->now)
-        load_quad (mi, iq);
-
-      reset_quad (mi, iq);               /* fade invisible in */
-      iq->texid = ss->current_texid;     /* make sure we're using latest img */
-
-      ss->pan_start_time = ss->now;
-
-      if (! ((ss->quads[0].state == IN && ss->quads[1].state == OUT) ||
-             (ss->quads[1].state == IN && ss->quads[0].state == OUT)))
-        abort();
     }
 
     }
 
-  ss->fps = fps_1 (mi);
+  /* We can only ever end up with no sprites at all if the machine is
+     being really slow and we hopped states directly from FULL to DEAD
+     without passing OUT... */
+  if (ss->nsprites == 0)
+    new_sprite (mi);
 
   if (!ss->redisplay_needed_p)
     return;
 
   if (!ss->redisplay_needed_p)
     return;
-  else if (debug_p && zoom == 100)
-    fprintf (stderr, "%s: debug: drawing (%d)\n", blurb(),
-             (int) (ss->now - ss->dawn_of_time));
 
 
-  draw_quads (mi);
-  ss->redisplay_needed_p = False;
+  if (debug_p && ss->now - ss->prev_frame_time > 1)
+    fprintf (stderr, "%s: static screen for %.1f secs\n",
+             blurb(), ss->now - ss->prev_frame_time);
 
 
-  if (mi->fps_p) fps_2(mi);
+  draw_sprites (mi);
+
+  ss->fps = fps_1 (mi);
+  if (mi->fps_p) fps_2 (mi);
 
   glFinish();
 
   glFinish();
-  glXSwapBuffers (MI_DISPLAY (mi), w);
+  glXSwapBuffers (MI_DISPLAY (mi), MI_WINDOW(mi));
+  ss->prev_frame_time = ss->now;
+  ss->redisplay_needed_p = False;
+  check_fps (mi);
 }
 
 #endif /* USE_GL */
 }
 
 #endif /* USE_GL */
index 61fa58deaf8b806d9beda8b00e7107ca84a07641..5f804e82014a54ed1b28cffefb0133a30123985f 100644 (file)
@@ -11,13 +11,13 @@ glslideshow - slideshow of images using smooth zooming and fades
 [\-zoom \fIpercent\fP]
 [\-pan \fIseconds\fP]
 [\-fade \fIseconds\fP]
 [\-zoom \fIpercent\fP]
 [\-pan \fIseconds\fP]
 [\-fade \fIseconds\fP]
-[\-speed \fIfloat\fP]
-[\-delay \fIusecs\fP]
-[\-cutoff \fIint\fP]
 [\-titles]
 [\-titles]
+[\-letterbox | \-clip]
+[\-delay \fIusecs\fP]
 [\-fps]
 [\-debug]
 [\-wireframe]
 [\-fps]
 [\-debug]
 [\-wireframe]
+[\-cutoff \fIint\fP]
 .SH DESCRIPTION
 Loads a random sequence of images and smoothly scans and zooms around
 in each, fading from pan to pan.  
 .SH DESCRIPTION
 Loads a random sequence of images and smoothly scans and zooms around
 in each, fading from pan to pan.  
@@ -45,49 +45,60 @@ How long each image will be displayed before loading a new one.
 Default 30 seconds.
 .TP 8
 .B \-pan \fIseconds\fP
 Default 30 seconds.
 .TP 8
 .B \-pan \fIseconds\fP
-How long each pan should last.  Default 6 seconds.
+How long each pan-and-zoom should last.  Default 6 seconds.
+
+With the default settings of \fI\-pan 6 \-duration 30\fP, each image
+will be displayed five times (30/6), and then a new image will be loaded.
+If you want a new image to be loaded at each fade, then set \fI\-pan\fP
+and \fI\-duration\fP to the same value.
 .TP 8
 .B \-fade \fIseconds\fP
 .TP 8
 .B \-fade \fIseconds\fP
-How long each fade (in and out) should last.  Default 2 seconds.
+How long each cross-fade between images should last.  Default 2 seconds.
 If set to 0, then no cross-fading will be done (all transitions
 will be jump-cuts.)
 
 If set to 0, then no cross-fading will be done (all transitions
 will be jump-cuts.)
 
-Note that fades are included in the pan, so \fI\-pan\fP should
-always be longer than  \fI\-fade\fP (it is auto-corrected if not.)
+Note that fades are included in the pan time, so \fI\-fade\fP cannot
+be larger than \fI\-pan\fP.
 .TP 8
 .B \-zoom \fInumber\fP
 Amount to zoom and pan as a percentage. Default: 75, meaning that
 75% or more of each image will always be visible.  If set to 100%,
 then the images will always fill the screen, and no panning or 
 .TP 8
 .B \-zoom \fInumber\fP
 Amount to zoom and pan as a percentage. Default: 75, meaning that
 75% or more of each image will always be visible.  If set to 100%,
 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.
+zooming will occur.  (Images will still smoothly fade from one
+to another if \fI\-fade\fP is non-zero.)
 .TP 8
 .TP 8
-.B \-speed \fIfloat\fP
-Speed up or slow down.  2 means twice as fast; 0.5 means half as fast.
+.B \-titles
+Whether to print the file name of the current image in the upper left corner.
+.TP 8
+.B \-letterbox
+In "letterbox" mode, when an image is not the same aspect ratio as the screen,
+black bars will appear at the top/bottom or left/right so that the whole
+image can be displayed.  This is the default.
+.TP 8
+.B \-clip
+In "clip" mode, when an image is not the same aspect ratio as the screen,
+we will zoom in further until the image takes up the whole screen.
+This is the opposite of \fI\-letterbox\fP.
 .TP 8
 .B \-delay \fInumber\fP
 Per-frame delay, in microseconds.  Default: 20000 (0.02 seconds.).
 .TP 8
 .TP 8
 .B \-delay \fInumber\fP
 Per-frame delay, in microseconds.  Default: 20000 (0.02 seconds.).
 .TP 8
+.B \-fps
+Whether to show a frames-per-second display at the bottom of the screen.
+.TP 8
 .B \-cutoff \fInumber\fP
 .B \-cutoff \fInumber\fP
-If the frame rate drops below this number of frames per second, then
-certain features will be turned off automatically (first zooming, 
-then, if the low frame rates persist, fading.)  Default 5.
+If the frame rate we are achieving is lower than this, then panning,
+fading, and zooming will be disabled.  Default 5 FPS.
 
 The idea here is that if your machine can't maintain a decent frame
 rate, then it must not have fast 3D hardware, so we might as well
 behave in a simpler manner.  Set this to 0 to disable this check.
 .TP 8
 
 The idea here is that if your machine can't maintain a decent frame
 rate, then it must not have fast 3D hardware, so we might as well
 behave in a simpler manner.  Set this to 0 to disable this check.
 .TP 8
-.B \-titles
-Whether to print the file name of the current image in the upper left corner.
-.TP 8
-.B \-fps
-Whether to show a frames-per-second display at the bottom of the screen.
-.TP 8
 .B \-debug
 Prints debugging info to stderr.
 .TP 8
 .B \-wireframe
 .B \-debug
 Prints debugging info to stderr.
 .TP 8
 .B \-wireframe
-Instead of loading images, simply animates representative grids instead.
+Another debug mode.
 .SH ENVIRONMENT
 .PP
 .TP 8
 .SH ENVIRONMENT
 .PP
 .TP 8
@@ -99,14 +110,14 @@ 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),
 stored in the RESOURCE_MANAGER property.
 .SH SEE ALSO
 .BR X (1),
-.BR xscreensaver-demo (1)
-.BR xscreensaver-getimage (1)
-.BR xscreensaver (1)
+.BR xscreensaver-demo (1),
+.BR xscreensaver-getimage (1),
+.BR xscreensaver (1),
+.BR carousel (1)
 .SH COPYRIGHT
 .SH COPYRIGHT
-Copyright \(co 2003 by Jamie Zawinski, based on an earlier version that was
-Copyright \(co 2002 by Mike Oliphant.  Originally derived from 
-.BR flipscreen3d (1) ,
-which was Copyright \(co 2001 Ben Buxton. 
+Copyright \(co 2003-2005 by Jamie Zawinski, based on an earlier version
+that was
+Copyright \(co 2002 by Mike Oliphant.
 
 Permission to use, copy, modify, distribute, and sell this software and
 its documentation for any purpose is hereby granted without fee,
 
 Permission to use, copy, modify, distribute, and sell this software and
 its documentation for any purpose is hereby granted without fee,
index 534788b4c3d28601d5efaed223c004ed98357390..07f9c54d90f0925b2272180dc0d1a20c5ed8d511 100644 (file)
@@ -156,6 +156,7 @@ extern XtAppContext app;
 #define countof(x) (sizeof((x))/sizeof((*x)))
 
 #include "xlockmore.h"
 #define countof(x) (sizeof((x))/sizeof((*x)))
 
 #include "xlockmore.h"
+#include "glxfonts.h"
 
 static XrmOptionDescRec opts[] = {
     { "-explode", ".explode", XrmoptionSepArg, DEF_EXPLODE },
 
 static XrmOptionDescRec opts[] = {
     { "-explode", ".explode", XrmoptionSepArg, DEF_EXPLODE },
@@ -1400,33 +1401,6 @@ void gettime(snaketime *t)
 #endif /* !HAVE_GETTIMEOFDAY */
 }
 
 #endif /* !HAVE_GETTIMEOFDAY */
 }
 
-#ifndef HAVE_GLUT
-static void load_font(ModeInfo * mi, char * res, XFontStruct ** fontp, GLuint * dlistp) {
-    const char * font = get_string_resource(res, "Font");
-    XFontStruct * f;
-    Font id;
-    int first, last;
-
-    if (!font)
-       font = "-*-helvetica-medium-r-*-*-*-120-*";
-
-    f = XLoadQueryFont(mi->dpy, font);
-    if (!f)
-       f = XLoadQueryFont(mi->dpy, "fixed");
-
-    id = f->fid;
-    first = f->min_char_or_byte2;
-    last = f->max_char_or_byte2;
-
-    clear_gl_error();
-    *dlistp = glGenLists((GLuint) last + 1);
-    check_gl_error("glGenLists");
-    glXUseXFont(id, first, last - first + 1, *dlistp + first);
-    check_gl_error("glXUseXFont");
-
-    *fontp = f;
-}
-#endif
 
 void start_morph(int model_index, int immediate);
 
 
 void start_morph(int model_index, int immediate);
 
@@ -1479,7 +1453,7 @@ ModeInfo * mi
     /* set up a font for the labels */
 #ifndef HAVE_GLUT
     if (titles)
     /* set up a font for the labels */
 #ifndef HAVE_GLUT
     if (titles)
-       load_font(mi, "labelfont", &bp->font, &bp->font_list);
+       load_font(mi->dpy, "labelfont", &bp->font, &bp->font_list);
 #endif
     
     /* build a solid display list */
 #endif
     
     /* build a solid display list */
@@ -1663,25 +1637,15 @@ void draw_title(
     {
        char interactstr[] = "interactive";
        char * s;
     {
        char interactstr[] = "interactive";
        char * s;
-       int i = 0;
-#ifdef HAVE_GLUT
-       int w;
-#endif
-       
        if (interactive)
            s = interactstr;
        else
            s = model[glc->next_model].name;
        if (interactive)
            s = interactstr;
        else
            s = model[glc->next_model].name;
-#ifdef HAVE_GLUT
-       w = glutBitmapLength(GLUT_BITMAP_HELVETICA_12, (unsigned char *) s);
-       glRasterPos2f(glc->width - w - 3, 4);
-       while (s[i] != '\0')
-           glutBitmapCharacter(GLUT_BITMAP_HELVETICA_12, s[i++]);
-#else
-       glRasterPos2f(10, mi->xgwa.height - 10 - (bp->font->ascent + bp->font->descent));
-       while (s[i] != '\0')
-           glCallList(bp->font_list + (int)s[i++]);
-#endif
+
+        print_gl_string (mi->dpy, bp->font, bp->font_list,
+                         mi->xgwa.width, mi->xgwa.height,
+                         10, mi->xgwa.height - 10,
+                         s);
     }
     glPopMatrix();
     glMatrixMode(GL_PROJECTION);
     }
     glPopMatrix();
     glMatrixMode(GL_PROJECTION);
index 0e83ec34af50c1237832afa5692412a6bbcef68c..3dd7922489892af444c8bb1a72e88083ed5f9999 100644 (file)
@@ -1,4 +1,4 @@
-/* gltext, Copyright (c) 2001, 2002, 2003, 2004 Jamie Zawinski <jwz@jwz.org>
+/* gltext, Copyright (c) 2001-2005 Jamie Zawinski <jwz@jwz.org>
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
  * documentation for any purpose is hereby granted without fee, provided that
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
  * documentation for any purpose is hereby granted without fee, provided that
@@ -252,7 +252,7 @@ text_handle_event (ModeInfo *mi, XEvent *event)
   text_configuration *tp = &tps[MI_SCREEN(mi)];
 
   if (event->xany.type == ButtonPress &&
   text_configuration *tp = &tps[MI_SCREEN(mi)];
 
   if (event->xany.type == ButtonPress &&
-      event->xbutton.button & Button1)
+      event->xbutton.button == Button1)
     {
       tp->button_down_p = True;
       gltrackball_start (tp->trackball,
     {
       tp->button_down_p = True;
       gltrackball_start (tp->trackball,
@@ -261,11 +261,19 @@ text_handle_event (ModeInfo *mi, XEvent *event)
       return True;
     }
   else if (event->xany.type == ButtonRelease &&
       return True;
     }
   else if (event->xany.type == ButtonRelease &&
-           event->xbutton.button & Button1)
+           event->xbutton.button == Button1)
     {
       tp->button_down_p = False;
       return True;
     }
     {
       tp->button_down_p = False;
       return True;
     }
+  else if (event->xany.type == ButtonPress &&
+           (event->xbutton.button == Button4 ||
+            event->xbutton.button == Button5))
+    {
+      gltrackball_mousewheel (tp->trackball, event->xbutton.button, 10,
+                              !!event->xbutton.state);
+      return True;
+    }
   else if (event->xany.type == MotionNotify &&
            tp->button_down_p)
     {
   else if (event->xany.type == MotionNotify &&
            tp->button_down_p)
     {
@@ -396,7 +404,7 @@ fill_character (GLUTstrokeFont font, int c, Bool wire)
             ly = coord->y;
           }
       }
             ly = coord->y;
           }
       }
-      return (int) (ch->right + tube_width/2);
+      return (int) (ch->right + tube_width);
     }
   return 0;
 }
     }
   return 0;
 }
index c7ddc8b3364d89a0c462f62a52470cd41d21f08d..42b4c296b213efbe10ff9171433048c6f29f4ee1 100644 (file)
@@ -1,4 +1,4 @@
-/* gltrackball, Copyright (c) 2002 Jamie Zawinski <jwz@jwz.org>
+/* gltrackball, Copyright (c) 2002, 2005 Jamie Zawinski <jwz@jwz.org>
  * GL-flavored wrapper for trackball.c
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
  * GL-flavored wrapper for trackball.c
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
@@ -73,3 +73,37 @@ gltrackball_rotate (trackball_state *ts)
   build_rotmatrix (m, ts->q);
   glMultMatrixf (&m[0][0]);
 }
   build_rotmatrix (m, ts->q);
   glMultMatrixf (&m[0][0]);
 }
+
+
+# define Button4 4  /* X11/Xlib.h */
+# define Button5 5
+
+/* Call this when a mouse-wheel click is detected.
+   Clicks act like horizontal or vertical drags.
+   Percent is the length of the drag as a percentage of the screen size.
+   Button is 'Button4' or 'Button5'.
+ */
+void
+gltrackball_mousewheel (trackball_state *ts,
+                        int button, int percent, int horizontal_p)
+{
+  int up_p;
+  double move;
+  switch (button) {
+    case Button4: up_p = 1; break;
+    case Button5: up_p = 0; break;
+  default: abort(); break;
+  }
+
+  if (horizontal_p) up_p = !up_p;
+
+  move = (up_p
+          ? 1.0 - (percent / 100.0)
+          : 1.0 + (percent / 100.0));
+
+  gltrackball_start (ts, 50, 50, 100, 100);
+  if (horizontal_p)
+    gltrackball_track (ts, 50*move, 50, 100, 100);
+  else
+    gltrackball_track (ts, 50, 50*move, 100, 100);
+}
index fbe2efddc1052d3362eb10480128448883092d62..3d8ef667bca1a3bd9948308f7ad7f5faafa43b24 100644 (file)
@@ -1,4 +1,4 @@
-/* gltrackball, Copyright (c) 2002 Jamie Zawinski <jwz@jwz.org>
+/* gltrackball, Copyright (c) 2002, 2005 Jamie Zawinski <jwz@jwz.org>
  * GL-flavored wrapper for trackball.c
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
  * GL-flavored wrapper for trackball.c
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
@@ -37,5 +37,13 @@ extern void gltrackball_track (trackball_state *, int x, int y, int w, int h);
  */
 extern void gltrackball_rotate (trackball_state *);
 
  */
 extern void gltrackball_rotate (trackball_state *);
 
+/* Call this when a mouse-wheel click is detected.
+   Clicks act like horizontal or vertical drags.
+   Percent is the length of the drag as a percentage of the screen size.
+   Button is 'Button4' or 'Button5'.
+ */
+void gltrackball_mousewheel (trackball_state *ts,
+                             int button, int percent, int horizontal_p);
+
 #endif /* __GLTRACKBALL_H__ */
 
 #endif /* __GLTRACKBALL_H__ */
 
index 36ecaf4e790230a9f4a61f6751c2bd3fa8395bfe..e110f341759d2a7a4f760b72d7fdf51f073ccad0 100644 (file)
@@ -1,5 +1,7 @@
-
-/* GENERATED FILE -- DO NOT MODIFY */
+/* Roman simplex stroke font copyright (c) 1989, 1990, 1991
+ * by Sun Microsystems, Inc. and the X Consortium.
+ * Originally part of the GLUT library by Mark J. Kilgard.
+ */
 
 #include "glutstroke.h"
 
 
 #include "glutstroke.h"
 
diff --git a/hacks/glx/glxfonts.c b/hacks/glx/glxfonts.c
new file mode 100644 (file)
index 0000000..3443e4f
--- /dev/null
@@ -0,0 +1,195 @@
+/* glxfonts, Copyright (c) 2001-2004 Jamie Zawinski <jwz@jwz.org>
+ * Loads X11 fonts for use with OpenGL.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation.  No representations are made about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or 
+ * implied warranty.
+ */
+
+
+#include "config.h"
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <ctype.h>
+#include <GL/glx.h>
+#include <GL/glu.h>
+#include "resources.h"
+#include "glxfonts.h"
+
+/* These are in xlock-gl.c */
+extern void clear_gl_error (void);
+extern void check_gl_error (const char *type);
+
+/* screenhack.h */
+extern char *progname;
+
+
+/* Loads the font named by the X resource "res".
+   Returns an XFontStruct.
+   Also converts the font to a set of GL lists and returns the first list.
+*/
+void
+load_font (Display *dpy, char *res, XFontStruct **font_ret, GLuint *dlist_ret)
+{
+  const char *font = get_string_resource (res, "Font");
+  const char *def1 = "-*-times-bold-r-normal-*-180-*";
+  const char *def2 = "fixed";
+  XFontStruct *f;
+  Font id;
+  int first, last;
+
+  if (!res || !*res) abort();
+  if (!font_ret && !dlist_ret) abort();
+
+  if (!font) font = def1;
+
+  f = XLoadQueryFont(dpy, font);
+  if (!f && !!strcmp (font, def1))
+    {
+      fprintf (stderr, "%s: unable to load font \"%s\", using \"%s\"\n",
+               progname, font, def1);
+      font = def1;
+      f = XLoadQueryFont(dpy, font);
+    }
+
+  if (!f && !!strcmp (font, def2))
+    {
+      fprintf (stderr, "%s: unable to load font \"%s\", using \"%s\"\n",
+               progname, font, def2);
+      font = def2;
+      f = XLoadQueryFont(dpy, font);
+    }
+
+  if (!f)
+    {
+      fprintf (stderr, "%s: unable to load fallback font \"%s\" either!\n",
+               progname, font);
+      exit (1);
+    }
+
+  id = f->fid;
+  first = f->min_char_or_byte2;
+  last = f->max_char_or_byte2;
+  
+  if (dlist_ret)
+    {
+      clear_gl_error ();
+      *dlist_ret = glGenLists ((GLuint) last+1);
+      check_gl_error ("glGenLists");
+      glXUseXFont(id, first, last-first+1, *dlist_ret + first);
+      check_gl_error ("glXUseXFont");
+    }
+
+  if (font_ret)
+    *font_ret = f;
+}
+
+
+/* Width of the string in pixels.
+ */
+int
+string_width (XFontStruct *f, const char *c)
+{
+  int w = 0;
+  while (*c)
+    {
+      int cc = *((unsigned char *) c);
+      w += (f->per_char
+            ? f->per_char[cc-f->min_char_or_byte2].rbearing
+            : f->min_bounds.rbearing);
+      c++;
+    }
+  return w;
+}
+
+
+/* Draws the string on the window at the given pixel position.
+   Newlines and tab stops are honored.
+   Any text inside [] will be rendered as a subscript.
+   Assumes the font has been loaded as with load_font().
+ */
+void
+print_gl_string (Display *dpy,
+                 XFontStruct *font,
+                 GLuint font_dlist,
+                 int window_width, int window_height,
+                 GLfloat x, GLfloat y,
+                 const char *string)
+{
+  GLfloat line_height = font->ascent + font->descent;
+  GLfloat sub_shift = (line_height * 0.3);
+  int cw = string_width (font, "m");
+  int tabs = cw * 7;
+
+  y -= line_height;
+
+  glPushAttrib (GL_TRANSFORM_BIT |  /* for matrix contents */
+                GL_ENABLE_BIT);     /* for various glDisable calls */
+  glDisable (GL_LIGHTING);
+  glDisable (GL_DEPTH_TEST);
+  glDisable (GL_TEXTURE_2D);
+  {
+    glMatrixMode(GL_PROJECTION);
+    glPushMatrix();
+    {
+      glLoadIdentity();
+
+      glMatrixMode(GL_MODELVIEW);
+      glPushMatrix();
+      {
+        unsigned int i;
+        int x2 = x;
+        Bool sub_p = False;
+        glLoadIdentity();
+
+        gluOrtho2D (0, window_width, 0, window_height);
+
+        glRasterPos2f (x, y);
+        for (i = 0; i < strlen(string); i++)
+          {
+            char c = string[i];
+            if (c == '\n')
+              {
+                glRasterPos2f (x, (y -= line_height));
+                x2 = x;
+              }
+            else if (c == '\t')
+              {
+                x2 -= x;
+                x2 = ((x2 + tabs) / tabs) * tabs;  /* tab to tab stop */
+                x2 += x;
+                glRasterPos2f (x2, y);
+              }
+            else if (c == '[' && (isdigit (string[i+1])))
+              {
+                sub_p = True;
+                glRasterPos2f (x2, (y -= sub_shift));
+              }
+            else if (c == ']' && sub_p)
+              {
+                sub_p = False;
+                glRasterPos2f (x2, (y += sub_shift));
+              }
+            else
+              {
+                glCallList (font_dlist + (int)(c));
+                x2 += (font->per_char
+                       ? font->per_char[c - font->min_char_or_byte2].width
+                       : font->min_bounds.width);
+              }
+          }
+      }
+      glPopMatrix();
+    }
+    glMatrixMode(GL_PROJECTION);
+    glPopMatrix();
+  }
+  glPopAttrib();
+
+  glMatrixMode(GL_MODELVIEW);
+}
diff --git a/hacks/glx/glxfonts.h b/hacks/glx/glxfonts.h
new file mode 100644 (file)
index 0000000..32bee48
--- /dev/null
@@ -0,0 +1,40 @@
+/* glxfonts, Copyright (c) 2001-2004 Jamie Zawinski <jwz@jwz.org>
+ * Loads X11 fonts for use with OpenGL.
+ *
+ * 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.
+ *
+ * Compute normal vectors for arbitrary triangles.
+ */
+
+#ifndef __GLXFONTS_H__
+#define __GLXFONTS_H__
+
+/* Loads the font named by the X resource "res".
+   Returns an XFontStruct.
+   Also converts the font to a set of GL lists and returns the first list.
+*/
+extern void load_font (Display *, char *resource,
+                       XFontStruct **font_ret,
+                       GLuint *dlist_ret);
+
+/* Width of the string in pixels. */
+extern int string_width (XFontStruct *f, const char *c);
+
+/* Draws the string on the window at the given pixel position.
+   Newlines and tab stops are honored.
+   Any text inside [] will be rendered as a subscript.
+   Assumes the font has been loaded as with load_font(). */
+void print_gl_string (Display *dpy,
+                      XFontStruct *font,
+                      GLuint font_dlist,
+                      int window_width, int window_height,
+                      GLfloat x, GLfloat y,
+                      const char *string);
+
+#endif /* __GLXFONTS_H__ */
index 6000e563c7b6bb5fa14a1f030e64bac22b2e0b2c..519f8c453e8f70d825679f80369df40ce77a5674 100644 (file)
@@ -1,5 +1,5 @@
 /* grab-ximage.c --- grab the screen to an XImage for use with OpenGL.
 /* grab-ximage.c --- grab the screen to an XImage for use with OpenGL.
- * xscreensaver, Copyright (c) 2001, 2003 Jamie Zawinski <jwz@jwz.org>
+ * xscreensaver, Copyright (c) 2001, 2003, 2005 Jamie Zawinski <jwz@jwz.org>
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
  * documentation for any purpose is hereby granted without fee, provided that
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
  * documentation for any purpose is hereby granted without fee, provided that
 #include <X11/Xlib.h>
 #include <X11/Xutil.h>
 #include <GL/gl.h>     /* only for GLfloat */
 #include <X11/Xlib.h>
 #include <X11/Xutil.h>
 #include <GL/gl.h>     /* only for GLfloat */
+#include <GL/glu.h>    /* for gluBuild2DMipmaps */
 
 #include "grabscreen.h"
 #include "visual.h"
 
 
 #include "grabscreen.h"
 #include "visual.h"
 
+/* If REFORMAT_IMAGE_DATA is defined, then we convert Pixmaps to textures
+   like this:
+
+     - get Pixmap as an XImage in whatever form the server hands us;
+     - convert that XImage to 32-bit RGBA in client-local endianness;
+     - make the texture using RGBA, UNSIGNED_BYTE.
+
+   If undefined, we do this:
+
+     - get Pixmap as an XImage in whatever form the server hands us;
+     - figure out what OpenGL texture packing parameters correspond to
+       the image data that the server sent us and use that, e.g.,
+       BGRA, INT_8_8_8_8_REV.
+
+   You might expect the second method to be faster, since we're not making
+   a second copy of the data and iterating each pixel before we hand it
+   to GL.  But, you'd be wrong.  The first method is almost 6x faster.
+   I guess GL is reformatting it *again*, and doing it very inefficiently!
+*/
+#define REFORMAT_IMAGE_DATA
+
+
+#ifdef HAVE_XSHM_EXTENSION
+# include "resources.h"
+# include "xshm.h"
+#endif /* HAVE_XSHM_EXTENSION */
+
 extern char *progname;
 
 #include <X11/Xutil.h>
 extern char *progname;
 
 #include <X11/Xutil.h>
@@ -35,19 +63,20 @@ extern char *progname;
 #undef countof
 #define countof(x) (sizeof((x))/sizeof((*x)))
 
 #undef countof
 #define countof(x) (sizeof((x))/sizeof((*x)))
 
-/* return the next larger power of 2. */
-static int
-to_pow2 (int i)
+
+static int debug_p = 0;
+
+static Bool
+bigendian (void)
 {
 {
-  static unsigned int pow2[] = { 1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024,
-                                 2048, 4096, 8192, 16384, 32768, 65536 };
-  int j;
-  for (j = 0; j < countof(pow2); j++)
-    if (pow2[j] >= i) return pow2[j];
-  abort();  /* too big! */
+  union { int i; char c[sizeof(int)]; } u;
+  u.i = 1;
+  return !u.c[0];
 }
 
 
 }
 
 
+#ifdef REFORMAT_IMAGE_DATA
+
 /* Given a bitmask, returns the position and width of the field.
  */
 static void
 /* Given a bitmask, returns the position and width of the field.
  */
 static void
@@ -87,185 +116,355 @@ spread_bits (unsigned char value, unsigned char width)
 }
 
 
 }
 
 
-static Bool
-bigendian (void)
-{
-  union { int i; char c[sizeof(int)]; } u;
-  u.i = 1;
-  return !u.c[0];
-}
-
-
 static XImage *
 static XImage *
-screen_to_ximage_1 (Screen *screen, Window window, Pixmap pixmap)
+convert_ximage_to_rgba32 (Screen *screen, XImage *image)
 {
   Display *dpy = DisplayOfScreen (screen);
 {
   Display *dpy = DisplayOfScreen (screen);
-  XWindowAttributes xgwa;
-  int win_width, win_height;
-  int tex_width, tex_height;
-
-  XGetWindowAttributes (dpy, window, &xgwa);
-  win_width = xgwa.width;
-  win_height = xgwa.height;
+  Visual *visual = DefaultVisualOfScreen (screen);
 
 
-  /* GL texture sizes must be powers of two. */
-  tex_width  = to_pow2(win_width);
-  tex_height = to_pow2(win_height);
+  int x, y;
+  unsigned int crpos=0, cgpos=0, cbpos=0, capos=0; /* bitfield positions */
+  unsigned int srpos=0, sgpos=0, sbpos=0;
+  unsigned int srmsk=0, sgmsk=0, sbmsk=0;
+  unsigned int srsiz=0, sgsiz=0, sbsiz=0;
+  int i;
+  XColor *colors = 0;
+  unsigned char spread_map[3][256];
 
 
-  /* Convert the server-side Pixmap to a client-side GL-ordered XImage.
+  /* Note: height+2 in "to" to be to work around an array bounds overrun
+     in gluBuild2DMipmaps / gluScaleImage.
    */
    */
-  {
-    XImage *ximage1, *ximage2;
-    XColor *colors = 0;
+  XImage *from = image;
+  XImage *to = XCreateImage (dpy, visual, 32,  /* depth */
+                             ZPixmap, 0, 0, from->width, from->height + 2,
+                             32, /* bitmap pad */
+                             0);
+  to->data = (char *) calloc (to->height, to->bytes_per_line);
+
+  if (visual_class (screen, visual) == PseudoColor ||
+      visual_class (screen, visual) == GrayScale)
+    {
+      Colormap cmap = DefaultColormapOfScreen (screen);
+      int ncolors = visual_cells (screen, visual);
+      int i;
+      colors = (XColor *) calloc (sizeof (*colors), ncolors+1);
+      for (i = 0; i < ncolors; i++)
+        colors[i].pixel = i;
+      XQueryColors (dpy, cmap, colors, ncolors);
+    }
 
 
-    ximage1 = XGetImage (dpy, pixmap, 0, 0, win_width, win_height, ~0L,
-                         ZPixmap);
-    XFreePixmap (dpy, pixmap);
-    pixmap = 0;
+  if (colors == 0)  /* truecolor */
+    {
+      srmsk = to->red_mask;
+      sgmsk = to->green_mask;
+      sbmsk = to->blue_mask;
 
 
-    ximage2 = XCreateImage (dpy, xgwa.visual, 32, ZPixmap, 0, 0,
-                            tex_width, tex_height, 32, 0);
+      decode_mask (srmsk, &srpos, &srsiz);
+      decode_mask (sgmsk, &sgpos, &sgsiz);
+      decode_mask (sbmsk, &sbpos, &sbsiz);
+    }
 
 
-    ximage2->data = (char *) calloc (tex_height, ximage2->bytes_per_line);
+  /* Pack things in "RGBA" order in client endianness. */
+  if (bigendian())
+    crpos = 24, cgpos = 16, cbpos =  8, capos =  0;
+  else
+    crpos =  0, cgpos =  8, cbpos = 16, capos = 24;
 
 
+  if (colors == 0)  /* truecolor */
     {
     {
-      Screen *dscreen = DefaultScreenOfDisplay (dpy);
-      Visual *dvisual = DefaultVisualOfScreen (dscreen);
-      if (visual_class (dscreen, dvisual) == PseudoColor ||
-          visual_class (dscreen, dvisual) == GrayScale)
+      for (i = 0; i < 256; i++)
         {
         {
-          Colormap cmap = DefaultColormapOfScreen(dscreen);
-          int ncolors = visual_cells (dscreen, dvisual);
-          int i;
-          colors = (XColor *) calloc (sizeof (*colors), ncolors+1);
-          for (i = 0; i < ncolors; i++)
-            colors[i].pixel = i;
-          XQueryColors (dpy, cmap, colors, ncolors);
+          spread_map[0][i] = spread_bits (i, srsiz);
+          spread_map[1][i] = spread_bits (i, sgsiz);
+          spread_map[2][i] = spread_bits (i, sbsiz);
         }
     }
 
         }
     }
 
-    /* Translate the server-ordered image to a client-ordered image.
-     */
+  for (y = 0; y < from->height; y++)
+    for (x = 0; x < from->width; x++)
+      {
+        unsigned long sp = XGetPixel (from, x, y);
+        unsigned char sr, sg, sb;
+        unsigned long cp;
+
+        if (colors)
+          {
+            sr = colors[sp].red   & 0xFF;
+            sg = colors[sp].green & 0xFF;
+            sb = colors[sp].blue  & 0xFF;
+          }
+        else
+          {
+            sr = (sp & srmsk) >> srpos;
+            sg = (sp & sgmsk) >> sgpos;
+            sb = (sp & sbmsk) >> sbpos;
+
+            sr = spread_map[0][sr];
+            sg = spread_map[1][sg];
+            sb = spread_map[2][sb];
+          }
+
+        cp = ((sr << crpos) |
+              (sg << cgpos) |
+              (sb << cbpos) |
+              (0xFF << capos));
+
+        XPutPixel (to, x, y, cp);
+      }
+
+  if (colors) free (colors);
+
+  return to;
+}
+
+#endif /* REFORMAT_IMAGE_DATA */
+
+/* Shrinks the XImage by a factor of two.
+   We use this when mipmapping fails on large textures.
+ */
+static void
+halve_image (XImage *ximage)
+{
+  int w2 = ximage->width/2;
+  int h2 = ximage->height/2;
+  int x, y;
+  XImage *ximage2;
+
+  if (w2 <= 32 || h2 <= 32)   /* let's not go crazy here, man. */
+    return;
+
+  if (debug_p)
+    fprintf (stderr, "%s: shrinking image %dx%d -> %dx%d\n",
+             progname, ximage->width, ximage->height, w2, h2);
+
+  ximage2 = (XImage *) calloc (1, sizeof (*ximage2));
+  *ximage2 = *ximage;
+  ximage2->width = w2;
+  ximage2->height = h2;
+  ximage2->bytes_per_line = 0;
+  ximage2->data = 0;
+  XInitImage (ximage2);
+
+  ximage2->data = (char *) calloc (h2, ximage2->bytes_per_line);
+  if (!ximage2->data)
     {
     {
-      int x, y;
-      unsigned int crpos=0, cgpos=0, cbpos=0, capos=0; /* bitfield positions */
-      unsigned int srpos=0, sgpos=0, sbpos=0;
-      unsigned int srmsk=0, sgmsk=0, sbmsk=0;
-      unsigned int srsiz=0, sgsiz=0, sbsiz=0;
-      int i;
+      fprintf (stderr, "%s: out of memory (scaling %dx%d image to %dx%d)\n",
+               progname, ximage->width, ximage->height, w2, h2);
+      exit (1);
+    }
 
 
-      unsigned char spread_map[3][256];
+  for (y = 0; y < h2; y++)
+    for (x = 0; x < w2; x++)
+      XPutPixel (ximage2, x, y, XGetPixel (ximage, x*2, y*2));
 
 
-      if (colors == 0)  /* truecolor */
-        {
-          srmsk = ximage2->red_mask;
-          sgmsk = ximage2->green_mask;
-          sbmsk = ximage2->blue_mask;
+  free (ximage->data);
+  *ximage = *ximage2;
+  ximage2->data = 0;
+  XFree (ximage2);
+}
 
 
-          decode_mask (srmsk, &srpos, &srsiz);
-          decode_mask (sgmsk, &sgpos, &sgsiz);
-          decode_mask (sbmsk, &sbpos, &sbsiz);
-        }
 
 
-      /* Note that unlike X, which is endianness-agnostic (since any XImage
-         can have its own specific bit ordering, with the server reversing
-         things as necessary) OpenGL pretends everything is client-side, so
-         we need to pack things in "RGBA" order on the client machine,
-         regardless of its endianness.
-       */
-      if (bigendian())
-        crpos = 24, cgpos = 16, cbpos =  8, capos =  0;
-      else
-        crpos =  0, cgpos =  8, cbpos = 16, capos = 24;
+#ifdef REFORMAT_IMAGE_DATA
 
 
-      if (colors == 0)  /* truecolor */
-        {
-          for (i = 0; i < 256; i++)
-            {
-              spread_map[0][i] = spread_bits (i, srsiz);
-              spread_map[1][i] = spread_bits (i, sgsiz);
-              spread_map[2][i] = spread_bits (i, sbsiz);
-            }
-        }
+/* Pulls the Pixmap bits from the server and returns an XImage
+   in some format acceptable to OpenGL.
+ */
+static XImage *
+pixmap_to_gl_ximage (Screen *screen, Window window, Pixmap pixmap)
+{
+  Display *dpy = DisplayOfScreen (screen);
+  Visual *visual = DefaultVisualOfScreen (screen);
+  unsigned int width, height, depth;
 
 
-      for (y = 0; y < win_height; y++)
-        {
-          int y2 = (win_height-1-y); /* Texture maps are upside down. */
-          for (x = 0; x < win_width; x++)
-            {
-              unsigned long sp = XGetPixel (ximage1, x, y2);
-              unsigned char sr, sg, sb;
-              unsigned long cp;
-
-              if (colors)
-                {
-                  sr = colors[sp].red   & 0xFF;
-                  sg = colors[sp].green & 0xFF;
-                  sb = colors[sp].blue  & 0xFF;
-                }
-              else
-                {
-                  sr = (sp & srmsk) >> srpos;
-                  sg = (sp & sgmsk) >> sgpos;
-                  sb = (sp & sbmsk) >> sbpos;
-
-                  sr = spread_map[0][sr];
-                  sg = spread_map[1][sg];
-                  sb = spread_map[2][sb];
-                }
-
-              cp = ((sr << crpos) |
-                    (sg << cgpos) |
-                    (sb << cbpos) |
-                    (0xFF << capos));
-
-              XPutPixel (ximage2, x, y, cp);
-            }
-        }
+# ifdef HAVE_XSHM_EXTENSION
+  Bool use_shm = get_boolean_resource ("useSHM", "Boolean");
+  XShmSegmentInfo shm_info;
+# endif /* HAVE_XSHM_EXTENSION */
+
+  XImage *server_ximage = 0;
+  XImage *client_ximage = 0;
+
+  {
+    Window root;
+    int x, y;
+    unsigned int bw;
+    XGetGeometry (dpy, pixmap, &root, &x, &y, &width, &height, &bw, &depth);
+  }
+
+  /* Convert the server-side Pixmap to a client-side GL-ordered XImage.
+   */
+# ifdef HAVE_XSHM_EXTENSION
+  if (use_shm)
+    {
+      server_ximage = create_xshm_image (dpy, visual, depth,
+                                         ZPixmap, 0, &shm_info,
+                                         width, height);
+      if (server_ximage)
+        XShmGetImage (dpy, pixmap, server_ximage, 0, 0, ~0L);
+      else
+        use_shm = False;
     }
     }
+# endif /* HAVE_XSHM_EXTENSION */
 
 
-    if (pixmap) XFreePixmap (dpy, pixmap);
-    if (colors) free (colors);
-    free (ximage1->data);
-    ximage1->data = 0;
-    XDestroyImage (ximage1);
+  if (!server_ximage)
+    server_ximage = XGetImage (dpy, pixmap, 0, 0, width, height, ~0L, ZPixmap);
 
 
-#if 0
-    fprintf(stderr, "%s: grabbed %dx%d window 0x%lx to %dx%d texture\n",
-            progname, win_width, win_height, (unsigned long) window,
-            tex_width, tex_height);
-#endif
+  client_ximage = convert_ximage_to_rgba32 (screen, server_ximage);
 
 
-    return ximage2;
-  }
+# ifdef HAVE_XSHM_EXTENSION
+  if (use_shm)
+    destroy_xshm_image (dpy, server_ximage, &shm_info);
+  else
+# endif /* HAVE_XSHM_EXTENSION */
+    XDestroyImage (server_ximage);
+
+  return client_ximage;
 }
 
 
 }
 
 
-/* Returns an XImage structure containing an image of the desktop.
-   (As a side-effect, that image *may* be painted onto the given Window.)
-   This XImage will be 32 bits per pixel, 8 each per R, G, and B, with the
-   extra byte set to 0xFF.
+# else /* ! REFORMAT_IMAGE_DATA */
+
+typedef struct {
+  unsigned int depth, red_mask, green_mask, blue_mask; /* when this... */
+  GLint type, format;                                  /* ...use this. */
+} conversion_table;
+
+/* Abbreviate these so that the table entries all fit on one line...
+ */
+#define BYTE               GL_UNSIGNED_BYTE
+#define BYTE_2_3_3_REV     GL_UNSIGNED_BYTE_2_3_3_REV
+#define BYTE_3_3_2         GL_UNSIGNED_BYTE_3_3_2
+#define INT_10_10_10_2     GL_UNSIGNED_INT_10_10_10_2
+#define INT_2_10_10_10_REV GL_UNSIGNED_INT_2_10_10_10_REV
+#define INT_8_8_8_8        GL_UNSIGNED_INT_8_8_8_8
+#define INT_8_8_8_8_REV    GL_UNSIGNED_INT_8_8_8_8_REV
+#define SHORT_1_5_5_5_REV  GL_UNSIGNED_SHORT_1_5_5_5_REV
+#define SHORT_4_4_4_4      GL_UNSIGNED_SHORT_4_4_4_4
+#define SHORT_4_4_4_4_REV  GL_UNSIGNED_SHORT_4_4_4_4_REV
+#define SHORT_5_5_5_1      GL_UNSIGNED_SHORT_5_5_5_1
+#define SHORT_5_6_5        GL_UNSIGNED_SHORT_5_6_5
+#define SHORT_5_6_5_REV    GL_UNSIGNED_SHORT_5_6_5_REV
+
+static conversion_table ctable[] = {
+  { 8,  0x000000E0, 0x0000001C, 0x00000003, BYTE_3_3_2,         GL_RGB      },
+  { 8,  0x00000007, 0x00000038, 0x000000C0, BYTE_2_3_3_REV,     GL_RGB      },
+  { 16, 0x0000F800, 0x000007E0, 0x0000001F, SHORT_5_6_5,        GL_RGB      },
+  { 16, 0x0000001F, 0x000007E0, 0x0000F800, SHORT_5_6_5_REV,    GL_RGB      },
+  { 16, 0x0000F000, 0x00000F00, 0x000000F0, SHORT_4_4_4_4,      GL_RGBA     },
+  { 16, 0x000000F0, 0x00000F00, 0x0000F000, SHORT_4_4_4_4,      GL_BGRA     },
+  { 16, 0x0000000F, 0x000000F0, 0x00000F00, SHORT_4_4_4_4,      GL_ABGR_EXT },
+  { 16, 0x0000000F, 0x000000F0, 0x00000F00, SHORT_4_4_4_4_REV,  GL_RGBA     },
+  { 16, 0x00000F00, 0x000000F0, 0x0000000F, SHORT_4_4_4_4_REV,  GL_BGRA     },
+  { 16, 0x0000F800, 0x000007C0, 0x0000003E, SHORT_5_5_5_1,      GL_RGBA     },
+  { 16, 0x0000003E, 0x000007C0, 0x0000F800, SHORT_5_5_5_1,      GL_BGRA     },
+  { 16, 0x00000001, 0x0000003E, 0x000007C0, SHORT_5_5_5_1,      GL_ABGR_EXT },
+  { 16, 0x0000001F, 0x000003E0, 0x00007C00, SHORT_1_5_5_5_REV,  GL_RGBA     },
+  { 16, 0x00007C00, 0x000003E0, 0x0000001F, SHORT_1_5_5_5_REV,  GL_BGRA     },
+  { 32, 0xFF000000, 0x00FF0000, 0x0000FF00, INT_8_8_8_8,        GL_RGBA     },
+  { 32, 0x0000FF00, 0x00FF0000, 0xFF000000, INT_8_8_8_8,        GL_BGRA     },
+  { 32, 0x000000FF, 0x0000FF00, 0x00FF0000, INT_8_8_8_8,        GL_ABGR_EXT },
+  { 32, 0x000000FF, 0x0000FF00, 0x00FF0000, INT_8_8_8_8_REV,    GL_RGBA     },
+  { 32, 0x00FF0000, 0x0000FF00, 0x000000FF, INT_8_8_8_8_REV,    GL_BGRA     },
+  { 32, 0xFFC00000, 0x003FF000, 0x00000FFC, INT_10_10_10_2,     GL_RGBA     },
+  { 32, 0x00000FFC, 0x003FF000, 0xFFC00000, INT_10_10_10_2,     GL_BGRA     },
+  { 32, 0x00000003, 0x00000FFC, 0x003FF000, INT_10_10_10_2,     GL_ABGR_EXT },
+  { 32, 0x000003FF, 0x000FFC00, 0x3FF00000, INT_2_10_10_10_REV, GL_RGBA     },
+  { 32, 0x3FF00000, 0x000FFC00, 0x000003FF, INT_2_10_10_10_REV, GL_BGRA     },
+  { 24, 0x000000FF, 0x0000FF00, 0x00FF0000, BYTE,               GL_RGB      },
+  { 24, 0x00FF0000, 0x0000FF00, 0x000000FF, BYTE,               GL_BGR      },
+};
+
+
+/* Given an XImage, returns the GL settings to use its data as a texture.
  */
  */
-XImage *
-screen_to_ximage (Screen *screen, Window window, char **filename_return)
+static void
+gl_settings_for_ximage (XImage *image,
+                        GLint *type_ret, GLint *format_ret, GLint *swap_ret)
 {
 {
-  Display *dpy = DisplayOfScreen (screen);
-  Pixmap pixmap = 0;
-  XWindowAttributes xgwa;
+  int i;
+  for (i = 0; i < countof(ctable); ++i)
+    {
+      if (image->bits_per_pixel == ctable[i].depth &&
+          image->red_mask       == ctable[i].red_mask &&
+          image->green_mask     == ctable[i].green_mask &&
+          image->blue_mask      == ctable[i].blue_mask)
+        {
+          *type_ret   = ctable[i].type;
+          *format_ret = ctable[i].format;
 
 
-  XGetWindowAttributes (dpy, window, &xgwa);
-  pixmap = XCreatePixmap (dpy, window, xgwa.width, xgwa.height, xgwa.depth);
-  load_random_image (screen, window, pixmap, filename_return);
+          if (image->bits_per_pixel == 24)
+            {
+              /* don't know how to test this... */
+              *type_ret = (ctable[i].type == GL_RGB) ? GL_BGR : GL_RGB;
+              *swap_ret = 0;
+            }
+          else
+            {
+              *swap_ret = !!(image->byte_order == MSBFirst) ^ !!bigendian();
+            }
 
 
-  return screen_to_ximage_1 (screen, window, pixmap);
+          if (debug_p)
+            {
+              fprintf (stderr, "%s: using %s %s %d for %d %08lX %08lX %08lX\n",
+                       progname,
+                       (*format_ret == GL_RGB      ? "RGB" :
+                        *format_ret == GL_BGR      ? "BGR" :
+                        *format_ret == GL_RGBA     ? "RGBA" :
+                        *format_ret == GL_BGRA     ? "BGRA" :
+                        *format_ret == GL_ABGR_EXT ? "ABGR_EXT" :
+                        "???"),
+                       (*type_ret == BYTE               ? "BYTE" :
+                        *type_ret == BYTE_3_3_2         ? "BYTE_3_3_2" :
+                        *type_ret == BYTE_2_3_3_REV     ? "BYTE_2_3_3_REV" :
+                        *type_ret == INT_8_8_8_8        ? "INT_8_8_8_8" :
+                        *type_ret == INT_8_8_8_8_REV    ? "INT_8_8_8_8_REV" :
+                        *type_ret == INT_10_10_10_2     ? "INT_10_10_10_2" :
+                        *type_ret == INT_2_10_10_10_REV ? "INT_2_10_10_10_REV":
+                        *type_ret == SHORT_4_4_4_4      ? "SHORT_4_4_4_4" :
+                        *type_ret == SHORT_4_4_4_4_REV  ? "SHORT_4_4_4_4_REV" :
+                        *type_ret == SHORT_5_5_5_1      ? "SHORT_5_5_5_1" :
+                        *type_ret == SHORT_1_5_5_5_REV  ? "SHORT_1_5_5_5_REV" :
+                        *type_ret == SHORT_5_6_5        ? "SHORT_5_6_5" :
+                        *type_ret == SHORT_5_6_5_REV    ? "SHORT_5_6_5_REV" :
+                        "???"),
+                       *swap_ret,
+                       image->bits_per_pixel,
+                       image->red_mask, image->green_mask, image->blue_mask);
+            }
+
+          return;
+        }
+    }
+
+  /* Unknown RGB fields? */
+  abort();
 }
 
 }
 
+#endif /* ! REFORMAT_IMAGE_DATA */
 
 typedef struct {
 
 typedef struct {
-  void (*callback) (Screen *, Window, XImage *,
-                    const char *name, void *closure, double cvt_time);
-  void *closure;
   Pixmap pixmap;
   Pixmap pixmap;
+  int pix_width, pix_height, pix_depth;
+  int texid;
+  Bool mipmap_p;
+  double load_time;
+
+  /* Used in async mode
+   */
+  void (*callback) (const char *filename, XRectangle *geometry,
+                    int iw, int ih, int tw, int th,
+                    void *closure);
+  void *closure;
+
+  /* Used in sync mode
+   */
+  char **filename_return;
+  XRectangle *geometry_return;
+  int *image_width_return;
+  int *image_height_return;
+  int *texture_width_return;
+  int *texture_height_return;
+
 } img_closure;
 
 
 } img_closure;
 
 
@@ -286,45 +485,362 @@ double_time (void)
 }
 
 
 }
 
 
-static void
-img_cb (Screen *screen, Window window, Drawable drawable,
-        const char *name, void *closure)
+/* return the next larger power of 2. */
+static int
+to_pow2 (int i)
 {
 {
-  XImage *ximage;
-  double cvt_time = double_time();
-  img_closure *data = (img_closure *) closure;
-  /* copy closure data to stack and free the original before running cb */
-  img_closure dd = *data;
-  memset (data, 0, sizeof (*data));
-  free (data);
-  data = 0;
-  ximage = screen_to_ximage_1 (screen, window, dd.pixmap);
-  dd.callback (screen, window, ximage, name, dd.closure, cvt_time);
+  static unsigned int pow2[] = { 1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024,
+                                 2048, 4096, 8192, 16384, 32768, 65536 };
+  int j;
+  for (j = 0; j < countof(pow2); j++)
+    if (pow2[j] >= i) return pow2[j];
+  abort();  /* too big! */
 }
 
 
 }
 
 
-/* Like the above, but loads the image in the background and runs the
-   given callback once it has been loaded.
+/* Loads the given XImage into GL's texture memory.
+   The image may be of any size.
+   If mipmap_p is true, then make mipmaps instead of just a single texture.
+   Writes to stderr and returns False on error.
  */
  */
-#include <X11/Intrinsic.h>
-extern XtAppContext app;
+static Bool
+ximage_to_texture (XImage *ximage,
+                   GLint type, GLint format,
+                   int *width_return,
+                   int *height_return,
+                   Bool mipmap_p)
+{
+  int max_reduction = 7;
+  int err_count = 0;
+  GLenum err = 0;
+  int orig_width = ximage->width;
+  int orig_height = ximage->height;
+  int tex_width = 0;
+  int tex_height = 0;
+
+ AGAIN:
+
+  if (mipmap_p)
+    {
+      /* gluBuild2DMipmaps doesn't require textures to be a power of 2. */
+      tex_width  = ximage->width;
+      tex_height = ximage->height;
 
 
+      if (debug_p)
+        fprintf (stderr, "%s: mipmap %d x %d\n",
+                 progname, ximage->width, ximage->height);
+
+      gluBuild2DMipmaps (GL_TEXTURE_2D, 3, ximage->width, ximage->height,
+                         format, type, ximage->data);
+      err = glGetError();
+    }
+  else
+    {
+      /* glTexImage2D() requires the texture sizes to be powers of 2.
+         So first, create a texture of that size (but don't write any
+         data into it.)
+       */
+      tex_width  = to_pow2 (ximage->width);
+      tex_height = to_pow2 (ximage->height);
+
+      if (debug_p)
+        fprintf (stderr, "%s: texture %d x %d (%d x %d)\n",
+                 progname, ximage->width, ximage->height,
+                 tex_width, tex_height);
+
+      glTexImage2D (GL_TEXTURE_2D, 0, 3, tex_width, tex_height, 0,
+                    format, type, 0);
+      err = glGetError();
+
+      /* Now load our non-power-of-2 image data into the existing texture. */
+      if (!err)
+        {
+          glTexSubImage2D (GL_TEXTURE_2D, 0, 0, 0,
+                           ximage->width, ximage->height,
+                           GL_RGBA, GL_UNSIGNED_BYTE, ximage->data);
+          err = glGetError();
+        }
+    }
+
+  if (err)
+    {
+      char buf[100];
+      const char *s = (char *) gluErrorString (err);
+
+      if (!s || !*s)
+        {
+          sprintf (buf, "unknown error %d", err);
+          s = buf;
+        }
+
+      while (glGetError() != GL_NO_ERROR)
+        ;  /* clear any lingering errors */
+
+      if (++err_count > max_reduction)
+        {
+          fprintf (stderr,
+                   "\n"
+                   "%s: %dx%d texture failed, even after reducing to %dx%d:\n"
+                   "%s: The error was: \"%s\".\n"
+                   "%s: probably this means "
+                   "\"your video card is worthless and weak\"?\n\n",
+                   progname, orig_width, orig_height,
+                   ximage->width, ximage->height,
+                   progname, s,
+                   progname);
+          return False;
+        }
+      else
+        {
+          if (debug_p)
+            fprintf (stderr, "%s: mipmap error (%dx%d): %s\n",
+                     progname, ximage->width, ximage->height, s);
+          halve_image (ximage);
+          goto AGAIN;
+        }
+    }
+
+  if (width_return)  *width_return  = tex_width;
+  if (height_return) *height_return = tex_height;
+  return True;
+}
+
+
+static void screen_to_texture_async_cb (Screen *screen,
+                                        Window window, Drawable drawable,
+                                        const char *name, XRectangle *geometry,
+                                        void *closure);
+
+
+/* Grabs an image of the desktop (or another random image file) and
+   loads tht image into GL's texture memory.
+   Writes to stderr and returns False on error.
+ */
+Bool
+screen_to_texture (Screen *screen, Window window,
+                   int desired_width, int desired_height,
+                   Bool mipmap_p,
+                   char **filename_return,
+                   XRectangle *geometry_return,
+                   int *image_width_return,
+                   int *image_height_return,
+                   int *texture_width_return,
+                   int *texture_height_return)
+{
+  Display *dpy = DisplayOfScreen (screen);
+  img_closure *data = (img_closure *) calloc (1, sizeof(*data));
+  XWindowAttributes xgwa;
+  char *filename = 0;
+  XRectangle geom = { 0, 0, 0, 0 };
+  int wret;
+
+  if (! image_width_return)
+    image_width_return = &wret;
+
+  if (debug_p)
+    data->load_time = double_time();
+
+  data->texid     = -1;
+  data->mipmap_p  = mipmap_p;
+  data->filename_return       = filename_return;
+  data->geometry_return       = geometry_return;
+  data->image_width_return    = image_width_return;
+  data->image_height_return   = image_height_return;
+  data->texture_width_return  = texture_width_return;
+  data->texture_height_return = texture_height_return;
+
+  XGetWindowAttributes (dpy, window, &xgwa);
+  data->pix_width  = xgwa.width;
+  data->pix_height = xgwa.height;
+  data->pix_depth  = xgwa.depth;
+
+  if (desired_width  && desired_width  < xgwa.width)
+    data->pix_width  = desired_width;
+  if (desired_height && desired_height < xgwa.height)
+    data->pix_height = desired_height;
+
+  data->pixmap = XCreatePixmap (dpy, window, data->pix_width, data->pix_height,
+                                data->pix_depth);
+  load_random_image (screen, window, data->pixmap, &filename, &geom);
+  screen_to_texture_async_cb (screen, window, data->pixmap, filename, &geom,
+                              data);
+
+  return (*image_width_return != 0);
+}
+
+
+/* Like the above, but the image is loaded in a background process,
+   and a callback is run when the loading is complete.
+   When the callback is called, the image data will have been loaded
+   into texture number `texid' (via glBindTexture.)
+
+   If an error occurred, width/height will be 0.
+ */
 void
 void
-fork_screen_to_ximage (Screen *screen, Window window,
-                       void (*callback) (Screen *, Window, XImage *,
-                                         const char *name,
-                                         void *closure,
-                                         double cvt_time),
-                       void *closure)
+screen_to_texture_async (Screen *screen, Window window,
+                         int desired_width, int desired_height,
+                         Bool mipmap_p,
+                         GLuint texid,
+                         void (*callback) (const char *filename,
+                                           XRectangle *geometry,
+                                           int image_width,
+                                           int image_height,
+                                           int texture_width,
+                                           int texture_height,
+                                           void *closure),
+                         void *closure)
 {
   Display *dpy = DisplayOfScreen (screen);
   XWindowAttributes xgwa;
   img_closure *data = (img_closure *) calloc (1, sizeof(*data));
 {
   Display *dpy = DisplayOfScreen (screen);
   XWindowAttributes xgwa;
   img_closure *data = (img_closure *) calloc (1, sizeof(*data));
-  data->callback = callback;
-  data->closure  = closure;
+
+  if (debug_p)
+    data->load_time = double_time();
+
+  data->texid     = texid;
+  data->mipmap_p  = mipmap_p;
+  data->callback  = callback;
+  data->closure   = closure;
 
   XGetWindowAttributes (dpy, window, &xgwa);
 
   XGetWindowAttributes (dpy, window, &xgwa);
-  data->pixmap = XCreatePixmap (dpy, window, xgwa.width, xgwa.height,
-                                xgwa.depth);
-  fork_load_random_image (screen, window, data->pixmap, img_cb, data);
+  data->pix_width  = xgwa.width;
+  data->pix_height = xgwa.height;
+  data->pix_depth  = xgwa.depth;
+
+  if (desired_width  && desired_width  < xgwa.width)
+    data->pix_width  = desired_width;
+  if (desired_height && desired_height < xgwa.height)
+    data->pix_height = desired_height;
+
+  data->pixmap = XCreatePixmap (dpy, window, data->pix_width, data->pix_height,
+                                data->pix_depth);
+  fork_load_random_image (screen, window, data->pixmap,
+                          screen_to_texture_async_cb, data);
+}
+
+
+/* Once we have an XImage, this loads it into GL.
+   This is used in both synchronous and asynchronous mode.
+ */
+static void
+screen_to_texture_async_cb (Screen *screen, Window window, Drawable drawable,
+                            const char *name, XRectangle *geometry,
+                            void *closure)
+{
+  Display *dpy = DisplayOfScreen (screen);
+  Bool ok;
+  XImage *ximage;
+  GLint type, format;
+  int iw=0, ih=0, tw=0, th=0;
+  double cvt_time=0, tex_time=0, done_time=0;
+  img_closure *data = (img_closure *) closure;
+  /* copy closure data to stack and free the original before running cb */
+  img_closure dd = *data;
+  memset (data, 0, sizeof (*data));
+  free (data);
+  data = 0;
+
+  if (geometry->width <= 0 || geometry->height <= 0)
+    {
+      /* This can happen if an old version of xscreensaver-getimage
+         is installed. */
+      geometry->x = 0;
+      geometry->y = 0;
+      geometry->width  = dd.pix_width;
+      geometry->height = dd.pix_height;
+    }
+
+  if (geometry->width <= 0 || geometry->height <= 0)
+    abort();
+
+  if (debug_p)
+    cvt_time = double_time();
+
+# ifdef REFORMAT_IMAGE_DATA
+  ximage = pixmap_to_gl_ximage (screen, window, dd.pixmap);
+  format = GL_RGBA;
+  type = GL_UNSIGNED_BYTE;
+
+#else /* ! REFORMAT_IMAGE_DATA */
+  {
+    Visual *visual = DefaultVisualOfScreen (screen);
+    GLint swap;
+
+    ximage = XCreateImage (dpy, visual, dd.pix_depth, ZPixmap, 0, 0,
+                           dd.pix_width, dd.pix_height, 32, 0);
+
+    /* Note: height+2 in "to" to be to work around an array bounds overrun
+       in gluBuild2DMipmaps / gluScaleImage. */
+    ximage->data = (char *) calloc (ximage->height+2, ximage->bytes_per_line);
+
+    if (!ximage->data ||
+        !XGetSubImage (dpy, dd.pixmap, 0, 0, ximage->width, ximage->height,
+                       ~0L, ximage->format, ximage, 0, 0))
+      {
+        XDestroyImage (ximage);
+        ximage = 0;
+      }
+
+    gl_settings_for_ximage (ximage, &type, &format, &swap);
+    glPixelStorei (GL_UNPACK_SWAP_BYTES, !swap);
+  }
+#endif /* REFORMAT_IMAGE_DATA */
+
+  XFreePixmap (dpy, dd.pixmap);
+  dd.pixmap = 0;
+
+  if (debug_p)
+    tex_time = double_time();
+
+  if (! ximage)
+    ok = False;
+  else
+    {
+      iw = ximage->width;
+      ih = ximage->height;
+      if (dd.texid != -1)
+        glBindTexture (GL_TEXTURE_2D, dd.texid);
+
+      glPixelStorei (GL_UNPACK_ALIGNMENT, ximage->bitmap_pad / 8);
+      ok = ximage_to_texture (ximage, type, format, &tw, &th, dd.mipmap_p);
+    }
+
+  if (ximage) XDestroyImage (ximage);
+
+  if (! ok)
+    iw = ih = tw = th = 0;
+
+  if (debug_p)
+    done_time = double_time();
+
+  if (debug_p)
+    fprintf (stderr,
+             /* prints: A + B + C = D
+                A = file I/O time (happens in background)
+                B = time to pull bits from server (this process)
+                C = time to convert bits to GL textures (this process)
+                D = total elapsed time from "want image" to "see image"
+
+                B+C is responsible for any frame-rate glitches.
+              */
+             "%s: loading elapsed: %.2f + %.2f + %.2f = %.2f sec\n",
+             progname,
+             cvt_time  - dd.load_time,
+             tex_time  - cvt_time,
+             done_time - tex_time,
+             done_time - dd.load_time);
+
+  if (dd.callback)
+    /* asynchronous mode */
+    dd.callback (name, geometry, iw, ih, tw, th, dd.closure);
+  else
+    {
+      /* synchronous mode */
+      if (dd.filename_return)       *dd.filename_return       = (char *) name;
+      if (dd.geometry_return)       *dd.geometry_return       = *geometry;
+      if (dd.image_width_return)    *dd.image_width_return    = iw;
+      if (dd.image_height_return)   *dd.image_height_return   = ih;
+      if (dd.texture_width_return)  *dd.texture_width_return  = tw;
+      if (dd.texture_height_return) *dd.texture_height_return = th;
+    }
 }
 }
index e892139615eda8f6eb565dae5b2bd09a0744e0a8..7e82489ab54d4e2098ecdcde4b4568b0188fe63b 100644 (file)
@@ -1,5 +1,5 @@
 /* grab-ximage.c --- grab the screen to an XImage for use with OpenGL.
 /* grab-ximage.c --- grab the screen to an XImage for use with OpenGL.
- * xscreensaver, Copyright (c) 2001, 2003, 2004 Jamie Zawinski <jwz@jwz.org>
+ * xscreensaver, Copyright (c) 2001-2005 Jamie Zawinski <jwz@jwz.org>
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
  * documentation for any purpose is hereby granted without fee, provided that
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
  * documentation for any purpose is hereby granted without fee, provided that
 #ifndef __GRAB_XIMAGE_H__
 #define __GRAB_XIMAGE_H__
 
 #ifndef __GRAB_XIMAGE_H__
 #define __GRAB_XIMAGE_H__
 
-/* Returns an XImage structure containing an image of the desktop.
-   (As a side-effect, that image *may* be painted onto the given Window.)
-   This XImage will be 32 bits per pixel, 8 each per R, G, and B, with the
-   extra byte set to 0xFF.
+/* Grabs an image of the desktop (or another random image file) and
+   loads tht image into GL's texture memory.
+
+   As a side-effect, that image *may* be painted onto the given Window.
+
+   If mipmap_p is true, then make mipmaps instead of just a single texture.
+
+   If desired_width/height are non-zero, then (if possible) the image
+   will be scaled to fit in that rectangle.  If they are 0, then the size
+   of the window is used.  These parameters are so that you can hint to
+   the image loader that smaller images are acceptable (if you will never
+   be displaying the texture at 100% magnification, you can get away with
+   smaller textures.)
+
+   Returns the sizes of various things:
+
+      texture_width/height: The size of the texture itself, in pixels.
+                            This will often be larger than the grabbed
+                            image, since OpenGL sometimes requires texture
+                            dimensions to be a power of 2.
+
+      image_width/height:   The size of the image: this will usually be the
+                            same as the desired_width/height you passed in
+                            (but may be the size of the Window instead.)
+
+      geometry:             The position in the texture of the image bits.
+                            When image files are loaded, they are scaled up
+                            to the size of the window, but if the image does
+                            not have the same aspect ratio as the window,
+                            there will be black bars on the top/bottom or
+                            left/right.  This geometry specification tells
+                            you where the "real" image bits are.
+
+   So, don't use texture coordinates from 0.0 to 1.0.  Instead use:
+
+      [0.0 - iw/tw]         If you want to display a quad that is the same
+      [0.0 - ih/th]         size as the window; or
+
+      [gx/tw - (gx+gw)/tw]  If you want to display a quad that is the same
+      [gy/th - (gy+gh)/th]  size as the loaded image file.
+
+   Writes to stderr and returns False on error.
  */
  */
-XImage * screen_to_ximage (Screen *screen, Window window,
-                           char **filename_return);
+Bool screen_to_texture (Screen *screen, Window window,
+                        int desired_width, int desired_height,
+                        Bool mipmap_p,
+                        char **filename_return,
+                        XRectangle *geometry_return,
+                        int *image_width_return,
+                        int *image_height_return,
+                        int *texture_width_return,
+                        int *texture_height_return);
+
+
+/* Like the above, but the image is loaded in a background process,
+   and a callback is run when the loading is complete.
+   When the callback is called, the image data will have been loaded
+   into texture number `texid' (via glBindTexture.)
 
 
-/* Like the above, but loads the image in the background and runs the
-   given callback once it has been loaded.
+   If an error occurred, width/height will be 0.
  */
  */
-void fork_screen_to_ximage (Screen *screen, Window window,
-                            void (*callback) (Screen *, Window, XImage *,
-                                              const char *filename,
-                                              void *closure,
-                                              double cvt_time),
-                            void *closure);
+void screen_to_texture_async (Screen *screen, Window window,
+                              int desired_width, int desired_height,
+                              Bool mipmap_p,
+                              GLuint texid,
+                              void (*callback) (const char *filename,
+                                                XRectangle *geometry,
+                                                int image_width,
+                                                int image_height,
+                                                int texture_width,
+                                                int texture_height,
+                                                void *closure),
+                              void *closure);
 
 #endif /* __GRAB_XIMAGE_H__ */
 
 #endif /* __GRAB_XIMAGE_H__ */
index f2e5710c4ca6c805da1c4d3480dd584ee3ec2107..d95fea3f9b25ec5dac837e576a55190c71817278 100644 (file)
@@ -931,17 +931,25 @@ Bool jigglypuff_handle_event(ModeInfo *mi, XEvent *event)
     jigglystruct *js = &jss[MI_SCREEN(mi)];
     
     if(event->xany.type == ButtonPress &&
     jigglystruct *js = &jss[MI_SCREEN(mi)];
     
     if(event->xany.type == ButtonPress &&
-       event->xbutton.button & Button1) {
+       event->xbutton.button == Button1) {
        js->button_down = 1;
        gltrackball_start(js->trackball, event->xbutton.x, event->xbutton.y,
                          MI_WIDTH(mi), MI_HEIGHT(mi));
        return True;
     }
     else if(event->xany.type == ButtonRelease &&
        js->button_down = 1;
        gltrackball_start(js->trackball, event->xbutton.x, event->xbutton.y,
                          MI_WIDTH(mi), MI_HEIGHT(mi));
        return True;
     }
     else if(event->xany.type == ButtonRelease &&
-           event->xbutton.button & Button1) {
+           event->xbutton.button == Button1) {
        js->button_down = 0;
        return True;
     }
        js->button_down = 0;
        return True;
     }
+  else if (event->xany.type == ButtonPress &&
+           (event->xbutton.button == Button4 ||
+            event->xbutton.button == Button5))
+    {
+      gltrackball_mousewheel (js->trackball, event->xbutton.button, 10,
+                              !!event->xbutton.state);
+      return True;
+    }
     else if(event->xany.type == MotionNotify && js->button_down) {
        gltrackball_track(js->trackball, event->xmotion.x, event->xmotion.y,
                          MI_WIDTH(mi), MI_HEIGHT(mi));
     else if(event->xany.type == MotionNotify && js->button_down) {
        gltrackball_track(js->trackball, event->xmotion.x, event->xmotion.y,
                          MI_WIDTH(mi), MI_HEIGHT(mi));
index 2f3e7e74d9915c92512fb5bcf5c818927436a997..07e6f7ced7439b86081f2a4a63b64bbf53474813 100644 (file)
@@ -300,14 +300,20 @@ klein_handle_event (ModeInfo *mi, XEvent *event)
 {
        kleinstruct *kp = &klein[MI_SCREEN(mi)];
 
 {
        kleinstruct *kp = &klein[MI_SCREEN(mi)];
 
-       if (event->xany.type == ButtonPress && event->xbutton.button & Button1) {
+       if (event->xany.type == ButtonPress && event->xbutton.button == Button1) {
                        kp->button_down_p = True;
                        gltrackball_start (kp->trackball, event->xbutton.x, event->xbutton.y, MI_WIDTH (mi), MI_HEIGHT (mi));
                        return True;
                        kp->button_down_p = True;
                        gltrackball_start (kp->trackball, event->xbutton.x, event->xbutton.y, MI_WIDTH (mi), MI_HEIGHT (mi));
                        return True;
-       } else if (event->xany.type == ButtonRelease && event->xbutton.button & Button1) {
+       } else if (event->xany.type == ButtonRelease && event->xbutton.button == Button1) {
                        kp->button_down_p = False;
                        return True;
                        kp->button_down_p = False;
                        return True;
-       } else if (event->xany.type == MotionNotify && kp->button_down_p) {
+       } else if (event->xany.type == ButtonPress &&
+               (event->xbutton.button == Button4 ||
+                event->xbutton.button == Button5)) {
+      gltrackball_mousewheel (kp->trackball, event->xbutton.button, 10,
+                              !!event->xbutton.state);
+      return True;
+    } else if (event->xany.type == MotionNotify && kp->button_down_p) {
                        gltrackball_track (kp->trackball, event->xmotion.x, event->xmotion.y, MI_WIDTH (mi), MI_HEIGHT (mi));
                        return True;
        }
                        gltrackball_track (kp->trackball, event->xmotion.x, event->xmotion.y, MI_WIDTH (mi), MI_HEIGHT (mi));
                        return True;
        }
index fecf80982457d88df0b0b3d26a2d3ee8b05e7365..235c2ca942380453537c26f5f5dc7d88c3cca093 100644 (file)
@@ -103,6 +103,7 @@ static argtype vars[] = {
 
 ModeSpecOpt lament_opts = {countof(opts), opts, countof(vars), vars, NULL};
 
 
 ModeSpecOpt lament_opts = {countof(opts), opts, countof(vars), vars, NULL};
 
+#include "normals.h"
 #include "xpm-ximage.h"
 #include "rotator.h"
 #include "gltrackball.h"
 #include "xpm-ximage.h"
 #include "rotator.h"
 #include "gltrackball.h"
@@ -190,84 +191,6 @@ parse_image_data(ModeInfo *mi)
                               lament_faces);
 }
 
                               lament_faces);
 }
 
-\f
-typedef struct {
-  double x,y,z;
-} XYZ;
-
-static void
-normalize (XYZ *p)
-{
-  double length;
-  length = sqrt (p->x * p->x +
-                 p->y * p->y +
-                 p->z * p->z);
-  if (length != 0)
-    {
-      p->x /= length;
-      p->y /= length;
-      p->z /= length;
-    }
-  else
-    {
-      p->x = 0;
-      p->y = 0;
-      p->z = 0;
-    }
-}
-
-/* Calculate the unit normal at p given two other points p1,p2 on the
-   surface. The normal points in the direction of p1 crossproduct p2
- */
-static XYZ
-calc_normal (XYZ p, XYZ p1, XYZ p2)
-{
-  XYZ n, pa, pb;
-  pa.x = p1.x - p.x;
-  pa.y = p1.y - p.y;
-  pa.z = p1.z - p.z;
-  pb.x = p2.x - p.x;
-  pb.y = p2.y - p.y;
-  pb.z = p2.z - p.z;
-  n.x = pa.y * pb.z - pa.z * pb.y;
-  n.y = pa.z * pb.x - pa.x * pb.z;
-  n.z = pa.x * pb.y - pa.y * pb.x;
-  normalize (&n);
-  return (n);
-}
-
-
-static void
-do_normal(GLfloat x1, GLfloat y1, GLfloat z1,
-         GLfloat x2, GLfloat y2, GLfloat z2,
-         GLfloat x3, GLfloat y3, GLfloat z3)
-{
-  XYZ p1, p2, p3, p;
-  p1.x = x1; p1.y = y1; p1.z = z1;
-  p2.x = x2; p2.y = y2; p2.z = z2;
-  p3.x = x3; p3.y = y3; p3.z = z3;
-
-  p = calc_normal (p1, p2, p3);
-
-  glNormal3f (p.x, p.y, p.z);
-
-#ifdef DEBUG
-  /* Draw a line in the direction of this face's normal. */
-  {
-    glPushMatrix();
-    glTranslatef ((x1 + x2 + x3) / 3,
-                  (y1 + y2 + y3) / 3,
-                  (z1 + z2 + z3) / 3);
-    glScalef (0.5, 0.5, 0.5);
-    glBegin(GL_LINE_LOOP);
-    glVertex3f(0, 0, 0);
-    glVertex3f(p.x, p.y, p.z);
-    glEnd();
-    glPopMatrix();
-  }
-#endif /* DEBUG */
-}
-
 \f
 /* Shorthand utilities for making faces, with proper normals.
  */
 \f
 /* Shorthand utilities for making faces, with proper normals.
  */
@@ -1397,7 +1320,7 @@ lament_handle_event (ModeInfo *mi, XEvent *event)
   lament_configuration *lc = &lcs[MI_SCREEN(mi)];
 
   if (event->xany.type == ButtonPress &&
   lament_configuration *lc = &lcs[MI_SCREEN(mi)];
 
   if (event->xany.type == ButtonPress &&
-      event->xbutton.button & Button1)
+      event->xbutton.button == Button1)
     {
       lc->button_down_p = True;
       gltrackball_start (lc->trackball,
     {
       lc->button_down_p = True;
       gltrackball_start (lc->trackball,
@@ -1406,11 +1329,19 @@ lament_handle_event (ModeInfo *mi, XEvent *event)
       return True;
     }
   else if (event->xany.type == ButtonRelease &&
       return True;
     }
   else if (event->xany.type == ButtonRelease &&
-           event->xbutton.button & Button1)
+           event->xbutton.button == Button1)
     {
       lc->button_down_p = False;
       return True;
     }
     {
       lc->button_down_p = False;
       return True;
     }
+  else if (event->xany.type == ButtonPress &&
+           (event->xbutton.button == Button4 ||
+            event->xbutton.button == Button5))
+    {
+      gltrackball_mousewheel (lc->trackball, event->xbutton.button, 5,
+                              !!event->xbutton.state);
+      return True;
+    }
   else if (event->xany.type == MotionNotify &&
            lc->button_down_p)
     {
   else if (event->xany.type == MotionNotify &&
            lc->button_down_p)
     {
index c544e72cd18c0a39fbc2115bd2fa39df05080c67..c97c7929b4ae49febddcb3ddceb3990d4f2b577d 100644 (file)
@@ -1267,7 +1267,7 @@ lavalite_handle_event (ModeInfo *mi, XEvent *event)
   lavalite_configuration *bp = &bps[MI_SCREEN(mi)];
 
   if (event->xany.type == ButtonPress &&
   lavalite_configuration *bp = &bps[MI_SCREEN(mi)];
 
   if (event->xany.type == ButtonPress &&
-      event->xbutton.button & Button1)
+      event->xbutton.button == Button1)
     {
       bp->button_down_p = True;
       gltrackball_start (bp->trackball,
     {
       bp->button_down_p = True;
       gltrackball_start (bp->trackball,
@@ -1276,11 +1276,19 @@ lavalite_handle_event (ModeInfo *mi, XEvent *event)
       return True;
     }
   else if (event->xany.type == ButtonRelease &&
       return True;
     }
   else if (event->xany.type == ButtonRelease &&
-           event->xbutton.button & Button1)
+           event->xbutton.button == Button1)
     {
       bp->button_down_p = False;
       return True;
     }
     {
       bp->button_down_p = False;
       return True;
     }
+  else if (event->xany.type == ButtonPress &&
+           (event->xbutton.button == Button4 ||
+            event->xbutton.button == Button5))
+    {
+      gltrackball_mousewheel (bp->trackball, event->xbutton.button, 5,
+                              !!event->xbutton.state);
+      return True;
+    }
   else if (event->xany.type == MotionNotify &&
            bp->button_down_p)
     {
   else if (event->xany.type == MotionNotify &&
            bp->button_down_p)
     {
@@ -1298,7 +1306,7 @@ static void
 parse_color (ModeInfo *mi, const char *name, const char *s, GLfloat *a)
 {
   XColor c;
 parse_color (ModeInfo *mi, const char *name, const char *s, GLfloat *a)
 {
   XColor c;
-  a[4] = 1.0;  /* alpha */
+  a[3] = 1.0;  /* alpha */
 
   if (! XParseColor (MI_DISPLAY(mi), MI_COLORMAP(mi), s, &c))
     {
 
   if (! XParseColor (MI_DISPLAY(mi), MI_COLORMAP(mi), s, &c))
     {
index a4cafb4860c43745865865beee252205adc10476..ee5e81e245eb3b00d296d7854da7eee5dbce7349 100644 (file)
 #include <stdlib.h>
 #include <stdio.h>
 #include <math.h>
 #include <stdlib.h>
 #include <stdio.h>
 #include <math.h>
+#include <GL/gl.h>
 #include "marching.h"
 #include "marching.h"
+#include "normals.h"
 
 extern char *progname;
 
 #undef ABS
 #define ABS(x) ((x)<0?(-(x)):(x))
 
 
 extern char *progname;
 
 #undef ABS
 #define ABS(x) ((x)<0?(-(x)):(x))
 
-typedef struct {
-   double x,y,z;
-} XYZ;
-
 typedef struct {
    XYZ p[3];
 } TRIANGLE;
 typedef struct {
    XYZ p[3];
 } TRIANGLE;
@@ -463,47 +461,6 @@ march_one_cube (GRIDCELL grid, double isolevel, TRIANGLE *triangles)
 /* Walking the grid.  By jwz.
  */
 
 /* Walking the grid.  By jwz.
  */
 
-#include <GL/gl.h>
-
-/* Normalise a vector */
-static void
-normalize (XYZ *p)
-{
-  double length;
-  length = sqrt(p->x * p->x + p->y * p->y + p->z * p->z);
-  if (length != 0) {
-    p->x /= length;
-    p->y /= length;
-    p->z /= length;
-  } else {
-    p->x = 0;
-    p->y = 0;
-    p->z = 0;
-  }       
-}
-
-
-/* Calculate the unit normal at p given two other points 
-   p1,p2 on the surface. The normal points in the direction 
-   of p1 crossproduct p2
- */
-static void
-do_plane_normal (XYZ p, XYZ p1, XYZ p2)
-{
-  XYZ n, pa, pb;
-  pa.x = p1.x - p.x;
-  pa.y = p1.y - p.y;
-  pa.z = p1.z - p.z;
-  pb.x = p2.x - p.x;
-  pb.y = p2.y - p.y;
-  pb.z = p2.z - p.z;
-  n.x = pa.y * pb.z - pa.z * pb.y;
-  n.y = pa.z * pb.x - pa.x * pb.z;
-  n.z = pa.x * pb.y - pa.y * pb.x;
-  normalize (&n);
-  glNormal3f (n.x, n.y, n.z);
-}
-
 
 /* Computes the normal of the scalar field at the given point,
    for vertex normals (as opposed to face normals.)
 
 /* Computes the normal of the scalar field at the given point,
    for vertex normals (as opposed to face normals.)
@@ -519,7 +476,7 @@ do_function_normal (double x, double y, double z,
   n.x = compute_fn (x-off, y, z, c) - compute_fn (x+off, y, z, c);
   n.y = compute_fn (x, y-off, z, c) - compute_fn (x, y+off, z, c);
   n.z = compute_fn (x, y, z-off, c) - compute_fn (x, y, z+off, c);
   n.x = compute_fn (x-off, y, z, c) - compute_fn (x+off, y, z, c);
   n.y = compute_fn (x, y-off, z, c) - compute_fn (x, y+off, z, c);
   n.z = compute_fn (x, y, z-off, c) - compute_fn (x, y, z+off, c);
-  normalize (&n);
+  /* normalize (&n); */
   glNormal3f (n.x, n.y, n.z);
 }
 
   glNormal3f (n.x, n.y, n.z);
 }
 
@@ -642,7 +599,9 @@ marching_cubes (int grid_size,     /* density of the mesh */
                    this triangle.
                  */
                 if (!smooth_p)
                    this triangle.
                  */
                 if (!smooth_p)
-                  do_plane_normal (tri[i].p[0], tri[i].p[1], tri[i].p[2]);
+                  do_normal (tri[i].p[0].x, tri[i].p[0].y, tri[i].p[0].z,
+                             tri[i].p[1].x, tri[i].p[1].y, tri[i].p[1].z,
+                             tri[i].p[2].x, tri[i].p[2].y, tri[i].p[2].z);
 
 # define VERT(X,Y,Z) \
                 if (smooth_p) \
 
 # define VERT(X,Y,Z) \
                 if (smooth_p) \
index f7166493d3c366904560a7e9ec587c52ec09e08a..0f492641f0b3f42a4b53392a1fa2410f480d8a6d 100644 (file)
@@ -359,7 +359,7 @@ sponge_handle_event (ModeInfo *mi, XEvent *event)
   sponge_configuration *sp = &sps[MI_SCREEN(mi)];
 
   if (event->xany.type == ButtonPress &&
   sponge_configuration *sp = &sps[MI_SCREEN(mi)];
 
   if (event->xany.type == ButtonPress &&
-      event->xbutton.button & Button1)
+      event->xbutton.button == Button1)
     {
       sp->button_down_p = True;
       gltrackball_start (sp->trackball,
     {
       sp->button_down_p = True;
       gltrackball_start (sp->trackball,
@@ -368,11 +368,19 @@ sponge_handle_event (ModeInfo *mi, XEvent *event)
       return True;
     }
   else if (event->xany.type == ButtonRelease &&
       return True;
     }
   else if (event->xany.type == ButtonRelease &&
-           event->xbutton.button & Button1)
+           event->xbutton.button == Button1)
     {
       sp->button_down_p = False;
       return True;
     }
     {
       sp->button_down_p = False;
       return True;
     }
+  else if (event->xany.type == ButtonPress &&
+           (event->xbutton.button == Button4 ||
+            event->xbutton.button == Button5))
+    {
+      gltrackball_mousewheel (sp->trackball, event->xbutton.button, 5,
+                              !!event->xbutton.state);
+      return True;
+    }
   else if (event->xany.type == MotionNotify &&
            sp->button_down_p)
     {
   else if (event->xany.type == MotionNotify &&
            sp->button_down_p)
     {
index 61250cc03be64bbb5cf3fa90ebb9a6571d88b52c..6c721c2a0d5bcdc99c01f9c5c1859dbf15a37383 100644 (file)
@@ -19,7 +19,7 @@
  * 10-Feb-2004:  jon.dowdall@bigpond.com  Added motion blur
  *
  * The mirrorblob screensaver draws a pulsing blob on the screen.  Options
  * 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,
+ * include adding a background (via screen_to_texture), texturing the blob,
  * making the blob semi-transparent and varying the resolution of the blob
  * tessellation.
  *
  * making the blob semi-transparent and varying the resolution of the blob
  * tessellation.
  *
@@ -80,7 +80,8 @@
     "*motion_blur:       " DEF_MOTION_BLUR          "\n" \
     "*incremental:       " DEF_INCREMENTAL          "\n" \
     "*hold_time:         " DEF_HOLD_TIME            "\n" \
     "*motion_blur:       " DEF_MOTION_BLUR          "\n" \
     "*incremental:       " DEF_INCREMENTAL          "\n" \
     "*hold_time:         " DEF_HOLD_TIME            "\n" \
-    "*fade_time:         " DEF_FADE_TIME            "\n"
+    "*fade_time:         " DEF_FADE_TIME            "\n" \
+    "*useSHM:              True                      \n"
 
 # include "xlockmore.h"    /* from the xscreensaver distribution */
 #else /* !STANDALONE */
 
 # include "xlockmore.h"    /* from the xscreensaver distribution */
 #else /* !STANDALONE */
@@ -336,35 +337,30 @@ reset_projection(int width, int height)
 
 /****************************************************************************
  *
 
 /****************************************************************************
  *
- * Load a texture using the screen_to_ximage function.
+ * Load a texture using the screen_to_texture function.
  */
 void
 grab_texture(ModeInfo *mi, int texture_index)
 {
  */
 void
 grab_texture(ModeInfo *mi, int texture_index)
 {
-    XImage *ximage;
-
-    ximage = screen_to_ximage (mi->xgwa.screen, mi->window, 0);
+    Bool mipmap_p = True;
+    int iw, ih, tw, th;
 
     glBindTexture (GL_TEXTURE_2D, textures[texture_index]);
 
     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);
+    if (! screen_to_texture (mi->xgwa.screen, mi->window, 0, 0, mipmap_p,
+                             NULL, NULL, &iw, &ih, &tw, &th))
+      exit(1);
 
 
-    tex_width[texture_index] = (mi->xgwa.width - 1) / (GLfloat)ximage->width;
-    tex_height[texture_index] = (mi->xgwa.height - 1)  / (GLfloat)ximage->height;
+    tex_width [texture_index] =  (GLfloat) iw / tw;
+    tex_height[texture_index] = -(GLfloat) ih / th;
 
 
-    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_MAG_FILTER, GL_LINEAR);
+    glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
+                     (mipmap_p ? GL_LINEAR_MIPMAP_LINEAR : 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);
-
-    free(ximage->data);
-    ximage->data = 0;
-    XDestroyImage (ximage);
+    glTexEnvf (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
 }
 
 /******************************************************************************
 }
 
 /******************************************************************************
@@ -1109,16 +1105,16 @@ draw_background (ModeInfo *mi)
 
     glBegin (GL_QUADS);
     
 
     glBegin (GL_QUADS);
     
-    glTexCoord2f (0.0, tex_height[current_texture]);
+    glTexCoord2f (0.0, 0.0);
     glVertex2i (0, 0);
     
     glVertex2i (0, 0);
     
-    glTexCoord2f (0.0, 0.0);
+    glTexCoord2f (0.0, -tex_height[current_texture]);
     glVertex2i (0, MI_HEIGHT(mi));
 
     glVertex2i (0, MI_HEIGHT(mi));
 
-    glTexCoord2f (tex_width[current_texture], 0.0);
+    glTexCoord2f (tex_width[current_texture], -tex_height[current_texture]);
     glVertex2i (MI_WIDTH(mi), MI_HEIGHT(mi));
 
     glVertex2i (MI_WIDTH(mi), MI_HEIGHT(mi));
 
-    glTexCoord2f (tex_width[current_texture], tex_height[current_texture]);
+    glTexCoord2f (tex_width[current_texture], 0.0);
     glVertex2i (MI_WIDTH(mi), 0);
     glEnd();
 
     glVertex2i (MI_WIDTH(mi), 0);
     glEnd();
 
index 9052f4bcc6c3e83ff08af3e20484ae960bd5ad5e..d05e8c65e3149167c41c11316eff4e921f518e34 100644 (file)
@@ -643,7 +643,7 @@ moebius_handle_event (ModeInfo *mi, XEvent *event)
   moebiusstruct *mp = &moebius[MI_SCREEN(mi)];
 
   if (event->xany.type == ButtonPress &&
   moebiusstruct *mp = &moebius[MI_SCREEN(mi)];
 
   if (event->xany.type == ButtonPress &&
-      event->xbutton.button & Button1)
+      event->xbutton.button == Button1)
     {
       mp->button_down_p = True;
       gltrackball_start (mp->trackball,
     {
       mp->button_down_p = True;
       gltrackball_start (mp->trackball,
@@ -652,11 +652,19 @@ moebius_handle_event (ModeInfo *mi, XEvent *event)
       return True;
     }
   else if (event->xany.type == ButtonRelease &&
       return True;
     }
   else if (event->xany.type == ButtonRelease &&
-           event->xbutton.button & Button1)
+           event->xbutton.button == Button1)
     {
       mp->button_down_p = False;
       return True;
     }
     {
       mp->button_down_p = False;
       return True;
     }
+  else if (event->xany.type == ButtonPress &&
+           (event->xbutton.button == Button4 ||
+            event->xbutton.button == Button5))
+    {
+      gltrackball_mousewheel (mp->trackball, event->xbutton.button, 10,
+                              !!event->xbutton.state);
+      return True;
+    }
   else if (event->xany.type == MotionNotify &&
            mp->button_down_p)
     {
   else if (event->xany.type == MotionNotify &&
            mp->button_down_p)
     {
index 734fdd67e0b7abadba6137adc859573119f304a0..4b99e09290e58284c42b7add5dcf2d761900d46e 100644 (file)
@@ -68,6 +68,7 @@
 #include "colors.h"
 #include "sphere.h"
 #include "tube.h"
 #include "colors.h"
 #include "sphere.h"
 #include "tube.h"
+#include "glxfonts.h"
 #include "rotator.h"
 #include "gltrackball.h"
 
 #include "rotator.h"
 #include "gltrackball.h"
 
@@ -249,55 +250,12 @@ sphere (GLfloat x, GLfloat y, GLfloat z, GLfloat diameter, Bool wire)
 }
 
 
 }
 
 
-static void
-load_font (ModeInfo *mi, char *res, XFontStruct **fontP, GLuint *dlistP)
-{
-  const char *font = get_string_resource (res, "Font");
-  XFontStruct *f;
-  Font id;
-  int first, last;
-
-  if (!font) font = "-*-times-bold-r-normal-*-180-*";
-
-  f = XLoadQueryFont(mi->dpy, font);
-  if (!f) f = XLoadQueryFont(mi->dpy, "fixed");
-
-  id = f->fid;
-  first = f->min_char_or_byte2;
-  last = f->max_char_or_byte2;
-  
-  clear_gl_error ();
-  *dlistP = glGenLists ((GLuint) last+1);
-  check_gl_error ("glGenLists");
-  glXUseXFont(id, first, last-first+1, *dlistP + first);
-  check_gl_error ("glXUseXFont");
-
-  *fontP = f;
-}
-
-
 static void
 load_fonts (ModeInfo *mi)
 {
   molecule_configuration *mc = &mcs[MI_SCREEN(mi)];
 static void
 load_fonts (ModeInfo *mi)
 {
   molecule_configuration *mc = &mcs[MI_SCREEN(mi)];
-  load_font (mi, "atomFont",  &mc->xfont1, &mc->font1_dlist);
-  load_font (mi, "titleFont", &mc->xfont2, &mc->font2_dlist);
-}
-
-
-static int
-string_width (XFontStruct *f, const char *c)
-{
-  int w = 0;
-  while (*c)
-    {
-      int cc = *((unsigned char *) c);
-      w += (f->per_char
-            ? f->per_char[cc-f->min_char_or_byte2].rbearing
-            : f->min_bounds.rbearing);
-      c++;
-    }
-  return w;
+  load_font (mi->dpy, "atomFont",  &mc->xfont1, &mc->font1_dlist);
+  load_font (mi->dpy, "titleFont", &mc->xfont2, &mc->font2_dlist);
 }
 
 
 }
 
 
@@ -559,76 +517,6 @@ ensure_bounding_box_visible (ModeInfo *mi)
 }
 
 
 }
 
 
-static void
-print_title_string (ModeInfo *mi, const char *string,
-                    GLfloat x, GLfloat y, XFontStruct *font)
-{
-  molecule_configuration *mc = &mcs[MI_SCREEN(mi)];
-  GLfloat line_height = font->ascent + font->descent;
-  GLfloat sub_shift = (line_height * 0.3);
-
-  y -= line_height;
-
-  glPushAttrib (GL_TRANSFORM_BIT |  /* for matrix contents */
-                GL_ENABLE_BIT);     /* for various glDisable calls */
-  glDisable (GL_LIGHTING);
-  glDisable (GL_DEPTH_TEST);
-  {
-    glMatrixMode(GL_PROJECTION);
-    glPushMatrix();
-    {
-      glLoadIdentity();
-
-      glMatrixMode(GL_MODELVIEW);
-      glPushMatrix();
-      {
-        int i;
-        int x2 = x;
-        Bool sub_p = False;
-        glLoadIdentity();
-
-        gluOrtho2D (0, mi->xgwa.width, 0, mi->xgwa.height);
-
-        set_atom_color (mi, 0, True);
-
-        glRasterPos2f (x, y);
-        for (i = 0; i < strlen(string); i++)
-          {
-            char c = string[i];
-            if (c == '\n')
-              {
-                glRasterPos2f (x, (y -= line_height));
-                x2 = x;
-              }
-            else if (c == '(' && (isdigit (string[i+1])))
-              {
-                sub_p = True;
-                glRasterPos2f (x2, (y -= sub_shift));
-              }
-            else if (c == ')' && sub_p)
-              {
-                sub_p = False;
-                glRasterPos2f (x2, (y += sub_shift));
-              }
-            else
-              {
-                glCallList (mc->font2_dlist + (int)(c));
-                x2 += (font->per_char
-                       ? font->per_char[c - font->min_char_or_byte2].width
-                       : font->min_bounds.width);
-              }
-          }
-      }
-      glPopMatrix();
-    }
-    glMatrixMode(GL_PROJECTION);
-    glPopMatrix();
-  }
-  glPopAttrib();
-
-  glMatrixMode(GL_MODELVIEW);
-}
-
 
 /* Constructs the GL shapes of the current molecule
  */
 
 /* Constructs the GL shapes of the current molecule
  */
@@ -710,9 +598,13 @@ build_molecule (ModeInfo *mi)
     draw_bounding_box (mi);
 
   if (do_titles && m->label && *m->label)
     draw_bounding_box (mi);
 
   if (do_titles && m->label && *m->label)
-    print_title_string (mi, m->label,
-                        10, mi->xgwa.height - 10,
-                        mc->xfont2);
+    {
+      set_atom_color (mi, 0, True);
+      print_gl_string (mi->dpy, mc->xfont2, mc->font2_dlist,
+                       mi->xgwa.width, mi->xgwa.height,
+                       10, mi->xgwa.height - 10,
+                       m->label);
+    }
 }
 
 
 }
 
 
@@ -1038,7 +930,7 @@ generate_molecule_formula (molecule *m)
       free (counts[i].atom);
       s += strlen (s);
       if (counts[i].count > 1)
       free (counts[i].atom);
       s += strlen (s);
       if (counts[i].count > 1)
-        sprintf (s, "(%d)", counts[i].count);
+        sprintf (s, "[%d]", counts[i].count);  /* use [] to get subscripts */
       s += strlen (s);
       i++;
     }
       s += strlen (s);
       i++;
     }
@@ -1274,10 +1166,10 @@ startup_blurb (ModeInfo *mi)
 {
   molecule_configuration *mc = &mcs[MI_SCREEN(mi)];
   const char *s = "Constructing molecules...";
 {
   molecule_configuration *mc = &mcs[MI_SCREEN(mi)];
   const char *s = "Constructing molecules...";
-  print_title_string (mi, s,
-                      mi->xgwa.width - (string_width (mc->xfont2, s) + 40),
-                      10 + mc->xfont2->ascent + mc->xfont2->descent,
-                      mc->xfont2);
+  print_gl_string (mi->dpy, mc->xfont2, mc->font2_dlist,
+                   mi->xgwa.width, mi->xgwa.height,
+                   10, mi->xgwa.height - 10,
+                   s);
   glFinish();
   glXSwapBuffers(MI_DISPLAY(mi), MI_WINDOW(mi));
 }
   glFinish();
   glXSwapBuffers(MI_DISPLAY(mi), MI_WINDOW(mi));
 }
@@ -1288,7 +1180,7 @@ molecule_handle_event (ModeInfo *mi, XEvent *event)
   molecule_configuration *mc = &mcs[MI_SCREEN(mi)];
 
   if (event->xany.type == ButtonPress &&
   molecule_configuration *mc = &mcs[MI_SCREEN(mi)];
 
   if (event->xany.type == ButtonPress &&
-      event->xbutton.button & Button1)
+      event->xbutton.button == Button1)
     {
       mc->button_down_p = True;
       gltrackball_start (mc->trackball,
     {
       mc->button_down_p = True;
       gltrackball_start (mc->trackball,
@@ -1297,11 +1189,33 @@ molecule_handle_event (ModeInfo *mi, XEvent *event)
       return True;
     }
   else if (event->xany.type == ButtonRelease &&
       return True;
     }
   else if (event->xany.type == ButtonRelease &&
-           event->xbutton.button & Button1)
+           event->xbutton.button == Button1)
     {
       mc->button_down_p = False;
       return True;
     }
     {
       mc->button_down_p = False;
       return True;
     }
+  else if (event->xany.type == ButtonPress &&
+           (event->xbutton.button == Button4 ||
+            event->xbutton.button == Button5))
+    {
+      gltrackball_mousewheel (mc->trackball, event->xbutton.button, 10,
+                              !!event->xbutton.state);
+      return True;
+    }
+  else if (event->xany.type == KeyPress)
+    {
+      KeySym keysym;
+      char c = 0;
+      XLookupString (&event->xkey, &c, 1, &keysym, 0);
+
+      if (c == ' ' || c == '\t' || c == '\r' || c == '\n')
+        {
+          GLfloat speed = 4.0;
+          mc->mode = 1;
+          mc->mode_tick = 10 * speed;
+          return True;
+        }
+    }
   else if (event->xany.type == MotionNotify &&
            mc->button_down_p)
     {
   else if (event->xany.type == MotionNotify &&
            mc->button_down_p)
     {
diff --git a/hacks/glx/normals.c b/hacks/glx/normals.c
new file mode 100644 (file)
index 0000000..ec520aa
--- /dev/null
@@ -0,0 +1,50 @@
+/* normals, Copyright (c) 2002-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.
+ *
+ * Compute normal vectors for arbitrary triangles.
+ */
+
+#include "config.h"
+#include <GL/gl.h>
+#include "normals.h"
+
+/* Calculate the unit normal at p given two other points p1,p2 on the
+   surface. The normal points in the direction of p1 crossproduct p2
+ */
+XYZ
+calc_normal (XYZ p, XYZ p1, XYZ p2)
+{
+  XYZ n, pa, pb;
+  pa.x = p1.x - p.x;
+  pa.y = p1.y - p.y;
+  pa.z = p1.z - p.z;
+  pb.x = p2.x - p.x;
+  pb.y = p2.y - p.y;
+  pb.z = p2.z - p.z;
+  n.x = pa.y * pb.z - pa.z * pb.y;
+  n.y = pa.z * pb.x - pa.x * pb.z;
+  n.z = pa.x * pb.y - pa.y * pb.x;
+  return (n);
+}
+
+/* Call glNormal3f() with a normal of the indicated triangle.
+ */
+void
+do_normal(GLfloat x1, GLfloat y1, GLfloat z1,
+          GLfloat x2, GLfloat y2, GLfloat z2,
+          GLfloat x3, GLfloat y3, GLfloat z3)
+{
+  XYZ p1, p2, p3, p;
+  p1.x = x1; p1.y = y1; p1.z = z1;
+  p2.x = x2; p2.y = y2; p2.z = z2;
+  p3.x = x3; p3.y = y3; p3.z = z3;
+  p = calc_normal (p1, p2, p3);
+  glNormal3f (p.x, p.y, p.z);
+}
diff --git a/hacks/glx/normals.h b/hacks/glx/normals.h
new file mode 100644 (file)
index 0000000..96d8b8f
--- /dev/null
@@ -0,0 +1,32 @@
+/* normals, Copyright (c) 2002-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.
+ *
+ * Compute normal vectors for arbitrary triangles.
+ */
+
+#ifndef __NORMALS_H__
+#define __NORMALS_H__
+
+typedef struct {
+  double x,y,z;
+} XYZ;
+
+/* Calculate the unit normal at p given two other points p1,p2 on the
+   surface. The normal points in the direction of p1 crossproduct p2
+ */
+extern XYZ calc_normal (XYZ p, XYZ p1, XYZ p2);
+
+/* Call glNormal3f() with a normal of the indicated triangle.
+ */
+extern void do_normal (GLfloat x1, GLfloat y1, GLfloat z1,
+                       GLfloat x2, GLfloat y2, GLfloat z2,
+                       GLfloat x3, GLfloat y3, GLfloat z3);
+
+#endif /* __NORMALS_H__ */
index 413fc1a94db290f295329a09ae61edfc045cc247..7f741e7f644aa6fbd5510c140a90c860720ce2ad 100644 (file)
@@ -44,7 +44,9 @@ extern XtAppContext app;
 #define BELLRAND(n) ((frand((n)) + frand((n)) + frand((n))) / 3)
 
 #include "xlockmore.h"
 #define BELLRAND(n) ((frand((n)) + frand((n)) + frand((n))) / 3)
 
 #include "xlockmore.h"
+#include "normals.h"
 #include "gltrackball.h"
 #include "gltrackball.h"
+#include "glxfonts.h"
 #include <ctype.h>
 
 #ifdef USE_GL /* whole file */
 #include <ctype.h>
 
 #ifdef USE_GL /* whole file */
@@ -81,6 +83,7 @@ typedef struct {
   int coax_p;                /* whether this is one of a pair of bound gears.
                                 1 for first, 2 for second. */
   double coax_thickness;     /* thickness of the other gear in the pair */
   int coax_p;                /* whether this is one of a pair of bound gears.
                                 1 for first, 2 for second. */
   double coax_thickness;     /* thickness of the other gear in the pair */
+  enum { SMALL, MEDIUM, LARGE } size;  /* Controls complexity of mesh. */
   GLfloat color[4];
   GLfloat color2[4];
 
   GLfloat color[4];
   GLfloat color2[4];
 
@@ -146,180 +149,20 @@ static argtype vars[] = {
 
 ModeSpecOpt sws_opts = {countof(opts), opts, countof(vars), vars, NULL};
 
 
 ModeSpecOpt sws_opts = {countof(opts), opts, countof(vars), vars, NULL};
 
-\f
-/* Computing normal vectors
- */
-
-typedef struct {
-  double x,y,z;
-} XYZ;
-
-/* Calculate the unit normal at p given two other points p1,p2 on the
-   surface. The normal points in the direction of p1 crossproduct p2
- */
-static XYZ
-calc_normal (XYZ p, XYZ p1, XYZ p2)
-{
-  XYZ n, pa, pb;
-  pa.x = p1.x - p.x;
-  pa.y = p1.y - p.y;
-  pa.z = p1.z - p.z;
-  pb.x = p2.x - p.x;
-  pb.y = p2.y - p.y;
-  pb.z = p2.z - p.z;
-  n.x = pa.y * pb.z - pa.z * pb.y;
-  n.y = pa.z * pb.x - pa.x * pb.z;
-  n.z = pa.x * pb.y - pa.y * pb.x;
-  return (n);
-}
-
-static void
-do_normal(GLfloat x1, GLfloat y1, GLfloat z1,
-          GLfloat x2, GLfloat y2, GLfloat z2,
-          GLfloat x3, GLfloat y3, GLfloat z3)
-{
-  XYZ p1, p2, p3, p;
-  p1.x = x1; p1.y = y1; p1.z = z1;
-  p2.x = x2; p2.y = y2; p2.z = z2;
-  p3.x = x3; p3.y = y3; p3.z = z3;
-  p = calc_normal (p1, p2, p3);
-  glNormal3f (p.x, p.y, p.z);
-}
-
 \f
 /* Font stuff
  */
 
 \f
 /* Font stuff
  */
 
-static void
-load_font (ModeInfo *mi, char *res, XFontStruct **fontP, GLuint *dlistP)
-{
-  const char *font = get_string_resource (res, "Font");
-  XFontStruct *f;
-  Font id;
-  int first, last;
-
-  if (!font) font = "-*-times-bold-r-normal-*-180-*";
-
-  f = XLoadQueryFont(mi->dpy, font);
-  if (!f) f = XLoadQueryFont(mi->dpy, "fixed");
-
-  id = f->fid;
-  first = f->min_char_or_byte2;
-  last = f->max_char_or_byte2;
-  
-  clear_gl_error ();
-  *dlistP = glGenLists ((GLuint) last+1);
-  check_gl_error ("glGenLists");
-  glXUseXFont(id, first, last-first+1, *dlistP + first);
-  check_gl_error ("glXUseXFont");
-
-  *fontP = f;
-}
-
-
 static void
 load_fonts (ModeInfo *mi)
 {
   pinion_configuration *pp = &pps[MI_SCREEN(mi)];
 static void
 load_fonts (ModeInfo *mi)
 {
   pinion_configuration *pp = &pps[MI_SCREEN(mi)];
-  load_font (mi, "titleFont",  &pp->xfont1, &pp->font1_dlist);
-  load_font (mi, "titleFont2", &pp->xfont2, &pp->font2_dlist);
-  load_font (mi, "titleFont3", &pp->xfont3, &pp->font3_dlist);
+  load_font (mi->dpy, "titleFont",  &pp->xfont1, &pp->font1_dlist);
+  load_font (mi->dpy, "titleFont2", &pp->xfont2, &pp->font2_dlist);
+  load_font (mi->dpy, "titleFont3", &pp->xfont3, &pp->font3_dlist);
 }
 
 
 }
 
 
-static int
-string_width (XFontStruct *f, const char *c)
-{
-  int w = 0;
-  while (*c)
-    {
-      int cc = *((unsigned char *) c);
-      w += (f->per_char
-            ? f->per_char[cc-f->min_char_or_byte2].rbearing
-            : f->min_bounds.rbearing);
-      c++;
-    }
-  return w;
-}
-
-static void
-print_title_string (ModeInfo *mi, const char *string,
-                    GLfloat x, GLfloat y,
-                    XFontStruct *font, int font_dlist)
-{
-  GLfloat line_height = font->ascent + font->descent;
-  GLfloat sub_shift = (line_height * 0.3);
-  int cw = string_width (font, "m");
-  int tabs = cw * 7;
-
-  y -= line_height;
-
-  glPushAttrib (GL_TRANSFORM_BIT |  /* for matrix contents */
-                GL_ENABLE_BIT);     /* for various glDisable calls */
-  glDisable (GL_LIGHTING);
-  glDisable (GL_DEPTH_TEST);
-  {
-    glMatrixMode(GL_PROJECTION);
-    glPushMatrix();
-    {
-      glLoadIdentity();
-
-      glMatrixMode(GL_MODELVIEW);
-      glPushMatrix();
-      {
-        int i;
-        int x2 = x;
-        Bool sub_p = False;
-        glLoadIdentity();
-
-        gluOrtho2D (0, mi->xgwa.width, 0, mi->xgwa.height);
-
-        glColor3f (0.8, 0.8, 0);
-
-        glRasterPos2f (x, y);
-        for (i = 0; i < strlen(string); i++)
-          {
-            char c = string[i];
-            if (c == '\n')
-              {
-                glRasterPos2f (x, (y -= line_height));
-                x2 = x;
-              }
-            else if (c == '\t')
-              {
-                x2 -= x;
-                x2 = ((x2 + tabs) / tabs) * tabs;  /* tab to tab stop */
-                x2 += x;
-                glRasterPos2f (x2, y);
-              }
-            else if (c == '[' && (isdigit (string[i+1])))
-              {
-                sub_p = True;
-                glRasterPos2f (x2, (y -= sub_shift));
-              }
-            else if (c == ']' && sub_p)
-              {
-                sub_p = False;
-                glRasterPos2f (x2, (y += sub_shift));
-              }
-            else
-              {
-                glCallList (font_dlist + (int)(c));
-                x2 += (font->per_char
-                       ? font->per_char[c - font->min_char_or_byte2].width
-                       : font->min_bounds.width);
-              }
-          }
-      }
-      glPopMatrix();
-    }
-    glMatrixMode(GL_PROJECTION);
-    glPopMatrix();
-  }
-  glPopAttrib();
-
-  glMatrixMode(GL_MODELVIEW);
-}
 
 static void rpm_string (double rpm, char *s);
 
 
 static void rpm_string (double rpm, char *s);
 
@@ -345,6 +188,12 @@ new_label (ModeInfo *mi)
     {
       sprintf (label, "%d teeth\n", g->nteeth);
       rpm_string (g->rpm, label + strlen(label));
     {
       sprintf (label, "%d teeth\n", g->nteeth);
       rpm_string (g->rpm, label + strlen(label));
+      if (debug_p)
+        sprintf (label + strlen (label), "\nPolys:  %d\nModel:  %s  (%.2f)\n",
+                 g->polygons,
+                 (g->size == SMALL ? "small" : g->size == MEDIUM ? "medium"
+                  : "large"),
+                 g->tooth_h * MI_HEIGHT(mi));
     }
 
   glNewList (pp->title_list, GL_COMPILE);
     }
 
   glNewList (pp->title_list, GL_COMPILE);
@@ -359,9 +208,11 @@ new_label (ModeInfo *mi)
       else
         f = pp->xfont3, fl = pp->font3_dlist;                  /* tiny font */
 
       else
         f = pp->xfont3, fl = pp->font3_dlist;                  /* tiny font */
 
-      print_title_string (mi, label,
-                          10, mi->xgwa.height - 10,
-                          f, fl);
+      glColor3f (0.8, 0.8, 0);
+      print_gl_string (mi->dpy, f, fl,
+                       mi->xgwa.width, mi->xgwa.height,
+                       10, mi->xgwa.height - 10,
+                       label);
     }
   glEndList ();
 }
     }
   glEndList ();
 }
@@ -483,7 +334,6 @@ biggest_ring (gear *g, double *posP, double *sizeP, double *heightP)
 static gear *
 new_gear (ModeInfo *mi, gear *parent, Bool coaxial_p)
 {
 static gear *
 new_gear (ModeInfo *mi, gear *parent, Bool coaxial_p)
 {
-  /* pinion_configuration *pp = &pps[MI_SCREEN(mi)]; */
   gear *g = (gear *) calloc (1, sizeof (*g));
   int loop_count = 0;
   static unsigned long id = 0;
   gear *g = (gear *) calloc (1, sizeof (*g));
   int loop_count = 0;
   static unsigned long id = 0;
@@ -640,6 +490,15 @@ new_gear (ModeInfo *mi, gear *parent, Bool coaxial_p)
   if (g->inner_r2 > g->inner_r) abort();
   if (g->inner_r  > g->r) abort();
 
   if (g->inner_r2 > g->inner_r) abort();
   if (g->inner_r  > g->r) abort();
 
+  /* Decide how complex the polygon model should be.
+   */
+  {
+    double pix = g->tooth_h * MI_HEIGHT(mi); /* approx. tooth size in pixels */
+    if (pix <= 2.5)      g->size = SMALL;
+    else if (pix <= 3.5) g->size = MEDIUM;
+    else                 g->size = LARGE;
+  }
+
   g->base_p = !parent;
 
   return g;
   g->base_p = !parent;
 
   return g;
@@ -1212,6 +1071,7 @@ scroll_gears (ModeInfo *mi)
       else
         break;
       i++;
       else
         break;
       i++;
+      if (debug_one_gear_p) break;
     }
 
   /*
     }
 
   /*
@@ -1250,6 +1110,7 @@ static void
 ffwd (ModeInfo *mi)
 {
   pinion_configuration *pp = &pps[MI_SCREEN(mi)];
 ffwd (ModeInfo *mi)
 {
   pinion_configuration *pp = &pps[MI_SCREEN(mi)];
+  if (debug_one_gear_p) return;
   while (1)
     {
       gear *g = farthest_gear (mi, True);
   while (1)
     {
       gear *g = farthest_gear (mi, True);
@@ -1358,8 +1219,8 @@ draw_disc (ModeInfo *mi, int segments,
       if (wire_p || ra != 0)
         glVertex3f (cth * ra, sth * ra, z);
       glVertex3f (cth * rb, sth * rb, z);
       if (wire_p || ra != 0)
         glVertex3f (cth * ra, sth * ra, z);
       glVertex3f (cth * rb, sth * rb, z);
-      polys++;
     }
     }
+  polys += segments;
   glEnd();
   return polys;
 }
   glEnd();
   return polys;
 }
@@ -1489,7 +1350,7 @@ draw_gear_nubs (ModeInfo *mi, gear *g)
   Bool wire_p = MI_IS_WIREFRAME(mi);
   int polys = 0;
   int i;
   Bool wire_p = MI_IS_WIREFRAME(mi);
   int polys = 0;
   int i;
-  int steps = 20;
+  int steps = (g->size != LARGE ? 5 : 20);
   double r, size, height;
   GLfloat *cc;
   int which;
   double r, size, height;
   GLfloat *cc;
   int which;
@@ -1514,7 +1375,8 @@ draw_gear_nubs (ModeInfo *mi, gear *g)
       glTranslatef (cos(th) * r, sin(th) * r, 0);
 
       if (wire_p && !wire_all_p)
       glTranslatef (cos(th) * r, sin(th) * r, 0);
 
       if (wire_p && !wire_all_p)
-        polys += draw_ring (mi, steps/2, size, 0, 0, False);
+        polys += draw_ring (mi, (g->size == LARGE ? steps/2 : steps),
+                            size, 0, 0, False);
       else
         {
           polys += draw_disc (mi, steps, 0, size, -height, True);
       else
         {
           polys += draw_disc (mi, steps, 0, size, -height, True);
@@ -1576,7 +1438,8 @@ draw_gear_interior (ModeInfo *mi, gear *g)
 
   int steps = g->nteeth * 2;
   if (steps < 10) steps = 10;
 
   int steps = g->nteeth * 2;
   if (steps < 10) steps = 10;
-  if (wire_p && !wire_all_p) steps /= 2;
+  if ((wire_p && !wire_all_p) || g->size != LARGE) steps /= 2;
+  if (g->size != LARGE && steps > 16) steps = 16;
 
   /* ring 1 (facing in) is done in draw_gear_teeth */
 
 
   /* ring 1 (facing in) is done in draw_gear_teeth */
 
@@ -1584,8 +1447,8 @@ draw_gear_interior (ModeInfo *mi, gear *g)
    */
   if (g->inner_r2)
     {
    */
   if (g->inner_r2)
     {
-      GLfloat ra = g->inner_r;
-      GLfloat rb = g->inner_r2;
+      GLfloat ra = g->inner_r * 1.04;  /* slightly larger than inner_r */
+      GLfloat rb = g->inner_r2;        /*  since the points don't line up */
       GLfloat za = -g->thickness2/2;
       GLfloat zb =  g->thickness2/2;
 
       GLfloat za = -g->thickness2/2;
       GLfloat zb =  g->thickness2/2;
 
@@ -1659,10 +1522,10 @@ draw_gear_interior (ModeInfo *mi, gear *g)
 }
 
 
 }
 
 
-/* Computes the vertices and normals of the teeth of a gear.
-   This is the heavy lifting: there are a ton of polygons around the
-   perimiter of a gear, and the normals are difficult (not radial
-   or right angles.)
+/* gear_teeth_geometry computes the vertices and normals of the teeth
+   of a gear.  This is the heavy lifting: there are a ton of polygons
+   around the perimiter of a gear, and the normals are difficult (not
+   radial or right angles.)
 
    It would be nice if we could cache this, but the numbers are
    different for essentially every gear:
 
    It would be nice if we could cache this, but the numbers are
    different for essentially every gear:
@@ -1679,26 +1542,59 @@ draw_gear_interior (ModeInfo *mi, gear *g)
    us -- we only compute all these normals once per gear, instead of
    once per gear per frame.
  */
    us -- we only compute all these normals once per gear, instead of
    once per gear per frame.
  */
+
+typedef struct {
+  int npoints;
+  XYZ *points;
+  XYZ *fnormals;  /* face normals */
+  XYZ *pnormals;  /* point normals */
+} tooth_face;
+
+
 static void
 static void
-gear_teeth_geometry (ModeInfo *mi, gear *g,
-                     int *points_per_tooth_ret,
-                     XYZ **points_ret,
-                     XYZ **normals_ret)
+tooth_normals (tooth_face *f)
 {
   int i;
 
 {
   int i;
 
-  int ppt = 15; /* points per tooth */
+  /* Compute the face normals for each facet. */
+  for (i = 0; i < f->npoints; i++)
+    {
+      XYZ p1, p2, p3;
+      int a = i;
+      int b = (i == f->npoints-1 ? 0 : i+1);
+      p1 = f->points[a];
+      p2 = f->points[b];
+      p3 = p1;
+      p3.z++;
+      f->fnormals[i] = calc_normal (p1, p2, p3);
+    }
+
+  /* From the face normals, compute the vertex normals
+     (by averaging the normals of adjascent faces.)
+   */
+  for (i = 0; i < f->npoints; i++)
+    {
+      int a = (i == 0 ? f->npoints-1 : i-1);
+      int b = i;
+      XYZ n1 = f->fnormals[a];   /* normal of [i-1 - i] face */
+      XYZ n2 = f->fnormals[b];   /* normal of [i - i+1] face */
+      f->pnormals[i].x = (n1.x + n2.x) / 2;
+      f->pnormals[i].y = (n1.y + n2.y) / 2;
+      f->pnormals[i].z = (n1.z + n2.z) / 2;
+    }
+}
 
 
-  GLfloat width = M_PI * 2 / g->nteeth;
 
 
+static void
+gear_teeth_geometry (ModeInfo *mi, gear *g,
+                     tooth_face *orim,      /* outer rim (the teeth) */
+                     tooth_face *irim)      /* inner rim (the hole)  */
+{
+  int i;
+  int ppt = 9;   /* max points per tooth */
+  GLfloat width = M_PI * 2 / g->nteeth;
   GLfloat rh = g->tooth_h;
   GLfloat tw = width;
   GLfloat rh = g->tooth_h;
   GLfloat tw = width;
-  GLfloat fudge = (g->nteeth >= 5 ? 0 : 0.04);   /* reshape small ones a bit */
-
-  XYZ *points   = (XYZ *) calloc (ppt * g->nteeth + 1, sizeof(*points));
-  XYZ *fnormals = (XYZ *) calloc (ppt * g->nteeth + 1, sizeof(*points));
-  XYZ *pnormals = (XYZ *) calloc (ppt * g->nteeth + 1, sizeof(*points));
-  int npoints = 0;
 
   /* Approximate shape of an "involute" gear tooth.
 
 
   /* Approximate shape of an "involute" gear tooth.
 
@@ -1725,37 +1621,45 @@ gear_teeth_geometry (ModeInfo *mi, gear *g,
         r4 ......__:_____________________________:________________
    */
 
         r4 ......__:_____________________________:________________
    */
 
-  GLfloat R = g->r;
-
   GLfloat r[20];
   GLfloat th[20];
   GLfloat r[20];
   GLfloat th[20];
+  GLfloat R = g->r;
 
   r[0] = R + (rh * 0.5);
   r[1] = R + (rh * 0.25);
 
   r[0] = R + (rh * 0.5);
   r[1] = R + (rh * 0.25);
-  r[2] = R - (rh * 0.25);
-  r[3] = R - (rh * 0.5);
+  r[2] = R - (r[1]-R);
+  r[3] = R - (r[0]-R);
   r[4] = g->inner_r;
 
   r[4] = g->inner_r;
 
-  th[0] = -tw * 0.45;
+  th[0] = -tw * (g->size == SMALL ? 0.5 : g->size == MEDIUM ? 0.41 : 0.45);
   th[1] = -tw * 0.30;
   th[1] = -tw * 0.30;
-  th[2] = -tw *(0.16 - fudge);
-  th[3] = -tw * 0.04;
+  th[2] = -tw * (g->nteeth >= 5 ? 0.16 : 0.12);
+  th[3] = -tw * (g->size == MEDIUM ? 0.1 : 0.04);
   th[4] =  0;
   th[4] =  0;
-  th[5] =  tw * 0.04;
-  th[6] =  tw *(0.16 - fudge);
-  th[7] =  tw * 0.30;
-  th[8] =  tw * 0.45;
+  th[5] =  -th[3];
+  th[6] =  -th[2];
+  th[7] =  -th[1];
+  th[8] =  -th[0];
   th[9] =  width / 2;
   th[10]=  th[0] + width;
 
   th[9] =  width / 2;
   th[10]=  th[0] + width;
 
-  if (!points || !fnormals || !pnormals)
+  orim->npoints  = 0;
+  orim->points   = (XYZ *) calloc(ppt * g->nteeth+1, sizeof(*orim->points));
+  orim->fnormals = (XYZ *) calloc(ppt * g->nteeth+1, sizeof(*orim->fnormals));
+  orim->pnormals = (XYZ *) calloc(ppt * g->nteeth+1, sizeof(*orim->pnormals));
+
+  irim->npoints  = 0;
+  irim->points   = (XYZ *) calloc(ppt * g->nteeth+1, sizeof(*irim->points));
+  irim->fnormals = (XYZ *) calloc(ppt * g->nteeth+1, sizeof(*irim->fnormals));
+  irim->pnormals = (XYZ *) calloc(ppt * g->nteeth+1, sizeof(*irim->pnormals));
+
+  if (!orim->points || !orim->pnormals || !orim->fnormals ||
+      !irim->points || !irim->pnormals || !irim->fnormals)
     {
       fprintf (stderr, "%s: out of memory\n", progname);
       exit (1);
     }
 
     {
       fprintf (stderr, "%s: out of memory\n", progname);
       exit (1);
     }
 
-  npoints = 0;
-
   /* First, compute the coordinates of every point used for every tooth.
    */
   for (i = 0; i < g->nteeth; i++)
   /* First, compute the coordinates of every point used for every tooth.
    */
   for (i = 0; i < g->nteeth; i++)
@@ -1763,97 +1667,47 @@ gear_teeth_geometry (ModeInfo *mi, gear *g,
       GLfloat TH = (i * width) + (width/4);
 
 #     undef PUSH
       GLfloat TH = (i * width) + (width/4);
 
 #     undef PUSH
-#     define PUSH(PR,PTH) \
-        points[npoints].x = cos(TH+th[(PTH)]) * r[(PR)]; \
-        points[npoints].y = sin(TH+th[(PTH)]) * r[(PR)]; \
-        npoints++
-
-      /* start1 = npoints; */
-
-      PUSH(3, 0);       /* tooth left 1 */
-      PUSH(2, 1);       /* tooth left 2 */
-      PUSH(1, 2);       /* tooth left 3 */
-      PUSH(0, 3);       /* tooth top 1 */
-      PUSH(0, 5);       /* tooth top 2 */
-      PUSH(1, 6);       /* tooth right 1 */
-      PUSH(2, 7);       /* tooth right 2 */
-      PUSH(3, 8);       /* tooth right 3 */
-      PUSH(3, 10);      /* gap top */
-
-      /* end1   = npoints; */
-
-      PUSH(4, 8);       /* gap interior */
-
-      /* start2 = npoints; */
-
-      PUSH(4, 10);      /* tooth interior 1 */
-      PUSH(4, 8);       /* tooth interior 2 */
-      PUSH(4, 4);       /* tooth bottom 1 */
-      PUSH(4, 0);       /* tooth bottom 2 */
-
-      /* end2 = npoints; */
-
-      PUSH(3, 4);       /* midpoint */
-
-      /* mid = npoints-1; */
-
-      if (i == 0 && npoints != ppt) abort();  /* go update "ppt"! */
+#     define PUSH(OPR,IPR,PTH) \
+        orim->points[orim->npoints].x = cos(TH+th[(PTH)]) * r[(OPR)]; \
+        orim->points[orim->npoints].y = sin(TH+th[(PTH)]) * r[(OPR)]; \
+        orim->npoints++; \
+        irim->points[irim->npoints].x = cos(TH+th[(PTH)]) * r[(IPR)]; \
+        irim->points[irim->npoints].y = sin(TH+th[(PTH)]) * r[(IPR)]; \
+        irim->npoints++
+
+      if (g->size == SMALL)
+        {
+          PUSH(3, 4, 0);       /* tooth left 1 */
+          PUSH(0, 4, 4);       /* tooth top middle */
+        }
+      else if (g->size == MEDIUM)
+        {
+          PUSH(3, 4, 0);       /* tooth left 1 */
+          PUSH(0, 4, 3);       /* tooth top left */
+          PUSH(0, 4, 5);       /* tooth top right */
+          PUSH(3, 4, 8);       /* tooth right 3 */
+        }
+      else if (g->size == LARGE)
+        {
+          PUSH(3, 4, 0);       /* tooth left 1 */
+          PUSH(2, 4, 1);       /* tooth left 2 */
+          PUSH(1, 4, 2);       /* tooth left 3 */
+          PUSH(0, 4, 3);       /* tooth top left */
+          PUSH(0, 4, 5);       /* tooth top right */
+          PUSH(1, 4, 6);       /* tooth right 1 */
+          PUSH(2, 4, 7);       /* tooth right 2 */
+          PUSH(3, 4, 8);       /* tooth right 3 */
+          PUSH(3, 4, 9);       /* gap top */
+        }
+      else
+        abort();
 #     undef PUSH
 #     undef PUSH
-    }
-
 
 
-  /* Now compute the face normals for each facet on the tooth rim.
-   */
-  for (i = 0; i < npoints; i++)
-    {
-      XYZ p1, p2, p3;
-      p1 = points[i];
-      p2 = points[i+1];
-      p3 = p1;
-      p3.z++;
-      fnormals[i] = calc_normal (p1, p2, p3);
+      if (i == 0 && orim->npoints > ppt) abort();  /* go update "ppt"! */
     }
 
     }
 
-
-  /* From the face normals, compute the vertex normals (by averaging
-     the normals of adjascent faces.)
-   */
-  for (i = 0; i < npoints; i++)
-    {
-      int a = (i == 0 ? npoints-1 : i-1);
-      int b = i;
-
-      /* Kludge to fix the normal on the last top point: since the
-         faces go all the way around, this normal pointed clockwise
-         instead of radially out. */
-      int start1 = (i / ppt) * ppt;
-      int end1   = start1 + 9;
-      XYZ n1, n2;
-
-      if (b == end1-1)
-        b = (start1 + ppt == npoints ? 0 : start1 + ppt);
-
-      n1 = fnormals[a];   /* normal of [i-1 - i] face */
-      n2 = fnormals[b];   /* normal of [i - i+1] face */
-      pnormals[i].x = (n1.x + n2.x) / 2;
-      pnormals[i].y = (n1.y + n2.y) / 2;
-      pnormals[i].z = (n1.z + n2.z) / 2;
-    }
-
-  free (fnormals);
-
-  if (points_ret)
-    *points_ret = points;
-  else
-    free (points);
-
-  if (normals_ret)
-    *normals_ret = pnormals;
-  else
-    free (pnormals);
-
-  if (points_per_tooth_ret)
-    *points_per_tooth_ret = ppt;
+  tooth_normals (orim);
+  tooth_normals (irim);
 }
 
 
 }
 
 
@@ -1863,147 +1717,171 @@ static int
 draw_gear_teeth (ModeInfo *mi, gear *g)
 {
   Bool wire_p = MI_IS_WIREFRAME(mi);
 draw_gear_teeth (ModeInfo *mi, gear *g)
 {
   Bool wire_p = MI_IS_WIREFRAME(mi);
+  Bool show_normals_p = False;
   int polys = 0;
   int i;
 
   GLfloat z1 = -g->thickness/2;
   GLfloat z2 =  g->thickness/2;
 
   int polys = 0;
   int i;
 
   GLfloat z1 = -g->thickness/2;
   GLfloat z2 =  g->thickness/2;
 
-  int ppt;
-  XYZ *points, *pnormals;
-
-  gear_teeth_geometry (mi, g, &ppt, &points, &pnormals);
+  tooth_face orim, irim;
+  gear_teeth_geometry (mi, g, &orim, &irim);
 
   glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, g->color);
 
 
   glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, g->color);
 
-  for (i = 0; i < g->nteeth; i++)
+  /* Draw the outer rim (the teeth)
+     (In wire mode, this draws just the upright lines.)
+   */
+  glFrontFace (GL_CW);
+  glBegin (wire_p ? GL_LINES : GL_QUAD_STRIP);
+  for (i = 0; i < orim.npoints; i++)
     {
     {
-      int j;
-      GLfloat z;
+      glNormal3f (orim.pnormals[i].x, orim.pnormals[i].y, orim.pnormals[i].z);
+      glVertex3f (orim.points[i].x, orim.points[i].y, z1);
+      glVertex3f (orim.points[i].x, orim.points[i].y, z2);
 
 
-      int start1 = i * ppt;
-      int end1   = start1 + 9;
-      int start2 = end1   + 1;
-      int end2   = start2 + 4;
-      int mid    = end2;
+      /* Show the face normal vectors */
+      if (wire_p && show_normals_p)
+        {
+          XYZ n = orim.fnormals[i];
+          int a = i;
+          int b = (i == orim.npoints-1 ? 0 : i+1);
+          GLfloat x = (orim.points[a].x + orim.points[b].x) / 2;
+          GLfloat y = (orim.points[a].y + orim.points[b].y) / 2;
+          GLfloat z  = (z1 + z2) / 2;
+          glVertex3f (x, y, z);
+          glVertex3f (x + n.x, y + n.y, z);
+        }
 
 
-      /* Outside rim of the tooth
-       */
-      glFrontFace (GL_CW);
-      glBegin (wire_p ? GL_LINES : GL_QUAD_STRIP);
-      for (j = start1; j < end1; j++)
+      /* Show the vertex normal vectors */
+      if (wire_p && show_normals_p)
         {
         {
-          glNormal3f (pnormals[j].x, pnormals[j].y, pnormals[j].z);
-          glVertex3f (points[j].x, points[j].y, z1);
-          glVertex3f (points[j].x, points[j].y, z2);
-          polys++;
+          XYZ n = orim.pnormals[i];
+          GLfloat x = orim.points[i].x;
+          GLfloat y = orim.points[i].y;
+          GLfloat z  = (z1 + z2) / 2;
+          glVertex3f (x, y, z);
+          glVertex3f (x + n.x, y + n.y, z);
+        }
+    }
 
 
-# if 0
-          /* Show the face normal vectors */
-          if (wire_p)
-            {
-              XYZ n = fnormals[j];
-              GLfloat x = (points[j].x + points[j+1].x) / 2;
-              GLfloat y = (points[j].y + points[j+1].y) / 2;
-              GLfloat z  = (z1 + z2) / 2;
-              glVertex3f (x, y, z);
-              glVertex3f (x + n.x, y + n.y, z);
-            }
+  if (!wire_p)  /* close the quad loop */
+    {
+      glNormal3f (orim.pnormals[0].x, orim.pnormals[0].y, orim.pnormals[0].z);
+      glVertex3f (orim.points[0].x, orim.points[0].y, z1);
+      glVertex3f (orim.points[0].x, orim.points[0].y, z2);
+    }
+  polys += orim.npoints;
+  glEnd();
 
 
-          /* Show the vertex normal vectors */
-          if (wire_p)
-            {
-              XYZ n = pnormals[j];
-              GLfloat x = points[j].x;
-              GLfloat y = points[j].y;
-              GLfloat z  = (z1 + z2) / 2;
-              glVertex3f (x, y, z);
-              glVertex3f (x + n.x, y + n.y, z);
-            }
-# endif /* 0 */
-        }
+  /* Draw the outer rim circles, in wire mode */
+  if (wire_p)
+    {
+      glBegin (GL_LINE_LOOP);
+      for (i = 0; i < orim.npoints; i++)
+        glVertex3f (orim.points[i].x, orim.points[i].y, z1);
       glEnd();
       glEnd();
+      glBegin (GL_LINE_LOOP);
+      for (i = 0; i < orim.npoints; i++)
+        glVertex3f (orim.points[i].x, orim.points[i].y, z2);
+      glEnd();
+    }
 
 
-      /* Some more lines for the outside rim of the tooth...
-       */
-      if (wire_p)
+
+  /* Draw the inner rim (the hole)
+     (In wire mode, this draws just the upright lines.)
+   */
+  glFrontFace (GL_CCW);
+  glBegin (wire_p ? GL_LINES : GL_QUAD_STRIP);
+  for (i = 0; i < irim.npoints; i++)
+    {
+      glNormal3f(-irim.pnormals[i].x, -irim.pnormals[i].y,-irim.pnormals[i].z);
+      glVertex3f (irim.points[i].x, irim.points[i].y, z1);
+      glVertex3f (irim.points[i].x, irim.points[i].y, z2);
+
+      /* Show the face normal vectors */
+      if (wire_p && show_normals_p)
         {
         {
-          glBegin (GL_LINE_STRIP);
-          for (j = start1; j < end1; j++)
-            glVertex3f (points[j].x, points[j].y, z1);
-          glEnd();
-          glBegin (GL_LINE_STRIP);
-          for (j = start1; j < end1; j++)
-            glVertex3f (points[j].x, points[j].y, z2);
-          glEnd();
+          XYZ n = irim.fnormals[i];
+          int a = i;
+          int b = (i == irim.npoints-1 ? 0 : i+1);
+          GLfloat x = (irim.points[a].x + irim.points[b].x) / 2;
+          GLfloat y = (irim.points[a].y + irim.points[b].y) / 2;
+          GLfloat z  = (z1 + z2) / 2;
+          glVertex3f (x, y, z);
+          glVertex3f (x - n.x, y - n.y, z);
         }
 
         }
 
-      /* Inside rim behind the tooth
-       */
-      glFrontFace (GL_CW);
-      glBegin (wire_p ? GL_LINES : GL_QUAD_STRIP);
-      for (j = start2; j < end2; j++)
+      /* Show the vertex normal vectors */
+      if (wire_p && show_normals_p)
         {
         {
-          glNormal3f (-points[j].x, -points[j].y, 0);
-          glVertex3f ( points[j].x,  points[j].y, z1);
-          glVertex3f ( points[j].x,  points[j].y, z2);
-          polys++;
+          XYZ n = irim.pnormals[i];
+          GLfloat x = irim.points[i].x;
+          GLfloat y = irim.points[i].y;
+          GLfloat z  = (z1 + z2) / 2;
+          glVertex3f (x, y, z);
+          glVertex3f (x - n.x, y - n.y, z);
         }
         }
+    }
+
+  if (!wire_p)  /* close the quad loop */
+    {
+      glNormal3f (-irim.pnormals[0].x,-irim.pnormals[0].y,-irim.pnormals[0].z);
+      glVertex3f (irim.points[0].x, irim.points[0].y, z1);
+      glVertex3f (irim.points[0].x, irim.points[0].y, z2);
+    }
+  polys += irim.npoints;
+  glEnd();
+
+  /* Draw the inner rim circles, in wire mode
+   */
+  if (wire_p)
+    {
+      glBegin (GL_LINE_LOOP);
+      for (i = 0; i < irim.npoints; i++)
+        glVertex3f (irim.points[i].x, irim.points[i].y, z1);
+      glEnd();
+      glBegin (GL_LINE_LOOP);
+      for (i = 0; i < irim.npoints; i++)
+        glVertex3f (irim.points[i].x, irim.points[i].y, z2);
       glEnd();
       glEnd();
+    }
 
 
-      /* Some more lines for the inside rim...
-       */
-      if (wire_p)
+
+  /* Draw the side (the flat bit)
+   */
+  if (!wire_p || wire_all_p)
+    {
+      GLfloat z;
+      if (irim.npoints != orim.npoints) abort();
+      for (z = z1; z <= z2; z += z2-z1)
         {
         {
-          glBegin (GL_LINE_STRIP);
-          for (j = start2; j < end2; j++)
-            glVertex3f (points[j].x, points[j].y, z1);
-          glEnd();
-          glBegin (GL_LINE_STRIP);
-          for (j = start2; j < end2; j++)
-            glVertex3f (points[j].x, points[j].y, z2);
+          glFrontFace (z == z1 ? GL_CCW : GL_CW);
+          glNormal3f (0, 0, z);
+          glBegin (wire_p ? GL_LINES : GL_QUAD_STRIP);
+          for (i = 0; i < orim.npoints; i++)
+            {
+              glVertex3f (orim.points[i].x, orim.points[i].y, z);
+              glVertex3f (irim.points[i].x, irim.points[i].y, z);
+            }
+          if (!wire_p)  /* close the quad loop */
+            {
+              glVertex3f (orim.points[0].x, orim.points[0].y, z);
+              glVertex3f (irim.points[0].x, irim.points[0].y, z);
+            }
+          polys += orim.npoints;
           glEnd();
         }
           glEnd();
         }
+    }
 
 
-      /* All top and bottom facets.  We can skip all of these in wire mode.
-       */
-      if (!wire_p || wire_all_p)
-        for (z = z1; z <= z2; z += z2-z1)
-          {
-            /* Flat edge of the tooth
-             */
-            glFrontFace (z == z1 ? GL_CW : GL_CCW);
-            glBegin (wire_p ? GL_LINES : GL_TRIANGLE_FAN);
-            glNormal3f (0, 0, z);
-            for (j = start1; j < end2; j++)
-              {
-                if (j == end1-1 || j == end1 || j == start2)
-                  continue;  /* kludge... skip these... */
+  free (irim.points);
+  free (irim.fnormals);
+  free (irim.pnormals);
 
 
-                if (wire_p || j == start1)
-                  glVertex3f (points[mid].x, points[mid].y, z);
-                glVertex3f (points[j].x, points[j].y, z);
-                polys++;
-              }
-            glVertex3f (points[start1].x, points[start1].y, z);
-            glEnd();
-
-            /* Flat edge between teeth
-             */
-            glFrontFace (z == z1 ? GL_CW : GL_CCW);
-            glBegin (wire_p ? GL_LINES : GL_QUADS);
-            glNormal3f (0, 0, z);
-            glVertex3f (points[end1-1  ].x, points[end1-1  ].y, z);
-            glVertex3f (points[start2  ].x, points[start2  ].y, z);
-            glVertex3f (points[start2+1].x, points[start2+1].y, z);
-            glVertex3f (points[end1-2  ].x, points[end1-2  ].y, z);
-            polys++;
-            glEnd();
-          }
-    }
+  free (orim.points);
+  free (orim.fnormals);
+  free (orim.pnormals);
 
 
-  free (points);
-  free (pnormals);
   return polys;
 }
 
   return polys;
 }
 
@@ -2279,7 +2157,7 @@ pinion_handle_event (ModeInfo *mi, XEvent *event)
   pinion_configuration *pp = &pps[MI_SCREEN(mi)];
 
   if (event->xany.type == ButtonPress &&
   pinion_configuration *pp = &pps[MI_SCREEN(mi)];
 
   if (event->xany.type == ButtonPress &&
-      event->xbutton.button & Button1)
+      event->xbutton.button == Button1)
     {
       pp->button_down_p = True;
       gltrackball_start (pp->trackball,
     {
       pp->button_down_p = True;
       gltrackball_start (pp->trackball,
@@ -2288,11 +2166,19 @@ pinion_handle_event (ModeInfo *mi, XEvent *event)
       return True;
     }
   else if (event->xany.type == ButtonRelease &&
       return True;
     }
   else if (event->xany.type == ButtonRelease &&
-           event->xbutton.button & Button1)
+           event->xbutton.button == Button1)
     {
       pp->button_down_p = False;
       return True;
     }
     {
       pp->button_down_p = False;
       return True;
     }
+  else if (event->xany.type == ButtonPress &&
+           (event->xbutton.button == Button4 ||
+            event->xbutton.button == Button5))
+    {
+      gltrackball_mousewheel (pp->trackball, event->xbutton.button, 5,
+                              !!event->xbutton.state);
+      return True;
+    }
   else if (event->xany.type == MotionNotify &&
            pp->button_down_p)
     {
   else if (event->xany.type == MotionNotify &&
            pp->button_down_p)
     {
index 65e2b579740cb8913a60e4a6f7873de027f8a5e4..59c203018b705c4bc7c42a7b5c43cf580b829bf7 100644 (file)
@@ -48,7 +48,7 @@ static const char sccsid[] = "@(#)pipes.c     4.07 97/11/24 xlockmore";
 # define HACK_DRAW                                     draw_pipes
 # define HACK_RESHAPE                          reshape_pipes
 # define pipes_opts                                    xlockmore_opts
 # define HACK_DRAW                                     draw_pipes
 # define HACK_RESHAPE                          reshape_pipes
 # define pipes_opts                                    xlockmore_opts
-# define DEFAULTS      "*delay:                100     \n"                     \
+# define DEFAULTS      "*delay:                10000   \n"                     \
                                        "*count:                2       \n"                     \
                                        "*cycles:               5       \n"                     \
                                        "*size:                 500     \n"                     \
                                        "*count:                2       \n"                     \
                                        "*cycles:               5       \n"                     \
                                        "*size:                 500     \n"                     \
@@ -211,7 +211,7 @@ static pipesstruct *pipes = NULL;
 
 
 static void
 
 
 static void
-MakeTube(int direction)
+MakeTube(ModeInfo *mi, int direction)
 {
        float       an;
        float       SINan_3, COSan_3;
 {
        float       an;
        float       SINan_3, COSan_3;
@@ -232,6 +232,7 @@ MakeTube(int direction)
                glNormal3f((COSan_3 = cos(an) / 3.0), (SINan_3 = sin(an) / 3.0), 0.0);
                glVertex3f(COSan_3, SINan_3, one_third);
                glVertex3f(COSan_3, SINan_3, -one_third);
                glNormal3f((COSan_3 = cos(an) / 3.0), (SINan_3 = sin(an) / 3.0), 0.0);
                glVertex3f(COSan_3, SINan_3, one_third);
                glVertex3f(COSan_3, SINan_3, -one_third);
+        mi->polygon_count++;
        }
        glEnd();
 }
        }
        glEnd();
 }
@@ -312,6 +313,7 @@ myElbow(ModeInfo * mi, int bolted)
                        glVertex3fv(p1);
                        glNormal3fv(n0);
                        glVertex3fv(p0);
                        glVertex3fv(p1);
                        glNormal3fv(n0);
                        glVertex3fv(p0);
+            mi->polygon_count++;
                        glEnd();
                }
        }
                        glEnd();
                }
        }
@@ -324,8 +326,10 @@ myElbow(ModeInfo * mi, int bolted)
                glRotatef(90.0, 0.0, 1.0, 0.0);
                glTranslatef(0.0, one_third, one_third);
                glCallList(pp->elbowcoins);
                glRotatef(90.0, 0.0, 1.0, 0.0);
                glTranslatef(0.0, one_third, one_third);
                glCallList(pp->elbowcoins);
+        mi->polygon_count += LWO_ElbowCoins.num_pnts/3;
                glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialGray);
                glCallList(pp->elbowbolts);
                glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialGray);
                glCallList(pp->elbowbolts);
+        mi->polygon_count += LWO_ElbowBolts.num_pnts/3;
                glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, pp->system_color);
                glPopMatrix();
                glFrontFace(GL_CCW);
                glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, pp->system_color);
                glPopMatrix();
                glFrontFace(GL_CCW);
@@ -397,8 +401,10 @@ MakeValve(ModeInfo * mi, int newdir)
        }
        glFrontFace(GL_CW);
        glCallList(pp->betweenbolts);
        }
        glFrontFace(GL_CW);
        glCallList(pp->betweenbolts);
+    mi->polygon_count += LWO_PipeBetweenBolts.num_pnts/3;
        glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialGray);
        glCallList(pp->bolts);
        glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialGray);
        glCallList(pp->bolts);
+    mi->polygon_count += LWO_Bolts3D.num_pnts/3;
        if (!MI_IS_MONO(mi)) {
                if (pp->system_color == MaterialRed) {
                        glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, NRAND(2) ? MaterialYellow : MaterialBlue);
        if (!MI_IS_MONO(mi)) {
                if (pp->system_color == MaterialRed) {
                        glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, NRAND(2) ? MaterialYellow : MaterialBlue);
@@ -421,6 +427,7 @@ MakeValve(ModeInfo * mi, int newdir)
        }
        glRotatef((GLfloat) (NRAND(90)), 1.0, 0.0, 0.0);
        glCallList(pp->valve);
        }
        glRotatef((GLfloat) (NRAND(90)), 1.0, 0.0, 0.0);
        glCallList(pp->valve);
+    mi->polygon_count += LWO_BigValve.num_pnts/3;
        glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, pp->system_color);
        glFrontFace(GL_CCW);
 }
        glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, pp->system_color);
        glFrontFace(GL_CCW);
 }
@@ -446,11 +453,14 @@ MakeGuage(ModeInfo * mi, int newdir)
        if ((newdir == dirLEFT) || (newdir == dirRIGHT))
                glRotatef(90.0, 0.0, 1.0, 0.0);
        glCallList(pp->betweenbolts);
        if ((newdir == dirLEFT) || (newdir == dirRIGHT))
                glRotatef(90.0, 0.0, 1.0, 0.0);
        glCallList(pp->betweenbolts);
+    mi->polygon_count += LWO_PipeBetweenBolts.num_pnts/3;
        glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialGray);
        glCallList(pp->bolts);
        glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialGray);
        glCallList(pp->bolts);
+    mi->polygon_count += LWO_Bolts3D.num_pnts/3;
        glPopMatrix();
 
        glCallList(pp->guageconnector);
        glPopMatrix();
 
        glCallList(pp->guageconnector);
+    mi->polygon_count += LWO_GuageConnector.num_pnts/3;
        glPushMatrix();
        glTranslatef(0.0, 1.33333, 0.0);
        /* Do not change the above to 1 + ONE_THIRD, because */
        glPushMatrix();
        glTranslatef(0.0, 1.33333, 0.0);
        /* Do not change the above to 1 + ONE_THIRD, because */
@@ -458,14 +468,17 @@ MakeGuage(ModeInfo * mi, int newdir)
        glRotatef(NRAND(270) + 45.0, 0.0, 0.0, -1.0);
        /* Random rotation for the dial.  I love it. */
        glCallList(pp->guagedial);
        glRotatef(NRAND(270) + 45.0, 0.0, 0.0, -1.0);
        /* Random rotation for the dial.  I love it. */
        glCallList(pp->guagedial);
+    mi->polygon_count += LWO_GuageDial.num_pnts/3;
        glPopMatrix();
 
        glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, pp->system_color);
        glCallList(pp->guagehead);
        glPopMatrix();
 
        glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, pp->system_color);
        glCallList(pp->guagehead);
+    mi->polygon_count += LWO_GuageHead.num_pnts/3;
 
        /* GuageFace is drawn last, in case of low-res depth buffers. */
        glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialWhite);
        glCallList(pp->guageface);
 
        /* GuageFace is drawn last, in case of low-res depth buffers. */
        glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialWhite);
        glCallList(pp->guageface);
+    mi->polygon_count += LWO_GuageFace.num_pnts/3;
 
        glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, pp->system_color);
        glFrontFace(GL_CCW);
 
        glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, pp->system_color);
        glFrontFace(GL_CCW);
@@ -479,7 +492,7 @@ MakeShape(ModeInfo * mi, int newdir)
        switch (NRAND(2)) {
                case 1:
                        if (!MakeGuage(mi, newdir))
        switch (NRAND(2)) {
                case 1:
                        if (!MakeGuage(mi, newdir))
-                               MakeTube(newdir);
+                               MakeTube(mi, newdir);
                        break;
                default:
                        MakeValve(mi, newdir);
                        break;
                default:
                        MakeValve(mi, newdir);
@@ -508,6 +521,9 @@ pinit(ModeInfo * mi, int zera)
        pipesstruct *pp = &pipes[MI_SCREEN(mi)];
        int         X, Y, Z;
 
        pipesstruct *pp = &pipes[MI_SCREEN(mi)];
        int         X, Y, Z;
 
+    if (zera)
+      mi->polygon_count = 0;
+
        glClearDepth(1.0);
        glClearColor(0.0, 0.0, 0.0, 1.0);
        glColor3f(1.0, 1.0, 1.0);
        glClearDepth(1.0);
        glClearColor(0.0, 0.0, 0.0, 1.0);
        glColor3f(1.0, 1.0, 1.0);
@@ -771,7 +787,7 @@ draw_pipes(ModeInfo * mi)
                if ((pp->counter > 1) && (NRAND(100) < factory)) {
                        MakeShape(mi, newdir);
                } else {
                if ((pp->counter > 1) && (NRAND(100) < factory)) {
                        MakeShape(mi, newdir);
                } else {
-                       MakeTube(newdir);
+                       MakeTube(mi, newdir);
                }
                glPopMatrix();
        } else {
                }
                glPopMatrix();
        } else {
@@ -955,7 +971,7 @@ draw_pipes(ModeInfo * mi)
 
        /* Cells'face pipe */
        glTranslatef(((pp->PX + OPX) / 2.0 - 16) / 3.0 * 4.0, ((pp->PY + OPY) / 2.0 - 12) / 3.0 * 4.0, ((pp->PZ + OPZ) / 2.0 - 16) / 3.0 * 4.0);
 
        /* Cells'face pipe */
        glTranslatef(((pp->PX + OPX) / 2.0 - 16) / 3.0 * 4.0, ((pp->PY + OPY) / 2.0 - 12) / 3.0 * 4.0, ((pp->PZ + OPZ) / 2.0 - 16) / 3.0 * 4.0);
-       MakeTube(newdir);
+       MakeTube(mi, newdir);
 
        glPopMatrix();
 
 
        glPopMatrix();
 
index 5bbf1be29505ebcf3d4ff1c58fd1ce4722f701da..b693a55d1b5145fbd79c817a86910c740c4a3c62 100644 (file)
@@ -53,6 +53,8 @@ extern XtAppContext app;
 #include "xlockmore.h"
 #include <GL/glu.h>
 
 #include "xlockmore.h"
 #include <GL/glu.h>
 
+#include "glxfonts.h"
+#include "normals.h"
 #include "polyhedra.h"
 #include "colors.h"
 #include "rotator.h"
 #include "polyhedra.h"
 #include "colors.h"
 #include "rotator.h"
@@ -123,52 +125,6 @@ ModeSpecOpt sws_opts = {countof(opts), opts, countof(vars), vars, NULL};
 
 
 \f
 
 
 \f
-typedef struct {
-  double x,y,z;
-} XYZ;
-
-static void
-normalize (XYZ *p)
-{
-  double length;
-  length = sqrt (p->x * p->x +
-                 p->y * p->y +
-                 p->z * p->z);
-  if (length != 0)
-    {
-      p->x /= length;
-      p->y /= length;
-      p->z /= length;
-    }
-  else
-    {
-      p->x = 0;
-      p->y = 0;
-      p->z = 0;
-    }
-}
-
-/* Calculate the unit normal at p given two other points p1,p2 on the
-   surface. The normal points in the direction of p1 crossproduct p2
- */
-static XYZ
-calc_normal (XYZ p, XYZ p1, XYZ p2)
-{
-  XYZ n, pa, pb;
-  pa.x = p1.x - p.x;
-  pa.y = p1.y - p.y;
-  pa.z = p1.z - p.z;
-  pb.x = p2.x - p.x;
-  pb.y = p2.y - p.y;
-  pb.z = p2.z - p.z;
-  n.x = pa.y * pb.z - pa.z * pb.y;
-  n.y = pa.z * pb.x - pa.x * pb.z;
-  n.z = pa.x * pb.y - pa.y * pb.x;
-  normalize (&n);
-  return (n);
-}
-
-
 /* Calculate the normals at each vertex of a face, and use the sum to
    decide which normal to assign to the entire face.  This also solves
    problems caused by nonconvex faces, in most (but not all) cases.
 /* Calculate the normals at each vertex of a face, and use the sum to
    decide which normal to assign to the entire face.  This also solves
    problems caused by nonconvex faces, in most (but not all) cases.
@@ -196,7 +152,7 @@ kludge_normal (int n, const int *indices, const point *points)
     normal.z += p.z;
   }
 
     normal.z += p.z;
   }
 
-  normalize(&normal);
+  /*normalize(&normal);*/
   if (normal.x == 0 && normal.y == 0 && normal.z == 0) {
     glNormal3f (p.x, p.y, p.z);
   } else {
   if (normal.x == 0 && normal.y == 0 && normal.z == 0) {
     glNormal3f (p.x, p.y, p.z);
   } else {
@@ -204,136 +160,16 @@ kludge_normal (int n, const int *indices, const point *points)
   }
 }
 
   }
 }
 
-static void
-load_font (ModeInfo *mi, char *res, XFontStruct **fontP, GLuint *dlistP)
-{
-  const char *font = get_string_resource (res, "Font");
-  XFontStruct *f;
-  Font id;
-  int first, last;
-
-  if (!font) font = "-*-times-bold-r-normal-*-180-*";
-
-  f = XLoadQueryFont(mi->dpy, font);
-  if (!f) f = XLoadQueryFont(mi->dpy, "fixed");
-
-  id = f->fid;
-  first = f->min_char_or_byte2;
-  last = f->max_char_or_byte2;
-  
-  clear_gl_error ();
-  *dlistP = glGenLists ((GLuint) last+1);
-  check_gl_error ("glGenLists");
-  glXUseXFont(id, first, last-first+1, *dlistP + first);
-  check_gl_error ("glXUseXFont");
-
-  *fontP = f;
-}
-
 
 static void
 load_fonts (ModeInfo *mi)
 {
   polyhedra_configuration *bp = &bps[MI_SCREEN(mi)];
 
 static void
 load_fonts (ModeInfo *mi)
 {
   polyhedra_configuration *bp = &bps[MI_SCREEN(mi)];
-  load_font (mi, "titleFont",  &bp->xfont1, &bp->font1_dlist);
-  load_font (mi, "titleFont2", &bp->xfont2, &bp->font2_dlist);
-  load_font (mi, "titleFont3", &bp->xfont3, &bp->font3_dlist);
-}
-
-
-static int
-string_width (XFontStruct *f, const char *c)
-{
-  int w = 0;
-  while (*c)
-    {
-      int cc = *((unsigned char *) c);
-      w += (f->per_char
-            ? f->per_char[cc-f->min_char_or_byte2].rbearing
-            : f->min_bounds.rbearing);
-      c++;
-    }
-  return w;
+  load_font (mi->dpy, "titleFont",  &bp->xfont1, &bp->font1_dlist);
+  load_font (mi->dpy, "titleFont2", &bp->xfont2, &bp->font2_dlist);
+  load_font (mi->dpy, "titleFont3", &bp->xfont3, &bp->font3_dlist);
 }
 
 }
 
-static void
-print_title_string (ModeInfo *mi, const char *string,
-                    GLfloat x, GLfloat y,
-                    XFontStruct *font, int font_dlist)
-{
-  GLfloat line_height = font->ascent + font->descent;
-  GLfloat sub_shift = (line_height * 0.3);
-  int cw = string_width (font, "m");
-  int tabs = cw * 7;
-
-  y -= line_height;
-
-  glPushAttrib (GL_TRANSFORM_BIT |  /* for matrix contents */
-                GL_ENABLE_BIT);     /* for various glDisable calls */
-  glDisable (GL_LIGHTING);
-  glDisable (GL_DEPTH_TEST);
-  {
-    glMatrixMode(GL_PROJECTION);
-    glPushMatrix();
-    {
-      glLoadIdentity();
-
-      glMatrixMode(GL_MODELVIEW);
-      glPushMatrix();
-      {
-        int i;
-        int x2 = x;
-        Bool sub_p = False;
-        glLoadIdentity();
-
-        gluOrtho2D (0, mi->xgwa.width, 0, mi->xgwa.height);
-
-        glColor3f (0.8, 0.8, 0);
-
-        glRasterPos2f (x, y);
-        for (i = 0; i < strlen(string); i++)
-          {
-            char c = string[i];
-            if (c == '\n')
-              {
-                glRasterPos2f (x, (y -= line_height));
-                x2 = x;
-              }
-            else if (c == '\t')
-              {
-                x2 -= x;
-                x2 = ((x2 + tabs) / tabs) * tabs;  /* tab to tab stop */
-                x2 += x;
-                glRasterPos2f (x2, y);
-              }
-            else if (c == '[' && (isdigit (string[i+1])))
-              {
-                sub_p = True;
-                glRasterPos2f (x2, (y -= sub_shift));
-              }
-            else if (c == ']' && sub_p)
-              {
-                sub_p = False;
-                glRasterPos2f (x2, (y += sub_shift));
-              }
-            else
-              {
-                glCallList (font_dlist + (int)(c));
-                x2 += (font->per_char
-                       ? font->per_char[c - font->min_char_or_byte2].width
-                       : font->min_bounds.width);
-              }
-          }
-      }
-      glPopMatrix();
-    }
-    glMatrixMode(GL_PROJECTION);
-    glPopMatrix();
-  }
-  glPopAttrib();
-
-  glMatrixMode(GL_MODELVIEW);
-}
 
 
 static void
 
 
 static void
@@ -341,10 +177,12 @@ startup_blurb (ModeInfo *mi)
 {
   polyhedra_configuration *bp = &bps[MI_SCREEN(mi)];
   const char *s = "Computing polyhedra...";
 {
   polyhedra_configuration *bp = &bps[MI_SCREEN(mi)];
   const char *s = "Computing polyhedra...";
-  print_title_string (mi, s,
-                      mi->xgwa.width - (string_width (bp->xfont1, s) + 40),
-                      10 + bp->xfont1->ascent + bp->xfont1->descent,
-                      bp->xfont1, bp->font1_dlist);
+  glColor3f (0.8, 0.8, 0);
+  print_gl_string (mi->dpy, bp->xfont1, bp->font1_dlist,
+                   mi->xgwa.width, mi->xgwa.height,
+                   mi->xgwa.width - (string_width (bp->xfont1, s) + 40),
+                   mi->xgwa.height - 10,
+                   s);
   glFinish();
   glXSwapBuffers(MI_DISPLAY(mi), MI_WINDOW(mi));
 }
   glFinish();
   glXSwapBuffers(MI_DISPLAY(mi), MI_WINDOW(mi));
 }
@@ -385,7 +223,7 @@ polyhedra_handle_event (ModeInfo *mi, XEvent *event)
   polyhedra_configuration *bp = &bps[MI_SCREEN(mi)];
 
   if (event->xany.type == ButtonPress &&
   polyhedra_configuration *bp = &bps[MI_SCREEN(mi)];
 
   if (event->xany.type == ButtonPress &&
-      event->xbutton.button & Button1)
+      event->xbutton.button == Button1)
     {
       bp->button_down_p = True;
       gltrackball_start (bp->trackball,
     {
       bp->button_down_p = True;
       gltrackball_start (bp->trackball,
@@ -394,11 +232,19 @@ polyhedra_handle_event (ModeInfo *mi, XEvent *event)
       return True;
     }
   else if (event->xany.type == ButtonRelease &&
       return True;
     }
   else if (event->xany.type == ButtonRelease &&
-           event->xbutton.button & Button1)
+           event->xbutton.button == Button1)
     {
       bp->button_down_p = False;
       return True;
     }
     {
       bp->button_down_p = False;
       return True;
     }
+  else if (event->xany.type == ButtonPress &&
+           (event->xbutton.button == Button4 ||
+            event->xbutton.button == Button5))
+    {
+      gltrackball_mousewheel (bp->trackball, event->xbutton.button, 10,
+                              !!event->xbutton.state);
+      return True;
+    }
   else if (event->xany.type == KeyPress)
     {
       KeySym keysym;
   else if (event->xany.type == KeyPress)
     {
       KeySym keysym;
@@ -472,9 +318,11 @@ new_label (ModeInfo *mi)
         else
           f = bp->xfont3, fl = bp->font3_dlist;                       /* tiny font */
 
         else
           f = bp->xfont3, fl = bp->font3_dlist;                       /* tiny font */
 
-        print_title_string (mi, label,
-                            10, mi->xgwa.height - 10,
-                            f, fl);
+        glColor3f (0.8, 0.8, 0);
+        print_gl_string (mi->dpy, f, fl,
+                         mi->xgwa.width, mi->xgwa.height,
+                         10, mi->xgwa.height - 10,
+                         label);
       }
     }
   glEndList ();
       }
     }
   glEndList ();
index e6e0644660cbaab296a14ab7cc13b922e8c5217d..46898dd7c31e3784da2d77ca3cc2938e1159767b 100644 (file)
@@ -115,7 +115,7 @@ queens_handle_event (ModeInfo *mi, XEvent *event)
   Queenscreen *c = &qs[MI_SCREEN(mi)];
 
   if (event->xany.type == ButtonPress &&
   Queenscreen *c = &qs[MI_SCREEN(mi)];
 
   if (event->xany.type == ButtonPress &&
-      event->xbutton.button & Button1)
+      event->xbutton.button == Button1)
     {
       c->button_down_p = True;
       gltrackball_start (c->trackball,
     {
       c->button_down_p = True;
       gltrackball_start (c->trackball,
@@ -124,11 +124,19 @@ queens_handle_event (ModeInfo *mi, XEvent *event)
       return True;
     }
   else if (event->xany.type == ButtonRelease &&
       return True;
     }
   else if (event->xany.type == ButtonRelease &&
-           event->xbutton.button & Button1)
+           event->xbutton.button == Button1)
     {
       c->button_down_p = False;
       return True;
     }
     {
       c->button_down_p = False;
       return True;
     }
+  else if (event->xany.type == ButtonPress &&
+           (event->xbutton.button == Button4 ||
+            event->xbutton.button == Button5))
+    {
+      gltrackball_mousewheel (c->trackball, event->xbutton.button, 5,
+                              !event->xbutton.state);
+      return True;
+    }
   else if (event->xany.type == MotionNotify &&
            c->button_down_p)
     {
   else if (event->xany.type == MotionNotify &&
            c->button_down_p)
     {
index 92781504720ccf82ba622a7ec85233fa625ff11c..aee66bb12d77fcbb844f03f12ae413f400cbf1ac 100644 (file)
@@ -458,7 +458,7 @@ gasket_handle_event (ModeInfo *mi, XEvent *event)
   gasketstruct *gp = &gasket[MI_SCREEN(mi)];
 
   if (event->xany.type == ButtonPress &&
   gasketstruct *gp = &gasket[MI_SCREEN(mi)];
 
   if (event->xany.type == ButtonPress &&
-      event->xbutton.button & Button1)
+      event->xbutton.button == Button1)
     {
       gp->button_down_p = True;
       gltrackball_start (gp->trackball,
     {
       gp->button_down_p = True;
       gltrackball_start (gp->trackball,
@@ -467,11 +467,19 @@ gasket_handle_event (ModeInfo *mi, XEvent *event)
       return True;
     }
   else if (event->xany.type == ButtonRelease &&
       return True;
     }
   else if (event->xany.type == ButtonRelease &&
-           event->xbutton.button & Button1)
+           event->xbutton.button == Button1)
     {
       gp->button_down_p = False;
       return True;
     }
     {
       gp->button_down_p = False;
       return True;
     }
+  else if (event->xany.type == ButtonPress &&
+           (event->xbutton.button == Button4 ||
+            event->xbutton.button == Button5))
+    {
+      gltrackball_mousewheel (gp->trackball, event->xbutton.button, 10,
+                              !!event->xbutton.state);
+      return True;
+    }
   else if (event->xany.type == MotionNotify &&
            gp->button_down_p)
     {
   else if (event->xany.type == MotionNotify &&
            gp->button_down_p)
     {
index 7d074a2dd1fab5152f804952ad0baeb0e185205c..30157710c53bb69ed186116abf1eb6aaf71b28ea 100644 (file)
@@ -97,6 +97,8 @@ extern XtAppContext app;
 #define countof(x) (sizeof((x))/sizeof((*x)))
 
 #include "xlockmore.h"
 #define countof(x) (sizeof((x))/sizeof((*x)))
 
 #include "xlockmore.h"
+#include "glxfonts.h"
+#include "normals.h"
 #include "colors.h"
 #include "rotator.h"
 #include "gltrackball.h"
 #include "colors.h"
 #include "rotator.h"
 #include "gltrackball.h"
@@ -106,10 +108,6 @@ extern XtAppContext app;
 
 #include <GL/glu.h>
 
 
 #include <GL/glu.h>
 
-typedef struct {
-   double x,y,z;
-} XYZ;
-
 typedef struct {
   GLXContext *glx_context;
   rotator *rot;
 typedef struct {
   GLXContext *glx_context;
   rotator *rot;
@@ -134,6 +132,7 @@ typedef struct {
 
   XFontStruct *font;
   GLuint font_list;
 
   XFontStruct *font;
   GLuint font_list;
+  int change_tick;
 
 } spheremonics_configuration;
 
 
 } spheremonics_configuration;
 
@@ -265,46 +264,6 @@ sphere_eval (double theta, double phi, int *m)
 }
 
 
 }
 
 
-/* Normalise a vector */
-static void
-normalize (XYZ *p)
-{
-  double length;
-  length = sqrt(p->x * p->x + p->y * p->y + p->z * p->z);
-  if (length != 0) {
-    p->x /= length;
-    p->y /= length;
-    p->z /= length;
-  } else {
-    p->x = 0;
-    p->y = 0;
-    p->z = 0;
-  }       
-}
-
-/*-------------------------------------------------------------------------
-        Calculate the unit normal at p given two other points 
-        p1,p2 on the surface. The normal points in the direction 
-        of p1 crossproduct p2
- */
-static XYZ
-calc_normal (XYZ p, XYZ p1, XYZ p2)
-{
-  XYZ n, pa, pb;
-  pa.x = p1.x - p.x;
-  pa.y = p1.y - p.y;
-  pa.z = p1.z - p.z;
-  pb.x = p2.x - p.x;
-  pb.y = p2.y - p.y;
-  pb.z = p2.z - p.z;
-  n.x = pa.y * pb.z - pa.z * pb.y;
-  n.y = pa.z * pb.x - pa.x * pb.z;
-  n.z = pa.x * pb.y - pa.y * pb.x;
-  normalize (&n);
-  return (n);
-}
-
-
 static void
 do_color (int i, XColor *colors)
 {
 static void
 do_color (int i, XColor *colors)
 {
@@ -736,66 +695,6 @@ generate_spheremonics (ModeInfo *mi)
 }
 
 
 }
 
 
-\f
-
-static void
-load_font (ModeInfo *mi, char *res, XFontStruct **fontP, GLuint *dlistP)
-{
-  const char *font = get_string_resource (res, "Font");
-  XFontStruct *f;
-  Font id;
-  int first, last;
-
-  if (!font) font = "-*-times-bold-r-normal-*-140-*";
-
-  f = XLoadQueryFont(mi->dpy, font);
-  if (!f) f = XLoadQueryFont(mi->dpy, "fixed");
-
-  id = f->fid;
-  first = f->min_char_or_byte2;
-  last = f->max_char_or_byte2;
-  
-  clear_gl_error ();
-  *dlistP = glGenLists ((GLuint) last+1);
-  check_gl_error ("glGenLists");
-  glXUseXFont(id, first, last-first+1, *dlistP + first);
-  check_gl_error ("glXUseXFont");
-
-  *fontP = f;
-}
-
-static void
-draw_label (ModeInfo *mi, const char *s)
-{
-  spheremonics_configuration *cc = &ccs[MI_SCREEN(mi)];
-  unsigned int i;
-  
-  glPushAttrib(GL_TRANSFORM_BIT | GL_ENABLE_BIT);
-  glDisable(GL_LIGHTING);
-  glDisable(GL_DEPTH_TEST);
-  glMatrixMode(GL_PROJECTION);
-  glPushMatrix();
-  glLoadIdentity();
-  glMatrixMode(GL_MODELVIEW);
-  glPushMatrix();
-  glLoadIdentity();
-  gluOrtho2D(0, mi->xgwa.width, 0, mi->xgwa.height);
-  glColor3f(1.0, 1.0, 0.0);
-
-  glRasterPos2f (10,
-                 (mi->xgwa.height
-                  - 10
-                  - (cc->font->ascent + cc->font->descent)));
-  for (i = 0; i < strlen(s); i++)
-    glCallList (cc->font_list + (int)s[i]);
-
-  glPopMatrix();
-  glMatrixMode(GL_PROJECTION);
-  glPopMatrix();
-  glPopAttrib();
-}
-
-
 \f
 
 void 
 \f
 
 void 
@@ -864,7 +763,7 @@ init_spheremonics (ModeInfo *mi)
 
   cc->resolution = res;
 
 
   cc->resolution = res;
 
-  load_font (mi, "labelfont", &cc->font, &cc->font_list);
+  load_font (mi->dpy, "labelfont", &cc->font, &cc->font_list);
 
   cc->dlist = glGenLists(1);
   cc->dlist2 = glGenLists(1);
 
   cc->dlist = glGenLists(1);
   cc->dlist2 = glGenLists(1);
@@ -890,7 +789,7 @@ spheremonics_handle_event (ModeInfo *mi, XEvent *event)
   spheremonics_configuration *cc = &ccs[MI_SCREEN(mi)];
 
   if (event->xany.type == ButtonPress &&
   spheremonics_configuration *cc = &ccs[MI_SCREEN(mi)];
 
   if (event->xany.type == ButtonPress &&
-      event->xbutton.button & Button1)
+      event->xbutton.button == Button1)
     {
       cc->button_down_p = True;
       gltrackball_start (cc->trackball,
     {
       cc->button_down_p = True;
       gltrackball_start (cc->trackball,
@@ -899,11 +798,31 @@ spheremonics_handle_event (ModeInfo *mi, XEvent *event)
       return True;
     }
   else if (event->xany.type == ButtonRelease &&
       return True;
     }
   else if (event->xany.type == ButtonRelease &&
-           event->xbutton.button & Button1)
+           event->xbutton.button == Button1)
     {
       cc->button_down_p = False;
       return True;
     }
     {
       cc->button_down_p = False;
       return True;
     }
+  else if (event->xany.type == ButtonPress &&
+           (event->xbutton.button == Button4 ||
+            event->xbutton.button == Button5))
+    {
+      gltrackball_mousewheel (cc->trackball, event->xbutton.button, 10,
+                              !!event->xbutton.state);
+      return True;
+    }
+  else if (event->xany.type == KeyPress)
+    {
+      KeySym keysym;
+      char c = 0;
+      XLookupString (&event->xkey, &c, 1, &keysym, 0);
+
+      if (c == ' ' || c == '\t' || c == '\r' || c == '\n')
+        {
+          cc->change_tick = duration;
+          return True;
+        }
+    }
   else if (event->xany.type == MotionNotify &&
            cc->button_down_p)
     {
   else if (event->xany.type == MotionNotify &&
            cc->button_down_p)
     {
@@ -978,16 +897,20 @@ draw_spheremonics (ModeInfo *mi)
                 : "%d %d %d %d %d %d %d %d"),
                cc->m[0], cc->m[1], cc->m[2], cc->m[3],
                cc->m[4], cc->m[5], cc->m[6], cc->m[7]);
                 : "%d %d %d %d %d %d %d %d"),
                cc->m[0], cc->m[1], cc->m[2], cc->m[3],
                cc->m[4], cc->m[5], cc->m[6], cc->m[7]);
-      draw_label (mi, buf);
+
+      glColor3f(1.0, 1.0, 0.0);
+      print_gl_string (mi->dpy, cc->font, cc->font_list,
+                       mi->xgwa.width, mi->xgwa.height,
+                       10, mi->xgwa.height - 10,
+                       buf);
     }
 
   if (!static_parms)
     {
     }
 
   if (!static_parms)
     {
-      static int tick = 0;
-      if (tick++ >= duration && !cc->button_down_p)
+      if (cc->change_tick++ >= duration && !cc->button_down_p)
         {
           generate_spheremonics(mi);
         {
           generate_spheremonics(mi);
-          tick = 0;
+          cc->change_tick = 0;
           cc->mesher = -1;  /* turn off the mesh when switching objects */
         }
     }
           cc->mesher = -1;  /* turn off the mesh when switching objects */
         }
     }
index 60f766a72514e576e63a11aa105901f098e0dc79..3277df5e08108e318c2ebe43c3acf3eeb1a47d73 100644 (file)
@@ -1,5 +1,5 @@
 /*
 /*
- * starwars, Copyright (c) 1998-2001, 2004 Jamie Zawinski <jwz@jwz.org> and
+ * starwars, Copyright (c) 1998-2005 Jamie Zawinski <jwz@jwz.org> and
  * Claudio Matsuoka <claudio@helllabs.org>
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
  * Claudio Matsuoka <claudio@helllabs.org>
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
  * implied warranty.
  *
  * Star Wars -- Phosphor meets a well-known scroller from a galaxy far,
  * implied warranty.
  *
  * Star Wars -- Phosphor meets a well-known scroller from a galaxy far,
- *           far away. Hacked by Claudio Matsuoka. Includes portions of
- *           mjk's GLUT library, Copyright (c) 1994, 1995, 1996 by Mark J.
- *           Kilgard. Roman simplex stroke font Copyright (c) 1989, 1990,
- *           1991 by Sun Microsystems, Inc. and the X Consortium.
+ *           far away.
  *
  *
- *      Notes:
- *         - I tried texturized fonts but the roman simplex stroke font
- *           was the most readable for the 80-column text from fortune.
- *         - The proportional font is bad for text from ps(1) or w(1).
- *         - Apparently the RIVA TNT cards for PCs don't like the stars to
- *           be drawn in orthogonal perspective, causing unnecessary system
- *           load.
- *
- *      History:
- *           20000221 claudio   First version
- *           20010124 jwz       Rewrote large sections to add the ability to
+ * Feb 2000 Claudio Matsuoka    First version.
+ * Jan 2001 Jamie Zawinski      Rewrote large sections to add the ability to
  *                              run a subprocess, customization of the font
  *                              size and other parameters, etc.
  *                              run a subprocess, customization of the font
  *                              size and other parameters, etc.
- *           20010224 jepler@mail.inetnebr.com  made the lines be anti-aliased,
- *                              made the text fade to black at the end.
+ * Feb 2001 jepler@inetnebr.com Added anti-aliased lines, and fade-to-black.
+ * Feb 2005 Jamie Zawinski      Added texture fonts.
+ *
+ *
+ * For the fanboys:
+ *
+ *     starwars -program 'cat starwars.txt' -columns 25 -no-wrap -texture
  */
 
 #include <X11/Intrinsic.h>
  */
 
 #include <X11/Intrinsic.h>
@@ -54,31 +47,39 @@ extern XtAppContext app;
 #define DEF_SMOOTH     "True"
 #define DEF_THICK      "True"
 #define DEF_FADE       "True"
 #define DEF_SMOOTH     "True"
 #define DEF_THICK      "True"
 #define DEF_FADE       "True"
+#define DEF_TEXTURES   "True"
+#define DEF_DEBUG      "False"
 
 
-#define TAB_WIDTH        8
+/* Utopia 480 needs a 2048x2048 texture.
+   Utopia 400 needs a 1024x1024 texture.
+   Utopia 180 needs a 512x512 texture.
+   Times 240 needs a 512x512 texture.
+ */
+#define DEF_FONT       "-*-utopia-bold-r-normal-*-*-400-*-*-*-*-iso8859-1"
 
 
-#define BASE_FONT_SIZE    18 /* magic */
-#define BASE_FONT_COLUMNS 80 /* magic */
+#define TAB_WIDTH        8
 
 #define MAX_THICK_LINES   25
 #define FONT_WEIGHT       14
 #define KEEP_ASPECT
 
 #define MAX_THICK_LINES   25
 #define FONT_WEIGHT       14
 #define KEEP_ASPECT
-#undef DEBUG
-
-#define DEFAULTS       "*delay:        40000 \n"                    \
-                       "*showFPS:      False \n"                    \
-                       "*fpsTop:       True \n"                     \
-                       "*program:      " DEF_PROGRAM           "\n" \
-                       "*lines:        " DEF_LINES             "\n" \
-                       "*spin:         " DEF_SPIN              "\n" \
-                       "*steps:        " DEF_STEPS             "\n" \
-                        "*smooth:       " DEF_SMOOTH            "\n" \
-                        "*thick:        " DEF_THICK             "\n" \
-                        "*fade:         " DEF_FADE              "\n" \
-                       "*starwars.fontSize: " DEF_FONT_SIZE    "\n" \
-                       "*starwars.columns:  " DEF_COLUMNS      "\n" \
-                       "*starwars.lineWrap: " DEF_WRAP         "\n" \
-                       "*starwars.alignment:" DEF_ALIGN        "\n"
+
+#define DEFAULTS "*delay:        40000 \n"                  \
+                "*showFPS:       False \n"                  \
+                "*fpsTop:        True \n"                   \
+                "*program:     " DEF_PROGRAM           "\n" \
+                "*lines:       " DEF_LINES             "\n" \
+                "*spin:        " DEF_SPIN              "\n" \
+                "*steps:       " DEF_STEPS             "\n" \
+                "*smooth:      " DEF_SMOOTH            "\n" \
+                "*thick:       " DEF_THICK             "\n" \
+                "*fade:        " DEF_FADE              "\n" \
+                "*textures:    " DEF_TEXTURES          "\n" \
+                "*fontSize:    " DEF_FONT_SIZE         "\n" \
+                "*columns:     " DEF_COLUMNS           "\n" \
+                "*lineWrap:    " DEF_WRAP              "\n" \
+                "*alignment:   " DEF_ALIGN             "\n" \
+                "*font:        " DEF_FONT              "\n" \
+                "*debug:       " DEF_DEBUG             "\n" \
 
 #undef countof
 #define countof(x) (sizeof((x))/sizeof((*x)))
 
 #undef countof
 #define countof(x) (sizeof((x))/sizeof((*x)))
@@ -90,6 +91,7 @@ extern XtAppContext app;
 #include <ctype.h>
 #include <GL/glu.h>
 #include <sys/stat.h>
 #include <ctype.h>
 #include <GL/glu.h>
 #include <sys/stat.h>
+#include "texfont.h"
 #include "glutstroke.h"
 #include "glut_roman.h"
 #define GLUT_FONT (&glutStrokeRoman)
 #include "glutstroke.h"
 #include "glut_roman.h"
 #define GLUT_FONT (&glutStrokeRoman)
@@ -103,6 +105,8 @@ typedef struct {
   GLXContext *glx_context;
 
   GLuint text_list, star_list;
   GLXContext *glx_context;
 
   GLuint text_list, star_list;
+  texture_font_data *texfont;
+  int polygon_count;
 
   FILE *pipe;
   XtInputId pipe_id;
 
   FILE *pipe;
   XtInputId pipe_id;
@@ -112,14 +116,15 @@ typedef struct {
   int buf_tail;
   char **lines;
   int total_lines;
   int buf_tail;
   char **lines;
   int total_lines;
-  int columns;
 
   double star_theta;
 
   double star_theta;
+  double char_width;
   double line_height;
   double font_scale;
   double intra_line_scroll;
 
   double line_height;
   double font_scale;
   double intra_line_scroll;
 
-  int line_pixel_height;
+  int line_pixel_width;   /* in font units (for wrapping text) */
+  int line_pixel_height;  /* in screen units (for computing line thickness) */
   GLfloat line_thickness;
 
 } sws_configuration;
   GLfloat line_thickness;
 
 } sws_configuration;
@@ -137,42 +142,50 @@ static int wrap_p;
 static int smooth_p;
 static int thick_p;
 static int fade_p;
 static int smooth_p;
 static int thick_p;
 static int fade_p;
+static int textures_p;
+static int debug_p;
 static char *alignment_str;
 static int alignment;
 
 static XrmOptionDescRec opts[] = {
 static char *alignment_str;
 static int alignment;
 
 static XrmOptionDescRec opts[] = {
-  {"-program",   ".starwars.program",  XrmoptionSepArg, 0 },
-  {"-lines",     ".starwars.lines",    XrmoptionSepArg, 0 },
-  {"-steps",     ".starwars.steps",    XrmoptionSepArg, 0 },
-  {"-spin",      ".starwars.spin",     XrmoptionSepArg, 0 },
-  {"-size",     ".starwars.fontSize", XrmoptionSepArg, 0 },
-  {"-columns",  ".starwars.columns",  XrmoptionSepArg, 0 },
-  {"-smooth",    ".starwars.smooth",   XrmoptionNoArg,  "True" },
-  {"-no-smooth", ".starwars.smooth",   XrmoptionNoArg,  "False" },
-  {"-thick",     ".starwars.thick",    XrmoptionNoArg,  "True" },
-  {"-no-thick",  ".starwars.thick",    XrmoptionNoArg,  "False" },
-  {"-fade",      ".starwars.fade",     XrmoptionNoArg,  "True" },
-  {"-no-fade",   ".starwars.fade",     XrmoptionNoArg,  "False" },
-  {"-wrap",     ".starwars.lineWrap", XrmoptionNoArg,  "True" },
-  {"-no-wrap",  ".starwars.lineWrap", XrmoptionNoArg,  "False" },
-  {"-nowrap",   ".starwars.lineWrap", XrmoptionNoArg,  "False" },
-  {"-left",      ".starwars.alignment",XrmoptionNoArg,  "Left" },
-  {"-right",     ".starwars.alignment",XrmoptionNoArg,  "Right" },
-  {"-center",    ".starwars.alignment",XrmoptionNoArg,  "Center" },
+  {"-program",     ".program",   XrmoptionSepArg, 0 },
+  {"-lines",       ".lines",     XrmoptionSepArg, 0 },
+  {"-steps",       ".steps",     XrmoptionSepArg, 0 },
+  {"-spin",        ".spin",      XrmoptionSepArg, 0 },
+  {"-size",       ".fontSize",  XrmoptionSepArg, 0 },
+  {"-columns",    ".columns",   XrmoptionSepArg, 0 },
+  {"-font",        ".font",      XrmoptionSepArg, 0 },
+  {"-fade",        ".fade",      XrmoptionNoArg,  "True"   },
+  {"-no-fade",     ".fade",      XrmoptionNoArg,  "False"  },
+  {"-textures",    ".textures",  XrmoptionNoArg,  "True"   },
+  {"-smooth",      ".smooth",    XrmoptionNoArg,  "True"   },
+  {"-no-smooth",   ".smooth",    XrmoptionNoArg,  "False"  },
+  {"-thick",       ".thick",     XrmoptionNoArg,  "True"   },
+  {"-no-thick",    ".thick",     XrmoptionNoArg,  "False"  },
+  {"-no-textures", ".textures",  XrmoptionNoArg,  "False"  },
+  {"-wrap",       ".lineWrap",  XrmoptionNoArg,  "True"   },
+  {"-no-wrap",    ".lineWrap",  XrmoptionNoArg,  "False"  },
+  {"-nowrap",     ".lineWrap",  XrmoptionNoArg,  "False"  },
+  {"-left",        ".alignment", XrmoptionNoArg,  "Left"   },
+  {"-right",       ".alignment", XrmoptionNoArg,  "Right"  },
+  {"-center",      ".alignment", XrmoptionNoArg,  "Center" },
+  {"-debug",       ".debug",     XrmoptionNoArg,  "True"   },
 };
 
 static argtype vars[] = {
 };
 
 static argtype vars[] = {
-  {&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},
+  {&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_FONT_SIZE, t_Float},
+  {&target_columns, "columns",   "Integer",    DEF_COLUMNS,   t_Int},
+  {&wrap_p,         "lineWrap",  "Boolean",    DEF_WRAP,      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},
+  {&textures_p,     "textures",  "Boolean",    DEF_TEXTURES,  t_Bool},
+  {&debug_p,        "debug",     "Boolean",    DEF_DEBUG,     t_Bool},
 };
 
 ModeSpecOpt sws_opts = {countof(opts), opts, countof(vars), vars, NULL};
 };
 
 ModeSpecOpt sws_opts = {countof(opts), opts, countof(vars), vars, NULL};
@@ -408,23 +421,52 @@ drain_input (sws_configuration *sc)
 }
 
 
 }
 
 
+static int
+string_width (sws_configuration *sc, const char *s)
+{
+  if (textures_p)
+    return texture_string_width (sc->texfont, s, 0);
+  else
+    return glutStrokeLength (GLUT_FONT, (unsigned char *) s);
+}
+
+static int
+char_width (sws_configuration *sc, char c)
+{
+  char s[2];
+  s[0] = c;
+  s[1] = 0;
+  return string_width (sc, s);
+}
+
+
 /* Populates the sc->lines list with as many lines as are currently in
    sc->buf (which was filled by drain_input().
  */
 static void
 get_more_lines (sws_configuration *sc)
 {
 /* Populates the sc->lines list with as many lines as are currently in
    sc->buf (which was filled by drain_input().
  */
 static void
 get_more_lines (sws_configuration *sc)
 {
+  /* wrap anyway, if it's absurdly long. */
+  int wrap_pix = (wrap_p ? sc->line_pixel_width : 10000);
+  
   int col = 0;
   int col = 0;
+  int col_pix = 0;
+
   char *s = sc->buf;
   while (sc->total_lines < max_lines)
     {
   char *s = sc->buf;
   while (sc->total_lines < max_lines)
     {
+      int cw;
+
       if (s >= sc->buf + sc->buf_tail)
         {
           /* Reached end of buffer before end of line.  Bail. */
           return;
         }
 
       if (s >= sc->buf + sc->buf_tail)
         {
           /* Reached end of buffer before end of line.  Bail. */
           return;
         }
 
-      if (*s == '\r' || *s == '\n' || col > sc->columns)
+      cw = char_width (sc, *s);
+
+      if (*s == '\r' || *s == '\n' ||
+          col_pix + cw >= wrap_pix)
         {
           int L = s - sc->buf;
 
         {
           int L = s - sc->buf;
 
@@ -453,7 +495,9 @@ get_more_lines (sws_configuration *sc)
           sc->lines[sc->total_lines] = (char *) malloc (L+1);
           memcpy (sc->lines[sc->total_lines], sc->buf, L);
           sc->lines[sc->total_lines][L] = 0;
           sc->lines[sc->total_lines] = (char *) malloc (L+1);
           memcpy (sc->lines[sc->total_lines], sc->buf, L);
           sc->lines[sc->total_lines][L] = 0;
-          latin1_to_ascii (sc->lines[sc->total_lines]);
+
+          if (!textures_p)
+            latin1_to_ascii (sc->lines[sc->total_lines]);
 
           {
             char *t = sc->lines[sc->total_lines];
 
           {
             char *t = sc->lines[sc->total_lines];
@@ -481,12 +525,18 @@ get_more_lines (sws_configuration *sc)
           sc->buf[sc->buf_tail] = 0;
           s = sc->buf;
           col = 0;
           sc->buf[sc->buf_tail] = 0;
           s = sc->buf;
           col = 0;
+          col_pix = 0;
         }
       else
         {
           col++;
         }
       else
         {
           col++;
+          col_pix += cw;
           if (*s == '\t')
           if (*s == '\t')
-            col = TAB_WIDTH * ((col / TAB_WIDTH) + 1);
+            {
+              int tab_pix = TAB_WIDTH * sc->char_width;
+              col     = TAB_WIDTH * ((col / TAB_WIDTH) + 1);
+              col_pix = tab_pix   * ((col / tab_pix)   + 1);
+            }
           s++;
         }
     }
           s++;
         }
     }
@@ -494,24 +544,55 @@ get_more_lines (sws_configuration *sc)
 
 
 static void
 
 
 static void
-draw_string (int x, int y, const char *s)
+draw_string (sws_configuration *sc, GLfloat x, GLfloat y, const char *s)
 {
 {
+  const char *os = s;
   if (!s || !*s) return;
   glPushMatrix ();
   glTranslatef (x, y, 0);
 
   if (!s || !*s) return;
   glPushMatrix ();
   glTranslatef (x, y, 0);
 
-  while (*s)
-    glutStrokeCharacter (GLUT_FONT, *s++);
+  if (textures_p)
+    print_texture_string (sc->texfont, s);
+  else
+    while (*s)
+      glutStrokeCharacter (GLUT_FONT, *s++);
   glPopMatrix ();
   glPopMatrix ();
+
+  if (debug_p)
+    {
+      GLfloat w;
+      GLfloat h = sc->line_height / sc->font_scale;
+      char c[2];
+      c[1]=0;
+      s = os;
+      if (textures_p) glDisable (GL_TEXTURE_2D);
+      glLineWidth (1);
+      glColor3f (0.4, 0.4, 0.4);
+      glPushMatrix ();
+      glTranslatef (x, y, 0);
+      while (*s)
+        {
+          *c = *s++;
+          w = string_width (sc, c);
+          glBegin (GL_LINE_LOOP);
+          glVertex3f (0, 0, 0);
+          glVertex3f (w, 0, 0);
+          glVertex3f (w, h, 0);
+          glVertex3f (0, h, 0);
+          glEnd();
+          glTranslatef (w, 0, 0);
+        }
+      glPopMatrix ();
+      if (textures_p) glEnable (GL_TEXTURE_2D);
+    }
 }
 
 
 }
 
 
-#ifdef DEBUG
 static void
 static void
-grid (double width, double height, double spacing, double z)
+grid (double width, double height, double xspacing, double yspacing, double z)
 {
   double x, y;
 {
   double x, y;
-  for (y = 0; y <= height/2; y += spacing)
+  for (y = 0; y <= height/2; y += yspacing)
     {
       glBegin(GL_LINES);
       glVertex3f(-width/2,  y, z);
     {
       glBegin(GL_LINES);
       glVertex3f(-width/2,  y, z);
@@ -520,7 +601,7 @@ grid (double width, double height, double spacing, double z)
       glVertex3f( width/2, -y, z);
       glEnd();
     }
       glVertex3f( width/2, -y, z);
       glEnd();
     }
-  for (x = 0; x <= width/2; x += spacing)
+  for (x = 0; x <= width/2; x += xspacing)
     {
       glBegin(GL_LINES);
       glVertex3f( x, -height/2, z);
     {
       glBegin(GL_LINES);
       glVertex3f( x, -height/2, z);
@@ -581,7 +662,6 @@ box (double width, double height, double depth)
   glVertex3f( width/2,   height/2, -depth/2);
   glEnd();
 }
   glVertex3f( width/2,   height/2, -depth/2);
   glEnd();
 }
-#endif /* DEBUG */
 
 
 /* Construct stars (number of stars is dependent on size of screen) */
 
 
 /* Construct stars (number of stars is dependent on size of screen) */
@@ -590,7 +670,8 @@ init_stars (ModeInfo *mi, int width, int height)
 {
   sws_configuration *sc = &scs[MI_SCREEN(mi)];
   int i, j;
 {
   sws_configuration *sc = &scs[MI_SCREEN(mi)];
   int i, j;
-  int nstars = width * height / 320;
+  int size = (width > height ? width : height);
+  int nstars = size * size / 320;
   int max_size = 3;
   GLfloat inc = 0.5;
   int steps = max_size / inc;
   int max_size = 3;
   GLfloat inc = 0.5;
   int steps = max_size / inc;
@@ -610,8 +691,8 @@ init_stars (ModeInfo *mi, int width, int height)
           glColor3f (0.6 + frand(0.3),
                      0.6 + frand(0.3),
                      0.6 + frand(0.3));
           glColor3f (0.6 + frand(0.3),
                      0.6 + frand(0.3),
                      0.6 + frand(0.3));
-          glVertex2f (2 * width  * (0.5 - frand(1.0)),
-                      2 * height * (0.5 - frand(1.0)));
+          glVertex2f (2 * size * (0.5 - frand(1.0)),
+                      2 * size * (0.5 - frand(1.0)));
         }
       glEnd ();
     }
         }
       glEnd ();
     }
@@ -632,22 +713,34 @@ reshape_sws (ModeInfo *mi, int width, int height)
     GLfloat desired_aspect = (GLfloat) 3/4;
     int w = mi->xgwa.width;
     int h = mi->xgwa.height;
     GLfloat desired_aspect = (GLfloat) 3/4;
     int w = mi->xgwa.width;
     int h = mi->xgwa.height;
+    int yoff = 0;
 
 #ifdef KEEP_ASPECT
 
 #ifdef KEEP_ASPECT
-    h = w * desired_aspect;
+    {
+      int h2 = w * desired_aspect;
+      yoff = (h - h2) / 2;      /* Wide window: letterbox at top and bottom. */
+      if (yoff < 0) yoff = 0;   /* Tall window: clip off the top. */
+      h = h2;
+    }
 #endif
 
     glMatrixMode (GL_PROJECTION);
 #endif
 
     glMatrixMode (GL_PROJECTION);
-    glViewport (0, 0, w, h);
+    glViewport (0, yoff, w, h);
 
     glMatrixMode (GL_MODELVIEW);
     glLoadIdentity ();
 
     glMatrixMode (GL_MODELVIEW);
     glLoadIdentity ();
-    gluPerspective (80.0, 1/desired_aspect, 10, 500000);
+    gluPerspective (80.0, 1/desired_aspect, 1000, 55000);
     gluLookAt (0.0, 0.0, 4600.0,
                0.0, 0.0, 0.0,
                0.0, 1.0, 0.0);
     glRotatef (-60.0, 1.0, 0.0, 0.0);
 
     gluLookAt (0.0, 0.0, 4600.0,
                0.0, 0.0, 0.0,
                0.0, 1.0, 0.0);
     glRotatef (-60.0, 1.0, 0.0, 0.0);
 
+#if 0
+    glRotatef (60.0, 1.0, 0.0, 0.0);
+    glTranslatef (260, 3200, 0);
+    glScalef (1.85, 1.85, 1);
+#endif
+
     /* The above gives us an arena where the bottom edge of the screen is
        represented by the line (-2100,-3140,0) - ( 2100,-3140,0). */
 
     /* The above gives us an arena where the bottom edge of the screen is
        represented by the line (-2100,-3140,0) - ( 2100,-3140,0). */
 
@@ -698,7 +791,7 @@ gl_init (ModeInfo *mi)
   glDisable (GL_LIGHTING);
   glDisable (GL_DEPTH_TEST);
 
   glDisable (GL_LIGHTING);
   glDisable (GL_DEPTH_TEST);
 
-  if (smooth_p) 
+  if (smooth_p)
     {
       glEnable (GL_LINE_SMOOTH);
       glHint (GL_LINE_SMOOTH_HINT, GL_NICEST);
     {
       glEnable (GL_LINE_SMOOTH);
       glHint (GL_LINE_SMOOTH_HINT, GL_NICEST);
@@ -745,26 +838,50 @@ init_sws (ModeInfo *mi)
     init_stars (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
   }
 
     init_stars (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
   }
 
-
-  font_height = GLUT_FONT->top - GLUT_FONT->bottom;
-  sc->font_scale = 1.0 / glutStrokeWidth (GLUT_FONT, 'z');   /* 'n' seems
-                                                                too wide */
-  if (target_columns > 0)
+  if (textures_p)
     {
     {
-      sc->columns = target_columns;
+      int cw, lh;
+      sc->texfont = load_texture_font (MI_DISPLAY(mi), "font");
+      cw = texture_string_width (sc->texfont, "n", &lh);
+      sc->char_width = cw;
+      font_height = lh;
+      glEnable(GL_ALPHA_TEST);
+      glEnable (GL_TEXTURE_2D);
     }
   else
     {
     }
   else
     {
-      if (font_size <= 0)
-        font_size = BASE_FONT_SIZE;
-      sc->columns = BASE_FONT_COLUMNS * ((double) BASE_FONT_SIZE / font_size);
+      font_height = GLUT_FONT->top - GLUT_FONT->bottom;
+      sc->char_width = glutStrokeWidth (GLUT_FONT, 'z'); /* 'n' seems wide */
     }
     }
+  
+  sc->font_scale = 1.0 / sc->char_width;
 
 
-  sc->font_scale /= sc->columns;
-  sc->line_height = font_height * sc->font_scale;
 
 
+  /* We consider a font that consumes 80 columns to be "18 points".
+
+     If neither -size nor -columns was specified, default to 60 columns
+     (which is 24 points.)
+
+     If both were specified, -columns has priority.
+   */
+  {
+    int base_col  = 80;
+    int base_size = 18;
+
+    if (target_columns <= 0 && font_size <= 0)
+      target_columns = 60;
+
+    if (target_columns > 0)
+      font_size = base_size * (base_col / (double) target_columns);
+    else if (font_size > 0)
+      target_columns = base_col * (base_size / (double) font_size);
+  }
+
+  sc->line_pixel_width = target_columns * sc->char_width;
+
+  sc->font_scale /= target_columns;
+  sc->line_height = font_height * sc->font_scale;
 
 
-  if (!wrap_p) sc->columns = 1000;  /* wrap anyway, if it's absurdly long. */
 
   sc->subproc_relaunch_delay = 2 * 1000;
   sc->total_lines = max_lines-1;
 
   sc->subproc_relaunch_delay = 2 * 1000;
   sc->total_lines = max_lines-1;
@@ -813,7 +930,9 @@ draw_stars (ModeInfo *mi)
                -0.5 * MI_HEIGHT(mi), 0.5 * MI_HEIGHT(mi),
                -100.0, 100.0);
       glRotatef (sc->star_theta, 0.0, 0.0, 1.0);
                -0.5 * MI_HEIGHT(mi), 0.5 * MI_HEIGHT(mi),
                -100.0, 100.0);
       glRotatef (sc->star_theta, 0.0, 0.0, 1.0);
+      if (textures_p) glDisable (GL_TEXTURE_2D);
       glCallList (sc->star_list);
       glCallList (sc->star_list);
+      if (textures_p) glEnable (GL_TEXTURE_2D);
     }
     glPopMatrix ();
   }
     }
     glPopMatrix ();
   }
@@ -845,21 +964,30 @@ draw_sws (ModeInfo *mi)
   glMatrixMode (GL_MODELVIEW);
   glPushMatrix ();
 
   glMatrixMode (GL_MODELVIEW);
   glPushMatrix ();
 
-#ifdef DEBUG
-  glColor3f (0.4, 0.4, 0.4);
-  glLineWidth (1);
-  glTranslatef(0, 1, 0);
-  box (1, 1, 1);
-  glTranslatef(0, -1, 0);
-  box (1, 1, 1);
-  grid (1, 1, sc->line_height, 0);
-#endif /* DEBUG */
+  if (debug_p)
+    {
+      int i;
+      glPushMatrix ();
+      if (textures_p) glDisable (GL_TEXTURE_2D);
+      glLineWidth (1);
+      glColor3f (0.4, 0.4, 0.4);
+      glTranslatef (0,-1, 0);
+      for (i = 0; i < 16; i++)
+        {
+          box (1, 1, 1);
+          grid (1, 1, sc->char_width * sc->font_scale, sc->line_height, 0);
+          glTranslatef(0, 1, 0);
+        }
+      if (textures_p) glEnable (GL_TEXTURE_2D);
+      glPopMatrix ();
+    }
 
   /* Scroll to current position */
   glTranslatef (0.0, sc->intra_line_scroll, 0.0);
 
   glColor3f (1.0, 1.0, 0.4);
   glCallList (sc->text_list);
 
   /* Scroll to current position */
   glTranslatef (0.0, sc->intra_line_scroll, 0.0);
 
   glColor3f (1.0, 1.0, 0.4);
   glCallList (sc->text_list);
+  mi->polygon_count = sc->polygon_count;
 
   sc->intra_line_scroll += sc->line_height / scroll_steps;
 
 
   sc->intra_line_scroll += sc->line_height / scroll_steps;
 
@@ -891,10 +1019,12 @@ draw_sws (ModeInfo *mi)
       glDeleteLists (sc->text_list, 1);
       sc->text_list = glGenLists (1);
       glNewList (sc->text_list, GL_COMPILE);
       glDeleteLists (sc->text_list, 1);
       sc->text_list = glGenLists (1);
       glNewList (sc->text_list, GL_COMPILE);
+      sc->polygon_count = 0;
       glPushMatrix ();
       glScalef (sc->font_scale, sc->font_scale, sc->font_scale);
       for (i = 0; i < sc->total_lines; i++)
         {
       glPushMatrix ();
       glScalef (sc->font_scale, sc->font_scale, sc->font_scale);
       for (i = 0; i < sc->total_lines; i++)
         {
+          double fade = (fade_p ? 1.0 * i / sc->total_lines : 1.0);
           int offscreen_lines = 3;
 
           double x = -0.5;
           int offscreen_lines = 3;
 
           double x = -0.5;
@@ -902,15 +1032,19 @@ draw_sws (ModeInfo *mi)
                        * sc->line_height);
           double xoff = 0;
           char *line = sc->lines[i];
                        * sc->line_height);
           double xoff = 0;
           char *line = sc->lines[i];
-#ifdef DEBUG
-          char n[20];
-          sprintf(n, "%d:", i);
-          draw_string (x / sc->font_scale, y / sc->font_scale, n);
-#endif /* DEBUG */
+
+          if (debug_p)
+            {
+              double xx = x * 1.4;  /* a little more to the left */
+              char n[20];
+              sprintf(n, "%d:", i);
+              draw_string (sc, xx / sc->font_scale, y / sc->font_scale, n);
+            }
+
           if (!line || !*line)
             continue;
 
           if (!line || !*line)
             continue;
 
-          if (sc->line_thickness != 1)
+          if (sc->line_thickness != 1 && !textures_p)
             {
               int max_thick_lines = MAX_THICK_LINES;
               GLfloat thinnest_line = 1.0;
             {
               int max_thick_lines = MAX_THICK_LINES;
               GLfloat thinnest_line = 1.0;
@@ -931,19 +1065,19 @@ draw_sws (ModeInfo *mi)
             }
 
           if (alignment >= 0)
             }
 
           if (alignment >= 0)
-            xoff = 1.0 - (glutStrokeLength(GLUT_FONT,
-                                           (unsigned char *) line)
-                          * sc->font_scale);
-          if (alignment == 0)
-            xoff /= 2;
-
-          if (fade_p)
             {
             {
-              double factor = 1.0 * i / sc->total_lines;
-              glColor3f (factor, factor, 0.5 * factor);
+              int n = string_width (sc, line);
+              xoff = 1.0 - (n * sc->font_scale);
             }
 
             }
 
-          draw_string ((x + xoff) / sc->font_scale, y / sc->font_scale, line);
+          if (alignment == 0)
+            xoff /= 2;
+
+          glColor3f (fade, fade, 0.5 * fade);
+          draw_string (sc, (x + xoff) / sc->font_scale, y / sc->font_scale,
+                       line);
+          if (textures_p)
+            sc->polygon_count += strlen (line);
         }
       glPopMatrix ();
       glEndList ();
         }
       glPopMatrix ();
       glEndList ();
index 1b93529c77a190486045250cef5f1edc3c1ba499..b5c37c7891cdd534cfa7def4addc93106a7a3ff2 100644 (file)
@@ -17,7 +17,8 @@ starwars - draws a perspective text crawl, like at the beginning of the movie
 .SH SYNOPSIS
 .B starwars
 [\-display \fIhost:display.screen\fP] [\-window] [\-root]
 .SH SYNOPSIS
 .B starwars
 [\-display \fIhost:display.screen\fP] [\-window] [\-root]
-[\-visual \fIvisual\fP] [\-delay \fImicroseconds\fP] [\-fps]
+[\-visual \fIvisual\fP]
+[\-delay \fImicroseconds\fP]
 [\-program \fIcommand\fP]
 [\-size \fIinteger\fP ]
 [\-columns \fIinteger\fP]
 [\-program \fIcommand\fP]
 [\-size \fIinteger\fP ]
 [\-columns \fIinteger\fP]
@@ -27,8 +28,11 @@ starwars - draws a perspective text crawl, like at the beginning of the movie
 [\-spin \fIfloat\fP]
 [\-steps \fIinteger\fP]
 [\-delay \fIusecs\fP]
 [\-spin \fIfloat\fP]
 [\-steps \fIinteger\fP]
 [\-delay \fIusecs\fP]
-[\-no-smooth]
-[\-no-thick]
+[\-font \fIxlfd\fP]
+[\-no\-textures]
+[\-no\-smooth]
+[\-no\-thick]
+[\-fps]
 .SH DESCRIPTION
 The \fIstarwars\fP program runs another program to generate a stream of
 text, then animates that text receeding into the background at an angle,
 .SH DESCRIPTION
 The \fIstarwars\fP program runs another program to generate a stream of
 text, then animates that text receeding into the background at an angle,
@@ -71,23 +75,24 @@ won't.
 
 Some examples:
 .EX
 
 Some examples:
 .EX
-starwars -columns 76 -program 'cat /usr/src/linux*/README'
-starwars -program 'ping www.starwars.com'
-starwars -no-wrap -left -program 'finger @gnu.org'
-starwars -no-wrap -left -program 'ps -ef'
-starwars -no-wrap -left -program 'od -txC /dev/random'
+starwars -program 'cat /usr/src/linux*/README'
+starwars -columns 30 -program 'ping www.starwars.com'
+starwars -left -no-wrap -program 'ps -auxwwf'
+starwars -left -no-wrap -columns 45 -program 'top -bn1'
+starwars -left -columns 40 -program 'od -txC /dev/urandom'
+starwars -font fixed -program 'od -txC /dev/urandom'
 .EE
 .TP 8
 .B \-size \fIinteger\fP
 How large a font to use, in points.  (Well, in some arbitrary unit 
 .EE
 .TP 8
 .B \-size \fIinteger\fP
 How large a font to use, in points.  (Well, in some arbitrary unit 
-we're calling "points" for the sake of argument.)  The \fB\-columns\fP
-option overrides this.
+we're calling "points" for the sake of argument.)  Default: 24.
 .TP 8
 .B \-columns \fIinteger\fP
 How many columns of text should be visible on the bottom line of the
 .TP 8
 .B \-columns \fIinteger\fP
 How many columns of text should be visible on the bottom line of the
-screen.  The default is 80.  This option overrides the \fB\-size\fP
-option: if you specify a number of columns, the font will be scaled
-as needed to fit.
+screen.  Default: 60.
+
+Only one of \fI\-columns\fP and \fI\-size\fP may be specified;
+if both are specified, \fI\-columns\fP takes priority.
 .TP 8
 .B \-wrap
 Word-wrap lines when they reach the rightmost column.  This is the default.
 .TP 8
 .B \-wrap
 Word-wrap lines when they reach the rightmost column.  This is the default.
@@ -114,19 +119,35 @@ If the animation looks jerky to you, increase this number.
 .B \-delay \fIusecs\fP
 The delay between steps of the animation; default is 40000 (1/25th second.)
 .TP 8
 .B \-delay \fIusecs\fP
 The delay between steps of the animation; default is 40000 (1/25th second.)
 .TP 8
-.B \-fps
-Display a running tally of how many frames per second are being rendered.
-In conjunction with \fB\-delay 0\fP, this can be a useful benchmark of 
-your GL performance.
+.B \-font \fIfont-name\fP
+The name of the font to use.  For best effect, this should be a large
+font (at least 36 points.)  The bigger the font, the better looking the
+characters will be.  Note that the size of this font affects only the
+clarity of the characters, not their size on the screen: for that, use
+the \fI\-size\fP or \fI\-columns\fP options.
+
+Default: -*-utopia-bold-r-normal-*-*-400-*-*-*-*-iso8859-1
+.TP 8
+.B \-no\-textures
+Instead of texture-mapping a real font to render the text, use a
+built-in font composed of line segments.  On graphics cards without
+texture support, the line-segment font will have much better
+performance.
 .TP 8
 .B \-no\-smooth
 .TP 8
 .B \-no\-smooth
-Turn off anti-aliasing of the lines used to draw the font.
-This will make the text blockier, but may improve performance.
+When using the line-segment font, turn off anti-aliasing of the lines
+used to draw the font.  This will make the text blockier, but may
+improve performance.
 .TP 8
 .B \-no\-thick
 .TP 8
 .B \-no\-thick
-Turn off use of thick lines for the characters that are close to the
-foreground.  This will make the text appear unnaturally skinny, but 
-may improve performance.
+When using the line-segment font, turn off use of thick lines for the
+characters that are close to the foreground.  This will make the text
+appear unnaturally skinny, but may improve performance.
+.TP 8
+.B \-fps
+Display a running tally of how many frames per second are being rendered.
+In conjunction with \fB\-delay 0\fP, this can be a useful benchmark of 
+your GL performance.
 .SH ENVIRONMENT
 .PP
 .TP 8
 .SH ENVIRONMENT
 .PP
 .TP 8
@@ -149,7 +170,7 @@ stored in the RESOURCE_MANAGER property.
 .BR EtherPEG ,
 .BR EtherPeek
 .SH COPYRIGHT
 .BR EtherPEG ,
 .BR EtherPeek
 .SH COPYRIGHT
-Copyright \(co 1998-2004 by Jamie Zawinski and Claudio Matsuoka.
+Copyright \(co 1998-2005 by Jamie Zawinski and Claudio Matsuoka.
 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
 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/starwars.txt b/hacks/glx/starwars.txt
new file mode 100644 (file)
index 0000000..e056f92
--- /dev/null
@@ -0,0 +1,311 @@
+Episode IV
+
+STAR WARS: A NEW HOPE
+
+It is a period of Civil War.
+Rebel Spaceships, striking
+from a hidden base, have won
+their first victory against
+the evil Galactic Empire.
+
+During the battle, Rebel
+spies managed to steal secret
+plans to the Empire's
+ultimate weapon, the DEATH
+STAR, an armored space
+station with enough power to
+destroy an entire planet.
+
+Pursued by the Empire's
+sinister agents, Princess
+Leia races home aboard her
+starship, custodian of the
+stolen plans that can save
+her people and restore
+freedom to the galaxy...
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Episode V
+
+THE EMPIRE STRIKES BACK
+
+It is a dark time for the
+Rebellion. Although the Death
+Star has been destroyed,
+Imperial troops have driven the
+Rebel forces from their hidden
+base and pursued them across
+the galaxy.
+
+Evading the dreaded Imperial
+Starfleet, a group of freedom
+fighters led by Luke Skywalker
+has established a new secret
+base on the remote ice world
+of Hoth.
+
+The evil lord Darth Vader,
+obsessed with finding young
+Skywalker, has dispatched
+thousands of remote probes into
+the far reaches of space....
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Episode VI
+
+RETURN OF THE JEDI
+
+Luke Skywalker has returned to
+his home planet of Tatooine in
+an attempt to rescue his
+friend Han Solo from the
+clutches of the vile gangster
+Jabba the Hutt.
+
+Little does Luke know that the
+GALACTIC EMPIRE has secretly
+begun construction on a new
+armored space station even
+more powerful than the first
+dreaded Death Star.
+
+When completed, this ultimate
+weapon will spell certain doom
+for the small band of rebels
+struggling to restore freedom
+to the galaxy...
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Episode I
+
+THE PHANTOM MENACE
+
+Turmoil has engulfed the
+Galactic Republic.  The taxation
+of trade routes to outlying star
+systems is in dispute.
+
+Hoping to resolve the matter
+with a blockade of deadly
+battleships, the greedy Trade
+Federation has stopped all
+shipping to the small planet
+of Naboo.
+
+While the Congress of the
+Republic endlessly debates
+this alarming chain of events,
+the Supreme Chancellor has
+secretly dispatched two Jedi
+Knights, the guardians of
+peace and justice in the
+galaxy to settle the conflict...
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Episode II
+
+ATTACK OF THE CLONES
+
+There is unrest in the Galactic
+Senate.  Several thousand solar
+systems have declared their
+intentions to leave the Republic.
+
+This separatist movement,
+under the leadership of the
+mysterious Count Dooku, has
+made it difficult for the limited
+number of Jedi Knights to
+maintain peace and order in the
+galaxy.
+
+Senator Amidala, the former
+Queen of Naboo, is returning
+to the Galactic Senate to vote
+on the critical issue of creating
+an ARMY OF THE REPUBLIC
+to assist the overwhelmed
+Jedi....
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Episode III
+
+REVENGE OF THE SITH
+
+War!  The Republic is crumbling
+under attacks by the ruthless
+Sith Lord, Count Dooku.
+There are heroes on both sides.
+Evil is everywhere.
+
+In a stunning move, the
+fiendish droid leader, General
+Grievous, has swept into the
+Republic capital and kidnapped
+Chancellor Palpatine, leader of
+the Galactic Senate.
+
+As the Separatist Droid Army
+attempts to flee th besieged
+capital with their valuable
+hostage, two Jedi Knights lead a
+desperate mission to rescue the
+captive Chancellor....
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/hacks/glx/texfont.c b/hacks/glx/texfont.c
new file mode 100644 (file)
index 0000000..29cf533
--- /dev/null
@@ -0,0 +1,405 @@
+/* texfonts, Copyright (c) 2005 Jamie Zawinski <jwz@jwz.org>
+ * Loads X11 fonts into textures for use with OpenGL.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation.  No representations are made about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or 
+ * implied warranty.
+ */
+
+
+#include "config.h"
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <ctype.h>
+#include <GL/glx.h>
+#include <GL/glu.h>
+#include "resources.h"
+#include "texfont.h"
+
+/* These are in xlock-gl.c */
+extern void clear_gl_error (void);
+extern void check_gl_error (const char *type);
+
+/* screenhack.h */
+extern char *progname;
+
+struct texture_font_data {
+  Display *dpy;
+  XFontStruct *font;
+  GLuint texid;
+  int cell_width, cell_height;
+  int tex_width, tex_height;
+};
+
+
+/* return the next larger power of 2. */
+static int
+to_pow2 (int i)
+{
+  static unsigned int pow2[] = { 1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024,
+                                 2048, 4096, 8192, 16384, 32768, 65536 };
+  int j;
+  for (j = 0; j < sizeof(pow2)/sizeof(*pow2); j++)
+    if (pow2[j] >= i) return pow2[j];
+  abort();  /* too big! */
+}
+
+
+/* Given a Pixmap of depth 1, converts it to an OpenGL luminance mipmap.
+   The 1 bits are drawn, the 0 bits are alpha.
+   Pass in the size of the pixmap; the size of the texture is returned
+   (it may be larger, since GL like powers of 2.)
+ */
+static void
+bitmap_to_texture (Display *dpy, Pixmap p, int *wP, int *hP)
+{
+  Bool mipmap_p = True;
+  int ow = *wP;
+  int oh = *hP;
+  int w2 = to_pow2 (ow);
+  int h2 = to_pow2 (oh);
+  int x, y;
+  XImage *image = XGetImage (dpy, p, 0, 0, ow, oh, ~0L, XYPixmap);
+  unsigned char *data = (unsigned char *) calloc (w2, (h2 + 1));
+  unsigned char *out = data;
+  GLuint iformat = GL_INTENSITY;
+  GLuint format = GL_LUMINANCE;
+  GLuint type = GL_UNSIGNED_BYTE;
+
+  for (y = 0; y < h2; y++)
+    for (x = 0; x < w2; x++)
+      *out++ = (x >= ow || y >= oh ? 0 :
+                XGetPixel (image, x, y) ? 255 : 0);
+  XDestroyImage (image);
+  image = 0;
+
+  if (mipmap_p)
+    gluBuild2DMipmaps (GL_TEXTURE_2D, iformat, w2, h2, format, type, data);
+  else
+    glTexImage2D (GL_TEXTURE_2D, 0, iformat, w2, h2, 0, format, type, data);
+
+  {
+    char msg[100];
+    sprintf (msg, "%s (%d x %d)",
+             mipmap_p ? "gluBuild2DMipmaps" : "glTexImage2D",
+             w2, h2);
+    check_gl_error (msg);
+  }
+
+
+  glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+  glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
+                   mipmap_p ? GL_LINEAR_MIPMAP_LINEAR : GL_LINEAR);
+
+  glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
+  glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
+
+  free (data);
+
+  *wP = w2;
+  *hP = h2;
+}
+
+
+/* Loads the font named by the X resource "res" and returns
+   a texture-font object.
+*/
+texture_font_data *
+load_texture_font (Display *dpy, char *res)
+{
+  texture_font_data *data = 0;
+  const char *font = get_string_resource (res, "Font");
+  const char *def1 = "-*-times-bold-r-normal-*-240-*";
+  const char *def2 = "-*-times-bold-r-normal-*-180-*";
+  const char *def3 = "fixed";
+  XFontStruct *f;
+
+  if (!res || !*res) abort();
+  if (!font) font = def1;
+
+  f = XLoadQueryFont(dpy, font);
+  if (!f && !!strcmp (font, def1))
+    {
+      fprintf (stderr, "%s: unable to load font \"%s\", using \"%s\"\n",
+               progname, font, def1);
+      font = def1;
+      f = XLoadQueryFont(dpy, font);
+    }
+
+  if (!f && !!strcmp (font, def2))
+    {
+      fprintf (stderr, "%s: unable to load font \"%s\", using \"%s\"\n",
+               progname, font, def2);
+      font = def2;
+      f = XLoadQueryFont(dpy, font);
+    }
+
+  if (!f && !!strcmp (font, def3))
+    {
+      fprintf (stderr, "%s: unable to load font \"%s\", using \"%s\"\n",
+               progname, font, def3);
+      font = def3;
+      f = XLoadQueryFont(dpy, font);
+    }
+
+  if (!f)
+    {
+      fprintf (stderr, "%s: unable to load fallback font \"%s\" either!\n",
+               progname, font);
+      exit (1);
+    }
+
+  data = (texture_font_data *) calloc (1, sizeof(*data));
+  data->dpy = dpy;
+  data->font = f;
+
+  /* Create a pixmap big enough to fit every character in the font.
+     Make it square-ish, since GL likes dimensions to be powers of 2.
+   */
+  {
+    Screen *screen = DefaultScreenOfDisplay (dpy);
+    Window root = RootWindowOfScreen (screen);
+    XGCValues gcv;
+    GC gc;
+    Pixmap p;
+    int cw = f->max_bounds.rbearing - f->min_bounds.lbearing;
+    int ch = f->max_bounds.ascent   + f->max_bounds.descent;
+    int w = cw * 16;
+    int h = ch * 16;
+    int i;
+
+    data->cell_width  = cw;
+    data->cell_height = ch;
+
+    p = XCreatePixmap (dpy, root, w, h, 1);
+    gcv.font = f->fid;
+    gcv.foreground = 0;
+    gcv.background = 0;
+    gc = XCreateGC (dpy, p, (GCFont|GCForeground|GCBackground), &gcv);
+    XFillRectangle (dpy, p, gc, 0, 0, w, h);
+    XSetForeground (dpy, gc, 1);
+    for (i = 0; i < 256; i++)
+      {
+        char c = (char) i;
+        int x = (i % 16) * cw;
+        int y = (i / 16) * ch;
+
+        /* See comment in print_texture_string for bit layout explanation. */
+
+        int lbearing = (f->per_char
+                        ? f->per_char[i - f->min_char_or_byte2].lbearing
+                        : f->min_bounds.lbearing);
+        int ascent   = (f->per_char
+                        ? f->per_char[i - f->min_char_or_byte2].ascent
+                        : f->max_bounds.ascent);
+        int width    = (f->per_char
+                        ? f->per_char[i - f->min_char_or_byte2].width
+                        : f->max_bounds.width);
+
+        if (width == 0) continue;
+        XDrawString (dpy, p, gc, x - lbearing, y + ascent, &c, 1);
+      }
+    XFreeGC (dpy, gc);
+
+    glGenTextures (1, &data->texid);
+    glBindTexture (GL_TEXTURE_2D, data->texid);
+    data->tex_width  = w;
+    data->tex_height = h;
+
+#if 0  /* debugging: splat the bitmap onto the desktop root window */
+    {
+      Window win = RootWindow (dpy, 0);
+      GC gc2 = XCreateGC (dpy, win, 0, &gcv);
+      XSetForeground (dpy, gc2, BlackPixel (dpy, 0));
+      XSetBackground (dpy, gc2, WhitePixel (dpy, 0));
+      XCopyPlane (dpy, p, win, gc2, 0, 0, w, h, 0, 0, 1);
+      XFreeGC (dpy, gc2);
+      XSync(dpy, False);
+    }
+#endif
+
+    bitmap_to_texture (dpy, p, &data->tex_width, &data->tex_height);
+    XFreePixmap (dpy, p);
+  }
+
+  return data;
+}
+
+
+/* Width of the string in pixels.
+ */
+int
+texture_string_width (texture_font_data *data, const char *c,
+                      int *line_height_ret)
+{
+  int w = 0;
+  XFontStruct *f = data->font;
+  while (*c)
+    {
+      int cc = *((unsigned char *) c);
+      w += (f->per_char
+            ? f->per_char[cc-f->min_char_or_byte2].width
+            : f->max_bounds.width);
+      c++;
+    }
+  if (line_height_ret)
+    *line_height_ret = f->ascent + f->descent;
+  return w;
+}
+
+
+/* Draws the string in the scene at the origin.
+   Newlines and tab stops are honored.
+ */
+void
+print_texture_string (texture_font_data *data, const char *string)
+{
+  XFontStruct *f = data->font;
+  GLfloat line_height = f->ascent + f->descent;
+# ifdef DO_SUBSCRIPTS
+  GLfloat sub_shift = (line_height * 0.3);
+  Bool sub_p = False;
+# endif /* DO_SUBSCRIPTS */
+  int cw = texture_string_width (data, "m", 0);
+  int tabs = cw * 7;
+  int x, y;
+  unsigned int i;
+
+  glPushMatrix();
+
+  glBindTexture (GL_TEXTURE_2D, data->texid);
+  glNormal3f (0, 0, 1);
+
+  x = 0;
+  y = 0;
+  for (i = 0; i < strlen(string); i++)
+    {
+      char c = string[i];
+      if (c == '\n')
+        {
+          y -= line_height;
+          x = 0;
+        }
+      else if (c == '\t')
+        {
+          x = ((x + tabs) / tabs) * tabs;  /* tab to tab stop */
+        }
+# ifdef DO_SUBSCRIPTS
+      else if (c == '[' && (isdigit (string[i+1])))
+        {
+          sub_p = True;
+          y -= sub_shift;
+        }
+      else if (c == ']' && sub_p)
+        {
+          sub_p = False;
+          y += sub_shift;
+        }
+# endif /* DO_SUBSCRIPTS */
+      else
+        {
+          /* The texture is divided into 16x16 rectangles whose size are
+             the max_bounds charcell of the font.  Within each rectangle,
+             the individual characters' charcells sit in the upper left.
+
+               [A]----------------------------
+                |     |           |   |      |
+                |   l |         w |   | r    |
+                |   b |         i |   | b    |
+                |   e |         d |   | e    |
+                |   a |         t |   | a    |
+                |   r |         h |   | r    |
+                |   i |           |   | i    |
+                |   n |           |   | n    |
+                |   g |           |   | g    |
+                |     |           |   |      |
+                |----[B]----------|---|      |
+                |     |   ascent  |   |      |
+                |     |           |   |      |
+                |     |           |   |      |
+                |--------------------[C]     |
+                |         descent            |
+                |                            | cell_width,
+                ------------------------------ cell_height
+
+             We want to make a quad from point A to point C.
+             We want to position that quad so that point B lies at x,y.
+           */
+          int lbearing = (f->per_char
+                          ? f->per_char[c - f->min_char_or_byte2].lbearing
+                          : f->min_bounds.lbearing);
+          int rbearing = (f->per_char
+                          ? f->per_char[c - f->min_char_or_byte2].rbearing
+                          : f->max_bounds.rbearing);
+          int ascent   = (f->per_char
+                          ? f->per_char[c - f->min_char_or_byte2].ascent
+                          : f->max_bounds.ascent);
+          int descent  = (f->per_char
+                          ? f->per_char[c - f->min_char_or_byte2].descent
+                          : f->max_bounds.descent);
+          int cwidth   = (f->per_char
+                          ? f->per_char[c - f->min_char_or_byte2].width
+                          : f->max_bounds.width);
+
+          int ax = ((int) c % 16) * data->cell_width;     /* point A */
+          int ay = ((int) c / 16) * data->cell_height;
+
+          int bx = ax - lbearing;                         /* point B */
+          int by = ay + ascent;
+
+          int cx = bx + rbearing;                         /* point C */
+          int cy = by + descent;
+
+          GLfloat tax = (GLfloat) ax / data->tex_width;  /* tex coords of A */
+          GLfloat tay = (GLfloat) ay / data->tex_height;
+
+          GLfloat tcx = (GLfloat) cx / data->tex_width;  /* tex coords of C */
+          GLfloat tcy = (GLfloat) cy / data->tex_height;
+
+          GLfloat qx0 = x + lbearing;                   /* quad top left */
+          GLfloat qy0 = y + ascent;
+          GLfloat qx1 = qx0 + rbearing - lbearing;       /* quad bot right */
+          GLfloat qy1 = qy0 - (ascent + descent);
+
+          if (cwidth > 0 && c != ' ')
+            {
+              glBegin (GL_QUADS);
+              glTexCoord2f (tax, tay); glVertex3f (qx0, qy0, 0);
+              glTexCoord2f (tcx, tay); glVertex3f (qx1, qy0, 0);
+              glTexCoord2f (tcx, tcy); glVertex3f (qx1, qy1, 0);
+              glTexCoord2f (tax, tcy); glVertex3f (qx0, qy1, 0);
+              glEnd();
+#if 0
+              glDisable(GL_TEXTURE_2D);
+              glBegin (GL_LINE_LOOP);
+              glTexCoord2f (tax, tay); glVertex3f (qx0, qy0, 0);
+              glTexCoord2f (tcx, tay); glVertex3f (qx1, qy0, 0);
+              glTexCoord2f (tcx, tcy); glVertex3f (qx1, qy1, 0);
+              glTexCoord2f (tax, tcy); glVertex3f (qx0, qy1, 0);
+              glEnd();
+              glEnable(GL_TEXTURE_2D);
+#endif
+            }
+
+          x += cwidth;
+        }
+      }
+  glPopMatrix();
+}
+
+/* Releases the font and texture.
+ */
+void
+free_texture_font (texture_font_data *data)
+{
+  if (data->font)
+    XFreeFont (data->dpy, data->font);
+  if (data->texid)
+    glDeleteTextures (1, &data->texid);
+  free (data);
+}
diff --git a/hacks/glx/texfont.h b/hacks/glx/texfont.h
new file mode 100644 (file)
index 0000000..05c9219
--- /dev/null
@@ -0,0 +1,37 @@
+/* texfonts, Copyright (c) 2005 Jamie Zawinski <jwz@jwz.org>
+ * Loads X11 fonts into textures for use with OpenGL.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation.  No representations are made about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or 
+ * implied warranty.
+ */
+
+#ifndef __TEXTURE_FONT_H__
+#define __TEXTURE_FONT_H__
+
+typedef struct texture_font_data texture_font_data;
+
+/* Loads the font named by the X resource "res" and returns
+   a texture-font object.
+*/
+extern texture_font_data *load_texture_font (Display *, char *res);
+
+/* Width of the string in pixels.
+ */
+extern int texture_string_width (texture_font_data *, const char *,
+                                 int *line_height_ret);
+
+/* Draws the string in the scene at the origin.
+   Newlines and tab stops are honored.
+ */
+extern void print_texture_string (texture_font_data *, const char *);
+
+/* Releases the texture font.
+ */
+extern void free_texture_font (texture_font_data *);
+
+#endif /* __TEXTURE_FONT_H__ */
index b5a87de2b9be10a9d6c9a72f608c2b9ab974e2b4..7ad335e768f287c54ff6d09e6a99100650a1ab64 100644 (file)
@@ -282,7 +282,7 @@ inline void moverender_rider(Display *dpy, Window window, GC fgc, struct field *
     double cs, cv;
 
     /* add velocity to theta */
     double cs, cv;
 
     /* add velocity to theta */
-    rid->t = fmodf((rid->t + rid->vt + M_PI), (2 * M_PI)) - M_PI;
+    rid->t = fmod((rid->t + rid->vt + M_PI), (2 * M_PI)) - M_PI;
     
     rid->vt += frand(0.002) - 0.001;
 
     
     rid->vt += frand(0.002) - 0.001;
 
index 6c28205f508f841229a2b300704179e4a42b1adc..9d7506db5de793d749d7c95cc3c93928127d6e53 100644 (file)
@@ -1,4 +1,4 @@
-/* xscreensaver, Copyright (c) 1997, 1998, 2001, 2003
+/* xscreensaver, Copyright (c) 1997, 1998, 2001, 2003, 2005
  *  Jamie Zawinski <jwz@jwz.org>
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
  *  Jamie Zawinski <jwz@jwz.org>
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
@@ -150,7 +150,7 @@ read_screen (Display *dpy, Window window, int *widthP, int *heightP)
 
   p = XCreatePixmap(dpy, window, *widthP, *heightP, xgwa.depth);
   XClearWindow(dpy, window);
 
   p = XCreatePixmap(dpy, window, *widthP, *heightP, xgwa.depth);
   XClearWindow(dpy, window);
-  load_random_image (xgwa.screen, window, p, NULL);
+  load_random_image (xgwa.screen, window, p, NULL, NULL);
   XClearWindow(dpy, window);
 
   return p;
   XClearWindow(dpy, window);
 
   return p;
index 3b3773225c684d43cbac415437d86e49c3a10e58..a0943fb21f80ee1498095c01708991e3af56d4d8 100644 (file)
@@ -1,8 +1,9 @@
 /* -*- Mode: C; tab-width: 4 -*- */
 /* juggle */
 
 /* -*- Mode: C; tab-width: 4 -*- */
 /* juggle */
 
-#if 0
-static const char sccsid[] = "@(#)juggle.c     5.00 2000/11/01 xlockmore";
+#if !defined( lint ) && !defined( SABER )
+static const char sccsid[] = "@(#)juggle.c     5.10 2003/09/02 xlockmore";
+
 #endif
 
 /*-
 #endif
 
 /*-
@@ -21,156 +22,251 @@ static const char sccsid[] = "@(#)juggle.c        5.00 2000/11/01 xlockmore";
  * other special, indirect and consequential damages.
  *
  * Revision History
  * other special, indirect and consequential damages.
  *
  * Revision History
+ * 13-Dec-2004: [TDA] Use -cycles and -count in a rational manner.
+ *              Add -rings, -bballs.  Add -describe.  Finally made
+ *              live pattern updates possible.  Add refill_juggle(),
+ *              change_juggle() and reshape_juggle().  Make
+ *              init_juggle() non-destructive.  Reorder erase/draw
+ *              operations.  Update xscreensaver xml and manpage.
+ * 15-Nov-2004: [TDA] Fix all memory leaks.
+ * 12-Nov-2004: [TDA] Add -torches and another new trail
+ *              implementation, so that different objects can have
+ *              different length trails.
+ * 11-Nov-2004: [TDA] Clap when all the balls are in the air.
+ * 10-Nov-2004: [TDA] Display pattern name converted to hight
+ *              notation.
+ * 31-Oct-2004: [TDA] Add -clubs and new trail implementation.
+ * 02-Sep-2003: Non-real time to see what is happening without a
+ *              strobe effect for slow machines.
  * 01-Nov-2000: Allocation checks
  * 1996: Written
  */
 
 /*-
  * TODO
  * 01-Nov-2000: Allocation checks
  * 1996: Written
  */
 
 /*-
  * TODO
- * Fix timing to run at approx same speed on all machines.
- * Store shorter pattern and refill when required.
- * Use -cycles and -count in a rational manner.
- * Merge pattern selector with pattern generator.
- * Add clubs
- * Clap when all the balls are in the air
+ * Implement the anonymously promised -uni option.
  */
 
 
  */
 
 
-/*-
-Notes on Adam Chalcraft Juggling Notation (used by permission)
-a-> Adam's notation  s-> Site swap (Cambridge) notation
-
-To define a map from a-notation to s-notation
-("site-swap"), both of which look like doubly infinite sequences of natural
-numbers. In s-notation, there is a restriction on what is allowed, namely
-for the sequence s_n, the associated function f(n)=n+s_n must be a
-bijection. In a-notation, there is no restriction.
-
-To go from a-notation to s-notation, you start by mapping each a_n to a
-permutation of N, the natural numbers.
-
-0 -> the identity
-1 -> (10) [i.e. f(1)=0, f(0)=1]
-2 -> (210) [i.e. f(2)=1, f(1)=0, f(0)=2]
-3 -> (3210) [i.e. f(3)=2, f(2)=1, f(1)=0, f(0)=3]
-etc.
-
-Then for each n, you look at how long 0 takes to get back to 0 again and
-you call this t_n. If a_n=0, for example, then since the identity leaves 0
-alone, it gets back to 0 in 1 step, so t_n=1. If a_n=1, then f(0)=1. Now any
-further a_n=0 leave 1 alone, but the next a_n>0 sends 1 back to 0. Hence t_n
-is 2 + the number of 0's following the 1. Finally, set s_n = t_n - 1.
-
-To give some examples, it helps to have a notation for cyclic sequences. By
-(123), for example, I mean ...123123123123... . Now under the a-notation ->
-s-notation mapping we have some familiar examples:
-
-(0)->(0), (1)->(1), (2)->(2) etc.
-(21)->(31), (31)->(51), (41)->(71) etc.
-(10)->(20), (20)->(40), (30)->(60) etc.
-(331)->(441), (312)->(612), (303)->(504), (321)->(531)
-(43)->(53), (434)->(534), (433)->(633)
-(552)->(672)
-
-In general, the number of balls is the *average* of the s-notation, and the
-*maximum* of the a-notation. Another theorem is that the minimum values in
-the a-notation and the s-notation and equal, and preserved in the same
-positions.
-
-The usefulness of a-notation is the fact that there are no restrictions on
-what is allowed. This makes random juggle generation much easier. It also
-makes enumeration very easy. Another handy feature is computing changes.
-Suppose you can do (5) and want a neat change up to (771) in s-notation
-[Mike Day actually needed this example!]. Write them both in a-notation,
-which gives (5) and (551). Now concatenate them (in general, there may be
-more than one way to do this, but not in this example), to get
-...55555555551551551551551...
-Now convert back to s-notation, to get
-...55555566771771771771771...
-So the answer is to do two 6 throws and then go straight into (771).
-Coming back down of course,
-...5515515515515515555555555...
-converts to
-...7717717717716615555555555...
-so the answer is to do a single 661 and then drop straight down to (5).
-
-[The number of balls in the generated pattern occasionally changes.  In
- order to decrease the number of balls I had to introduce a new symbol
- into the Adam notation, [*] which means 'lose the current ball'.]
-*/
+/*
+ * Notes on Adam Chalcraft Juggling Notation (used by permission)
+ * a-> Adam's notation  s-> Site swap (Cambridge) notation
+ *
+ * To define a map from a-notation to s-notation ("site-swap"), both
+ * of which look like doubly infinite sequences of natural numbers. In
+ * s-notation, there is a restriction on what is allowed, namely for
+ * the sequence s_n, the associated function f(n)=n+s_n must be a
+ * bijection. In a-notation, there is no restriction.
+ *
+ * To go from a-notation to s-notation, you start by mapping each a_n
+ * to a permutation of N, the natural numbers.
+ *
+ * 0 -> the identity
+ * 1 -> (10) [i.e. f(1)=0, f(0)=1]
+ * 2 -> (210) [i.e. f(2)=1, f(1)=0, f(0)=2]
+ * 3 -> (3210) [i.e. f(3)=2, f(2)=1, f(1)=0, f(0)=3]
+ * etc.
+ *
+ * Then for each n, you look at how long 0 takes to get back to 0
+ * again and you call this t_n. If a_n=0, for example, then since the
+ * identity leaves 0 alone, it gets back to 0 in 1 step, so t_n=1. If
+ * a_n=1, then f(0)=1. Now any further a_n=0 leave 1 alone, but the
+ * next a_n>0 sends 1 back to 0. Hence t_n is 2 + the number of 0's
+ * following the 1. Finally, set s_n = t_n - 1.
+ *
+ * To give some examples, it helps to have a notation for cyclic
+ * sequences. By (123), for example, I mean ...123123123123... . Now
+ * under the a-notation -> s-notation mapping we have some familiar
+ * examples:
+ *
+ * (0)->(0), (1)->(1), (2)->(2) etc.
+ * (21)->(31), (31)->(51), (41)->(71) etc.
+ * (10)->(20), (20)->(40), (30)->(60) etc.
+ * (331)->(441), (312)->(612), (303)->(504), (321)->(531)
+ * (43)->(53), (434)->(534), (433)->(633)
+ * (552)->(672)
+ *
+ * In general, the number of balls is the *average* of the s-notation,
+ * and the *maximum* of the a-notation. Another theorem is that the
+ * minimum values in the a-notation and the s-notation and equal, and
+ * preserved in the same positions.
+ *
+ * The usefulness of a-notation is the fact that there are no
+ * restrictions on what is allowed. This makes random juggle
+ * generation much easier. It also makes enumeration very
+ * easy. Another handy feature is computing changes.  Suppose you can
+ * do (5) and want a neat change up to (771) in s-notation [Mike Day
+ * actually needed this example!]. Write them both in a-notation,
+ * which gives (5) and (551). Now concatenate them (in general, there
+ * may be more than one way to do this, but not in this example), to
+ * get
+ *
+ * ...55555555551551551551551...
+ *
+ * Now convert back to s-notation, to get
+ *
+ * ...55555566771771771771771...
+ *
+ * So the answer is to do two 6 throws and then go straight into
+ * (771).  Coming back down of course,
+ *
+ * ...5515515515515515555555555...
+ *
+ * converts to
+ *
+ * ...7717717717716615555555555...
+ *
+ * so the answer is to do a single 661 and then drop straight down to
+ * (5).
+ *
+ * [The number of balls in the generated pattern occasionally changes.
+ * In order to decrease the number of balls I had to introduce a new
+ * symbol into the Adam notation, [*] which means 'lose the current
+ * ball'.]
+ */
+
+/* This code uses so many linked lists it's worth having a built-in
+ * leak-checker */
+#undef MEMTEST
 
 #ifdef STANDALONE
 #define MODE_juggle
 #define PROGCLASS "Juggle"
 #define HACK_INIT init_juggle
 #define HACK_DRAW draw_juggle
 
 #ifdef STANDALONE
 #define MODE_juggle
 #define PROGCLASS "Juggle"
 #define HACK_INIT init_juggle
 #define HACK_DRAW draw_juggle
+#define HACK_RESHAPE reshape_juggle
+#define _no_HACK_FREE release_juggle
 #define juggle_opts xlockmore_opts
 #define DEFAULTS "*delay: 10000 \n" \
 #define juggle_opts xlockmore_opts
 #define DEFAULTS "*delay: 10000 \n" \
-"*count: 150 \n" \
-"*cycles: 30 \n" \
-"*ncolors: 32 \n"
-#define SMOOTH_COLORS
+"*count: 200 \n" \
+"*cycles: 1000 \n" \
+"*ncolors: 32 \n" \
+"*font: -*-times-bold-r-normal-*-180-*\n"
+#undef SMOOTH_COLORS
 #include "xlockmore.h"         /* in xscreensaver distribution */
 #include "xlockmore.h"         /* in xscreensaver distribution */
+#define MI_DELAY(MI)   ((MI)->pause)
+# ifndef MI_DEPTH
+#  define MI_DEPTH MI_WIN_DEPTH
+# endif
 #else /* STANDALONE */
 #include "xlock.h"             /* in xlockmore distribution */
 #endif /* STANDALONE */
 
 #ifdef MODE_juggle
 
 #else /* STANDALONE */
 #include "xlock.h"             /* in xlockmore distribution */
 #endif /* STANDALONE */
 
 #ifdef MODE_juggle
 
+#if 0
+#define XClearWindow(d, w) \
+{ \
+ XSetForeground(d, MI_GC(mi), MI_PIXEL(mi, 3)); \
+ XFillRectangle(d, w, MI_GC(mi), \
+   0, 0, (unsigned int) MI_WIDTH(mi), (unsigned int) MI_HEIGHT(mi)); \
+}
+#endif
+
 #define DEF_PATTERN "." /* All patterns */
 #define DEF_PATTERN "." /* All patterns */
-#define DEF_TRAIL "0" /* No trace */
+#define DEF_TAIL "1" /* No trace */
 #ifdef UNI
 #ifdef UNI
-#define DEF_UNI "FALSE" /* No unicycle */ /* Not implemented yet */
+/* Maybe a ROLA BOLA would be at a better angle for viewing */
+#define DEF_UNI "False" /* No unicycle */ /* Not implemented yet */
+#endif
+#define DEF_REAL "True"
+#define DEF_DESCRIBE "True"
+
+#define DEF_BALLS "True" /* Use Balls */
+#define DEF_CLUBS "True" /* Use Clubs */
+#define DEF_TORCHES "True" /* Use Torches */
+#define DEF_KNIVES "True" /* Use Knives */
+#define DEF_RINGS "True" /* Use Rings */
+#define DEF_BBALLS "True" /* Use Bowling Balls */
+
+#ifndef XtNumber
+#define XtNumber(arr)   ((unsigned int) (sizeof(arr) / sizeof(arr[0])))
 #endif
 #endif
-#define DEF_SOLID "FALSE" /* Not solid */
 
 static char *pattern;
 
 static char *pattern;
-static int trail;
+static int tail;
 #ifdef UNI
 static Bool uni;
 #endif
 #ifdef UNI
 static Bool uni;
 #endif
-static Bool solid;
+static Bool real;
+static Bool describe;
+static Bool balls;
+static Bool clubs;
+static Bool torches;
+static Bool knives;
+static Bool rings;
+static Bool bballs;
+static char *only;
 
 static XrmOptionDescRec opts[] =
 {
 
 static XrmOptionDescRec opts[] =
 {
-  {(char* ) "-pattern", ".juggle.pattern", XrmoptionSepArg, NULL},
-  {(char* ) "-trail", ".juggle.trail",     XrmoptionSepArg, NULL},
+  {"-pattern",  ".juggle.pattern",  XrmoptionSepArg, NULL  },
+  {"-tail",     ".juggle.tail",     XrmoptionSepArg, NULL  },
 #ifdef UNI
 #ifdef UNI
-  {"-uni", ".juggle.uni", XrmoptionNoArg, "on"},
-  {"+uni", ".juggle.uni", XrmoptionNoArg, "off"},
+  {"-uni",      ".juggle.uni",      XrmoptionNoArg,  "on"  },
+  {"+uni",      ".juggle.uni",      XrmoptionNoArg,  "off" },
 #endif
 #endif
-  {"-solid", ".juggle.solid", XrmoptionNoArg, "on"},
-  {"+solid", ".juggle.solid", XrmoptionNoArg, "off"}
+  {"-real",     ".juggle.real",     XrmoptionNoArg,  "on"  },
+  {"+real",     ".juggle.real",     XrmoptionNoArg,  "off" },
+  {"-describe", ".juggle.describe", XrmoptionNoArg,  "on"  },
+  {"+describe", ".juggle.describe", XrmoptionNoArg,  "off" },
+  {"-balls",    ".juggle.balls",    XrmoptionNoArg,  "on"  },
+  {"+balls",    ".juggle.balls",    XrmoptionNoArg,  "off" },
+  {"-clubs",    ".juggle.clubs",    XrmoptionNoArg,  "on"  },
+  {"+clubs",    ".juggle.clubs",    XrmoptionNoArg,  "off" },
+  {"-torches",  ".juggle.torches",  XrmoptionNoArg,  "on"  },
+  {"+torches",  ".juggle.torches",  XrmoptionNoArg,  "off" },
+  {"-knives",   ".juggle.knives",   XrmoptionNoArg,  "on"  },
+  {"+knives",   ".juggle.knives",   XrmoptionNoArg,  "off" },
+  {"-rings",    ".juggle.rings",    XrmoptionNoArg,  "on"  },
+  {"+rings",    ".juggle.rings",    XrmoptionNoArg,  "off" },
+  {"-bballs",   ".juggle.bballs",   XrmoptionNoArg,  "on"  },
+  {"+bballs",   ".juggle.bballs",   XrmoptionNoArg,  "off" },
+  {"-only",     ".juggle.only",     XrmoptionSepArg, NULL  },
 };
 static argtype vars[] =
 {
 };
 static argtype vars[] =
 {
-  {&pattern, "pattern", 
-   "Pattern", (char *) DEF_PATTERN, t_String},
-  {&trail, "trail", "Trail", DEF_TRAIL, t_Int},
+  { &pattern,  "pattern",  "Pattern",  DEF_PATTERN,  t_String },
+  { &tail,     "tail",     "Tail",     DEF_TAIL,     t_Int    },
 #ifdef UNI
 #ifdef UNI
-  {&uni, "uni", "Uni", DEF_UNI, t_Bool},
+  { &uni,      "uni",      "Uni",      DEF_UNI,      t_Bool   },
 #endif
 #endif
-  {&solid, "solid", "Solid", DEF_SOLID, t_Bool}
+  { &real,     "real",     "Real",     DEF_REAL,     t_Bool   },
+  { &describe, "describe", "Describe", DEF_DESCRIBE, t_Bool   },
+  { &balls,    "balls",    "Clubs",    DEF_BALLS,    t_Bool   },
+  { &clubs,    "clubs",    "Clubs",    DEF_CLUBS,    t_Bool   },
+  { &torches,  "torches",  "Torches",  DEF_TORCHES,  t_Bool   },
+  { &knives,   "knives",   "Knives",   DEF_KNIVES,   t_Bool   },
+  { &rings,    "rings",    "Rings",    DEF_RINGS,    t_Bool   },
+  { &bballs,   "bballs",   "BBalls",   DEF_BBALLS,   t_Bool   },
+  { &only,     "only",     "BBalls",   " ",          t_String },
 };
 static OptionStruct desc[] =
 {
 };
 static OptionStruct desc[] =
 {
-  {"-pattern string", "Cambridge Juggling Pattern"},
-  {"-trail num", "Trace Juggling Patterns"},
+  { "-pattern string", "Cambridge Juggling Pattern" },
+  { "-tail num",       "Trace Juggling Patterns" },
 #ifdef UNI
 #ifdef UNI
-  {"-/+uni", "Unicycle"},
+  { "-/+uni",          "Unicycle" },
 #endif
 #endif
-  {"-/+solid", "solid color (else its a 4 panel look (half white))"}
+  { "-/+real",         "Real-time" },
+  { "-/+describe",     "turn on/off pattern descriptions." },
+  { "-/+balls",        "turn on/off Balls." },
+  { "-/+clubs",        "turn on/off Clubs." },
+  { "-/+torches",      "turn on/off Flaming Torches." },
+  { "-/+knives",       "turn on/off Knives." },
+  { "-/+rings",        "turn on/off Rings." },
+  { "-/+bballs",       "turn on/off Bowling Balls." },
+  { "-only",           "Turn off all objects but the named one." },
 };
 
 ModeSpecOpt juggle_opts =
 };
 
 ModeSpecOpt juggle_opts =
-{sizeof opts / sizeof opts[0], opts,
- sizeof vars / sizeof vars[0], vars, desc};
+  { XtNumber(opts), opts, XtNumber(vars), vars, desc };
 
 #ifdef USE_MODULES
 ModStruct   juggle_description = {
        "juggle", "init_juggle", "draw_juggle", "release_juggle",
 
 #ifdef USE_MODULES
 ModStruct   juggle_description = {
        "juggle", "init_juggle", "draw_juggle", "release_juggle",
-       "draw_juggle", "init_juggle", (char *) NULL, &juggle_opts,
-       10000, 150, 30, 1, 64, 1.0, "",
+       "draw_juggle", "change_juggle", (char *) NULL, &juggle_opts,
+       10000, 200, 1000, 1, 64, 1.0, "",
        "Shows a Juggler, juggling", 0, NULL
 };
 
        "Shows a Juggler, juggling", 0, NULL
 };
 
@@ -179,7 +275,6 @@ ModStruct   juggle_description = {
 #ifdef USE_XVMSUTILS
 #include <X11/unix_time.h>
 #endif
 #ifdef USE_XVMSUTILS
 #include <X11/unix_time.h>
 #endif
-#include <time.h>
 #if HAVE_SYS_TIME_H
 #include <sys/time.h>
 #else
 #if HAVE_SYS_TIME_H
 #include <sys/time.h>
 #else
@@ -188,55 +283,172 @@ ModStruct   juggle_description = {
 #endif
 #endif
 
 #endif
 #endif
 
+/* Note: All "lengths" are scaled by sp->scale = MI_HEIGHT/480.  All
+   "thicknesses" are scaled by sqrt(sp->scale) so that they are
+   proportionally thicker for smaller windows.  Objects spinning out
+   of the plane (such as clubs) fake perspective by compressing their
+   horizontal coordinates by PERSPEC  */
+
 /* Figure */
 /* Figure */
-#define ARMLENGTH ((int) (40.0 * sp->scale))
+#define ARMLENGTH 50
 #define ARMWIDTH ((int) (8.0 * sqrt(sp->scale)))
 #define ARMWIDTH ((int) (8.0 * sqrt(sp->scale)))
-#define POSE ((int) (10.0 * sp->scale))
-#define SX ((int) (25.0 * sp->scale))
-#define SZ ((int) (25.0 * sp->scale))
-#define SY ((int) (25.0 * sp->scale))
-#define HIPY ((int) (85.0 * sp->scale))
-#define RHIPX ((int) (-15.0 * sp->scale))
-#define LHIPX ((int) (15.0 * sp->scale))
-#define RFX ((int) (-25.0 * sp->scale))
-#define LFX ((int) (25.0 * sp->scale))
-#define FY ((int) (155.0 * sp->scale))
-#define WSTY ((int) (65.0 * sp->scale))
-#define NEY ((int) (15.0 * sp->scale))
-#define HED ((int) (35.0 * sp->scale))
+#define POSE 10
 #define BALLRADIUS ARMWIDTH
 #define BALLRADIUS ARMWIDTH
-#define FIGURE1 7
-#define FIGURE2 3
-#define TRACE_LENGTH 50
-#define SPIN_DEGREES 750  /* Average spinning between a throw and the next catch */
-
-/* macros */
 
 
-#ifndef XtNumber
-#define XtNumber(arr)   ((unsigned int) (sizeof(arr) / sizeof(arr[0])))
-#endif
+#define PERSPEC  0.4
 
 
+/* macros */
 #define GRAVITY(h, t) 4*(double)(h)/((t)*(t))
 
 #define GRAVITY(h, t) 4*(double)(h)/((t)*(t))
 
+/* Timing based on count.  Units are milliseconds.  Juggles per second
+       is: 2000 / THROW_CATCH_INTERVAL + CATCH_THROW_INTERVAL */
+
 #define THROW_CATCH_INTERVAL (sp->count)
 #define THROW_NULL_INTERVAL  (sp->count * 0.5)
 #define CATCH_THROW_INTERVAL (sp->count * 0.2)
 #define THROW_CATCH_INTERVAL (sp->count)
 #define THROW_NULL_INTERVAL  (sp->count * 0.5)
 #define CATCH_THROW_INTERVAL (sp->count * 0.2)
-#define COR 0.8  /* coeff of restitution of balls (1 = perfect bounce) */
 
 
+/********************************************************************
+ * Trace Definitions                                                *
+ *                                                                  *
+ * These record rendering data so that a drawn object can be erased *
+ * later.  Each object has its own Trace list.                      *
+ *                                                                  *
+ ********************************************************************/
+
+typedef struct {double x, y; } DXPoint;
+typedef struct trace *TracePtr;
+typedef struct trace {
+  TracePtr next, prev;
+  double x, y;
+  double angle;
+  int divisions;
+  DXPoint dlast;
+#ifdef MEMTEST
+  char pad[1024];
+#endif
+} Trace;
+
+/*******************************************************************
+ * Object Definitions                                              *
+ *                                                                 *
+ * These describe the various types of Object that can be juggled  *
+ *                                                                 *
+ *******************************************************************/
+typedef void (DrawProc)(ModeInfo*, unsigned long, Trace *);
+
+static DrawProc show_ball, show_europeanclub, show_torch, show_knife;
+static DrawProc show_ring, show_bball;
+
+typedef enum {BALL, CLUB, TORCH, KNIFE, RING, BBALLS,
+                         NUM_OBJECT_TYPES} ObjType;
+#define OBJMIXPROB 20   /* inverse of the chances of using an odd
+                                                  object in the pattern */
+
+static const struct {
+  DrawProc *draw;                           /* Object Rendering function */
+  int       handle;                         /* Length of object's handle */
+  int       mintrail;                            /* Minimum trail length */
+  double    cor;      /* Coefficient of Restitution.  perfect bounce = 1 */
+  double    weight;          /* Heavier objects don't get thrown as high */
+} ObjectDefs[] = {
+  { /* Ball */
+       show_ball,
+       0,
+       1,
+       0.9,
+       1.0,
+  },
+  { /* Club */
+       show_europeanclub,
+       15,
+       1,
+       0.55, /* Clubs don't bounce too well */
+       1.0,
+  },
+  { /* Torch */
+       show_torch,
+       15,
+       20, /* Torches need flames */
+       0, /* Torches don't bounce -- fire risk! */
+       1.0,
+  },
+  { /* Knife */
+       show_knife,
+       15,
+       1,
+       0, /* Knives don't bounce */
+       1.0,
+  },
+  { /* Ring */
+       show_ring,
+       15,
+       1,
+       0.8,
+       1.0,
+  },
+  { /* Bowling Ball */
+       show_bball,
+       0,
+       1,
+       0.2,
+       5.0,
+  },
+};
 
 
-/* typedefs */
+/**************************
+ * Trajectory definitions *
+ **************************/
 
 typedef enum {HEIGHT, ADAM} Notation;
 typedef enum {Empty, Full, Ball} Throwable;
 typedef enum {LEFT, RIGHT} Hand;
 
 typedef enum {HEIGHT, ADAM} Notation;
 typedef enum {Empty, Full, Ball} Throwable;
 typedef enum {LEFT, RIGHT} Hand;
-typedef enum {THROW, CATCH} Action; /* DROP is not an option */
-typedef enum {ATCH, THRATCH, ACTION, LINKEDACTION, PTHRATCH, BPREDICTOR,
-       PREDICTOR} TrajectoryStatus;
-
-typedef struct trajectory *TrajectoryPtr;
-
+typedef enum {THROW, CATCH} Action;
+typedef enum {HAND, ELBOW, SHOULDER} Joint;
+typedef enum {ATCH, THRATCH, ACTION, LINKEDACTION,
+                         PTHRATCH, BPREDICTOR, PREDICTOR} TrajectoryStatus;
 typedef struct {double a, b, c, d; } Spline;
 typedef struct {double a, b, c, d; } Spline;
+typedef DXPoint Arm[3];
+
+/* A Wander contains a Spline and a time interval.  A list of Wanders
+ * describes the performer's position as he moves around the screen.  */
+typedef struct wander *WanderPtr;
+typedef struct wander {
+  WanderPtr next, prev;
+  double x;
+  unsigned long finish;
+  Spline s;
+#ifdef MEMTEST
+  char pad[1024];
+#endif
+} Wander;
+
+/* Object is an arbitrary object being juggled.  Each Trajectory
+ * references an Object ("count" tracks this), and each Object is also
+ * linked into a global Objects list.  Objects may include a Trace
+ * list for tracking erasures. */
+typedef struct object *ObjectPtr;
+typedef struct object {
+  ObjectPtr next, prev;
+
+  ObjType type;
+  int     color;
+  int     count; /* reference count */
+  Bool    active; /* Object is in use */
+
+  Trace  *trace;
+  int     tracelen;
+  int     tail;
+#ifdef MEMTEST
+  char pad[1024];
+#endif
+} Object;
 
 
+/* Trajectory is a segment of juggling action.  A list of Trajectories
+ * defines the juggling performance.  The Trajectory list goes through
+ * multiple processing steps to convert it from basic juggling
+ * notation into rendering data. */
+
+typedef struct trajectory *TrajectoryPtr;
 typedef struct trajectory {
   TrajectoryPtr prev, next;  /* for building list */
   TrajectoryStatus status;
 typedef struct trajectory {
   TrajectoryPtr prev, next;  /* for building list */
   TrajectoryStatus status;
@@ -245,6 +457,8 @@ typedef struct trajectory {
   char posn;
   int height;
   int adam;
   char posn;
   int height;
   int adam;
+  char *pattern;
+  char *name;
 
   /* Action */
   Hand hand;
 
   /* Action */
   Hand hand;
@@ -252,166 +466,256 @@ typedef struct trajectory {
 
   /* LinkedAction */
   int color;
 
   /* LinkedAction */
   int color;
-  int spin, divisions;
-  double degree_offset;
+  Object *object;
+  int divisions;
+  double angle, spin;
   TrajectoryPtr balllink;
   TrajectoryPtr handlink;
 
   /* PThratch */
   TrajectoryPtr balllink;
   TrajectoryPtr handlink;
 
   /* PThratch */
-
-  double dx; /* initial velocity */
-  double dy;
+  double cx; /* Moving juggler */
+  double x, y; /* current position */
+  double dx, dy; /* initial velocity */
 
   /* Predictor */
   Throwable type;
 
   /* Predictor */
   Throwable type;
-  int start, finish;
+  unsigned long start, finish;
   Spline xp, yp;
   Spline xp, yp;
-  int x, y; /* current position */
+
+#ifdef MEMTEST
+  char pad[1024];
+#endif
 } Trajectory;
 
 } Trajectory;
 
-/* structs */
 
 
+/* Jugglestruct: per-screen global data.  The master Wander, Object
+ * and Trajectory lists are anchored here. */
 typedef struct {
 typedef struct {
-  int         width;
-  int         height;
-  double      scale;
-  int         complexity;
-  int         cx;
-  int         cy;
-  double      Gr;
-  int         pattern;
-  Trajectory  *head;
-  XPoint   figure_path[FIGURE1];
-  XSegment figure_segs[FIGURE2];
-  XPoint      arm[2][3];
-  XPoint      *trace;
-  int         traceindex;
-  int         count;
-  time_t      begintime; /* seconds */
-  int         time; /* millisecond timer */
-  Bool        solid, uni;      
+  double        scale;
+  Wander       *wander;
+  double        cx;
+  double        Gr;
+  Trajectory   *head;
+  Arm           arm[2][2];
+  char         *pattern;
+  int           count;
+  int           num_balls;
+  time_t        begintime; /* should make 'time' usable for at least 48 days
+                                                       on a 32-bit machine */
+  unsigned long time; /* millisecond timer*/
+  ObjType       objtypes;
+  Object       *objects;
 } jugglestruct;
 
 static jugglestruct *juggles = (jugglestruct *) NULL;
 
 } jugglestruct;
 
 static jugglestruct *juggles = (jugglestruct *) NULL;
 
-typedef struct {
-  char * pattern;
-  char * name;
-} patternstruct;
+static XFontStruct *mode_font = None;
 
 
-#define MINBALLS 2
-#define MAXBALLS 7
+/*******************
+ * Pattern Library *
+ *******************/
 
 typedef struct {
 
 typedef struct {
-  int start;
-  int number;
-} PatternIndex;
-
-static PatternIndex* patternindex = (PatternIndex *) NULL;
+  const char * pattern;
+  const char * name;
+} patternstruct;
 
 /* List of popular patterns, in any order */
 
 /* List of popular patterns, in any order */
+/* Patterns should be given in Adam notation so the generator can
+   concatenate them safely.  Null descriptions are ok.  Height
+   notation will be displayed automatically.  */
 static patternstruct portfolio[] = {
 static patternstruct portfolio[] = {
-  {"[+2 1]", "+3 1, Typical 2 ball juggler"},
-  {"[2 0]", "4 0, 2 balls 1 hand"},
-  {"[2 0 1]", "5 0 1"},
-  {"[+2 0 +2 0 0]", "+5 0 +5 0 0"},
-  {"[3]", "3, cascade"},
-  {"[+3]", "+3, reverse cascade"},
-  {"[=3]", "=3, cascade under arm"},
-  {"[&3]", "&3, cascade catching under arm"},
-  {"[_3]", "_3, bouncing cascade"},
-  {"[+3 x3 =3]", "+3 x3 =3, Mill's mess"},
-  {"[3 2 1]", "5 3 1"},
-  {"[3 3 1]", "4 4 1"},
-  {"[3 1 2]", "6 1 2, See-saw"},
-  {"[=3 3 1 2]", "=4 5 1 2"},
-  {"[=3 2 2 3 1 2]", "=6 2 2 5 1 2, =4 5 1 2 stretched"},
-  {"[+3 3 1 3]", "+4 4 1 3, anemic shower box"},
-  {"[3 3 1]", "4 4 1"},
-  {"[+3 2 3]", "+4 2 3"},
-  {"[+3 1]", "+5 1, 3 shower"},
-  {"[_3 1]", "_5 1, bouncing 3 shower"},
-  {"[3 0 3 0 3]", "5 0 5 0 5, shake 3 out of 5"},
-  {"[3 3 3 0 0]", "5 5 5 0 0, flash 3 out of 5"},
-  {"[3 3 0]", "4 5 0, complete waste of a 5 ball juggler"},
-  {"[3 3 3 0 0 0 0]", "7 7 7 0 0 0 0, 3 flash"},
-  {"[+3 0 +3 0 +3 0 0]", "+7 0 +7 0 +7 0 0"},
-  {"[4]", "4, 4 cascade"},
-  {"[+4 3]", "+5 3, 4 ball half shower"},
-  {"[4 4 2]", "5 5 2"},
-  {"[+4 4 4 +4]", "+4 4 4 +4, 4 columns"},
-  {"[4 3 +4]", "5 3 +4"},
-  {"[+4 1]", "+7 1, 4 shower"},
-  {"[4 4 4 4 0]", "5 5 5 5 0, learning 5"},
-  {"[5]", "5, 5 cascade"},
-  {"[_5 _5 _5 _5 _5 5 5 5 5 5]", "_5 _5 _5 _5 _5 5 5 5 5 5, jump rope"},
-  {"[+5 x5 =5]", "+5 x5 =5, Mill's mess for 5"},
-  {"[6]", "6, 6 cascade"},
-  {"[7]", "7, 7 cascade"},
-  {"[_7]", "_7, bouncing 7 cascade"},
+  {"[+2 1]", /* +3 1 */ "Typical 2 ball juggler"},
+  {"[2 0]", /* 4 0 */ "2 in 1 hand"},
+  {"[2 0 1]", /* 5 0 1 */},
+  {"[+2 0 +2 0 0]" /* +5 0 +5 0 0 */},
+  {"[+2 0 1 2 2]", /* +4 0 1 2 3 */},
+  {"[2 0 1 1]", /* 6 0 1 1 */},
+
+  {"[3]", /* 3 */ "3 cascade"},
+  {"[+3]", /* +3 */ "reverse 3 cascade"},
+  {"[=3]", /* =3 */ "cascade 3 under arm"},
+  {"[&3]", /* &3 */ "cascade 3 catching under arm"},
+  {"[_3]", /* _3 */ "bouncing 3 cascade"},
+  {"[+3 x3 =3]", /* +3 x3 =3 */ "Mill's mess"},
+  {"[3 2 1]", /* 5 3 1" */},
+  {"[3 3 1]", /* 4 4 1" */},
+  {"[3 1 2]", /* 6 1 2 */ "See-saw"},
+  {"[=3 3 1 2]", /* =4 5 1 2 */},
+  {"[=3 2 2 3 1 2]", /* =6 2 2 5 1 2 */ "=4 5 1 2 stretched"},
+  {"[+3 3 1 3]", /* +4 4 1 3 */ "anemic shower box"},
+  {"[3 3 1]", /* 4 4 1 */},
+  {"[+3 2 3]", /* +4 2 3 */},
+  {"[+3 1]", /* +5 1 */ "3 shower"},
+  {"[_3 1]", /* _5 1 */ "bouncing 3 shower"},
+  {"[3 0 3 0 3]", /* 5 0 5 0 5 */ "shake 3 out of 5"},
+  {"[3 3 3 0 0]", /* 5 5 5 0 0 */ "flash 3 out of 5"},
+  {"[3 3 0]", /* 4 5 0 */ "complete waste of a 5 ball juggler"},
+  {"[3 3 3 0 0 0 0]", /* 7 7 7 0 0 0 0 */ "3 flash"},
+  {"[+3 0 +3 0 +3 0 0]", /* +7 0 +7 0 +7 0 0 */},
+  {"[3 2 2 0 3 2 0 2 3 0 2 2 0]", /* 7 3 3 0 7 3 0 3 7 0 3 3 0 */},
+  {"[3 0 2 0]", /* 8 0 4 0 */},
+  {"[_3 2 1]", /* _5 3 1 */},
+  {"[_3 0 1]", /* _8 0 1 */},
+  {"[1 _3 1 _3 0 1 _3 0]", /* 1 _7 1 _7 0 1 _7 0 */},
+  {"[_3 2 1 _3 1 2 1]", /* _6 3 1 _6 1 3 1 */},
+
+  {"[4]", /* 4 */ "4 cascade"},
+  {"[+4 3]", /* +5 3 */ "4 ball half shower"},
+  {"[4 4 2]", /* 5 5 2 */},
+  {"[+4 4 4 +4]", /* +4 4 4 +4 */ "4 columns"},
+  {"[+4 3 +4]", /* +5 3 +4 */},
+  {"[4 3 4 4]", /* 5 3 4 4 */},
+  {"[4 3 3 4]", /* 6 3 3 4 */},
+  {"[4 3 2 4", /* 6 4 2 4 */},
+  {"[+4 1]", /* +7 1 */ "4 shower"},
+  {"[4 4 4 4 0]", /* 5 5 5 5 0 */ "learning 5"},
+  {"[+4 x4 =4]", /* +4 x4 =4 */ "Mill's mess for 4"},
+  {"[+4 2 1 3]", /* +9 3 1 3 */},
+  {"[4 4 1 4 1 4]", /* 6 6 1 5 1 5, by Allen Knutson */},
+  {"[_4 _4 _4 1 _4 1]", /* _5 _6 _6 1 _5 1 */},
+  {"[_4 3 3]", /* _6 3 3 */},
+  {"[_4 3 1]", /* _7 4 1 */},
+  {"[_4 2 1]", /* _8 3 1 */},
+  {"[_4 3 3 3 0]", /* _8 4 4 4 0 */},
+  {"[_4 1 3 1]", /* _9 1 5 1 */},
+  {"[_4 1 3 1 2]", /* _10 1 6 1 2 */},
+
+  {"[5]", /* 5 */ "5 cascade"},
+  {"[_5 _5 _5 _5 _5 5 5 5 5 5]", /* _5 _5 _5 _5 _5 5 5 5 5 5 */},
+  {"[+5 x5 =5]", /* +5 x5 =5 */ "Mill's mess for 5"},
+  {"[5 4 4]", /* 7 4 4 */},
+  {"[_5 4 4]", /* _7 4 4 */},
+  {"[1 2 3 4 5 5 5 5 5]", /* 1 2 3 4 5 6 7 8 9 */ "5 ramp"},
+  {"[5 4 5 3 1]", /* 8 5 7 4 1, by Allen Knutson */},
+  {"[_5 4 1 +4]", /* _9 5 1 5 */},
+  {"[_5 4 +4 +4]", /* _8 4 +4 +4 */},
+  {"[_5 4 4 4 1]", /* _9 5 5 5 1 */},
+  {"[_5 4 4 5 1]",},
+  {"[_5 4 4 +4 4 0]", /*_10 5 5 +5 5 0 */},
+
+  {"[6]", /* 6 */ "6 cascade"},
+  {"[+6 5]", /* +7 5 */},
+  {"[6 4]", /* 8 4 */},
+  {"[+6 3]", /* +9 3 */},
+  {"[6 5 4 4]", /* 9 7 4 4 */},
+  {"[+6 5 5 5]", /* +9 5 5 5 */},
+  {"[6 0 6]", /* 9 0 9 */},
+  {"[_6 0 _6]", /* _9 0 _9 */},
+
+  {"[_7]", /* _7 */ "bouncing 7 cascade"},
+  {"[7]", /* 7 */ "7 cascade"},
+  {"[7 6 6 6 6]", /* 11 6 6 6 6 */ "Gatto's High Throw"},
+
 };
 
 };
 
-/* Private Functions */
-
-/* list management */
-
-/* t receives trajectory to be created.  ot must point to an existing
-   trajectory or be identical to t to start a new list. */
-#define INSERT_AFTER_TOP(t, ot)                                        \
-  if ((t = (Trajectory *)calloc(1, sizeof(Trajectory))) == NULL) \
-    {free_juggle(sp); return;}                                 \
-  (t)->next = (ot)->next;                                      \
-  (t)->prev = (ot);                                            \
-  (ot)->next = (t);                                            \
-  (t)->next->prev = (t)
-#define INSERT_AFTER(t, ot)                                    \
-  if ((t = (Trajectory *)calloc(1, sizeof(Trajectory))) == NULL) \
-    {free_juggle(sp); return False;}                           \
-  (t)->next = (ot)->next;                                      \
-  (t)->prev = (ot);                                            \
-  (ot)->next = (t);                                            \
-  (t)->next->prev = (t)
-
-
-/* t must point to an existing trajectory.  t must not be an
+typedef struct { int start; int number; } PatternIndex;
+
+static struct {
+  int minballs;
+  int maxballs;
+  PatternIndex index[XtNumber(portfolio)];
+} patternindex;
+
+/*******************
+ * list management *
+ *******************/
+
+#define DUP_OBJECT(n, t) { \
+  (n)->object = (t)->object; \
+  if((n)->object != NULL) (n)->object->count++; \
+}
+
+/* t must point to an existing element.  t must not be an
    expression ending ->next or ->prev */
    expression ending ->next or ->prev */
-#define REMOVE(t)                                              \
-  (t)->next->prev = (t)->prev;                                 \
-  (t)->prev->next = (t)->next;                                 \
-  (void) free((void *) t)
+#define REMOVE(t) { \
+  (t)->next->prev = (t)->prev; \
+  (t)->prev->next = (t)->next; \
+  free(t); \
+}
 
 
-static void
-free_pattern(jugglestruct *sp) {
-       if (sp->head != NULL) {
-               while (sp->head->next != sp->head) {
-                       Trajectory *t = sp->head->next;
+/* t receives element to be created and added to the list.  ot must
+   point to an existing element or be identical to t to start a new
+   list. Applicable to Trajectories, Objects and Traces. */
+#define ADD_ELEMENT(type, t, ot) \
+  if (((t) = (type*)calloc(1,sizeof(type))) != NULL) { \
+    (t)->next = (ot)->next; \
+    (t)->prev = (ot); \
+    (ot)->next = (t); \
+    (t)->next->prev = (t); \
+  }
 
 
-                       REMOVE(t); /* don't eliminate t */
-               }
-               (void) free((void *) sp->head);
-               sp->head = (Trajectory *) NULL;
+static void
+object_destroy(Object* o)
+{
+  if(o->trace != NULL) {
+       while(o->trace->next != o->trace) {
+         Trace *s = o->trace->next;
+         REMOVE(s); /* Don't eliminate 's' */
        }
        }
+       free(o->trace);
+  }
+  REMOVE(o);
 }
 
 static void
 }
 
 static void
-free_juggle(jugglestruct *sp)
-{
-       if (sp->trace != NULL) {
-               (void) free((void *) sp->trace);
-               sp->trace = (XPoint *) NULL;
+trajectory_destroy(Trajectory *t) {
+  if(t->name != NULL) free(t->name);
+  if(t->pattern != NULL) free(t->pattern);
+  /* Reduce object link count and call destructor if necessary */
+  if(t->object != NULL && --t->object->count < 1 && t->object->tracelen == 0) {
+       object_destroy(t->object);
+  }
+  REMOVE(t); /* Unlink and free */
+}
+
+static void
+free_juggle(jugglestruct *sp) {
+  if (sp->head != NULL) {
+       while (sp->head->next != sp->head) {
+         trajectory_destroy(sp->head->next);
+       }
+       free(sp->head);
+       sp->head = (Trajectory *) NULL;
+  }
+  if(sp->objects != NULL) {
+       while (sp->objects->next != sp->objects) {
+         object_destroy(sp->objects->next);
+       }
+       free(sp->objects);
+       sp->objects = (Object*)NULL;
+  }
+  if(sp->wander != NULL) {
+       while (sp->wander->next != sp->wander) {
+         Wander *w = sp->wander->next;
+         REMOVE(w);
        }
        }
-       free_pattern(sp);
+       free(sp->wander);
+       sp->wander = (Wander*)NULL;
+  }
+  if(sp->pattern != NULL) {
+       free(sp->pattern);
+       sp->pattern = NULL;
+  }
 }
 
 static Bool
 }
 
 static Bool
-add_throw(jugglestruct *sp, char type, int h, Notation n)
+add_throw(jugglestruct *sp, char type, int h, Notation n, const char* name)
 {
   Trajectory *t;
 
 {
   Trajectory *t;
 
-  INSERT_AFTER(t, sp->head->prev);
+  ADD_ELEMENT(Trajectory, t, sp->head->prev);
+  if(t == NULL){ /* Out of Memory */
+       free_juggle(sp);
+       return False;
+  }
+  t->object = NULL;
+  if(name != NULL)
+       t->name = strdup(name);
   t->posn = type;
   if (n == ADAM) {
        t->adam = h;
   t->posn = type;
   if (n == ADAM) {
        t->adam = h;
+       t->height = 0;
        t->status = ATCH;
   } else {
        t->height = h;
        t->status = ATCH;
   } else {
        t->height = h;
@@ -422,25 +726,31 @@ add_throw(jugglestruct *sp, char type, int h, Notation n)
 
 /* add a Thratch to the performance */
 static Bool
 
 /* add a Thratch to the performance */
 static Bool
-program(ModeInfo *mi, const char *patn, int repeat)
+program(ModeInfo *mi, const char *patn, const char *name, int cycles)
 {
   jugglestruct *sp = &juggles[MI_SCREEN(mi)];
   const char *p;
 {
   jugglestruct *sp = &juggles[MI_SCREEN(mi)];
   const char *p;
-  int h, i, seen;
+  int w, h, i, seen;
   Notation notation;
   char type;
 
   if (MI_IS_VERBOSE(mi)) {
   Notation notation;
   char type;
 
   if (MI_IS_VERBOSE(mi)) {
-       (void) fprintf(stderr, "%s x %d\n", patn, repeat);
+       (void) fprintf(stderr, "juggle[%d]: Programmed: %s x %d\n",
+                                  MI_SCREEN(mi), (name == NULL) ? patn : name, cycles);
   }
 
   }
 
-  for(i=0; i < repeat; i++) {
+  for(w=i=0; i < cycles; i++, w++) { /* repeat until at least "cycles" throws
+                                                                               have been programmed */
+       /* title is the pattern name to be supplied to the first throw of
+          a sequence.  If no name if given, use an empty title so that
+          the sequences are still delimited. */
+       const char *title = (name != NULL)? name : "";
        type=' ';
        h = 0;
        seen = 0;
        notation = HEIGHT;
        for(p=patn; *p; p++) {
        type=' ';
        h = 0;
        seen = 0;
        notation = HEIGHT;
        for(p=patn; *p; p++) {
-               if (*p >= '0' && *p <='9') {
+         if (*p >= '0' && *p <='9') {
                seen = 1;
                h = 10*h + (*p - '0');
          } else {
                seen = 1;
                h = 10*h + (*p - '0');
          } else {
@@ -450,11 +760,14 @@ program(ModeInfo *mi, const char *patn, int repeat)
                  notation = ADAM;
                  break;
                case '-':            /* Inside throw */
                  notation = ADAM;
                  break;
                case '-':            /* Inside throw */
+                 type = ' ';
+                 break;
                case '+':            /* Outside throw */
                case '=':            /* Cross throw */
                case '&':            /* Cross catch */
                case 'x':            /* Cross throw and catch */
                case '_':            /* Bounce */
                case '+':            /* Outside throw */
                case '=':            /* Cross throw */
                case '&':            /* Cross catch */
                case 'x':            /* Cross throw and catch */
                case '_':            /* Bounce */
+               case 'k':            /* Kickup */
                  type = *p;
                  break;
                case '*':            /* Lose ball */
                  type = *p;
                  break;
                case '*':            /* Lose ball */
@@ -466,8 +779,10 @@ program(ModeInfo *mi, const char *patn, int repeat)
                  /* fall through */
                case ' ':
                  if (seen) {
                  /* fall through */
                case ' ':
                  if (seen) {
-                       if (!add_throw(sp, type, h, notation))
+                       i++;
+                       if (!add_throw(sp, type, h, notation, title))
                                return False;
                                return False;
+                       title = NULL;
                        type=' ';
                        h = 0;
                        seen = 0;
                        type=' ';
                        h = 0;
                        seen = 0;
@@ -475,17 +790,22 @@ program(ModeInfo *mi, const char *patn, int repeat)
                  notation = nn;
                  break;
                default:
                  notation = nn;
                  break;
                default:
-                 (void) fprintf(stderr, "Unexpected pattern instruction: '%s'\n", p);
+                 if(w == 0) { /* Only warn on first pass */
+                       (void) fprintf(stderr,
+                                                  "juggle[%d]: Unexpected pattern instruction: '%c'\n",
+                                                  MI_SCREEN(mi), *p);
+                 }
                  break;
                }
          }
        }
                  break;
                }
          }
        }
-       if (seen) {
-         if (!add_throw(sp, type, h, notation))
+       if (seen) { /* end of sequence */
+         if (!add_throw(sp, type, h, notation, title))
                return False;
                return False;
+         title = NULL;
        }
   }
        }
   }
-       return True;
+  return True;
 }
 
 /*
 }
 
 /*
@@ -494,13 +814,16 @@ program(ModeInfo *mi, const char *patn, int repeat)
  \\~\\\\~\\\~\~
  \\\\\\\\\\\~\\
 
  \\~\\\\~\\\~\~
  \\\\\\\\\\\~\\
 
-[33134231334021]
+[ 3 3 1 3 4 2 3 1 3 3 4 0 2 1 ]
 
 4 4 1 3 12 2 4 1 4 4 13 0 3 1
 
 */
 #define BOUNCEOVER 10
 
 4 4 1 3 12 2 4 1 4 4 13 0 3 1
 
 */
 #define BOUNCEOVER 10
+#define KICKMIN 7
+#define THROWMAX 20
 
 
+/* Convert Adam notation into heights */
 static void
 adam(jugglestruct *sp)
 {
 static void
 adam(jugglestruct *sp)
 {
@@ -509,7 +832,11 @@ adam(jugglestruct *sp)
        if (t->status == ATCH) {
          int a = t->adam;
          t->height = 0;
        if (t->status == ATCH) {
          int a = t->adam;
          t->height = 0;
-         for(p = t->next; a > 0 && p != sp->head; p = p->next) {
+         for(p = t->next; a > 0; p = p->next) {
+               if(p == sp->head) {
+                 t->height = -9; /* Indicate end of processing for name() */
+                 return;
+               }
                if (p->status != ATCH || p->adam < 0 || p->adam>= a) {
                  a--;
                }
                if (p->status != ATCH || p->adam < 0 || p->adam>= a) {
                  a--;
                }
@@ -517,11 +844,51 @@ adam(jugglestruct *sp)
          }
          if(t->height > BOUNCEOVER && t->posn == ' '){
                t->posn = '_'; /* high defaults can be bounced */
          }
          if(t->height > BOUNCEOVER && t->posn == ' '){
                t->posn = '_'; /* high defaults can be bounced */
+         } else if(t->height < 3 && t->posn == '_') {
+               t->posn = ' '; /* Can't bounce short throws. */
+         }
+         if(t->height < KICKMIN && t->posn == 'k'){
+               t->posn = ' '; /* Can't kick short throws */
+         }
+         if(t->height > THROWMAX){
+               t->posn = 'k'; /* Use kicks for ridiculously high throws */
          }
          t->status = THRATCH;
          }
          t->status = THRATCH;
-#if 0
-         (void) fprintf(stderr, "%d\t%d\n", t->adam, t->height);
-#endif
+       }
+  }
+}
+
+/* Discover converted heights and update the sequence title */
+static void
+name(jugglestruct *sp)
+{
+  Trajectory *t, *p;
+  char buffer[BUFSIZ];
+  char *b;
+  for(t = sp->head->next; t != sp->head; t = t->next) {
+       if (t->status == THRATCH && t->name != NULL) {
+         b = buffer;
+         for(p = t; p == t || p->name == NULL; p = p->next) {
+               if(p == sp->head || p->height < 0) { /* end of reliable data */
+                 return;
+               }
+               if(p->posn == ' ') {
+                 b += sprintf(b, " %d", p->height);
+               } else {
+                 b += sprintf(b, " %c%d", p->posn, p->height);
+               }
+               if(b - buffer > 500) break; /* otherwise this could eventually
+                                                                          overflow.  It'll be too big to
+                                                                          display anyway. */
+         }
+         if(*t->name != 0) {
+               (void) sprintf(b, ", %s", t->name);
+         }
+         free(t->name); /* Don't need name any more, it's been converted
+                                               to pattern */
+         t->name = NULL;
+         if(t->pattern != NULL) free(t->pattern);
+         t->pattern = strdup(buffer);
        }
   }
 }
        }
   }
 }
@@ -555,35 +922,61 @@ part(jugglestruct *sp)
 
          switch (t->posn) {
                  /*         throw          catch    */
 
          switch (t->posn) {
                  /*         throw          catch    */
-         case ' ': /* fall through */
-         case '-': posn = '-'; t->posn = '+'; break;
+         case ' ': posn = '-'; t->posn = '+'; break;
          case '+': posn = '+'; t->posn = '-'; break;
          case '=': posn = '='; t->posn = '+'; break;
          case '&': posn = '+'; t->posn = '='; break;
          case 'x': posn = '='; t->posn = '='; break;
          case '_': posn = '_'; t->posn = '-'; break;
          case '+': posn = '+'; t->posn = '-'; break;
          case '=': posn = '='; t->posn = '+'; break;
          case '&': posn = '+'; t->posn = '='; break;
          case 'x': posn = '='; t->posn = '='; break;
          case '_': posn = '_'; t->posn = '-'; break;
-         default: (void) fprintf(stderr, "unexpected posn %c\n", t->posn); break;
+         case 'k': posn = 'k'; t->posn = 'k'; break;
+         default:
+               (void) fprintf(stderr, "juggle: unexpected posn %c\n", t->posn);
+               break;
          }
          hand = (Hand) ((hand + 1) % 2);
          t->status = ACTION;
          t->hand = hand;
          p = t->prev;
 
          }
          hand = (Hand) ((hand + 1) % 2);
          t->status = ACTION;
          t->hand = hand;
          p = t->prev;
 
-         if (t->height == 1) {
-               p = p->prev; /* early throw */
+         if (t->height == 1 && p != sp->head) {
+               p = p->prev; /* '1's are thrown earlier than usual */
          }
          }
+
+
+
          t->action = CATCH;
          t->action = CATCH;
-         INSERT_AFTER(nt, p);
+         ADD_ELEMENT(Trajectory, nt, p);
+         if(nt == NULL){
+               free_juggle(sp);
+               return False;
+         }
+         nt->object = NULL;
          nt->status = ACTION;
          nt->action = THROW;
          nt->height = t->height;
          nt->hand = hand;
          nt->posn = posn;
          nt->status = ACTION;
          nt->action = THROW;
          nt->height = t->height;
          nt->hand = hand;
          nt->posn = posn;
+
        }
   }
   return True;
 }
 
        }
   }
   return True;
 }
 
+static ObjType
+choose_object(void) {
+  ObjType o;
+  for (;;) {
+       o = (ObjType)NRAND((ObjType)NUM_OBJECT_TYPES);
+       if(balls && o == BALL) break;
+       if(clubs && o == CLUB) break;
+       if(torches && o == TORCH) break;
+       if(knives && o == KNIFE) break;
+       if(rings && o == RING) break;
+       if(bballs && o == BBALLS) break;
+  }
+  return o;
+}
+
 /* Connnect up throws and catches to figure out which ball goes where.
    Do the same with the juggler's hands. */
 
 /* Connnect up throws and catches to figure out which ball goes where.
    Do the same with the juggler's hands. */
 
@@ -595,28 +988,51 @@ lob(ModeInfo *mi)
   int h;
   for (t = sp->head->next; t != sp->head; t = t->next) {
        if (t->status == ACTION) {
   int h;
   for (t = sp->head->next; t != sp->head; t = t->next) {
        if (t->status == ACTION) {
-#if 0
-         (void) fprintf(stderr, (t->action == CATCH) ? "A %c%c%c\n" : "A %c%c%c%d\n",
-                         t->posn,
-                         t->hand ? 'R' : 'L',
-                         (t->action == THROW) ? 'T' : (t->action == CATCH ? 'C' : 'N'),
-                         t->height);
-#endif
          if (t->action == THROW) {
                if (t->type == Empty) {
          if (t->action == THROW) {
                if (t->type == Empty) {
+                 /* Create new Object */
+                 ADD_ELEMENT(Object, t->object, sp->objects);
+                 t->object->count = 1;
+                 t->object->tracelen = 0;
+                 t->object->active = False;
+                 /* Initialise object's circular trace list */
+                 ADD_ELEMENT(Trace, t->object->trace, t->object->trace);
+
                  if (MI_NPIXELS(mi) > 2) {
                  if (MI_NPIXELS(mi) > 2) {
-                       t->color = 1 + NRAND(MI_NPIXELS(mi) - 2);
+                       t->object->color = 1 + NRAND(MI_NPIXELS(mi) - 2);
+                 } else {
+#ifdef STANDALONE
+                       t->object->color = 1;
+#else
+                       t->object->color = 0;
+#endif
+                 }
+
+                 /* Small chance of picking a random object instead of the
+                        current theme. */
+                 if(NRAND(OBJMIXPROB) == 0) {
+                       t->object->type = choose_object();
+                 } else {
+                       t->object->type = sp->objtypes;
+                 }
+
+                 /* Check to see if we need trails for this object */
+                 if(tail < ObjectDefs[t->object->type].mintrail) {
+                       t->object->tail = ObjectDefs[t->object->type].mintrail;
+                 } else {
+                       t->object->tail = tail;
                  }
                  }
-                 t->spin = NRAND(5) - 2;
-                 t->degree_offset = NRAND(360);
-                 t->divisions = 2 * ((LRAND() & 1) + 1);
                }
 
                }
 
-               /* search forward for next hand catch */
-               for (p = t->next; t->handlink == NULL && p != sp->head; p = p->next) {
+               /* Balls can change divisions at each throw */
+               t->divisions = 2 * (NRAND(2) + 1);
+
+               /* search forward for next catch in this hand */
+               for (p = t->next; t->handlink == NULL; p = p->next) {
+                 if(p->status < ACTION || p == sp->head) return;
                  if (p->action == CATCH) {
                        if (t->handlink == NULL && p->hand == t->hand) {
                  if (p->action == CATCH) {
                        if (t->handlink == NULL && p->hand == t->hand) {
-                         t->handlink = p; /* next catch in this hand */
+                         t->handlink = p;
                        }
                  }
                }
                        }
                  }
                }
@@ -625,19 +1041,23 @@ lob(ModeInfo *mi)
                  h = t->height - 1;
 
                  /* search forward for next ball catch */
                  h = t->height - 1;
 
                  /* search forward for next ball catch */
-                 for (p = t->next; t->balllink == NULL&& p != sp->head; p = p->next) {
+                 for (p = t->next; t->balllink == NULL; p = p->next) {
+                       if(p->status < ACTION || p == sp->head) {
+                         t->handlink = NULL;
+                         return;
+                       }
                        if (p->action == CATCH) {
                          if (t->balllink == NULL && --h < 1) { /* caught */
                        if (p->action == CATCH) {
                          if (t->balllink == NULL && --h < 1) { /* caught */
-#if 0
+                               t->balllink = p; /* complete trajectory */
+# if 0
                                if (p->type == Full) {
                                if (p->type == Full) {
-                                 /* dropped */
+                                 (void) fprintf(stderr, "juggle[%d]: Dropped %d\n",
+                                                 MI_SCREEN(mi), t->object->color);
                                }
 #endif
                                }
 #endif
-                               t->balllink = p; /* complete trajectory */
                                p->type = Full;
                                p->type = Full;
-                               p->color = t->color; /* accept catch */
-                               p->spin = t->spin;
-                               p->degree_offset = t->degree_offset;
+                               DUP_OBJECT(p, t); /* accept catch */
+                               p->angle = t->angle;
                                p->divisions = t->divisions;
                          }
                        }
                                p->divisions = t->divisions;
                          }
                        }
@@ -646,13 +1066,12 @@ lob(ModeInfo *mi)
                t->type = Empty; /* thrown */
          } else if (t->action == CATCH) {
                /* search forward for next throw from this hand */
                t->type = Empty; /* thrown */
          } else if (t->action == CATCH) {
                /* search forward for next throw from this hand */
-               for (p = t->next; t->handlink == NULL && p != sp->head; p = p->next) {
+               for (p = t->next; t->handlink == NULL; p = p->next) {
+                 if(p->status < ACTION || p == sp->head) return;
                  if (p->action == THROW && p->hand == t->hand) {
                        p->type = t->type; /* pass ball */
                  if (p->action == THROW && p->hand == t->hand) {
                        p->type = t->type; /* pass ball */
-                       p->color = t->color; /* pass color */
-                       p->spin = NRAND(5) - 2;
-                       p->degree_offset = NRAND(360);
-                       p->divisions = 2 * ((LRAND() & 1) + 1);
+                       DUP_OBJECT(p, t); /* pass object */
+                       p->divisions = t->divisions;
                        t->handlink = p;
                  }
                }
                        t->handlink = p;
                  }
                }
@@ -662,56 +1081,48 @@ lob(ModeInfo *mi)
   }
 }
 
   }
 }
 
-/* Convert hand position symbols into actual time/space coordinates */
+/* Clap when both hands are empty */
 static void
 static void
-positions(jugglestruct *sp)
+clap(jugglestruct *sp)
 {
 {
-  Trajectory *t;
-  int now = 0;
+  Trajectory *t, *p;
   for (t = sp->head->next; t != sp->head; t = t->next) {
   for (t = sp->head->next; t != sp->head; t = t->next) {
-       if (t->status == PTHRATCH) {
-         now = t->start;
-       } else if (t->status == LINKEDACTION) {
-         int xo = 0, yo;
+       if (t->status == LINKEDACTION &&
+               t->action == CATCH &&
+               t->type == Empty &&
+               t->handlink != NULL &&
+               t->handlink->height == 0) { /* Completely idle hand */
+
+         for (p = t->next; p != sp->head; p = p->next) {
+               if (p->status == LINKEDACTION &&
+                       p->action == CATCH &&
+                       p->hand != t->hand) { /* Next catch other hand */
+                 if(p->type == Empty &&
+                        p->handlink != NULL &&
+                        p->handlink->height == 0) { /* Also completely idle */
+
+                       t->handlink->posn = '^'; /* Move first hand's empty throw */
+                       p->posn = '^';           /* to meet second hand's empty
+                                                                               catch */
 
 
-         /* time */
-         if (t->action == CATCH) {
-               if (t->type == Empty) {
-                 now += (int) THROW_NULL_INTERVAL; /* failed catch is short */
-               } else {
-                 now += THROW_CATCH_INTERVAL;     /* successful catch */
+                 }
+                 break; /* Only need first catch */
                }
                }
-         } else {
-               now += (int) CATCH_THROW_INTERVAL;  /* throws are very short */
          }
          }
-         t->start = now;
-
-         /* space */
-         yo = ARMLENGTH;
-         switch (t->posn) {
-         case '-': xo = SX - POSE; break;
-         case '_':
-         case '+': xo = SX + POSE; break;
-         case '=': xo = - SX - POSE; yo += 2 * POSE; break;
-         default: (void) fprintf(stderr, "unexpected posn %c\n", t->posn); break;
-         }
-         t->x = sp->cx + ((t->hand == LEFT) ? xo : -xo);
-         t->y = sp->cy + yo;
-
-         t->status = PTHRATCH;
        }
   }
 }
 
        }
   }
 }
 
+#define CUBIC(s, t) ((((s).a * (t) + (s).b) * (t) + (s).c) * (t) + (s).d)
 
 
-/* Private physics functions */
-
+/* Compute single spline from x0 with velocity dx0 at time t0 to x1
+   with velocity dx1 at time t1 */
 static Spline
 static Spline
-makeSpline(int x0, double dx0, int t0, int x1, double dx1, int t1)
+makeSpline(double x0, double dx0, int t0, double x1, double dx1, int t1)
 {
   Spline s;
   double a, b, c, d;
 {
   Spline s;
   double a, b, c, d;
-  int x10;
+  double x10;
   double t10;
 
   x10 = x1 - x0;
   double t10;
 
   x10 = x1 - x0;
@@ -727,14 +1138,17 @@ makeSpline(int x0, double dx0, int t0, int x1, double dx1, int t1)
   return s;
 }
 
   return s;
 }
 
+/* Compute a pair of splines.  s1 goes from x0 vith velocity dx0 at
+   time t0 to x1 at time t1.  s2 goes from x1 at time t1 to x2 with
+   velocity dx2 at time t2.  The arrival and departure velocities at
+   x1, t1 must be the same. */
 static double
 makeSplinePair(Spline *s1, Spline *s2,
 static double
 makeSplinePair(Spline *s1, Spline *s2,
-                          int x0, double dx0, int t0,
-                          int x1, int t1,
-                          int x2, double dx2, int t2)
+                          double x0, double dx0, int t0,
+                          double x1,             int t1,
+                          double x2, double dx2, int t2)
 {
 {
-  int x10, x21;
-  double t21, t10, t20, dx1;
+  double x10, x21, t21, t10, t20, dx1;
   x10 = x1 - x0;
   x21 = x2 - x1;
   t21 = t2 - t1;
   x10 = x1 - x0;
   x21 = x2 - x1;
   t21 = t2 - t1;
@@ -748,311 +1162,533 @@ makeSplinePair(Spline *s1, Spline *s2,
   return dx1;
 }
 
   return dx1;
 }
 
-/* Turn abstract timings into physically appropriate ball trajectories. */
-static Bool
-projectile(jugglestruct *sp)
+/* Compute a Ballistic path in a pair of degenerate splines.  sx goes
+   from x at time t at constant velocity dx.  sy goes from y at time t
+   with velocity dy and constant acceleration g. */
+static void
+makeParabola(Trajectory *n,
+                        double x, double dx, double y, double dy, double g)
 {
 {
-  Trajectory *t, *n;
-  for (t = sp->head->next; t != sp->head; t = t->next) {
-       if (t->status != PTHRATCH) {
-         continue;
-       }
-       if (t->action == THROW) {
-         if (t->balllink != NULL) {
-               if (t->posn == '_') { /* Bounce once */
-                 double tc, y0, yf, yc, tb, e, i;
-
-                 tc = t->balllink->start - t->start;
-
-                 yf = sp->cy + FY;
-                 y0 = t->y;
-                 yc = t->balllink->y;
-                 e = 1; /* permissible error in yc */
-
-                 /*
-                        tb = time to bounce
-                        yt = height at catch time after one bounce
-                        one or three roots according to timing
-                        find one by interval bisection
-                 */
-                 tb = tc;
-                 for(i = tc / 2; i > 0; i/=2){
-                       double dy, dt, yt;
-                       if(tb == 0){
-                         (void) fprintf(stderr, "div by zero!\n");
-                         break;
-                       }
-                       dy = (yf - y0)/tb + 0.5*sp->Gr*tb;
-                       dt = tc - tb;
-                       yt = -COR*dy*dt + 0.5*sp->Gr*dt*dt + yf;
-                       if(yt > yc + e){
-                         tb-=i;
-                       }else if(yt < yc - e){
-                         tb+=i;
-                       }else{
-                         break;
-                       }
-                 }
-
-                 {
-                       double t0, dy;
-
-                       t->dx = (t->balllink->x - t->x) / tc;
-
-                       /* ball follows parabola down */
-                       INSERT_AFTER(n, t->prev);
-                       n->start = t->start;
-                       n->finish = (int) (t->start + tb);
-                       n->type = Ball;
-                       n->color = t->color;
-                       n->spin = t->spin;
-                       n->degree_offset = t->degree_offset;
-                       n->divisions = t->divisions;
-                       n->status = PREDICTOR;
-
-                       t->dy = (yf - y0)/tb - 0.5*sp->Gr*tb;
-                       t0 = n->start;
-                       /* Represent parabola as a degenerate spline -
-                          linear in x, quadratic in y */
-                       n->xp.a = 0;
-                       n->xp.b = 0;
-                       n->xp.c = t->dx;
-                       n->xp.d = -t->dx*t0 + t->x;
-                       n->yp.a = 0;
-                       n->yp.b = sp->Gr/2;
-                       n->yp.c = -sp->Gr*t0 + t->dy;
-                       n->yp.d = sp->Gr/2*t0*t0 - t->dy*t0 + t->y;
-
-
-                       /* ball follows parabola up */
-                       INSERT_AFTER(n, t->prev);
-                       n->start = (int) (t0 + tb);
-                       n->finish = (int) (t0 + tc);
-                       n->type = Ball;
-                       n->color = t->color;
-                       n->spin = t->spin;
-                       n->degree_offset = t->degree_offset;
-                       n->divisions = t->divisions;
-                       n->status = PREDICTOR;
-
-                       n->xp.a = 0;
-                       n->xp.b = 0;
-                       n->xp.c = t->dx;
-                       n->xp.d = -t->dx*t0 + t->x;
-
-                       dy = (yf - y0)/tb + 0.5*sp->Gr*tb;
-                       t0 = n->start;
-                       /* Represent parabola as a degenerate spline -
-                          linear in x, quadratic in y */
-                       n->yp.a = 0;
-                       n->yp.b = sp->Gr/2;
-                       n->yp.c = -sp->Gr*t0 - COR*dy;
-                       n->yp.d = sp->Gr/2*t0*t0 + COR*dy*t0 + yf;
-                 }
-
-                 t->status = BPREDICTOR;
-
-               } else {
-                 double t0, dt;
-
-                 /* ball follows parabola */
-                 INSERT_AFTER(n, t->prev);
-                 n->start = t->start;
-                 n->finish = t->balllink->start;
-                 n->type = Ball;
-                 n->color = t->color;
-                 n->spin = t->spin;
-                 n->degree_offset = t->degree_offset;
-                 n->divisions = t->divisions;
-                 n->status = PREDICTOR;
-
-                 t0 = n->start;
-                 dt = t->balllink->start - t->start;
-                 t->dx = (t->balllink->x - t->x) / dt;
-                 t->dy = (t->balllink->y - t->y) / dt - sp->Gr/2 * dt;
+  double t = (double)n->start;
+  n->xp.a = 0;
+  n->xp.b = 0;
+  n->xp.c = dx;
+  n->xp.d = -dx*t + x;
+  n->yp.a = 0;
+  n->yp.b = g/2;
+  n->yp.c = -g*t + dy;
+  n->yp.d = g/2*t*t - dy*t + y;
+}
 
 
-                 /* Represent parabola as a degenerate spline -
-                        linear in x, quadratic in y */
-                 n->xp.a = 0;
-                 n->xp.b = 0;
-                 n->xp.c = t->dx;
-                 n->xp.d = -t->dx*t0 + t->x;
-                 n->yp.a = 0;
-                 n->yp.b = sp->Gr/2;
-                 n->yp.c = -sp->Gr*t0 + t->dy;
-                 n->yp.d = sp->Gr/2*t0*t0 - t->dy*t0 + t->y;
 
 
 
 
-                 t->status = BPREDICTOR;
-               }
-         } else { /* Zero Throw */
-               t->status = BPREDICTOR;
-         }
+/* Make juggler wander around the screen */
+static double wander(jugglestruct *sp, unsigned long time)
+{
+  Wander *w = NULL;
+  for (w = sp->wander->next; w != sp->wander; w = w->next) {
+       if (w->finish < sp->time) { /* expired */
+         Wander *ww = w;
+         w = w->prev;
+         REMOVE(ww);
+       } else if(w->finish > time) {
+         break;
        }
   }
        }
   }
-  return True;
+  if(w == sp->wander) { /* Need a new one */
+       ADD_ELEMENT(Wander, w, sp->wander->prev);
+       if(w == NULL) { /* Memory problem */
+         return 0.0;
+       }
+       w->finish = time + 3*THROW_CATCH_INTERVAL + NRAND(10*THROW_CATCH_INTERVAL);
+       if(time == 0) {
+         w->x = 0;
+       } else {
+         w->x = w->prev->x * 0.9 + NRAND(40) - 20;
+       }
+       w->s = makeSpline(w->prev->x, 0.0, w->prev->finish, w->x, 0.0, w->finish);
+  }
+  return CUBIC(w->s, time);
 }
 
 }
 
-/* Turn abstract hand motions into cubic splines. */
+#define SX 25 /* Shoulder Width */
+
+/* Convert hand position symbols into actual time/space coordinates */
 static void
 static void
-hands(jugglestruct *sp)
+positions(jugglestruct *sp)
 {
 {
-  Trajectory *t, *u, *v;
+  Trajectory *t;
+  unsigned long now = sp->time; /* Make sure we're not lost in the past */
   for (t = sp->head->next; t != sp->head; t = t->next) {
   for (t = sp->head->next; t != sp->head; t = t->next) {
-       /* no throw => no velocity */
-       if (t->status != BPREDICTOR) {
-         continue;
-       }
+       if (t->status >= PTHRATCH) {
+         now = t->start;
+       } else if (t->status == ACTION || t->status == LINKEDACTION) {
+         /* Allow ACTIONs to be annotated, but we won't mark them ready
+                for the next stage */
 
 
-       u = t->handlink;
-       if (u == NULL) { /* no next catch */
-         continue;
-       }
-       v = u->handlink;
-       if (v == NULL) { /* no next throw */
-         continue;
-       }
+         double xo = 0, yo;
+         double sx = SX;
+         double pose = SX/2;
 
 
-       /* double spline takes hand from throw, thru catch, to
-          next throw */
+         /* time */
+         if (t->action == CATCH) { /* Throw-to-catch */
+               if (t->type == Empty) {
+                 now += (int) THROW_NULL_INTERVAL; /* failed catch is short */
+               } else {     /* successful catch */
+                 now += (int)(THROW_CATCH_INTERVAL);
+               }
+         } else { /* Catch-to-throw */
+               if(t->object != NULL) {
+                 now += (int) (CATCH_THROW_INTERVAL *
+                                               ObjectDefs[t->object->type].weight);
+               } else {
+                 now += (int) (CATCH_THROW_INTERVAL);
+               }
+         }
 
 
-       t->finish = u->start;
-       t->status = PREDICTOR;
+         if(t->start == 0)
+               t->start = now;
+         else /* Concatenated performances may need clock resync */
+               now = t->start;
 
 
-       u->finish = v->start;
-       u->status = PREDICTOR;
+         t->cx = wander(sp, t->start);
 
 
-       (void) makeSplinePair(&t->xp, &u->xp,
-                                                 t->x, t->dx, t->start,
-                                                 u->x, u->start,
-                                                 v->x, v->dx, v->start);
-       (void) makeSplinePair(&t->yp, &u->yp,
-                                                 t->y, t->dy, t->start,
-                                                 u->y, u->start,
-                                                 v->y, v->dy, v->start);
+         /* space */
+         yo = 90;
 
 
-       t->status = PREDICTOR;
-  }
-}
+         /* Add room for the handle */
+         if(t->action == CATCH && t->object != NULL)
+               yo -= ObjectDefs[t->object->type].handle;
 
 
-/* Given target x, y find_elbow puts hand at target if possible,
- * otherwise makes hand point to the target */
-static void
-find_elbow(jugglestruct *sp, XPoint *h, XPoint *e, int x, int y, int z)
-{
-  double r, h2, t;
+         switch (t->posn) {
+         case '-': xo = sx - pose; break;
+         case '_':
+         case 'k':
+         case '+': xo = sx + pose; break;
+         case '~':
+         case '=': xo = - sx - pose; yo += pose; break;
+         case '^': xo = 0; yo += pose*2; break; /* clap */
+         default:
+               (void) fprintf(stderr, "juggle: unexpected posn %c\n", t->posn);
+               break;
+         }
 
 
-  h2 = x*x + y*y + z*z;
-  if (h2 > 4*ARMLENGTH*ARMLENGTH) {
-       t = ARMLENGTH/sqrt(h2);
-       e->x = (short) (t*x);
-       e->y = (short) (t*y);
-       h->x = 2 * e->x;
-       h->y = 2 * e->y;
-  } else {
-       r = sqrt((double)(x*x + z*z));
-       t = sqrt(4 * ARMLENGTH * ARMLENGTH / h2 - 1);
-       e->x = (short) (x*(1 - y*t/r)/2);
-       e->y = (short) ((y + r*t)/2);
-       h->x = x;
-       h->y = y;
+         t->angle = (((t->hand == LEFT) ^
+                                  (t->posn == '+' || t->posn == '_' || t->posn == 'k' ))?
+                                       -1 : 1) * M_PI/2;
+
+         t->x = t->cx + ((t->hand == LEFT) ? xo : -xo);
+         t->y = yo;
+
+         /* Only mark complete if it was already linked */
+         if(t->status == LINKEDACTION) {
+               t->status = PTHRATCH;
+         }
+       }
   }
 }
 
   }
 }
 
-/* NOTE: returned x, y adjusted for arm reach */
-static void
-draw_arm(ModeInfo * mi, Hand side, int *x, int *y)
-{
-  Display *dpy = MI_DISPLAY(mi);
-  Window win = MI_WINDOW(mi);
-  GC gc = MI_GC(mi);
-  jugglestruct *sp = &juggles[MI_SCREEN(mi)];
 
 
-  int sig = (side == LEFT) ? 1 : -1;
+/* Private physics functions */
 
 
-  XSetLineAttributes(dpy, gc,
-               ARMWIDTH, LineSolid, CapRound, JoinRound);
-  if (sp->arm[side][0].x != *x || sp->arm[side][0].y != *y) {
-       XPoint h, e;
-       XSetForeground(dpy, gc, MI_BLACK_PIXEL(mi));
-       find_elbow(sp, &h, &e, *x - sig*SX - sp->cx, *y - SY - sp->cy, SZ);
-       XDrawLines(dpy, win, gc, sp->arm[side], 3, CoordModeOrigin);
-       *x = sp->arm[side][0].x = sp->cx + sig*SX + h.x;
-       *y = sp->arm[side][0].y = sp->cy + SY + h.y;
-       sp->arm[side][1].x = sp->cx + sig*SX + e.x;
-       sp->arm[side][1].y = sp->cy + SY + e.y;
+/* Compute the spin-rate for a trajectory.  Different types of throw
+   (eg, regular thows, bounces, kicks, etc) have different spin
+   requirements.
+
+   type = type of object
+   h = trajectory of throwing hand (throws), or next throwing hand (catches)
+   old = earlier spin to consider
+   dt = time span of this trajectory
+   height = height of ball throw or 0 if based on old spin
+   turns = full club turns required during this operation
+   togo = partial club turns required to match hands
+*/
+static double
+spinrate(ObjType type, Trajectory *h, double old, double dt,
+                int height, int turns, double togo)
+{
+  const int dir = (h->hand == LEFT) ^ (h->posn == '+')? -1 : 1;
+
+  if(ObjectDefs[type].handle != 0) { /* Clubs */
+       return (dir * turns * 2 * M_PI + togo) / dt;
+  } else if(height == 0) { /* Balls already spinning */
+       return old/2;
+  } else { /* Balls */
+       return dir * NRAND(height*10)/20/ObjectDefs[type].weight * 2 * M_PI / dt;
   }
   }
-  XSetForeground(dpy, gc, MI_WHITE_PIXEL(mi));
-  XDrawLines(dpy, win, gc, sp->arm[side], 3, CoordModeOrigin);
-  XSetLineAttributes(dpy, gc,
-               1, LineSolid, CapNotLast, JoinRound);
 }
 
 }
 
-static void
-draw_figure(ModeInfo * mi)
-{
-  Display *dpy = MI_DISPLAY(mi);
-  Window win = MI_WINDOW(mi);
-  GC gc = MI_GC(mi);
-  jugglestruct *sp = &juggles[MI_SCREEN(mi)];
 
 
-  XSetLineAttributes(dpy, gc,
-               ARMWIDTH, LineSolid, CapRound, JoinRound);
-  XSetForeground(dpy, gc, MI_WHITE_PIXEL(mi));
-  XDrawLines(dpy, win, gc, sp->figure_path, FIGURE1, CoordModeOrigin);
-  XDrawSegments(dpy, win, gc, sp->figure_segs, FIGURE2);
-  XDrawArc(dpy, win, gc,
-        sp->cx - HED/2, sp->cy + NEY - HED, HED, HED, 0, 64*360);
-  XSetLineAttributes(dpy, gc,
-               1, LineSolid, CapNotLast, JoinRound);
+/* compute the angle at the end of a spinning trajectory */
+static double
+end_spin(Trajectory *t)
+{
+  return t->angle + t->spin * (t->finish - t->start);
 }
 
 }
 
+/* Sets the initial angle of the catch following hand movement t to
+   the final angle of the throw n.  Also sets the angle of the
+   subsequent throw to the same angle plus half a turn. */
+static void
+match_spins_on_catch(Trajectory *t, Trajectory *n)
+{
+  if(ObjectDefs[t->balllink->object->type].handle == 0) {
+       t->balllink->angle = end_spin(n);
+       if(t->balllink->handlink != NULL) {
+         t->balllink->handlink->angle = t->balllink->angle + M_PI;
+       }
+  }
+}
+
+static double
+find_bounce(jugglestruct *sp,
+                       double yo, double yf, double yc, double tc, double cor)
+{
+  double tb, i, dy = 0;
+  const double e = 1; /* permissible error in yc */
+
+  /*
+       tb = time to bounce
+       yt = height at catch time after one bounce
+       one or three roots according to timing
+       find one by interval bisection
+  */
+  tb = tc;
+  for(i = tc / 2; i > 0.0001; i/=2){
+       double dt, yt;
+       if(tb == 0){
+         (void) fprintf(stderr, "juggle: bounce div by zero!\n");
+         break;
+       }
+       dy = (yf - yo)/tb + sp->Gr/2*tb;
+       dt = tc - tb;
+       yt = -cor*dy*dt + sp->Gr/2*dt*dt + yf;
+       if(yt < yc + e){
+         tb-=i;
+       }else if(yt > yc - e){
+         tb+=i;
+       }else{
+         break;
+       }
+  }
+  if(dy*THROW_CATCH_INTERVAL < -200) { /* bounce too hard */
+       tb = -1;
+  }
+  return tb;
+}
+
+static Trajectory*
+new_predictor(const Trajectory *t, int start, int finish, double angle)
+{
+  Trajectory *n;
+  ADD_ELEMENT(Trajectory, n, t->prev);
+  if(n == NULL){
+       return NULL;
+  }
+  DUP_OBJECT(n, t);
+  n->divisions = t->divisions;
+  n->type = Ball;
+  n->status = PREDICTOR;
+
+  n->start = start;
+  n->finish = finish;
+  n->angle = angle;
+  return n;
+}
+
+/* Turn abstract timings into physically appropriate object trajectories. */
+static Bool
+projectile(jugglestruct *sp)
+{
+  Trajectory *t;
+  const int yf = 0; /* Floor height */
+
+  for (t = sp->head->next; t != sp->head; t = t->next) {
+       if (t->status != PTHRATCH || t->action != THROW) {
+         continue;
+       } else if (t->balllink == NULL) { /* Zero Throw */
+         t->status = BPREDICTOR;
+       } else if (t->balllink->handlink == NULL) { /* Incomplete */
+         return True;
+       } else if(t->balllink == t->handlink) {
+         /* '2' height - hold on to ball.  Don't need to consider
+                flourishes, 'hands' will do that automatically anyway */
+
+         t->type = Full;
+         /* Zero spin to avoid wrist injuries */
+         t->spin = 0;
+         match_spins_on_catch(t, t);
+         t->dx = t->dy = 0;
+         t->status = BPREDICTOR;
+         continue;
+       } else {
+         if (t->posn == '_') { /* Bounce once */
+
+               const int tb = t->start +
+                 find_bounce(sp, t->y, (double) yf, t->balllink->y,
+                                         (double) (t->balllink->start - t->start),
+                                         ObjectDefs[t->object->type].cor);
+
+               if(tb < t->start) { /* bounce too hard */
+                 t->posn = '+'; /* Use regular throw */
+               } else {
+                 Trajectory *n; /* First (throw) trajectory. */
+                 double dt; /* Time span of a trajectory */
+                 double dy; /* Distance span of a follow-on trajectory.
+                                               First trajectory uses t->dy */
+                 /* dx is constant across both trajectories */
+                 t->dx = (t->balllink->x - t->x) / (t->balllink->start - t->start);
+
+                 { /* ball follows parabola down */
+                       n = new_predictor(t, t->start, tb, t->angle);
+                       if(n == NULL) return False;
+                       dt = n->finish - n->start;
+                       /* Ball rate 4, no flight or matching club turns */
+                       n->spin = spinrate(t->object->type, t, 0.0, dt, 4, 0, 0.0);
+                       t->dy = (yf - t->y)/dt - sp->Gr/2*dt;
+                       makeParabola(n, t->x, t->dx, t->y, t->dy, sp->Gr);
+                 }
+
+                 { /* ball follows parabola up */
+                       Trajectory *m = new_predictor(t, n->finish, t->balllink->start,
+                                                                                 end_spin(n));
+                       if(m == NULL) return False;
+                       dt = m->finish - m->start;
+                       /* Use previous ball rate, no flight club turns */
+                       m->spin = spinrate(t->object->type, t, n->spin, dt, 0, 0,
+                                                          t->balllink->angle - m->angle);
+                       match_spins_on_catch(t, m);
+                       dy = (t->balllink->y - yf)/dt - sp->Gr/2 * dt;
+                       makeParabola(m, t->balllink->x - t->dx * dt,
+                                                t->dx, (double) yf, dy, sp->Gr);
+                 }
+
+                 t->status = BPREDICTOR;
+                 continue;
+               }
+         } else if (t->posn == 'k') { /* Drop & Kick */
+               Trajectory *n; /* First (drop) trajectory. */
+               Trajectory *o; /* Second (rest) trajectory */
+               Trajectory *m; /* Third (kick) trajectory */
+               const int td = t->start + 2*THROW_CATCH_INTERVAL; /* Drop time */
+               const int tk = t->balllink->start - 5*THROW_CATCH_INTERVAL; /* Kick */
+               double dt, dy;
+
+               { /* Fall to ground */
+                 n = new_predictor(t, t->start, td, t->angle);
+                 if(n == NULL) return False;
+                 dt = n->finish - n->start;
+                 /* Ball spin rate 4, no flight club turns */
+                 n->spin = spinrate(t->object->type, t, 0.0, dt, 4, 0,
+                                                        t->balllink->angle - n->angle);
+                 t->dx = (t->balllink->x - t->x) / dt;
+                 t->dy = (yf - t->y)/dt - sp->Gr/2*dt;
+                 makeParabola(n, t->x, t->dx, t->y, t->dy, sp->Gr);
+               }
+
+               { /* Rest on ground */
+                 o = new_predictor(t, n->finish, tk, end_spin(n));
+                 if(o == NULL) return False;
+                 o->spin = 0;
+                 makeParabola(o, t->balllink->x, 0.0, (double) yf, 0.0, 0.0);
+               }
+
+               /* Kick up */
+               {
+                 m = new_predictor(t, o->finish, t->balllink->start, end_spin(o));
+                 if(m == NULL) return False;
+                 dt = m->finish - m->start;
+                 /* Match receiving hand, ball rate 4, one flight club turn */
+                 m->spin = spinrate(t->object->type, t->balllink->handlink, 0.0, dt,
+                                                        4, 1, t->balllink->angle - m->angle);
+                 match_spins_on_catch(t, m);
+                 dy = (t->balllink->y - yf)/dt - sp->Gr/2 * dt;
+                 makeParabola(m, t->balllink->x, 0.0, (double) yf, dy, sp->Gr);
+               }
+
+               t->status = BPREDICTOR;
+               continue;
+         }
+
+         /* Regular flight, no bounce */
+         { /* ball follows parabola */
+               double dt;
+               Trajectory *n = new_predictor(t, t->start,
+                                                                         t->balllink->start, t->angle);
+               if(n == NULL) return False;
+               dt = t->balllink->start - t->start;
+               /* Regular spin */
+               n->spin = spinrate(t->object->type, t, 0.0, dt, t->height, t->height/2,
+                                                  t->balllink->angle - n->angle);
+               match_spins_on_catch(t, n);
+               t->dx = (t->balllink->x - t->x) / dt;
+               t->dy = (t->balllink->y - t->y) / dt - sp->Gr/2 * dt;
+               makeParabola(n, t->x, t->dx, t->y, t->dy, sp->Gr);
+         }
+
+         t->status = BPREDICTOR;
+       }
+  }
+  return True;
+}
+
+/* Turn abstract hand motions into cubic splines. */
+static void
+hands(jugglestruct *sp)
+{
+  Trajectory *t, *u, *v;
+
+  for (t = sp->head->next; t != sp->head; t = t->next) {
+       /* no throw => no velocity */
+       if (t->status != BPREDICTOR) {
+         continue;
+       }
+
+       u = t->handlink;
+       if (u == NULL) { /* no next catch */
+         continue;
+       }
+       v = u->handlink;
+       if (v == NULL) { /* no next throw */
+         continue;
+       }
+
+       /* double spline takes hand from throw, thru catch, to
+          next throw */
+
+       t->finish = u->start;
+       t->status = PREDICTOR;
+
+       u->finish = v->start;
+       u->status = PREDICTOR;
+
+
+       /* FIXME: These adjustments leave a small glitch when alternating
+          balls and clubs.  Just hope no-one notices.  :-) */
+
+       /* make sure empty hand spin matches the thrown object in case it
+          had a handle */
+
+       t->spin = ((t->hand == LEFT)? -1 : 1 ) *
+         fabs((u->angle - t->angle)/(u->start - t->start));
 
 
+       u->spin = ((v->hand == LEFT) ^ (v->posn == '+')? -1 : 1 ) *
+         fabs((v->angle - u->angle)/(v->start - u->start));
+
+       (void) makeSplinePair(&t->xp, &u->xp,
+                                                 t->x, t->dx, t->start,
+                                                 u->x, u->start,
+                                                 v->x, v->dx, v->start);
+       (void) makeSplinePair(&t->yp, &u->yp,
+                                                 t->y, t->dy, t->start,
+                                                 u->y, u->start,
+                                                 v->y, v->dy, v->start);
+
+       t->status = PREDICTOR;
+  }
+}
+
+/* Given target x, y find_elbow puts hand at target if possible,
+ * otherwise makes hand point to the target */
+static void
+find_elbow(int armlength, DXPoint *h, DXPoint *e, DXPoint *p, DXPoint *s,
+                  int z)
+{
+  double r, h2, t;
+  double x = p->x - s->x;
+  double y = p->y - s->y;
+  h2 = x*x + y*y + z*z;
+  if (h2 > 4 * armlength * armlength) {
+       t = armlength/sqrt(h2);
+       e->x = t*x + s->x;
+       e->y = t*y + s->y;
+       h->x = 2 * t * x + s->x;
+       h->y = 2 * t * y + s->y;
+  } else {
+       r = sqrt((double)(x*x + z*z));
+       t = sqrt(4 * armlength * armlength / h2 - 1);
+       e->x = x*(1 + y*t/r)/2 + s->x;
+       e->y = (y - r*t)/2 + s->y;
+       h->x = x + s->x;
+       h->y = y + s->y;
+  }
+}
+
+
+/* NOTE: returned x, y adjusted for arm reach */
+static void
+reach_arm(ModeInfo * mi, Hand side, DXPoint *p)
+{
+  jugglestruct *sp = &juggles[MI_SCREEN(mi)];
+  DXPoint h, e;
+  find_elbow(40, &h, &e, p, &sp->arm[1][side][SHOULDER], 25);
+  *p = sp->arm[1][side][HAND] = h;
+  sp->arm[1][side][ELBOW] = e;
+}
+
+#if DEBUG
 /* dumps a human-readable rendition of the current state of the juggle
    pipeline to stderr for debugging */
 /* dumps a human-readable rendition of the current state of the juggle
    pipeline to stderr for debugging */
-#ifdef OLDDEBUG
 static void
 dump(jugglestruct *sp)
 {
   Trajectory *t;
 static void
 dump(jugglestruct *sp)
 {
   Trajectory *t;
-
   for (t = sp->head->next; t != sp->head; t = t->next) {
        switch (t->status) {
   for (t = sp->head->next; t != sp->head; t = t->next) {
        switch (t->status) {
-       case THROW:
-         (void) fprintf(stderr, "T %c%d\n", t->posn, t->height);
+       case ATCH:
+         (void) fprintf(stderr, "%p a %c%d\n", (void*)t, t->posn, t->adam);
+         break;
+       case THRATCH:
+         (void) fprintf(stderr, "%p T %c%d %s\n", (void*)t, t->posn, t->height,
+                                        t->pattern == NULL?"":t->pattern);
          break;
        case ACTION:
          break;
        case ACTION:
-         (void) fprintf(stderr, t->action == CATCH?"A %c%c%c\n":"A %c%c%c%d\n",
-                         t->posn,
-                         t->hand ? 'R' : 'L',
-                         (t->action == THROW)?'T':(t->action == CATCH?'C':'N'),
-                         t->height);
+         if (t->action == CATCH)
+           (void) fprintf(stderr, "%p A %c%cC\n",
+                                        (void*)t, t->posn,
+                                        t->hand ? 'R' : 'L');
+         else
+           (void) fprintf(stderr, "%p A %c%c%c%d\n",
+                                        (void*)t, t->posn,
+                                        t->hand ? 'R' : 'L',
+                                        (t->action == THROW)?'T':'N',
+                                        t->height);
          break;
        case LINKEDACTION:
          break;
        case LINKEDACTION:
-         (void) fprintf(stderr, "L %c%c%c%d %d\n",
-                         t->posn,
-                         t->hand?'R':'L',
-                         (t->action == THROW)?'T':(t->action == CATCH?'C':'N'),
-                         t->height, t->color);
+         (void) fprintf(stderr, "%p L %c%c%c%d %d %p %p\n",
+                                        (void*)t, t->posn,
+                                        t->hand?'R':'L',
+                                        (t->action == THROW)?'T':(t->action == CATCH?'C':'N'),
+                                        t->height, t->object == NULL?0:t->object->color,
+                                        (void*)t->handlink, (void*)t->balllink);
          break;
        case PTHRATCH:
          break;
        case PTHRATCH:
-         (void) fprintf(stderr, "O %c%c%c%d %d %2d %6d %6d\n", t->posn,
-                         t->hand?'R':'L',
-                         (t->action == THROW)?'T':(t->action == CATCH?'C':'N'),
-                         t->height, t->type, t->color,
-                         t->start, t->finish);
+         (void) fprintf(stderr, "%p O %c%c%c%d %d %2d %6lu %6lu\n",
+                                        (void*)t, t->posn,
+                                        t->hand?'R':'L',
+                                        (t->action == THROW)?'T':(t->action == CATCH?'C':'N'),
+                                        t->height, t->type, t->object == NULL?0:t->object->color,
+                                        t->start, t->finish);
+         break;
+       case BPREDICTOR:
+         (void) fprintf(stderr, "%p B %c      %2d %6lu %6lu %g\n",
+                                        (void*)t, t->type == Ball?'b':t->type == Empty?'e':'f',
+                                        t->object == NULL?0:t->object->color,
+                                        t->start, t->finish, t->yp.c);
          break;
        case PREDICTOR:
          break;
        case PREDICTOR:
-         (void) fprintf(stderr, "P %c      %2d %6d %6d %g\n",
-                         t->type == Ball?'b':t->type == Empty?'e':'f',
-                         t->color,
-                         t->start, t->finish, t->yp.c);
+         (void) fprintf(stderr, "%p P %c      %2d %6lu %6lu %g\n",
+                                        (void*)t, t->type == Ball?'b':t->type == Empty?'e':'f',
+                                        t->object == NULL?0:t->object->color,
+                                        t->start, t->finish, t->yp.c);
          break;
        default:
          break;
        default:
-         (void) fprintf(stderr, "status %d not implemented\n", t->status);
+         (void) fprintf(stderr, "%p: status %d not implemented\n",
+                                        (void*)t, t->status);
          break;
        }
   }
          break;
        }
   }
+  (void) fprintf(stderr, "---\n");
 }
 #endif
 
 }
 #endif
 
@@ -1078,10 +1714,12 @@ static int get_num_balls(const char *j)
 extern "C" {
 #endif
 
 extern "C" {
 #endif
 
-static int compare_num_balls(const void *p1, const void *p2)
+static int
+compare_num_balls(const void *p1, const void *p2)
 {
 {
-  int i = get_num_balls(((patternstruct*)p1)->pattern);
-  int j = get_num_balls(((patternstruct*)p2)->pattern);
+  int i, j;
+  i = get_num_balls(((patternstruct*)p1)->pattern);
+  j = get_num_balls(((patternstruct*)p2)->pattern);
   if (i > j) {
        return (1);
   } else if (i < j) {
   if (i > j) {
        return (1);
   } else if (i < j) {
@@ -1095,453 +1733,1080 @@ static int compare_num_balls(const void *p1, const void *p2)
 }
 #endif
 
 }
 #endif
 
-/* Public functions */
 
 
-void
-release_juggle(ModeInfo * mi)
+/**************************************************************************
+ *                        Rendering Functions                             *
+ *                                                                        *
+ **************************************************************************/
+
+static void
+show_arms(ModeInfo * mi, unsigned long color)
 {
 {
-       if (juggles != NULL) {
-               int screen;
+  jugglestruct *sp = &juggles[MI_SCREEN(mi)];
+  unsigned int i, j;
+  Hand side;
+  XPoint a[XtNumber(sp->arm[0][0])];
+  if(color == MI_BLACK_PIXEL(mi)) {
+       j = 0;
+  } else {
+       j = 1;
+  }
+  XSetLineAttributes(MI_DISPLAY(mi), MI_GC(mi),
+                                        ARMWIDTH, LineSolid, CapRound, JoinRound);
+  XSetForeground(MI_DISPLAY(mi), MI_GC(mi), color);
+  for(side = LEFT; side <= RIGHT; side = (Hand)((int)side + 1)) {
+       /* Translate into device coords */
+       for(i = 0; i < XtNumber(a); i++) {
+         a[i].x = (short)(MI_WIDTH(mi)/2 + sp->arm[j][side][i].x*sp->scale);
+         a[i].y = (short)(MI_HEIGHT(mi)  - sp->arm[j][side][i].y*sp->scale);
+         if(j == 1)
+               sp->arm[0][side][i] = sp->arm[1][side][i];
+       }
+       XDrawLines(MI_DISPLAY(mi), MI_WINDOW(mi), MI_GC(mi),
+                          a, XtNumber(a), CoordModeOrigin);
+  }
+}
 
 
-               for (screen = 0; screen < MI_NUM_SCREENS(mi); screen++)
-                       free_juggle(&juggles[screen]);
-               (void) free((void *) juggles);
-               juggles = (jugglestruct *) NULL;
+static void
+show_figure(ModeInfo * mi, unsigned long color, Bool init)
+{
+  jugglestruct *sp = &juggles[MI_SCREEN(mi)];
+  XPoint p[7];
+  unsigned int i;
+
+  /*      +-----+ 9
+          |  6  |
+       10 +--+--+
+       2 +---+---+ 3
+          \  5  /
+           \   /
+            \ /
+           1 +
+            / \
+           /   \
+        0 +-----+ 4
+          |     |
+          |     |
+          |     |
+        7 +     + 8
+  */
+
+  static const XPoint figure[] = {
+       { 15,  70}, /* 0  Left Hip */
+       {  0,  90}, /* 1  Waist */
+       { SX, 130}, /* 2  Left Shoulder */
+       {-SX, 130}, /* 3  Right Shoulder */
+       {-15,  70}, /* 4  Right Hip */
+       {  0, 130}, /* 5  Neck */
+       {  0, 140}, /* 6  Chin */
+       { SX,   0}, /* 7  Left Foot */
+       {-SX,   0}, /* 8  Right Foot */
+       {-17, 174}, /* 9  Head1 */
+       { 17, 140}, /* 10 Head2 */
+  };
+  XPoint a[XtNumber(figure)];
+
+  /* Translate into device coords */
+  for(i = 0; i < XtNumber(figure); i++) {
+       a[i].x = (short)(MI_WIDTH(mi)/2 + (sp->cx + figure[i].x)*sp->scale);
+       a[i].y = (short)(MI_HEIGHT(mi) - figure[i].y*sp->scale);
+  }
+
+  XSetLineAttributes(MI_DISPLAY(mi), MI_GC(mi),
+               ARMWIDTH, LineSolid, CapRound, JoinRound);
+  XSetForeground(MI_DISPLAY(mi), MI_GC(mi), color);
+
+  i = 0; /* Body */
+  p[i++] = a[0]; p[i++] = a[1]; p[i++] = a[2];
+  p[i++] = a[3]; p[i++] = a[1]; p[i++] = a[4];
+  XDrawLines(MI_DISPLAY(mi), MI_WINDOW(mi), MI_GC(mi),
+                        p, i, CoordModeOrigin);
+
+  i = 0;  /* Legs */
+  p[i++] = a[7]; p[i++] = a[0]; p[i++] = a[4]; p[i++] = a[8];
+  XDrawLines(MI_DISPLAY(mi), MI_WINDOW(mi), MI_GC(mi),
+                        p, i, CoordModeOrigin);
+
+  i = 0;  /* Neck */
+  p[i++] = a[5]; p[i++] = a[6];
+  XDrawLines(MI_DISPLAY(mi), MI_WINDOW(mi), MI_GC(mi),
+                        p, i, CoordModeOrigin);
+
+  /* Head */
+  XDrawArc(MI_DISPLAY(mi), MI_WINDOW(mi), MI_GC(mi),
+                  a[9].x, a[9].y,
+                  a[10].x - a[9].x, a[10].y - a[9].y, 0, 64*360);
+  sp->arm[1][LEFT][SHOULDER].x = sp->cx + figure[2].x;
+  sp->arm[1][RIGHT][SHOULDER].x = sp->cx + figure[3].x;
+  if(init) {
+       /* Initialise arms */
+       unsigned int i;
+       for(i = 0; i < 2; i++){
+         sp->arm[i][LEFT][SHOULDER].y = figure[2].y;
+         sp->arm[i][LEFT][ELBOW].x = figure[2].x;
+         sp->arm[i][LEFT][ELBOW].y = figure[1].y;
+         sp->arm[i][LEFT][HAND].x = figure[0].x;
+         sp->arm[i][LEFT][HAND].y = figure[1].y;
+         sp->arm[i][RIGHT][SHOULDER].y = figure[3].y;
+         sp->arm[i][RIGHT][ELBOW].x = figure[3].x;
+         sp->arm[i][RIGHT][ELBOW].y = figure[1].y;
+         sp->arm[i][RIGHT][HAND].x = figure[4].x;
+         sp->arm[i][RIGHT][HAND].y = figure[1].y;
+       }
+  }
+}
+
+static void
+show_ball(ModeInfo *mi, unsigned long color, Trace *s)
+{
+  jugglestruct *sp = &juggles[MI_SCREEN(mi)];
+  int offset = (int)(s->angle*64*180/M_PI);
+  short x = (short)(MI_WIDTH(mi)/2 + s->x * sp->scale);
+  short y = (short)(MI_HEIGHT(mi) - s->y * sp->scale);
+
+  /* Avoid wrapping */
+  if(s->y*sp->scale >  MI_HEIGHT(mi) * 2) return;
+
+  XSetForeground(MI_DISPLAY(mi), MI_GC(mi), color);
+  if (s->divisions == 0 || color == MI_BLACK_PIXEL(mi))  {
+       XFillArc(MI_DISPLAY(mi), MI_WINDOW(mi), MI_GC(mi),
+                        x - BALLRADIUS, y - BALLRADIUS,
+                        2*BALLRADIUS, 2*BALLRADIUS,
+                        0, 23040);
+  } else if (s->divisions == 4) { /* 90 degree divisions */
+       XFillArc(MI_DISPLAY(mi), MI_WINDOW(mi), MI_GC(mi),
+                        x - BALLRADIUS, y - BALLRADIUS,
+                        2*BALLRADIUS, 2*BALLRADIUS,
+                        offset % 23040, 5760);
+       XFillArc(MI_DISPLAY(mi), MI_WINDOW(mi), MI_GC(mi),
+                        x - BALLRADIUS, y - BALLRADIUS,
+                        2*BALLRADIUS, 2*BALLRADIUS,
+                        (offset + 11520) % 23040, 5760);
+
+       XSetForeground(MI_DISPLAY(mi), MI_GC(mi), MI_WHITE_PIXEL(mi));
+       XFillArc(MI_DISPLAY(mi), MI_WINDOW(mi), MI_GC(mi),
+                        x - BALLRADIUS, y - BALLRADIUS,
+                        2*BALLRADIUS, 2*BALLRADIUS,
+                        (offset + 5760) % 23040, 5760);
+       XFillArc(MI_DISPLAY(mi), MI_WINDOW(mi), MI_GC(mi),
+                        x - BALLRADIUS, y - BALLRADIUS,
+                        2*BALLRADIUS, 2*BALLRADIUS,
+                        (offset + 17280) % 23040, 5760);
+  } else if (s->divisions == 2)  { /* 180 degree divisions */
+       XFillArc(MI_DISPLAY(mi), MI_WINDOW(mi), MI_GC(mi),
+                        x - BALLRADIUS, y - BALLRADIUS,
+                        2*BALLRADIUS, 2*BALLRADIUS,
+                        offset % 23040, 11520);
+
+       XSetForeground(MI_DISPLAY(mi), MI_GC(mi), MI_WHITE_PIXEL(mi));
+       XFillArc(MI_DISPLAY(mi), MI_WINDOW(mi), MI_GC(mi),
+                        x - BALLRADIUS, y - BALLRADIUS,
+                        2*BALLRADIUS, 2*BALLRADIUS,
+                        (offset + 11520) % 23040, 11520);
+  } else {
+       (void) fprintf(stderr, "juggle[%d]: unexpected divisions: %d\n",
+                       MI_SCREEN(mi), s->divisions);
+  }
+}
+
+static void
+show_europeanclub(ModeInfo *mi, unsigned long color, Trace *s)
+{
+       jugglestruct *sp = &juggles[MI_SCREEN(mi)];
+       XPoint p[4];
+       const double sa = sin(s->angle);
+       const double ca = cos(s->angle);
+       unsigned int i;
+
+       /*  6   6
+         +-+
+        /   \
+     4 +-----+ 7
+      ////////\
+   3 +---------+ 8
+   2 +---------+ 9
+      |///////|
+    1 +-------+ 10
+       |     |
+       |     |
+        |   |
+        |   |
+         | |
+         | |
+         +-+
+        0  11  */
+
+       static const XPoint club[] = {
+         {-24, 2}, /* 0 */
+         {-10, 3}, /* 1 */
+         {  1, 6}, /* 2 */
+         {  8, 6}, /* 3 */
+         { 14, 4}, /* 4 */
+         { 16, 3}, /* 5 */
+         { 16,-3}, /* 6 */
+         { 14,-4}, /* 7 */
+         {  8,-6}, /* 8 */
+         {  1,-6}, /* 9 */
+         {-10,-3}, /* 10 */
+         {-24,-2}, /* 11 */
+         {-24, 2}, /* 0 close boundary */
+       };
+       XPoint a[XtNumber(club)];
+
+       /* Avoid wrapping */
+       if(s->y*sp->scale >  MI_HEIGHT(mi) * 2) return;
+
+       /* Translate and fake perspective */
+       for(i = 0; i < XtNumber(club); i++) {
+         a[i].x = (short)(MI_WIDTH(mi)/2 +
+                                          (s->x + club[i].x*PERSPEC*sa)*sp->scale -
+                                          club[i].y*sqrt(sp->scale)*ca);
+         a[i].y = (short)(MI_HEIGHT(mi) - (s->y - club[i].x*ca)*sp->scale +
+                                          club[i].y*sa*sqrt(sp->scale));
+       }
+
+       if(color != MI_BLACK_PIXEL(mi)) {
+         /* Outline in black */
+         XSetForeground(MI_DISPLAY(mi), MI_GC(mi), MI_BLACK_PIXEL(mi));
+         XSetLineAttributes(MI_DISPLAY(mi), MI_GC(mi), 2,
+                                                LineSolid, CapRound, JoinRound);
+         XDrawLines(MI_DISPLAY(mi), MI_WINDOW(mi), MI_GC(mi),
+                                a, XtNumber(a), CoordModeOrigin);
        }
        }
-       if (patternindex != NULL) {
-               (void) free((void *) patternindex);
-               patternindex = (PatternIndex *) NULL;
+
+       XSetForeground(MI_DISPLAY(mi), MI_GC(mi), color);
+
+       /* Don't be tempted to optimize erase by drawing all the black in
+          one X operation.  It must use the same ops as the colours to
+          guarantee a clean erase. */
+
+       i = 0; /* Colored stripes */
+       p[i++] = a[1]; p[i++] = a[2];
+       p[i++] = a[9]; p[i++] = a[10];
+       XFillPolygon(MI_DISPLAY(mi), MI_WINDOW(mi), MI_GC(mi),
+                                p, i, Convex, CoordModeOrigin);
+       i = 0;
+       p[i++] = a[3]; p[i++] = a[4];
+       p[i++] = a[7]; p[i++] = a[8];
+       XFillPolygon(MI_DISPLAY(mi), MI_WINDOW(mi), MI_GC(mi),
+                                p, i, Convex, CoordModeOrigin);
+
+       if(color != MI_BLACK_PIXEL(mi)) {
+         XSetForeground(MI_DISPLAY(mi), MI_GC(mi), MI_WHITE_PIXEL(mi));
        }
        }
+
+       i = 0; /* White center band */
+       p[i++] = a[2]; p[i++] = a[3]; p[i++] = a[8]; p[i++] = a[9];
+       XFillPolygon(MI_DISPLAY(mi), MI_WINDOW(mi), MI_GC(mi),
+                                p, i, Convex, CoordModeOrigin);
+
+       i = 0; /* White handle */
+       p[i++] = a[0]; p[i++] = a[1]; p[i++] = a[10]; p[i++] = a[11];
+       XFillPolygon(MI_DISPLAY(mi), MI_WINDOW(mi), MI_GC(mi),
+                                p, i, Convex, CoordModeOrigin);
+
+       i = 0; /* White tip */
+       p[i++] = a[4]; p[i++] = a[5]; p[i++] = a[6]; p[i++] = a[7];
+       XFillPolygon(MI_DISPLAY(mi), MI_WINDOW(mi), MI_GC(mi),
+                                p, i, Convex, CoordModeOrigin);
 }
 
 }
 
-void
-init_juggle(ModeInfo * mi)
+#if 0
+static void
+show_jugglebugclub(ModeInfo *mi, unsigned long color, Trace *s)
 {
 {
-       jugglestruct *sp;
-       int i;
-       XPoint figure1[FIGURE1];
-       XSegment figure2[FIGURE2];
-       if (pattern != NULL && *pattern == '.') {
-         pattern = NULL;
+       jugglestruct *sp = &juggles[MI_SCREEN(mi)];
+       XPoint p[6];
+       const double sa = sin(s->angle);
+       const double ca = cos(s->angle);
+       unsigned int i;
+
+       /*  4   5
+         +-+
+        /   \
+     3 +-----+ 6
+      ////////\
+   2 +/////////+ 7
+      |///////|
+    1 +-------+ 8
+       |     |
+       |     |
+        |   |
+        |   |
+         | |
+         | |
+         +-+
+        0  9   */
+
+       static const XPoint club[] = {
+         {-24, 2}, /* 0 */
+         { -9, 3}, /* 1 */
+         {  5, 6}, /* 2 */
+         { 11, 4}, /* 3 */
+         { 16, 3}, /* 4 */
+         { 16,-3}, /* 5 */
+         { 11,-4}, /* 6 */
+         {  5,-6}, /* 7 */
+         { -9,-3}, /* 8 */
+         {-24,-2}, /* 9 */
+         {-24, 2}, /* 0 close boundary */
+       };
+       XPoint a[XtNumber(club)];
+
+       /* Avoid wrapping */
+       if(s->y*sp->scale >  MI_HEIGHT(mi) * 2) return;
+
+       /* Translate and fake perspective */
+       for(i = 0; i < XtNumber(club); i++) {
+         a[i].x = (short)(MI_WIDTH(mi)/2 +
+                                          (s->x + club[i].x*PERSPEC*sa)*sp->scale -
+                                          club[i].y*sqrt(sp->scale)*ca);
+         a[i].y = (short)(MI_HEIGHT(mi) - (s->y - club[i].x*ca)*sp->scale +
+                                          club[i].y*sa*sqrt(sp->scale));
        }
        }
-       if (pattern == NULL && patternindex == NULL) {
-         /* pattern list needs indexing */
-         int nelements = sizeof(portfolio)/sizeof(patternstruct);
-         int maxballs;
-         int numpat = 0;
-
-         /* sort according to number of balls */
-         qsort((void*)portfolio, nelements,
-                       sizeof(patternstruct), compare_num_balls);
-
-         /* last pattern has most balls */
-         maxballs = get_num_balls(portfolio[nelements - 1].pattern);
-         /* allocate index */
-         if ((patternindex = (PatternIndex *) calloc(maxballs + 1,
-                               sizeof (PatternIndex))) == NULL) {
-               return;
-         }
 
 
-         /* run through sorted list, indexing start of each group
-                and number in group */
-         maxballs = 1;
-         for (i = 0; i < nelements; i++) {
-               int b = get_num_balls(portfolio[i].pattern);
-               if (b > maxballs) {
-                 if (MI_IS_VERBOSE(mi)) {
-                       (void) fprintf(stderr, "%d %d ball pattern%s\n",
-                                       numpat, maxballs, (numpat == 1) ? "" : "s");
-                 }
-                 patternindex[maxballs].number = numpat;
-                 maxballs = b;
-                 numpat = 1;
-                 patternindex[maxballs].start = i;
-               } else {
-                 numpat++;
-               }
-         }
-         if (MI_IS_VERBOSE(mi)) {
-               (void) fprintf(stderr, "%d %d ball pattern%s\n",
-                               numpat, maxballs, (numpat == 1) ? "" : "s");
-         }
-         patternindex[maxballs].number = numpat;
+       if(color != MI_BLACK_PIXEL(mi)) {
+         /* Outline in black */
+         XSetForeground(MI_DISPLAY(mi), MI_GC(mi), MI_BLACK_PIXEL(mi));
+         XSetLineAttributes(MI_DISPLAY(mi), MI_GC(mi), 2,
+                                                LineSolid, CapRound, JoinRound);
+         XDrawLines(MI_DISPLAY(mi), MI_WINDOW(mi), MI_GC(mi),
+                                a, XtNumber(a), CoordModeOrigin);
        }
 
        }
 
-       if (juggles == NULL) { /* allocate jugglestruct */
-               if ((juggles = (jugglestruct *) calloc(MI_NUM_SCREENS(mi),
-                              sizeof (jugglestruct))) == NULL) {
-                       release_juggle(mi);
-                       return;
-               }
+       XSetForeground(MI_DISPLAY(mi), MI_GC(mi), color);
+
+       /* Don't be tempted to optimize erase by drawing all the black in
+          one X operation.  It must use the same ops as the colours to
+          guarantee a clean erase. */
+
+       i = 0; /* Coloured center band */
+       p[i++] = a[1]; p[i++] = a[2]; p[i++] = a[3];
+       p[i++] = a[6]; p[i++] = a[7]; p[i++] = a[8];
+       XFillPolygon(MI_DISPLAY(mi), MI_WINDOW(mi), MI_GC(mi),
+                                p, i, Convex, CoordModeOrigin);
+
+       if(color != MI_BLACK_PIXEL(mi)) {
+         XSetForeground(MI_DISPLAY(mi), MI_GC(mi), MI_WHITE_PIXEL(mi));
        }
        }
-       sp = &juggles[MI_SCREEN(mi)];
 
 
-       sp->count = 0;
+       i = 0; /* White handle */
+       p[i++] = a[0]; p[i++] = a[1]; p[i++] = a[8]; p[i++] = a[9];
+       XFillPolygon(MI_DISPLAY(mi), MI_WINDOW(mi), MI_GC(mi),
+                                p, i, Convex, CoordModeOrigin);
 
 
-       if (MI_IS_FULLRANDOM(mi)) {
-               sp->solid = (Bool) (LRAND() & 1);
-#ifdef UNI
-               sp->uni = (Bool) (LRAND() & 1);
-#endif
-       } else {
-               sp->solid = solid;
-#ifdef UNI
-               sp->uni = uni;
+       i = 0; /* White tip */
+       p[i++] = a[3]; p[i++] = a[4]; p[i++] = a[5]; p[i++] = a[6];
+       XFillPolygon(MI_DISPLAY(mi), MI_WINDOW(mi), MI_GC(mi),
+                                p, i, Convex, CoordModeOrigin);
+}
 #endif
 #endif
+
+static void
+show_torch(ModeInfo *mi, unsigned long color, Trace *s)
+{
+       jugglestruct *sp = &juggles[MI_SCREEN(mi)];
+       XPoint head, tail, last;
+       DXPoint dhead, dlast;
+       const double sa = sin(s->angle);
+       const double ca = cos(s->angle);
+
+       const double TailLen = -24;
+       const double HeadLen = 16;
+       const short Width   = (short)(5 * sqrt(sp->scale));
+
+       /*
+      +///+ head
+    last  |
+          |
+          |
+          |
+          |
+          + tail
+       */
+
+       dhead.x = s->x + HeadLen * PERSPEC * sa;
+       dhead.y = s->y - HeadLen * ca;
+
+       if(color == MI_BLACK_PIXEL(mi)) { /* Use 'last' when erasing */
+         dlast = s->dlast;
+       } else { /* Store 'last' so we can use it later when s->prev has
+                               gone */
+         if(s->prev != s->next) {
+               dlast.x = s->prev->x + HeadLen * PERSPEC * sin(s->prev->angle);
+               dlast.y = s->prev->y - HeadLen * cos(s->prev->angle);
+         } else {
+               dlast = dhead;
+         }
+         s->dlast = dlast;
        }
 
        }
 
-       sp->width = MI_WIDTH(mi);
-       sp->height = MI_HEIGHT(mi);
-       sp->count = ABS(MI_COUNT(mi));
-       if (sp->count == 0)
-               sp->count = 150;
-       sp->scale = sp->height / 480.0;
-       /* vary x a little so the juggler does not burn the screen */
-       sp->cx = sp->width / 2 + RFX + NRAND(LFX - RFX + 1);
-       sp->cy = sp->height - FY - ((int) sp->uni) * FY / 3; /* raise higher */
-       /* "7" hits top of screen */
-       sp->Gr = GRAVITY(sp->cy, 7 * THROW_CATCH_INTERVAL);
-
-       figure1[0].x = LHIPX, figure1[0].y = HIPY;
-       figure1[1].x = 0, figure1[1].y = WSTY;
-       figure1[2].x = SX, figure1[2].y = SY;
-       figure1[3].x = -SX, figure1[3].y = SY;
-       figure1[4].x = 0, figure1[4].y = WSTY;
-       figure1[5].x = RHIPX, figure1[5].y = HIPY;
-       figure1[6].x = LHIPX, figure1[6].y = HIPY;
-       figure2[0].x1 = 0, figure2[0].y1 = SY,
-         figure2[0].x2 = 0, figure2[0].y2 = NEY;
-       figure2[1].x1 = LHIPX, figure2[1].y1 = HIPY,
-         figure2[1].x2 = LFX, figure2[1].y2 = FY;
-       figure2[2].x1 = RHIPX, figure2[2].y1 = HIPY,
-         figure2[2].x2 = RFX, figure2[2].y2 = FY;
-
-       /* Body Path */
-       for (i = 0; i <  FIGURE1; i++) {
-         sp->figure_path[i].x = figure1[i].x + sp->cx;
-         sp->figure_path[i].y = figure1[i].y + sp->cy;
+       /* Avoid wrapping (after last is stored) */
+       if(s->y*sp->scale >  MI_HEIGHT(mi) * 2) return;
+
+       head.x = (short)(MI_WIDTH(mi)/2 + dhead.x*sp->scale);
+       head.y = (short)(MI_HEIGHT(mi) - dhead.y*sp->scale);
+
+       last.x = (short)(MI_WIDTH(mi)/2 + dlast.x*sp->scale);
+       last.y = (short)(MI_HEIGHT(mi) - dlast.y*sp->scale);
+
+       tail.x = (short)(MI_WIDTH(mi)/2 +
+                                        (s->x + TailLen * PERSPEC * sa)*sp->scale );
+       tail.y = (short)(MI_HEIGHT(mi) - (s->y - TailLen * ca)*sp->scale );
+
+       if(color != MI_BLACK_PIXEL(mi)) {
+         XSetForeground(MI_DISPLAY(mi), MI_GC(mi), MI_BLACK_PIXEL(mi));
+         XSetLineAttributes(MI_DISPLAY(mi), MI_GC(mi),
+                                                Width, LineSolid, CapRound, JoinRound);
+         XDrawLine(MI_DISPLAY(mi), MI_WINDOW(mi), MI_GC(mi),
+                               head.x, head.y, tail.x, tail.y);
        }
        }
-       /* Body Segments */
-       for (i = 0; i < FIGURE2; i++) {
-         sp->figure_segs[i].x1 = figure2[i].x1 + sp->cx;
-         sp->figure_segs[i].y1 = figure2[i].y1 + sp->cy;
-         sp->figure_segs[i].x2 = figure2[i].x2 + sp->cx;
-         sp->figure_segs[i].y2 = figure2[i].y2 + sp->cy;
+       XSetForeground(MI_DISPLAY(mi), MI_GC(mi), color);
+       XSetLineAttributes(MI_DISPLAY(mi), MI_GC(mi),
+                                          Width * 2, LineSolid, CapRound, JoinRound);
+
+       XDrawLine(MI_DISPLAY(mi), MI_WINDOW(mi), MI_GC(mi),
+                         head.x, head.y, last.x, last.y);
+
+}
+
+static void
+show_knife(ModeInfo *mi, unsigned long color, Trace *s)
+{
+       jugglestruct *sp = &juggles[MI_SCREEN(mi)];
+       unsigned int i;
+       const double sa = sin(s->angle);
+       const double ca = cos(s->angle);
+
+       /*
+        2 +
+          |+ 3
+          ||
+        1 +++ 5
+          |4|
+          | |
+           + 0
+       */
+       static const XPoint knife[] = {
+         {-24, 0}, /* 0 */
+         { -5,-3}, /* 1 */
+         { 16,-3}, /* 2 */
+         { 12, 0}, /* 3 */
+         { -5, 0}, /* 4 */
+         { -5, 3}, /* 5 */
+       };
+       XPoint a[XtNumber(knife)], p[5];
+
+       /* Avoid wrapping */
+       if(s->y*sp->scale >  MI_HEIGHT(mi) * 2) return;
+
+       /* Translate and fake perspective */
+       for(i = 0; i < XtNumber(knife); i++) {
+         a[i].x = (short)(MI_WIDTH(mi)/2 +
+                                          (s->x + knife[i].x*PERSPEC*sa)*sp->scale -
+                                          knife[i].y*sqrt(sp->scale)*ca*PERSPEC);
+         a[i].y = (short)(MI_HEIGHT(mi) - (s->y - knife[i].x*ca)*sp->scale +
+                                          knife[i].y*sa*sqrt(sp->scale));
        }
        }
-       /* Shoulders */
-       sp->arm[LEFT][2].x = sp->cx + SX;
-       sp->arm[LEFT][2].y = sp->cy + SY;
-       sp->arm[RIGHT][2].x = sp->cx - SX;
-       sp->arm[RIGHT][2].y = sp->cy + SY;
-
-       if (sp->trace == NULL) {
-         if ((sp->trace = (XPoint *)calloc(trail, sizeof(XPoint))) == NULL) {
-               free_juggle(sp);
-               return;
-         }
+
+       /* Handle */
+       XSetForeground(MI_DISPLAY(mi), MI_GC(mi), color);
+       XSetLineAttributes(MI_DISPLAY(mi), MI_GC(mi), (short)(4*sqrt(sp->scale)),
+                                          LineSolid, CapRound, JoinRound);
+       XDrawLine(MI_DISPLAY(mi), MI_WINDOW(mi), MI_GC(mi),
+                         a[0].x, a[0].y, a[4].x, a[4].y);
+
+       /* Blade */
+       if(color != MI_BLACK_PIXEL(mi)) {
+         XSetForeground(MI_DISPLAY(mi), MI_GC(mi), MI_WHITE_PIXEL(mi));
        }
        }
+       i = 0;
+       p[i++] = a[1]; p[i++] = a[2]; p[i++] = a[3]; p[i++] = a[5];
+       XFillPolygon(MI_DISPLAY(mi), MI_WINDOW(mi), MI_GC(mi),
+                                p, i, Convex, CoordModeOrigin);
+}
 
 
-       /* Clear the background. */
-       MI_CLEARWINDOW(mi);
+static void
+show_ring(ModeInfo *mi, unsigned long color, Trace *s)
+{
+       jugglestruct *sp = &juggles[MI_SCREEN(mi)];
+       short x = (short)(MI_WIDTH(mi)/2 + s->x * sp->scale);
+       short y = (short)(MI_HEIGHT(mi) - s->y * sp->scale);
+       double radius = 15 * sp->scale;
+       short thickness = (short)(8 * sqrt(sp->scale));
+
+       /* Avoid wrapping */
+       if(s->y*sp->scale >  MI_HEIGHT(mi) * 2) return;
+
+       XSetForeground(MI_DISPLAY(mi), MI_GC(mi), color);
+       XSetLineAttributes(MI_DISPLAY(mi), MI_GC(mi),
+                                          thickness, LineSolid, CapRound, JoinRound);
+
+       XDrawArc(MI_DISPLAY(mi), MI_WINDOW(mi), MI_GC(mi),
+                        (short)(x - radius*PERSPEC), (short)(y - radius),
+                        (short)(2*radius*PERSPEC), (short)(2*radius),
+                        0, 23040);
+}
 
 
-       draw_figure(mi);
 
 
-       /* record start time */
-       sp->begintime = time(NULL);
+static void
+show_bball(ModeInfo *mi, unsigned long color, Trace *s)
+{
+       jugglestruct *sp = &juggles[MI_SCREEN(mi)];
+       short x = (short)(MI_WIDTH(mi)/2 + s->x * sp->scale);
+       short y = (short)(MI_HEIGHT(mi) - s->y * sp->scale);
+       double radius = 12 * sp->scale;
+       int offset = (int)(s->angle*64*180/M_PI);
+       int holesize = (int)(3.0*sqrt(sp->scale));
+
+       /* Avoid wrapping */
+       if(s->y*sp->scale >  MI_HEIGHT(mi) * 2) return;
+
+       XSetForeground(MI_DISPLAY(mi), MI_GC(mi), MI_BLACK_PIXEL(mi));
+       XFillArc(MI_DISPLAY(mi), MI_WINDOW(mi), MI_GC(mi),
+                        (short)(x - radius), (short)(y - radius),
+                        (short)(2*radius), (short)(2*radius),
+                        0, 23040);
+       XSetForeground(MI_DISPLAY(mi), MI_GC(mi), color);
+       XSetLineAttributes(MI_DISPLAY(mi), MI_GC(mi), 2,
+                                          LineSolid, CapRound, JoinRound);
+       XDrawArc(MI_DISPLAY(mi), MI_WINDOW(mi), MI_GC(mi),
+                        (short)(x - radius), (short)(y - radius),
+                        (short)(2*radius), (short)(2*radius),
+                        0, 23040);
+
+       /* Draw finger holes */
+       XSetLineAttributes(MI_DISPLAY(mi), MI_GC(mi), holesize,
+                                          LineSolid, CapRound, JoinRound);
+
+       XDrawArc(MI_DISPLAY(mi), MI_WINDOW(mi), MI_GC(mi),
+                        (short)(x - radius*0.5), (short)(y - radius*0.5),
+                        (short)(2*radius*0.5), (short)(2*radius*0.5),
+                        (offset + 960) % 23040, 0);
+       XDrawArc(MI_DISPLAY(mi), MI_WINDOW(mi), MI_GC(mi),
+                        (short)(x - radius*0.7), (short)(y - radius*0.7),
+                        (short)(2*radius*0.7), (short)(2*radius*0.7),
+                        (offset + 1920) % 23040, 0);
+       XDrawArc(MI_DISPLAY(mi), MI_WINDOW(mi), MI_GC(mi),
+                        (short)(x - radius*0.7), (short)(y - radius*0.7),
+                        (short)(2*radius*0.7), (short)(2*radius*0.7),
+                        offset % 23040, 0);
+}
 
 
-       free_pattern(sp);
+/**************************************************************************
+ *                    Public Functions                                    *
+ *                                                                        *
+ **************************************************************************/
 
 
-       /* create circular list */
-       INSERT_AFTER_TOP(sp->head, sp->head);
 
 
-       /* generate pattern */
-       if (pattern == NULL) {
+void
+release_juggle(ModeInfo * mi)
+{
+  if (juggles != NULL) {
+       int screen;
+
+       for (screen = 0; screen < MI_NUM_SCREENS(mi); screen++)
+         free_juggle(&juggles[screen]);
+       free(juggles);
+       juggles = (jugglestruct *) NULL;
+  }
+  if (mode_font!=None) {
+       XFreeFontInfo(NULL,mode_font,1);
+       mode_font = None;
+  }
+}
+
+/* FIXME: refill_juggle currently just appends new throws to the
+ * programme.  This is fine if the programme is empty, but if there
+ * are still some trajectories left then it really should take these
+ * into account */
+
+static void
+refill_juggle(ModeInfo * mi)
+{
+  jugglestruct *sp = NULL;
+  int i;
+
+  if (juggles == NULL)
+       return;
+  sp = &juggles[MI_SCREEN(mi)];
+
+  /* generate pattern */
+  if (pattern == NULL) {
 
 #define MAXPAT 10
 
 #define MAXPAT 10
-#define MAXREPEAT 30
+#define MAXREPEAT 300
 #define CHANGE_BIAS 8 /* larger makes num_ball changes less likely */
 #define POSITION_BIAS 20 /* larger makes hand movements less likely */
 
 #define CHANGE_BIAS 8 /* larger makes num_ball changes less likely */
 #define POSITION_BIAS 20 /* larger makes hand movements less likely */
 
-         int count = 0;
-         int num_balls = MINBALLS + NRAND(MAXBALLS - MINBALLS);
-         while (count < MI_CYCLES(mi)) {
-               char buf[MAXPAT * 3 + 3], *b = buf;
-               int maxseen = 0;
-               int l = NRAND(MAXPAT) + 1;
-               int t = NRAND(MAXREPEAT) + 1;
-
-               { /* vary number of balls */
-                 int new_balls = num_balls;
-                 int change;
-
-                 if (new_balls == 2) /* Do not juggle 2 that often */
-                   change = NRAND(2 + CHANGE_BIAS / 4);
-                 else
-                   change = NRAND(2 + CHANGE_BIAS);
-                 switch (change) {
-                 case 0:
-                       new_balls++;
-                       break;
-                 case 1:
-                       new_balls--;
-                       break;
-                 default:
-                       break; /* NO-OP */
-                 }
-                 if (new_balls < MINBALLS) {
-                       new_balls += 2;
-                 }
-                 if (new_balls > MAXBALLS) {
-                       new_balls -= 2;
-                 }
-                 if (new_balls < num_balls) {
-                       if (!program(mi, "[*]", 1)) /* lose ball */
-                               return;
-                 }
-                 num_balls = new_balls;
+       int count = 0;
+       while (count < MI_CYCLES(mi)) {
+         char buf[MAXPAT * 3 + 3], *b = buf;
+         int maxseen = 0;
+         int l = NRAND(MAXPAT) + 1;
+         int t = NRAND(MIN(MAXREPEAT, (MI_CYCLES(mi) - count))) + 1;
+
+         { /* vary number of balls */
+               int new_balls = sp->num_balls;
+               int change;
+
+               if (new_balls == 2) /* Do not juggle 2 that often */
+                 change = NRAND(2 + CHANGE_BIAS / 4);
+               else
+                 change = NRAND(2 + CHANGE_BIAS);
+               switch (change) {
+               case 0:
+                 new_balls++;
+                 break;
+               case 1:
+                 new_balls--;
+                 break;
+               default:
+                 break; /* NO-OP */
                }
                }
-               count++;
-
-               if (NRAND(2) && patternindex[num_balls].number) {
-                 /* Pick from PortFolio */
-                 if (!program(mi,
-                         portfolio[patternindex[num_balls].start +
-                                 NRAND(patternindex[num_balls].number)].pattern,
-                                 t))
+               if (new_balls < patternindex.minballs) {
+                 new_balls += 2;
+               }
+               if (new_balls > patternindex.maxballs) {
+                 new_balls -= 2;
+               }
+               if (new_balls < sp->num_balls) {
+                 if (!program(mi, "[*]", NULL, 1)) /* lose ball */
                        return;
                        return;
-               } else {
-                 /* Invent a new pattern */
-                 *b++='[';
-                 for(i = 0; i < l; i++){
-                       int n, m;
-                       do { /* Triangular Distribution => high values more likely */
-                         m = NRAND(num_balls + 1);
-                         n = NRAND(num_balls + 1);
-                       } while(m >= n);
-                       if (n == num_balls) {
-                         maxseen = 1;
-                       }
-                       switch(NRAND(6 + POSITION_BIAS)){
-                       case 0:            /* Inside throw */
-                         *b++ = '-'; break;
-                       case 1:            /* Outside throw */
-                         *b++ = '+'; break;
-                       case 2:            /* Cross throw */
-                         *b++ = '='; break;
-                       case 3:            /* Cross catch */
-                         *b++ = '&'; break;
-                       case 4:            /* Cross throw and catch */
-                         *b++ = 'x'; break;
-                       case 5:            /* Bounce */
-                         *b++ = '_'; break;
-                       default:
-                         break; /* NO-OP */
-                       }
+               }
+               sp->num_balls = new_balls;
+         }
 
 
-                       *b++ = n + '0';
-                       *b++ = ' ';
+         count += t;
+         if (NRAND(2) && patternindex.index[sp->num_balls].number) {
+               /* Pick from PortFolio */
+               int p = patternindex.index[sp->num_balls].start +
+                 NRAND(patternindex.index[sp->num_balls].number);
+               if (!program(mi, portfolio[p].pattern, portfolio[p].name, t))
+                 return;
+         } else {
+               /* Invent a new pattern */
+               *b++='[';
+               for(i = 0; i < l; i++){
+                 int n, m;
+                 do { /* Triangular Distribution => high values more likely */
+                       m = NRAND(sp->num_balls + 1);
+                       n = NRAND(sp->num_balls + 1);
+                 } while(m >= n);
+                 if (n == sp->num_balls) {
+                       maxseen = 1;
                  }
                  }
-                 *b++ = ']';
-                 *b = '\0';
-                 if (maxseen) {
-                       if (!program(mi, buf, t))
-                               return;
+                 switch(NRAND(5 + POSITION_BIAS)){
+                 case 0:            /* Outside throw */
+                       *b++ = '+'; break;
+                 case 1:            /* Cross throw */
+                       *b++ = '='; break;
+                 case 2:            /* Cross catch */
+                       *b++ = '&'; break;
+                 case 3:            /* Cross throw and catch */
+                       *b++ = 'x'; break;
+                 case 4:            /* Bounce */
+                       *b++ = '_'; break;
+                 default:
+                       break;             /* Inside throw (default) */
                  }
                  }
+
+                 *b++ = n + '0';
+                 *b++ = ' ';
+               }
+               *b++ = ']';
+               *b = '\0';
+               if (maxseen) {
+                 if (!program(mi, buf, NULL, t))
+                       return;
                }
          }
                }
          }
-       } else { /* pattern supplied in height or 'a' notation */
-         if (!program(mi, pattern, MI_CYCLES(mi)))
-               return;
        }
        }
+  } else { /* pattern supplied in height or 'a' notation */
+       if (!program(mi, pattern, NULL, MI_CYCLES(mi)))
+         return;
+  }
 
 
-       adam(sp);
+  adam(sp);
 
 
-       if (!part(sp))
-               return;
+  name(sp);
 
 
-       lob(mi);
+  if (!part(sp))
+       return;
 
 
-       positions(sp);
+  lob(mi);
 
 
-       if (!projectile(sp))
-               return;
+  clap(sp);
 
 
-       hands(sp);
+  positions(sp);
 
 
-#ifdef OLDDEBUG
-       dump(sp);
+  if (!projectile(sp)) {
+       free_juggle(sp);
+       return;
+  }
+
+  hands(sp);
+#ifdef DEBUG
+  if(MI_IS_DEBUG(mi)) dump(sp);
 #endif
 }
 #endif
 }
+void
+change_juggle(ModeInfo * mi)
+{
+  jugglestruct *sp = NULL;
+  Trajectory *t;
 
 
-#define CUBIC(s, t) ((((s).a * (t) + (s).b) * (t) + (s).c) * (t) + (s).d)
+  if (juggles == NULL)
+       return;
+  sp = &juggles[MI_SCREEN(mi)];
 
 
-#ifdef SUNOS4
-/*-
- * Workaround SunOS 4 framebuffer bug which causes balls to leave dust
- * trace behind when erased
- */
-#define ERASE_BALL(x,y) \
-       XSetForeground(dpy, gc, MI_BLACK_PIXEL(mi)); \
-       XFillArc(dpy, window, gc, \
-               (x) - BALLRADIUS - 2, (y) - BALLRADIUS - 2, \
-               2*(BALLRADIUS + 2), 2*(BALLRADIUS + 2), 0, 23040)
-#else
+  /* Strip pending trajectories */
+  for (t = sp->head->next; t != sp->head; t = t->next) {
+       if(t->start > sp->time || t->finish < sp->time) {
+         Trajectory *n = t;
+         t=t->prev;
+         trajectory_destroy(n);
+       }
+  }
 
 
-#define ERASE_BALL(x,y) \
-       XSetForeground(dpy, gc, MI_BLACK_PIXEL(mi)); \
-       XFillArc(dpy, window, gc, \
-               (x) - BALLRADIUS, (y) - BALLRADIUS, \
-               2*BALLRADIUS, 2*BALLRADIUS, 0, 23040)
-#endif
+  /* Pick the current object theme */
+  sp->objtypes = choose_object();
 
 
-static void
-draw_juggle_ball(ModeInfo *mi, unsigned long color, int x, int y, double degree_offset, int divisions)
+  refill_juggle(mi);
+
+  /* Clean up the Screen.  Don't use MI_CLEARWINDOW(mi), since we
+        don't all those special effects. */
+  XClearWindow(MI_DISPLAY(mi), MI_WINDOW(mi));
+
+  show_figure(mi, MI_WHITE_PIXEL(mi), True);
+
+}
+
+#ifdef STANDALONE
+/* Used by xscreensaver.  xlock just uses init_juggle */
+void
+reshape_juggle(ModeInfo * mi, int width, int height)
 {
 {
-       Display    *dpy = MI_DISPLAY(mi);
-       Window      window = MI_WINDOW(mi);
-       GC          gc = MI_GC(mi);
-       jugglestruct *sp = &juggles[MI_SCREEN(mi)];
-       int offset;
-
-       XSetForeground(dpy, gc, color);
-       if ((color == MI_WHITE_PIXEL(mi)) ||
-           ((divisions != 2) && (divisions != 4)) || sp->solid) {
-               XFillArc(dpy, window, gc,
-                       x - BALLRADIUS, y - BALLRADIUS,
-                       2*BALLRADIUS, 2*BALLRADIUS,
-                       0, 23040);
-               return;
-       }
-       offset = (int) (degree_offset * 64);
-       if (divisions == 4) { /* 90 degree divisions */
-               XFillArc(dpy, window, gc,
-                       x - BALLRADIUS, y - BALLRADIUS,
-                       2*BALLRADIUS, 2*BALLRADIUS,
-                       offset, 5760);
-               XFillArc(dpy, window, gc,
-                       x - BALLRADIUS, y - BALLRADIUS,
-                       2*BALLRADIUS, 2*BALLRADIUS,
-                       (offset + 11520) % 23040, 5760);
-               XSetForeground(dpy, gc, MI_WHITE_PIXEL(mi));
-               XFillArc(dpy, window, gc,
-                       x - BALLRADIUS, y - BALLRADIUS,
-                       2*BALLRADIUS, 2*BALLRADIUS,
-                       (offset + 5760) % 23040, 5760);
-               XFillArc(dpy, window, gc,
-                       x - BALLRADIUS, y - BALLRADIUS,
-                       2*BALLRADIUS, 2*BALLRADIUS,
-                       (offset + 17280) % 23040, 5760);
-       } else { /* 180 degree divisions */
-               XFillArc(dpy, window, gc,
-                       x - BALLRADIUS, y - BALLRADIUS,
-                       2*BALLRADIUS, 2*BALLRADIUS,
-                       offset, 11520);
-               XSetForeground(dpy, gc, MI_WHITE_PIXEL(mi));
-               XFillArc(dpy, window, gc,
-                       x - BALLRADIUS, y - BALLRADIUS,
-                       2*BALLRADIUS, 2*BALLRADIUS,
-                       (offset + 11520) % 23040, 11520);
-       }
-       XFlush(dpy);
+  init_juggle(mi);
 }
 }
+#endif
 
 void
 
 void
-draw_juggle(ModeInfo * mi)
+init_juggle(ModeInfo * mi)
 {
 {
-       Display    *dpy = MI_DISPLAY(mi);
-       Window      window = MI_WINDOW(mi);
-       GC          gc = MI_GC(mi);
-       Trajectory *traj;
-       int future = 0;
-       int length = 0;
-       jugglestruct *sp;
-
-       if (juggles == NULL)
-               return;
+  jugglestruct *sp;
+  int i;
+
+  if (only && *only && strcmp(only, " ")) {
+    balls = clubs = torches = knives = rings = bballs = False;
+    if (!strcasecmp (only, "balls"))   balls   = True;
+    else if (!strcasecmp (only, "clubs"))   clubs   = True;
+    else if (!strcasecmp (only, "torches")) torches = True;
+    else if (!strcasecmp (only, "knives"))  knives  = True;
+    else if (!strcasecmp (only, "rings"))   rings   = True;
+    else if (!strcasecmp (only, "bballs"))  bballs  = True;
+    else {
+      (void) fprintf (stderr,
+               "Juggle: -only must be one of: balls, clubs, torches, knives,\n"
+               "\t rings, or bballs (not \"%s\")\n", only);
+#ifdef STANDALONE /* xlock mustn't exit merely because of a bad argument */
+      exit (1);
+#endif
+    }
+  }
+
+  if (pattern != NULL && *pattern == '.') {
+       pattern = NULL;
+  }
+  if (pattern == NULL && patternindex.maxballs == 0) {
+       /* pattern list needs indexing */
+       int nelements = XtNumber(portfolio);
+       int numpat = 0;
+
+       /* sort according to number of balls */
+       qsort((void*)portfolio, nelements,
+                 sizeof(portfolio[1]), compare_num_balls);
+
+       /* last pattern has most balls */
+       patternindex.maxballs = get_num_balls(portfolio[nelements - 1].pattern);
+       /* run through sorted list, indexing start of each group
+          and number in group */
+       patternindex.maxballs = 1;
+       for (i = 0; i < nelements; i++) {
+         int b = get_num_balls(portfolio[i].pattern);
+         if (b > patternindex.maxballs) {
+               patternindex.index[patternindex.maxballs].number = numpat;
+               if(numpat == 0) patternindex.minballs = b;
+               patternindex.maxballs = b;
+               numpat = 1;
+               patternindex.index[patternindex.maxballs].start = i;
+         } else {
+               numpat++;
+         }
+       }
+       patternindex.index[patternindex.maxballs].number = numpat;
+  }
+
+  /* Clean up the Screen.  Don't use MI_CLEARWINDOW(mi), since we may
+        only be resizing and then we won't all those special effects. */
+  XClearWindow(MI_DISPLAY(mi), MI_WINDOW(mi));
+
+  if (juggles == NULL) { /* First-time initialisation */
+
+       /* allocate jugglestruct */
+       if ((juggles =
+                (jugglestruct *)calloc(MI_NUM_SCREENS(mi),
+                                                               sizeof (jugglestruct))) == NULL) {
+         release_juggle(mi);
+         return;
+       }
+
        sp = &juggles[MI_SCREEN(mi)];
        sp = &juggles[MI_SCREEN(mi)];
-       if (sp->trace == NULL)
-               return;
 
 
-       MI_IS_DRAWN(mi) = True;
+       sp->count = ABS(MI_COUNT(mi));
+       if (sp->count == 0)
+         sp->count = 200;
 
 
-       draw_figure(mi);
+       /* record start time */
+       sp->begintime = time(NULL);
+       if(patternindex.maxballs > 0) {
+         sp->num_balls = patternindex.minballs +
+               NRAND(patternindex.maxballs - patternindex.minballs);
+       }
 
 
-       {
-         struct timeval tv;
-# ifdef GETTIMEOFDAY_TWO_ARGS
-      struct timezone tzp;
-         gettimeofday(&tv, &tzp);
-# else
-         gettimeofday(&tv);
-# endif
+       show_figure(mi, MI_WHITE_PIXEL(mi), True); /* Draw figure.  Also discovers
+                                                         information about the juggler's
+                                                         proportions */
+
+       /* "7" should be about three times the height of the juggler's
+          shoulders */
+       sp->Gr = -GRAVITY(3 * sp->arm[0][RIGHT][SHOULDER].y,
+                                         7 * THROW_CATCH_INTERVAL);
+
+       if(!balls && !clubs && !torches && !knives && !rings && !bballs)
+         balls = True; /* Have to juggle something! */
+
+       /* create circular trajectory list */
+       ADD_ELEMENT(Trajectory, sp->head, sp->head);
+       if(sp->head == NULL){
+         free_juggle(sp);
+         return;
+       }
+
+       /* create circular object list */
+       ADD_ELEMENT(Object, sp->objects, sp->objects);
+       if(sp->objects == NULL){
+         free_juggle(sp);
+         return;
+       }
+
+       /* create circular wander list */
+       ADD_ELEMENT(Wander, sp->wander, sp->wander);
+       if(sp->wander == NULL){
+         free_juggle(sp);
+         return;
+       }
+       (void)wander(sp, 0); /* Initialize wander */
+
+       sp->pattern =  strdup(""); /* Initialise saved pattern with
+                                                                 free-able memory */
+
+       /* Set up programme */
+       change_juggle(mi);
+
+  }
+
+  /* Only put things here that won't interrupt the programme during
+        a window resize */
+
+  sp = &juggles[MI_SCREEN(mi)];
+
+  /* Use MIN so that users can resize in interesting ways, eg
+        narrow windows for tall patterns, etc */
+  sp->scale = MIN(MI_HEIGHT(mi)/480.0, MI_WIDTH(mi)/160.0);
 
 
-         sp->time = (int) ((tv.tv_sec - sp->begintime)*1000 + tv.tv_usec/1000);
+  if(describe && mode_font == None) { /* Check to see if there's room to describe patterns. */
+       mode_font = XQueryFont(MI_DISPLAY(mi), XGContextFromGC(MI_GC(mi)));
+  }
+}
+
+void
+draw_juggle(ModeInfo * mi)
+{
+  Trajectory *traj = NULL;
+  Object *o = NULL;
+  unsigned long future = 0;
+  jugglestruct *sp = NULL;
+  char *pattern = NULL;
+  double cx;
+
+  if (juggles == NULL)
+       return;
+  sp = &juggles[MI_SCREEN(mi)];
+
+  MI_IS_DRAWN(mi) = True;
+
+  /* Update timer */
+  if (real) {
+       struct timeval tv;
+       (void)gettimeofday(&tv, NULL);
+       sp->time = (int) ((tv.tv_sec - sp->begintime)*1000 + tv.tv_usec/1000);
+  } else {
+       sp->time += MI_DELAY(mi) / 1000;
+  }
+
+  /* First pass: Move arms and strip out expired elements */
+  for (traj = sp->head->next; traj != sp->head; traj = traj->next) {
+       if (traj->status != PREDICTOR) {
+         /* Skip any elements that need further processing */
+         /* We could remove them, but there shoudn't be many and they
+                would be needed if we ever got the pattern refiller
+                working */
+         continue;
+       }
+       if (traj->start > future) { /* Lookahead to the end of the show */
+         future = traj->start;
        }
        }
-       for (traj = sp->head->next; traj != sp->head; traj = traj->next) {
-         length++;
-         if (traj->status != PREDICTOR) {
-               continue;
-         }
-         if (traj->start > future) {
-               future = traj->start;
+       if (sp->time < traj->start) { /* early */
+         continue;
+       } else if (sp->time < traj->finish) { /* working */
+
+         /* Look for pattern name */
+         if(traj->pattern != NULL) {
+               pattern=traj->pattern;
          }
          }
-         if (sp->time < traj->start) { /* early */
-               continue;
-         } else if (sp->time < traj->finish) { /* working */
-               int x = (int) CUBIC(traj->xp, sp->time);
-               int y = (int) CUBIC(traj->yp, sp->time);
-               unsigned long color;
 
 
-               if (MI_NPIXELS(mi) > 2) {
-                 color = MI_PIXEL(mi, traj->color);
-               } else {
-                 color = MI_WHITE_PIXEL(mi);
-               }
-               if (traj->type == Empty || traj->type == Full) {
-                 draw_arm(mi, traj->hand, &x, &y);
-               }
-               if (traj->type == Ball || traj->type == Full) {
-                 if(trail > 0) {
-                       ERASE_BALL(sp->trace[sp->traceindex].x,
-                               sp->trace[sp->traceindex].y);
-                       sp->trace[sp->traceindex].x = traj->x;
-                       sp->trace[sp->traceindex].y = traj->y;
-                       if (++sp->traceindex >= trail) {
-                         sp->traceindex = 0;
-                       }
+         if (traj->type == Empty || traj->type == Full) {
+               /* Only interested in hands on this pass */
+               double angle = traj->angle + traj->spin * (sp->time - traj->start);
+               double xd = 0, yd = 0;
+               DXPoint p;
+
+               /* Find the catching offset */
+               if(traj->object != NULL) {
+                 if(ObjectDefs[traj->object->type].handle > 0) {
+                       /* Handles Need to be oriented */
+                       xd = ObjectDefs[traj->object->type].handle *
+                         PERSPEC * sin(angle);
+                       yd = ObjectDefs[traj->object->type].handle *
+                         cos(angle);
                  } else {
                  } else {
-                       ERASE_BALL(traj->x, traj->y);
+                       /* Balls are always caught at the bottom */
+                       xd = 0;
+                       yd = -4;
                  }
                  }
-                 draw_juggle_ball(mi, color, x, y, traj->degree_offset, traj->divisions);
-                 traj->degree_offset = traj->degree_offset +
-                   SPIN_DEGREES * traj->spin / sp->count;
-                 if (traj->degree_offset < 0.0)
-                       traj->degree_offset += 360.0;
-                 else if (traj->degree_offset >= 360.0)
-                       traj->degree_offset -= 360.0;
                }
                }
-               traj->x = x;
-               traj->y = y;
-         } else { /* expired */
-               Trajectory *n = traj;
-
-               ERASE_BALL(traj->x, traj->y);
-               traj=traj->prev;
-               REMOVE(n);
+               p.x = (CUBIC(traj->xp, sp->time) - xd);
+               p.y = (CUBIC(traj->yp, sp->time) + yd);
+               reach_arm(mi, traj->hand, &p);
+
+               /* Store updated hand position */
+               traj->x = p.x + xd;
+               traj->y = p.y - yd;
+         }
+         if (traj->type == Ball || traj->type == Full) {
+               /* Only interested in objects on this pass */
+               double x, y;
+               Trace *s;
+
+               if(traj->type == Full) {
+                 /* Adjusted these in the first pass */
+                 x = traj->x;
+                 y = traj->y;
+               } else {
+                 x = CUBIC(traj->xp, sp->time);
+                 y = CUBIC(traj->yp, sp->time);
+               }
+
+               ADD_ELEMENT(Trace, s, traj->object->trace->prev);
+               s->x = x;
+               s->y = y;
+               s->angle = traj->angle + traj->spin * (sp->time - traj->start);
+               s->divisions = traj->divisions;
+               traj->object->tracelen++;
+               traj->object->active = True;
          }
          }
+       } else { /* expired */
+         Trajectory *n = traj;
+         traj=traj->prev;
+         trajectory_destroy(n);
        }
        }
+  }
 
 
-       /*** FIXME-BEGIN ***/
-       /* pattern generator would refill here when necessary */
-#if 1
-       if (future == 0) {
-#else
-       if (sp->count > MI_CYCLES(mi)) { /* pick a new juggle */
-#endif
-                       init_juggle(mi);
+  /* Erase end of trails */
+  for (o = sp->objects->next; o != sp->objects; o = o->next) {
+       Trace *s;
+       for (s = o->trace->next;
+                o->trace->next != o->trace &&
+                  (o->count == 0 || o->tracelen > o->tail);
+                s = o->trace->next) {
+         ObjectDefs[o->type].draw(mi, MI_BLACK_PIXEL(mi), s);
+         REMOVE(s);
+         o->tracelen--;
+         if(o->count <= 0 && o->tracelen <= 0) {
+               /* Object no longer in use and trail gone */
+               Object *n = o;
+               o = o->prev;
+               object_destroy(n);
+         }
+         if(o->count <= 0) break; /* Allow loop for catch-up, but not clean-up */
+       }
+  }
+
+  show_arms(mi, MI_BLACK_PIXEL(mi));
+  cx = wander(sp, sp->time);
+  /* Reduce flicker by only permitting movements of more than a pixel */
+  if(fabs((sp->cx - cx))*sp->scale >= 2.0 ) {
+       show_figure(mi, MI_BLACK_PIXEL(mi), False);
+       sp->cx = cx;
+  }
+
+  show_figure(mi, MI_WHITE_PIXEL(mi), False);
+
+  show_arms(mi, MI_WHITE_PIXEL(mi));
+
+  /* Draw Objects */
+  for (o = sp->objects->next; o != sp->objects; o = o->next) {
+       if(o->active) {
+         ObjectDefs[o->type].draw(mi,MI_PIXEL(mi, o->color), o->trace->prev);
+         o->active = False;
        }
        }
-       /*** FIXME-END ***/
+  }
+
 
 
+  /* Save pattern name so we can erase it when it changes */
+  if(pattern != NULL && strcmp(sp->pattern, pattern) != 0 ) {
+       /* Erase old name */
+       XSetForeground(MI_DISPLAY(mi), MI_GC(mi), MI_BLACK_PIXEL(mi));
+       XDrawString(MI_DISPLAY(mi), MI_WINDOW(mi), MI_GC(mi),
+                               0, 20, sp->pattern, strlen(sp->pattern));
+       free(sp->pattern);
+       sp->pattern = strdup(pattern);
+
+       if (MI_IS_VERBOSE(mi)) {
+         (void) fprintf(stderr, "Juggle[%d]: Running: %s\n",
+                                        MI_SCREEN(mi), sp->pattern);
+       }
+  }
+  if(mode_font != None &&
+        XTextWidth(mode_font, sp->pattern, strlen(sp->pattern)) < MI_WIDTH(mi)) {
+       /* Redraw once a cycle, in case it's obscured or it changed */
+       XSetForeground(MI_DISPLAY(mi), MI_GC(mi), MI_WHITE_PIXEL(mi));
+       XDrawString(MI_DISPLAY(mi), MI_WINDOW(mi), MI_GC(mi),
+                               0, 20, sp->pattern, strlen(sp->pattern));
+  }
+
+#ifdef MEMTEST
+  if((int)(sp->time/10) % 1000 == 0)
+       (void) fprintf(stderr, "sbrk: %d\n", (int)sbrk(0));
+#endif
+
+  if (future < sp->time + 100 * THROW_CATCH_INTERVAL) {
+       refill_juggle(mi);
+  } else if (sp->time > 1<<30) { /* Hard Reset before the clock wraps */
+       release_juggle(mi);
+       init_juggle(mi);
+  }
 }
 
 #endif /* MODE_juggle */
 }
 
 #endif /* MODE_juggle */
index e43ea048bb502a9addbbd39c99efbb0e464b7767..16b5d830c56547f10762d814ca9a1731243f3661 100644 (file)
+'\" t
+.\" ** The above line should force tbl to be used as a preprocessor **
 .TH XScreenSaver 1 "" "X Version 11"
 .SH NAME
 .TH XScreenSaver 1 "" "X Version 11"
 .SH NAME
-juggle - juggling man screen saver.
+juggle \- juggling man screen saver.
 .SH SYNOPSIS
 .B juggle
 .SH SYNOPSIS
 .B juggle
-[\-display \fIhost:display.screen\fP]
-[\-visual \fIvisual\fP]
-[\-window]
-[\-root]
-[\-count \fInumber\fP]
-[\-trail \fInumber\fP]
-[\-solid]
+.RB [ \-display
+.IR host:display.screen ]
+.RB [ \-root ]
+.RB [ \-window ]
+.RB [ \-mono ]
+.RB [ \-install | \-noinstall ]
+.RB [ \-visual
+.IR visual ]
+.RB [ \-window\-id
+.IR id ]
+.RB [ \-pattern
+.IR pattern ]
+.RB [ \-tail
+.IR number ]
+.RB [ \-real | \-no\-real ]
+.RB [ \-describe | \-no\-describe ]
+.RB [ \-balls | \-no\-balls ]
+.RB [ \-clubs | \-no\-clubs ]
+.RB [ \-torches | \-no\-torches ]
+.RB [ \-knives | \-no\-knives ]
+.RB [ \-rings | \-no\-rings ]
+.RB [ \-bballs | \-no\-bballs ]
+.RB [ \-count
+.IR count ]
+.RB [ \-cycles
+.IR cycles ]
+.RB [ \-delay
+.IR delay ]
+.RB [ \-ncolors
+.IR ncolors ]
 .SH DESCRIPTION
 .SH DESCRIPTION
-Draws a juggling stick-man.
+Draws a stick-man juggling various collections of objects.
 .SH OPTIONS
 .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
+.TP
+.BI \-display\  host:display.screen
+X11 display to use.  Overrides
+.B DISPLAY
+environment variable.
+.TP
 .B \-root
 Draw on the root window.
 .B \-root
 Draw on the root window.
-.TP 8
-.B \-count \fInumber\fP
-Speed. 50 - 1000.  Default: 150.
-.TP 8
-.B \-trail \fInumber\fP
-Trail Length.  0 - 100.  Default: 0.
-.TP 8
-.B \-solid | \-no-solid
-Whether to draw checkered balls.
+.TP
+.B \-window
+Draw on a newly-created X window.  This is the default.
+.TP
+.B \-mono
+Draw in monochrome.
+.TP
+.B \-install\  |\  \-noinstall
+Turn on/off installing colormap.
+.TP
+.BI \-visual\  visual
+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
+.BI \-window\-id\  id
+Draw on an already existing X window.
+.TP
+.BI \-pattern\ \(dq pattern \(dq
+Specify juggling pattern in annotated
+.B site-swap
+notation.  In 
+.B site-swap
+notation, the "height" of each throw is given.  E.g., "3" is the height
+needed to juggle a 3\-Cascade.  Note that these sequences need to be
+chosen carefully, to avoid collisions.
+
+Annotations indicate relative hand movements or tricks:
+.TS
+cb l.
+\&\-   Inside throw (default)
++      Outside throw
+\&=    Cross Throw
+&      Cross Catch
+x      Cross Throw and Catch
+\&_    Bounce
+.TE
+.TP
+.BI \-pattern\ \(dq[ pattern ]\(dq
+Specify juggling pattern in annotated
+.B Adam
+notation.  Adam notation is a little harder to visualize.  Each
+integer
+.B n
+represents a cyclic permutation of (0...n).  The equivalent
+.B site-swap
+value is determined by calculating how many of the permutations it
+takes to get back to the identity.  The largest number used is the
+same as the number of objects in the pattern.  The advantage of Adam
+notation is that these sequences do not need to be chosen carefully,
+since all possible sequences are juggle-able.  Annotations are the same
+as in
+.B site-swap
+notation.
+
+For example, both of these describe a 3\-Shower:
+.IP
+.B \-pattern\ "+5 1"
+.IP
+.B \-pattern\ "[+3 1]"
+
+For further examples, see the
+.B portfolio
+list in the source code.
+.TP
+.BI \-tail\  number
+Minimum Trail Length.  0 \- 100.  Default: 0.  Objects may override
+this, for example flaming torches always leave a trail.
+.TP
+.BR \-real\  |\  \-no\-real
+Turn on/off real-time juggling.
+.B Deprecated.
+There should be no need to turn off real-time juggling, even on slow
+systems.  Adjust speed using
+.B \-count
+above.
+.TP
+.BR \-describe\  |\  \-no\-describe
+Turn on/off pattern descriptions.
+.TP 
+.BR \-balls\  |\  \-no\-balls
+Turn on/off Balls.
+.TP
+.BR \-clubs\  |\  \-no\-clubs
+Turn on/off Clubs.
+.TP
+.BR \-torches\  |\  \-no\-torches
+Turn on/off Flaming Torches.
+.TP
+.BR \-knives\  |\  \-no\-knives
+Turn on/off Knives.
+.TP
+.BR \-rings\  |\  \-no\-rings
+Turn on/off Rings.
+.TP
+.BR \-bballs\  |\  \-no\-bballs
+Turn on/off Bowling Balls.
+.TP
+.BI \-count\  number
+Speed. 50 \- 1000.  Default: 200.  This determines the expected time
+interval between a throw and the next catch, in milliseconds.
+.TP
+.BI \-cycles\  number
+Performance Length. 50 \- 1000.  Default: 1000.  Setting this smaller
+will force the juggler to switch patterns (and objects) more often.
+.TP
+.BI \-delay\  delay
+Additional delay between frames, in microseconds.  Default: 10000.
+.B Deprecated.
+Adjust speed using
+.BR \-count .
+.TP
+.BI \-ncolors\  ncolors
+Maximum number of colors to use.  Default: 32.
 .SH ENVIRONMENT
 .PP
 .SH ENVIRONMENT
 .PP
-.TP 8
+.TP
 .B DISPLAY
 to get the default host and display number.
 .B DISPLAY
 to get the default host and display number.
-.TP 8
+.TP
 .B XENVIRONMENT
 to get the name of a resource file that overrides the global resources
 stored in the RESOURCE_MANAGER property.
 .B XENVIRONMENT
 to get the name of a resource file that overrides the global resources
 stored in the RESOURCE_MANAGER property.
@@ -45,12 +172,13 @@ stored in the RESOURCE_MANAGER property.
 .BR X (1),
 .BR xscreensaver (1)
 .SH COPYRIGHT
 .BR X (1),
 .BR xscreensaver (1)
 .SH COPYRIGHT
-Copyright \(co 2002 by Tim Auckland.  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.
+Copyright \(co 1996,2000,2002,2004 by Tim Auckland.  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
 Tim Auckland.
 .SH AUTHOR
 Tim Auckland.
index 8da6bb58d718bfea49accfea251e6435220d0dbd..f8342f20f583109ad710e8704302d5c29997e048 100644 (file)
@@ -33,7 +33,8 @@ static const char sccsid[] = "@(#)lightning.c 5.00 2000/11/01 xlockmore";
 #define HACK_INIT init_lightning
 #define HACK_DRAW draw_lightning
 #define lightning_opts xlockmore_opts
 #define HACK_INIT init_lightning
 #define HACK_DRAW draw_lightning
 #define lightning_opts xlockmore_opts
-#define DEFAULTS "*delay: 10000 \n"
+#define DEFAULTS "*delay: 10000 \n" \
+                 "*ncolors: 64  \n"
 #define BRIGHT_COLORS
 #include "xlockmore.h"         /* in xscreensaver distribution */
 #else /* STANDALONE */
 #define BRIGHT_COLORS
 #include "xlockmore.h"         /* in xscreensaver distribution */
 #else /* STANDALONE */
index aa7c6049eb1e6e9569ce5762b1293c9d9aa8641d..3820dc7b5a00ca9255f23b65c8ee97894022a057 100644 (file)
@@ -1,6 +1,13 @@
 /* pong, Copyright (c) 2003 Jeremy English <jenglish@myself.com>
  * A pong screen saver
  *
 /* pong, Copyright (c) 2003 Jeremy English <jenglish@myself.com>
  * A pong screen saver
  *
+ * Modified by Brian Sawicki <sawicki@imsa.edu> to fix a small bug.
+ * Before this fix after a certain point the paddles would be too
+ * small for the program to effectively hit the ball.  The score would
+ * then skyrocket as the paddles missed most every time. Added a max
+ * so that once a paddle gets 10 the entire game restarts.  Special
+ * thanks to Scott Zager for some help on this.
+ *
  * Modified by Trevor Blackwell <tlb@tlb.org> to use analogtv.[ch] display.
  * Also added gradual acceleration of the ball, shrinking of paddles, and
  * scorekeeping.
  * Modified by Trevor Blackwell <tlb@tlb.org> to use analogtv.[ch] display.
  * Also added gradual acceleration of the ball, shrinking of paddles, and
  * scorekeeping.
@@ -87,6 +94,27 @@ hit_top_bottom(void)
     by=-by;
 }
 
     by=-by;
 }
 
+void
+new_game(void)
+{
+  /* Starts a Whole New Game*/
+  ball.x = PONG_W/2;
+  ball.y = PONG_H/2;
+  bx = m_unit;
+  by = m_unit;
+
+  l_paddle.wait = 1;
+  l_paddle.lock = 0;
+  r_paddle.wait = 0;
+  r_paddle.lock = 0;
+  paddle_rate = m_unit-1;
+  r_paddle.score = 0;
+  l_paddle.score = 0;
+
+  l_paddle.h = PONG_H/4;
+  r_paddle.h = PONG_H/4;
+}
+
 void
 start_game(void)
 {
 void
 start_game(void)
 {
@@ -124,6 +152,9 @@ hit_paddle(void)
       else
         {
           r_paddle.score++;
       else
         {
           r_paddle.score++;
+          if (r_paddle.score >=10)
+                new_game();
+          else 
           start_game();
         }
     }
           start_game();
         }
     }
@@ -143,6 +174,9 @@ hit_paddle(void)
       else
         {
           l_paddle.score++;
       else
         {
           l_paddle.score++;
+          if (l_paddle.score >= 10)
+                new_game();
+          else
           start_game();
         }
     }
           start_game();
         }
     }
index d90cea5cbfd6728e808493d203c011087f335860..0b6dc273064ab03cdb2e8dded9ae440329e65701 100644 (file)
@@ -466,7 +466,7 @@ setup_X(Display * disp, Window win)
 
     gc = XCreateGC(display, window, gcflags, &gcv);
 
 
     gc = XCreateGC(display, window, gcflags, &gcv);
 
-    load_random_image (xwa.screen, window, window, NULL);
+    load_random_image (xwa.screen, window, window, NULL, NULL);
 
     orig_map = XGetImage(display, window, 0, 0, xwa.width, xwa.height,
                         ~0L, ZPixmap);
 
     orig_map = XGetImage(display, window, 0, 0, xwa.width, xwa.height,
                         ~0L, ZPixmap);
index 9425dc5410551de849026ad4ea6b4071ce0c6a6c..bace29c9c9fb31c6ac49d5f118af4f4344c5709f 100644 (file)
@@ -321,7 +321,7 @@ static void setup_X (Display * disp, Window win)
        if (use_subwindow_mode_p (xwa.screen, window))  /* see grabscreen.c */
                gcflags |= GCSubwindowMode;
        gc = XCreateGC (display, window, gcflags, &gcv);
        if (use_subwindow_mode_p (xwa.screen, window))  /* see grabscreen.c */
                gcflags |= GCSubwindowMode;
        gc = XCreateGC (display, window, gcflags, &gcv);
-        load_random_image (xwa.screen, window, window, NULL);
+        load_random_image (xwa.screen, window, window, NULL, NULL);
 
        orig_map = XGetImage (display, window, 0, 0, width, height, ~0L, ZPixmap);
 
 
        orig_map = XGetImage (display, window, 0, 0, width, height, ~0L, ZPixmap);
 
index 78a30843fbb3485525402a6435811a02bbd0d427..ff5a29603097fec4669fe722d9888c7d9afb5a8d 100644 (file)
@@ -1,5 +1,4 @@
-/* xscreensaver, Copyright (c) 1992, 1993, 1994, 1996, 1997, 1998, 2001, 2003 
- * Jamie Zawinski <jwz@jwz.org>
+/* xscreensaver, Copyright (c) 1992-2005 Jamie Zawinski <jwz@jwz.org>
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
  * documentation for any purpose is hereby granted without fee, provided that
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
  * documentation for any purpose is hereby granted without fee, provided that
@@ -36,7 +35,7 @@ init_slide (Display *dpy, Window window)
   Visual *visual;
 
   XGetWindowAttributes (dpy, window, &xgwa);
   Visual *visual;
 
   XGetWindowAttributes (dpy, window, &xgwa);
-  load_random_image (xgwa.screen, window, window, NULL);
+  load_random_image (xgwa.screen, window, window, NULL, NULL);
   cmap = xgwa.colormap;
   visual = xgwa.visual;
   max_width = xgwa.width;
   cmap = xgwa.colormap;
   visual = xgwa.visual;
   max_width = xgwa.width;
index 93ace4fc0cc593364fe0bfcbd88281462bb24a74..c9ef6fe2b2b520622b78b8e1bc50c25c54f4399b 100644 (file)
@@ -112,7 +112,7 @@ prepare_screen(ModeInfo * mi, slipstruct * sp)
 #ifdef STANDALONE                        /* jwz -- sometimes hack the desktop image! */
        if (halfrandom(sp, 2) == 0) {
       load_random_image (DefaultScreenOfDisplay(display),
 #ifdef STANDALONE                        /* jwz -- sometimes hack the desktop image! */
        if (halfrandom(sp, 2) == 0) {
       load_random_image (DefaultScreenOfDisplay(display),
-                                 MI_WINDOW(mi), MI_WINDOW(mi), NULL);
+                                 MI_WINDOW(mi), MI_WINDOW(mi), NULL, NULL);
        }
 #endif
 
        }
 #endif
 
index b7ff0a5a8629eb8f02b0e73a3fc9759a8b80d4b4..6b1453398ce7e8a92d96c77622f3877ff363c65f 100644 (file)
@@ -38,7 +38,7 @@
  * software for any purpose.  It is provided "as is" without express or 
  * implied warranty.
  *
  * software for any purpose.  It is provided "as is" without express or 
  * implied warranty.
  *
- * $Revision: 1.33 $
+ * $Revision: 1.37 $
  *
  * Version 1.0 April 27, 1998.
  * - Initial version
  *
  * Version 1.0 April 27, 1998.
  * - Initial version
@@ -174,6 +174,7 @@ static long delta(struct timeval *, struct timeval *);
 
 typedef struct Bogie {
     char *name;                        /* The name of the thing being displayed */
 
 typedef struct Bogie {
     char *name;                        /* The name of the thing being displayed */
+    char *desc;                        /* Beneath the name (e.g., ping time) */
     int distance;              /* The distance to this thing (0 - 100) */
     int tick;                  /* The tick that it was found on */
     int ttl;                   /* The time to live */
     int distance;              /* The distance to this thing (0 - 100) */
     int tick;                  /* The tick that it was found on */
     int ttl;                   /* The time to live */
@@ -216,6 +217,7 @@ typedef struct {
 
 static Bool debug_p = False;
 static Bool resolve_p = True;
 
 static Bool debug_p = False;
 static Bool resolve_p = True;
+static Bool times_p = True;
 
 
 /* 
 
 
 /* 
@@ -316,6 +318,7 @@ char *defaults [] = {
 
     "*ping:           default",
     "*resolve:        true",
 
     "*ping:           default",
     "*resolve:        true",
+    "*showTimes:       true",
     ".debug:          false",
     0
 };
     ".debug:          false",
     0
 };
@@ -340,6 +343,7 @@ XrmOptionDescRec options [] = {
 
     {"-ping",          ".ping",        XrmoptionSepArg, 0 },
     {"-no-dns",        ".resolve",     XrmoptionNoArg, "False" },
 
     {"-ping",          ".ping",        XrmoptionSepArg, 0 },
     {"-no-dns",        ".resolve",     XrmoptionNoArg, "False" },
+    {"-no-times",      ".showTimes",   XrmoptionNoArg, "False" },
     {"-debug",         ".debug",       XrmoptionNoArg, "True" },
     { 0, 0, 0, 0 }
 };
     {"-debug",         ".debug",       XrmoptionNoArg, "True" },
     { 0, 0, 0, 0 }
 };
@@ -1221,6 +1225,8 @@ getping(sonar_info *si, ping_info *pi)
        ip = (struct ip *) packet;
         iphdrlen = IP_HDRLEN(ip) << 2;
        icmph = (struct ICMP *) &packet[iphdrlen];
        ip = (struct ip *) packet;
         iphdrlen = IP_HDRLEN(ip) << 2;
        icmph = (struct ICMP *) &packet[iphdrlen];
+       then  = (struct timeval *) &packet[iphdrlen + sizeof(struct ICMP)];
+
 
        /* Was the packet a reply?? */
 
 
        /* Was the packet a reply?? */
 
@@ -1246,6 +1252,12 @@ getping(sonar_info *si, ping_info *pi)
            return bl;
        }
 
            return bl;
        }
 
+# if 0  /* Don't need to do this -- the host names are already as
+           resolved as they're going to get.  (We stored the resolved
+           name in the outgoing ping packet, so that same string just
+           came back to us.)
+         */
+
         /* If the name is an IP addr, try to resolve it. */
         {
           int iip[4];
         /* If the name is an IP addr, try to resolve it. */
         {
           int iip[4];
@@ -1270,6 +1282,7 @@ getping(sonar_info *si, ping_info *pi)
                 }
             }
         }
                 }
             }
         }
+# endif /* 0 */
 
        /* Create the new Bogie and add it to the list we are building */
 
 
        /* Create the new Bogie and add it to the list we are building */
 
@@ -1278,13 +1291,48 @@ getping(sonar_info *si, ping_info *pi)
        new->next = bl;
        bl = new;
 
        new->next = bl;
        bl = new;
 
-       /* Compute the round trip time */
+        {
+          float msec = delta(then, &now) / 1000.0;
+
+          if (times_p)
+            {
+              if (new->desc) free (new->desc);
+              new->desc = (char *) malloc (30);
+              if      (msec > 99) sprintf (new->desc, "    %.0f ms   ", msec);
+              else if (msec >  9) sprintf (new->desc, "    %.1f ms   ", msec);
+              else if (msec >  1) sprintf (new->desc, "    %.2f ms   ", msec);
+              else                sprintf (new->desc, "    %.3f ms   ", msec);
+            }
+
+          if (debug_p && times_p)  /* print ping-like stuff to stdout */
+            {
+              struct sockaddr_in *iaddr = (struct sockaddr_in *) &from;
+              unsigned int a, b, c, d;
+              char ipstr[20];
+              char *s = strdup (new->desc);
+              char *s2 = s, *s3 = s;
+              while (*s2 == ' ') s2++;
+              s3 = strchr (s2, ' ');
+              if (s3) *s3 = 0;
+
+              unpack_addr (iaddr->sin_addr.s_addr, &a, &b, &c, &d);
+              sprintf (ipstr, "%d.%d.%d.%d", a, b, c, d);
+
+              fprintf (stdout,
+                       "%3d bytes from %28s: "
+                       "icmp_seq=%-4d ttl=%d time=%s ms\n",
+                       result,
+                       name,
+                       /*ipstr,*/
+                       ICMP_SEQ(icmph), si->TTL, s2);
+              free (s);
+            }
+
+          /* Don't put anyone *too* close to the center of the screen. */
+          msec += 0.6;
 
 
-       then =  (struct timeval *) &packet[iphdrlen +
-                                         sizeof(struct ICMP)];
-       new->distance = delta(then, &now) / 100;
-       if (new->distance == 0)
-               new->distance = 2; /* HACK */
+          new->distance = msec * 10;
+        }
       }
     }
 
       }
     }
 
@@ -1452,6 +1500,29 @@ scope_mask (Display *dpy, Window win, sonar_info *si)
 }
 
 
 }
 
 
+static void
+reshape (sonar_info *si)
+{
+  XWindowAttributes xgwa;
+  Pixmap mask;
+  XGetWindowAttributes(si->dpy, si->win, &xgwa);
+  si->width = xgwa.width;
+  si->height = xgwa.height;
+  si->centrex = si->width / 2;
+  si->centrey = si->height / 2;
+  si->maxx = si->centrex + MY_MIN(si->centrex, si->centrey) - 10;
+  si->minx = si->centrex - MY_MIN(si->centrex, si->centrey) + 10;
+  si->maxy = si->centrey + MY_MIN(si->centrex, si->centrey) - 10;
+  si->miny = si->centrey - MY_MIN(si->centrex, si->centrey) + 10;
+  si->radius = si->maxx - si->centrex;
+
+  /* Install the clip mask... */
+  mask = scope_mask (si->dpy, si->win, si);
+  XSetClipMask(si->dpy, si->text, mask);
+  XSetClipMask(si->dpy, si->erase, mask);
+  XFreePixmap (si->dpy, mask); /* it's been copied into the GCs */
+}
+
 /*
  * Initialize the Sonar.
  *
 /*
  * Initialize the Sonar.
  *
@@ -1488,17 +1559,10 @@ init_sonar(Display *dpy, Window win)
     si->dpy = dpy;
     si->win = win;
     si->visible = NULL;
     si->dpy = dpy;
     si->win = win;
     si->visible = NULL;
+
     XGetWindowAttributes(dpy, win, &xwa);
     si->cmap = xwa.colormap;
     XGetWindowAttributes(dpy, win, &xwa);
     si->cmap = xwa.colormap;
-    si->width = xwa.width;
-    si->height = xwa.height;
-    si->centrex = si->width / 2;
-    si->centrey = si->height / 2;
-    si->maxx = si->centrex + MY_MIN(si->centrex, si->centrey) - 10;
-    si->minx = si->centrex - MY_MIN(si->centrex, si->centrey) + 10;
-    si->maxy = si->centrey + MY_MIN(si->centrex, si->centrey) - 10;
-    si->miny = si->centrey - MY_MIN(si->centrex, si->centrey) + 10;
-    si->radius = si->maxx - si->centrex;
+
     si->current = 0;
     si->sweepnum = 0;
 
     si->current = 0;
     si->sweepnum = 0;
 
@@ -1532,13 +1596,7 @@ init_sonar(Display *dpy, Window win)
                                        dpy, si->cmap);
     si->grid = XCreateGC (dpy, win, GCForeground, &gcv);
 
                                        dpy, si->cmap);
     si->grid = XCreateGC (dpy, win, GCForeground, &gcv);
 
-    /* Install the clip mask... */
-    {
-      Pixmap mask = scope_mask (dpy, win, si);
-      XSetClipMask(dpy, si->text, mask);
-      XSetClipMask(dpy, si->erase, mask);
-      XFreePixmap (dpy, mask); /* it's been copied into the GCs */
-    }
+    reshape (si);
 
     /* Compute pixel values for fading text on the display */
 
 
     /* Compute pixel values for fading text on the display */
 
@@ -1683,7 +1741,7 @@ simulator(sonar_info *si, void *vinfo)
  */
 
 static int
  */
 
 static int
-computeStringX(sonar_info *si, char *label, int x) 
+computeStringX(sonar_info *si, const char *label, int x) 
 {
 
     int width = XTextWidth(si->font, label, strlen(label));
 {
 
     int width = XTextWidth(si->font, label, strlen(label));
@@ -1701,14 +1759,12 @@ computeStringX(sonar_info *si, char *label, int x)
  *    The y coordinate of the start of the label.
  */
 
  *    The y coordinate of the start of the label.
  */
 
-/* TODO: Add smarts to keep label in sonar screen */
-
 static int
 computeStringY(sonar_info *si, int y) 
 {
 
 static int
 computeStringY(sonar_info *si, int y) 
 {
 
-    int fheight = si->font->ascent + si->font->descent;
-    return y + 5 + fheight;
+    int fheight = si->font->ascent /* + si->font->descent */;
+    return y + fheight;
 }
 
 /*
 }
 
 /*
@@ -1725,8 +1781,8 @@ computeStringY(sonar_info *si, int y)
  */
 
 static void
  */
 
 static void
-DrawBogie(sonar_info *si, int draw, char *name, int degrees, 
-         int distance, int ttl, int age) 
+DrawBogie(sonar_info *si, int draw, const char *name, const char *desc,
+          int degrees, int distance, int ttl, int age) 
 {
 
     /* Local Variables */
 {
 
     /* Local Variables */
@@ -1769,9 +1825,21 @@ DrawBogie(sonar_info *si, int draw, char *name, int degrees,
   /* Draw (or erase) the Bogie */
 
     XFillArc(si->dpy, si->win, gc, x, y, 5, 5, 0, 360 * 64);
   /* Draw (or erase) the Bogie */
 
     XFillArc(si->dpy, si->win, gc, x, y, 5, 5, 0, 360 * 64);
+
+    x += 3;  /* move away from the dot */
+    y += 7;
+    y = computeStringY(si, y);
     XDrawString(si->dpy, si->win, gc,
     XDrawString(si->dpy, si->win, gc,
-               computeStringX(si, name, x),
-               computeStringY(si, y), name, strlen(name));
+                computeStringX(si, name, x), y,
+                name, strlen(name));
+
+    if (desc && *desc)
+      {
+        y = computeStringY(si, y);
+        XDrawString(si->dpy, si->win, gc,
+                    computeStringX(si, desc, x), y,
+                    desc, strlen(desc));
+      }
 }
 
 
 }
 
 
@@ -1864,7 +1932,7 @@ Sonar(sonar_info *si, Bogie *bl)
 
        if (((bp->tick == si->current) && (++bp->age >= bp->ttl)) ||
            (findNode(bl, bp->name) != NULL)) {
 
        if (((bp->tick == si->current) && (++bp->age >= bp->ttl)) ||
            (findNode(bl, bp->name) != NULL)) {
-           DrawBogie(si, 0, bp->name, bp->tick,
+           DrawBogie(si, 0, bp->name, bp->desc, bp->tick,
                      bp->distance, bp->ttl, bp->age);
            if (prev == NULL)
                si->visible = bp->next;
                      bp->distance, bp->ttl, bp->age);
            if (prev == NULL)
                si->visible = bp->next;
@@ -1909,7 +1977,8 @@ Sonar(sonar_info *si, Bogie *bl)
 
     for (bp = si->visible; bp != NULL; bp = bp->next) {
        if (bp->age < bp->ttl)          /* grins */
 
     for (bp = si->visible; bp != NULL; bp = bp->next) {
        if (bp->age < bp->ttl)          /* grins */
-          DrawBogie(si, 1, bp->name, bp->tick, bp->distance, bp->ttl,bp->age);
+          DrawBogie(si, 1, bp->name, bp->desc,
+                     bp->tick, bp->distance, bp->ttl,bp->age);
     }
 
     /* Redraw the grid */
     }
 
     /* Redraw the grid */
@@ -2034,6 +2103,25 @@ parse_mode (Bool ping_works_p)
 }
 
 
 }
 
 
+static void
+handle_events (sonar_info *si)
+{
+  while (XPending (si->dpy))
+    {
+      XEvent event;
+      XNextEvent (si->dpy, &event);
+
+      if (event.xany.type == ConfigureNotify)
+        {
+          XClearWindow (si->dpy, si->win);
+          reshape (si);
+        }
+
+      screenhack_handle_event (si->dpy, &event);
+    }
+}
+
+
 
 /*
  * Main screen saver hack.
 
 /*
  * Main screen saver hack.
@@ -2056,6 +2144,7 @@ screenhack(Display *dpy, Window win)
 
     debug_p = get_boolean_resource ("debug", "Debug");
     resolve_p = get_boolean_resource ("resolve", "Resolve");
 
     debug_p = get_boolean_resource ("debug", "Debug");
     resolve_p = get_boolean_resource ("resolve", "Resolve");
+    times_p = get_boolean_resource ("showTimes", "ShowTimes");
 
     sensor = 0;
 # ifdef HAVE_PING
 
     sensor = 0;
 # ifdef HAVE_PING
@@ -2102,7 +2191,7 @@ screenhack(Display *dpy, Window win)
        gettimeofday(&finish);
 # endif
        sleeptime = si->delay - delta(&start, &finish);
        gettimeofday(&finish);
 # endif
        sleeptime = si->delay - delta(&start, &finish);
-        screenhack_handle_events (dpy);
+        handle_events (si);
        if (sleeptime > 0L)
            usleep(sleeptime);
 
        if (sleeptime > 0L)
            usleep(sleeptime);
 
index 36dd7911a471e69add8111d680c662608681b99a..8dca55bc3407fb8d5a867a912e050b69dd5d6364 100644 (file)
@@ -31,6 +31,7 @@ sonar - display a sonar scope
 [\-team-a-count \fIint\fP]
 [\-team-b-count \fIint\fP]
 [\-no\-dns] 
 [\-team-a-count \fIint\fP]
 [\-team-b-count \fIint\fP]
 [\-no\-dns] 
+[\-no\-times] 
 [\-debug] 
 .SH DESCRIPTION
 The \fIsonar\fP program displays a sonar scope on the computer's screen.
 [\-debug] 
 .SH DESCRIPTION
 The \fIsonar\fP program displays a sonar scope on the computer's screen.
@@ -107,6 +108,9 @@ names as the first element on each line.  If you use ssh, try this:
 .B \-no\-dns
 Do not attempt to resolve IP addresses to hostnames.
 .TP 8
 .B \-no\-dns
 Do not attempt to resolve IP addresses to hostnames.
 .TP 8
+.B \-no\-times
+Do not display ping times beneath the host names.
+.TP 8
 .B \-team-a-name \fIstring\fP
 In simulation mode, the name of team A.
 .TP 8
 .B \-team-a-name \fIstring\fP
 In simulation mode, the name of team A.
 .TP 8
@@ -173,6 +177,14 @@ have as few setuid programs around as possible, on general principles.
 chown root.root sonar
 chmod u+s sonar
 .EE
 chown root.root sonar
 chmod u+s sonar
 .EE
+In ping-mode, the display is a logarithmic scale, calibrated so that the
+three rings represent ping times of approximately 2.5, 70 and 2,000
+milliseconds respectively.  
+
+This means that if any the hosts you are pinging take longer than 2
+seconds to respond, they won't show up; and if you are pinging several
+hosts with very fast response times, they will all appear close to the
+center of the screen (making their names hard to read.)
 .SH SEE ALSO
 .BR X (1),
 .BR xscreensaver (1),
 .SH SEE ALSO
 .BR X (1),
 .BR xscreensaver (1),
index 2616b849a9662c0561607849bb78f8379fe85fcf..b98d54b68fcb2901946ac714db624d9c5d673e11 100644 (file)
@@ -8,7 +8,7 @@
 /* modified from a module from the xscreensaver distribution */
 
 /*
 /* modified from a module from the xscreensaver distribution */
 
 /*
- * xscreensaver, Copyright (c) 1992, 1993, 1994, 1996, 1997, 1998
+ * xscreensaver, Copyright (c) 1992, 1993, 1994, 1996, 1997, 1998, 2005
  * Jamie Zawinski <jwz@jwz.org>
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
  * Jamie Zawinski <jwz@jwz.org>
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
@@ -115,7 +115,7 @@ init_hack (Display *dpy, Window window)
 
   /* grab screen to pixmap */
   pm = XCreatePixmap(dpy, window, sizex, sizey, xgwa.depth);
 
   /* grab screen to pixmap */
   pm = XCreatePixmap(dpy, window, sizex, sizey, xgwa.depth);
-  load_random_image (xgwa.screen, window, pm, NULL);
+  load_random_image (xgwa.screen, window, pm, NULL, NULL);
   XClearWindow(dpy, window);
   XFlush (dpy);
 
   XClearWindow(dpy, window);
   XFlush (dpy);
 
index bec8ee8f024449c79ead5d8dac89f01af6636c52..a2c0af601f53647c1696a8a0e0c213d5bb9a359d 100644 (file)
  *
  *  CHANGES
  *
  *
  *  CHANGES
  *
+ *  1.1  dragorn  Jan 04 2005    Fixed some indenting, typo in errors for parsing
+ *                                cmdline args
+ *  1.1  dagraz   Jan 04 2005    Added option for circular cracks (David Agraz)
+ *                               Cleaned up issues with timeouts in start_crack (DA)
  *  1.0  dragorn  Oct 10 2004    First port done
  *
  * Directly based the hacks of: 
  *  1.0  dragorn  Oct 10 2004    First port done
  *
  * Directly based the hacks of: 
@@ -48,6 +52,8 @@
 #define inline                 /* */
 #endif
 
 #define inline                 /* */
 #endif
 
+#define STEP 0.42
+
 /* Raw colormap extracted from pollockEFF.gif */
 char *rgb_colormap[] = {
     "rgb:20/1F/21", "rgb:26/2C/2E", "rgb:35/26/26", "rgb:37/2B/27",
 /* Raw colormap extracted from pollockEFF.gif */
 char *rgb_colormap[] = {
     "rgb:20/1F/21", "rgb:26/2C/2E", "rgb:35/26/26", "rgb:37/2B/27",
@@ -87,9 +93,17 @@ typedef struct {
     /* Synthesis of data from Crack:: and SandPainter:: */
     float x, y;
     float t;
     /* Synthesis of data from Crack:: and SandPainter:: */
     float x, y;
     float t;
+    float ys, xs, t_inc; /* for curvature calculations */
+
+    int curved;
 
     unsigned long sandcolor;
     float sandp, sandg;
 
     unsigned long sandcolor;
     float sandp, sandg;
+
+    float degrees_drawn;
+
+    int crack_num;
+
 } crack;
 
 struct field {
 } crack;
 
 struct field {
@@ -103,6 +117,8 @@ struct field {
 
     int grains; /* number of grains in the sand painting */
 
 
     int grains; /* number of grains in the sand painting */
 
+    int circle_percent;
+
     crack *cracks; /* grid of cracks */
     int *cgrid; /* grid of actual crack placement */
 
     crack *cracks; /* grid of cracks */
     int *cgrid; /* grid of actual crack placement */
 
@@ -152,6 +168,7 @@ struct field
     f->bgcolor = 0;
     f->visdepth = 0;
     f->grains = 0;
     f->bgcolor = 0;
     f->visdepth = 0;
     f->grains = 0;
+    f->circle_percent = 0;
     return f;
 }
 
     return f;
 }
 
@@ -168,7 +185,7 @@ inline void start_crack(struct field *f, crack *cr) {
     float a;
 
     /* shift until crack is found */
     float a;
 
     /* shift until crack is found */
-    while ((!found) || (timeout++ > 10000)) {
+    while ((!found) && (timeout++ < 10000)) {
         px = (int) (random() % f->width);
         py = (int) (random() % f->height);
 
         px = (int) (random() % f->width);
         py = (int) (random() % f->height);
 
@@ -176,24 +193,53 @@ inline void start_crack(struct field *f, crack *cr) {
             found = 1;
     }
 
             found = 1;
     }
 
-    if (found) {
-        /* start a crack */
-        a = ref_cgrid(f, px, py);
+    if ( !found ) {
+        /* We timed out.  Use our default values */
+        px = cr->x;
+        py = cr->y;
+        ref_cgrid(f, px, py) = cr->t;
+    }
+
+    /* start a crack */
+    a = ref_cgrid(f, px, py);
+
+    if ((random() % 100) < 50) {
+        /* conversion of the java int(random(-2, 2.1)) */
+        a -= 90 + (frand(4.1) - 2.0);
+    } else {
+        a += 90 + (frand(4.1) - 2.0);
+    }
+
+    if ((random() % 100) < f->circle_percent) {
+        float r; /* radius */
+        float radian_inc;
+
+        cr->curved = 1;
+        cr->degrees_drawn = 0;
+
+        r = 10 + (random() % ((f->width + f->height) / 2));
 
         if ((random() % 100) < 50) {
 
         if ((random() % 100) < 50) {
-            /* conversion of the java int(random(-2, 2.1)) */
-            a -= 90 + (frand(4.1) - 2.0);
-        } else {
-            a += 90 + (frand(4.1) - 2.0);
+            r *= -1;
         }
 
         }
 
-        /* Condensed from Crack::startCrack */
-        cr->x = px + ((float) 0.61 * cos(a * M_PI / 180));
-        cr->y = py + ((float) 0.61 * sin(a * M_PI / 180));
-        cr->t = a;
-    } else {
-        /* timeout */
+        /* arc length = r * theta => theta = arc length / r */
+        radian_inc = STEP / r;
+        cr->t_inc = radian_inc * 360 / 2 / M_PI;
+
+        cr->ys = r * sin(radian_inc);
+        cr->xs = r * ( 1 - cos(radian_inc));
+
+    }
+    else {
+        cr->curved = 0;
     }
     }
+
+    /* Condensed from Crack::startCrack */
+    cr->x = px + ((float) 0.61 * cos(a * M_PI / 180));
+    cr->y = py + ((float) 0.61 * sin(a * M_PI / 180));
+    cr->t = a;
+
 }
 
 inline void make_crack(struct field *f) {
 }
 
 inline void make_crack(struct field *f) {
@@ -208,6 +254,15 @@ inline void make_crack(struct field *f) {
         cr->sandp = 0;
         cr->sandg = (frand(0.2) - 0.01);
         cr->sandcolor = f->parsedcolors[random() % f->numcolors];
         cr->sandp = 0;
         cr->sandg = (frand(0.2) - 0.01);
         cr->sandcolor = f->parsedcolors[random() % f->numcolors];
+        cr->crack_num = f->num;
+        cr->curved = 0;
+        cr->degrees_drawn = 0;
+
+        /* We could use these values in the timeout case of start_crack */
+
+        cr->x = random() % f->width;
+        cr->y = random() % f->height;
+        cr->t = random() % 360;
 
         /* start it */
         start_crack(f, cr);
 
         /* start it */
         start_crack(f, cr);
@@ -257,8 +312,10 @@ inline unsigned long rgb2point(int depth, int r, int g, int b) {
     return ret;
 }
 
     return ret;
 }
 
-/* alpha blended point drawing */
-inline unsigned long trans_point(int x1, int y1, unsigned long myc, float a, struct field *f) {
+/* alpha blended point drawing -- this is Not Right and will likely fail on 
+ * non-intel platforms as it is now, needs fixing */
+inline unsigned long trans_point(int x1, int y1, unsigned long myc, float a, 
+                                 struct field *f) {
     if ((x1 >= 0) && (x1 < f->width) && (y1 >= 0) && (y1 < f->height)) {
         if (a >= 1.0) {
             ref_pixel(f, x1, y1) = myc;
     if ((x1 >= 0) && (x1 < f->width) && (y1 >= 0) && (y1 < f->height)) {
         if (a >= 1.0) {
             ref_pixel(f, x1, y1) = myc;
@@ -288,7 +345,8 @@ inline unsigned long trans_point(int x1, int y1, unsigned long myc, float a, str
     return 0;
 }
 
     return 0;
 }
 
-inline void region_color(Display *dpy, Window window, GC fgc, struct field *f, crack *cr) {
+inline void region_color(Display *dpy, Window window, GC fgc, struct field *f, 
+                         crack *cr) {
     /* synthesis of Crack::regionColor() and SandPainter::render() */
 
     float rx = cr->x;
     /* synthesis of Crack::regionColor() and SandPainter::render() */
 
     float rx = cr->x;
@@ -352,7 +410,8 @@ inline void region_color(Display *dpy, Window window, GC fgc, struct field *f, c
 }
 
 void build_substrate(struct field *f) {
 }
 
 void build_substrate(struct field *f) {
-    int tx, ty;
+    int tx;
+    /* int ty; */
 
     f->cycles = 0;
 
 
     f->cycles = 0;
 
@@ -372,33 +431,55 @@ void build_substrate(struct field *f) {
     f->cgrid = (int *) xrealloc(f->cgrid, sizeof(int) * f->height * f->width);
     memset(f->cgrid, 10001, f->height * f->width * sizeof(int));
 
     f->cgrid = (int *) xrealloc(f->cgrid, sizeof(int) * f->height * f->width);
     memset(f->cgrid, 10001, f->height * f->width * sizeof(int));
 
-    /* make random crack seeds */
+    /* Not necessary now that make_crack ensures we have usable default
+     *  values in start_crack's timeout case 
+    * make random crack seeds *
     for (tx = 0; tx < 16; tx++) {
         ty = (int) (random() % (f->width * f->height - 1));
         f->cgrid[ty] = (int) random() % 360;
     }
     for (tx = 0; tx < 16; tx++) {
         ty = (int) (random() % (f->width * f->height - 1));
         f->cgrid[ty] = (int) random() % 360;
     }
-    
+    */
+
     /* make the initial cracks */
     for (tx = 0; tx < f->initial_cracks; tx++)
         make_crack(f);
 }
 
 
     /* make the initial cracks */
     for (tx = 0; tx < f->initial_cracks; tx++)
         make_crack(f);
 }
 
 
-inline void movedrawcrack(Display *dpy, Window window, GC fgc, struct field *f, int cracknum) {
+inline void movedrawcrack(Display *dpy, Window window, GC fgc, struct field *f, 
+                          int cracknum) {
     /* Basically Crack::move() */
 
     int cx, cy;
     crack *cr = &(f->cracks[cracknum]);
 
     /* continue cracking */
     /* Basically Crack::move() */
 
     int cx, cy;
     crack *cr = &(f->cracks[cracknum]);
 
     /* continue cracking */
-    cr->x += ((float) 0.42 * cos(cr->t * M_PI/180));
-    cr->y += ((float) 0.42 * sin(cr->t * M_PI/180));
+    if ( !cr->curved ) {
+        cr->x += ((float) STEP * cos(cr->t * M_PI/180));
+        cr->y += ((float) STEP * sin(cr->t * M_PI/180));
+    }
+    else {
+        float oldx, oldy;
+
+        oldx = cr->x;
+        oldy = cr->y;
+
+        cr->x += ((float) cr->ys * cos(cr->t * M_PI/180));
+        cr->y += ((float) cr->ys * sin(cr->t * M_PI/180));
+
+        cr->x += ((float) cr->xs * cos(cr->t * M_PI/180 - M_PI / 2));
+        cr->x += ((float) cr->xs * sin(cr->t * M_PI/180 - M_PI / 2));
+
+        cr->t += cr->t_inc;
+        cr->degrees_drawn += abs(cr->t_inc);
+    }
 
     /* bounds check */
     /* modification of random(-0.33,0.33) */
     cx = (int) (cr->x + (frand(0.66) - 0.33));
     cy = (int) (cr->y + (frand(0.66) - 0.33));
 
 
     /* bounds check */
     /* modification of random(-0.33,0.33) */
     cx = (int) (cr->x + (frand(0.66) - 0.33));
     cy = (int) (cr->y + (frand(0.66) - 0.33));
 
+
     if ((cx >= 0) && (cx < f->width) && (cy >= 0) && (cy < f->height)) {
         /* draw sand painter if we're not wireframe */
         if (!f->wireframe)
     if ((cx >= 0) && (cx < f->width) && (cy >= 0) && (cy < f->height)) {
         /* draw sand painter if we're not wireframe */
         if (!f->wireframe)
@@ -408,9 +489,14 @@ inline void movedrawcrack(Display *dpy, Window window, GC fgc, struct field *f,
         ref_pixel(f, cx, cy) = f->fgcolor;
         XDrawPoint(dpy, window, fgc, cx, cy);
 
         ref_pixel(f, cx, cy) = f->fgcolor;
         XDrawPoint(dpy, window, fgc, cx, cy);
 
+        if ( cr->curved && (cr->degrees_drawn > 360) ) {
+            /* completed the circle, stop cracking */
+            start_crack(f, cr); /* restart ourselves */
+            make_crack(f); /* generate a new crack */
+        }
         /* safe to check */
         /* safe to check */
-        if ((f->cgrid[cy * f->width + cx] > 10000) ||
-            (abs(f->cgrid[cy * f->width + cx] - cr->t) < 5)) {
+        else if ((f->cgrid[cy * f->width + cx] > 10000) ||
+                 (abs(f->cgrid[cy * f->width + cx] - cr->t) < 5)) {
             /* continue cracking */
             f->cgrid[cy * f->width + cx] = (int) cr->t;
         } else if (abs(f->cgrid[cy * f->width + cx] - cr->t) > 2) {
             /* continue cracking */
             f->cgrid[cy * f->width + cx] = (int) cr->t;
         } else if (abs(f->cgrid[cy * f->width + cx] - cr->t) > 2) {
@@ -419,7 +505,13 @@ inline void movedrawcrack(Display *dpy, Window window, GC fgc, struct field *f,
             make_crack(f); /* generate a new crack */
         }
     } else {
             make_crack(f); /* generate a new crack */
         }
     } else {
-        /* out of bounds, top cracking */
+        /* out of bounds, stop cracking */
+
+       /* need these in case of timeout in start_crack */
+        cr->x = random() % f->width;
+        cr->y = random() % f->height;
+        cr->t = random() % 360;
+
         start_crack(f, cr); /* restart ourselves */
         make_crack(f); /* generate a new crack */
     }
         start_crack(f, cr); /* restart ourselves */
         make_crack(f); /* generate a new crack */
     }
@@ -437,6 +529,7 @@ char *defaults[] = {
     "*initialCracks: 3",
     "*maxCracks: 100",
     "*sandGrains: 64",
     "*initialCracks: 3",
     "*maxCracks: 100",
     "*sandGrains: 64",
+    "*circlePercent: 0",
     0
 };
 
     0
 };
 
@@ -449,10 +542,12 @@ XrmOptionDescRec options[] = {
     {"-initial-cracks", ".initialCracks", XrmoptionSepArg, 0},
     {"-max-cracks", ".maxCracks", XrmoptionSepArg, 0},
     {"-sand-grains", ".sandGrains", XrmoptionSepArg, 0},
     {"-initial-cracks", ".initialCracks", XrmoptionSepArg, 0},
     {"-max-cracks", ".maxCracks", XrmoptionSepArg, 0},
     {"-sand-grains", ".sandGrains", XrmoptionSepArg, 0},
+    {"-circle-percent", ".circlePercent", XrmoptionSepArg, 0},
     {0, 0, 0, 0}
 };
 
     {0, 0, 0, 0}
 };
 
-void build_img(Display *dpy, Window window, XWindowAttributes xgwa, GC fgc, struct field *f) {
+void build_img(Display *dpy, Window window, XWindowAttributes xgwa, GC fgc, 
+               struct field *f) {
     if (f->off_img) {
         free(f->off_img);
         f->off_img = NULL;
     if (f->off_img) {
         free(f->off_img);
         f->off_img = NULL;
@@ -483,6 +578,7 @@ void screenhack(Display * dpy, Window window)
     f->max_num = (get_integer_resource("maxCracks", "Integer"));
     f->wireframe = (get_boolean_resource("wireFrame", "Boolean"));
     f->grains = (get_integer_resource("sandGrains", "Integer"));
     f->max_num = (get_integer_resource("maxCracks", "Integer"));
     f->wireframe = (get_boolean_resource("wireFrame", "Boolean"));
     f->grains = (get_integer_resource("sandGrains", "Integer"));
+    f->circle_percent = (get_integer_resource("circlePercent", "Integer"));
 
     if (f->initial_cracks <= 2) {
         fprintf(stderr, "%s: Initial cracks must be greater than 2\n", progname);
 
     if (f->initial_cracks <= 2) {
         fprintf(stderr, "%s: Initial cracks must be greater than 2\n", progname);
@@ -490,7 +586,18 @@ void screenhack(Display * dpy, Window window)
     }
 
     if (f->max_num <= 10) {
     }
 
     if (f->max_num <= 10) {
-        fprintf(stderr, "%s: Maximum number of cracks must be greater than 2\n", progname);
+        fprintf(stderr, "%s: Maximum number of cracks must be less than 10\n", 
+                progname);
+        return;
+    }
+
+    if (f->circle_percent < 0) {
+        fprintf(stderr, "%s: circle percent must be at least 0\n", progname);
+        return;
+    }
+
+    if (f->circle_percent > 100) {
+        fprintf(stderr, "%s: circle percent must be less than 100\n", progname);
         return;
     }
     
         return;
     }
     
@@ -504,7 +611,8 @@ void screenhack(Display * dpy, Window window)
      * manner but it only happens once */
     while (rgb_colormap[f->numcolors] != NULL) {
         f->parsedcolors = (unsigned long *) xrealloc(f->parsedcolors, 
      * manner but it only happens once */
     while (rgb_colormap[f->numcolors] != NULL) {
         f->parsedcolors = (unsigned long *) xrealloc(f->parsedcolors, 
-                                                     sizeof(unsigned long) * (f->numcolors + 1));
+                                                     sizeof(unsigned long) * 
+                                                     (f->numcolors + 1));
         if (!XParseColor(dpy, xgwa.colormap, rgb_colormap[f->numcolors], &tmpcolor)) {
             fprintf(stderr, "%s: couldn't parse color %s\n", progname,
                     rgb_colormap[f->numcolors]);
         if (!XParseColor(dpy, xgwa.colormap, rgb_colormap[f->numcolors], &tmpcolor)) {
             fprintf(stderr, "%s: couldn't parse color %s\n", progname,
                     rgb_colormap[f->numcolors]);
@@ -575,3 +683,4 @@ void screenhack(Display * dpy, Window window)
             usleep(growth_delay);
     }
 }
             usleep(growth_delay);
     }
 }
+
index cab44cadf48d7a444d4c9b86c3e42c4eb36452a3..b2c633cc0218e08fbeabd2aabcf9df550623fcee 100644 (file)
@@ -12,9 +12,10 @@ substrate - Grow crystal-like lines on a computational substrate
 [\-initial\-cracks \fInuminitial\fP]
 [\-max\-cracks \fInummax\fP]
 [\-sand\-grains \fInumgrains\fP]
 [\-initial\-cracks \fInuminitial\fP]
 [\-max\-cracks \fInummax\fP]
 [\-sand\-grains \fInumgrains\fP]
+[\-circle\-percent \fIcirclepercent\fP]
 .SH DESCRIPTION
 Lines like crystals grow on a computational substrate.  A simple 
 .SH DESCRIPTION
 Lines like crystals grow on a computational substrate.  A simple 
-perpendicular growth rule creates intricate city-like structures.
+perpendicular growth rule creates intricate city-like structures.  Optionally, cracks may also be circular, producing a cityscape more familiar to places for which city planning is a distant, theoretical concern.
 
 Ported from the code by j.tarbell at http://complexification.net
 .SH OPTIONS
 
 Ported from the code by j.tarbell at http://complexification.net
 .SH OPTIONS
@@ -42,6 +43,9 @@ Maximum number of cracks in the substrate at a single time
 .B \-sand\-grains \fInumgrains\fP (Default: \fI64\fP)
 Number of sand grains dropped during coloring.  More grains cause 
 a denser colour but use more cpu power.
 .B \-sand\-grains \fInumgrains\fP (Default: \fI64\fP)
 Number of sand grains dropped during coloring.  More grains cause 
 a denser colour but use more cpu power.
+.TP 8
+.B \-circle-percent \fIcirclepercent\fP (Default: \fI33\fP)
+The percentage of the cracks will be circular.
 .SH ENVIRONMENT
 .PP
 .TP 8
 .SH ENVIRONMENT
 .PP
 .TP 8
index e118851c3b840558ac1ca3da98e8884fa707c2a1..3dfff461a1c9fd3b068014f8d87451e5f9a49e88 100644 (file)
@@ -143,7 +143,7 @@ static void grabImage (XWindowAttributes *xwa)
        XGetImage (display, window, 0, 0, windowWidth, windowHeight,
                   ~0L, ZPixmap);
 
        XGetImage (display, window, 0, 0, windowWidth, windowHeight,
                   ~0L, ZPixmap);
 
-    load_random_image (screen, window, window, NULL);
+    load_random_image (screen, window, window, NULL, NULL);
     sourceImage = XGetImage (display, window, 0, 0, windowWidth, windowHeight,
                             ~0L, ZPixmap);
 
     sourceImage = XGetImage (display, window, 0, 0, windowWidth, windowHeight,
                             ~0L, ZPixmap);
 
index 2d4ae4f44686e450689504f127f98f151dbd6116..eda9cb759203d43c022368a7158058749159564c 100755 (executable)
@@ -1,6 +1,6 @@
 #!/usr/bin/perl -w
 #
 #!/usr/bin/perl -w
 #
-# webcollage, Copyright (c) 1999-2004 by Jamie Zawinski <jwz@jwz.org>
+# webcollage, Copyright (c) 1999-2005 by Jamie Zawinski <jwz@jwz.org>
 # This program decorates the screen with random images from the web.
 # One satisfied customer described it as "a nonstop pop culture brainbath."
 #
 # This program decorates the screen with random images from the web.
 # One satisfied customer described it as "a nonstop pop culture brainbath."
 #
@@ -60,26 +60,41 @@ use bytes;  # Larry can take Unicode and shove it up his ass sideways.
 
 
 my $progname = $0; $progname =~ s@.*/@@g;
 
 
 my $progname = $0; $progname =~ s@.*/@@g;
-my $version = q{ $Revision: 1.118 $ }; $version =~ s/^[^0-9]+([0-9.]+).*$/$1/;
-my $copyright = "WebCollage $version, Copyright (c) 1999-2004" .
+my $version = q{ $Revision: 1.123 $ }; $version =~ s/^[^0-9]+([0-9.]+).*$/$1/;
+my $copyright = "WebCollage $version, Copyright (c) 1999-2005" .
     " Jamie Zawinski <jwz\@jwz.org>\n" .
     "            http://www.jwz.org/webcollage/\n";
 
 
 
     " Jamie Zawinski <jwz\@jwz.org>\n" .
     "            http://www.jwz.org/webcollage/\n";
 
 
 
-my @search_methods = (  72, "altavista",   \&pick_from_alta_vista_random_link,
-                        12, "livejournal", \&pick_from_livejournal_images,
-                         9, "yahoorand",   \&pick_from_yahoo_random_link,
-                         7, "yahoonews",   \&pick_from_yahoo_news_text,
+my @search_methods = (  60, "altavista",    \&pick_from_alta_vista_random_link,
+                        12, "livejournal",  \&pick_from_livejournal_images,
+                         8, "yahoorand",    \&pick_from_yahoo_random_link,
+                        11, "googlephotos", \&pick_from_google_image_photos,
+                         6, "googleimgs",   \&pick_from_google_images,
+                         3, "googlenums",   \&pick_from_google_image_numbers,
 
 
-                     # The ircimages guy's server can't take the heat, so he
-                     # started banning the webcollage user agent.  I tried to
-                     # convince him to add a lighter-weight page to support
-                     # webcollage better, but he doesn't care.
+                     # In Apr 2002, Google asked me to stop searching them.
+                     # I asked them to add a "random link" url.  They said
+                     # "that would be easy, we'll think about it" and then
+                     # never wrote back.  Booo Google!  Booooo!  So, screw
+                     # those turkeys, I've turned Google searching back on.
+                     # I'm sure they can take it.  (Jan 2005.)
+
+                     # Jan 2005: Yahoo fucked up their search form so that
+                     # it's no longer possible to do "or" searches on news
+                     # images, so we rarely get any hits there any more.
+                     # 
+                     #  0, "yahoonews",   \&pick_from_yahoo_news_text,
+
+                     # Dec 2004: the ircimages guy's server can't take the
+                     # heat, so he started banning the webcollage user agent.
+                     # I tried to convince him to add a lighter-weight page to
+                     # support webcollage better, but he doesn't care.
                      #
                      #  0, "ircimages", \&pick_from_ircimages,
 
                      #
                      #  0, "ircimages", \&pick_from_ircimages,
 
-                     # Alta Vista has a new "random link" URL now.
+                     # Dec 2002: Alta Vista has a new "random link" URL now.
                      # They added it specifically to better support webcollage!
                      # That was super cool of them.  This is how we used to do
                      # it, before:
                      # They added it specifically to better support webcollage!
                      # That was super cool of them.  This is how we used to do
                      # it, before:
@@ -87,21 +102,14 @@ my @search_methods = (  72, "altavista",   \&pick_from_alta_vista_random_link,
                      #  0, "avimages", \&pick_from_alta_vista_images,
                      #  0, "avtext",   \&pick_from_alta_vista_text,
 
                      #  0, "avimages", \&pick_from_alta_vista_images,
                      #  0, "avtext",   \&pick_from_alta_vista_text,
 
-                     # Google asked (nicely) for me to stop searching them.
-                     # I asked them to add a "random link" url.  They said
-                     # "that would be easy, we'll think about it" and then
-                     # never wrote back.  Booo Google!  Booooo!
+                     # This broke in 2004.  Eh, Lycos sucks anyway.
                      #
                      #
-                     #   0, "googlenums", \&pick_from_google_image_numbers,
-                     #   0, "googleimgs", \&pick_from_google_images,
+                     #   0, "lycos",      \&pick_from_lycos_text,
 
 
-                     # I suspect Hotbot is actually the same search engine
-                     # data as Lycos.
+                     # This broke in 2003, I think.  I suspect Hotbot is
+                     # actually the same search engine data as Lycos.
                      #
                      #  0, "hotbot",     \&pick_from_hotbot_text,
                      #
                      #  0, "hotbot",     \&pick_from_hotbot_text,
-
-                     # Eh, Lycos sucks anyway.
-                     #   0, "lycos",      \&pick_from_lycos_text,
                       );
 
 # programs we can use to write to the root window (tried in ascending order.)
                       );
 
 # programs we can use to write to the root window (tried in ascending order.)
@@ -185,11 +193,18 @@ my %warningless_sites = (
   "www.geocities.com"       => 1,
   "www.angelfire.com"       => 1,
   "members.aol.com"         => 1,
   "www.geocities.com"       => 1,
   "www.angelfire.com"       => 1,
   "members.aol.com"         => 1,
+  "img.photobucket.com"     => 1,
+  "pics.livejournal.com"    => 1,
+  "tinypic.com"             => 1,
 
   "yimg.com"                => 1,  # This is where dailynews.yahoo.com stores
   "eimg.com"                => 1,  # its images, so pick_from_yahoo_news_text()
                                    # hits this every time.
 
 
   "yimg.com"                => 1,  # This is where dailynews.yahoo.com stores
   "eimg.com"                => 1,  # its images, so pick_from_yahoo_news_text()
                                    # hits this every time.
 
+  "images.quizfarm.com"     => 1,  # damn those LJ quizzes...
+  "images.quizilla.com"     => 1,
+  "images.quizdiva.net"     => 1,
+
   "driftnet"                => 1,  # builtin...
 );
 
   "driftnet"                => 1,  # builtin...
 );
 
@@ -219,7 +234,7 @@ my $verbose_exec = 0;           # diagnostics about executing programs
 my $report_performance_interval = 60 * 15;  # print some stats every 15 minutes
 
 my $http_proxy = undef;
 my $report_performance_interval = 60 * 15;  # print some stats every 15 minutes
 
 my $http_proxy = undef;
-my $http_timeout = 30;
+my $http_timeout = 20;
 my $cvt_timeout = 10;
 
 my $min_width = 50;
 my $cvt_timeout = 10;
 
 my $min_width = 50;
@@ -342,7 +357,8 @@ sub get_document_1 {
           $url =~ m@^http://random\.yahoo\.com/@ ||
           $url =~ m@^http://images\.google\.com/@) {
         # block this, you turkeys.
           $url =~ m@^http://random\.yahoo\.com/@ ||
           $url =~ m@^http://images\.google\.com/@) {
         # block this, you turkeys.
-        $user_agent = "Mozilla/4.76 [en] (X11; U; Linux 2.2.16-22 i686; Nav)";
+        $user_agent = "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.5)" .
+          " Gecko/20041111 Firefox/1.0";
       }
 
       my $hdrs = "GET " . ($http_proxy ? $url : "/$path") . " HTTP/1.0\r\n" .
       }
 
       my $hdrs = "GET " . ($http_proxy ? $url : "/$path") . " HTTP/1.0\r\n" .
@@ -399,9 +415,16 @@ sub get_document_1 {
         return ();
       }
 
         return ();
       }
 
+      $SIG{ALRM} = 'DEFAULT';  # seem to be suffering a race?
       return ( $http, $head, $body );
     };
   die if ($@ && $@ ne "alarm\n");       # propagate errors
       return ( $http, $head, $body );
     };
   die if ($@ && $@ ne "alarm\n");       # propagate errors
+
+  if ($@ && $@ ne "alarm\n") {
+    print STDERR blurb() . "DIE " . join(" ", $@) . "\n";
+    die;
+  }
+
   if ($@) {
     # timed out
     $head = undef;
   if ($@) {
     # timed out
     $head = undef;
@@ -687,6 +710,13 @@ sub pick_image_from_body {
         next;
       }
       
         next;
       }
       
+      # skip images with a URL that indicates a Yahoo thumbnail.
+      if (m@\.yimg\.com/.*/t/@) {
+        if (!$width)  { $width  = "?"; }
+        if (!$height) { $height = "?"; }
+        LOG ($verbose_filter, "  skip yahoo thumb $_ (${width}x$height)");
+        next;
+      }
 
       my $url = $_;
 
 
       my $url = $_;
 
@@ -763,40 +793,57 @@ sub pick_dictionary {
 # returns a random word from the dictionary
 #
 sub random_word {
 # returns a random word from the dictionary
 #
 sub random_word {
-    my $word = 0;
-    if (open (IN, "<$wordlist")) {
-        my $size = (stat(IN))[7];
-        my $pos = rand $size;
-        if (seek (IN, $pos, 0)) {
-            $word = <IN>;   # toss partial line
-            $word = <IN>;   # keep next line
-        }
-        if (!$word) {
-          seek( IN, 0, 0 );
-          $word = <IN>;
-        }
-        close (IN);
-    }
 
 
-    return 0 if (!$word);
+  local *IN;
+  if (! open (IN, "<$wordlist")) {
+    return undef;
+  }
 
 
-    $word =~ s/^[ \t\n\r]+//;
-    $word =~ s/[ \t\n\r]+$//;
-    $word =~ s/ys$/y/;
-    $word =~ s/ally$//;
-    $word =~ s/ly$//;
-    $word =~ s/ies$/y/;
-    $word =~ s/ally$/al/;
-    $word =~ s/izes$/ize/;
-    $word =~ tr/A-Z/a-z/;
+  my $size = (stat(IN))[7];
+  my $word = undef;
+  my $count = 0;
 
 
-    if ( $word =~ s/[ \t\n\r]/\+/g ) {  # convert intra-word spaces to "+".
-      $word = "\%22$word\%22";          # And put quotes (%22) around it.
+  while (1) {
+    error ("looping ($count) while reading $wordlist")
+      if (++$count > 100);
+
+    my $pos = int (rand ($size));
+    if (seek (IN, $pos, 0)) {
+      $word = <IN>;   # toss partial line
+      $word = <IN>;   # keep next line
     }
 
     }
 
-    return $word;
+    next unless ($word);
+    next if ($word =~ m/^[-\']/);
+
+    $word = lc($word);
+    $word =~ s/^.*-//s;
+    $word =~ s/^[^a-z]+//s;
+    $word =~ s/[^a-z]+$//s;
+    $word =~ s/\'s$//s;
+    $word =~ s/ys$/y/s;
+    $word =~ s/ally$//s;
+    $word =~ s/ly$//s;
+    $word =~ s/ies$/y/s;
+    $word =~ s/ally$/al/s;
+    $word =~ s/izes$/ize/s;
+    $word =~ s/esses$/ess/s;
+    $word =~ s/(.{5})ing$/$1/s;
+
+    next if (length ($word) > 14);
+    last if ($word);
+  }
+
+  close (IN);
+
+  if ( $word =~ s/\s/\+/gs ) {  # convert intra-word spaces to "+".
+    $word = "\%22$word\%22";    # And put quotes (%22) around it.
+  }
+
+  return $word;
 }
 
 }
 
+
 sub random_words {
   my ($or_p) = @_;
   my $sep = ($or_p ? "%20OR%20" : "%20");
 sub random_words {
   my ($or_p) = @_;
   my $sep = ($or_p ? "%20OR%20" : "%20");
@@ -985,8 +1032,7 @@ sub depoison {
 
 # given a list of URLs, picks one at random; loads it; and returns a
 # random image from it.
 
 # given a list of URLs, picks one at random; loads it; and returns a
 # random image from it.
-# returns the url of the page loaded; the url of the image chosen;
-# and a debugging description string.
+# returns the url of the page loaded; the url of the image chosen.
 #
 sub pick_image_from_pages {
   my ($base, $total_hit_count, $unfiltered_link_count, $timeout, @pages) = @_;
 #
 sub pick_image_from_pages {
   my ($base, $total_hit_count, $unfiltered_link_count, $timeout, @pages) = @_;
@@ -1187,9 +1233,12 @@ my $google_images_url =     "http://images.google.com/images" .
 
 # googleimgs
 sub pick_from_google_images {
 
 # googleimgs
 sub pick_from_google_images {
-  my ( $timeout ) = @_;
+  my ( $timeout, $words, $max_page ) = @_;
+
+  if (!defined($words)) {
+    $words = random_word;   # only one word for Google
+  }
 
 
-  my $words = random_word;   # only one word for Google
   my $page = (int(rand(9)) + 1);
   my $num = 20;     # 20 images per page
   my $search_url = $google_images_url . $words;
   my $page = (int(rand(9)) + 1);
   my $num = 20;     # 20 images per page
   my $search_url = $google_images_url . $words;
@@ -1203,26 +1252,37 @@ sub pick_from_google_images {
     pick_from_search_engine ($timeout, $search_url, $words);
 
   my @candidates = ();
     pick_from_search_engine ($timeout, $search_url, $words);
 
   my @candidates = ();
+  my %referers;
   foreach my $u (@subpages) {
     next unless ($u =~ m@imgres\?imgurl@i);    #  All pics start with this
     next if ($u =~ m@[/.]google\.com\b@i);     # skip google builtins
 
     if ($u =~ m@^/imgres\?imgurl=(.*?)\&imgrefurl=(.*?)\&@) {
   foreach my $u (@subpages) {
     next unless ($u =~ m@imgres\?imgurl@i);    #  All pics start with this
     next if ($u =~ m@[/.]google\.com\b@i);     # skip google builtins
 
     if ($u =~ m@^/imgres\?imgurl=(.*?)\&imgrefurl=(.*?)\&@) {
-      my $urlf = $2;
-      LOG ($verbose_filter, "  candidate: $urlf");
-      push @candidates, $urlf;
+      my $ref = $2;
+      my $img = $1;
+      $img = "http://$img" unless ($img =~ m/^http:/i);
+
+      LOG ($verbose_filter, "  candidate: $ref");
+      push @candidates, $img;
+      $referers{$img} = $ref;
     }
   }
 
     }
   }
 
-  return pick_image_from_pages ($search_url, $search_hit_count, $#subpages+1,
-                                $timeout, @candidates);
+  @candidates = depoison (@candidates);
+  return () if ($#candidates < 0);
+  my $i = int(rand($#candidates+1));
+  my $img = $candidates[$i];
+  my $ref = $referers{$img};
+
+  LOG ($verbose_load, "picked image " . ($i+1) . ": $img (on $ref)");
+  return ($ref, $img);
 }
 
 
 \f
 ############################################################################
 #
 }
 
 
 \f
 ############################################################################
 #
-# Pick images by feeding random *numbers* into Google Image Search.
+# Pick images by feeding random numbers into Google Image Search.
 # By jwz, suggested by Ian O'Donnell.
 #
 ############################################################################
 # By jwz, suggested by Ian O'Donnell.
 #
 ############################################################################
@@ -1238,44 +1298,75 @@ sub pick_from_google_image_numbers {
   $number = sprintf("%04d", $number)
     if (rand() < 0.3);
 
   $number = sprintf("%04d", $number)
     if (rand() < 0.3);
 
-  my $words = "$number";
-  my $page = (int(rand(40)) + 1);
-  my $num = 20;     # 20 images per page
-  my $search_url = $google_images_url . $words;
-
-  if ($page > 1) {
-    $search_url .= "&start=" . $page*$num;     # page number
-    $search_url .= "&num="   . $num;            #images per page
-  }
-
-  my ($search_hit_count, @subpages) =
-    pick_from_search_engine ($timeout, $search_url, $words);
+  pick_from_google_images ($timeout, "$number");
+}
 
 
-  my @candidates = ();
-  my %referers;
-  foreach my $u (@subpages) {
-    next unless ($u =~ m@imgres\?imgurl@i);    #  All pics start with this
-    next if ($u =~ m@[/.]google\.com\b@i);     # skip google builtins
 
 
-    if ($u =~ m@^/imgres\?imgurl=(.*?)\&imgrefurl=(.*?)\&@) {
-      my $ref = $2;
-      my $img = $1;
-      $img = "http://$img" unless ($img =~ m/^http:/i);
+\f
+############################################################################
+#
+# Pick images by feeding random digital camera file names into 
+# Google Image Search.
+# By jwz, inspired by the excellent Random Personal Picture Finder
+# at http://www.diddly.com/random/
+#
+############################################################################
 
 
-      LOG ($verbose_filter, "  candidate: $ref");
-      push @candidates, $img;
-      $referers{$img} = $ref;
-    }
-  }
+my @photomakers = (
+  #
+  # Common digital camera file name formats, as described at
+  # http://www.diddly.com/random/about.html
+  #
+  sub { sprintf ("dcp%05d.jpg",  int(rand(4000))); },  # Kodak
+  sub { sprintf ("dsc%05d.jpg",  int(rand(4000))); },  # Nikon
+  sub { sprintf ("dscn%04d.jpg", int(rand(4000))); },  # Nikon
+  sub { sprintf ("mvc-%03d.jpg", int(rand(999)));  },  # Sony Mavica
+  sub { sprintf ("mvc%05d.jpg",  int(rand(9999))); },  # Sony Mavica
+  sub { sprintf ("P101%04d.jpg", int(rand(9999))); },  # Olympus w/ date=101
+  sub { sprintf ("P%x%02d%04d.jpg",                    # Olympus
+                 int(rand(0xC)), int(rand(30))+1,
+                 rand(9999)); },
+  sub { sprintf ("IMG_%03d.jpg",  int(rand(999))); },  # ?
+  sub { sprintf ("IMAG%04d.jpg",  int(rand(9999))); }, # RCA and Samsung
+  sub { my $n = int(rand(9999));                       # Canon
+          sprintf ("1%02d-%04d.jpg", int($n/100), $n); },
+  sub { my $n = int(rand(9999));                       # Canon
+          sprintf ("1%02d-%04d_IMG.jpg",
+                   int($n/100), $n); },
+  sub { sprintf ("IMG_%04d.jpg", int(rand(9999))); },  # Canon
+  sub { sprintf ("dscf%04d.jpg", int(rand(9999))); },  # Fuji Finepix
+  sub { sprintf ("pdrm%04d.jpg", int(rand(9999))); },  # Toshiba PDR
+  sub { sprintf ("IM%06d.jpg", int(rand(9999))); },    # HP Photosmart
+  sub { sprintf ("EX%06d.jpg", int(rand(9999))); },    # HP Photosmart
+#  sub { my $n = int(rand(3));                         # Kodak DC-40,50,120
+#        sprintf ("DC%04d%s.jpg", int(rand(9999)),
+#                 $n == 0 ? 'S' : $n == 1 ? 'M' : 'L'); },
+  sub { sprintf ("pict%04d.jpg", int(rand(9999))); },  # Minolta Dimage
+  sub { sprintf ("P%07d.jpg", int(rand(9999))); },     # Kodak DC290
+#  sub { sprintf ("%02d%02d%04d.jpg",                  # Casio QV3000, QV4000
+#                 int(rand(12))+1, int(rand(31))+1,
+#                 int(rand(999))); },
+#  sub { sprintf ("%02d%x%02d%04d.jpg",                        # Casio QV7000
+#                 int(rand(6)), # year
+#                 int(rand(12))+1, int(rand(31))+1,
+#                 int(rand(999))); },
+  sub { sprintf ("IMGP%04d.jpg", int(rand(9999))); },  # Pentax Optio S
+  sub { sprintf ("PANA%04d.jpg", int(rand(9999))); },  # Panasonic vid still
+  sub { sprintf ("HPIM%04d.jpg", int(rand(9999))); },  # HP Photosmart
+  sub { sprintf ("PCDV%04d.jpg", int(rand(9999))); },  # ?
+ );
+
+
+# googlephotos
+sub pick_from_google_image_photos {
+  my ( $timeout ) = @_;
 
 
-  @candidates = depoison (@candidates);
-  return () if ($#candidates < 0);
-  my $i = int(rand($#candidates+1));
-  my $img = $candidates[$i];
-  my $ref = $referers{$img};
+  my $i = int(rand($#photomakers + 1));
+  my $fn = $photomakers[$i];
+  my $file = &$fn;
+  my $words .= $file . "%20filetype:jpg";
 
 
-  LOG ($verbose_load, "picked image " . ($i+1) . ": $img (on $ref)");
-  return ($ref, $img);
+  pick_from_google_images ($timeout, $words);
 }
 
 
 }
 
 
@@ -1456,14 +1547,8 @@ sub pick_from_lycos_text {
 #
 ############################################################################
 
 #
 ############################################################################
 
-my $yahoo_news_url = "http://search.news.yahoo.com/search/news" .
-                     "?a=1" .
-                     "&c=news_photos" .
-                     "&s=-%24s%2C-date" .
-                     "&n=100" .
-                     "&o=o" .
-                     "&2=" .
-                     "&3=" .
+my $yahoo_news_url = "http://news.search.yahoo.com/search/news" .
+                     "?c=news_photos" .
                      "&p=";
 
 # yahoonews
                      "&p=";
 
 # yahoonews
@@ -1472,7 +1557,7 @@ sub pick_from_yahoo_news_text {
 
   $last_search = $yahoo_news_url;   # for warnings
 
 
   $last_search = $yahoo_news_url;   # for warnings
 
-  my $words = random_words(0);
+  my $words = random_word();
   my $search_url = $yahoo_news_url . $words;
 
   my ($search_hit_count, @subpages) =
   my $search_url = $yahoo_news_url . $words;
 
   my ($search_hit_count, @subpages) =
@@ -1480,9 +1565,14 @@ sub pick_from_yahoo_news_text {
 
   my @candidates = ();
   foreach my $u (@subpages) {
 
   my @candidates = ();
   foreach my $u (@subpages) {
+
+    # de-redirectize the URLs
+    $u =~ s@^http://rds\.yahoo\.com/.*-http%3A@http:@s;
+
     # only accept URLs on Yahoo's news site
     next unless ($u =~ m@^http://dailynews\.yahoo\.com/@i ||
                  $u =~ m@^http://story\.news\.yahoo\.com/@i);
     # only accept URLs on Yahoo's news site
     next unless ($u =~ m@^http://dailynews\.yahoo\.com/@i ||
                  $u =~ m@^http://story\.news\.yahoo\.com/@i);
+    next unless ($u =~ m@&u=/@);
 
     LOG ($verbose_filter, "  candidate: $u");
     push @candidates, $u;
 
     LOG ($verbose_filter, "  candidate: $u");
     push @candidates, $u;
@@ -1502,6 +1592,15 @@ sub pick_from_yahoo_news_text {
 
 my $livejournal_img_url = "http://www.livejournal.com/stats/latest-img.bml";
 
 
 my $livejournal_img_url = "http://www.livejournal.com/stats/latest-img.bml";
 
+# With most of our image sources, we get a random page and then select
+# from the images on it.  However, in the case of LiveJournal, the page
+# of images tends to update slowly; so we'll remember the last N entries
+# on it and randomly select from those, to get a wider variety each time.
+
+my $lj_cache_size = 1000;
+my @lj_cache = (); # fifo, for ordering by age
+my %lj_cache = (); # hash, for detecting dups
+
 # livejournal
 sub pick_from_livejournal_images {
   my ( $timeout ) = @_;
 # livejournal
 sub pick_from_livejournal_images {
   my ( $timeout ) = @_;
@@ -1511,8 +1610,6 @@ sub pick_from_livejournal_images {
   my ( $base, $body ) = get_document ($livejournal_img_url, undef, $timeout);
   return () unless $body;
 
   my ( $base, $body ) = get_document ($livejournal_img_url, undef, $timeout);
   return () unless $body;
 
-  my @candidates = ();
-
   $body =~ s/\n/ /gs;
   $body =~ s/(<recent-image)\b/\n$1/gsi;
 
   $body =~ s/\n/ /gs;
   $body =~ s/(<recent-image)\b/\n$1/gsi;
 
@@ -1520,20 +1617,38 @@ sub pick_from_livejournal_images {
     next unless (m/^<recent-image\b/);
     next unless (m/\bIMG=[\'\"]([^\'\"]+)[\'\"]/si);
     my $img = html_unquote ($1);
     next unless (m/^<recent-image\b/);
     next unless (m/\bIMG=[\'\"]([^\'\"]+)[\'\"]/si);
     my $img = html_unquote ($1);
+
+    next if ($lj_cache{$img}); # already have it
+
     next unless (m/\bURL=[\'\"]([^\'\"]+)[\'\"]/si);
     my $page = html_unquote ($1);
     my @pair = ($img, $page);
     LOG ($verbose_filter, "  candidate: $img");
     next unless (m/\bURL=[\'\"]([^\'\"]+)[\'\"]/si);
     my $page = html_unquote ($1);
     my @pair = ($img, $page);
     LOG ($verbose_filter, "  candidate: $img");
-    push @candidates, \@pair;
+    push @lj_cache, \@pair;
+    $lj_cache{$img} = \@pair;
   }
 
   }
 
-  return () if ($#candidates == -1);
+  return () if ($#lj_cache == -1);
 
 
-  my $i = int(rand($#candidates+1));
-  my ($img, $page) = @{$candidates[$i]};
+  my $n = $#lj_cache+1;
+  my $i = int(rand($n));
+  my ($img, $page) = @{$lj_cache[$i]};
 
 
-  LOG ($verbose_load, "picked image " .($i+1) . "/" . ($#candidates+1) .
-       ": $img");
+  # delete this one from @lj_cache and from %lj_cache.
+  #
+  @lj_cache = ( @lj_cache[0 .. $i-1],
+                @lj_cache[$i+1 .. $#lj_cache] );
+  delete $lj_cache{$img};
+
+  # Keep the size of the cache under the limit by nuking older entries
+  #
+  while ($#lj_cache >= $lj_cache_size) {
+    my $pairP = shift @lj_cache;
+    my $img = $pairP->[0];
+    delete $lj_cache{$img};
+  }
+
+  LOG ($verbose_load, "picked image " .($i+1) . "/$n: $img");
 
   return ($page, $img);
 }
 
   return ($page, $img);
 }
@@ -1768,6 +1883,17 @@ sub error {
   exit 1;
 }
 
   exit 1;
 }
 
+sub stacktrace {
+  my $i = 1;
+  print STDERR "$progname: stack trace:\n";
+  while (1) {
+    my ($package, $filename, $line, $subroutine) = caller($i++);
+    last unless defined($package);
+    $filename =~ s@^.*/@@;
+    print STDERR "  $filename#$line, $subroutine\n";
+  }
+}
+
 
 my $lastlog = "";
 
 
 my $lastlog = "";
 
@@ -2112,6 +2238,7 @@ sub bellrand {
 
 sub exit_cleanup {
   x_cleanup();
 
 sub exit_cleanup {
   x_cleanup();
+  print STDERR "$progname: exiting\n" if ($verbose_warnings);
   if (@pids_to_kill) {
     print STDERR blurb() . "killing: " . join(' ', @pids_to_kill) . "\n";
     kill ('TERM', @pids_to_kill);
   if (@pids_to_kill) {
     print STDERR blurb() . "killing: " . join(' ', @pids_to_kill) . "\n";
     kill ('TERM', @pids_to_kill);
@@ -2124,7 +2251,7 @@ sub signal_cleanup {
                           ? "caught signal $sig."
                           : "exiting.")
                        . "\n"
                           ? "caught signal $sig."
                           : "exiting.")
                        . "\n"
-    if ($verbose_exec);
+    if ($verbose_exec || $verbose_warnings);
   exit 1;
 }
 
   exit 1;
 }
 
@@ -2149,7 +2276,7 @@ sub url_only_output {
 
 ##############################################################################
 #
 
 ##############################################################################
 #
-# Running as an xscreensaver module
+# Running as an xscreensaver module, or as a web page imagemap
 #
 ##############################################################################
 
 #
 ##############################################################################
 
@@ -2800,7 +2927,6 @@ sub paste_image {
   $source .= "-" . stats_of($source);
   print STDOUT "image: ${iw}x${ih} @ $x,$y $base $source\n"
     if ($verbose_imgmap);
   $source .= "-" . stats_of($source);
   print STDOUT "image: ${iw}x${ih} @ $x,$y $base $source\n"
     if ($verbose_imgmap);
-
   if ($imagemap_base) {
     update_imagemap ($base, $x, $y, $iw, $ih,
                      $image_ppm, $img_width, $img_height);
   if ($imagemap_base) {
     update_imagemap ($base, $x, $y, $iw, $ih,
                      $image_ppm, $img_width, $img_height);
@@ -2998,6 +3124,10 @@ sub main {
       $http_proxy = shift @ARGV;
     } elsif ($_ eq "-dictionary" || $_ eq "-dict") {
       $dict = shift @ARGV;
       $http_proxy = shift @ARGV;
     } elsif ($_ eq "-dictionary" || $_ eq "-dict") {
       $dict = shift @ARGV;
+    } elsif ($_ eq "-opacity") {
+      $opacity = shift @ARGV;
+      error ("opacity must be between 0.0 and 1.0")
+        if ($opacity <= 0 || $opacity > 1);
     } elsif ($_ eq "-driftnet" || $_ eq "--driftnet") {
       @search_methods = ( 100, "driftnet", \&pick_from_driftnet );
       if (! ($ARGV[0] =~ m/^-/)) {
     } elsif ($_ eq "-driftnet" || $_ eq "--driftnet") {
       @search_methods = ( 100, "driftnet", \&pick_from_driftnet );
       if (! ($ARGV[0] =~ m/^-/)) {
index 196b4319b7056150b099ce1230369bc95ec26bea..8ba09d73733cd5e4a0d06337ae7c1a686a3f963c 100644 (file)
@@ -1,5 +1,5 @@
 /* webcollage-helper --- scales and pastes one image into another
 /* webcollage-helper --- scales and pastes one image into another
- * xscreensaver, Copyright (c) 2002, 2003, 2004 Jamie Zawinski <jwz@jwz.org>
+ * xscreensaver, Copyright (c) 2002-2005 Jamie Zawinski <jwz@jwz.org>
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
  * documentation for any purpose is hereby granted without fee, provided that
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
  * documentation for any purpose is hereby granted without fee, provided that
@@ -66,10 +66,14 @@ bevel_image (GdkPixbuf **pbP, int bevel_pct,
              int x, int y, int w, int h)
 {
   GdkPixbuf *pb = *pbP;
              int x, int y, int w, int h)
 {
   GdkPixbuf *pb = *pbP;
+  int small_size = (w > h ? h : w);
 
 
-  int bevel_size = (w > h ? h : w) * (bevel_pct / 100.0);
+  int bevel_size = small_size * (bevel_pct / 100.0);
 
 
-  if (bevel_size < 10)    /* too small to bother */
+  /* Use a proportionally larger bevel size for especially small images. */
+  if      (bevel_size < 20 && small_size > 40) bevel_size = 20;
+  else if (bevel_size < 10 && small_size > 20) bevel_size = 10;
+  else if (bevel_size < 5)    /* too small to bother bevelling */
     return;
 
   /* Ensure the pixbuf has an alpha channel. */
     return;
 
   /* Ensure the pixbuf has an alpha channel. */
@@ -127,25 +131,24 @@ bevel_image (GdkPixbuf **pbP, int bevel_pct,
             if (r != 1)
               p[ch-1] *= r;
 
             if (r != 1)
               p[ch-1] *= r;
 
-            /* p[0]=p[1]=p[2]=0; / * #### */
-
             p += ch;
           }
         line += rs;
       }
 
 #if 0  /* show the ramp */
             p += ch;
           }
         line += rs;
       }
 
 #if 0  /* show the ramp */
-    for (xx = 0; xx < bevel_size * 2; xx++)
+    line = data + (rs * y);
+    for (yy = 0; yy < h; yy++)
       {
       {
-        int ii = (256 * (xx >= bevel_size ? 1 : ramp[xx]));
-        int yy;
-        for (yy = 0; yy < ii; yy++)
+        guchar *p = line + (x * ch);
+        for (xx = 0; xx < w; xx++)
           {
           {
-            data [((y + (256-yy)) * rs) + ((x + xx) * ch) + 0] = 0;
-            data [((y + (256-yy)) * rs) + ((x + xx) * ch) + 1] = 0;
-            data [((y + (256-yy)) * rs) + ((x + xx) * ch) + 2] = 0;
-            data [((y + (256-yy)) * rs) + ((x + xx) * ch) + 3] = 255;
+            int cc = 0;
+            for (cc = 0; cc < ch-1; cc++)
+              p[cc] = 255;
+            p += ch;
           }
           }
+        line += rs;
       }
 #endif
 
       }
 #endif
 
@@ -294,12 +297,22 @@ paste (const char *paste_file,
                           base_pb,
                           to_x, to_y);
   else
                           base_pb,
                           to_x, to_y);
   else
-    gdk_pixbuf_composite (paste_pb, base_pb,
-                          to_x, to_y, w, h,
-                          to_x - from_x, to_y - from_y,
-                          1.0, 1.0,
-                          GDK_INTERP_HYPER,
-                          opacity * 255);
+    {
+      from_x++;  /* gdk_pixbuf_composite gets confused about the bevel: */
+      from_y++;  /* it leaves a stripe on the top and left if we try to */
+      to_x++;    /* start at 0,0, so pull it right and down by 1 pixel. */
+      to_y++;    /* (problem seen in gtk2-2.4.14-2.fc3) */
+      w--;
+      h--;
+
+      if (w > 0 && h > 0)
+        gdk_pixbuf_composite (paste_pb, base_pb,
+                              to_x, to_y, w, h,
+                              to_x - from_x, to_y - from_y,
+                              1.0, 1.0,
+                              GDK_INTERP_HYPER,
+                              opacity * 255);
+    }
 
   if (verbose_p)
     fprintf (stderr, "%s: pasted %dx%d from %d,%d to %d,%d\n",
 
   if (verbose_p)
     fprintf (stderr, "%s: pasted %dx%d from %d,%d to %d,%d\n",
index c84e5032bf9a024c6340a99a6da17855d1c79aad..ab146cfac02eb01a87ed2a35cc54d9a7d15d70da 100644 (file)
@@ -18,6 +18,7 @@ webcollage - decorate the screen with random images from the web
 .B webcollage
 [\-display \fIhost:display.screen\fP]
 [\-root]
 .B webcollage
 [\-display \fIhost:display.screen\fP]
 [\-root]
+[\-window\-id \fIid\fP]
 [\-verbose]
 [\-timeout \fIsecs\fP]
 [\-delay \fIsecs\fP]
 [\-verbose]
 [\-timeout \fIsecs\fP]
 [\-delay \fIsecs\fP]
@@ -26,6 +27,7 @@ webcollage - decorate the screen with random images from the web
 [\-urls-only]
 [\-imagemap \fIfilename-base\fP]
 [\-size \fIWxH\fP]
 [\-urls-only]
 [\-imagemap \fIfilename-base\fP]
 [\-size \fIWxH\fP]
+[\-opacity \fIratio\fP]
 [\-filter \fIcommand\fP]
 [\-filter2 \fIcommand\fP]
 [\-http\-proxy host[:port]]
 [\-filter \fIcommand\fP]
 [\-filter2 \fIcommand\fP]
 [\-http\-proxy host[:port]]
@@ -36,15 +38,6 @@ The \fIwebcollage\fP program pulls random image off of the World Wide Web
 and scatters them on the root window.  One satisfied customer described it
 as "a nonstop pop culture brainbath."  This program finds its images by
 doing random web searches, and extracting images from the returned pages.
 and scatters them on the root window.  One satisfied customer described it
 as "a nonstop pop culture brainbath."  This program finds its images by
 doing random web searches, and extracting images from the returned pages.
-It places the images on the root window by using the
-.BR giftopnm (1),
-.BR djpeg (1),
-and
-.BR xli (1),
-.BR xv (1),
-or
-.BR xloadimage (1)
-tools.
 
 \fIwebcollage\fP is written in
 .BR perl (1)
 
 \fIwebcollage\fP is written in
 .BR perl (1)
@@ -66,6 +59,20 @@ accepts the following options:
 Draw on the root window.  This option is manditory, if output is being
 produced: drawing to a window other than the root window is not yet
 supported.
 Draw on the root window.  This option is manditory, if output is being
 produced: drawing to a window other than the root window is not yet
 supported.
+
+Images are placed on the root window by using one of the
+.BR xscreensaver-getimage (1),
+.BR chbg (1),
+.BR xv (1),
+.BR xli (1),
+or
+.BR xloadimage (1)
+programs (whichever is available.)
+.TP 8
+.B \-window\-id \fIid\fP
+Draw to the indicated window instead; this only works if the
+.BR xscreensaver-getimage (1)
+program is installed.
 .TP 8
 .B \-verbose \fRor\fP \-v
 Print diagnostics to stderr.  Multiple \fI-v\fP switches increase the
 .TP 8
 .B \-verbose \fRor\fP \-v
 Print diagnostics to stderr.  Multiple \fI-v\fP switches increase the
@@ -89,8 +96,14 @@ a color name, a hexadecimal RGB specification in the form '#rrggbb', or
 the name of a PPM file.
 .TP 8
 .B \-size \fIWxH\fP
 the name of a PPM file.
 .TP 8
 .B \-size \fIWxH\fP
-Normally, the output image will be made to be the size of the screen.
-This lets you specify the desired size.
+Normally, the output image will be made to be the size of the
+screen (or target window.)  This lets you specify the desired size.
+.TP 8
+.B \-opacity \fIratio\fP
+How transparently to paste the images together, with 0.0 meaning
+"completely transparent" and 1.0 meaning "opaque."  Default 0.85.
+A value of around 0.3 will produce an interestingly blurry image
+after a while.
 .TP 8
 .B \-no-output
 If this option is specified, then no composite output image will be
 .TP 8
 .B \-no-output
 If this option is specified, then no composite output image will be
@@ -130,6 +143,11 @@ environment variables.
 Webcollage normally looks at the system's default spell-check dictionary
 to generate words to feed into the search engines.  You can specify an
 alternate dictionary with this option.
 Webcollage normally looks at the system's default spell-check dictionary
 to generate words to feed into the search engines.  You can specify an
 alternate dictionary with this option.
+
+Note that by default, webcollage searches for images using several
+different methods, not all of which involve dictionary words, so
+using a "topical" dictionary file will not, in itself, be as effective
+as you might be hoping.
 .TP 8
 .B \-driftnet \fI[ args ]\fP
 .BR driftnet (1)
 .TP 8
 .B \-driftnet \fI[ args ]\fP
 .BR driftnet (1)
@@ -173,7 +191,7 @@ to find the random words to feed to certain search engines.
     \fIhttp://www.altavista.com/image/randomlink\fP,
     \fIhttp://random.yahoo.com/fast/ryl\fP,
     \fIhttp://www.livejournal.com/stats/latest-img.bml\fP, and
     \fIhttp://www.altavista.com/image/randomlink\fP,
     \fIhttp://random.yahoo.com/fast/ryl\fP,
     \fIhttp://www.livejournal.com/stats/latest-img.bml\fP, and
-    \fIhttp://news.yahoo.com/\fP
+    \fIhttp://www.google.com/\fP
 to find random web pages.
 .SH BOOBIES
 The Internet being what it is, absolutely anything might show up in the
 to find random web pages.
 .SH BOOBIES
 The Internet being what it is, absolutely anything might show up in the
@@ -209,7 +227,7 @@ DriftNet:
 .BR EtherPEG ,
 .BR EtherPeek
 .SH COPYRIGHT
 .BR EtherPEG ,
 .BR EtherPeek
 .SH COPYRIGHT
-Copyright \(co 1998-2004 by Jamie Zawinski.  Permission to use, copy, modify,
+Copyright \(co 1998-2005 by Jamie Zawinski.  Permission to use, copy, modify,
 distribute, and sell this software and its documentation for any purpose is
 hereby granted without fee, provided that the above copyright notice appear
 in all copies and that both that copyright notice and this permission notice
 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
@@ -217,4 +235,4 @@ 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
 suitability of this software for any purpose.  It is provided "as is" without
 express or implied warranty.
 .SH AUTHOR
-Jamie Zawinski <jwz@jwz.org>, 24-May-98.
+Jamie Zawinski <jwz@jwz.org>, 24-May-1998.
index 2e5513e58fd33e4420a3afd9c076006c6284048b..9d65586f1cf084819e4913dd7c56d8fa90a77efa 100644 (file)
@@ -244,6 +244,37 @@ getticks(void)
           (tv.tv_usec - basetime.tv_usec)/1000);
 }
 
           (tv.tv_usec - basetime.tv_usec)/1000);
 }
 
+
+/* The first time we grab an image, do it the default way.
+   The second and subsequent times, add "-no-desktop" to the command.
+   That way we don't have to watch the window un-map 5+ times in a row.
+   Also, we end up with the desktop on only one channel, and pictures
+   on all the others (or colorbars, if no imageDirectory is set.)
+ */
+static void
+hack_resources (void)
+{
+  static int count = -1;
+  count++;
+
+  if (count == 0)
+    return;
+  else if (count == 1)
+    {
+      char *res = "desktopGrabber";
+      char *val = get_string_resource (res, "DesktopGrabber");
+      char buf1[255];
+      char buf2[255];
+      XrmValue value;
+      sprintf (buf1, "%.100s.%.100s", progclass, res);
+      sprintf (buf2, "%.200s -no-desktop", val);
+      value.addr = buf2;
+      value.size = strlen(buf2);
+      XrmPutResource (&db, buf1, "String", &value);
+    }
+}
+
+
 int
 analogtv_load_random_image(analogtv *it, analogtv_input *input)
 {
 int
 analogtv_load_random_image(analogtv *it, analogtv_input *input)
 {
@@ -255,7 +286,8 @@ analogtv_load_random_image(analogtv *it, analogtv_input *input)
 
   pixmap=XCreatePixmap(it->dpy, it->window, width, height, it->visdepth);
   XSync(it->dpy, False);
 
   pixmap=XCreatePixmap(it->dpy, it->window, width, height, it->visdepth);
   XSync(it->dpy, False);
-  load_random_image(it->screen, it->window, pixmap, NULL);
+  hack_resources();
+  load_random_image(it->screen, it->window, pixmap, NULL, NULL);
   image = XGetImage(it->dpy, pixmap, 0, 0, width, height, ~0L, ZPixmap);
   XFreePixmap(it->dpy, pixmap);
 
   image = XGetImage(it->dpy, pixmap, 0, 0, width, height, ~0L, ZPixmap);
   XFreePixmap(it->dpy, pixmap);
 
@@ -321,6 +353,7 @@ void add_stations(void)
   }
 }
 
   }
 }
 
+
 void
 screenhack (Display *dpy, Window window)
 {
 void
 screenhack (Display *dpy, Window window)
 {
index 7624b4875c904a16b5c97a1ac554365f9959f9d4..2ad0be4c0b21ff28ac89c34d126ff1695a77c900 100644 (file)
@@ -68,7 +68,7 @@ pre_merge_options (void)
   /* Add extra args, if they're mentioned in the defaults... */
   {
     char *args[] = { "-count", "-cycles", "-delay", "-ncolors",
   /* Add extra args, if they're mentioned in the defaults... */
   {
     char *args[] = { "-count", "-cycles", "-delay", "-ncolors",
-                    "-size", "-wireframe", "-use3d", "-useSHM",
+                    "-size", "-font", "-wireframe", "-use3d", "-useSHM",
                      "-showFPS" };
     for (j = 0; j < countof(args); j++)
       if (strstr(app_defaults, args[j]+1))
                      "-showFPS" };
     for (j = 0; j < countof(args); j++)
       if (strstr(app_defaults, args[j]+1))
@@ -377,6 +377,32 @@ xlockmore_screenhack (Display *dpy, Window window,
     mi.pause = 100000000;
   orig_pause = mi.pause;
 
     mi.pause = 100000000;
   orig_pause = mi.pause;
 
+  /* If this hack uses fonts (meaning, mentioned "font" in DEFAULTS)
+     then load it. */
+  {
+    char *name = get_string_resource ("font", "Font");
+    if (name)
+      {
+        XFontStruct *f = XLoadQueryFont (dpy, name);
+        const char *def1 = "-*-times-bold-r-normal-*-180-*";
+        const char *def2 = "fixed";
+        if (!f)
+          {
+            fprintf (stderr, "%s: font %s does not exist, using %s\n",
+                     progname, name, def1);
+            f = XLoadQueryFont (dpy, def1);
+          }
+        if (!f)
+          {
+            fprintf (stderr, "%s: font %s does not exist, using %s\n",
+                     progname, def1, def2);
+            f = XLoadQueryFont (dpy, def2);
+          }
+        if (f) XSetFont (dpy, mi.gc, f->fid);
+        if (f) XFreeFont (dpy, f);
+      }
+  }
+
   xlockmore_read_resources ();
 
   XClearWindow (dpy, window);
   xlockmore_read_resources ();
 
   XClearWindow (dpy, window);
index 11d1c03649ae2e1fef7c0a3d6475bbf765abd357..5038f7d2e0c582da0be60e4c8d4d1552f1546caa 100644 (file)
@@ -364,7 +364,7 @@ void screenhack(Display* x_Disp,Window x_Win)
 
        /* Grab the screen to give us time to do whatever we want */
        XGetWindowAttributes(x_Disp,x_Win,&x_WinAttr);
 
        /* Grab the screen to give us time to do whatever we want */
        XGetWindowAttributes(x_Disp,x_Win,&x_WinAttr);
-        load_random_image (x_WinAttr.screen, x_Win, x_Win, NULL);
+        load_random_image (x_WinAttr.screen, x_Win, x_Win, NULL, NULL);
 
        x_GcVal.subwindow_mode = IncludeInferiors;
        x_Gc = XCreateGC(x_Disp,x_Win,GCSubwindowMode,&x_GcVal);
 
        x_GcVal.subwindow_mode = IncludeInferiors;
        x_Gc = XCreateGC(x_Disp,x_Win,GCSubwindowMode,&x_GcVal);
index eb34ee37972d10b28fdebd6556922021ecf6d6ee..a2bc5bd81783006553f4e0452fa294d5d32959e2 100644 (file)
@@ -102,7 +102,7 @@ static void init_hack(Display *dpy, Window window)
 
   orig_map = NULL;
   pm = XCreatePixmap(dpy, window, sizex, sizey, xgwa.depth);
 
   orig_map = NULL;
   pm = XCreatePixmap(dpy, window, sizex, sizey, xgwa.depth);
-  load_random_image (xgwa.screen, window, pm, NULL);
+  load_random_image (xgwa.screen, window, pm, NULL, NULL);
 
   if (!lenses) {
     orig_map = XGetImage(dpy, pm, 0, 0, sizex, sizey, ~0L, ZPixmap);
 
   if (!lenses) {
     orig_map = XGetImage(dpy, pm, 0, 0, sizex, sizey, ~0L, ZPixmap);
index 8bf86f90d1822fc6fd3744f1aa032bf11317ac11..c150dc2c9046272bf255cf87d77a148c168fca9b 100644 (file)
@@ -1,4 +1,4 @@
-# Auto-generated: Mon Oct  4 16:24:15 RDT 2004
+# Auto-generated: Wed Dec 22 12:47:56 RST 2004
 driver/demo-Gtk-conf.c
 driver/demo-Gtk-support.c
 driver/demo-Gtk-widgets.c
 driver/demo-Gtk-conf.c
 driver/demo-Gtk-support.c
 driver/demo-Gtk-widgets.c
@@ -58,6 +58,7 @@ hacks/config/euler2d.xml
 hacks/config/extrusion.xml
 hacks/config/fadeplot.xml
 hacks/config/fireflies.xml
 hacks/config/extrusion.xml
 hacks/config/fadeplot.xml
 hacks/config/fireflies.xml
+hacks/config/fireworkx.xml
 hacks/config/flag.xml
 hacks/config/flame.xml
 hacks/config/flipflop.xml
 hacks/config/flag.xml
 hacks/config/flame.xml
 hacks/config/flipflop.xml
@@ -95,6 +96,7 @@ hacks/config/hypertorus.xml
 hacks/config/ifs.xml
 hacks/config/imsmap.xml
 hacks/config/interference.xml
 hacks/config/ifs.xml
 hacks/config/imsmap.xml
 hacks/config/interference.xml
+hacks/config/intermomentary.xml
 hacks/config/jigglypuff.xml
 hacks/config/jigsaw.xml
 hacks/config/juggle.xml
 hacks/config/jigglypuff.xml
 hacks/config/jigsaw.xml
 hacks/config/juggle.xml
@@ -133,6 +135,7 @@ hacks/config/penrose.xml
 hacks/config/petri.xml
 hacks/config/phosphor.xml
 hacks/config/piecewise.xml
 hacks/config/petri.xml
 hacks/config/phosphor.xml
 hacks/config/piecewise.xml
+hacks/config/pinion.xml
 hacks/config/pipes.xml
 hacks/config/polyhedra.xml
 hacks/config/polyominoes.xml
 hacks/config/pipes.xml
 hacks/config/polyhedra.xml
 hacks/config/polyominoes.xml
@@ -172,6 +175,7 @@ hacks/config/starfish.xml
 hacks/config/starwars.xml
 hacks/config/stonerview.xml
 hacks/config/strange.xml
 hacks/config/starwars.xml
 hacks/config/stonerview.xml
 hacks/config/strange.xml
+hacks/config/substrate.xml
 hacks/config/superquadrics.xml
 hacks/config/swirl.xml
 hacks/config/t3d.xml
 hacks/config/superquadrics.xml
 hacks/config/swirl.xml
 hacks/config/t3d.xml
index 79a08429074fe1936d319d44521a399f9b7a4c23..a5e49f4f9a064783ddacba39488bc6874496e4e7 100644 (file)
--- a/po/ca.po
+++ b/po/ca.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2004-10-04 16:25+0200\n"
+"POT-Creation-Date: 2004-12-22 12:51+0100\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -147,7 +147,7 @@ msgstr ""
 msgid "minutes"
 msgstr ""
 
 msgid "minutes"
 msgstr ""
 
-#: driver/demo-Gtk-widgets.c:482 driver/demo-Gtk.c:2845
+#: driver/demo-Gtk-widgets.c:482 driver/demo-Gtk.c:2852
 #: driver/xscreensaver-demo.glade.h:58
 msgid "Preview"
 msgstr ""
 #: driver/xscreensaver-demo.glade.h:58
 msgid "Preview"
 msgstr ""
@@ -195,12 +195,12 @@ msgstr "Protector de pantalla"
 msgid "Random Screen Saver"
 msgstr "Protector de pantalla"
 
 msgid "Random Screen Saver"
 msgstr "Protector de pantalla"
 
-#: driver/demo-Gtk-widgets.c:571 driver/demo-Gtk.c:2134
+#: driver/demo-Gtk-widgets.c:571 driver/demo-Gtk.c:2141
 #: driver/xscreensaver-demo.glade.h:75
 msgid "Use"
 msgstr ""
 
 #: driver/xscreensaver-demo.glade.h:75
 msgid "Use"
 msgstr ""
 
-#: driver/demo-Gtk-widgets.c:591 driver/demo-Gtk.c:2144
+#: driver/demo-Gtk-widgets.c:591 driver/demo-Gtk.c:2151
 #: driver/xscreensaver-demo.glade.h:63
 #, fuzzy
 msgid "Screen Saver"
 #: driver/xscreensaver-demo.glade.h:63
 #, fuzzy
 msgid "Screen Saver"
@@ -431,7 +431,7 @@ msgid "Visual:"
 msgstr ""
 
 #: driver/demo-Gtk-widgets.c:1550 driver/demo-Gtk-widgets.c:1573
 msgstr ""
 
 #: driver/demo-Gtk-widgets.c:1550 driver/demo-Gtk-widgets.c:1573
-#: driver/demo-Gtk.c:1538 driver/demo-Gtk.c:2864
+#: driver/demo-Gtk.c:1545 driver/demo-Gtk.c:2871
 #: driver/xscreensaver-demo.glade.h:5 driver/xscreensaver-demo.glade2.h:3
 msgid "Any"
 msgstr ""
 #: driver/xscreensaver-demo.glade.h:5 driver/xscreensaver-demo.glade2.h:3
 msgid "Any"
 msgstr ""
@@ -530,7 +530,7 @@ msgstr ""
 msgid "Back to the graphical configuration options."
 msgstr ""
 
 msgid "Back to the graphical configuration options."
 msgstr ""
 
-#: driver/demo-Gtk-widgets.c:1709 driver/demo-Gtk.c:741
+#: driver/demo-Gtk-widgets.c:1709 driver/demo-Gtk.c:748
 #: driver/xscreensaver-demo.glade.h:54
 msgid "OK"
 msgstr ""
 #: driver/xscreensaver-demo.glade.h:54
 msgid "OK"
 msgstr ""
@@ -539,18 +539,18 @@ msgstr ""
 msgid "Cancel"
 msgstr ""
 
 msgid "Cancel"
 msgstr ""
 
-#: driver/demo-Gtk.c:649
+#: driver/demo-Gtk.c:656
 msgid "For updates, check http://www.jwz.org/xscreensaver/"
 msgstr ""
 
 msgid "For updates, check http://www.jwz.org/xscreensaver/"
 msgstr ""
 
-#: driver/demo-Gtk.c:779
+#: driver/demo-Gtk.c:786
 msgid ""
 "Error:\n"
 "\n"
 "No Help URL has been specified.\n"
 msgstr ""
 
 msgid ""
 "Error:\n"
 "\n"
 "No Help URL has been specified.\n"
 msgstr ""
 
-#: driver/demo-Gtk.c:865
+#: driver/demo-Gtk.c:872
 msgid ""
 "Error:\n"
 "\n"
 msgid ""
 "Error:\n"
 "\n"
@@ -558,7 +558,7 @@ msgid ""
 "\n"
 msgstr ""
 
 "\n"
 msgstr ""
 
-#: driver/demo-Gtk.c:877
+#: driver/demo-Gtk.c:884
 msgid ""
 "You are running as root.  This usually means that xscreensaver\n"
 "was unable to contact your X server because access control is\n"
 msgid ""
 "You are running as root.  This usually means that xscreensaver\n"
 "was unable to contact your X server because access control is\n"
@@ -577,18 +577,18 @@ msgid ""
 "normal user, and `su' as necessary."
 msgstr ""
 
 "normal user, and `su' as necessary."
 msgstr ""
 
-#: driver/demo-Gtk.c:893
+#: driver/demo-Gtk.c:900
 msgid "Please check your $PATH and permissions."
 msgstr ""
 
 msgid "Please check your $PATH and permissions."
 msgstr ""
 
-#: driver/demo-Gtk.c:928
+#: driver/demo-Gtk.c:935
 msgid ""
 "Error:\n"
 "\n"
 "Couldn't determine init file name!\n"
 msgstr ""
 
 msgid ""
 "Error:\n"
 "\n"
 "Couldn't determine init file name!\n"
 msgstr ""
 
-#: driver/demo-Gtk.c:933
+#: driver/demo-Gtk.c:940
 #, c-format
 msgid ""
 "Error:\n"
 #, c-format
 msgid ""
 "Error:\n"
@@ -596,14 +596,14 @@ msgid ""
 "Couldn't write %s\n"
 msgstr ""
 
 "Couldn't write %s\n"
 msgstr ""
 
-#: driver/demo-Gtk.c:992
+#: driver/demo-Gtk.c:999
 msgid ""
 "Error:\n"
 "\n"
 "no `manualCommand' resource set."
 msgstr ""
 
 msgid ""
 "Error:\n"
 "\n"
 "no `manualCommand' resource set."
 msgstr ""
 
-#: driver/demo-Gtk.c:1173
+#: driver/demo-Gtk.c:1180
 #, c-format
 msgid ""
 "Error:\n"
 #, c-format
 msgid ""
 "Error:\n"
@@ -611,7 +611,7 @@ msgid ""
 "Unparsable time format: \"%s\"\n"
 msgstr ""
 
 "Unparsable time format: \"%s\"\n"
 msgstr ""
 
-#: driver/demo-Gtk.c:1829
+#: driver/demo-Gtk.c:1836
 #, c-format
 msgid ""
 "Error:\n"
 #, c-format
 msgid ""
 "Error:\n"
@@ -619,29 +619,29 @@ msgid ""
 "Directory does not exist: \"%s\"\n"
 msgstr ""
 
 "Directory does not exist: \"%s\"\n"
 msgstr ""
 
-#: driver/demo-Gtk.c:2546
+#: driver/demo-Gtk.c:2553
 msgid "Descriptions not available: no XML support compiled in."
 msgstr ""
 
 msgid "Descriptions not available: no XML support compiled in."
 msgstr ""
 
-#: driver/demo-Gtk.c:2551
+#: driver/demo-Gtk.c:2558
 msgid "No description available."
 msgstr ""
 
 msgid "No description available."
 msgstr ""
 
-#: driver/demo-Gtk.c:2816
+#: driver/demo-Gtk.c:2823
 msgid "Blank Screen"
 msgstr ""
 
 msgid "Blank Screen"
 msgstr ""
 
-#: driver/demo-Gtk.c:2822
+#: driver/demo-Gtk.c:2829
 #, fuzzy
 msgid "Screen Saver Disabled"
 msgstr "Protector de pantalla"
 
 #, fuzzy
 msgid "Screen Saver Disabled"
 msgstr "Protector de pantalla"
 
-#: driver/demo-Gtk.c:2855
+#: driver/demo-Gtk.c:2862
 #, c-format
 msgid "%s: %.100s Settings"
 msgstr ""
 
 #, c-format
 msgid "%s: %.100s Settings"
 msgstr ""
 
-#: driver/demo-Gtk.c:3010
+#: driver/demo-Gtk.c:3017
 #, c-format
 msgid ""
 "Warning:\n"
 #, c-format
 msgid ""
 "Warning:\n"
@@ -649,23 +649,23 @@ msgid ""
 "file \"%s\" has changed, reloading.\n"
 msgstr ""
 
 "file \"%s\" has changed, reloading.\n"
 msgstr ""
 
-#: driver/demo-Gtk.c:3092
+#: driver/demo-Gtk.c:3099
 msgid "No Preview"
 msgstr ""
 
 msgid "No Preview"
 msgstr ""
 
-#: driver/demo-Gtk.c:3092
+#: driver/demo-Gtk.c:3099
 msgid "Available"
 msgstr ""
 
 msgid "Available"
 msgstr ""
 
-#: driver/demo-Gtk.c:3093
+#: driver/demo-Gtk.c:3100
 msgid "Not"
 msgstr ""
 
 msgid "Not"
 msgstr ""
 
-#: driver/demo-Gtk.c:3093
+#: driver/demo-Gtk.c:3100
 msgid "Installed"
 msgstr ""
 
 msgid "Installed"
 msgstr ""
 
-#: driver/demo-Gtk.c:3858
+#: driver/demo-Gtk.c:3865
 #, c-format
 msgid ""
 "Warning:\n"
 #, c-format
 msgid ""
 "Warning:\n"
@@ -674,7 +674,7 @@ msgid ""
 "on display \"%s\".  Launch it now?"
 msgstr ""
 
 "on display \"%s\".  Launch it now?"
 msgstr ""
 
-#: driver/demo-Gtk.c:3868
+#: driver/demo-Gtk.c:3875
 #, c-format
 msgid ""
 "Warning:\n"
 #, c-format
 msgid ""
 "Warning:\n"
@@ -693,7 +693,7 @@ msgid ""
 "Restart the xscreensaver daemon now?\n"
 msgstr ""
 
 "Restart the xscreensaver daemon now?\n"
 msgstr ""
 
-#: driver/demo-Gtk.c:3893
+#: driver/demo-Gtk.c:3900
 #, c-format
 msgid ""
 "Warning:\n"
 #, c-format
 msgid ""
 "Warning:\n"
@@ -709,7 +709,7 @@ msgid ""
 "Restart the daemon on \"%s\" as \"%s\" now?\n"
 msgstr ""
 
 "Restart the daemon on \"%s\" as \"%s\" now?\n"
 msgstr ""
 
-#: driver/demo-Gtk.c:3915
+#: driver/demo-Gtk.c:3922
 #, c-format
 msgid ""
 "Warning:\n"
 #, c-format
 msgid ""
 "Warning:\n"
@@ -721,12 +721,12 @@ msgid ""
 "Restart the xscreensaver daemon now?\n"
 msgstr ""
 
 "Restart the xscreensaver daemon now?\n"
 msgstr ""
 
-#: driver/demo-Gtk.c:4372
+#: driver/demo-Gtk.c:4379
 #, c-format
 msgid "%s: unknown option: %s\n"
 msgstr ""
 
 #, c-format
 msgid "%s: unknown option: %s\n"
 msgstr ""
 
-#: driver/demo-Gtk.c:4436
+#: driver/demo-Gtk.c:4443
 #, fuzzy
 msgid "Screensaver Preferences"
 msgstr "Protector de pantalla"
 #, fuzzy
 msgid "Screensaver Preferences"
 msgstr "Protector de pantalla"
@@ -944,22 +944,23 @@ msgstr ""
 #: 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/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:5 hacks/config/flyingtoasters.xml.h:5
-#: hacks/config/fontglide.xml.h:4 hacks/config/forest.xml.h:1
-#: hacks/config/fuzzyflakes.xml.h:7 hacks/config/galaxy.xml.h:3
-#: hacks/config/gears.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:6
-#: 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/fadeplot.xml.h:4 hacks/config/fireworkx.xml.h:3
+#: 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:2 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/fuzzyflakes.xml.h:7
+#: hacks/config/galaxy.xml.h:3 hacks/config/gears.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:6 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/intermomentary.xml.h:1 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/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
@@ -977,23 +978,24 @@ msgstr ""
 #: hacks/config/pacman.xml.h:1 hacks/config/penetrate.xml.h:3
 #: hacks/config/penrose.xml.h:6 hacks/config/petri.xml.h:5
 #: hacks/config/phosphor.xml.h:4 hacks/config/piecewise.xml.h:4
 #: hacks/config/pacman.xml.h:1 hacks/config/penetrate.xml.h:3
 #: hacks/config/penrose.xml.h:6 hacks/config/petri.xml.h:5
 #: hacks/config/phosphor.xml.h:4 hacks/config/piecewise.xml.h:4
-#: hacks/config/pipes.xml.h:5 hacks/config/polyhedra.xml.h:18
-#: hacks/config/polyominoes.xml.h:2 hacks/config/polytopes.xml.h:11
-#: hacks/config/pong.xml.h:1 hacks/config/popsquares.xml.h:3
-#: hacks/config/providence.xml.h:2 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 hacks/config/rocks.xml.h:4
-#: hacks/config/rotor.xml.h:3 hacks/config/rubik.xml.h:3
-#: hacks/config/sballs.xml.h:4 hacks/config/shadebobs.xml.h:3
-#: hacks/config/sierpinski.xml.h:2 hacks/config/sierpinski3d.xml.h:2
-#: hacks/config/slidescreen.xml.h:2 hacks/config/slip.xml.h:2
-#: hacks/config/speedmine.xml.h:3 hacks/config/sphere.xml.h:2
-#: hacks/config/spheremonics.xml.h:5 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:1 hacks/config/superquadrics.xml.h:4
+#: hacks/config/pinion.xml.h:5 hacks/config/pipes.xml.h:5
+#: hacks/config/polyhedra.xml.h:18 hacks/config/polyominoes.xml.h:2
+#: hacks/config/polytopes.xml.h:11 hacks/config/pong.xml.h:1
+#: hacks/config/popsquares.xml.h:3 hacks/config/providence.xml.h:2
+#: 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
+#: hacks/config/rocks.xml.h:4 hacks/config/rotor.xml.h:3
+#: hacks/config/rubik.xml.h:3 hacks/config/sballs.xml.h:4
+#: hacks/config/shadebobs.xml.h:3 hacks/config/sierpinski.xml.h:2
+#: hacks/config/sierpinski3d.xml.h:2 hacks/config/slidescreen.xml.h:2
+#: hacks/config/slip.xml.h:2 hacks/config/speedmine.xml.h:3
+#: hacks/config/sphere.xml.h:2 hacks/config/spheremonics.xml.h:5
+#: 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:1
+#: hacks/config/substrate.xml.h:2 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/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
@@ -1015,8 +1017,9 @@ msgstr ""
 #: hacks/config/fuzzyflakes.xml.h:8 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/fuzzyflakes.xml.h:8 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/wormhole.xml.h:3 hacks/config/xfishtank.xml.h:4
+#: hacks/config/substrate.xml.h:3 hacks/config/thornbird.xml.h:3
+#: hacks/config/whirlwindwarp.xml.h:1 hacks/config/wormhole.xml.h:3
+#: hacks/config/xfishtank.xml.h:4
 msgid "Few"
 msgstr ""
 
 msgid "Few"
 msgstr ""
 
@@ -1032,7 +1035,7 @@ msgstr ""
 #: hacks/config/epicycle.xml.h:8 hacks/config/eruption.xml.h:12
 #: hacks/config/euler2d.xml.h:8 hacks/config/fadeplot.xml.h:6
 #: hacks/config/flag.xml.h:5 hacks/config/flame.xml.h:11
 #: hacks/config/epicycle.xml.h:8 hacks/config/eruption.xml.h:12
 #: hacks/config/euler2d.xml.h:8 hacks/config/fadeplot.xml.h:6
 #: hacks/config/flag.xml.h:5 hacks/config/flame.xml.h:11
-#: hacks/config/flow.xml.h:8 hacks/config/fluidballs.xml.h:13
+#: hacks/config/flow.xml.h:7 hacks/config/fluidballs.xml.h:13
 #: hacks/config/forest.xml.h:3 hacks/config/fuzzyflakes.xml.h:12
 #: 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/forest.xml.h:3 hacks/config/fuzzyflakes.xml.h:12
 #: hacks/config/galaxy.xml.h:6 hacks/config/grav.xml.h:4
 #: hacks/config/halo.xml.h:4 hacks/config/hopalong.xml.h:15
@@ -1070,7 +1073,7 @@ msgstr ""
 #: 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/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/flow.xml.h:8 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/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
@@ -1124,22 +1127,23 @@ msgstr ""
 #: 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/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/flyingtoasters.xml.h:11
-#: hacks/config/fontglide.xml.h:13 hacks/config/forest.xml.h:5
-#: hacks/config/fuzzyflakes.xml.h:15 hacks/config/galaxy.xml.h:10
-#: hacks/config/gears.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:8 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:10 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/fadeplot.xml.h:8 hacks/config/fireworkx.xml.h:9
+#: 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:10 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/fuzzyflakes.xml.h:15
+#: hacks/config/galaxy.xml.h:11 hacks/config/gears.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:8
+#: 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:10
+#: 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/intermomentary.xml.h:4 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/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
@@ -1157,23 +1161,24 @@ msgstr ""
 #: hacks/config/pacman.xml.h:5 hacks/config/penetrate.xml.h:6
 #: hacks/config/penrose.xml.h:11 hacks/config/petri.xml.h:23
 #: hacks/config/phosphor.xml.h:7 hacks/config/piecewise.xml.h:9
 #: hacks/config/pacman.xml.h:5 hacks/config/penetrate.xml.h:6
 #: hacks/config/penrose.xml.h:11 hacks/config/petri.xml.h:23
 #: hacks/config/phosphor.xml.h:7 hacks/config/piecewise.xml.h:9
-#: hacks/config/pipes.xml.h:15 hacks/config/polyhedra.xml.h:119
-#: hacks/config/polyominoes.xml.h:10 hacks/config/polytopes.xml.h:20
-#: hacks/config/pong.xml.h:4 hacks/config/popsquares.xml.h:5
-#: hacks/config/providence.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 hacks/config/rocks.xml.h:9
-#: hacks/config/rotor.xml.h:11 hacks/config/rubik.xml.h:9
-#: hacks/config/sballs.xml.h:13 hacks/config/shadebobs.xml.h:9
-#: hacks/config/sierpinski.xml.h:7 hacks/config/sierpinski3d.xml.h:8
-#: hacks/config/slidescreen.xml.h:6 hacks/config/slip.xml.h:7
-#: hacks/config/speedmine.xml.h:13 hacks/config/sphere.xml.h:5
-#: hacks/config/spheremonics.xml.h:19 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:4 hacks/config/superquadrics.xml.h:8
+#: hacks/config/pinion.xml.h:13 hacks/config/pipes.xml.h:15
+#: hacks/config/polyhedra.xml.h:119 hacks/config/polyominoes.xml.h:10
+#: hacks/config/polytopes.xml.h:20 hacks/config/pong.xml.h:4
+#: hacks/config/popsquares.xml.h:5 hacks/config/providence.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
+#: hacks/config/rocks.xml.h:9 hacks/config/rotor.xml.h:11
+#: hacks/config/rubik.xml.h:9 hacks/config/sballs.xml.h:13
+#: hacks/config/shadebobs.xml.h:9 hacks/config/sierpinski.xml.h:7
+#: hacks/config/sierpinski3d.xml.h:8 hacks/config/slidescreen.xml.h:6
+#: hacks/config/slip.xml.h:7 hacks/config/speedmine.xml.h:13
+#: hacks/config/sphere.xml.h:5 hacks/config/spheremonics.xml.h:19
+#: 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:4
+#: hacks/config/substrate.xml.h:10 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/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
@@ -1206,17 +1211,18 @@ msgstr ""
 #: hacks/config/engine.xml.h:16 hacks/config/epicycle.xml.h:11
 #: 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/engine.xml.h:16 hacks/config/epicycle.xml.h:11
 #: 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/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/fuzzyflakes.xml.h:17
-#: hacks/config/galaxy.xml.h:11 hacks/config/glblur.xml.h:17
-#: hacks/config/glforestfire.xml.h:15 hacks/config/glplanet.xml.h:10
-#: 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:11 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/fireworkx.xml.h:11 hacks/config/flag.xml.h:9
+#: hacks/config/flame.xml.h:15 hacks/config/flipflop.xml.h:7
+#: hacks/config/flipscreen3d.xml.h:7 hacks/config/flow.xml.h:12
+#: hacks/config/fluidballs.xml.h:20 hacks/config/forest.xml.h:6
+#: hacks/config/fuzzyflakes.xml.h:17 hacks/config/galaxy.xml.h:12
+#: hacks/config/glblur.xml.h:17 hacks/config/glforestfire.xml.h:15
+#: hacks/config/glplanet.xml.h:10 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:11
+#: 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/intermomentary.xml.h:5 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/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
@@ -1245,16 +1251,16 @@ msgstr ""
 #: 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/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/xplanet.xml.h:60 hacks/config/xrayswarm.xml.h:4
-#: hacks/config/zoom.xml.h:7
+#: hacks/config/strange.xml.h:5 hacks/config/substrate.xml.h:11
+#: 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/xplanet.xml.h:60
+#: hacks/config/xrayswarm.xml.h:4 hacks/config/zoom.xml.h:7
 msgid "Speed"
 msgstr ""
 
 msgid "Speed"
 msgstr ""
 
@@ -1297,8 +1303,8 @@ msgstr ""
 #: hacks/config/discrete.xml.h:11 hacks/config/drift.xml.h:14
 #: hacks/config/epicycle.xml.h:13 hacks/config/euler2d.xml.h:17
 #: hacks/config/fadeplot.xml.h:12 hacks/config/flag.xml.h:13
 #: hacks/config/discrete.xml.h:11 hacks/config/drift.xml.h:14
 #: hacks/config/epicycle.xml.h:13 hacks/config/euler2d.xml.h:17
 #: hacks/config/fadeplot.xml.h:12 hacks/config/flag.xml.h:13
-#: hacks/config/flame.xml.h:16 hacks/config/flow.xml.h:18
-#: hacks/config/forest.xml.h:8 hacks/config/galaxy.xml.h:13
+#: hacks/config/flame.xml.h:16 hacks/config/flow.xml.h:15
+#: hacks/config/forest.xml.h:8 hacks/config/galaxy.xml.h:14
 #: hacks/config/grav.xml.h:11 hacks/config/halo.xml.h:13
 #: hacks/config/hopalong.xml.h:25 hacks/config/ifs.xml.h:8
 #: hacks/config/imsmap.xml.h:15 hacks/config/interference.xml.h:19
 #: hacks/config/grav.xml.h:11 hacks/config/halo.xml.h:13
 #: hacks/config/hopalong.xml.h:25 hacks/config/ifs.xml.h:8
 #: hacks/config/imsmap.xml.h:15 hacks/config/interference.xml.h:19
@@ -1395,7 +1401,7 @@ msgstr ""
 #: 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/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/flag.xml.h:4 hacks/config/flow.xml.h:4
 #: hacks/config/fluidballs.xml.h:12 hacks/config/fuzzyflakes.xml.h:10
 #: 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/fluidballs.xml.h:12 hacks/config/fuzzyflakes.xml.h:10
 #: hacks/config/gleidescope.xml.h:7 hacks/config/halftone.xml.h:8
 #: hacks/config/hopalong.xml.h:13 hacks/config/interference.xml.h:11
@@ -1427,7 +1433,7 @@ msgstr ""
 #: 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/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/flag.xml.h:8 hacks/config/flow.xml.h:11
 #: hacks/config/fluidballs.xml.h:19 hacks/config/fuzzyflakes.xml.h:16
 #: 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/fluidballs.xml.h:19 hacks/config/fuzzyflakes.xml.h:16
 #: hacks/config/gleidescope.xml.h:12 hacks/config/halftone.xml.h:14
 #: hacks/config/hopalong.xml.h:22 hacks/config/interference.xml.h:18
@@ -1446,7 +1452,7 @@ msgstr ""
 
 #: 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/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/flag.xml.h:12 hacks/config/flow.xml.h:14
 #: hacks/config/lissie.xml.h:12 hacks/config/loop.xml.h:11
 #: hacks/config/rubik.xml.h:12 hacks/config/sierpinski.xml.h:11
 #: hacks/config/slip.xml.h:11
 #: hacks/config/lissie.xml.h:12 hacks/config/loop.xml.h:11
 #: hacks/config/rubik.xml.h:12 hacks/config/sierpinski.xml.h:11
 #: hacks/config/slip.xml.h:11
@@ -1496,13 +1502,14 @@ msgstr ""
 #: hacks/config/menger.xml.h:15 hacks/config/mirrorblob.xml.h:18
 #: hacks/config/moebius.xml.h:6 hacks/config/molecule.xml.h:21
 #: hacks/config/morph3d.xml.h:5 hacks/config/noof.xml.h:4
 #: hacks/config/menger.xml.h:15 hacks/config/mirrorblob.xml.h:18
 #: hacks/config/moebius.xml.h:6 hacks/config/molecule.xml.h:21
 #: hacks/config/morph3d.xml.h:5 hacks/config/noof.xml.h:4
-#: hacks/config/pipes.xml.h:14 hacks/config/polyhedra.xml.h:118
-#: hacks/config/polytopes.xml.h:18 hacks/config/providence.xml.h:4
-#: 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
+#: hacks/config/pinion.xml.h:12 hacks/config/pipes.xml.h:14
+#: hacks/config/polyhedra.xml.h:118 hacks/config/polytopes.xml.h:18
+#: hacks/config/providence.xml.h:4 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 ""
 
 msgid "Show Frames-per-Second"
 msgstr ""
 
@@ -1661,11 +1668,12 @@ msgstr ""
 #: hacks/config/lament.xml.h:9 hacks/config/lavalite.xml.h:32
 #: hacks/config/menger.xml.h:21 hacks/config/mirrorblob.xml.h:24
 #: hacks/config/moebius.xml.h:11 hacks/config/molecule.xml.h:26
 #: hacks/config/lament.xml.h:9 hacks/config/lavalite.xml.h:32
 #: hacks/config/menger.xml.h:21 hacks/config/mirrorblob.xml.h:24
 #: hacks/config/moebius.xml.h:11 hacks/config/molecule.xml.h:26
-#: hacks/config/polyhedra.xml.h:173 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
+#: hacks/config/pinion.xml.h:15 hacks/config/polyhedra.xml.h:173
+#: 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 ""
 
 msgid "Wireframe"
 msgstr ""
 
@@ -1753,14 +1761,15 @@ msgstr ""
 #: 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/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/mismunch.xml.h:3
-#: 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 hacks/config/spheremonics.xml.h:7
+#: hacks/config/flow.xml.h:6 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/mismunch.xml.h:3 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
+#: hacks/config/spheremonics.xml.h:7 hacks/config/substrate.xml.h:6
 #: hacks/config/wander.xml.h:10 hacks/config/whirlwindwarp.xml.h:3
 msgid "Long"
 msgstr ""
 #: hacks/config/wander.xml.h:10 hacks/config/whirlwindwarp.xml.h:3
 msgid "Long"
 msgstr ""
@@ -1807,13 +1816,14 @@ msgstr ""
 #: 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/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/metaballs.xml.h:12 hacks/config/mismunch.xml.h:8
-#: 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/flow.xml.h:9 hacks/config/galaxy.xml.h:9
+#: hacks/config/klein.xml.h:5 hacks/config/laser.xml.h:9
+#: hacks/config/menger.xml.h:14 hacks/config/metaballs.xml.h:12
+#: hacks/config/mismunch.xml.h:8 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/substrate.xml.h:9
 #: hacks/config/wander.xml.h:12 hacks/config/whirlwindwarp.xml.h:6
 msgid "Short"
 msgstr ""
 #: hacks/config/wander.xml.h:12 hacks/config/whirlwindwarp.xml.h:6
 msgid "Short"
 msgstr ""
@@ -2010,10 +2020,10 @@ msgstr ""
 #: 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/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/polyhedra.xml.h:3 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/wormhole.xml.h:1
-#: hacks/config/xfishtank.xml.h:1
+#: hacks/config/pinion.xml.h:3 hacks/config/polyhedra.xml.h:3
+#: 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/wormhole.xml.h:1 hacks/config/xfishtank.xml.h:1
 msgid "Animation Speed"
 msgstr ""
 
 msgid "Animation Speed"
 msgstr ""
 
@@ -2088,8 +2098,9 @@ msgstr ""
 #: 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/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/starfish.xml.h:2 hacks/config/substrate.xml.h:1
+#: hacks/config/vidwhacker.xml.h:3 hacks/config/wander.xml.h:7
+#: hacks/config/xspirograph.xml.h:3
 msgid "Duration"
 msgstr ""
 
 msgid "Duration"
 msgstr ""
 
@@ -2336,7 +2347,7 @@ msgstr ""
 msgid "Rotate"
 msgstr ""
 
 msgid "Rotate"
 msgstr ""
 
-#: hacks/config/circuit.xml.h:8
+#: hacks/config/circuit.xml.h:8 hacks/config/pinion.xml.h:10
 msgid "Rotation Speed"
 msgstr ""
 
 msgid "Rotation Speed"
 msgstr ""
 
@@ -2419,11 +2430,12 @@ msgstr ""
 msgid "Coral"
 msgstr ""
 
 msgid "Coral"
 msgstr ""
 
-#: hacks/config/coral.xml.h:4 hacks/config/gflux.xml.h:3
-#: hacks/config/glblur.xml.h:2 hacks/config/glmatrix.xml.h:3
-#: 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
+#: hacks/config/coral.xml.h:4 hacks/config/fireworkx.xml.h:2
+#: hacks/config/gflux.xml.h:3 hacks/config/glblur.xml.h:2
+#: hacks/config/glmatrix.xml.h:3 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
 msgid "Dense"
 msgstr ""
 
 msgid "Dense"
 msgstr ""
 
@@ -2436,12 +2448,12 @@ msgid ""
 "Simulates coral growth, albeit somewhat slowly. Written by Frederick Roeber."
 msgstr ""
 
 "Simulates coral growth, albeit somewhat slowly. Written by Frederick Roeber."
 msgstr ""
 
-#: hacks/config/coral.xml.h:13 hacks/config/gflux.xml.h:13
-#: hacks/config/glblur.xml.h:16 hacks/config/glmatrix.xml.h:19
-#: hacks/config/imsmap.xml.h:13 hacks/config/lavalite.xml.h:29
-#: hacks/config/pyro.xml.h:14 hacks/config/qix.xml.h:21
-#: hacks/config/squiral.xml.h:15 hacks/config/xearth.xml.h:24
-#: hacks/config/xmatrix.xml.h:17
+#: hacks/config/coral.xml.h:13 hacks/config/fireworkx.xml.h:10
+#: hacks/config/gflux.xml.h:13 hacks/config/glblur.xml.h:16
+#: hacks/config/glmatrix.xml.h:19 hacks/config/imsmap.xml.h:13
+#: hacks/config/lavalite.xml.h:29 hacks/config/pyro.xml.h:14
+#: hacks/config/qix.xml.h:21 hacks/config/squiral.xml.h:15
+#: hacks/config/xearth.xml.h:24 hacks/config/xmatrix.xml.h:17
 msgid "Sparse"
 msgstr ""
 
 msgid "Sparse"
 msgstr ""
 
@@ -2470,7 +2482,7 @@ msgid "Center on Screen"
 msgstr ""
 
 #: hacks/config/crystal.xml.h:2 hacks/config/deluxe.xml.h:1
 msgstr ""
 
 #: hacks/config/crystal.xml.h:2 hacks/config/deluxe.xml.h:1
-#: hacks/config/fadeplot.xml.h:1 hacks/config/flow.xml.h:3
+#: hacks/config/fadeplot.xml.h:1 hacks/config/flow.xml.h:1
 #: hacks/config/galaxy.xml.h:1 hacks/config/glforestfire.xml.h:1
 #: hacks/config/grav.xml.h:1 hacks/config/julia.xml.h:1
 #: hacks/config/laser.xml.h:1 hacks/config/lisa.xml.h:1
 #: hacks/config/galaxy.xml.h:1 hacks/config/glforestfire.xml.h:1
 #: hacks/config/grav.xml.h:1 hacks/config/julia.xml.h:1
 #: hacks/config/laser.xml.h:1 hacks/config/lisa.xml.h:1
@@ -3212,7 +3224,7 @@ msgstr ""
 msgid "Half"
 msgstr ""
 
 msgid "Half"
 msgstr ""
 
-#: hacks/config/fireflies.xml.h:17
+#: hacks/config/fireflies.xml.h:17 hacks/config/pinion.xml.h:7
 msgid "Huge"
 msgstr ""
 
 msgid "Huge"
 msgstr ""
 
@@ -3301,7 +3313,7 @@ msgstr ""
 msgid "Swarm tails glow"
 msgstr ""
 
 msgid "Swarm tails glow"
 msgstr ""
 
-#: hacks/config/fireflies.xml.h:43
+#: hacks/config/fireflies.xml.h:43 hacks/config/pinion.xml.h:14
 msgid "Tiny"
 msgstr ""
 
 msgid "Tiny"
 msgstr ""
 
@@ -3317,6 +3329,30 @@ msgstr ""
 msgid "Wind picks up"
 msgstr ""
 
 msgid "Wind picks up"
 msgstr ""
 
+#: hacks/config/fireworkx.xml.h:1 hacks/config/lavalite.xml.h:3
+msgid "Activity"
+msgstr ""
+
+#: hacks/config/fireworkx.xml.h:4
+msgid "Fast Fade (more realistic)"
+msgstr ""
+
+#: hacks/config/fireworkx.xml.h:5
+msgid "Fireworkx"
+msgstr ""
+
+#: hacks/config/fireworkx.xml.h:6
+msgid "Light effect"
+msgstr ""
+
+#: hacks/config/fireworkx.xml.h:7
+msgid "Pyrotechnics simulation eye-candy. Written by Rony B. Chandran."
+msgstr ""
+
+#: hacks/config/fireworkx.xml.h:8
+msgid "Shoot"
+msgstr ""
+
 #: hacks/config/flag.xml.h:1
 msgid "Bitmap for Flag"
 msgstr ""
 #: hacks/config/flag.xml.h:1
 msgid "Bitmap for Flag"
 msgstr ""
@@ -3390,42 +3426,42 @@ msgid ""
 "around and deforms it in various ways. Written by Ben Buxton."
 msgstr ""
 
 "around and deforms it in various ways. Written by Ben Buxton."
 msgstr ""
 
-#: hacks/config/flow.xml.h:1
-msgid "Allow 2D Attractors"
+#: hacks/config/flow.xml.h:3
+msgid "Flow"
 msgstr ""
 
 msgstr ""
 
-#: hacks/config/flow.xml.h:2
-msgid ""
-"Another series of strange attractors: a flowing series of points, making "
-"strange rotational shapes. Written by Tim Auckland."
+#: hacks/config/flow.xml.h:5
+msgid "Length of trails"
 msgstr ""
 
 msgstr ""
 
-#: hacks/config/flow.xml.h:5
-msgid "Flow"
+#: hacks/config/flow.xml.h:13
+msgid ""
+"Strange attractors formed of flows in a 3D differential equation phase "
+"space. Written by Tim Auckland."
 msgstr ""
 
 msgstr ""
 
-#: hacks/config/flow.xml.h:6
-msgid "Freeze Some Bees"
+#: hacks/config/flow.xml.h:16
+msgid "turn on/off bounding box."
 msgstr ""
 
 msgstr ""
 
-#: hacks/config/flow.xml.h:10
-msgid "Ride a Trained Bee"
+#: hacks/config/flow.xml.h:17
+msgid "turn on/off double buffering."
 msgstr ""
 
 msgstr ""
 
-#: hacks/config/flow.xml.h:11
-msgid "Rotate Around Attractor"
+#: hacks/config/flow.xml.h:18
+msgid "turn on/off periodic attractors."
 msgstr ""
 
 msgstr ""
 
-#: hacks/config/flow.xml.h:12
-msgid "Show Bounding Box"
+#: hacks/config/flow.xml.h:19
+msgid "turn on/off ride in the flow."
 msgstr ""
 
 msgstr ""
 
-#: hacks/config/flow.xml.h:14
-msgid "Slow Bees with Antifreeze"
+#: hacks/config/flow.xml.h:20
+msgid "turn on/off rotating around attractor."
 msgstr ""
 
 msgstr ""
 
-#: hacks/config/flow.xml.h:19
-msgid "Zoom In and Out"
+#: hacks/config/flow.xml.h:21
+msgid "turn on/off search for new attractors."
 msgstr ""
 
 #: hacks/config/fluidballs.xml.h:1
 msgstr ""
 
 #: hacks/config/fluidballs.xml.h:1
@@ -3630,7 +3666,11 @@ msgstr ""
 msgid "Galaxy"
 msgstr ""
 
 msgid "Galaxy"
 msgstr ""
 
-#: hacks/config/galaxy.xml.h:9 hacks/config/lisa.xml.h:7
+#: hacks/config/galaxy.xml.h:8
+msgid "Rotate Viewpoint"
+msgstr ""
+
+#: hacks/config/galaxy.xml.h:10 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/pong.xml.h:3
 #: hacks/config/rotor.xml.h:10 hacks/config/rubik.xml.h:8
 #: hacks/config/lissie.xml.h:8 hacks/config/loop.xml.h:6
 #: hacks/config/penrose.xml.h:10 hacks/config/pong.xml.h:3
 #: hacks/config/rotor.xml.h:10 hacks/config/rubik.xml.h:8
@@ -3639,7 +3679,7 @@ msgstr ""
 msgid "Size"
 msgstr ""
 
 msgid "Size"
 msgstr ""
 
-#: hacks/config/galaxy.xml.h:12
+#: hacks/config/galaxy.xml.h:13
 msgid ""
 "This draws spinning galaxies, which then collide and scatter their stars to "
 "the, uh, four winds or something. Originally an Amiga program by Uli "
 msgid ""
 "This draws spinning galaxies, which then collide and scatter their stars to "
 "the, uh, four winds or something. Originally an Amiga program by Uli "
@@ -3938,9 +3978,9 @@ msgid ""
 "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 "
 "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."
+"of this window: the tab at the top of the *other* window.) 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
 msgstr ""
 
 #: hacks/config/glslideshow.xml.h:17
@@ -4457,6 +4497,26 @@ msgstr ""
 msgid "Wave Size"
 msgstr ""
 
 msgid "Wave Size"
 msgstr ""
 
+#: hacks/config/intermomentary.xml.h:2
+msgid "Intermomentary"
+msgstr ""
+
+#: hacks/config/intermomentary.xml.h:3
+msgid "Number of Discs"
+msgstr ""
+
+#: hacks/config/intermomentary.xml.h:6
+msgid ""
+"The Intersection Momentary is a fun visualization defining the relationships "
+"between objects with Casey Reas, William Ngan, and Robert Hodgin. "
+"Commissioned for display at the Whitney Museum of American Art. A surface "
+"filled with 100 medium to small sized circles. Each circle has a different "
+"size and direction, but moves at the same slow rate. Display: A. The "
+"instantaneous intersections of the circles. B. The aggregate intersections "
+"of the circles. Ported to XScreensaver from the art project \"InterMomentary"
+"\" at http://www.complexification.net"
+msgstr ""
+
 #: hacks/config/jigglypuff.xml.h:2
 msgid "Chrome"
 msgstr ""
 #: hacks/config/jigglypuff.xml.h:2
 msgid "Chrome"
 msgstr ""
@@ -4675,10 +4735,6 @@ msgstr ""
 msgid "10"
 msgstr ""
 
 msgid "10"
 msgstr ""
 
-#: hacks/config/lavalite.xml.h:3
-msgid "Activity"
-msgstr ""
-
 #: hacks/config/lavalite.xml.h:4
 msgid "Classic Lavalite"
 msgstr ""
 #: hacks/config/lavalite.xml.h:4
 msgid "Classic Lavalite"
 msgstr ""
@@ -5391,6 +5447,36 @@ msgid ""
 "invisibility at intersection points. Written by Geoffrey Irving."
 msgstr ""
 
 "invisibility at intersection points. Written by Geoffrey Irving."
 msgstr ""
 
+#: hacks/config/pinion.xml.h:1
+msgid "100"
+msgstr ""
+
+#: hacks/config/pinion.xml.h:2
+msgid "2000"
+msgstr ""
+
+#: hacks/config/pinion.xml.h:4
+msgid ""
+"Draws an interconnected set of gears moving across the screen. Written by "
+"Jamie Zawinski."
+msgstr ""
+
+#: hacks/config/pinion.xml.h:6
+msgid "Gear Size"
+msgstr ""
+
+#: hacks/config/pinion.xml.h:8
+msgid "Max RPM"
+msgstr ""
+
+#: hacks/config/pinion.xml.h:9
+msgid "Pinion"
+msgstr ""
+
+#: hacks/config/pinion.xml.h:11
+msgid "Scrolling Speed"
+msgstr ""
+
 #: hacks/config/pipes.xml.h:1
 msgid "Allow Tight Turns"
 msgstr ""
 #: hacks/config/pipes.xml.h:1
 msgid "Allow Tight Turns"
 msgstr ""
@@ -5417,7 +5503,8 @@ msgid ""
 "probably seen this GL hack. This version is by Marcelo Vianna."
 msgstr ""
 
 "probably seen this GL hack. This version is by Marcelo Vianna."
 msgstr ""
 
-#: hacks/config/pipes.xml.h:9 hacks/config/wormhole.xml.h:4
+#: hacks/config/pipes.xml.h:9 hacks/config/substrate.xml.h:7
+#: hacks/config/wormhole.xml.h:4
 msgid "Lots"
 msgstr ""
 
 msgid "Lots"
 msgstr ""
 
@@ -6621,22 +6708,26 @@ msgid "Ping subnet/30 (2 hosts)"
 msgstr ""
 
 #: hacks/config/sonar.xml.h:10
 msgstr ""
 
 #: hacks/config/sonar.xml.h:10
-msgid "Simulation Team Members"
+msgid "Resolve Host Names"
 msgstr ""
 
 #: hacks/config/sonar.xml.h:11
 msgstr ""
 
 #: hacks/config/sonar.xml.h:11
-msgid "Sonar"
+msgid "Simulation Team Members"
 msgstr ""
 
 #: hacks/config/sonar.xml.h:12
 msgstr ""
 
 #: hacks/config/sonar.xml.h:12
-msgid "Team A Name"
+msgid "Sonar"
 msgstr ""
 
 #: hacks/config/sonar.xml.h:13
 msgstr ""
 
 #: hacks/config/sonar.xml.h:13
-msgid "Team B Name"
+msgid "Team A Name"
 msgstr ""
 
 #: hacks/config/sonar.xml.h:14
 msgstr ""
 
 #: hacks/config/sonar.xml.h:14
+msgid "Team B Name"
+msgstr ""
+
+#: hacks/config/sonar.xml.h:15
 msgid ""
 "This program draws a simulation of a sonar screen. By default, it displays a "
 "random assortment of ``bogies'' on the screen, but if installed as \"setuid "
 msgid ""
 "This program draws a simulation of a sonar screen. By default, it displays a "
 "random assortment of ``bogies'' on the screen, but if installed as \"setuid "
@@ -6645,7 +6736,7 @@ msgid ""
 "Martin and Jamie Zawinski."
 msgstr ""
 
 "Martin and Jamie Zawinski."
 msgstr ""
 
-#: hacks/config/sonar.xml.h:15
+#: hacks/config/sonar.xml.h:16
 msgid "vs."
 msgstr ""
 
 msgid "vs."
 msgstr ""
 
@@ -6918,6 +7009,29 @@ msgid ""
 "Written by Massimino Pascal."
 msgstr ""
 
 "Written by Massimino Pascal."
 msgstr ""
 
+#: hacks/config/substrate.xml.h:4
+msgid "Initial Cracks"
+msgstr ""
+
+#: hacks/config/substrate.xml.h:5
+msgid ""
+"Lines like crystals grow on a computational substrate. A simple "
+"perpendicular growth rule creates intricate city-like structures. By J. "
+"Tarbell and Mike Kershaw."
+msgstr ""
+
+#: hacks/config/substrate.xml.h:8
+msgid "Sandgrains"
+msgstr ""
+
+#: hacks/config/substrate.xml.h:12
+msgid "Substrate"
+msgstr ""
+
+#: hacks/config/substrate.xml.h:13
+msgid "Wireframe only"
+msgstr ""
+
 #: hacks/config/superquadrics.xml.h:3
 msgid ""
 "Ed Mackey reports that he wrote the first version of this program in BASIC "
 #: hacks/config/superquadrics.xml.h:3
 msgid ""
 "Ed Mackey reports that he wrote the first version of this program in BASIC "
index 31535500655049012687bea14fee312598156d82..dd133463b895fa78f5e8db4e47599cd4b2ba2ab5 100644 (file)
--- a/po/da.po
+++ b/po/da.po
@@ -1,13 +1,15 @@
 # Danish translation of xscreensaver.
 # Danish translation of xscreensaver.
-# Copyright (C) 2002 Free Software Foundation, Inc.
+# Copyright (C) 2002, 05 Free Software Foundation, Inc.
 # Ole Laursen <olau@hardworking.dk>, 2002.
 # Ole Laursen <olau@hardworking.dk>, 2002.
+# Martin Willemoes Hansen <mwh@sysrq.dk>, 2005.
 #
 # Konventioner:
 #
 #
 # Konventioner:
 #
-#   GL -> 3d
-#   hack -> pauseskærm
+#   GL                 -> 3d
+#   hack               -> pauseskærm
 #   number of x to use -> antal x
 #   number of x to use -> antal x
-#   wireframe -> rammemodel
+#   solid              -> ensfarvede
+#   wireframe          -> rammemodel
 #
 # Punktummerne efter pauseskærmsteksterne er strøget fordi de passer
 # dårligt ind. Navnene på pauseskærmene oversættes frit på baggrund af
 #
 # Punktummerne efter pauseskærmsteksterne er strøget fordi de passer
 # dårligt ind. Navnene på pauseskærmene oversættes frit på baggrund af
@@ -19,9 +21,9 @@ msgid ""
 msgstr ""
 "Project-Id-Version: xscreensaver\n"
 "Report-Msgid-Bugs-To: \n"
 msgstr ""
 "Project-Id-Version: xscreensaver\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2004-10-04 16:25+0200\n"
-"PO-Revision-Date: 2002-08-29 23:33+0200\n"
-"Last-Translator: Ole Laursen <olau@hardworking.dk>\n"
+"POT-Creation-Date: 2005-02-02 15:44+0100\n"
+"PO-Revision-Date: 2005-02-02 15:43+0100\n"
+"Last-Translator: Martin Willemoes Hansen <mwh@sysrq.dk>\n"
 "Language-Team: Danish <dansk@klid.dk>\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Language-Team: Danish <dansk@klid.dk>\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -48,7 +50,7 @@ msgstr "Fejl ved indlæsning af billedfil: %s"
 #: driver/demo-Gtk-support.c:182
 #, c-format
 msgid "reason: %s\n"
 #: driver/demo-Gtk-support.c:182
 #, c-format
 msgid "reason: %s\n"
-msgstr ""
+msgstr "begrundelse: %s\n"
 
 #: driver/demo-Gtk-widgets.c:161 driver/xscreensaver-demo.glade.h:89
 #: driver/xscreensaver-demo.glade2.h:65
 
 #: driver/demo-Gtk-widgets.c:161 driver/xscreensaver-demo.glade.h:89
 #: driver/xscreensaver-demo.glade2.h:65
@@ -68,7 +70,7 @@ msgstr "_Start pauseskærm nu"
 msgid ""
 "Activate the XScreenSaver daemon now (locking the screen if so configured.)"
 msgstr ""
 msgid ""
 "Activate the XScreenSaver daemon now (locking the screen if so configured.)"
 msgstr ""
-"Aktivér pauseskærmsdæmonen nu (og låser skærmen hvis den er sat op til det)"
+"Aktivér pauseskærmsserveren nu (og låser skærmen hvis den er sat op til det)"
 
 #: driver/demo-Gtk-widgets.c:215 driver/xscreensaver-demo.glade.h:97
 #: driver/xscreensaver-demo.glade2.h:80
 
 #: driver/demo-Gtk-widgets.c:215 driver/xscreensaver-demo.glade.h:97
 #: driver/xscreensaver-demo.glade2.h:80
@@ -95,7 +97,7 @@ msgstr "_Genstart dæmon"
 
 #: driver/demo-Gtk-widgets.c:250 driver/xscreensaver-demo.glade.h:49
 msgid "Kill and re-launch the XScreenSaver daemon."
 
 #: driver/demo-Gtk-widgets.c:250 driver/xscreensaver-demo.glade.h:49
 msgid "Kill and re-launch the XScreenSaver daemon."
-msgstr "Dræb og genstart pauseskærmsdæmonen"
+msgstr "Dræb og genstart pauseskærmsserveren"
 
 #: driver/demo-Gtk-widgets.c:263 driver/xscreensaver-demo.glade.h:95
 msgid "_Exit"
 
 #: driver/demo-Gtk-widgets.c:263 driver/xscreensaver-demo.glade.h:95
 msgid "_Exit"
@@ -106,7 +108,7 @@ msgid ""
 "Exit the xscreensaver-demo program (but leave the XScreenSaver daemon "
 "running in the background.)"
 msgstr ""
 "Exit the xscreensaver-demo program (but leave the XScreenSaver daemon "
 "running in the background.)"
 msgstr ""
-"Afslut demonstrationsprogrammet (men lad pauseskærmsdæmonen køre i "
+"Afslut demonstrationsprogrammet (men lad pauseskærmsserveren køre i "
 "baggrunden)"
 
 #: driver/demo-Gtk-widgets.c:276 driver/xscreensaver-demo.glade2.h:77
 "baggrunden)"
 
 #: driver/demo-Gtk-widgets.c:276 driver/xscreensaver-demo.glade2.h:77
@@ -161,7 +163,7 @@ msgstr "Tidsrum før skærmen bliver helt sort"
 msgid "minutes"
 msgstr "minutter"
 
 msgid "minutes"
 msgstr "minutter"
 
-#: driver/demo-Gtk-widgets.c:482 driver/demo-Gtk.c:2845
+#: driver/demo-Gtk-widgets.c:482 driver/demo-Gtk.c:2852
 #: driver/xscreensaver-demo.glade.h:58
 msgid "Preview"
 msgstr "Eksempel"
 #: driver/xscreensaver-demo.glade.h:58
 msgid "Preview"
 msgstr "Eksempel"
@@ -208,12 +210,12 @@ msgstr "Kun én pauseskærm"
 msgid "Random Screen Saver"
 msgstr "Tilfældig pauseskærm"
 
 msgid "Random Screen Saver"
 msgstr "Tilfældig pauseskærm"
 
-#: driver/demo-Gtk-widgets.c:571 driver/demo-Gtk.c:2134
+#: driver/demo-Gtk-widgets.c:571 driver/demo-Gtk.c:2141
 #: driver/xscreensaver-demo.glade.h:75
 msgid "Use"
 msgstr "Benyt"
 
 #: driver/xscreensaver-demo.glade.h:75
 msgid "Use"
 msgstr "Benyt"
 
-#: driver/demo-Gtk-widgets.c:591 driver/demo-Gtk.c:2144
+#: driver/demo-Gtk-widgets.c:591 driver/demo-Gtk.c:2151
 #: driver/xscreensaver-demo.glade.h:63
 msgid "Screen Saver"
 msgstr "Pauseskærm"
 #: driver/xscreensaver-demo.glade.h:63
 msgid "Screen Saver"
 msgstr "Pauseskærm"
@@ -261,7 +263,7 @@ msgstr "Fejlmeddelelser"
 #: 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."
 #: 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 "Om dæmonen skal udskrive mange fejlfindingsoplysninger"
+msgstr "Om serveren skal udskrive mange fejlfindingsoplysninger"
 
 #: driver/demo-Gtk-widgets.c:753 driver/xscreensaver-demo.glade.h:76
 msgid "Verbose Diagnostics"
 
 #: driver/demo-Gtk-widgets.c:753 driver/xscreensaver-demo.glade.h:76
 msgid "Verbose Diagnostics"
@@ -286,7 +288,7 @@ msgid ""
 "be momentarily displayed when the daemon first starts up."
 msgstr ""
 "Om velkomstskærmen (med versionnummer og hjælpeknappen) skal vises "
 "be momentarily displayed when the daemon first starts up."
 msgstr ""
 "Om velkomstskærmen (med versionnummer og hjælpeknappen) skal vises "
-"kortvarigt når dæmonen først starter"
+"kortvarigt når serveren først starter"
 
 #: driver/demo-Gtk-widgets.c:787 driver/xscreensaver-demo.glade.h:28
 msgid "Display Splash Screen at Startup"
 
 #: driver/demo-Gtk-widgets.c:787 driver/xscreensaver-demo.glade.h:28
 msgid "Display Splash Screen at Startup"
@@ -341,7 +343,7 @@ msgstr "Overgangsvarighed"
 #: 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."
 #: 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 "Hvor lang tid det tager for skærmen at gå fra sort og tilbage"
+msgstr "Tidsrum det tager for skærmen at gå fra sort og tilbage"
 
 #: driver/demo-Gtk-widgets.c:932 driver/xscreensaver-demo.glade.h:100
 #: driver/xscreensaver-demo.glade2.h:96
 
 #: driver/demo-Gtk-widgets.c:932 driver/xscreensaver-demo.glade.h:100
 #: driver/xscreensaver-demo.glade2.h:96
@@ -460,7 +462,7 @@ msgid "Visual:"
 msgstr "Farvedybde:"
 
 #: driver/demo-Gtk-widgets.c:1550 driver/demo-Gtk-widgets.c:1573
 msgstr "Farvedybde:"
 
 #: driver/demo-Gtk-widgets.c:1550 driver/demo-Gtk-widgets.c:1573
-#: driver/demo-Gtk.c:1538 driver/demo-Gtk.c:2864
+#: driver/demo-Gtk.c:1545 driver/demo-Gtk.c:2871
 #: driver/xscreensaver-demo.glade.h:5 driver/xscreensaver-demo.glade2.h:3
 msgid "Any"
 msgstr "Enhver"
 #: driver/xscreensaver-demo.glade.h:5 driver/xscreensaver-demo.glade2.h:3
 msgid "Any"
 msgstr "Enhver"
@@ -544,7 +546,7 @@ msgstr "Dokumentation..."
 #: 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 ""
 #: 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 ""
-"Klik her for at læse vejledningen til denne visningstilstand, hvis den har en"
+"Klik her for at læse vejledningen til denne skærmtilstand, hvis den har en"
 
 #: driver/demo-Gtk-widgets.c:1680 driver/xscreensaver-demo.glade.h:4
 msgid "Advanced >>"
 
 #: driver/demo-Gtk-widgets.c:1680 driver/xscreensaver-demo.glade.h:4
 msgid "Advanced >>"
@@ -562,7 +564,7 @@ msgstr "Standard <<"
 msgid "Back to the graphical configuration options."
 msgstr "Tilbage til den grafiske konfiguration"
 
 msgid "Back to the graphical configuration options."
 msgstr "Tilbage til den grafiske konfiguration"
 
-#: driver/demo-Gtk-widgets.c:1709 driver/demo-Gtk.c:741
+#: driver/demo-Gtk-widgets.c:1709 driver/demo-Gtk.c:748
 #: driver/xscreensaver-demo.glade.h:54
 msgid "OK"
 msgstr "O.k."
 #: driver/xscreensaver-demo.glade.h:54
 msgid "OK"
 msgstr "O.k."
@@ -571,11 +573,11 @@ msgstr "O.k."
 msgid "Cancel"
 msgstr "Annullér"
 
 msgid "Cancel"
 msgstr "Annullér"
 
-#: driver/demo-Gtk.c:649
+#: driver/demo-Gtk.c:656
 msgid "For updates, check http://www.jwz.org/xscreensaver/"
 msgstr "Tjek http://www.jwz.org/xscreensaver/ for opdateringer"
 
 msgid "For updates, check http://www.jwz.org/xscreensaver/"
 msgstr "Tjek http://www.jwz.org/xscreensaver/ for opdateringer"
 
-#: driver/demo-Gtk.c:779
+#: driver/demo-Gtk.c:786
 msgid ""
 "Error:\n"
 "\n"
 msgid ""
 "Error:\n"
 "\n"
@@ -585,7 +587,7 @@ msgstr ""
 "\n"
 "Ingen hjælpe-URL er blevet angivet.\n"
 
 "\n"
 "Ingen hjælpe-URL er blevet angivet.\n"
 
-#: driver/demo-Gtk.c:865
+#: driver/demo-Gtk.c:872
 msgid ""
 "Error:\n"
 "\n"
 msgid ""
 "Error:\n"
 "\n"
@@ -594,9 +596,9 @@ msgid ""
 msgstr ""
 "Fejl:\n"
 "\n"
 msgstr ""
 "Fejl:\n"
 "\n"
-"Pauseskærmsdæmonen startede ikke korrekt.\n"
+"Pauseskærmsserveren startede ikke korrekt.\n"
 
 
-#: driver/demo-Gtk.c:877
+#: driver/demo-Gtk.c:884
 msgid ""
 "You are running as root.  This usually means that xscreensaver\n"
 "was unable to contact your X server because access control is\n"
 msgid ""
 "You are running as root.  This usually means that xscreensaver\n"
 "was unable to contact your X server because access control is\n"
@@ -632,11 +634,11 @@ msgstr ""
 "på som en almindelig bruger og skifte bruger, f.eks. med 'su', om\n"
 "med nødvendigt."
 
 "på som en almindelig bruger og skifte bruger, f.eks. med 'su', om\n"
 "med nødvendigt."
 
-#: driver/demo-Gtk.c:893
+#: driver/demo-Gtk.c:900
 msgid "Please check your $PATH and permissions."
 msgstr "Kontrollér venligst din $PATH og rettigheder."
 
 msgid "Please check your $PATH and permissions."
 msgstr "Kontrollér venligst din $PATH og rettigheder."
 
-#: driver/demo-Gtk.c:928
+#: driver/demo-Gtk.c:935
 msgid ""
 "Error:\n"
 "\n"
 msgid ""
 "Error:\n"
 "\n"
@@ -646,7 +648,7 @@ msgstr ""
 "\n"
 "Kunne ikke bestemme klargøringsfilnavn!\n"
 
 "\n"
 "Kunne ikke bestemme klargøringsfilnavn!\n"
 
-#: driver/demo-Gtk.c:933
+#: driver/demo-Gtk.c:940
 #, c-format
 msgid ""
 "Error:\n"
 #, c-format
 msgid ""
 "Error:\n"
@@ -657,7 +659,7 @@ msgstr ""
 "\n"
 "Kunne ikke skrive %s\n"
 
 "\n"
 "Kunne ikke skrive %s\n"
 
-#: driver/demo-Gtk.c:992
+#: driver/demo-Gtk.c:999
 msgid ""
 "Error:\n"
 "\n"
 msgid ""
 "Error:\n"
 "\n"
@@ -667,7 +669,7 @@ msgstr ""
 "\n"
 "Ingen 'manualCommand'-resurse angivet."
 
 "\n"
 "Ingen 'manualCommand'-resurse angivet."
 
-#: driver/demo-Gtk.c:1173
+#: driver/demo-Gtk.c:1180
 #, c-format
 msgid ""
 "Error:\n"
 #, c-format
 msgid ""
 "Error:\n"
@@ -678,7 +680,7 @@ msgstr ""
 "\n"
 "Ufortolkeligt tidsformat: \"%s\"\n"
 
 "\n"
 "Ufortolkeligt tidsformat: \"%s\"\n"
 
-#: driver/demo-Gtk.c:1829
+#: driver/demo-Gtk.c:1836
 #, c-format
 msgid ""
 "Error:\n"
 #, c-format
 msgid ""
 "Error:\n"
@@ -689,29 +691,29 @@ msgstr ""
 "\n"
 "Mappe eksisterer ikke: \"%s\"\n"
 
 "\n"
 "Mappe eksisterer ikke: \"%s\"\n"
 
-#: driver/demo-Gtk.c:2546
+#: driver/demo-Gtk.c:2553
 msgid "Descriptions not available: no XML support compiled in."
 msgstr ""
 "Beskrivelser er ikke tilgængelige: ingen XML-understøttelse er oversat med."
 
 msgid "Descriptions not available: no XML support compiled in."
 msgstr ""
 "Beskrivelser er ikke tilgængelige: ingen XML-understøttelse er oversat med."
 
-#: driver/demo-Gtk.c:2551
+#: driver/demo-Gtk.c:2558
 msgid "No description available."
 msgstr "Ingen beskrivelse tilgængelig."
 
 msgid "No description available."
 msgstr "Ingen beskrivelse tilgængelig."
 
-#: driver/demo-Gtk.c:2816
+#: driver/demo-Gtk.c:2823
 msgid "Blank Screen"
 msgstr "Start pauseskærm nu"
 
 msgid "Blank Screen"
 msgstr "Start pauseskærm nu"
 
-#: driver/demo-Gtk.c:2822
+#: driver/demo-Gtk.c:2829
 msgid "Screen Saver Disabled"
 msgstr "Pauseskærm deaktiveret"
 
 msgid "Screen Saver Disabled"
 msgstr "Pauseskærm deaktiveret"
 
-#: driver/demo-Gtk.c:2855
+#: driver/demo-Gtk.c:2862
 #, c-format
 msgid "%s: %.100s Settings"
 #, c-format
 msgid "%s: %.100s Settings"
-msgstr ""
+msgstr "%s: %.100s opsætning"
 
 
-#: driver/demo-Gtk.c:3010
+#: driver/demo-Gtk.c:3017
 #, c-format
 msgid ""
 "Warning:\n"
 #, c-format
 msgid ""
 "Warning:\n"
@@ -722,23 +724,23 @@ msgstr ""
 "\n"
 "Filen \"%s\" er ændret, genindlæser.\n"
 
 "\n"
 "Filen \"%s\" er ændret, genindlæser.\n"
 
-#: driver/demo-Gtk.c:3092
+#: driver/demo-Gtk.c:3099
 msgid "No Preview"
 msgstr "Intet eksempel"
 
 msgid "No Preview"
 msgstr "Intet eksempel"
 
-#: driver/demo-Gtk.c:3092
+#: driver/demo-Gtk.c:3099
 msgid "Available"
 msgstr "Tilgængelig"
 
 msgid "Available"
 msgstr "Tilgængelig"
 
-#: driver/demo-Gtk.c:3093
+#: driver/demo-Gtk.c:3100
 msgid "Not"
 msgid "Not"
-msgstr ""
+msgstr "Ikke"
 
 
-#: driver/demo-Gtk.c:3093
+#: driver/demo-Gtk.c:3100
 msgid "Installed"
 msgid "Installed"
-msgstr ""
+msgstr "installeret"
 
 
-#: driver/demo-Gtk.c:3858
+#: driver/demo-Gtk.c:3865
 #, c-format
 msgid ""
 "Warning:\n"
 #, c-format
 msgid ""
 "Warning:\n"
@@ -748,10 +750,10 @@ msgid ""
 msgstr ""
 "Advarsel:\n"
 "\n"
 msgstr ""
 "Advarsel:\n"
 "\n"
-"Pauseskærmsdæmonen ser ikke ud til at køre på\n"
+"Pauseskærmsserveren ser ikke ud til at køre på\n"
 "terminalen \"%s\". Start den nu?"
 
 "terminalen \"%s\". Start den nu?"
 
-#: driver/demo-Gtk.c:3868
+#: driver/demo-Gtk.c:3875
 #, c-format
 msgid ""
 "Warning:\n"
 #, c-format
 msgid ""
 "Warning:\n"
@@ -783,9 +785,9 @@ msgstr ""
 "Du skal enten køre %s igen som \"%s\", eller køre \n"
 "xscreensaver as \"%s\".\n"
 "\n"
 "Du skal enten køre %s igen som \"%s\", eller køre \n"
 "xscreensaver as \"%s\".\n"
 "\n"
-"Genstart pauseskærmsdæmonen nu?\n"
+"Genstart pauseskærmsserveren nu?\n"
 
 
-#: driver/demo-Gtk.c:3893
+#: driver/demo-Gtk.c:3900
 #, c-format
 msgid ""
 "Warning:\n"
 #, c-format
 msgid ""
 "Warning:\n"
@@ -811,9 +813,9 @@ msgstr ""
 "deler den samme samme ~%s/.xscreensaver-fil), \n"
 "vil %s ikke virke korrekt.\n"
 "\n"
 "deler den samme samme ~%s/.xscreensaver-fil), \n"
 "vil %s ikke virke korrekt.\n"
 "\n"
-"Genstart pauseskærmsdæmonen på \"%s\" som \"%s\" nu?\n"
+"Genstart pauseskærmsserveren på \"%s\" som \"%s\" nu?\n"
 
 
-#: driver/demo-Gtk.c:3915
+#: driver/demo-Gtk.c:3922
 #, c-format
 msgid ""
 "Warning:\n"
 #, c-format
 msgid ""
 "Warning:\n"
@@ -830,21 +832,20 @@ msgstr ""
 "Men det pauseskærmsprogram der tager sig af terminalen \n"
 "\"%s\" er version %s. Dette kan give problemer.\n"
 "\n"
 "Men det pauseskærmsprogram der tager sig af terminalen \n"
 "\"%s\" er version %s. Dette kan give problemer.\n"
 "\n"
-"Genstart pauseskærmsdæmonen nu?\n"
+"Genstart pauseskærmsserveren nu?\n"
 
 
-#: driver/demo-Gtk.c:4372
+#: driver/demo-Gtk.c:4379
 #, c-format
 msgid "%s: unknown option: %s\n"
 msgstr "%s: ukendt tilvalg: %s\n"
 
 #, c-format
 msgid "%s: unknown option: %s\n"
 msgstr "%s: ukendt tilvalg: %s\n"
 
-#: driver/demo-Gtk.c:4436
-#, fuzzy
+#: driver/demo-Gtk.c:4443
 msgid "Screensaver Preferences"
 msgid "Screensaver Preferences"
-msgstr "Pauseskærm"
+msgstr "Indstillinger for pauseskærm"
 
 #: driver/screensaver-properties.desktop.in.h:1
 msgid "Change screensaver properties"
 
 #: driver/screensaver-properties.desktop.in.h:1
 msgid "Change screensaver properties"
-msgstr ""
+msgstr "Ændr egenskaber for pauseskærm"
 
 #: driver/screensaver-properties.desktop.in.h:2
 msgid "Screensaver"
 
 #: driver/screensaver-properties.desktop.in.h:2
 msgid "Screensaver"
@@ -893,22 +894,24 @@ msgstr "Benyt v_ideobilleder"
 #: driver/xscreensaver-demo.glade2.h:28
 msgid "How long after the screen blanks until a password will be required."
 msgstr ""
 #: driver/xscreensaver-demo.glade2.h:28
 msgid "How long after the screen blanks until a password will be required."
 msgstr ""
+"Hvor lang tid der går efter at skærmen bliver blank før der kræves en "
+"adgangskode."
 
 #: driver/xscreensaver-demo.glade2.h:29
 
 #: driver/xscreensaver-demo.glade2.h:29
-#, fuzzy
 msgid "How long before the screensaver activates."
 msgid "How long before the screensaver activates."
-msgstr "Hvor lang tid det tager for skærmen at gå fra sort og tilbage"
+msgstr "Tidsrum før pauseskærmen aktiveres."
 
 #: driver/xscreensaver-demo.glade2.h:30
 msgid ""
 "How long each display mode should run before choosing a new one (in Random "
 "mode.)"
 msgstr ""
 
 #: driver/xscreensaver-demo.glade2.h:30
 msgid ""
 "How long each display mode should run before choosing a new one (in Random "
 "mode.)"
 msgstr ""
+"Hvor lang tid hver skærmtilstand skal køre før der vælges en ny (i "
+"tilfældighedstilstand)."
 
 #: driver/xscreensaver-demo.glade2.h:32
 
 #: driver/xscreensaver-demo.glade2.h:32
-#, fuzzy
 msgid "How long until the monitor goes completely black."
 msgid "How long until the monitor goes completely black."
-msgstr "Tidsrum før skærmen bliver helt sort"
+msgstr "Tidsrum før skærmen bliver helt sort."
 
 #: driver/xscreensaver-demo.glade2.h:36
 msgid "Install _Colormap"
 
 #: driver/xscreensaver-demo.glade2.h:36
 msgid "Install _Colormap"
@@ -927,6 +930,8 @@ msgid ""
 "Not\n"
 "Installed"
 msgstr ""
 "Not\n"
 "Installed"
 msgstr ""
+"Ikke\n"
+"intalleret"
 
 #: driver/xscreensaver-demo.glade2.h:48
 msgid "Stand_by After"
 
 #: driver/xscreensaver-demo.glade2.h:48
 msgid "Stand_by After"
@@ -1006,9 +1011,8 @@ msgid "_Standard <<"
 msgstr "_Standard <<"
 
 #: driver/xscreensaver-demo.glade2.h:89
 msgstr "_Standard <<"
 
 #: driver/xscreensaver-demo.glade2.h:89
-#, fuzzy
 msgid "_Verbose Diagnostics"
 msgid "_Verbose Diagnostics"
-msgstr "Informationsrige fejlmeddelelser"
+msgstr "_Informationsrige fejlmeddelelser"
 
 # dækker over 'visual'-begrebet i X, ca. = farvedybde her
 #: driver/xscreensaver-demo.glade2.h:90
 
 # dækker over 'visual'-begrebet i X, ca. = farvedybde her
 #: driver/xscreensaver-demo.glade2.h:90
@@ -1025,7 +1029,7 @@ msgstr "intet eksempel"
 
 #: driver/xscreensaver-demo.glade2.h:94
 msgid "not installed"
 
 #: driver/xscreensaver-demo.glade2.h:94
 msgid "not installed"
-msgstr ""
+msgstr "ikke installeret"
 
 #: driver/xscreensaver-demo.glade2.h:95
 msgid "preview"
 
 #: driver/xscreensaver-demo.glade2.h:95
 msgid "preview"
@@ -1044,15 +1048,15 @@ msgstr "Arme"
 #: 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/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:5
+#: hacks/config/blaster.xml.h:4 hacks/config/blinkbox.xml.h:5
 #: 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/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/bumps.xml.h:4 hacks/config/cage.xml.h:2
 #: 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/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/critical.xml.h:4 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/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
@@ -1063,11 +1067,11 @@ msgstr "Arme"
 #: 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/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/flipscreen3d.xml.h:1 hacks/config/flow.xml.h:2
 #: 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/fuzzyflakes.xml.h:7 hacks/config/galaxy.xml.h:3
 #: 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/fuzzyflakes.xml.h:7 hacks/config/galaxy.xml.h:3
-#: hacks/config/gears.xml.h:2 hacks/config/gflux.xml.h:6
+#: hacks/config/gears.xml.h:2 hacks/config/gflux.xml.h:7
 #: 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: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:6
@@ -1077,8 +1081,8 @@ msgstr "Arme"
 #: 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/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/jigsaw.xml.h:3 hacks/config/juggle.xml.h:4
+#: hacks/config/julia.xml.h:2 hacks/config/kaleidescope.xml.h:3
 #: 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/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
@@ -1089,11 +1093,11 @@ msgstr "Arme"
 #: hacks/config/mirrorblob.xml.h:12 hacks/config/mismunch.xml.h:2
 #: 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/mirrorblob.xml.h:12 hacks/config/mismunch.xml.h:2
 #: 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/mountain.xml.h:2 hacks/config/munch.xml.h:4
 #: hacks/config/nerverot.xml.h:9 hacks/config/noof.xml.h:2
 #: hacks/config/pacman.xml.h:1 hacks/config/penetrate.xml.h:3
 #: hacks/config/penrose.xml.h:6 hacks/config/petri.xml.h:5
 #: hacks/config/nerverot.xml.h:9 hacks/config/noof.xml.h:2
 #: hacks/config/pacman.xml.h:1 hacks/config/penetrate.xml.h:3
 #: hacks/config/penrose.xml.h:6 hacks/config/petri.xml.h:5
-#: hacks/config/phosphor.xml.h:4 hacks/config/piecewise.xml.h:4
+#: hacks/config/phosphor.xml.h:5 hacks/config/piecewise.xml.h:4
 #: hacks/config/pipes.xml.h:5 hacks/config/polyhedra.xml.h:18
 #: hacks/config/polyominoes.xml.h:2 hacks/config/polytopes.xml.h:11
 #: hacks/config/pong.xml.h:1 hacks/config/popsquares.xml.h:3
 #: hacks/config/pipes.xml.h:5 hacks/config/polyhedra.xml.h:18
 #: hacks/config/polyominoes.xml.h:2 hacks/config/polytopes.xml.h:11
 #: hacks/config/pong.xml.h:1 hacks/config/popsquares.xml.h:3
@@ -1108,14 +1112,14 @@ msgstr "Arme"
 #: hacks/config/speedmine.xml.h:3 hacks/config/sphere.xml.h:2
 #: hacks/config/spheremonics.xml.h:5 hacks/config/spiral.xml.h:3
 #: hacks/config/spotlight.xml.h:2 hacks/config/sproingies.xml.h:2
 #: hacks/config/speedmine.xml.h:3 hacks/config/sphere.xml.h:2
 #: hacks/config/spheremonics.xml.h:5 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/squiral.xml.h:5 hacks/config/stairs.xml.h:1
 #: hacks/config/starfish.xml.h:3 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 hacks/config/webcollage.xml.h:4
 #: hacks/config/starfish.xml.h:3 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 hacks/config/webcollage.xml.h:4
-#: hacks/config/worm.xml.h:3 hacks/config/wormhole.xml.h:2
+#: hacks/config/worm.xml.h:4 hacks/config/wormhole.xml.h:2
 #: hacks/config/xearth.xml.h:7 hacks/config/xfishtank.xml.h:3
 #: hacks/config/xflame.xml.h:4 hacks/config/xjack.xml.h:1
 #: hacks/config/xmatrix.xml.h:5 hacks/config/xmountains.xml.h:13
 #: hacks/config/xearth.xml.h:7 hacks/config/xfishtank.xml.h:3
 #: hacks/config/xflame.xml.h:4 hacks/config/xjack.xml.h:1
 #: hacks/config/xmatrix.xml.h:5 hacks/config/xmountains.xml.h:13
@@ -1125,11 +1129,11 @@ msgid "Fast"
 msgstr "Hurtig"
 
 #: hacks/config/anemone.xml.h:4 hacks/config/anemotaxis.xml.h:6
 msgstr "Hurtig"
 
 #: hacks/config/anemone.xml.h:4 hacks/config/anemotaxis.xml.h:6
-#: hacks/config/blaster.xml.h:4 hacks/config/bouboule.xml.h:4
+#: hacks/config/blaster.xml.h:5 hacks/config/bouboule.xml.h:4
 #: hacks/config/coral.xml.h:8 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/coral.xml.h:8 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/fuzzyflakes.xml.h:8 hacks/config/kaleidescope.xml.h:3
+#: hacks/config/fuzzyflakes.xml.h:8 hacks/config/kaleidescope.xml.h:4
 #: 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/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
@@ -1139,9 +1143,9 @@ msgstr "Få"
 
 #: hacks/config/anemone.xml.h:5 hacks/config/anemotaxis.xml.h:7
 #: hacks/config/ant.xml.h:9 hacks/config/apollonian.xml.h:7
 
 #: hacks/config/anemone.xml.h:5 hacks/config/anemotaxis.xml.h:7
 #: 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/attraction.xml.h:19 hacks/config/blaster.xml.h:7
 #: hacks/config/bouboule.xml.h:5 hacks/config/braid.xml.h:7
 #: hacks/config/bouboule.xml.h:5 hacks/config/braid.xml.h:7
-#: hacks/config/coral.xml.h:9 hacks/config/critical.xml.h:4
+#: hacks/config/coral.xml.h:9 hacks/config/critical.xml.h:5
 #: hacks/config/crystal.xml.h:8 hacks/config/cubenetic.xml.h:13
 #: hacks/config/cynosure.xml.h:6 hacks/config/deco.xml.h:5
 #: hacks/config/deluxe.xml.h:6 hacks/config/demon.xml.h:6
 #: hacks/config/crystal.xml.h:8 hacks/config/cubenetic.xml.h:13
 #: hacks/config/cynosure.xml.h:6 hacks/config/deco.xml.h:5
 #: hacks/config/deluxe.xml.h:6 hacks/config/demon.xml.h:6
@@ -1149,13 +1153,13 @@ msgstr "Få"
 #: hacks/config/epicycle.xml.h:8 hacks/config/eruption.xml.h:12
 #: hacks/config/euler2d.xml.h:8 hacks/config/fadeplot.xml.h:6
 #: hacks/config/flag.xml.h:5 hacks/config/flame.xml.h:11
 #: hacks/config/epicycle.xml.h:8 hacks/config/eruption.xml.h:12
 #: hacks/config/euler2d.xml.h:8 hacks/config/fadeplot.xml.h:6
 #: hacks/config/flag.xml.h:5 hacks/config/flame.xml.h:11
-#: hacks/config/flow.xml.h:8 hacks/config/fluidballs.xml.h:13
+#: hacks/config/flow.xml.h:7 hacks/config/fluidballs.xml.h:13
 #: hacks/config/forest.xml.h:3 hacks/config/fuzzyflakes.xml.h:12
 #: 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:14 hacks/config/julia.xml.h:6
 #: hacks/config/forest.xml.h:3 hacks/config/fuzzyflakes.xml.h:12
 #: 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:14 hacks/config/julia.xml.h:6
-#: hacks/config/kaleidescope.xml.h:5 hacks/config/laser.xml.h:6
+#: hacks/config/kaleidescope.xml.h:6 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
 #: hacks/config/metaballs.xml.h:6 hacks/config/mismunch.xml.h:4
 #: hacks/config/lightning.xml.h:3 hacks/config/lisa.xml.h:5
 #: hacks/config/lissie.xml.h:6 hacks/config/loop.xml.h:4
 #: hacks/config/metaballs.xml.h:6 hacks/config/mismunch.xml.h:4
@@ -1168,26 +1172,26 @@ msgstr "Få"
 #: hacks/config/rotor.xml.h:6 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/rotor.xml.h:6 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/squiral.xml.h:10 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/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 hacks/config/xearth.xml.h:12
+#: hacks/config/worm.xml.h:5 hacks/config/xearth.xml.h:12
 #: hacks/config/xfishtank.xml.h:8
 msgid "Many"
 msgstr "Mange"
 
 #: hacks/config/anemone.xml.h:6 hacks/config/ant.xml.h:11
 #: hacks/config/xfishtank.xml.h:8
 msgid "Many"
 msgstr "Mange"
 
 #: 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/apollonian.xml.h:8 hacks/config/attraction.xml.h:20
 #: hacks/config/bouboule.xml.h:6 hacks/config/braid.xml.h:9
 #: 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/critical.xml.h:6 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/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/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/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/flow.xml.h:8 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/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
@@ -1202,10 +1206,10 @@ msgstr "Mange"
 #: 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/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/squiral.xml.h:11 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/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/vines.xml.h:3 hacks/config/worm.xml.h:6
 #: hacks/config/xearth.xml.h:17 hacks/config/xfishtank.xml.h:9
 msgid "Number of Colors"
 msgstr "Antal farver"
 #: hacks/config/xearth.xml.h:17 hacks/config/xfishtank.xml.h:9
 msgid "Number of Colors"
 msgstr "Antal farver"
@@ -1217,22 +1221,22 @@ msgstr "Ofte"
 
 #: hacks/config/anemone.xml.h:8
 msgid "Rarely"
 
 #: hacks/config/anemone.xml.h:8
 msgid "Rarely"
-msgstr ""
+msgstr "Sjældent"
 
 #: hacks/config/anemone.xml.h:9 hacks/config/anemotaxis.xml.h:10
 #: hacks/config/ant.xml.h:15 hacks/config/antinspect.xml.h:6
 #: hacks/config/antspotlight.xml.h:5 hacks/config/apollonian.xml.h:11
 
 #: hacks/config/anemone.xml.h:9 hacks/config/anemotaxis.xml.h:10
 #: hacks/config/ant.xml.h:15 hacks/config/antinspect.xml.h:6
 #: 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/atlantis.xml.h:13 hacks/config/attraction.xml.h:27
 #: hacks/config/atunnel.xml.h:6 hacks/config/barcode.xml.h:6
 #: hacks/config/atunnel.xml.h:6 hacks/config/barcode.xml.h:6
-#: hacks/config/blaster.xml.h:8 hacks/config/blinkbox.xml.h:7
+#: hacks/config/blaster.xml.h:9 hacks/config/blinkbox.xml.h:7
 #: 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:7 hacks/config/braid.xml.h:11
 #: hacks/config/bubble3d.xml.h:5 hacks/config/bubbles.xml.h:10
 #: 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:7 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/bumps.xml.h:5 hacks/config/cage.xml.h:4
 #: 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/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/critical.xml.h:7 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/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
@@ -1243,11 +1247,11 @@ msgstr ""
 #: 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/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/flipscreen3d.xml.h:6 hacks/config/flow.xml.h:10
 #: 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/fluidballs.xml.h:18 hacks/config/flyingtoasters.xml.h:11
 #: hacks/config/fontglide.xml.h:13 hacks/config/forest.xml.h:5
-#: hacks/config/fuzzyflakes.xml.h:15 hacks/config/galaxy.xml.h:10
-#: hacks/config/gears.xml.h:7 hacks/config/gflux.xml.h:12
+#: hacks/config/fuzzyflakes.xml.h:15 hacks/config/galaxy.xml.h:11
+#: hacks/config/gears.xml.h:7 hacks/config/gflux.xml.h:13
 #: 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:8 hacks/config/glsnake.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:8 hacks/config/glsnake.xml.h:12
@@ -1257,8 +1261,8 @@ msgstr ""
 #: 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/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/jigsaw.xml.h:5 hacks/config/juggle.xml.h:8
+#: hacks/config/julia.xml.h:8 hacks/config/kaleidescope.xml.h:8
 #: 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:27 hacks/config/lightning.xml.h:5
 #: 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:27 hacks/config/lightning.xml.h:5
@@ -1269,12 +1273,12 @@ msgstr ""
 #: hacks/config/mirrorblob.xml.h:19 hacks/config/mismunch.xml.h:10
 #: 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/mirrorblob.xml.h:19 hacks/config/mismunch.xml.h:10
 #: 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/mountain.xml.h:7 hacks/config/munch.xml.h:8
 #: hacks/config/nerverot.xml.h:20 hacks/config/noof.xml.h:5
 #: hacks/config/pacman.xml.h:5 hacks/config/penetrate.xml.h:6
 #: hacks/config/penrose.xml.h:11 hacks/config/petri.xml.h:23
 #: hacks/config/nerverot.xml.h:20 hacks/config/noof.xml.h:5
 #: hacks/config/pacman.xml.h:5 hacks/config/penetrate.xml.h:6
 #: hacks/config/penrose.xml.h:11 hacks/config/petri.xml.h:23
-#: hacks/config/phosphor.xml.h:7 hacks/config/piecewise.xml.h:9
-#: hacks/config/pipes.xml.h:15 hacks/config/polyhedra.xml.h:119
+#: hacks/config/phosphor.xml.h:8 hacks/config/piecewise.xml.h:9
+#: hacks/config/pipes.xml.h:16 hacks/config/polyhedra.xml.h:119
 #: hacks/config/polyominoes.xml.h:10 hacks/config/polytopes.xml.h:20
 #: hacks/config/pong.xml.h:4 hacks/config/popsquares.xml.h:5
 #: hacks/config/providence.xml.h:5 hacks/config/pulsar.xml.h:15
 #: hacks/config/polyominoes.xml.h:10 hacks/config/polytopes.xml.h:20
 #: hacks/config/pong.xml.h:4 hacks/config/popsquares.xml.h:5
 #: hacks/config/providence.xml.h:5 hacks/config/pulsar.xml.h:15
@@ -1285,17 +1289,17 @@ msgstr ""
 #: hacks/config/sballs.xml.h:13 hacks/config/shadebobs.xml.h:9
 #: hacks/config/sierpinski.xml.h:7 hacks/config/sierpinski3d.xml.h:8
 #: hacks/config/slidescreen.xml.h:6 hacks/config/slip.xml.h:7
 #: hacks/config/sballs.xml.h:13 hacks/config/shadebobs.xml.h:9
 #: hacks/config/sierpinski.xml.h:7 hacks/config/sierpinski3d.xml.h:8
 #: hacks/config/slidescreen.xml.h:6 hacks/config/slip.xml.h:7
-#: hacks/config/speedmine.xml.h:13 hacks/config/sphere.xml.h:5
+#: hacks/config/speedmine.xml.h:14 hacks/config/sphere.xml.h:5
 #: hacks/config/spheremonics.xml.h:19 hacks/config/spiral.xml.h:9
 #: hacks/config/spotlight.xml.h:4 hacks/config/sproingies.xml.h:6
 #: hacks/config/spheremonics.xml.h:19 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/squiral.xml.h:15 hacks/config/stairs.xml.h:3
 #: hacks/config/starfish.xml.h:8 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/starfish.xml.h:8 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/wormhole.xml.h:5
+#: hacks/config/worm.xml.h:8 hacks/config/wormhole.xml.h:5
 #: 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:15 hacks/config/xplanet.xml.h:59
 #: 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:15 hacks/config/xplanet.xml.h:59
@@ -1306,15 +1310,15 @@ msgstr "Langsom"
 #: hacks/config/anemone.xml.h:10 hacks/config/anemotaxis.xml.h:12
 #: hacks/config/ant.xml.h:17 hacks/config/antinspect.xml.h:7
 #: hacks/config/antspotlight.xml.h:6 hacks/config/apollonian.xml.h:12
 #: hacks/config/anemone.xml.h:10 hacks/config/anemotaxis.xml.h:12
 #: hacks/config/ant.xml.h:17 hacks/config/antinspect.xml.h:7
 #: 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/attraction.xml.h:29 hacks/config/atunnel.xml.h:7
+#: hacks/config/barcode.xml.h:7 hacks/config/blaster.xml.h:10
 #: hacks/config/blinkbox.xml.h:8 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/blinkbox.xml.h:8 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/bumps.xml.h:6 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/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/critical.xml.h:8 hacks/config/crystal.xml.h:12
 #: hacks/config/cubenetic.xml.h:24 hacks/config/cynosure.xml.h:10
 #: hacks/config/dangerball.xml.h:6 hacks/config/decayscreen.xml.h:18
 #: hacks/config/deluxe.xml.h:9 hacks/config/demon.xml.h:10
 #: hacks/config/cubenetic.xml.h:24 hacks/config/cynosure.xml.h:10
 #: hacks/config/dangerball.xml.h:6 hacks/config/decayscreen.xml.h:18
 #: hacks/config/deluxe.xml.h:9 hacks/config/demon.xml.h:10
@@ -1325,17 +1329,17 @@ msgstr "Langsom"
 #: 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/flipflop.xml.h:7 hacks/config/flipscreen3d.xml.h:7
 #: 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/flipflop.xml.h:7 hacks/config/flipscreen3d.xml.h:7
-#: hacks/config/flow.xml.h:16 hacks/config/fluidballs.xml.h:20
+#: hacks/config/flow.xml.h:12 hacks/config/fluidballs.xml.h:20
 #: hacks/config/forest.xml.h:6 hacks/config/fuzzyflakes.xml.h:17
 #: hacks/config/forest.xml.h:6 hacks/config/fuzzyflakes.xml.h:17
-#: hacks/config/galaxy.xml.h:11 hacks/config/glblur.xml.h:17
+#: hacks/config/galaxy.xml.h:12 hacks/config/glblur.xml.h:17
 #: hacks/config/glforestfire.xml.h:15 hacks/config/glplanet.xml.h:10
 #: 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:11 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/glforestfire.xml.h:15 hacks/config/glplanet.xml.h:10
 #: 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:11 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/juggle.xml.h:9 hacks/config/julia.xml.h:10
+#: hacks/config/kaleidescope.xml.h:9 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/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
@@ -1345,11 +1349,11 @@ msgstr "Langsom"
 #: hacks/config/mirrorblob.xml.h:21 hacks/config/mismunch.xml.h:12
 #: 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/mirrorblob.xml.h:21 hacks/config/mismunch.xml.h:12
 #: 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/mountain.xml.h:8 hacks/config/munch.xml.h:10
 #: hacks/config/nerverot.xml.h:22 hacks/config/noof.xml.h:6
 #: hacks/config/pacman.xml.h:6 hacks/config/penrose.xml.h:12
 #: hacks/config/nerverot.xml.h:22 hacks/config/noof.xml.h:6
 #: hacks/config/pacman.xml.h:6 hacks/config/penrose.xml.h:12
-#: hacks/config/petri.xml.h:25 hacks/config/phosphor.xml.h:8
-#: hacks/config/piecewise.xml.h:11 hacks/config/pipes.xml.h:16
+#: hacks/config/petri.xml.h:25 hacks/config/phosphor.xml.h:9
+#: hacks/config/piecewise.xml.h:11 hacks/config/pipes.xml.h:17
 #: hacks/config/polyominoes.xml.h:11 hacks/config/pong.xml.h:5
 #: hacks/config/popsquares.xml.h:6 hacks/config/providence.xml.h:6
 #: hacks/config/pulsar.xml.h:17 hacks/config/qix.xml.h:22
 #: hacks/config/polyominoes.xml.h:11 hacks/config/pong.xml.h:5
 #: hacks/config/popsquares.xml.h:6 hacks/config/providence.xml.h:6
 #: hacks/config/pulsar.xml.h:17 hacks/config/qix.xml.h:22
@@ -1357,17 +1361,17 @@ msgstr "Langsom"
 #: 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/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/slip.xml.h:9 hacks/config/speedmine.xml.h:16
 #: 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/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/sproingies.xml.h:8 hacks/config/squiral.xml.h:17
 #: 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/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/whirlygig.xml.h:13 hacks/config/worm.xml.h:9
 #: 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/xplanet.xml.h:60 hacks/config/xrayswarm.xml.h:4
 #: 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/xplanet.xml.h:60 hacks/config/xrayswarm.xml.h:4
@@ -1403,20 +1407,20 @@ msgstr "Tynd"
 
 #: hacks/config/anemone.xml.h:15
 msgid "Turn speed"
 
 #: hacks/config/anemone.xml.h:15
 msgid "Turn speed"
-msgstr ""
+msgstr "svinghastighed"
 
 #: hacks/config/anemone.xml.h:16 hacks/config/ant.xml.h:22
 
 #: 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/apollonian.xml.h:13 hacks/config/attraction.xml.h:33
 #: hacks/config/bouboule.xml.h:11 hacks/config/braid.xml.h:13
 #: hacks/config/bouboule.xml.h:11 hacks/config/braid.xml.h:13
-#: hacks/config/critical.xml.h:8 hacks/config/crystal.xml.h:13
-#: hacks/config/cynosure.xml.h:11 hacks/config/deco.xml.h:10
+#: hacks/config/critical.xml.h:9 hacks/config/crystal.xml.h:13
+#: hacks/config/cynosure.xml.h:11 hacks/config/deco.xml.h:11
 #: hacks/config/deluxe.xml.h:14 hacks/config/demon.xml.h:13
 #: hacks/config/discrete.xml.h:11 hacks/config/drift.xml.h:14
 #: hacks/config/deluxe.xml.h:14 hacks/config/demon.xml.h:13
 #: hacks/config/discrete.xml.h:11 hacks/config/drift.xml.h:14
-#: hacks/config/epicycle.xml.h:13 hacks/config/euler2d.xml.h:17
-#: hacks/config/fadeplot.xml.h:12 hacks/config/flag.xml.h:13
-#: hacks/config/flame.xml.h:16 hacks/config/flow.xml.h:18
-#: hacks/config/forest.xml.h:8 hacks/config/galaxy.xml.h:13
-#: hacks/config/grav.xml.h:11 hacks/config/halo.xml.h:13
+#: hacks/config/epicycle.xml.h:14 hacks/config/euler2d.xml.h:17
+#: hacks/config/fadeplot.xml.h:12 hacks/config/flag.xml.h:14
+#: hacks/config/flame.xml.h:16 hacks/config/flow.xml.h:15
+#: hacks/config/forest.xml.h:8 hacks/config/galaxy.xml.h:14
+#: hacks/config/grav.xml.h:11 hacks/config/halo.xml.h:14
 #: hacks/config/hopalong.xml.h:25 hacks/config/ifs.xml.h:8
 #: 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/hopalong.xml.h:25 hacks/config/ifs.xml.h:8
 #: hacks/config/imsmap.xml.h:15 hacks/config/interference.xml.h:19
 #: hacks/config/julia.xml.h:12 hacks/config/laser.xml.h:12
@@ -1426,14 +1430,14 @@ msgstr ""
 #: hacks/config/moire2.xml.h:9 hacks/config/mountain.xml.h:9
 #: hacks/config/nerverot.xml.h:23 hacks/config/penrose.xml.h:13
 #: hacks/config/polyominoes.xml.h:12 hacks/config/rd-bomb.xml.h:20
 #: hacks/config/moire2.xml.h:9 hacks/config/mountain.xml.h:9
 #: hacks/config/nerverot.xml.h:23 hacks/config/penrose.xml.h:13
 #: hacks/config/polyominoes.xml.h:12 hacks/config/rd-bomb.xml.h:20
-#: hacks/config/rocks.xml.h:12 hacks/config/rotor.xml.h:13
+#: hacks/config/rocks.xml.h:13 hacks/config/rotor.xml.h:13
 #: 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/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:8
+#: hacks/config/spiral.xml.h:12 hacks/config/squiral.xml.h:19
+#: hacks/config/starfish.xml.h:15 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/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
+#: hacks/config/worm.xml.h:10 hacks/config/xearth.xml.h:28
 #: hacks/config/xfishtank.xml.h:11
 msgid "Two"
 msgstr "To"
 #: hacks/config/xfishtank.xml.h:11
 msgid "Two"
 msgstr "To"
@@ -1444,12 +1448,11 @@ msgstr "Vrikkende tentakler. Af Gabriel Finch."
 
 #: hacks/config/anemone.xml.h:18
 msgid "Withdraw freqency"
 
 #: hacks/config/anemone.xml.h:18
 msgid "Withdraw freqency"
-msgstr ""
+msgstr "Tilbagetrækningsfrekvens"
 
 #: hacks/config/anemotaxis.xml.h:1
 
 #: hacks/config/anemotaxis.xml.h:1
-#, fuzzy
 msgid "Anemotaxis"
 msgid "Anemotaxis"
-msgstr "Bjerge"
+msgstr "Anemotaxis"
 
 #: hacks/config/anemotaxis.xml.h:2
 msgid ""
 
 #: hacks/config/anemotaxis.xml.h:2
 msgid ""
@@ -1458,11 +1461,14 @@ msgid ""
 "determine local instantaneous wind direction. The goal is to find the source "
 "in the shortest mean time. Written by Eugene Balkovsky."
 msgstr ""
 "determine local instantaneous wind direction. The goal is to find the source "
 "in the shortest mean time. Written by Eugene Balkovsky."
 msgstr ""
+"Anemotaxis demonstrerer en søgealgoritme designet til at lokalisere en "
+"duftkilde i en turbulent atmosfære. Søgeren kan sanse duften og bestemme den "
+"aktuelle lokale vindretning. Målet er at finde kilden på kortest tid. "
+"Skrevet af Eugene Balkovsky."
 
 #: hacks/config/anemotaxis.xml.h:3
 
 #: hacks/config/anemotaxis.xml.h:3
-#, fuzzy
 msgid "Distance"
 msgid "Distance"
-msgstr "Diskret"
+msgstr "Distance"
 
 #: hacks/config/anemotaxis.xml.h:4 hacks/config/hyperball.xml.h:1
 #: hacks/config/hypercube.xml.h:1
 
 #: hacks/config/anemotaxis.xml.h:4 hacks/config/hyperball.xml.h:1
 #: hacks/config/hypercube.xml.h:1
@@ -1476,12 +1482,11 @@ msgstr "Nær"
 
 #: hacks/config/anemotaxis.xml.h:9
 msgid "Searchers"
 
 #: hacks/config/anemotaxis.xml.h:9
 msgid "Searchers"
-msgstr ""
+msgstr "Søgerer"
 
 #: hacks/config/anemotaxis.xml.h:11
 
 #: hacks/config/anemotaxis.xml.h:11
-#, fuzzy
 msgid "Sources"
 msgid "Sources"
-msgstr "Spring tilbage"
+msgstr "Kilder"
 
 #: hacks/config/ant.xml.h:1
 msgid ""
 
 #: hacks/config/ant.xml.h:1
 msgid ""
@@ -1508,9 +1513,8 @@ msgid "Ants Count"
 msgstr "Myreantal"
 
 #: hacks/config/ant.xml.h:5
 msgstr "Myreantal"
 
 #: hacks/config/ant.xml.h:5
-#, fuzzy
 msgid "Draw Eyes"
 msgid "Draw Eyes"
-msgstr "Tegn etiketter"
+msgstr "Tegn øjne"
 
 #: hacks/config/ant.xml.h:7
 msgid "Four Sided Cells"
 
 #: hacks/config/ant.xml.h:7
 msgid "Four Sided Cells"
@@ -1520,7 +1524,7 @@ msgstr "Firkantede celler"
 #: 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/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/flag.xml.h:4 hacks/config/flow.xml.h:4
 #: hacks/config/fluidballs.xml.h:12 hacks/config/fuzzyflakes.xml.h:10
 #: 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/fluidballs.xml.h:12 hacks/config/fuzzyflakes.xml.h:10
 #: hacks/config/gleidescope.xml.h:7 hacks/config/halftone.xml.h:8
 #: hacks/config/hopalong.xml.h:13 hacks/config/interference.xml.h:11
@@ -1548,11 +1552,11 @@ msgstr "Skarpe sving"
 msgid "Six Sided Cells"
 msgstr "Sekskantede celler"
 
 msgid "Six Sided Cells"
 msgstr "Sekskantede celler"
 
-#: hacks/config/ant.xml.h:16 hacks/config/attraction.xml.h:27
+#: hacks/config/ant.xml.h:16 hacks/config/attraction.xml.h:28
 #: 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/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/flag.xml.h:8 hacks/config/flow.xml.h:11
 #: hacks/config/fluidballs.xml.h:19 hacks/config/fuzzyflakes.xml.h:16
 #: 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/fluidballs.xml.h:19 hacks/config/fuzzyflakes.xml.h:16
 #: hacks/config/gleidescope.xml.h:12 hacks/config/halftone.xml.h:14
 #: hacks/config/hopalong.xml.h:22 hacks/config/interference.xml.h:18
@@ -1571,7 +1575,7 @@ msgstr "Trekantede celler"
 
 #: 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/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/flag.xml.h:13 hacks/config/flow.xml.h:14
 #: hacks/config/lissie.xml.h:12 hacks/config/loop.xml.h:11
 #: hacks/config/rubik.xml.h:12 hacks/config/sierpinski.xml.h:11
 #: hacks/config/slip.xml.h:11
 #: hacks/config/lissie.xml.h:12 hacks/config/loop.xml.h:11
 #: hacks/config/rubik.xml.h:12 hacks/config/sierpinski.xml.h:11
 #: hacks/config/slip.xml.h:11
@@ -1588,18 +1592,19 @@ msgstr "Tolvkantede celler"
 
 #: hacks/config/antinspect.xml.h:1
 msgid "AntInspect"
 
 #: hacks/config/antinspect.xml.h:1
 msgid "AntInspect"
-msgstr ""
+msgstr "Myreinspektion"
 
 #: hacks/config/antinspect.xml.h:2
 
 #: hacks/config/antinspect.xml.h:2
-#, fuzzy
 msgid "Draw Shadows"
 msgid "Draw Shadows"
-msgstr "Tegn pletter"
+msgstr "Tegn skygger"
 
 #: hacks/config/antinspect.xml.h:3
 msgid ""
 "Draws a trio of ants moving their spheres around a circle. Written by Blair "
 "Tennessy."
 msgstr ""
 
 #: hacks/config/antinspect.xml.h:3
 msgid ""
 "Draws a trio of ants moving their spheres around a circle. Written by Blair "
 "Tennessy."
 msgstr ""
+"Tegner en trio af myrer der bevæger deres kugler rundt i en cirkel. Skrevet "
+"af Blair Tennessy."
 
 #: hacks/config/antinspect.xml.h:5 hacks/config/antspotlight.xml.h:4
 #: hacks/config/atlantis.xml.h:11 hacks/config/atunnel.xml.h:5
 
 #: hacks/config/antinspect.xml.h:5 hacks/config/antspotlight.xml.h:4
 #: hacks/config/atlantis.xml.h:11 hacks/config/atunnel.xml.h:5
@@ -1611,7 +1616,7 @@ msgstr ""
 #: 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/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/gears.xml.h:6 hacks/config/gflux.xml.h:12
 #: 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:7
 #: 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:7
@@ -1622,7 +1627,7 @@ msgstr ""
 #: hacks/config/menger.xml.h:15 hacks/config/mirrorblob.xml.h:18
 #: hacks/config/moebius.xml.h:6 hacks/config/molecule.xml.h:21
 #: hacks/config/morph3d.xml.h:5 hacks/config/noof.xml.h:4
 #: hacks/config/menger.xml.h:15 hacks/config/mirrorblob.xml.h:18
 #: hacks/config/moebius.xml.h:6 hacks/config/molecule.xml.h:21
 #: hacks/config/morph3d.xml.h:5 hacks/config/noof.xml.h:4
-#: hacks/config/pipes.xml.h:14 hacks/config/polyhedra.xml.h:118
+#: hacks/config/pipes.xml.h:15 hacks/config/polyhedra.xml.h:118
 #: hacks/config/polytopes.xml.h:18 hacks/config/providence.xml.h:4
 #: 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/polytopes.xml.h:18 hacks/config/providence.xml.h:4
 #: hacks/config/pulsar.xml.h:14 hacks/config/queens.xml.h:3
 #: hacks/config/rubik.xml.h:6 hacks/config/sballs.xml.h:12
@@ -1633,15 +1638,16 @@ msgid "Show Frames-per-Second"
 msgstr "Vis billeder/sek."
 
 #: hacks/config/antspotlight.xml.h:1
 msgstr "Vis billeder/sek."
 
 #: hacks/config/antspotlight.xml.h:1
-#, fuzzy
 msgid "AntSpotlight"
 msgid "AntSpotlight"
-msgstr "Kighul"
+msgstr "MyreSpotlight"
 
 #: 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: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 ""
+"Myrespotlight tegner en myre (med en hovedlygte) som går på toppen af et "
+"billede af dit skrivebord eller et andet billede. Skrevet af Blair Tennessy."
 
 #: hacks/config/apollonian.xml.h:1
 msgid "Apollonian"
 
 #: hacks/config/apollonian.xml.h:1
 msgid "Apollonian"
@@ -1677,11 +1683,11 @@ msgstr "Overfladisk"
 
 #: hacks/config/apple2.xml.h:1
 msgid "Apple ]["
 
 #: hacks/config/apple2.xml.h:1
 msgid "Apple ]["
-msgstr ""
+msgstr "Apple ]["
 
 #: hacks/config/apple2.xml.h:2
 msgid "Basic Programming Mode"
 
 #: hacks/config/apple2.xml.h:2
 msgid "Basic Programming Mode"
-msgstr ""
+msgstr "Basal programmerings-tilstand"
 
 #: hacks/config/apple2.xml.h:3 hacks/config/halo.xml.h:8
 #: hacks/config/imsmap.xml.h:11
 
 #: hacks/config/apple2.xml.h:3 hacks/config/halo.xml.h:8
 #: hacks/config/imsmap.xml.h:11
@@ -1699,19 +1705,25 @@ msgid ""
 "res mode!) In \"Basic Programming Mode\", a simulated user types in a BASIC "
 "program and runs it. By Trevor Blackwell."
 msgstr ""
 "res mode!) In \"Basic Programming Mode\", a simulated user types in a BASIC "
 "program and runs it. By Trevor Blackwell."
 msgstr ""
+"Simulerer en original Apple ][ Plus maskine i al dens 1979-glans. Den "
+"gengiver også udseendet af et farve tv fra den samme periode. I \"Tekst-"
+"tilstand\", viser den uddata fra en kommando (fx. \"fortune\"). I \"Diasshow-"
+"tilstand\", vælger den et antal billeder fra billedkilden, som du har "
+"konfigureret for pauseskærmen, og viser dem under hensyn til Apple ]['s "
+"begrænsede skærmudstyr (seks tilgængelige farver i højopløsnings-"
+"tilstanden!). I \"Basal programmerings-tilstand\", skriver en simuleret "
+"bruger et BASIC-program og kører det. Af Trevor Blackwell."
 
 #: hacks/config/apple2.xml.h:5
 
 #: hacks/config/apple2.xml.h:5
-#, fuzzy
 msgid "Slideshow Mode"
 msgid "Slideshow Mode"
-msgstr "Seuss-tilstand"
+msgstr "Diasshow-tilstand"
 
 #: hacks/config/apple2.xml.h:6
 
 #: hacks/config/apple2.xml.h:6
-#, fuzzy
 msgid "Text Mode"
 msgid "Text Mode"
-msgstr "Tekstfil"
+msgstr "Tekst-tilstand"
 
 #: hacks/config/apple2.xml.h:7 hacks/config/fontglide.xml.h:15
 
 #: hacks/config/apple2.xml.h:7 hacks/config/fontglide.xml.h:15
-#: hacks/config/noseguy.xml.h:7 hacks/config/phosphor.xml.h:9
+#: hacks/config/noseguy.xml.h:8 hacks/config/phosphor.xml.h:10
 #: hacks/config/starwars.xml.h:17
 msgid "Text Program"
 msgstr "Tekstprogram"
 #: hacks/config/starwars.xml.h:17
 msgid "Text Program"
 msgstr "Tekstprogram"
@@ -1761,8 +1773,8 @@ msgstr "Sky"
 #: hacks/config/glblur.xml.h:15 hacks/config/glplanet.xml.h:9
 #: hacks/config/glsnake.xml.h:13 hacks/config/gltext.xml.h:14
 #: hacks/config/menger.xml.h:17 hacks/config/mismunch.xml.h:11
 #: hacks/config/glblur.xml.h:15 hacks/config/glplanet.xml.h:9
 #: hacks/config/glsnake.xml.h:13 hacks/config/gltext.xml.h:14
 #: hacks/config/menger.xml.h:17 hacks/config/mismunch.xml.h:11
-#: hacks/config/molecule.xml.h:23 hacks/config/munch.xml.h:8
-#: hacks/config/sierpinski3d.xml.h:9 hacks/config/speedmine.xml.h:14
+#: hacks/config/molecule.xml.h:23 hacks/config/munch.xml.h:9
+#: hacks/config/sierpinski3d.xml.h:9 hacks/config/speedmine.xml.h:15
 #: hacks/config/spheremonics.xml.h:21 hacks/config/sproingies.xml.h:7
 #: hacks/config/stairs.xml.h:4 hacks/config/stonerview.xml.h:2
 #: hacks/config/superquadrics.xml.h:9
 #: hacks/config/spheremonics.xml.h:21 hacks/config/sproingies.xml.h:7
 #: hacks/config/stairs.xml.h:4 hacks/config/stonerview.xml.h:2
 #: hacks/config/superquadrics.xml.h:9
@@ -1797,7 +1809,7 @@ msgstr "Hvalfart"
 #: hacks/config/moebius.xml.h:11 hacks/config/molecule.xml.h:26
 #: hacks/config/polyhedra.xml.h:173 hacks/config/pulsar.xml.h:20
 #: hacks/config/sballs.xml.h:18 hacks/config/sierpinski3d.xml.h:12
 #: hacks/config/moebius.xml.h:11 hacks/config/molecule.xml.h:26
 #: hacks/config/polyhedra.xml.h:173 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/speedmine.xml.h:19 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"
 #: 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"
@@ -1848,7 +1860,7 @@ msgstr "Udfyldte kurver"
 #: 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/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/spiral.xml.h:4 hacks/config/squiral.xml.h:7
 #: hacks/config/superquadrics.xml.h:5 hacks/config/t3d.xml.h:7
 #: hacks/config/twang.xml.h:5 hacks/config/wander.xml.h:8
 #: hacks/config/xmountains.xml.h:17
 #: hacks/config/superquadrics.xml.h:5 hacks/config/t3d.xml.h:7
 #: hacks/config/twang.xml.h:5 hacks/config/wander.xml.h:8
 #: hacks/config/xmountains.xml.h:17
@@ -1863,7 +1875,8 @@ msgstr "Ignorér skærmkanter"
 msgid "Inward"
 msgstr "Indad"
 
 msgid "Inward"
 msgstr "Indad"
 
-#: hacks/config/attraction.xml.h:14
+#. #### -graphmode [none]
+#: hacks/config/attraction.xml.h:15
 msgid ""
 "Like qix, this uses a simple simple motion model to generate many different "
 "display modes. The control points attract each other up to a certain "
 msgid ""
 "Like qix, this uses a simple simple motion model to generate many different "
 "display modes. The control points attract each other up to a certain "
@@ -1877,39 +1890,40 @@ msgid ""
 "on Lisp code by John Pezaris."
 msgstr ""
 "Ligesom qix bruger dette en simpel bevægelsesmodel til at generere mange "
 "on Lisp code by John Pezaris."
 msgstr ""
 "Ligesom qix bruger dette en simpel bevægelsesmodel til at generere mange "
-"forskellige fremvisningstilstande. Kontrolpunkterne tiltrækker hinanden "
-"indtil en vis afstand og begynder derefter at frastøde hinanden. "
-"Tiltrækningen/frastødningen er proportional til afstanden mellem de to "
-"partikler ligesom ved de stærke og svage atomare kræfter. En af de mest "
-"interessante måder at kigge på denne pauseskærm er simpelthen som hoppende "
-"bolde fordi deres bevægelser og samspil er så mærkelige. Nogle gange kommer "
-"to bolde ind i et tæt kredsløb om hinanden som så afbrydes af en tredje "
-"eller af skærmens kant. Det ser ret kaotisk ud. Skrevet af Jamie Zawinski, "
-"baseret på Lisp-kode af John Pezaris."
-
-#: hacks/config/attraction.xml.h:15 hacks/config/deluxe.xml.h:5
+"forskellige skærmtilstande. Kontrolpunkterne tiltrækker hinanden indtil en "
+"vis afstand og begynder derefter at frastøde hinanden. Tiltrækningen/"
+"frastødningen er proportional til afstanden mellem de to partikler ligesom "
+"ved de stærke og svage atomare kræfter. En af de mest interessante måder at "
+"kigge på denne pauseskærm er simpelthen som hoppende bolde fordi deres "
+"bevægelser og samspil er så mærkelige. Nogle gange kommer to bolde ind i et "
+"tæt kredsløb om hinanden som så afbrydes af en tredje eller af skærmens "
+"kant. Det ser ret kaotisk ud. Skrevet af Jamie Zawinski, baseret på Lisp-"
+"kode af John Pezaris."
+
+#: hacks/config/attraction.xml.h:16 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:10
 msgid "Lines"
 msgstr "Linjer"
 
 #: hacks/config/lmorph.xml.h:7 hacks/config/pedal.xml.h:5
 #: hacks/config/starfish.xml.h:4 hacks/config/whirlygig.xml.h:10
 msgid "Lines"
 msgstr "Linjer"
 
-#: hacks/config/attraction.xml.h:16 hacks/config/blocktube.xml.h:5
+#: hacks/config/attraction.xml.h:17 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/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/mismunch.xml.h:3
-#: 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 hacks/config/spheremonics.xml.h:7
-#: hacks/config/wander.xml.h:10 hacks/config/whirlwindwarp.xml.h:3
+#: hacks/config/flow.xml.h:6 hacks/config/fontglide.xml.h:8
+#: hacks/config/galaxy.xml.h:5 hacks/config/juggle.xml.h:6
+#: 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/mismunch.xml.h:3 hacks/config/munch.xml.h:5
+#: 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
+#: hacks/config/spheremonics.xml.h:7 hacks/config/wander.xml.h:10
+#: hacks/config/whirlwindwarp.xml.h:3
 msgid "Long"
 msgstr "Lang"
 
 msgid "Long"
 msgstr "Lang"
 
-#: hacks/config/attraction.xml.h:17 hacks/config/ccurve.xml.h:10
+#: hacks/config/attraction.xml.h:18 hacks/config/ccurve.xml.h:10
 #: 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/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
@@ -1920,64 +1934,65 @@ msgstr "Lang"
 #: 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/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/spiral.xml.h:5 hacks/config/squiral.xml.h:9
 #: 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 "Lav"
 
 #: 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 "Lav"
 
-#: hacks/config/attraction.xml.h:20
+#: hacks/config/attraction.xml.h:21
 msgid "Orbital Mode"
 msgstr "Kredsløbstilstand"
 
 msgid "Orbital Mode"
 msgstr "Kredsløbstilstand"
 
-#: hacks/config/attraction.xml.h:21
+#: hacks/config/attraction.xml.h:22
 msgid "Outward"
 msgstr "Udad"
 
 msgid "Outward"
 msgstr "Udad"
 
-#: hacks/config/attraction.xml.h:22
+#: hacks/config/attraction.xml.h:23
 msgid "Polygons"
 msgstr "Polygoner"
 
 msgid "Polygons"
 msgstr "Polygoner"
 
-#: hacks/config/attraction.xml.h:23 hacks/config/fuzzyflakes.xml.h:13
+#: hacks/config/attraction.xml.h:24 hacks/config/fuzzyflakes.xml.h:13
 #: hacks/config/spotlight.xml.h:3 hacks/config/xplanet.xml.h:55
 msgid "Radius"
 msgstr "Radius"
 
 #: hacks/config/spotlight.xml.h:3 hacks/config/xplanet.xml.h:55
 msgid "Radius"
 msgstr "Radius"
 
-#: hacks/config/attraction.xml.h:24
+#: hacks/config/attraction.xml.h:25
 msgid "Repulsion Threshold"
 msgstr "Frastødningstærskel"
 
 msgid "Repulsion Threshold"
 msgstr "Frastødningstærskel"
 
-#: hacks/config/attraction.xml.h:25 hacks/config/blocktube.xml.h:7
+#: hacks/config/attraction.xml.h:26 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/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/metaballs.xml.h:12 hacks/config/mismunch.xml.h:8
-#: 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/flow.xml.h:9 hacks/config/galaxy.xml.h:9
+#: hacks/config/klein.xml.h:5 hacks/config/laser.xml.h:9
+#: hacks/config/menger.xml.h:14 hacks/config/metaballs.xml.h:12
+#: hacks/config/mismunch.xml.h:8 hacks/config/munch.xml.h:7
+#: 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 "Kort"
 
 msgid "Short"
 msgstr "Kort"
 
-#: hacks/config/attraction.xml.h:29
+#: hacks/config/attraction.xml.h:30
 msgid "Splines"
 msgstr "Kurver"
 
 msgid "Splines"
 msgstr "Kurver"
 
-#: hacks/config/attraction.xml.h:30 hacks/config/fireflies.xml.h:42
+#: hacks/config/attraction.xml.h:31 hacks/config/fireflies.xml.h:42
 msgid "Tails"
 msgstr "Haler"
 
 msgid "Tails"
 msgstr "Haler"
 
-#: hacks/config/attraction.xml.h:31 hacks/config/euler2d.xml.h:16
-#: hacks/config/juggle.xml.h:9
+#: hacks/config/attraction.xml.h:32 hacks/config/euler2d.xml.h:16
+#: hacks/config/juggle.xml.h:10
 msgid "Trail Length"
 msgstr "Sporlængde"
 
 #: hacks/config/atunnel.xml.h:1
 msgid "Atunnel"
 msgid "Trail Length"
 msgstr "Sporlængde"
 
 #: hacks/config/atunnel.xml.h:1
 msgid "Atunnel"
-msgstr ""
+msgstr "Entunnel"
 
 #: hacks/config/atunnel.xml.h:2
 #, fuzzy
 
 #: hacks/config/atunnel.xml.h:2
 #, fuzzy
@@ -2002,39 +2017,40 @@ msgid "Untextured"
 msgstr "Uden tekstur"
 
 #: hacks/config/atunnel.xml.h:9
 msgstr "Uden tekstur"
 
 #: hacks/config/atunnel.xml.h:9
-#, fuzzy
 msgid "Use light"
 msgstr "Benyt oplysning"
 
 #: hacks/config/barcode.xml.h:1
 msgid "Use light"
 msgstr "Benyt oplysning"
 
 #: hacks/config/barcode.xml.h:1
-#, fuzzy
 msgid "Barcode"
 msgid "Barcode"
-msgstr "Gennemse"
+msgstr "Stregkode"
 
 #: hacks/config/barcode.xml.h:2
 msgid "Barcode Clock (24 Hour)"
 
 #: hacks/config/barcode.xml.h:2
 msgid "Barcode Clock (24 Hour)"
-msgstr ""
+msgstr "Stregkodeklokke (24 timer)"
 
 #: hacks/config/barcode.xml.h:3
 msgid "Barcode Clock (AM/PM)"
 
 #: hacks/config/barcode.xml.h:3
 msgid "Barcode Clock (AM/PM)"
-msgstr ""
+msgstr "Stregkodeklokke (AM/PM)"
 
 #: hacks/config/barcode.xml.h:5
 msgid "Scrolling Barcodes"
 
 #: hacks/config/barcode.xml.h:5
 msgid "Scrolling Barcodes"
-msgstr ""
+msgstr "Rullende stregkoder"
 
 #: 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/barcode.xml.h:8
 msgid ""
 "This draws a random sequence of colorful barcodes scrolling across your "
 "screen. CONSUME! By Dan Bornstein."
 msgstr ""
+"Dette tegner en tilfældig sekvens af farverige stregkoder, der ruller over "
+"skærmen. FORBRUG! Af Dan Bornstein."
 
 # se næste tekst for forklaring
 #: hacks/config/blaster.xml.h:1
 msgid "Blaster"
 msgstr "Kamp"
 
 
 # se næste tekst for forklaring
 #: hacks/config/blaster.xml.h:1
 msgid "Blaster"
 msgstr "Kamp"
 
-#: hacks/config/blaster.xml.h:2
+#. #### -mother_ship_color1 [white]
+#: hacks/config/blaster.xml.h:3
 msgid ""
 "Draws a simulation of flying space-combat robots (cleverly disguised as "
 "colored circles) doing battle in front of a moving star field. Written by "
 msgid ""
 "Draws a simulation of flying space-combat robots (cleverly disguised as "
 "colored circles) doing battle in front of a moving star field. Written by "
@@ -2044,32 +2060,31 @@ msgstr ""
 "farvede cirkler) der kæmper foran en stjernehimmel i bevægelse. Skrevet af "
 "Jonathan Lin."
 
 "farvede cirkler) der kæmper foran en stjernehimmel i bevægelse. Skrevet af "
 "Jonathan Lin."
 
-#: hacks/config/blaster.xml.h:5 hacks/config/penetrate.xml.h:4
+#: hacks/config/blaster.xml.h:6 hacks/config/penetrate.xml.h:4
 msgid "Lasers"
 msgstr "Lasere"
 
 msgid "Lasers"
 msgstr "Lasere"
 
-#: hacks/config/blaster.xml.h:7
+#: hacks/config/blaster.xml.h:8
 msgid "Robots"
 msgstr "Robotter"
 
 msgid "Robots"
 msgstr "Robotter"
 
-#: hacks/config/blaster.xml.h:10 hacks/config/glplanet.xml.h:11
+#: hacks/config/blaster.xml.h:11 hacks/config/glplanet.xml.h:11
 msgid "Stars"
 msgstr "Stjerne"
 
 #: hacks/config/blinkbox.xml.h:1
 msgid "BlinkBox"
 msgid "Stars"
 msgstr "Stjerne"
 
 #: hacks/config/blinkbox.xml.h:1
 msgid "BlinkBox"
-msgstr ""
+msgstr "BlinkendeBoks"
 
 #: hacks/config/blinkbox.xml.h:2
 
 #: hacks/config/blinkbox.xml.h:2
-#, fuzzy
 msgid "Box Size"
 msgid "Box Size"
-msgstr "Maks. størrelse"
+msgstr "Boksstørrelse"
 
 #: hacks/config/blinkbox.xml.h:3
 msgid "Dissolve"
 
 #: hacks/config/blinkbox.xml.h:3
 msgid "Dissolve"
-msgstr ""
+msgstr "Blænde over"
 
 
-#: hacks/config/blinkbox.xml.h:4 hacks/config/phosphor.xml.h:3
+#: hacks/config/blinkbox.xml.h:4 hacks/config/phosphor.xml.h:4
 msgid "Fade"
 msgstr "Falmen"
 
 msgid "Fade"
 msgstr "Falmen"
 
@@ -2078,6 +2093,8 @@ 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 ""
 "Shows a ball contained inside of a bounding box. Colored blocks blink in "
 "when the ball hits the edges. Written by Jeremy English."
 msgstr ""
+"Viser en bold inden i en kasse. Farvede blokke blinker når bolden rammer "
+"kanterne. Skrevet af Jeremy English."
 
 #: hacks/config/blitspin.xml.h:1
 msgid "90 deg Rotation Speed"
 
 #: hacks/config/blitspin.xml.h:1
 msgid "90 deg Rotation Speed"
@@ -2122,31 +2139,31 @@ msgstr ""
 
 #: hacks/config/blocktube.xml.h:1
 msgid "BlockTube"
 
 #: hacks/config/blocktube.xml.h:1
 msgid "BlockTube"
-msgstr ""
+msgstr "BlokTube"
 
 #: hacks/config/blocktube.xml.h:2
 msgid "Color Change Time"
 
 #: hacks/config/blocktube.xml.h:2
 msgid "Color Change Time"
-msgstr ""
+msgstr "Farveskiftstid"
 
 #: hacks/config/blocktube.xml.h:3
 msgid "Color Hold Time"
 
 #: hacks/config/blocktube.xml.h:3
 msgid "Color Hold Time"
-msgstr ""
+msgstr "Farveholdtid"
 
 #: hacks/config/blocktube.xml.h:6
 
 #: hacks/config/blocktube.xml.h:6
-#, fuzzy
 msgid "Reflective Blocks"
 msgid "Reflective Blocks"
-msgstr "Reflektioner"
+msgstr "Reflektiveblokke"
 
 #: hacks/config/blocktube.xml.h:10
 
 #: hacks/config/blocktube.xml.h:10
-#, fuzzy
 msgid "Solid Blocks"
 msgid "Solid Blocks"
-msgstr "Ensfarvet gulv"
+msgstr "Ensfarvede blokke"
 
 #: 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/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 ""
+"Denne pauseskærm tegner en hvirvlende, faldende tunnel af reflektive tynde "
+"stykker. De skifter fra farvetone til farvetone. Skrevet af Lars R. Damerow."
 
 #: hacks/config/bouboule.xml.h:1
 msgid "Bouboule"
 
 #: hacks/config/bouboule.xml.h:1
 msgid "Bouboule"
@@ -2173,6 +2190,7 @@ msgstr ""
 #: hacks/config/bouncingcow.xml.h:1
 msgid "A Cow. A Trampoline. Together, they fight crime. By Jamie Zawinski."
 msgstr ""
 #: hacks/config/bouncingcow.xml.h:1
 msgid "A Cow. A Trampoline. Together, they fight crime. By Jamie Zawinski."
 msgstr ""
+"En ko, en trampolin, sammen bekæmper de kriminalitet. Af 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/bouncingcow.xml.h:2 hacks/config/boxed.xml.h:1
 #: hacks/config/cubestorm.xml.h:1 hacks/config/flyingtoasters.xml.h:3
@@ -2188,35 +2206,31 @@ msgstr "Animationshastighed"
 
 #: hacks/config/bouncingcow.xml.h:3
 msgid "Beefy Cow"
 
 #: hacks/config/bouncingcow.xml.h:3
 msgid "Beefy Cow"
-msgstr ""
+msgstr "Bøffet ko"
 
 #: hacks/config/bouncingcow.xml.h:4
 
 #: hacks/config/bouncingcow.xml.h:4
-#, fuzzy
 msgid "Bounce Speed"
 msgid "Bounce Speed"
-msgstr "Løsningsfart"
+msgstr "Hoppehastighed"
 
 #: hacks/config/bouncingcow.xml.h:5
 msgid "BouncingCow"
 
 #: hacks/config/bouncingcow.xml.h:5
 msgid "BouncingCow"
-msgstr ""
+msgstr "HoppendeKo"
 
 #: hacks/config/bouncingcow.xml.h:7
 msgid "Herd"
 
 #: hacks/config/bouncingcow.xml.h:7
 msgid "Herd"
-msgstr ""
+msgstr "Flok"
 
 #: hacks/config/bouncingcow.xml.h:8
 
 #: hacks/config/bouncingcow.xml.h:8
-#, fuzzy
 msgid "Moo"
 msgid "Moo"
-msgstr "Mono"
+msgstr "Muu"
 
 #: hacks/config/bouncingcow.xml.h:9
 
 #: hacks/config/bouncingcow.xml.h:9
-#, fuzzy
 msgid "Number of Cows"
 msgid "Number of Cows"
-msgstr "Antal farver"
+msgstr "Antal er"
 
 #: hacks/config/bouncingcow.xml.h:11
 
 #: hacks/config/bouncingcow.xml.h:11
-#, fuzzy
 msgid "Wireframe Cow"
 msgid "Wireframe Cow"
-msgstr "Rammemodel"
+msgstr "Rammemodelko"
 
 # se næste tekst for forklaring
 #: hacks/config/boxed.xml.h:2
 
 # se næste tekst for forklaring
 #: hacks/config/boxed.xml.h:2
@@ -2234,9 +2248,8 @@ msgstr ""
 #: hacks/config/boxed.xml.h:5 hacks/config/cubestorm.xml.h:5
 #: hacks/config/fontglide.xml.h:9 hacks/config/glknots.xml.h:6
 #: hacks/config/polyhedra.xml.h:85
 #: hacks/config/boxed.xml.h:5 hacks/config/cubestorm.xml.h:5
 #: hacks/config/fontglide.xml.h:9 hacks/config/glknots.xml.h:6
 #: hacks/config/polyhedra.xml.h:85
-#, fuzzy
 msgid "Motion Speed"
 msgid "Motion Speed"
-msgstr "Rotationshastighed"
+msgstr "Bevægelseshastighed"
 
 #: hacks/config/braid.xml.h:1
 msgid "Braid"
 
 #: hacks/config/braid.xml.h:1
 msgid "Braid"
@@ -2261,7 +2274,7 @@ msgstr ""
 #: 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/mismunch.xml.h:1 hacks/config/moire.xml.h:3
 #: 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/mismunch.xml.h:1 hacks/config/moire.xml.h:3
-#: hacks/config/molecule.xml.h:9 hacks/config/munch.xml.h:2
+#: hacks/config/molecule.xml.h:9 hacks/config/munch.xml.h:3
 #: hacks/config/nerverot.xml.h:8 hacks/config/pedal.xml.h:3
 #: hacks/config/penrose.xml.h:5 hacks/config/polyhedra.xml.h:17
 #: hacks/config/polyominoes.xml.h:1 hacks/config/rorschach.xml.h:3
 #: hacks/config/nerverot.xml.h:8 hacks/config/pedal.xml.h:3
 #: hacks/config/penrose.xml.h:5 hacks/config/polyhedra.xml.h:17
 #: hacks/config/polyominoes.xml.h:1 hacks/config/rorschach.xml.h:3
@@ -2296,7 +2309,7 @@ msgstr "AmigaDOS"
 
 #: hacks/config/bsod.xml.h:4
 msgid "Apple II"
 
 #: hacks/config/bsod.xml.h:4
 msgid "Apple II"
-msgstr ""
+msgstr "Apple II"
 
 #: hacks/config/bsod.xml.h:5
 msgid "Atari"
 
 #: hacks/config/bsod.xml.h:5
 msgid "Atari"
@@ -2323,20 +2336,19 @@ msgstr ""
 
 #: hacks/config/bsod.xml.h:10
 msgid "HPUX"
 
 #: hacks/config/bsod.xml.h:10
 msgid "HPUX"
-msgstr ""
+msgstr "HPUX"
 
 #: hacks/config/bsod.xml.h:11
 msgid "HVX/GCOS6"
 
 #: hacks/config/bsod.xml.h:11
 msgid "HVX/GCOS6"
-msgstr ""
+msgstr "HVX/GCOS6"
 
 #: hacks/config/bsod.xml.h:12
 
 #: hacks/config/bsod.xml.h:12
-#, fuzzy
 msgid "Linux"
 msgid "Linux"
-msgstr "Sparc Linux"
+msgstr "Linux"
 
 #: hacks/config/bsod.xml.h:13
 msgid "MS-DOS"
 
 #: hacks/config/bsod.xml.h:13
 msgid "MS-DOS"
-msgstr ""
+msgstr "MS-DOS"
 
 #: hacks/config/bsod.xml.h:14
 msgid "Mac Bomb"
 
 #: hacks/config/bsod.xml.h:14
 msgid "Mac Bomb"
@@ -2344,7 +2356,7 @@ msgstr "Mac-bombe"
 
 #: hacks/config/bsod.xml.h:15
 msgid "MacOS X"
 
 #: hacks/config/bsod.xml.h:15
 msgid "MacOS X"
-msgstr ""
+msgstr "MacOS X"
 
 #: hacks/config/bsod.xml.h:16
 msgid "MacsBug"
 
 #: hacks/config/bsod.xml.h:16
 msgid "MacsBug"
@@ -2356,7 +2368,7 @@ msgstr "NCD X Terminal"
 
 #: hacks/config/bsod.xml.h:18
 msgid "OS/390"
 
 #: hacks/config/bsod.xml.h:18
 msgid "OS/390"
-msgstr ""
+msgstr "OS/390"
 
 #: hacks/config/bsod.xml.h:19
 msgid "SCO"
 
 #: hacks/config/bsod.xml.h:19
 msgid "SCO"
@@ -2376,7 +2388,7 @@ msgstr "Sparc Linux"
 
 #: hacks/config/bsod.xml.h:23
 msgid "VMS"
 
 #: hacks/config/bsod.xml.h:23
 msgid "VMS"
-msgstr ""
+msgstr "VMS"
 
 #: hacks/config/bsod.xml.h:24
 msgid "Windows 2000"
 
 #: hacks/config/bsod.xml.h:24
 msgid "Windows 2000"
@@ -2445,7 +2457,8 @@ msgstr ""
 "opstår, og som de kommer tættere på hinanden, smelter de sammen til større "
 "bobler der til sidst brister. Skrevet af James Macnicol."
 
 "opstår, og som de kommer tættere på hinanden, smelter de sammen til større "
 "bobler der til sidst brister. Skrevet af James Macnicol."
 
-#: hacks/config/bumps.xml.h:1
+#. #### -invert
+#: hacks/config/bumps.xml.h:2
 msgid ""
 "A bit like `Spotlight', except that instead of merely exposing part of your "
 "desktop, it creates a bump map from it. Basically, it 3D-izes a roaming "
 msgid ""
 "A bit like `Spotlight', except that instead of merely exposing part of your "
 "desktop, it creates a bump map from it. Basically, it 3D-izes a roaming "
@@ -2456,7 +2469,7 @@ msgstr ""
 "omstrejfende del af skrivebordet om til 3d på basis af farveintensiteten. "
 "Skrevet af Shane Smit."
 
 "omstrejfende del af skrivebordet om til 3d på basis af farveintensiteten. "
 "Skrevet af Shane Smit."
 
-#: hacks/config/bumps.xml.h:2
+#: hacks/config/bumps.xml.h:3
 msgid "Bumps"
 msgstr "Bump"
 
 msgid "Bumps"
 msgstr "Bump"
 
@@ -2552,7 +2565,7 @@ msgstr "Cellestørrelse"
 
 #: hacks/config/cloudlife.xml.h:2
 msgid "CloudLife"
 
 #: hacks/config/cloudlife.xml.h:2
 msgid "CloudLife"
-msgstr ""
+msgstr "Skyliv"
 
 #: hacks/config/cloudlife.xml.h:4
 msgid ""
 
 #: hacks/config/cloudlife.xml.h:4
 msgid ""
@@ -2575,7 +2588,7 @@ msgstr "Maks. størrelse"
 
 #: hacks/config/cloudlife.xml.h:10
 msgid "Old"
 
 #: hacks/config/cloudlife.xml.h:10
 msgid "Old"
-msgstr ""
+msgstr "Gammel"
 
 #: hacks/config/cloudlife.xml.h:14
 #, fuzzy
 
 #: hacks/config/cloudlife.xml.h:14
 #, fuzzy
@@ -2632,7 +2645,7 @@ msgstr "Koraller"
 msgid "Dense"
 msgstr "Tæt"
 
 msgid "Dense"
 msgstr "Tæt"
 
-#: hacks/config/coral.xml.h:10 hacks/config/squiral.xml.h:13
+#: hacks/config/coral.xml.h:10 hacks/config/squiral.xml.h:14
 msgid "Seeds"
 msgstr "Frø"
 
 msgid "Seeds"
 msgstr "Frø"
 
@@ -2641,11 +2654,11 @@ msgid ""
 "Simulates coral growth, albeit somewhat slowly. Written by Frederick Roeber."
 msgstr "Simulerer koralvækst, dog noget langsomt. Skrevet af Frederick Röber."
 
 "Simulates coral growth, albeit somewhat slowly. Written by Frederick Roeber."
 msgstr "Simulerer koralvækst, dog noget langsomt. Skrevet af Frederick Röber."
 
-#: hacks/config/coral.xml.h:13 hacks/config/gflux.xml.h:13
+#: hacks/config/coral.xml.h:13 hacks/config/gflux.xml.h:14
 #: hacks/config/glblur.xml.h:16 hacks/config/glmatrix.xml.h:19
 #: hacks/config/imsmap.xml.h:13 hacks/config/lavalite.xml.h:29
 #: hacks/config/pyro.xml.h:14 hacks/config/qix.xml.h:21
 #: hacks/config/glblur.xml.h:16 hacks/config/glmatrix.xml.h:19
 #: hacks/config/imsmap.xml.h:13 hacks/config/lavalite.xml.h:29
 #: hacks/config/pyro.xml.h:14 hacks/config/qix.xml.h:21
-#: hacks/config/squiral.xml.h:15 hacks/config/xearth.xml.h:24
+#: hacks/config/squiral.xml.h:16 hacks/config/xearth.xml.h:24
 #: hacks/config/xmatrix.xml.h:17
 msgid "Sparse"
 msgstr "Få"
 #: hacks/config/xmatrix.xml.h:17
 msgid "Sparse"
 msgstr "Få"
@@ -2667,7 +2680,8 @@ msgstr ""
 msgid "Critical"
 msgstr "Kritisk"
 
 msgid "Critical"
 msgstr "Kritisk"
 
-#: hacks/config/critical.xml.h:2
+#. #### -trail [50]
+#: hacks/config/critical.xml.h:3
 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."
 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."
@@ -2681,7 +2695,7 @@ msgid "Center on Screen"
 msgstr "Centrér på skærmen"
 
 #: hacks/config/crystal.xml.h:2 hacks/config/deluxe.xml.h:1
 msgstr "Centrér på skærmen"
 
 #: hacks/config/crystal.xml.h:2 hacks/config/deluxe.xml.h:1
-#: hacks/config/fadeplot.xml.h:1 hacks/config/flow.xml.h:3
+#: hacks/config/fadeplot.xml.h:1 hacks/config/flow.xml.h:1
 #: hacks/config/galaxy.xml.h:1 hacks/config/glforestfire.xml.h:1
 #: hacks/config/grav.xml.h:1 hacks/config/julia.xml.h:1
 #: hacks/config/laser.xml.h:1 hacks/config/lisa.xml.h:1
 #: hacks/config/galaxy.xml.h:1 hacks/config/glforestfire.xml.h:1
 #: hacks/config/grav.xml.h:1 hacks/config/julia.xml.h:1
 #: hacks/config/laser.xml.h:1 hacks/config/lisa.xml.h:1
@@ -2692,7 +2706,7 @@ msgstr "Centrér på skærmen"
 #: hacks/config/shadebobs.xml.h:1 hacks/config/sierpinski.xml.h:1
 #: hacks/config/slip.xml.h:1 hacks/config/spiral.xml.h:1
 #: hacks/config/sproingies.xml.h:1 hacks/config/superquadrics.xml.h:1
 #: hacks/config/shadebobs.xml.h:1 hacks/config/sierpinski.xml.h:1
 #: hacks/config/slip.xml.h:1 hacks/config/spiral.xml.h:1
 #: hacks/config/sproingies.xml.h:1 hacks/config/superquadrics.xml.h:1
-#: hacks/config/swirl.xml.h:1 hacks/config/worm.xml.h:2
+#: hacks/config/swirl.xml.h:1 hacks/config/worm.xml.h:3
 msgid "Count"
 msgstr "Antal"
 
 msgid "Count"
 msgstr "Antal"
 
@@ -2852,6 +2866,8 @@ msgid ""
 "Draws a series of rotating 3D boxes that intersect each other and eventually "
 "fill space. Written by Jamie Zawinski."
 msgstr ""
 "Draws a series of rotating 3D boxes that intersect each other and eventually "
 "fill space. Written by Jamie Zawinski."
 msgstr ""
+"Tegner en serie af roterende 3d-bokse der overlapper hinanden og til sidst "
+"udfylder rummet. Skrevet af Jamie Zawinski."
 
 #: hacks/config/cubestorm.xml.h:6
 #, fuzzy
 
 #: hacks/config/cubestorm.xml.h:6
 #, fuzzy
@@ -2992,7 +3008,8 @@ msgstr "Maks. dybde"
 msgid "Min Size"
 msgstr "Min. størrelse"
 
 msgid "Min Size"
 msgstr "Min. størrelse"
 
-#: hacks/config/deco.xml.h:9
+#. #### -cycle-delay [1000000]
+#: hacks/config/deco.xml.h:10
 msgid ""
 "This one subdivides and colors rectangles randomly. It looks kind of like "
 "Brady-Bunch-era rec-room wall paneling. (Raven says: ``this screensaver is "
 msgid ""
 "This one subdivides and colors rectangles randomly. It looks kind of like "
 "Brady-Bunch-era rec-room wall paneling. (Raven says: ``this screensaver is "
@@ -3004,7 +3021,7 @@ msgstr ""
 "maling af\"). Skrevet af Jamie Zawinski, inspiret af Java-kode af Michael "
 "Bayne."
 
 "maling af\"). Skrevet af Jamie Zawinski, inspiret af Java-kode af Michael "
 "Bayne."
 
-#: hacks/config/deco.xml.h:11 hacks/config/rd-bomb.xml.h:23
+#: hacks/config/deco.xml.h:12 hacks/config/rd-bomb.xml.h:23
 #: hacks/config/whirlygig.xml.h:20 hacks/config/xearth.xml.h:33
 #: hacks/config/zoom.xml.h:10
 msgid "x"
 #: hacks/config/whirlygig.xml.h:20 hacks/config/xearth.xml.h:33
 #: hacks/config/zoom.xml.h:10
 msgid "x"
@@ -3161,7 +3178,7 @@ msgstr ""
 
 #: hacks/config/electricsheep.xml.h:3
 msgid "Frame Rate"
 
 #: hacks/config/electricsheep.xml.h:3
 msgid "Frame Rate"
-msgstr ""
+msgstr "Billedrate"
 
 # se næste tekst for forklaring - skærmen opdeles i felter der skydes
 # rundt mellem hinanden 
 
 # se næste tekst for forklaring - skærmen opdeles i felter der skydes
 # rundt mellem hinanden 
@@ -3172,15 +3189,15 @@ msgstr "Skydefart"
 
 #: hacks/config/electricsheep.xml.h:5
 msgid "Megabytes of Local Sheep Storage"
 
 #: hacks/config/electricsheep.xml.h:5
 msgid "Megabytes of Local Sheep Storage"
-msgstr ""
+msgstr "Antal megabyte af lokal fårelager"
 
 #: hacks/config/electricsheep.xml.h:6
 msgid "Nickname"
 
 #: hacks/config/electricsheep.xml.h:6
 msgid "Nickname"
-msgstr ""
+msgstr "Kælenavn"
 
 #: hacks/config/electricsheep.xml.h:7
 msgid "Repititions of each Sheep"
 
 #: hacks/config/electricsheep.xml.h:7
 msgid "Repititions of each Sheep"
-msgstr ""
+msgstr "Gentagelser af hvert får"
 
 #: hacks/config/electricsheep.xml.h:8
 #, fuzzy
 
 #: hacks/config/electricsheep.xml.h:8
 #, fuzzy
@@ -3189,7 +3206,7 @@ msgstr "Standard"
 
 #: hacks/config/electricsheep.xml.h:9
 msgid "URL"
 
 #: hacks/config/electricsheep.xml.h:9
 msgid "URL"
-msgstr ""
+msgstr "URL"
 
 # RETMIG: mating nets = mat?
 #: hacks/config/endgame.xml.h:1
 
 # RETMIG: mating nets = mat?
 #: hacks/config/endgame.xml.h:1
@@ -3206,23 +3223,23 @@ msgstr "Slutspil"
 
 #: hacks/config/engine.xml.h:1
 msgid "Audi Quattro (5 cylinders)"
 
 #: hacks/config/engine.xml.h:1
 msgid "Audi Quattro (5 cylinders)"
-msgstr ""
+msgstr "Audi Quattro (5 cylindere)"
 
 #: hacks/config/engine.xml.h:2
 msgid "BMW M3 (4 cylinders)"
 
 #: hacks/config/engine.xml.h:2
 msgid "BMW M3 (4 cylinders)"
-msgstr ""
+msgstr "BMW M3 (4 cylindere)"
 
 #: hacks/config/engine.xml.h:3
 msgid "BMW M5 (6 cylinders)"
 
 #: hacks/config/engine.xml.h:3
 msgid "BMW M5 (6 cylinders)"
-msgstr ""
+msgstr "BMW M5 (6 cylindere)"
 
 #: hacks/config/engine.xml.h:4
 msgid "Corvette Z06 (8 cylinders, V)"
 
 #: hacks/config/engine.xml.h:4
 msgid "Corvette Z06 (8 cylinders, V)"
-msgstr ""
+msgstr "Corvette Z06 (8 cylindere, V)"
 
 #: hacks/config/engine.xml.h:5
 msgid "Dodge Viper (10 cylinders, V)"
 
 #: hacks/config/engine.xml.h:5
 msgid "Dodge Viper (10 cylinders, V)"
-msgstr ""
+msgstr "Dodge Viper (10 cylindere, V)"
 
 #: hacks/config/engine.xml.h:6
 #, fuzzy
 
 #: hacks/config/engine.xml.h:6
 #, fuzzy
@@ -3239,32 +3256,31 @@ msgstr "Motor"
 
 #: hacks/config/engine.xml.h:9
 msgid "Honda Insight (3 cylinders)"
 
 #: hacks/config/engine.xml.h:9
 msgid "Honda Insight (3 cylinders)"
-msgstr ""
+msgstr "Honda Insight (3 cylindere)"
 
 #: hacks/config/engine.xml.h:10
 msgid "Jaguar XKE (12 cylinders, V)"
 
 #: hacks/config/engine.xml.h:10
 msgid "Jaguar XKE (12 cylinders, V)"
-msgstr ""
+msgstr "Jaguar XKE (12 cylindere, V)"
 
 #: hacks/config/engine.xml.h:11
 msgid "Porsche 911 (6 cylinders, flat)"
 
 #: hacks/config/engine.xml.h:11
 msgid "Porsche 911 (6 cylinders, flat)"
-msgstr ""
+msgstr "Porsche 911 (6 cylindere, flad)"
 
 #: hacks/config/engine.xml.h:12
 
 #: hacks/config/engine.xml.h:12
-#, fuzzy
 msgid "Random Engine"
 msgid "Random Engine"
-msgstr "Tilfældig"
+msgstr "Tilfældig motor"
 
 #: hacks/config/engine.xml.h:13
 msgid "Show Engine Name"
 
 #: hacks/config/engine.xml.h:13
 msgid "Show Engine Name"
-msgstr ""
+msgstr "Vis motornavn"
 
 #: hacks/config/engine.xml.h:18
 msgid "Subaru XT (6 cylinders, V)"
 
 #: hacks/config/engine.xml.h:18
 msgid "Subaru XT (6 cylinders, V)"
-msgstr ""
+msgstr "Subaru XT (6 cylindere, V)"
 
 #: hacks/config/engine.xml.h:19
 msgid "VW Beetle (4 cylinders, flat)"
 
 #: hacks/config/engine.xml.h:19
 msgid "VW Beetle (4 cylinders, flat)"
-msgstr ""
+msgstr "VW Beetle (4 cylindere, flad)"
 
 #: hacks/config/epicycle.xml.h:4
 msgid "Epicycle"
 
 #: hacks/config/epicycle.xml.h:4
 msgid "Epicycle"
@@ -3274,7 +3290,8 @@ msgstr "Epicykel"
 msgid "Harmonics"
 msgstr "Harmoniske"
 
 msgid "Harmonics"
 msgstr "Harmoniske"
 
-#: hacks/config/epicycle.xml.h:12
+#. #### -size_factor_max [2.05]
+#: hacks/config/epicycle.xml.h:13
 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, "
 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, "
@@ -3288,16 +3305,15 @@ msgstr ""
 
 #: hacks/config/eruption.xml.h:1
 msgid "An exposive version of XFlame. By W.P. van Paassen."
 
 #: hacks/config/eruption.xml.h:1
 msgid "An exposive version of XFlame. By W.P. van Paassen."
-msgstr ""
+msgstr "En eksplosiv version af XFlamme. Af W.P. van Paasen."
 
 #: hacks/config/eruption.xml.h:2
 msgid "Cooling factor"
 
 #: hacks/config/eruption.xml.h:2
 msgid "Cooling factor"
-msgstr ""
+msgstr "Kølefaktor"
 
 #: hacks/config/eruption.xml.h:4
 
 #: hacks/config/eruption.xml.h:4
-#, fuzzy
 msgid "Eruption"
 msgid "Eruption"
-msgstr "Udstansning"
+msgstr "Udbrud"
 
 #: hacks/config/eruption.xml.h:7 hacks/config/fluidballs.xml.h:9
 #: hacks/config/qix.xml.h:9 hacks/config/speedmine.xml.h:4
 
 #: hacks/config/eruption.xml.h:7 hacks/config/fluidballs.xml.h:9
 #: hacks/config/qix.xml.h:9 hacks/config/speedmine.xml.h:4
@@ -3306,7 +3322,7 @@ msgstr "Tyngdekraft"
 
 #: hacks/config/eruption.xml.h:8
 msgid "Heat"
 
 #: hacks/config/eruption.xml.h:8
 msgid "Heat"
-msgstr ""
+msgstr "Varme"
 
 #: hacks/config/eruption.xml.h:9
 #, fuzzy
 
 #: hacks/config/eruption.xml.h:9
 #, fuzzy
@@ -3315,11 +3331,11 @@ msgstr "Interferens"
 
 #: hacks/config/eruption.xml.h:10
 msgid "Little"
 
 #: hacks/config/eruption.xml.h:10
 msgid "Little"
-msgstr ""
+msgstr "Lille"
 
 #: hacks/config/eruption.xml.h:13
 msgid "Negative"
 
 #: hacks/config/eruption.xml.h:13
 msgid "Negative"
-msgstr ""
+msgstr "Negativ"
 
 #: hacks/config/eruption.xml.h:15
 #, fuzzy
 
 #: hacks/config/eruption.xml.h:15
 #, fuzzy
@@ -3333,7 +3349,7 @@ msgstr "Globus"
 
 #: hacks/config/eruption.xml.h:17
 msgid "Positive"
 
 #: hacks/config/eruption.xml.h:17
 msgid "Positive"
-msgstr ""
+msgstr "Positiv"
 
 #: hacks/config/euler2d.xml.h:2
 msgid "Euler2d"
 
 #: hacks/config/euler2d.xml.h:2
 msgid "Euler2d"
@@ -3429,7 +3445,7 @@ msgstr "Falmende plot"
 
 #: hacks/config/fireflies.xml.h:1
 msgid "10 times"
 
 #: hacks/config/fireflies.xml.h:1
 msgid "10 times"
-msgstr ""
+msgstr "10 gange"
 
 #: hacks/config/fireflies.xml.h:2
 #, fuzzy
 
 #: hacks/config/fireflies.xml.h:2
 #, fuzzy
@@ -3446,72 +3462,63 @@ msgstr ""
 
 #: hacks/config/fireflies.xml.h:3
 msgid "Add some fireflies"
 
 #: hacks/config/fireflies.xml.h:3
 msgid "Add some fireflies"
-msgstr ""
+msgstr "Tilføj nogle ildfluer"
 
 #: hacks/config/fireflies.xml.h:4
 msgid "Bait accel"
 
 #: hacks/config/fireflies.xml.h:4
 msgid "Bait accel"
-msgstr ""
+msgstr "Maddingsaccelerator"
 
 #: hacks/config/fireflies.xml.h:5
 
 #: hacks/config/fireflies.xml.h:5
-#, fuzzy
 msgid "Bait speed"
 msgid "Bait speed"
-msgstr "Maksimal levetid"
+msgstr "Maddingshastighed"
 
 #: hacks/config/fireflies.xml.h:6
 msgid "Color cycle speed"
 
 #: hacks/config/fireflies.xml.h:6
 msgid "Color cycle speed"
-msgstr ""
+msgstr "Hastighed for farvecyklus"
 
 #: hacks/config/fireflies.xml.h:7
 
 #: hacks/config/fireflies.xml.h:7
-#, fuzzy
 msgid "Draw baits"
 msgid "Draw baits"
-msgstr "Tegn myrer"
+msgstr "Tegn madding"
 
 #: hacks/config/fireflies.xml.h:8
 
 #: hacks/config/fireflies.xml.h:8
-#, fuzzy
 msgid "Faded colors"
 msgid "Faded colors"
-msgstr "Skræmmende farver"
+msgstr "Falmende farver"
 
 #: hacks/config/fireflies.xml.h:9
 msgid "Fast Forward speed"
 
 #: hacks/config/fireflies.xml.h:9
 msgid "Fast Forward speed"
-msgstr ""
+msgstr "Hastighed for hurtig fremad"
 
 #: hacks/config/fireflies.xml.h:10
 
 #: hacks/config/fireflies.xml.h:10
-#, fuzzy
 msgid "Fireflies"
 msgid "Fireflies"
-msgstr "Snurretoppe"
+msgstr "Ildfluer"
 
 #: hacks/config/fireflies.xml.h:11
 msgid "Firefly accel"
 
 #: hacks/config/fireflies.xml.h:11
 msgid "Firefly accel"
-msgstr ""
+msgstr "Ildflueaccelerator"
 
 #: hacks/config/fireflies.xml.h:12
 msgid "Firefly size"
 
 #: hacks/config/fireflies.xml.h:12
 msgid "Firefly size"
-msgstr ""
+msgstr "Ildfluestørrelse"
 
 #: hacks/config/fireflies.xml.h:13
 
 #: hacks/config/fireflies.xml.h:13
-#, fuzzy
 msgid "Firefly speed"
 msgid "Firefly speed"
-msgstr "Animationshastighed"
+msgstr "Ildfluehastighed"
 
 #: hacks/config/fireflies.xml.h:14
 
 #: hacks/config/fireflies.xml.h:14
-#, fuzzy
 msgid "Frames per sec"
 msgid "Frames per sec"
-msgstr "Vis billeder/sek."
+msgstr "Billeder/s"
 
 #: hacks/config/fireflies.xml.h:15
 
 #: hacks/config/fireflies.xml.h:15
-#, fuzzy
 msgid "Glow factor"
 msgid "Glow factor"
-msgstr "Tillad 2d-tiltrækkere"
+msgstr "Strålefaktor"
 
 #: hacks/config/fireflies.xml.h:16
 
 #: hacks/config/fireflies.xml.h:16
-#, fuzzy
 msgid "Half"
 msgid "Half"
-msgstr "Glorie"
+msgstr "Halv"
 
 #: hacks/config/fireflies.xml.h:17
 
 #: hacks/config/fireflies.xml.h:17
-#, fuzzy
 msgid "Huge"
 msgid "Huge"
-msgstr "Storbrand"
+msgstr "Enorm"
 
 #: hacks/config/fireflies.xml.h:18 hacks/config/fluidballs.xml.h:10
 msgid "Hurricane"
 
 #: hacks/config/fireflies.xml.h:18 hacks/config/fluidballs.xml.h:10
 msgid "Hurricane"
@@ -3519,33 +3526,31 @@ msgstr "Orkan"
 
 #: hacks/config/fireflies.xml.h:19
 msgid "Invisible"
 
 #: hacks/config/fireflies.xml.h:19
 msgid "Invisible"
-msgstr ""
+msgstr "Usynlig"
 
 #: hacks/config/fireflies.xml.h:20
 msgid "Kill some fireflies"
 
 #: hacks/config/fireflies.xml.h:20
 msgid "Kill some fireflies"
-msgstr ""
+msgstr "Slå nogle ildfluer ihjel"
 
 #: hacks/config/fireflies.xml.h:22
 msgid "Make all swarms do something"
 
 #: hacks/config/fireflies.xml.h:22
 msgid "Make all swarms do something"
-msgstr ""
+msgstr "Få alle sværme til at gøre et eller andet"
 
 #: hacks/config/fireflies.xml.h:23
 msgid "Matrix (pause and rotate)"
 
 #: hacks/config/fireflies.xml.h:23
 msgid "Matrix (pause and rotate)"
-msgstr ""
+msgstr "Matrice (pause og rotér)"
 
 #: hacks/config/fireflies.xml.h:24
 
 #: hacks/config/fireflies.xml.h:24
-#, fuzzy
 msgid "Maximum baits"
 msgid "Maximum baits"
-msgstr "Maksimal levetid"
+msgstr "Maksimal madding"
 
 #: hacks/config/fireflies.xml.h:25
 
 #: hacks/config/fireflies.xml.h:25
-#, fuzzy
 msgid "Maximum flies"
 msgid "Maximum flies"
-msgstr "Maksimal levetid"
+msgstr "Maksimum fluer"
 
 #: hacks/config/fireflies.xml.h:26
 msgid "Merge two swarms"
 
 #: hacks/config/fireflies.xml.h:26
 msgid "Merge two swarms"
-msgstr ""
+msgstr "Sammensæt to sværme"
 
 #: hacks/config/fireflies.xml.h:27
 #, fuzzy
 
 #: hacks/config/fireflies.xml.h:27
 #, fuzzy
@@ -3569,7 +3574,7 @@ msgstr "Nær"
 
 #: hacks/config/fireflies.xml.h:31
 msgid "Normal swarm motion"
 
 #: hacks/config/fireflies.xml.h:31
 msgid "Normal swarm motion"
-msgstr ""
+msgstr "Normal bevægelse for sværme"
 
 #: hacks/config/fireflies.xml.h:33
 #, fuzzy
 
 #: hacks/config/fireflies.xml.h:33
 #, fuzzy
@@ -3578,7 +3583,7 @@ msgstr "Uigennemsigtige dråber"
 
 #: hacks/config/fireflies.xml.h:35
 msgid "Split a swarm"
 
 #: hacks/config/fireflies.xml.h:35
 msgid "Split a swarm"
-msgstr ""
+msgstr "Opdel en sværm"
 
 #: hacks/config/fireflies.xml.h:36 hacks/config/fluidballs.xml.h:21
 #: hacks/config/glforestfire.xml.h:16
 
 #: hacks/config/fireflies.xml.h:36 hacks/config/fluidballs.xml.h:21
 #: hacks/config/glforestfire.xml.h:16
@@ -3587,33 +3592,31 @@ msgstr "Stille"
 
 #: hacks/config/fireflies.xml.h:37
 msgid "Swarm bursts into rainbow               "
 
 #: hacks/config/fireflies.xml.h:37
 msgid "Swarm bursts into rainbow               "
-msgstr ""
+msgstr "Sværm bryder ud i regnbue               "
 
 #: hacks/config/fireflies.xml.h:38
 msgid "Swarm comes to a halt"
 
 #: hacks/config/fireflies.xml.h:38
 msgid "Swarm comes to a halt"
-msgstr ""
+msgstr "Sværm stopper"
 
 #: hacks/config/fireflies.xml.h:39
 msgid "Swarm does loops"
 
 #: hacks/config/fireflies.xml.h:39
 msgid "Swarm does loops"
-msgstr ""
+msgstr "Sværm laver loop"
 
 #: hacks/config/fireflies.xml.h:40
 msgid "Swarm hyperspeed"
 
 #: hacks/config/fireflies.xml.h:40
 msgid "Swarm hyperspeed"
-msgstr ""
+msgstr "Sværm hyperhastighed"
 
 #: hacks/config/fireflies.xml.h:41
 msgid "Swarm tails glow"
 
 #: hacks/config/fireflies.xml.h:41
 msgid "Swarm tails glow"
-msgstr ""
+msgstr "Halen på sværmen skinner"
 
 #: hacks/config/fireflies.xml.h:43
 
 #: hacks/config/fireflies.xml.h:43
-#, fuzzy
 msgid "Tiny"
 msgid "Tiny"
-msgstr "Tynd"
+msgstr "Bitte"
 
 #: hacks/config/fireflies.xml.h:44
 
 #: hacks/config/fireflies.xml.h:44
-#, fuzzy
 msgid "Wide"
 msgid "Wide"
-msgstr "Vind"
+msgstr "Bred"
 
 #: hacks/config/fireflies.xml.h:45 hacks/config/fluidballs.xml.h:23
 msgid "Wind"
 
 #: hacks/config/fireflies.xml.h:45 hacks/config/fluidballs.xml.h:23
 msgid "Wind"
@@ -3621,7 +3624,7 @@ msgstr "Vind"
 
 #: hacks/config/fireflies.xml.h:46
 msgid "Wind picks up"
 
 #: hacks/config/fireflies.xml.h:46
 msgid "Wind picks up"
-msgstr ""
+msgstr "Vinden tager fat"
 
 #: hacks/config/flag.xml.h:1
 msgid "Bitmap for Flag"
 
 #: hacks/config/flag.xml.h:1
 msgid "Bitmap for Flag"
@@ -3636,7 +3639,8 @@ msgid "Text for Flag"
 msgstr "Tekst til flag"
 
 # det giver ikke mening at nævne kommandolinjeparametre i denne sammenhæng
 msgstr "Tekst til flag"
 
 # det giver ikke mening at nævne kommandolinjeparametre i denne sammenhæng
-#: hacks/config/flag.xml.h:11
+#. #### -size [-7]
+#: hacks/config/flag.xml.h:12
 msgid ""
 "This draws a waving colored flag, that undulates its way around the screen. "
 "The trick is the flag can contain arbitrary text and images. By default, it "
 msgid ""
 "This draws a waving colored flag, that undulates its way around the screen. "
 "The trick is the flag can contain arbitrary text and images. By default, it "
@@ -3681,18 +3685,19 @@ msgstr "Antal fraktaler"
 
 #: hacks/config/flipflop.xml.h:2
 msgid "FlipFlop"
 
 #: hacks/config/flipflop.xml.h:2
 msgid "FlipFlop"
-msgstr ""
+msgstr "FlipFlop"
 
 #: 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:3
 msgid ""
 "Flipflop draws a grid of 3D colored tiles that change positions with each "
 "other. Written by Kevin Ogden."
 msgstr ""
+"FlipFlop tegner et gitter af 3d-farvede fliser som skifter position med hver "
+"andre. Skrevet af Kevin Ogden."
 
 #: hacks/config/flipflop.xml.h:6
 
 #: hacks/config/flipflop.xml.h:6
-#, fuzzy
 msgid "Solid Tiles"
 msgid "Solid Tiles"
-msgstr "Ensfarvet gulv"
+msgstr "Ensfarvede fliser"
 
 # se næste tekst for forklaring - skærmen opdeles i felter der skydes
 # rundt mellem hinanden 
 
 # se næste tekst for forklaring - skærmen opdeles i felter der skydes
 # rundt mellem hinanden 
@@ -3709,60 +3714,59 @@ msgstr ""
 "drejer det omkring of deformerer det på forskellige måder. Skrevet af Ben "
 "Buxton."
 
 "drejer det omkring of deformerer det på forskellige måder. Skrevet af Ben "
 "Buxton."
 
-#: hacks/config/flow.xml.h:1
-msgid "Allow 2D Attractors"
-msgstr "Tillad 2d-tiltrækkere"
+#: hacks/config/flow.xml.h:3
+msgid "Flow"
+msgstr "Farvestrøm"
+
+#: hacks/config/flow.xml.h:5
+msgid "Length of trails"
+msgstr "Sporlængde"
 
 
-#: hacks/config/flow.xml.h:2
+#: hacks/config/flow.xml.h:13
 #, fuzzy
 msgid ""
 #, fuzzy
 msgid ""
-"Another series of strange attractors: a flowing series of points, making "
-"strange rotational shapes. Written by Tim Auckland."
+"Strange attractors formed of flows in a 3D differential equation phase "
+"space. Written by Tim Auckland."
 msgstr ""
 "En anden serie af \"mærkelige\" tiltrækkere: en strømmende serie af punkter "
 "der laver mærkelige roterende former. Skrevet af Jeff Butterworth."
 
 msgstr ""
 "En anden serie af \"mærkelige\" tiltrækkere: en strømmende serie af punkter "
 "der laver mærkelige roterende former. Skrevet af Jeff Butterworth."
 
-#: hacks/config/flow.xml.h:5
-msgid "Flow"
-msgstr "Farvestrøm"
+#: hacks/config/flow.xml.h:16
+msgid "turn on/off bounding box."
+msgstr "slå afgrænsende boks til og fra."
 
 
-#: hacks/config/flow.xml.h:6
-msgid "Freeze Some Bees"
-msgstr "Frys nogle bier"
-
-#: hacks/config/flow.xml.h:10
-msgid "Ride a Trained Bee"
-msgstr "Rid på en trænet bi"
+# "double buffer" betyder at man bruger én buffer (mærkeligt teknisk udtryk)
+#: hacks/config/flow.xml.h:17
+msgid "turn on/off double buffering."
+msgstr "slå mellemlager til og fra."
 
 
-#: hacks/config/flow.xml.h:11
-msgid "Rotate Around Attractor"
-msgstr "Rotér omkring tiltrækker"
+#: hacks/config/flow.xml.h:18
+msgid "turn on/off periodic attractors."
+msgstr "slå periodiske tiltrækkere til og fra."
 
 
-#: hacks/config/flow.xml.h:12
-msgid "Show Bounding Box"
-msgstr "Vis afgrænsningsboks"
+#: hacks/config/flow.xml.h:19
+msgid "turn on/off ride in the flow."
+msgstr "slå turen i flowet til og fra."
 
 
-#: hacks/config/flow.xml.h:14
-msgid "Slow Bees with Antifreeze"
-msgstr "Sløv bier med antifrys"
+#: hacks/config/flow.xml.h:20
+msgid "turn on/off rotating around attractor."
+msgstr "slå rotér omkring tiltrækker til og fra."
 
 
-#: hacks/config/flow.xml.h:19
-msgid "Zoom In and Out"
-msgstr "Zoom ind og ud"
+#: hacks/config/flow.xml.h:21
+msgid "turn on/off search for new attractors."
+msgstr "slå søgning efter nye tiltrækkere til og fra."
 
 #: hacks/config/fluidballs.xml.h:1
 
 #: hacks/config/fluidballs.xml.h:1
-#, fuzzy
 msgid "      Freefall"
 msgid "      Freefall"
-msgstr "Frit fald"
+msgstr "      Frit fald"
 
 #: hacks/config/fluidballs.xml.h:2
 msgid "Ball Size"
 msgstr "Kuglestørrelse"
 
 #: hacks/config/fluidballs.xml.h:4
 
 #: hacks/config/fluidballs.xml.h:2
 msgid "Ball Size"
 msgstr "Kuglestørrelse"
 
 #: hacks/config/fluidballs.xml.h:4
-#, fuzzy
 msgid "Clay"
 msgid "Clay"
-msgstr "Ventetid"
+msgstr "Ler"
 
 #: hacks/config/fluidballs.xml.h:7
 msgid "FluidBalls"
 
 #: hacks/config/fluidballs.xml.h:7
 msgid "FluidBalls"
@@ -3804,34 +3808,31 @@ msgstr "Forskellige kuglestørrelser"
 
 #: hacks/config/flurry.xml.h:1
 msgid "Binary"
 
 #: hacks/config/flurry.xml.h:1
 msgid "Binary"
-msgstr ""
+msgstr "Binær"
 
 #: hacks/config/flurry.xml.h:2
 
 #: hacks/config/flurry.xml.h:2
-#, fuzzy
 msgid "Classic"
 msgid "Classic"
-msgstr "Glas"
+msgstr "Klassisk"
 
 #: hacks/config/flurry.xml.h:3
 
 #: hacks/config/flurry.xml.h:3
-#, fuzzy
 msgid "Fire"
 msgid "Fire"
-msgstr "_Fil"
+msgstr "Ild"
 
 #: hacks/config/flurry.xml.h:4
 msgid "Flurry"
 
 #: hacks/config/flurry.xml.h:4
 msgid "Flurry"
-msgstr ""
+msgstr "Byge"
 
 #: hacks/config/flurry.xml.h:5
 msgid "Insane"
 
 #: hacks/config/flurry.xml.h:5
 msgid "Insane"
-msgstr ""
+msgstr "Sindsyg"
 
 #: hacks/config/flurry.xml.h:6
 
 #: hacks/config/flurry.xml.h:6
-#, fuzzy
 msgid "Psychedelic"
 msgid "Psychedelic"
-msgstr "Psykedeliske farver"
+msgstr "Psykedelisk"
 
 #: hacks/config/flurry.xml.h:7
 msgid "RGB"
 
 #: hacks/config/flurry.xml.h:7
 msgid "RGB"
-msgstr ""
+msgstr "RGB"
 
 #: 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/flurry.xml.h:8 hacks/config/fontglide.xml.h:12
 #: hacks/config/jigglypuff.xml.h:13 hacks/config/sballs.xml.h:10
@@ -3846,11 +3847,14 @@ msgid ""
 "tobias.sargeant@bigpond.com&gt; Original Mac version by Calum Robinson &lt;"
 "calumr@mac.com&gt; http://homepage.mac.com/calumr"
 msgstr ""
 "tobias.sargeant@bigpond.com&gt; Original Mac version by Calum Robinson &lt;"
 "calumr@mac.com&gt; http://homepage.mac.com/calumr"
 msgstr ""
+"Denne oversættelse af OS X-pauseskærmen med samme navn, tegner en farverig "
+"stjerne(fiske)agtig byge af partikler. xscreensaver-port af Tobias Sargeant "
+"&lt;tobias.sargeant@bigpond.com&gt; Original Mac version by Calum Robinson "
+"&lt;calumr@mac.com&gt; http://homepage.mac.com/calumr"
 
 #: hacks/config/flurry.xml.h:11
 
 #: hacks/config/flurry.xml.h:11
-#, fuzzy
 msgid "Water"
 msgid "Water"
-msgstr "Vandring"
+msgstr "Vand"
 
 #: hacks/config/flyingtoasters.xml.h:1
 msgid ""
 
 #: hacks/config/flyingtoasters.xml.h:1
 msgid ""
@@ -3858,67 +3862,63 @@ msgid ""
 "the ancient Berkeley Systems After Dark flying toasters. By Jamie Zawinski "
 "and Baconmonkey."
 msgstr ""
 "the ancient Berkeley Systems After Dark flying toasters. By Jamie Zawinski "
 "and Baconmonkey."
 msgstr ""
+"En flåde af 3d rumalder jet-fremdrevne flyvende toastere (og toast!) "
+"Inspireret af de antikke Berkelysystemers \"Efter mørke flyvende toastere\". "
+"Af Jamie Zawinski og Baconmonkey."
 
 #: hacks/config/flyingtoasters.xml.h:2
 
 #: hacks/config/flyingtoasters.xml.h:2
-#, fuzzy
 msgid "Air Speed"
 msgid "Air Speed"
-msgstr "Animationshastighed"
+msgstr "Lufthastighed"
 
 #: hacks/config/flyingtoasters.xml.h:4
 msgid "Chrome Toasters"
 
 #: hacks/config/flyingtoasters.xml.h:4
 msgid "Chrome Toasters"
-msgstr ""
+msgstr "Kromtoastere"
 
 #: hacks/config/flyingtoasters.xml.h:6
 msgid "Flying Toasters"
 
 #: hacks/config/flyingtoasters.xml.h:6
 msgid "Flying Toasters"
-msgstr ""
+msgstr "Flyvende toastere"
 
 #: hacks/config/flyingtoasters.xml.h:7 hacks/config/glslideshow.xml.h:16
 
 #: 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/mirrorblob.xml.h:16 hacks/config/pipes.xml.h:10
+#: hacks/config/jigglypuff.xml.h:12 hacks/config/juggle.xml.h:7
+#: hacks/config/mirrorblob.xml.h:16 hacks/config/pipes.xml.h:11
 msgid "None"
 msgstr "Ingen"
 
 #: hacks/config/flyingtoasters.xml.h:8
 msgid "None"
 msgstr "Ingen"
 
 #: hacks/config/flyingtoasters.xml.h:8
-#, fuzzy
 msgid "Number of Slices"
 msgid "Number of Slices"
-msgstr "Antal cirkler"
+msgstr "Antal skiver"
 
 #: hacks/config/flyingtoasters.xml.h:9
 
 #: hacks/config/flyingtoasters.xml.h:9
-#, fuzzy
 msgid "Number of Toasters"
 msgid "Number of Toasters"
-msgstr "Antal pletter"
+msgstr "Antal toastere"
 
 #: hacks/config/flyingtoasters.xml.h:12
 
 #: hacks/config/flyingtoasters.xml.h:12
-#, fuzzy
 msgid "Solid Colors"
 msgid "Solid Colors"
-msgstr "Ensfarvet gulv"
+msgstr "Ensfarvede farver"
 
 #: hacks/config/flyingtoasters.xml.h:13
 
 #: hacks/config/flyingtoasters.xml.h:13
-#, fuzzy
 msgid "Swarm"
 msgid "Swarm"
-msgstr "Strålesværm"
+msgstr "Sværm"
 
 #: hacks/config/fontglide.xml.h:2
 
 #: hacks/config/fontglide.xml.h:2
-#, fuzzy
 msgid "Brief"
 msgid "Brief"
-msgstr "Drift"
+msgstr "Kort"
 
 #: hacks/config/fontglide.xml.h:5
 
 #: hacks/config/fontglide.xml.h:5
-#, fuzzy
 msgid "Font Border Thickness"
 msgid "Font Border Thickness"
-msgstr "Linjetykkelse"
+msgstr "Skrifttypekanttykkelse"
 
 #: hacks/config/fontglide.xml.h:6
 msgid "FontGlide"
 
 #: hacks/config/fontglide.xml.h:6
 msgid "FontGlide"
-msgstr ""
+msgstr "SkrifttypeGlide"
 
 #: hacks/config/fontglide.xml.h:7
 msgid "Horizontally scrolling text"
 
 #: hacks/config/fontglide.xml.h:7
 msgid "Horizontally scrolling text"
-msgstr ""
+msgstr "Horisontalt rullende tekst"
 
 #: hacks/config/fontglide.xml.h:10
 msgid "Pages of text"
 
 #: hacks/config/fontglide.xml.h:10
 msgid "Pages of text"
-msgstr ""
+msgstr "Sider med tekst"
 
 #: hacks/config/fontglide.xml.h:11
 msgid ""
 
 #: hacks/config/fontglide.xml.h:11
 msgid ""
@@ -3928,14 +3928,12 @@ msgid ""
 msgstr ""
 
 #: hacks/config/fontglide.xml.h:14
 msgstr ""
 
 #: hacks/config/fontglide.xml.h:14
-#, fuzzy
 msgid "Text Linger"
 msgid "Text Linger"
-msgstr "Tekstlinjer"
+msgstr "Tekstdvæling"
 
 #: hacks/config/fontglide.xml.h:16
 
 #: hacks/config/fontglide.xml.h:16
-#, fuzzy
 msgid "Vapor Trails"
 msgid "Vapor Trails"
-msgstr "Spor"
+msgstr "Dampspor"
 
 #: hacks/config/forest.xml.h:2 hacks/config/glforestfire.xml.h:6
 msgid "Forest"
 
 #: hacks/config/forest.xml.h:2 hacks/config/glforestfire.xml.h:6
 msgid "Forest"
@@ -3949,43 +3947,47 @@ msgstr ""
 "Tegner fraktale træer. Skrevet af Peter Baumung. Alle elsker fraktaler, ikke?"
 
 #: hacks/config/fuzzyflakes.xml.h:2
 "Tegner fraktale træer. Skrevet af Peter Baumung. Alle elsker fraktaler, ikke?"
 
 #: hacks/config/fuzzyflakes.xml.h:2
-#, fuzzy
 msgid "Border Thickness"
 msgid "Border Thickness"
-msgstr "Linjetykkelse"
+msgstr "Kanttykkelse"
 
 #: hacks/config/fuzzyflakes.xml.h:6
 msgid ""
 "Falling colored snowflake/flower shapes. Inspired by the credits of the "
 "anime \"Azumanga Daioh\". Written by Barry Dmytro."
 msgstr ""
 
 #: hacks/config/fuzzyflakes.xml.h:6
 msgid ""
 "Falling colored snowflake/flower shapes. Inspired by the credits of the "
 "anime \"Azumanga Daioh\". Written by Barry Dmytro."
 msgstr ""
+"Faldende farvede snefnug/blomstermønstre. Inspireret af listen over "
+"medvirkende til anime \"Azumanga Daioh\". Skrevet af Barry Dmytro."
 
 #: hacks/config/fuzzyflakes.xml.h:9
 msgid "FuzzyFlakes"
 
 #: hacks/config/fuzzyflakes.xml.h:9
 msgid "FuzzyFlakes"
-msgstr ""
+msgstr "UklareFnug"
 
 #: hacks/config/fuzzyflakes.xml.h:11 hacks/config/xspirograph.xml.h:4
 msgid "Layers"
 msgstr "Lag"
 
 #: hacks/config/fuzzyflakes.xml.h:14
 
 #: hacks/config/fuzzyflakes.xml.h:11 hacks/config/xspirograph.xml.h:4
 msgid "Layers"
 msgstr "Lag"
 
 #: hacks/config/fuzzyflakes.xml.h:14
-#, fuzzy
 msgid "Random Colors"
 msgid "Random Colors"
-msgstr "Tilfældig bevægelse"
+msgstr "Tilfældige farver"
 
 #: hacks/config/galaxy.xml.h:4
 msgid "Galaxy"
 msgstr "Galakse"
 
 
 #: hacks/config/galaxy.xml.h:4
 msgid "Galaxy"
 msgstr "Galakse"
 
-#: hacks/config/galaxy.xml.h:9 hacks/config/lisa.xml.h:7
+#: hacks/config/galaxy.xml.h:8
+msgid "Rotate Viewpoint"
+msgstr "Rotér synspunkt"
+
+#: hacks/config/galaxy.xml.h:10 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/pong.xml.h:3
 #: 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/lissie.xml.h:8 hacks/config/loop.xml.h:6
 #: hacks/config/penrose.xml.h:10 hacks/config/pong.xml.h:3
 #: 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/worm.xml.h:7
 msgid "Size"
 msgstr "Størrelse"
 
 msgid "Size"
 msgstr "Størrelse"
 
-#: hacks/config/galaxy.xml.h:12
+#: hacks/config/galaxy.xml.h:13
 msgid ""
 "This draws spinning galaxies, which then collide and scatter their stars to "
 "the, uh, four winds or something. Originally an Amiga program by Uli "
 msgid ""
 "This draws spinning galaxies, which then collide and scatter their stars to "
 "the, uh, four winds or something. Originally an Amiga program by Uli "
@@ -4024,38 +4026,39 @@ msgstr "Tretandhjulssystem"
 msgid "Checkerboard"
 msgstr "Skakbræt"
 
 msgid "Checkerboard"
 msgstr "Skakbræt"
 
-#: hacks/config/gflux.xml.h:5
+#. #### -zoom [1.0]
+#: hacks/config/gflux.xml.h:6
 msgid ""
 "Draws a rippling waves on a rotating wireframe grid, using GL. Written by "
 "Josiah Pease."
 msgstr ""
 "Tegner krusende bølger på et roterende gitter i 3d. Skrevet af Josiah Pease."
 
 msgid ""
 "Draws a rippling waves on a rotating wireframe grid, using GL. Written by "
 "Josiah Pease."
 msgstr ""
 "Tegner krusende bølger på et roterende gitter i 3d. Skrevet af Josiah Pease."
 
-#: hacks/config/gflux.xml.h:7
+#: hacks/config/gflux.xml.h:8
 msgid "Flat Lighting"
 msgstr "Fladt lys"
 
 msgid "Flat Lighting"
 msgstr "Fladt lys"
 
-#: hacks/config/gflux.xml.h:8
+#: hacks/config/gflux.xml.h:9
 msgid "GFlux"
 msgstr "Fluktuationer"
 
 msgid "GFlux"
 msgstr "Fluktuationer"
 
-#: hacks/config/gflux.xml.h:9
+#: hacks/config/gflux.xml.h:10
 msgid "Mesh Density"
 msgstr "Gittertæthed"
 
 msgid "Mesh Density"
 msgstr "Gittertæthed"
 
-#: hacks/config/gflux.xml.h:10
+#: hacks/config/gflux.xml.h:11
 msgid "Screen Image"
 msgstr "Skærmbillede"
 
 msgid "Screen Image"
 msgstr "Skærmbillede"
 
-#: hacks/config/gflux.xml.h:14 hacks/config/interference.xml.h:21
+#: hacks/config/gflux.xml.h:15 hacks/config/interference.xml.h:21
 msgid "Wave Speed"
 msgstr "Bølgehastighed"
 
 msgid "Wave Speed"
 msgstr "Bølgehastighed"
 
-#: hacks/config/gflux.xml.h:15 hacks/config/glmatrix.xml.h:20
+#: hacks/config/gflux.xml.h:16 hacks/config/glmatrix.xml.h:20
 msgid "Waves"
 msgstr "Bølger"
 
 msgid "Waves"
 msgstr "Bølger"
 
-#: hacks/config/gflux.xml.h:16
+#: hacks/config/gflux.xml.h:17
 msgid "Wire Mesh"
 msgstr "Gitter"
 
 msgid "Wire Mesh"
 msgstr "Gitter"
 
@@ -4066,7 +4069,7 @@ msgstr "Udglattede linjer"
 
 #: hacks/config/glblur.xml.h:5
 msgid "GLBlur"
 
 #: hacks/config/glblur.xml.h:5
 msgid "GLBlur"
-msgstr ""
+msgstr "3dSlør"
 
 #: hacks/config/glblur.xml.h:18
 msgid ""
 
 #: hacks/config/glblur.xml.h:18
 msgid ""
@@ -4078,45 +4081,49 @@ msgid ""
 "trying to run this if you don't have hardware-accelerated OpenGL texture "
 "support. It will hurt your machine bad."
 msgstr ""
 "trying to run this if you don't have hardware-accelerated OpenGL texture "
 "support. It will hurt your machine bad."
 msgstr ""
+"Dette program tegner en boks og et par linjesegmenter og genererer et "
+"radialslør udfra det. Programmet laver et flydende feldt af effekter. Feltet "
+"laves ved at optegne scenen i små teksturer og gentage optegningen af denne "
+"tekstur i stadig større og stadig mere gennemsigtige versioner på "
+"billedmellemlageret. Som sådan er dette meget grafikintensivt: derfor spar "
+"dig selv besværet med at køre dette program hvis du ikke har undersøttelse "
+"for maskinaccelereret OpenGL-tekstur. Din maskine vil blive ramt hårdt."
 
 #: hacks/config/gleidescope.xml.h:2 hacks/config/glslideshow.xml.h:6
 #: hacks/config/mirrorblob.xml.h:3
 
 #: hacks/config/gleidescope.xml.h:2 hacks/config/glslideshow.xml.h:6
 #: hacks/config/mirrorblob.xml.h:3
-#, fuzzy
 msgid "5 Minutes"
 msgid "5 Minutes"
-msgstr "1 minut"
+msgstr "5 minutter"
 
 #: hacks/config/gleidescope.xml.h:3
 msgid ""
 "An OpenGL kaleidescope that operates on your desktop image, or on image "
 "files loaded from disk. Written by andrew dean."
 msgstr ""
 
 #: hacks/config/gleidescope.xml.h:3
 msgid ""
 "An OpenGL kaleidescope that operates on your desktop image, or on image "
 "files loaded from disk. Written by andrew dean."
 msgstr ""
+"Et OpenGL kalejdoskop der benytter sig af din skrivebordsbagrund eller af "
+"billeder indlæst fra disken. Skrevet af Andrew Dean."
 
 #: hacks/config/gleidescope.xml.h:4
 
 #: hacks/config/gleidescope.xml.h:4
-#, fuzzy
 msgid "Gleidescope"
 msgid "Gleidescope"
-msgstr "Kalejdoskop"
+msgstr "Gleideskop"
 
 #: hacks/config/gleidescope.xml.h:5
 
 #: hacks/config/gleidescope.xml.h:5
-#, fuzzy
 msgid "Image Duration"
 msgid "Image Duration"
-msgstr "Overgangsvarighed"
+msgstr "Billedvarighed"
 
 #: hacks/config/gleidescope.xml.h:6
 
 #: hacks/config/gleidescope.xml.h:6
-#, fuzzy
 msgid "Image file"
 msgid "Image file"
-msgstr "Billedefil:"
+msgstr "Billedefil"
 
 #: hacks/config/gleidescope.xml.h:8
 
 #: hacks/config/gleidescope.xml.h:8
-#, fuzzy
 msgid "Move"
 msgid "Move"
-msgstr "Flere"
+msgstr "Flyt"
 
 #: hacks/config/gleidescope.xml.h:11
 msgid "Size of tube"
 
 #: hacks/config/gleidescope.xml.h:11
 msgid "Size of tube"
-msgstr ""
+msgstr "Størrelse af tube"
 
 #: hacks/config/gleidescope.xml.h:13 hacks/config/hyperball.xml.h:16
 
 #: hacks/config/gleidescope.xml.h:13 hacks/config/hyperball.xml.h:16
-#: hacks/config/hypercube.xml.h:16 hacks/config/zoom.xml.h:8
+#: hacks/config/hypercube.xml.h:17 hacks/config/zoom.xml.h:8
 msgid "Zoom"
 msgstr "Zoom"
 
 msgid "Zoom"
 msgstr "Zoom"
 
@@ -4222,23 +4229,20 @@ msgid ""
 msgstr ""
 
 #: hacks/config/glmatrix.xml.h:10
 msgstr ""
 
 #: hacks/config/glmatrix.xml.h:10
-#, fuzzy
 msgid "GLMatrix"
 msgid "GLMatrix"
-msgstr "Matrix"
+msgstr "3d-matrice"
 
 #: hacks/config/glmatrix.xml.h:11 hacks/config/xmatrix.xml.h:7
 msgid "Genetic Encoding"
 msgstr "Genetisk kodning"
 
 #: hacks/config/glmatrix.xml.h:12
 
 #: hacks/config/glmatrix.xml.h:11 hacks/config/xmatrix.xml.h:7
 msgid "Genetic Encoding"
 msgstr "Genetisk kodning"
 
 #: hacks/config/glmatrix.xml.h:12
-#, fuzzy
 msgid "Glyph Density"
 msgid "Glyph Density"
-msgstr "Gittertæthed"
+msgstr "Glyftæthed"
 
 #: hacks/config/glmatrix.xml.h:13
 
 #: hacks/config/glmatrix.xml.h:13
-#, fuzzy
 msgid "Glyph Speed"
 msgid "Glyph Speed"
-msgstr "Fiskefart"
+msgstr "Glyfhastighed"
 
 #: hacks/config/glmatrix.xml.h:14 hacks/config/xmatrix.xml.h:8
 msgid "Hexadecimal Encoding"
 
 #: hacks/config/glmatrix.xml.h:14 hacks/config/xmatrix.xml.h:8
 msgid "Hexadecimal Encoding"
@@ -4249,9 +4253,8 @@ msgid "Matrix Encoding"
 msgstr "Matrixkodning"
 
 #: hacks/config/glmatrix.xml.h:16
 msgstr "Matrixkodning"
 
 #: hacks/config/glmatrix.xml.h:16
-#, fuzzy
 msgid "Panning"
 msgid "Panning"
-msgstr "Pakning"
+msgstr "Panorering"
 
 #: hacks/config/glplanet.xml.h:1
 msgid ""
 
 #: hacks/config/glplanet.xml.h:1
 msgid ""
@@ -4275,7 +4278,7 @@ msgstr "Billedefil:"
 
 #: hacks/config/glplanet.xml.h:5
 msgid "Roll"
 
 #: hacks/config/glplanet.xml.h:5
 msgid "Roll"
-msgstr ""
+msgstr "Rul"
 
 #: hacks/config/glslideshow.xml.h:4 hacks/config/rd-bomb.xml.h:5
 #: hacks/config/xplanet.xml.h:4
 
 #: hacks/config/glslideshow.xml.h:4 hacks/config/rd-bomb.xml.h:5
 #: hacks/config/xplanet.xml.h:4
@@ -4291,24 +4294,23 @@ msgstr "30 sekunder"
 #: hacks/config/glslideshow.xml.h:8
 #, no-c-format
 msgid "50%"
 #: 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:"
 
 #: hacks/config/glslideshow.xml.h:9
 msgid "Always show at least this much of the image:"
-msgstr ""
+msgstr "Vis altid mindst så meget af billedet:"
 
 #: hacks/config/glslideshow.xml.h:10 hacks/config/mirrorblob.xml.h:6
 
 #: hacks/config/glslideshow.xml.h:10 hacks/config/mirrorblob.xml.h:6
-#, fuzzy
 msgid "Crossfade Duration:"
 msgid "Crossfade Duration:"
-msgstr "Overgangsvarighed"
+msgstr "Overgangsvarighed:"
 
 #: hacks/config/glslideshow.xml.h:11
 msgid "Frame Rate:"
 
 #: hacks/config/glslideshow.xml.h:11
 msgid "Frame Rate:"
-msgstr ""
+msgstr "Billedrate:"
 
 #: hacks/config/glslideshow.xml.h:12
 msgid "GLSlideshow"
 
 #: hacks/config/glslideshow.xml.h:12
 msgid "GLSlideshow"
-msgstr ""
+msgstr "3d-diasvisning"
 
 #: hacks/config/glslideshow.xml.h:14
 msgid ""
 
 #: hacks/config/glslideshow.xml.h:14
 msgid ""
@@ -4317,15 +4319,14 @@ msgid ""
 "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 "
 "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."
+"of this window: the tab at the top of the *other* window.) 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
 msgstr ""
 
 #: hacks/config/glslideshow.xml.h:17
-#, fuzzy
 msgid "Pan/Zoom Duration:"
 msgid "Pan/Zoom Duration:"
-msgstr "Overgangsvarighed"
+msgstr "Panorerings-/zoom-varighed"
 
 #: hacks/config/glslideshow.xml.h:19
 #, fuzzy
 
 #: hacks/config/glslideshow.xml.h:19
 #, fuzzy
@@ -4334,16 +4335,15 @@ msgstr "Billedefil:"
 
 #: hacks/config/glslideshow.xml.h:20 hacks/config/mirrorblob.xml.h:22
 msgid "Time until loading a new image:"
 
 #: hacks/config/glslideshow.xml.h:20 hacks/config/mirrorblob.xml.h:22
 msgid "Time until loading a new image:"
-msgstr ""
+msgstr "Tidsrum indtil indlæsning af et nyt billede:"
 
 #: hacks/config/glsnake.xml.h:1 hacks/config/lavalite.xml.h:1
 msgid "1"
 msgstr "1"
 
 #: hacks/config/glsnake.xml.h:3
 
 #: hacks/config/glsnake.xml.h:1 hacks/config/lavalite.xml.h:1
 msgid "1"
 msgstr "1"
 
 #: hacks/config/glsnake.xml.h:3
-#, fuzzy
 msgid "Angular Velocity"
 msgid "Angular Velocity"
-msgstr "Maks. fart"
+msgstr "Vinkelformet hastighed"
 
 #: hacks/config/glsnake.xml.h:4
 msgid ""
 
 #: hacks/config/glsnake.xml.h:4
 msgid ""
@@ -4366,23 +4366,20 @@ msgid "Packing"
 msgstr "Pakning"
 
 #: hacks/config/glsnake.xml.h:11
 msgstr "Pakning"
 
 #: hacks/config/glsnake.xml.h:11
-#, fuzzy
 msgid "Show Titles"
 msgid "Show Titles"
-msgstr "Vis etiketter"
+msgstr "Vis titler"
 
 #: hacks/config/glsnake.xml.h:14
 msgid "Tight"
 msgstr "Stram"
 
 #: hacks/config/glsnake.xml.h:16
 
 #: hacks/config/glsnake.xml.h:14
 msgid "Tight"
 msgstr "Stram"
 
 #: hacks/config/glsnake.xml.h:16
-#, fuzzy
 msgid "Y Angular Velocity"
 msgid "Y Angular Velocity"
-msgstr "Maks. fart"
+msgstr "Y-vinkelformet hastighed"
 
 #: hacks/config/glsnake.xml.h:17
 
 #: hacks/config/glsnake.xml.h:17
-#, fuzzy
 msgid "Z Angular Velocity"
 msgid "Z Angular Velocity"
-msgstr "Maks. fart"
+msgstr "Z-vinkelformet hastighed"
 
 #: hacks/config/gltext.xml.h:1
 msgid ""
 
 #: hacks/config/gltext.xml.h:1
 msgid ""
@@ -4396,7 +4393,7 @@ msgstr ""
 msgid "GLText"
 msgstr "Tekst i 3d"
 
 msgid "GLText"
 msgstr "Tekst i 3d"
 
-#: hacks/config/gltext.xml.h:16 hacks/config/noseguy.xml.h:5
+#: hacks/config/gltext.xml.h:16 hacks/config/noseguy.xml.h:6
 msgid "Text"
 msgstr "Tekst"
 
 msgid "Text"
 msgstr "Tekst"
 
@@ -4404,7 +4401,8 @@ msgstr "Tekst"
 msgid "Goban"
 msgstr "Goban"
 
 msgid "Goban"
 msgstr "Goban"
 
-#: hacks/config/goban.xml.h:2
+#. #### write me
+#: hacks/config/goban.xml.h:3
 msgid ""
 "Replays historical games of go (aka wei-chi and baduk) on the screen. By "
 "Scott Draves. You can find it at &lt;http://www.draves.org/goban/&gt;."
 msgid ""
 "Replays historical games of go (aka wei-chi and baduk) on the screen. By "
 "Scott Draves. You can find it at &lt;http://www.draves.org/goban/&gt;."
@@ -4499,16 +4497,15 @@ msgstr ""
 
 #: hacks/config/halftone.xml.h:1
 msgid "Delay (Large = low cpu load)"
 
 #: hacks/config/halftone.xml.h:1
 msgid "Delay (Large = low cpu load)"
-msgstr ""
+msgstr "Forsinkelse (Stor = lille cpu-belastning)"
 
 #: hacks/config/halftone.xml.h:2
 msgid "Dot fill factor"
 
 #: hacks/config/halftone.xml.h:2
 msgid "Dot fill factor"
-msgstr ""
+msgstr "Punktfyldningsfaktor"
 
 #: hacks/config/halftone.xml.h:3
 
 #: hacks/config/halftone.xml.h:3
-#, fuzzy
 msgid "Dot size"
 msgid "Dot size"
-msgstr "Myrestørrelse"
+msgstr "Punktstørrelse"
 
 #: hacks/config/halftone.xml.h:4
 msgid ""
 
 #: hacks/config/halftone.xml.h:4
 msgid ""
@@ -4530,16 +4527,15 @@ msgstr "Glorie"
 
 #: hacks/config/halftone.xml.h:10
 msgid "Maximum mass"
 
 #: hacks/config/halftone.xml.h:10
 msgid "Maximum mass"
-msgstr ""
+msgstr "Maksimal masse"
 
 #: hacks/config/halftone.xml.h:11
 
 #: hacks/config/halftone.xml.h:11
-#, fuzzy
 msgid "Maximum speed"
 msgid "Maximum speed"
-msgstr "Maksimal levetid"
+msgstr "Maksimal hastighed"
 
 #: hacks/config/halftone.xml.h:12
 msgid "Minimum mass"
 
 #: hacks/config/halftone.xml.h:12
 msgid "Minimum mass"
-msgstr ""
+msgstr "Minimal masse"
 
 #: hacks/config/halftone.xml.h:13
 #, fuzzy
 
 #: hacks/config/halftone.xml.h:13
 #, fuzzy
@@ -4567,7 +4563,8 @@ msgstr "Tilfældig tilstand"
 msgid "Seuss Mode"
 msgstr "Seuss-tilstand"
 
 msgid "Seuss Mode"
 msgstr "Seuss-tilstand"
 
-#: hacks/config/halo.xml.h:12
+#. #### -no-cycle
+#: hacks/config/halo.xml.h:13
 msgid ""
 "This draws trippy psychedelic circular patterns that hurt to look at. It can "
 "also animate the control-points, but that takes a lot of CPU and bandwidth. "
 msgid ""
 "This draws trippy psychedelic circular patterns that hurt to look at. It can "
 "also animate the control-points, but that takes a lot of CPU and bandwidth. "
@@ -4664,27 +4661,27 @@ msgstr ""
 "3d-objekter som er projektionerne af 4d-analogen til dodekahedronen. Skrevet "
 "af Joe Keane."
 
 "3d-objekter som er projektionerne af 4d-analogen til dodekahedronen. Skrevet "
 "af Joe Keane."
 
-#: hacks/config/hyperball.xml.h:10 hacks/config/hypercube.xml.h:10
+#: hacks/config/hyperball.xml.h:10 hacks/config/hypercube.xml.h:11
 msgid "XW Rotation"
 msgstr "Rotation om xw"
 
 msgid "XW Rotation"
 msgstr "Rotation om xw"
 
-#: hacks/config/hyperball.xml.h:11 hacks/config/hypercube.xml.h:11
+#: hacks/config/hyperball.xml.h:11 hacks/config/hypercube.xml.h:12
 msgid "XY Rotation"
 msgstr "Rotation om xy"
 
 msgid "XY Rotation"
 msgstr "Rotation om xy"
 
-#: hacks/config/hyperball.xml.h:12 hacks/config/hypercube.xml.h:12
+#: hacks/config/hyperball.xml.h:12 hacks/config/hypercube.xml.h:13
 msgid "XZ Rotation"
 msgstr "Rotation om xz"
 
 msgid "XZ Rotation"
 msgstr "Rotation om xz"
 
-#: hacks/config/hyperball.xml.h:13 hacks/config/hypercube.xml.h:13
+#: hacks/config/hyperball.xml.h:13 hacks/config/hypercube.xml.h:14
 msgid "YW Rotation"
 msgstr "Rotation om yw"
 
 msgid "YW Rotation"
 msgstr "Rotation om yw"
 
-#: hacks/config/hyperball.xml.h:14 hacks/config/hypercube.xml.h:14
+#: hacks/config/hyperball.xml.h:14 hacks/config/hypercube.xml.h:15
 msgid "YZ Rotation"
 msgstr "Rotation om yz"
 
 msgid "YZ Rotation"
 msgstr "Rotation om yz"
 
-#: hacks/config/hyperball.xml.h:15 hacks/config/hypercube.xml.h:15
+#: hacks/config/hyperball.xml.h:15 hacks/config/hypercube.xml.h:16
 msgid "ZW Rotation"
 msgstr "Rotation om zw"
 
 msgid "ZW Rotation"
 msgstr "Rotation om zw"
 
@@ -4692,7 +4689,8 @@ msgstr "Rotation om zw"
 msgid "Hypercube"
 msgstr "Hyperterning"
 
 msgid "Hypercube"
 msgstr "Hyperterning"
 
-#: hacks/config/hypercube.xml.h:9
+#. #### -color7 [#00FFD0]
+#: hacks/config/hypercube.xml.h:10
 #, fuzzy
 msgid ""
 "This displays 2D projections of the sequence of 3D objects which are the "
 #, fuzzy
 msgid ""
 "This displays 2D projections of the sequence of 3D objects which are the "
@@ -4716,53 +4714,47 @@ msgstr ""
 
 #: hacks/config/hypertorus.xml.h:1 hacks/config/polytopes.xml.h:1
 msgid "-4.0"
 
 #: hacks/config/hypertorus.xml.h:1 hacks/config/polytopes.xml.h:1
 msgid "-4.0"
-msgstr ""
+msgstr "-4.0"
 
 #: hacks/config/hypertorus.xml.h:2 hacks/config/polytopes.xml.h:5
 msgid "4.0"
 
 #: hacks/config/hypertorus.xml.h:2 hacks/config/polytopes.xml.h:5
 msgid "4.0"
-msgstr ""
+msgstr "4.0"
 
 #: hacks/config/hypertorus.xml.h:3
 msgid "4D Hypertorus"
 
 #: hacks/config/hypertorus.xml.h:3
 msgid "4D Hypertorus"
-msgstr ""
+msgstr "4D Hypertorus"
 
 #: hacks/config/hypertorus.xml.h:4
 
 #: hacks/config/hypertorus.xml.h:4
-#, fuzzy
 msgid "Color Wheel"
 msgid "Color Wheel"
-msgstr "Farve"
+msgstr "Farvehjul"
 
 #: hacks/config/hypertorus.xml.h:5 hacks/config/polytopes.xml.h:10
 
 #: hacks/config/hypertorus.xml.h:5 hacks/config/polytopes.xml.h:10
-#, fuzzy
 msgid "Display Speed"
 msgid "Display Speed"
-msgstr "Vis sekunder"
+msgstr "Visningshastighed"
 
 #: hacks/config/hypertorus.xml.h:7 hacks/config/polytopes.xml.h:12
 
 #: hacks/config/hypertorus.xml.h:7 hacks/config/polytopes.xml.h:12
-#, fuzzy
 msgid "Orthographic 3d"
 msgid "Orthographic 3d"
-msgstr "Ortografisk projektion"
+msgstr "Ortografisk 3d"
 
 #: hacks/config/hypertorus.xml.h:8 hacks/config/polytopes.xml.h:13
 
 #: hacks/config/hypertorus.xml.h:8 hacks/config/polytopes.xml.h:13
-#, fuzzy
 msgid "Orthographic 4d"
 msgid "Orthographic 4d"
-msgstr "Ortografisk projektion"
+msgstr "Ortografisk 4d"
 
 #: hacks/config/hypertorus.xml.h:9 hacks/config/polytopes.xml.h:14
 msgid "Perspective 3d"
 
 #: hacks/config/hypertorus.xml.h:9 hacks/config/polytopes.xml.h:14
 msgid "Perspective 3d"
-msgstr ""
+msgstr "Perspektiv 3d"
 
 #: hacks/config/hypertorus.xml.h:10 hacks/config/polytopes.xml.h:15
 msgid "Perspective 4d"
 
 #: hacks/config/hypertorus.xml.h:10 hacks/config/polytopes.xml.h:15
 msgid "Perspective 4d"
-msgstr ""
+msgstr "Perspektiv 4d"
 
 #: hacks/config/hypertorus.xml.h:11
 
 #: hacks/config/hypertorus.xml.h:11
-#, fuzzy
 msgid "See-Through Bands"
 msgid "See-Through Bands"
-msgstr "Skift mellem tilstande"
+msgstr "Gennemsigtige bind"
 
 #: hacks/config/hypertorus.xml.h:14
 
 #: hacks/config/hypertorus.xml.h:14
-#, fuzzy
 msgid "Solid Object"
 msgid "Solid Object"
-msgstr "Ensfarvede objekter"
+msgstr "Ensfarvet objekt"
 
 #: hacks/config/hypertorus.xml.h:15 hacks/config/mirrorblob.xml.h:20
 #: hacks/config/polytopes.xml.h:21 hacks/config/pulsar.xml.h:16
 
 #: hacks/config/hypertorus.xml.h:15 hacks/config/mirrorblob.xml.h:20
 #: hacks/config/polytopes.xml.h:21 hacks/config/pulsar.xml.h:16
@@ -4784,7 +4776,7 @@ msgstr "Gennemsigtig"
 
 #: hacks/config/hypertorus.xml.h:18
 msgid "Two-Sided"
 
 #: hacks/config/hypertorus.xml.h:18
 msgid "Two-Sided"
-msgstr ""
+msgstr "Tosidet"
 
 #: hacks/config/hypertorus.xml.h:19 hacks/config/polytopes.xml.h:24
 #, fuzzy
 
 #: hacks/config/hypertorus.xml.h:19 hacks/config/polytopes.xml.h:24
 #, fuzzy
@@ -4881,7 +4873,7 @@ msgstr "10"
 
 #: hacks/config/interference.xml.h:2
 msgid "360"
 
 #: hacks/config/interference.xml.h:2
 msgid "360"
-msgstr ""
+msgstr "360"
 
 #: hacks/config/interference.xml.h:3
 msgid "Anim Speed"
 
 #: hacks/config/interference.xml.h:3
 msgid "Anim Speed"
@@ -4899,7 +4891,7 @@ msgstr ""
 
 #: hacks/config/interference.xml.h:9
 msgid "Hue"
 
 #: hacks/config/interference.xml.h:9
 msgid "Hue"
-msgstr ""
+msgstr "Farvetone"
 
 #: hacks/config/interference.xml.h:10
 msgid "Interference"
 
 #: hacks/config/interference.xml.h:10
 msgid "Interference"
@@ -4920,31 +4912,29 @@ msgstr "Bølgestørrelse"
 
 #: hacks/config/jigglypuff.xml.h:2
 msgid "Chrome"
 
 #: hacks/config/jigglypuff.xml.h:2
 msgid "Chrome"
-msgstr ""
+msgstr "Krom"
 
 #: hacks/config/jigglypuff.xml.h:3
 msgid "Clown barf"
 
 #: hacks/config/jigglypuff.xml.h:3
 msgid "Clown barf"
-msgstr ""
+msgstr "Klovnebræk"
 
 #: hacks/config/jigglypuff.xml.h:5
 
 #: hacks/config/jigglypuff.xml.h:5
-#, fuzzy
 msgid "Cycle"
 msgid "Cycle"
-msgstr "Cyklusser"
+msgstr "Cyklus"
 
 #: hacks/config/jigglypuff.xml.h:7
 msgid "Flower box"
 
 #: hacks/config/jigglypuff.xml.h:7
 msgid "Flower box"
-msgstr ""
+msgstr "Blomsterkasse"
 
 #: hacks/config/jigglypuff.xml.h:9
 msgid "Inertial damping"
 
 #: hacks/config/jigglypuff.xml.h:9
 msgid "Inertial damping"
-msgstr ""
+msgstr "Inertidampning"
 
 #: hacks/config/jigglypuff.xml.h:10
 msgid "JigglyPuff"
 
 #: hacks/config/jigglypuff.xml.h:10
 msgid "JigglyPuff"
-msgstr ""
+msgstr "JigglyPuff"
 
 #: hacks/config/jigglypuff.xml.h:14
 
 #: hacks/config/jigglypuff.xml.h:14
-#, fuzzy
 msgid "Rotation speed"
 msgstr "Rotationshastighed"
 
 msgid "Rotation speed"
 msgstr "Rotationshastighed"
 
@@ -4954,16 +4944,15 @@ msgstr "Kugle"
 
 #: hacks/config/jigglypuff.xml.h:18
 msgid "Sphere strength"
 
 #: hacks/config/jigglypuff.xml.h:18
 msgid "Sphere strength"
-msgstr ""
+msgstr "Kuglestyrke"
 
 #: hacks/config/jigglypuff.xml.h:19
 
 #: hacks/config/jigglypuff.xml.h:19
-#, fuzzy
 msgid "Spookiness"
 msgid "Spookiness"
-msgstr "Kurver"
+msgstr "Skræmmeri"
 
 #: hacks/config/jigglypuff.xml.h:20
 msgid "Spoooooky"
 
 #: hacks/config/jigglypuff.xml.h:20
 msgid "Spoooooky"
-msgstr ""
+msgstr "Skræææææmende"
 
 #: hacks/config/jigglypuff.xml.h:21 hacks/config/polyhedra.xml.h:155
 #: hacks/config/sballs.xml.h:16
 
 #: hacks/config/jigglypuff.xml.h:21 hacks/config/polyhedra.xml.h:155
 #: hacks/config/sballs.xml.h:16
@@ -4988,29 +4977,27 @@ msgstr ""
 
 #: hacks/config/jigglypuff.xml.h:23
 msgid "Vertex-vertex behavior"
 
 #: hacks/config/jigglypuff.xml.h:23
 msgid "Vertex-vertex behavior"
-msgstr ""
+msgstr "Vertex-vertex opførsel"
 
 #: hacks/config/jigglypuff.xml.h:24
 msgid "Vertex-vertex force"
 
 #: hacks/config/jigglypuff.xml.h:24
 msgid "Vertex-vertex force"
-msgstr ""
+msgstr "Vertex-vertex kraft"
 
 #: hacks/config/jigglypuff.xml.h:26
 msgid "collapse"
 
 #: hacks/config/jigglypuff.xml.h:26
 msgid "collapse"
-msgstr ""
+msgstr "kollapse"
 
 #: hacks/config/jigglypuff.xml.h:27
 msgid "expand"
 
 #: hacks/config/jigglypuff.xml.h:27
 msgid "expand"
-msgstr ""
+msgstr "udvid"
 
 #: hacks/config/jigglypuff.xml.h:28
 
 #: hacks/config/jigglypuff.xml.h:28
-#, fuzzy
 msgid "none"
 msgid "none"
-msgstr "Ingen"
+msgstr "ingen"
 
 #: hacks/config/jigglypuff.xml.h:29
 
 #: hacks/config/jigglypuff.xml.h:29
-#, fuzzy
 msgid "strong"
 msgid "strong"
-msgstr "Mærkelig"
+msgstr "stærk"
 
 #: hacks/config/jigsaw.xml.h:4
 msgid "Jigsaw"
 
 #: hacks/config/jigsaw.xml.h:4
 msgid "Jigsaw"
@@ -5040,11 +5027,12 @@ msgstr ""
 msgid "Checkered Balls"
 msgstr "Ternede kugler"
 
 msgid "Checkered Balls"
 msgstr "Ternede kugler"
 
-#: hacks/config/juggle.xml.h:2
+#. -pattern would be a really long, confusing option menu
+#: hacks/config/juggle.xml.h:3
 msgid "Draws a juggling stick-man. Written by Tim Auckland."
 msgstr "Tegner en jonglerende tændstiksmand. Skrevet af Tim Auckland."
 
 msgid "Draws a juggling stick-man. Written by Tim Auckland."
 msgstr "Tegner en jonglerende tændstiksmand. Skrevet af Tim Auckland."
 
-#: hacks/config/juggle.xml.h:4
+#: hacks/config/juggle.xml.h:5
 msgid "Juggle"
 msgstr "Jonglering"
 
 msgid "Juggle"
 msgstr "Jonglering"
 
@@ -5073,7 +5061,8 @@ msgstr ""
 "billedet blev dannet ud fra. Skrevet af Sean McCullough."
 
 # RETMIG: hvad er meme?
 "billedet blev dannet ud fra. Skrevet af Sean McCullough."
 
 # RETMIG: hvad er meme?
-#: hacks/config/kaleidescope.xml.h:1
+#. #### -spring_constant [5]
+#: hacks/config/kaleidescope.xml.h:2
 msgid ""
 "Another clone of an ancient meme, consisting largely of frenetic rotational "
 "motion of colored lines. This one is by Ron Tapia. The motion is nice, but I "
 msgid ""
 "Another clone of an ancient meme, consisting largely of frenetic rotational "
 "motion of colored lines. This one is by Ron Tapia. The motion is nice, but I "
@@ -5085,35 +5074,37 @@ msgstr ""
 "nok flere ensfarvede felter eller måske bare lysere farver. Flere "
 "variationer i rotationshastigheden ville måske også hjælpe."
 
 "nok flere ensfarvede felter eller måske bare lysere farver. Flere "
 "variationer i rotationshastigheden ville måske også hjælpe."
 
-#: hacks/config/kaleidescope.xml.h:4
+#: hacks/config/kaleidescope.xml.h:5
 msgid "Kaleidescope"
 msgstr "Kalejdoskop"
 
 msgid "Kaleidescope"
 msgstr "Kalejdoskop"
 
-#: hacks/config/kaleidescope.xml.h:6 hacks/config/qix.xml.h:18
+#: hacks/config/kaleidescope.xml.h:7 hacks/config/qix.xml.h:18
 msgid "Segments"
 msgstr "Segmenter"
 
 msgid "Segments"
 msgstr "Segmenter"
 
-#: hacks/config/kaleidescope.xml.h:9
+#: hacks/config/kaleidescope.xml.h:10
 msgid "Symmetry"
 msgstr "Symmetri"
 
 msgid "Symmetry"
 msgstr "Symmetri"
 
-#: hacks/config/kaleidescope.xml.h:10
+#: hacks/config/kaleidescope.xml.h:11
 msgid "Trails"
 msgstr "Spor"
 
 #: hacks/config/klein.xml.h:3
 msgid "Klein"
 msgid "Trails"
 msgstr "Spor"
 
 #: hacks/config/klein.xml.h:3
 msgid "Klein"
-msgstr ""
+msgstr "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:10
 msgid ""
 "This draws a visualization of a Klein bottle or some other interesting "
 "parametric surfaces. Written by Andrey Mirtchovski."
 msgstr ""
+"Dette tegner en visualisering af en Klein-flaske eller nogle andre "
+"interessante parametriske overflader. Skrevet af Andrey Mirtchovski."
 
 #: hacks/config/klein.xml.h:11
 msgid "Use Randomized Surfaces and Primitives"
 
 #: hacks/config/klein.xml.h:11
 msgid "Use Randomized Surfaces and Primitives"
-msgstr ""
+msgstr "Benyt tilfældige overflader og primitiver"
 
 #: hacks/config/klein.xml.h:12
 #, fuzzy
 
 #: hacks/config/klein.xml.h:12
 #, fuzzy
@@ -5363,7 +5354,8 @@ msgstr "Startgenerator"
 msgid "Solve Speed"
 msgstr "Løsningsfart"
 
 msgid "Solve Speed"
 msgstr "Løsningsfart"
 
-#: hacks/config/maze.xml.h:16
+#. #### -surround-color [slateblue]
+#: hacks/config/maze.xml.h:17
 msgid ""
 "This is the ancient X maze demo, modified to work with xscreensaver. It "
 "generates a random maze, then solves it with visual feedback. Originally by "
 msgid ""
 "This is the ancient X maze demo, modified to work with xscreensaver. It "
 "generates a random maze, then solves it with visual feedback. Originally by "
@@ -5391,18 +5383,19 @@ msgstr "Tegn afgrænsende boks"
 
 #: hacks/config/memscroller.xml.h:4
 msgid "Dump Memory"
 
 #: hacks/config/memscroller.xml.h:4
 msgid "Dump Memory"
-msgstr ""
+msgstr "Dump hukommelsen"
 
 #: hacks/config/memscroller.xml.h:6
 
 #: hacks/config/memscroller.xml.h:6
-#, fuzzy
 msgid "MemScroller"
 msgid "MemScroller"
-msgstr "Rullefart"
+msgstr "HukRuller"
 
 #: hacks/config/memscroller.xml.h:9
 msgid ""
 "This draws a dump of its own process memory scrolling across the screen in "
 "three windows at three different rates. Written by Jamie Zawinski."
 msgstr ""
 
 #: hacks/config/memscroller.xml.h:9
 msgid ""
 "This draws a dump of its own process memory scrolling across the screen in "
 "three windows at three different rates. Written by Jamie Zawinski."
 msgstr ""
+"Denne tegner et dump af sin egen proces-hukommelse, der ruller over skærmen "
+"i tre vinduer med tre forskellige hastigheder. Skrevet af Jamie Zawinski."
 
 #: hacks/config/menger.xml.h:6
 msgid "Menger"
 
 #: hacks/config/menger.xml.h:6
 msgid "Menger"
@@ -5428,29 +5421,28 @@ msgid ""
 "Draws two dimensional metaballs: overlapping and merging balls with fuzzy "
 "edges. By W.P. van Paassen."
 msgstr ""
 "Draws two dimensional metaballs: overlapping and merging balls with fuzzy "
 "edges. By W.P. van Paassen."
 msgstr ""
+"Tegner 2d-metabolde: overlapper og sammenføjer bolde med upræcise kanter. Af "
+"W.P. van Paassen."
 
 #: hacks/config/metaballs.xml.h:7
 msgid "MetaBall Movement"
 
 #: hacks/config/metaballs.xml.h:7
 msgid "MetaBall Movement"
-msgstr ""
+msgstr "Metabold bevægelse"
 
 #: hacks/config/metaballs.xml.h:8
 
 #: hacks/config/metaballs.xml.h:8
-#, fuzzy
 msgid "MetaBall Radius"
 msgid "MetaBall Radius"
-msgstr "Sædningsradius"
+msgstr "Metaboldradius"
 
 #: hacks/config/metaballs.xml.h:9
 
 #: hacks/config/metaballs.xml.h:9
-#, fuzzy
 msgid "MetaBalls"
 msgid "MetaBalls"
-msgstr "Kugler"
+msgstr "Metabolde"
 
 #: hacks/config/metaballs.xml.h:11
 
 #: hacks/config/metaballs.xml.h:11
-#, fuzzy
 msgid "Number of MetaBalls"
 msgid "Number of MetaBalls"
-msgstr "Antal fraktaler"
+msgstr "Antal metabolde"
 
 #: hacks/config/mirrorblob.xml.h:4
 msgid "Blobby"
 
 #: hacks/config/mirrorblob.xml.h:4
 msgid "Blobby"
-msgstr ""
+msgstr "Blobby"
 
 #: hacks/config/mirrorblob.xml.h:5 hacks/config/nerverot.xml.h:2
 msgid "Calm"
 
 #: hacks/config/mirrorblob.xml.h:5 hacks/config/nerverot.xml.h:2
 msgid "Calm"
@@ -5461,78 +5453,74 @@ msgid ""
 "Draws a wobbly blob that distorts the image behind it. Requires OpenGL "
 "hardware acceleration for nice animation. Written by Jon Dowdall."
 msgstr ""
 "Draws a wobbly blob that distorts the image behind it. Requires OpenGL "
 "hardware acceleration for nice animation. Written by Jon Dowdall."
 msgstr ""
+"Tegner et blævrende blob som forvrænger billedet bag det. Kræver maskin-"
+"accelereret OpenGL for en pæn animation. Skrevet af Jon Dowdall."
 
 #: hacks/config/mirrorblob.xml.h:8
 
 #: hacks/config/mirrorblob.xml.h:8
-#, fuzzy
 msgid "Enable Background Image"
 msgid "Enable Background Image"
-msgstr "Flad baggrund"
+msgstr "Aktivér baggrundsbillede"
 
 #: hacks/config/mirrorblob.xml.h:9
 
 #: hacks/config/mirrorblob.xml.h:9
-#, fuzzy
 msgid "Enable Colouring"
 msgid "Enable Colouring"
-msgstr "Slå blomstring til"
+msgstr "Aktivér farvepålægelse"
 
 #: hacks/config/mirrorblob.xml.h:10
 msgid "Enable Reflected Image"
 
 #: hacks/config/mirrorblob.xml.h:10
 msgid "Enable Reflected Image"
-msgstr ""
+msgstr "Aktivér reflekteret billede"
 
 #: hacks/config/mirrorblob.xml.h:11
 
 #: hacks/config/mirrorblob.xml.h:11
-#, fuzzy
 msgid "Enable Walls"
 msgid "Enable Walls"
-msgstr "Slå tåge til"
+msgstr "Aktivér væge"
 
 #: hacks/config/mirrorblob.xml.h:13
 
 #: hacks/config/mirrorblob.xml.h:13
-#, fuzzy
 msgid "Field Points"
 msgid "Field Points"
-msgstr "Punkter"
+msgstr "Feltpunkter"
 
 #: hacks/config/mirrorblob.xml.h:14
 
 #: hacks/config/mirrorblob.xml.h:14
-#, fuzzy
 msgid "Freaky"
 msgid "Freaky"
-msgstr "_Fil"
+msgstr "Freaky"
 
 #: hacks/config/mirrorblob.xml.h:15
 msgid "MirrorBlob"
 
 #: hacks/config/mirrorblob.xml.h:15
 msgid "MirrorBlob"
-msgstr ""
+msgstr "SpejlBlob"
 
 #: hacks/config/mirrorblob.xml.h:17
 msgid "Offset Texture Coordinates"
 
 #: hacks/config/mirrorblob.xml.h:17
 msgid "Offset Texture Coordinates"
-msgstr ""
+msgstr "Forskyd teksturkoordinater"
 
 #: hacks/config/mirrorblob.xml.h:23
 msgid "Very Freaky"
 
 #: hacks/config/mirrorblob.xml.h:23
 msgid "Very Freaky"
-msgstr ""
+msgstr "Meget freaky"
 
 #: hacks/config/mirrorblob.xml.h:25
 
 #: hacks/config/mirrorblob.xml.h:25
-#, fuzzy
 msgid "X Resolution"
 msgid "X Resolution"
-msgstr "Opløsning"
+msgstr "X-opløsning"
 
 #: hacks/config/mirrorblob.xml.h:26
 
 #: hacks/config/mirrorblob.xml.h:26
-#, fuzzy
 msgid "Y Resolution"
 msgid "Y Resolution"
-msgstr "Opløsning"
+msgstr "Y-opløsning"
 
 #: hacks/config/mismunch.xml.h:5
 
 #: hacks/config/mismunch.xml.h:5
-#, fuzzy
 msgid "Mismunch"
 msgid "Mismunch"
-msgstr "Firkantæder"
+msgstr "Misgnaske"
 
 #: hacks/config/mismunch.xml.h:6
 msgid ""
 "Munching errors! This is a creatively broken misimplementation of the "
 "classic munching squares graphics hack. Written by Steven Hazel."
 msgstr ""
 
 #: hacks/config/mismunch.xml.h:6
 msgid ""
 "Munching errors! This is a creatively broken misimplementation of the "
 "classic munching squares graphics hack. Written by Steven Hazel."
 msgstr ""
+"Gnaskefejl! Dette er en kreativ ødelagt misimplementering af den klassiske "
+"kvadratgnasker pauseskærm. Skrevet af Steven Hazel."
 
 #: hacks/config/mismunch.xml.h:7
 msgid "One"
 
 #: hacks/config/mismunch.xml.h:7
 msgid "One"
-msgstr ""
+msgstr "En"
 
 #: hacks/config/mismunch.xml.h:9
 msgid "Simultaneous Squares"
 
 #: hacks/config/mismunch.xml.h:9
 msgid "Simultaneous Squares"
-msgstr ""
+msgstr "Simultane kvadrater"
 
 
-#: hacks/config/mismunch.xml.h:13 hacks/config/munch.xml.h:10
+#: hacks/config/mismunch.xml.h:13 hacks/config/munch.xml.h:11
 #: hacks/config/qix.xml.h:26
 msgid "XOR"
 msgstr "XOR"
 #: hacks/config/qix.xml.h:26
 msgid "XOR"
 msgstr "XOR"
@@ -5673,7 +5661,8 @@ msgstr ""
 msgid "Mountain"
 msgstr "Bjerg"
 
 msgid "Mountain"
 msgstr "Bjerg"
 
-#: hacks/config/munch.xml.h:1
+#. #### -logminwidth [7]
+#: hacks/config/munch.xml.h:2
 msgid ""
 "DATAI 2 ADDB 1,2 ROTC 2,-22 XOR 1,2 JRST .-4 As reported by HAKMEM, in 1962, "
 "Jackson Wright wrote the above PDP-1 code. That code still lives on in this "
 msgid ""
 "DATAI 2 ADDB 1,2 ROTC 2,-22 XOR 1,2 JRST .-4 As reported by HAKMEM, in 1962, "
 "Jackson Wright wrote the above PDP-1 code. That code still lives on in this "
@@ -5685,7 +5674,7 @@ msgstr ""
 "denne pauseskærm, omkring 40 år efter. Antallet af omgivende linjer kode er "
 "dog steget en del. Denne version er af Tim Showalter."
 
 "denne pauseskærm, omkring 40 år efter. Antallet af omgivende linjer kode er "
 "dog steget en del. Denne version er af Tim Showalter."
 
-#: hacks/config/munch.xml.h:5
+#: hacks/config/munch.xml.h:6
 msgid "Munch"
 msgstr "Firkantæder"
 
 msgid "Munch"
 msgstr "Firkantæder"
 
@@ -5736,13 +5725,14 @@ msgstr "Spastisk"
 
 #: hacks/config/noof.xml.h:1
 msgid "Draws some rotatey patterns, using OpenGL. Written by Mark Kilgard."
 
 #: hacks/config/noof.xml.h:1
 msgid "Draws some rotatey patterns, using OpenGL. Written by Mark Kilgard."
-msgstr ""
+msgstr "Tegner nogle roterende mønstre med OpenGL. Skrevet af Mark Kilgard."
 
 #: hacks/config/noof.xml.h:3
 msgid "Noof"
 
 #: hacks/config/noof.xml.h:3
 msgid "Noof"
-msgstr ""
+msgstr "Noof"
 
 
-#: hacks/config/noseguy.xml.h:1
+#. #### -text-background [?]
+#: hacks/config/noseguy.xml.h:2
 msgid ""
 "A little man with a big nose wanders around your screen saying things. The "
 "things which he says can come from a file, or from an external program like "
 msgid ""
 "A little man with a big nose wanders around your screen saying things. The "
 "things which he says can come from a file, or from an external program like "
@@ -5754,23 +5744,23 @@ msgstr ""
 "'zippy' eller 'fortune'. Pauseskærmen blev udtrukket af 'xnlock' af Dan "
 "Heller. Farvelagt af Jamie Zawinski."
 
 "'zippy' eller 'fortune'. Pauseskærmen blev udtrukket af 'xnlock' af Dan "
 "Heller. Farvelagt af Jamie Zawinski."
 
-#: hacks/config/noseguy.xml.h:2
+#: hacks/config/noseguy.xml.h:3
 msgid "Get Text from File"
 msgstr "Skaf tekst fra fil"
 
 msgid "Get Text from File"
 msgstr "Skaf tekst fra fil"
 
-#: hacks/config/noseguy.xml.h:3
+#: hacks/config/noseguy.xml.h:4
 msgid "Get Text from Program"
 msgstr "Skaf tekst fra program"
 
 msgid "Get Text from Program"
 msgstr "Skaf tekst fra program"
 
-#: hacks/config/noseguy.xml.h:4
+#: hacks/config/noseguy.xml.h:5
 msgid "Noseguy"
 msgstr "Næsefyr"
 
 msgid "Noseguy"
 msgstr "Næsefyr"
 
-#: hacks/config/noseguy.xml.h:6
+#: hacks/config/noseguy.xml.h:7
 msgid "Text File"
 msgstr "Tekstfil"
 
 msgid "Text File"
 msgstr "Tekstfil"
 
-#: hacks/config/noseguy.xml.h:8
+#: hacks/config/noseguy.xml.h:9
 msgid "Use Text Below"
 msgstr "Benyt tekst nedenfor"
 
 msgid "Use Text Below"
 msgstr "Benyt tekst nedenfor"
 
@@ -5789,12 +5779,15 @@ msgid ""
 "Simulates a game of Pac-Man on a randomly-created level. Written by Edwin de "
 "Jong."
 msgstr ""
 "Simulates a game of Pac-Man on a randomly-created level. Written by Edwin de "
 "Jong."
 msgstr ""
+"Simulere et spil Pacman på et tilfældigt oprettet niveau. Skrevet af Edwin "
+"de Jong."
 
 #: hacks/config/pedal.xml.h:7
 msgid "Pedal"
 msgstr "Pedal"
 
 
 #: hacks/config/pedal.xml.h:7
 msgid "Pedal"
 msgstr "Pedal"
 
-#: hacks/config/pedal.xml.h:8
+#. #### -background [black]
+#: hacks/config/pedal.xml.h:9
 msgid ""
 "This is sort of a combination spirograph/string-art. It generates a large, "
 "complex polygon, and lets the X server do the bulk of the work by giving it "
 msgid ""
 "This is sort of a combination spirograph/string-art. It generates a large, "
 "complex polygon, and lets the X server do the bulk of the work by giving it "
@@ -5928,7 +5921,8 @@ msgstr "Langsom"
 msgid "Square"
 msgstr "Kvadrat"
 
 msgid "Square"
 msgstr "Kvadrat"
 
-#: hacks/config/petri.xml.h:27
+#. #### -mem-throttle [22M]
+#: hacks/config/petri.xml.h:28
 msgid ""
 "This simulates colonies of mold growing in a petri dish. Growing colored "
 "circles overlap and leave spiral interference in their wake. Written by Dan "
 msgid ""
 "This simulates colonies of mold growing in a petri dish. Growing colored "
 "circles overlap and leave spiral interference in their wake. Written by Dan "
@@ -5938,7 +5932,8 @@ msgstr ""
 "overlapper og efterlader spiralinterferens i deres spor. Skrevet af Dan "
 "Bornstein."
 
 "overlapper og efterlader spiralinterferens i deres spor. Skrevet af Dan "
 "Bornstein."
 
-#: hacks/config/phosphor.xml.h:1
+#. #### -font [fixed]
+#: hacks/config/phosphor.xml.h:2
 msgid ""
 "Draws a simulation of an old terminal, with large pixels and long-sustain "
 "phosphor. It can run any program as a source of the text it displays. "
 msgid ""
 "Draws a simulation of an old terminal, with large pixels and long-sustain "
 "phosphor. It can run any program as a source of the text it displays. "
@@ -5948,46 +5943,45 @@ msgstr ""
 "langsomt aftagende fosfor. Kan køre alle programmer som en kilde til teksten "
 "der vises. Skrevet af Jamie Zawinski."
 
 "langsomt aftagende fosfor. Kan køre alle programmer som en kilde til teksten "
 "der vises. Skrevet af Jamie Zawinski."
 
-#: hacks/config/phosphor.xml.h:2
+#: hacks/config/phosphor.xml.h:3
 msgid "Dump pipe"
 msgid "Dump pipe"
-msgstr ""
+msgstr "Dump rør"
 
 
-#: hacks/config/phosphor.xml.h:5
+#: hacks/config/phosphor.xml.h:6
 msgid "Phosphor"
 msgstr "Efterglød"
 
 msgid "Phosphor"
 msgstr "Efterglød"
 
-#: hacks/config/phosphor.xml.h:6
+#: hacks/config/phosphor.xml.h:7
 msgid "Scale"
 msgstr "Skalér"
 
 msgid "Scale"
 msgstr "Skalér"
 
-#: hacks/config/phosphor.xml.h:10
-#, fuzzy
+#: hacks/config/phosphor.xml.h:11
 msgid "Use PTY"
 msgid "Use PTY"
-msgstr "Benyt"
+msgstr "Benyt PTY"
 
 #: hacks/config/piecewise.xml.h:1
 msgid "Color shifting speed"
 
 #: hacks/config/piecewise.xml.h:1
 msgid "Color shifting speed"
-msgstr ""
+msgstr "Farveskifthastighed"
 
 #: hacks/config/piecewise.xml.h:6
 
 #: hacks/config/piecewise.xml.h:6
-#, fuzzy
 msgid "Maximum radius"
 msgid "Maximum radius"
-msgstr "Maksimal levetid"
+msgstr "Maksimal radius"
 
 #: hacks/config/piecewise.xml.h:7
 
 #: hacks/config/piecewise.xml.h:7
-#, fuzzy
 msgid "Minimum radius"
 msgid "Minimum radius"
-msgstr "Minimal levetid"
+msgstr "Minimal radius"
 
 #: hacks/config/piecewise.xml.h:8
 msgid "Piecewise"
 
 #: hacks/config/piecewise.xml.h:8
 msgid "Piecewise"
-msgstr ""
+msgstr "Delvis"
 
 #: 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/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 ""
+"Dette tegner en masse bevægende cirkler der skifter fra at være synlige til "
+"at være usynlige ved skæringspunkter. Skrevet af Geoffrey Irving."
 
 #: hacks/config/pipes.xml.h:1
 msgid "Allow Tight Turns"
 
 #: hacks/config/pipes.xml.h:1
 msgid "Allow Tight Turns"
@@ -6010,7 +6004,8 @@ msgstr "Fiskeøjelinser"
 msgid "Gadgetry"
 msgstr "Opfindelser"
 
 msgid "Gadgetry"
 msgstr "Opfindelser"
 
-#: hacks/config/pipes.xml.h:8
+#. #### -no-rotatepipes
+#: hacks/config/pipes.xml.h:9
 msgid ""
 "If you've ever been in the same room with a Windows NT machine, you've "
 "probably seen this GL hack. This version is by Marcelo Vianna."
 msgid ""
 "If you've ever been in the same room with a Windows NT machine, you've "
 "probably seen this GL hack. This version is by Marcelo Vianna."
@@ -6018,23 +6013,23 @@ msgstr ""
 "Hvis du nogensinde har siddet i samme rum som en Windows NT-maskine, har du "
 "sandsynligvis set denne 3d-pauseskærm. Denne version er af Marcelo Vianna."
 
 "Hvis du nogensinde har siddet i samme rum som en Windows NT-maskine, har du "
 "sandsynligvis set denne 3d-pauseskærm. Denne version er af Marcelo Vianna."
 
-#: hacks/config/pipes.xml.h:9 hacks/config/wormhole.xml.h:4
+#: hacks/config/pipes.xml.h:10 hacks/config/wormhole.xml.h:4
 msgid "Lots"
 msgstr "Mange"
 
 msgid "Lots"
 msgstr "Mange"
 
-#: hacks/config/pipes.xml.h:11
+#: hacks/config/pipes.xml.h:12
 msgid "Number of Pipe Systems"
 msgstr "Antal rørsystemer"
 
 msgid "Number of Pipe Systems"
 msgstr "Antal rørsystemer"
 
-#: hacks/config/pipes.xml.h:12
+#: hacks/config/pipes.xml.h:13
 msgid "Pipe Fittings"
 msgstr "Rørsamlinger"
 
 msgid "Pipe Fittings"
 msgstr "Rørsamlinger"
 
-#: hacks/config/pipes.xml.h:13
+#: hacks/config/pipes.xml.h:14
 msgid "Pipes"
 msgstr "Rør"
 
 msgid "Pipes"
 msgstr "Rør"
 
-#: hacks/config/pipes.xml.h:17
+#: hacks/config/pipes.xml.h:18
 msgid "System Length"
 msgstr "Længde af system"
 
 msgid "System Length"
 msgstr "Længde af system"
 
@@ -6049,7 +6044,7 @@ msgstr "Terning"
 
 #: hacks/config/polyhedra.xml.h:5
 msgid "Cubitruncated Cuboctahedron"
 
 #: hacks/config/polyhedra.xml.h:5
 msgid "Cubitruncated Cuboctahedron"
-msgstr ""
+msgstr "Kubestub Kubeeder"
 
 #: hacks/config/polyhedra.xml.h:6
 #, fuzzy
 
 #: hacks/config/polyhedra.xml.h:6
 #, fuzzy
@@ -6081,7 +6076,7 @@ msgstr ""
 
 #: hacks/config/polyhedra.xml.h:12
 msgid "Display Random Polyhedron"
 
 #: hacks/config/polyhedra.xml.h:12
 msgid "Display Random Polyhedron"
-msgstr ""
+msgstr "Vis tilfældige polyeder"
 
 #: hacks/config/polyhedra.xml.h:13
 msgid ""
 
 #: hacks/config/polyhedra.xml.h:13
 msgid ""
@@ -6394,7 +6389,7 @@ msgstr "Octahedron"
 
 #: hacks/config/polyhedra.xml.h:89
 msgid "Pentagonal Antiprism"
 
 #: hacks/config/polyhedra.xml.h:89
 msgid "Pentagonal Antiprism"
-msgstr ""
+msgstr "Femkantet antiprisme"
 
 #: hacks/config/polyhedra.xml.h:90
 msgid "Pentagonal Deltohedron"
 
 #: hacks/config/polyhedra.xml.h:90
 msgid "Pentagonal Deltohedron"
@@ -6414,7 +6409,7 @@ msgstr ""
 
 #: hacks/config/polyhedra.xml.h:94
 msgid "Pentagonal Prism"
 
 #: hacks/config/polyhedra.xml.h:94
 msgid "Pentagonal Prism"
-msgstr ""
+msgstr "Femkantet prisme"
 
 #: hacks/config/polyhedra.xml.h:95
 msgid "Pentagrammic Antiprism"
 
 #: hacks/config/polyhedra.xml.h:95
 msgid "Pentagrammic Antiprism"
@@ -6734,7 +6729,7 @@ msgstr ""
 
 #: hacks/config/polytopes.xml.h:2
 msgid "120-Cell"
 
 #: hacks/config/polytopes.xml.h:2
 msgid "120-Cell"
-msgstr ""
+msgstr "120-celle"
 
 #: hacks/config/polytopes.xml.h:3
 msgid "16-Cell (Hyper-Octahedron)"
 
 #: hacks/config/polytopes.xml.h:3
 msgid "16-Cell (Hyper-Octahedron)"
@@ -6742,7 +6737,7 @@ msgstr ""
 
 #: hacks/config/polytopes.xml.h:4
 msgid "24-Cell"
 
 #: hacks/config/polytopes.xml.h:4
 msgid "24-Cell"
-msgstr ""
+msgstr "24-celle"
 
 #: hacks/config/polytopes.xml.h:6
 msgid "5-Cell (Hyper-Tetrahedron)"
 
 #: hacks/config/polytopes.xml.h:6
 msgid "5-Cell (Hyper-Tetrahedron)"
@@ -6750,7 +6745,7 @@ msgstr ""
 
 #: hacks/config/polytopes.xml.h:7
 msgid "600-Cell"
 
 #: hacks/config/polytopes.xml.h:7
 msgid "600-Cell"
-msgstr ""
+msgstr "600-celle"
 
 #: hacks/config/polytopes.xml.h:8
 msgid "8-Cell (Hypercube / Tesseract)"
 
 #: hacks/config/polytopes.xml.h:8
 msgid "8-Cell (Hypercube / Tesseract)"
@@ -6758,16 +6753,15 @@ msgstr ""
 
 #: hacks/config/polytopes.xml.h:9
 msgid "Colors By 4D Depth"
 
 #: hacks/config/polytopes.xml.h:9
 msgid "Colors By 4D Depth"
-msgstr ""
+msgstr "Farve ved 4d-dybde"
 
 #: hacks/config/polytopes.xml.h:17
 msgid "Regular 4D Polytopes"
 msgstr ""
 
 #: hacks/config/polytopes.xml.h:19
 
 #: hacks/config/polytopes.xml.h:17
 msgid "Regular 4D Polytopes"
 msgstr ""
 
 #: hacks/config/polytopes.xml.h:19
-#, fuzzy
 msgid "Single Color"
 msgid "Single Color"
-msgstr "Skift mellem farver"
+msgstr "Enkelt farve"
 
 #: hacks/config/polytopes.xml.h:22
 msgid ""
 
 #: hacks/config/polytopes.xml.h:22
 msgid ""
@@ -6797,12 +6791,11 @@ msgstr "Kantbredde"
 
 #: hacks/config/popsquares.xml.h:2
 msgid "End color"
 
 #: hacks/config/popsquares.xml.h:2
 msgid "End color"
-msgstr ""
+msgstr "Slutfarve"
 
 #: hacks/config/popsquares.xml.h:7
 
 #: hacks/config/popsquares.xml.h:7
-#, fuzzy
 msgid "Start color"
 msgid "Start color"
-msgstr "Skræmmende farver"
+msgstr "Startfarve"
 
 #: hacks/config/popsquares.xml.h:8
 msgid "Subdivision"
 
 #: hacks/config/popsquares.xml.h:8
 msgid "Subdivision"
@@ -6812,30 +6805,33 @@ msgstr ""
 msgid ""
 "This draws a pop-art-ish looking grid of pulsing colors. By Levi Burton."
 msgstr ""
 msgid ""
 "This draws a pop-art-ish looking grid of pulsing colors. By Levi Burton."
 msgstr ""
+"Dette tegner en popkunstnerisk udseende gitter af pulserende farver. Af Levi "
+"Burton."
 
 #: hacks/config/popsquares.xml.h:10
 msgid "Twitch"
 
 #: hacks/config/popsquares.xml.h:10
 msgid "Twitch"
-msgstr ""
+msgstr "Trækning"
 
 #: hacks/config/popsquares.xml.h:11
 #, fuzzy
 msgid "popsquares"
 
 #: hacks/config/popsquares.xml.h:11
 #, fuzzy
 msgid "popsquares"
-msgstr "Kvadrat"
+msgstr "popkvadrater"
 
 #: hacks/config/providence.xml.h:1
 
 #: hacks/config/providence.xml.h:1
-#, fuzzy
 msgid "Draw Eye"
 msgid "Draw Eye"
-msgstr "Tegn etiketter"
+msgstr "Tegn øje"
 
 #: hacks/config/providence.xml.h:3
 msgid "Providence"
 
 #: hacks/config/providence.xml.h:3
 msgid "Providence"
-msgstr ""
+msgstr "Skæbnen"
 
 #: hacks/config/providence.xml.h:7
 msgid ""
 "The providence code displays an eye, shrouded in glory, set upon the base of "
 "a pyramid. Written by Blair Tennessy."
 msgstr ""
 
 #: hacks/config/providence.xml.h:7
 msgid ""
 "The providence code displays an eye, shrouded in glory, set upon the base of "
 "a pyramid. Written by Blair Tennessy."
 msgstr ""
+"Skæbnekoden viser et øje hyllet i hæder og sat på en pyramide. Skrevet af "
+"Blair Tennessy."
 
 #: hacks/config/pulsar.xml.h:1
 msgid "Anti-alias Lines"
 
 #: hacks/config/pulsar.xml.h:1
 msgid "Anti-alias Lines"
@@ -7092,7 +7088,8 @@ msgstr "Rotering"
 msgid "Steering"
 msgstr "Styring"
 
 msgid "Steering"
 msgstr "Styring"
 
-#: hacks/config/rocks.xml.h:11
+#. #### -right3d [Red]
+#: hacks/config/rocks.xml.h:12
 msgid ""
 "This draws an animation of flight through an asteroid field, with changes in "
 "rotation and direction. It can also display 3D separations for red/blue "
 msgid ""
 "This draws an animation of flight through an asteroid field, with changes in "
 "rotation and direction. It can also display 3D separations for red/blue "
@@ -7102,7 +7099,7 @@ msgstr ""
 "og retning. Kan også vise 3d-separationer til brug med rød/blå-briller! For "
 "størstepartens vedkommende skrevet af Jamie Zawinski."
 
 "og retning. Kan også vise 3d-separationer til brug med rød/blå-briller! For "
 "størstepartens vedkommende skrevet af Jamie Zawinski."
 
-#: hacks/config/rocks.xml.h:13
+#: hacks/config/rocks.xml.h:14
 msgid "Velocity"
 msgstr "Hastighed"
 
 msgid "Velocity"
 msgstr "Hastighed"
 
@@ -7317,57 +7314,62 @@ msgstr ""
 
 #: hacks/config/sonar.xml.h:1
 msgid "Ping known hosts"
 
 #: hacks/config/sonar.xml.h:1
 msgid "Ping known hosts"
-msgstr ""
+msgstr "Ping kendte værter"
 
 #: hacks/config/sonar.xml.h:2
 msgid "Ping mode..."
 
 #: hacks/config/sonar.xml.h:2
 msgid "Ping mode..."
-msgstr ""
+msgstr "Ping-tilstand..."
 
 #: hacks/config/sonar.xml.h:3
 msgid "Ping subnet/24 (254 hosts)"
 
 #: hacks/config/sonar.xml.h:3
 msgid "Ping subnet/24 (254 hosts)"
-msgstr ""
+msgstr "Ping subnet/24 (254 værter)"
 
 #: hacks/config/sonar.xml.h:4
 msgid "Ping subnet/25 (126 hosts)"
 
 #: hacks/config/sonar.xml.h:4
 msgid "Ping subnet/25 (126 hosts)"
-msgstr ""
+msgstr "Ping subnet/25 (126 værter)"
 
 #: hacks/config/sonar.xml.h:5
 msgid "Ping subnet/26 (62 hosts)"
 
 #: hacks/config/sonar.xml.h:5
 msgid "Ping subnet/26 (62 hosts)"
-msgstr ""
+msgstr "Ping subnet/26 (62 værter)"
 
 #: hacks/config/sonar.xml.h:6
 msgid "Ping subnet/27 (31 hosts)"
 
 #: hacks/config/sonar.xml.h:6
 msgid "Ping subnet/27 (31 hosts)"
-msgstr ""
+msgstr "Ping subnet/27 (31 værter)"
 
 #: hacks/config/sonar.xml.h:7
 msgid "Ping subnet/28 (14 hosts)"
 
 #: hacks/config/sonar.xml.h:7
 msgid "Ping subnet/28 (14 hosts)"
-msgstr ""
+msgstr "Ping subnet/28 (14 værter)"
 
 #: hacks/config/sonar.xml.h:8
 msgid "Ping subnet/29 (6 hosts)"
 
 #: hacks/config/sonar.xml.h:8
 msgid "Ping subnet/29 (6 hosts)"
-msgstr ""
+msgstr "Ping subnet/29 (6 værter)"
 
 #: hacks/config/sonar.xml.h:9
 msgid "Ping subnet/30 (2 hosts)"
 
 #: hacks/config/sonar.xml.h:9
 msgid "Ping subnet/30 (2 hosts)"
-msgstr ""
+msgstr "Ping subnet/30 (2 værter)"
 
 #: hacks/config/sonar.xml.h:10
 
 #: hacks/config/sonar.xml.h:10
+msgid "Resolve Host Names"
+msgstr "Slå værtnavne op"
+
+#: hacks/config/sonar.xml.h:11
 msgid "Simulation Team Members"
 msgstr "Simuleringsholdmedlemmer"
 
 msgid "Simulation Team Members"
 msgstr "Simuleringsholdmedlemmer"
 
-#: hacks/config/sonar.xml.h:11
+#: hacks/config/sonar.xml.h:12
 msgid "Sonar"
 msgstr "Sonar"
 
 msgid "Sonar"
 msgstr "Sonar"
 
-#: hacks/config/sonar.xml.h:12
+#: hacks/config/sonar.xml.h:13
 msgid "Team A Name"
 msgstr "Hold A's navn"
 
 msgid "Team A Name"
 msgstr "Hold A's navn"
 
-#: hacks/config/sonar.xml.h:13
+#: hacks/config/sonar.xml.h:14
 msgid "Team B Name"
 msgstr "Hold B's navn"
 
 msgid "Team B Name"
 msgstr "Hold B's navn"
 
-#: hacks/config/sonar.xml.h:14
+#. #### -ttl [90]
+#: hacks/config/sonar.xml.h:16
 #, fuzzy
 msgid ""
 "This program draws a simulation of a sonar screen. By default, it displays a "
 #, fuzzy
 msgid ""
 "This program draws a simulation of a sonar screen. By default, it displays a "
@@ -7384,7 +7386,7 @@ msgstr ""
 "netværksforbindelser? processorforbrug pr. bruger?). Skrevet af Stephen "
 "Martin."
 
 "netværksforbindelser? processorforbrug pr. bruger?). Skrevet af Stephen "
 "Martin."
 
-#: hacks/config/sonar.xml.h:15
+#: hacks/config/sonar.xml.h:17
 msgid "vs."
 msgstr "vs."
 
 msgid "vs."
 msgstr "vs."
 
@@ -7412,7 +7414,8 @@ msgstr "Vis bonuser"
 msgid "Rocky Walls"
 msgstr "Klippevægge"
 
 msgid "Rocky Walls"
 msgstr "Klippevægge"
 
-#: hacks/config/speedmine.xml.h:12
+#. #### -psychedelic
+#: hacks/config/speedmine.xml.h:13
 msgid ""
 "Simulates speeding down a rocky mineshaft, or a funky dancing worm. Written "
 "by Conrad Parker."
 msgid ""
 "Simulates speeding down a rocky mineshaft, or a funky dancing worm. Written "
 "by Conrad Parker."
@@ -7420,15 +7423,15 @@ msgstr ""
 "Simulerer racerkørsel gennem en klipperig minegang eller en vildt dansende "
 "orm. Skrevet af Conrad Parker."
 
 "Simulerer racerkørsel gennem en klipperig minegang eller en vildt dansende "
 "orm. Skrevet af Conrad Parker."
 
-#: hacks/config/speedmine.xml.h:16
+#: hacks/config/speedmine.xml.h:17
 msgid "SpeedMine"
 msgstr "Minekørsel"
 
 msgid "SpeedMine"
 msgstr "Minekørsel"
 
-#: hacks/config/speedmine.xml.h:17
+#: hacks/config/speedmine.xml.h:18
 msgid "Thrust"
 msgstr "Drivkraft"
 
 msgid "Thrust"
 msgstr "Drivkraft"
 
-#: hacks/config/speedmine.xml.h:19 hacks/config/worm.xml.h:10
+#: hacks/config/speedmine.xml.h:20 hacks/config/worm.xml.h:11
 msgid "Worm"
 msgstr "Orm"
 
 msgid "Worm"
 msgstr "Orm"
 
@@ -7521,7 +7524,8 @@ msgstr "Q-bert møder Marble Madness! Skrevet af Ed Mackey."
 msgid "Sproingies"
 msgstr "Fjederhoppere"
 
 msgid "Sproingies"
 msgstr "Fjederhoppere"
 
-#: hacks/config/squiral.xml.h:3
+#. #### -cycle
+#: hacks/config/squiral.xml.h:4
 msgid ""
 "Draws a set of interacting, square-spiral-producing automata. The spirals "
 "grow outward until they hit something, then they go around it. Written by "
 msgid ""
 "Draws a set of interacting, square-spiral-producing automata. The spirals "
 "grow outward until they hit something, then they go around it. Written by "
@@ -7531,23 +7535,23 @@ msgstr ""
 "Spiralerne vokser udad til de støder ind i et eller andet, hverefter de "
 "bevæger sig rundt om det. Skrevet af Jeff Epler."
 
 "Spiralerne vokser udad til de støder ind i et eller andet, hverefter de "
 "bevæger sig rundt om det. Skrevet af Jeff Epler."
 
-#: hacks/config/squiral.xml.h:5
+#: hacks/config/squiral.xml.h:6
 msgid "Handedness"
 msgstr "Håndethed"
 
 msgid "Handedness"
 msgstr "Håndethed"
 
-#: hacks/config/squiral.xml.h:7
+#: hacks/config/squiral.xml.h:8
 msgid "Left"
 msgstr "Venstre"
 
 msgid "Left"
 msgstr "Venstre"
 
-#: hacks/config/squiral.xml.h:11 hacks/config/twang.xml.h:8
+#: hacks/config/squiral.xml.h:12 hacks/config/twang.xml.h:8
 msgid "Randomness"
 msgstr "Tilfældighed"
 
 msgid "Randomness"
 msgstr "Tilfældighed"
 
-#: hacks/config/squiral.xml.h:12
+#: hacks/config/squiral.xml.h:13
 msgid "Right"
 msgstr "Højre"
 
 msgid "Right"
 msgstr "Højre"
 
-#: hacks/config/squiral.xml.h:17
+#: hacks/config/squiral.xml.h:18
 msgid "Squiral"
 msgstr "Firaler"
 
 msgid "Squiral"
 msgstr "Firaler"
 
@@ -7606,7 +7610,8 @@ msgstr "Pulserende klat"
 msgid "Starfish"
 msgstr "Søstjerne"
 
 msgid "Starfish"
 msgstr "Søstjerne"
 
-#: hacks/config/starfish.xml.h:13
+#. #### -no-cycle
+#: hacks/config/starfish.xml.h:14
 msgid ""
 "This generates a sequence of undulating, throbbing, star-like patterns which "
 "pulsate, rotate, and turn inside out. Another display mode uses these shapes "
 msgid ""
 "This generates a sequence of undulating, throbbing, star-like patterns which "
 "pulsate, rotate, and turn inside out. Another display mode uses these shapes "
@@ -7773,7 +7778,8 @@ msgstr "Mindre"
 msgid "T3D"
 msgstr "Analogt 3d-ur"
 
 msgid "T3D"
 msgstr "Analogt 3d-ur"
 
-#: hacks/config/t3d.xml.h:15
+#. #### -hsv [?]
+#: hacks/config/t3d.xml.h:16
 msgid ""
 "This draws a working analog clock composed of floating, throbbing bubbles. "
 "Written by Bernd Paysan."
 msgid ""
 "This draws a working analog clock composed of floating, throbbing bubbles. "
 "Written by Bernd Paysan."
@@ -7781,11 +7787,11 @@ msgstr ""
 "Tegner et værkende analogt ur sammensat af flydende, pulserende bobler. "
 "Skrevet af Bernd Paysan."
 
 "Tegner et værkende analogt ur sammensat af flydende, pulserende bobler. "
 "Skrevet af Bernd Paysan."
 
-#: hacks/config/t3d.xml.h:16
+#: hacks/config/t3d.xml.h:17
 msgid "Turn Side-to-Side"
 msgstr "Drej fra side til side"
 
 msgid "Turn Side-to-Side"
 msgstr "Drej fra side til side"
 
-#: hacks/config/t3d.xml.h:17
+#: hacks/config/t3d.xml.h:18
 msgid "Wobbliness"
 msgstr "Slinger"
 
 msgid "Wobbliness"
 msgstr "Slinger"
 
@@ -7817,7 +7823,8 @@ msgstr ""
 msgid "Triangle"
 msgstr "Trekantsbjerge"
 
 msgid "Triangle"
 msgstr "Trekantsbjerge"
 
-#: hacks/config/truchet.xml.h:4
+#. #### -anim-step-size [3]
+#: hacks/config/truchet.xml.h:5
 msgid ""
 "This draws line- and arc-based Truchet patterns that tile the screen. "
 "Written by Adrian Likins."
 msgid ""
 "This draws line- and arc-based Truchet patterns that tile the screen. "
 "Written by Adrian Likins."
@@ -7825,7 +7832,7 @@ msgstr ""
 "Tegner linje- og buebaserede Truchet-mønstre der fliselægger skærmen. "
 "Skrevet af Adrian Likins."
 
 "Tegner linje- og buebaserede Truchet-mønstre der fliselægger skærmen. "
 "Skrevet af Adrian Likins."
 
-#: hacks/config/truchet.xml.h:5
+#: hacks/config/truchet.xml.h:6
 msgid "Truchet"
 msgstr "Truchet"
 
 msgid "Truchet"
 msgstr "Truchet"
 
@@ -7851,12 +7858,13 @@ msgstr "Overførsel"
 msgid "Twang"
 msgstr "Twang"
 
 msgid "Twang"
 msgstr "Twang"
 
-#: hacks/config/vermiculate.xml.h:1
+#. #### -instring [?]
+#: hacks/config/vermiculate.xml.h:2
 msgid "Draws squiggly worm-like paths. Written by Tyler Pierce."
 msgstr "Tegner krusedullelignede ormeagtige baner. Skrevet af Tyler Pierce."
 
 # selvopfundet ord
 msgid "Draws squiggly worm-like paths. Written by Tyler Pierce."
 msgstr "Tegner krusedullelignede ormeagtige baner. Skrevet af Tyler Pierce."
 
 # selvopfundet ord
-#: hacks/config/vermiculate.xml.h:2
+#: hacks/config/vermiculate.xml.h:3
 msgid "Vermiculate"
 msgstr "Ormifikation"
 
 msgid "Vermiculate"
 msgstr "Ormifikation"
 
@@ -7995,39 +8003,34 @@ msgstr "Skærmtilstande"
 
 #: hacks/config/whirlygig.xml.h:5
 msgid "Fun"
 
 #: hacks/config/whirlygig.xml.h:5
 msgid "Fun"
-msgstr ""
+msgstr "Sjov"
 
 #: hacks/config/whirlygig.xml.h:6
 msgid "Funky"
 
 #: hacks/config/whirlygig.xml.h:6
 msgid "Funky"
-msgstr ""
+msgstr "Funky"
 
 #: hacks/config/whirlygig.xml.h:7
 msgid "Innie"
 
 #: hacks/config/whirlygig.xml.h:7
 msgid "Innie"
-msgstr ""
+msgstr "Innie"
 
 #: hacks/config/whirlygig.xml.h:8
 
 #: hacks/config/whirlygig.xml.h:8
-#, fuzzy
 msgid "Leave a trail"
 msgstr "Efterlad spor"
 
 #: hacks/config/whirlygig.xml.h:9
 msgid "Leave a trail"
 msgstr "Efterlad spor"
 
 #: hacks/config/whirlygig.xml.h:9
-#, fuzzy
 msgid "Linear"
 msgid "Linear"
-msgstr "Linjer"
+msgstr "Linr"
 
 #: hacks/config/whirlygig.xml.h:11
 
 #: hacks/config/whirlygig.xml.h:11
-#, fuzzy
 msgid "Lissajous"
 msgid "Lissajous"
-msgstr "Lissojous-figurer"
+msgstr "Lissajous"
 
 #: hacks/config/whirlygig.xml.h:15
 
 #: hacks/config/whirlygig.xml.h:15
-#, fuzzy
 msgid "Test"
 msgid "Test"
-msgstr "Bedste"
+msgstr "Test"
 
 # "double buffer" betyder at man bruger én buffer (mærkeligt teknisk udtryk)
 #: hacks/config/whirlygig.xml.h:16
 
 # "double buffer" betyder at man bruger én buffer (mærkeligt teknisk udtryk)
 #: hacks/config/whirlygig.xml.h:16
-#, fuzzy
 msgid "Use Double Buffering"
 msgstr "Benyt mellemlager"
 
 msgid "Use Double Buffering"
 msgstr "Benyt mellemlager"
 
@@ -8040,11 +8043,11 @@ msgid "WhirlyGig"
 msgstr "Snurretop"
 
 #: hacks/config/whirlygig.xml.h:19
 msgstr "Snurretop"
 
 #: hacks/config/whirlygig.xml.h:19
-#, fuzzy
 msgid "Wrap the screen"
 msgid "Wrap the screen"
-msgstr "Benyt skærmbillede"
+msgstr "Omvikl skærmen"
 
 
-#: hacks/config/worm.xml.h:1
+#. #### -3d
+#: hacks/config/worm.xml.h:2
 msgid ""
 "An ancient xlock hack that draws multicolored worms that crawl around the "
 "screen. Written by Brad Taylor, Dave Lemke, Boris Putanec, and Henrik "
 msgid ""
 "An ancient xlock hack that draws multicolored worms that crawl around the "
 "screen. Written by Brad Taylor, Dave Lemke, Boris Putanec, and Henrik "
@@ -8291,7 +8294,8 @@ msgstr "Slå blomstring til"
 msgid "Xflame"
 msgstr "Flammer"
 
 msgid "Xflame"
 msgstr "Flammer"
 
-#: hacks/config/xjack.xml.h:4
+#. #### -font []
+#: hacks/config/xjack.xml.h:5
 msgid ""
 "This program behaves schizophrenically and makes a lot of typos. Written by "
 "Jamie Zawinski. If you haven't seen Stanley Kubrick's masterpiece, ``The "
 msgid ""
 "This program behaves schizophrenically and makes a lot of typos. Written by "
 "Jamie Zawinski. If you haven't seen Stanley Kubrick's masterpiece, ``The "
@@ -8303,11 +8307,12 @@ msgstr ""
 "\"Ondskabens hotel\", vil du ikke forstå den. De der har, beskriver "
 "pauseskærmen som \"inspireret\"."
 
 "\"Ondskabens hotel\", vil du ikke forstå den. De der har, beskriver "
 "pauseskærmen som \"inspireret\"."
 
-#: hacks/config/xjack.xml.h:5
+#: hacks/config/xjack.xml.h:6
 msgid "Xjack"
 msgstr "Jack"
 
 msgid "Xjack"
 msgstr "Jack"
 
-#: hacks/config/xlyap.xml.h:1
+#. #### -w []
+#: hacks/config/xlyap.xml.h:2
 msgid ""
 "This generates pretty fractal pictures by doing funky math involving the "
 "``Lyapunov exponent.'' It has a cool interactive mode, too. Written by Ron "
 msgid ""
 "This generates pretty fractal pictures by doing funky math involving the "
 "``Lyapunov exponent.'' It has a cool interactive mode, too. Written by Ron "
@@ -8317,7 +8322,7 @@ msgstr ""
 "\"Lyapunov-eksponenten\". Der er også en sej interaktiv tilstand. Skrevet af "
 "Ron Record."
 
 "\"Lyapunov-eksponenten\". Der er også en sej interaktiv tilstand. Skrevet af "
 "Ron Record."
 
-#: hacks/config/xlyap.xml.h:2
+#: hacks/config/xlyap.xml.h:3
 msgid "Xlyap"
 msgstr "Lyapunov"
 
 msgid "Xlyap"
 msgstr "Lyapunov"
 
@@ -8508,7 +8513,7 @@ msgstr ""
 "allerede har det, kan du finde det på &lt;http://www.epcc.ed.ac.uk/~spb/"
 "xmountains/&gt;. Hvis du selv oversætter det, så sikr dig at du oversætter "
 "det med -DVROOT, ellers virker det ikke korrekt når det bliver kørt af "
 "allerede har det, kan du finde det på &lt;http://www.epcc.ed.ac.uk/~spb/"
 "xmountains/&gt;. Hvis du selv oversætter det, så sikr dig at du oversætter "
 "det med -DVROOT, ellers virker det ikke korrekt når det bliver kørt af "
-"pauseskærmsdæmonen."
+"pauseskærmsserveren."
 
 #: hacks/config/xmountains.xml.h:36
 msgid "Xf  0.0"
 
 #: hacks/config/xmountains.xml.h:36
 msgid "Xf  0.0"
@@ -8905,7 +8910,8 @@ msgstr ""
 msgid "XRaySwarm"
 msgstr "Strålesværm"
 
 msgid "XRaySwarm"
 msgstr "Strålesværm"
 
-#: hacks/config/xsnow.xml.h:1
+#. #### -nonopopup
+#: hacks/config/xsnow.xml.h:2
 msgid ""
 "Draws falling snow and the occasional tiny Santa. By Rick Jansen. You can "
 "find it at &lt;http://www.euronet.nl/~rja/Xsnow/&gt;."
 msgid ""
 "Draws falling snow and the occasional tiny Santa. By Rick Jansen. You can "
 "find it at &lt;http://www.euronet.nl/~rja/Xsnow/&gt;."
@@ -8914,7 +8920,7 @@ msgstr ""
 "kan finde det bagvedliggende program på &lt;http://www.euronet.nl/~rja/Xsnow/"
 "&gt;."
 
 "kan finde det bagvedliggende program på &lt;http://www.euronet.nl/~rja/Xsnow/"
 "&gt;."
 
-#: hacks/config/xsnow.xml.h:2
+#: hacks/config/xsnow.xml.h:3
 msgid "Xsnow"
 msgstr "Sne"
 
 msgid "Xsnow"
 msgstr "Sne"
 
@@ -8977,6 +8983,24 @@ msgstr ""
 "overlappende linser snarere end blot en simpel zoom. Skrevet af James "
 "Macnicol."
 
 "overlappende linser snarere end blot en simpel zoom. Skrevet af James "
 "Macnicol."
 
+#~ msgid "Allow 2D Attractors"
+#~ msgstr "Tillad 2d-tiltrækkere"
+
+#~ msgid "Freeze Some Bees"
+#~ msgstr "Frys nogle bier"
+
+#~ msgid "Ride a Trained Bee"
+#~ msgstr "Rid på en trænet bi"
+
+#~ msgid "Show Bounding Box"
+#~ msgstr "Vis afgrænsningsboks"
+
+#~ msgid "Slow Bees with Antifreeze"
+#~ msgstr "Sløv bier med antifrys"
+
+#~ msgid "Zoom In and Out"
+#~ msgstr "Zoom ind og ud"
+
 #~ msgid "Ping Subnet"
 #~ msgstr "Ping undernet"
 
 #~ msgid "Ping Subnet"
 #~ msgstr "Ping undernet"
 
index 5a6b300998f65c13fee1499964913fe0972ef226..2ff9ee446105a064b4a6e0ee213751ea5767a77c 100644 (file)
--- a/po/de.po
+++ b/po/de.po
@@ -6,7 +6,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: XScreenSaver HEAD\n"
 "Report-Msgid-Bugs-To: \n"
 msgstr ""
 "Project-Id-Version: XScreenSaver HEAD\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2004-10-04 16:25+0200\n"
+"POT-Creation-Date: 2004-12-22 12:51+0100\n"
 "PO-Revision-Date: 2002-09-07 14:30+0100\n"
 "Last-Translator: Christian Neumair <christian-neumair@web.de>\n"
 "Language-Team: German <gnome-de@gnome.org>\n"
 "PO-Revision-Date: 2002-09-07 14:30+0100\n"
 "Last-Translator: Christian Neumair <christian-neumair@web.de>\n"
 "Language-Team: German <gnome-de@gnome.org>\n"
@@ -151,7 +151,7 @@ msgstr "Wie lange es dauert, bevor der Bildschirm komplett eingeschwärzt wird."
 msgid "minutes"
 msgstr "Minuten"
 
 msgid "minutes"
 msgstr "Minuten"
 
-#: driver/demo-Gtk-widgets.c:482 driver/demo-Gtk.c:2845
+#: driver/demo-Gtk-widgets.c:482 driver/demo-Gtk.c:2852
 #: driver/xscreensaver-demo.glade.h:58
 msgid "Preview"
 msgstr "Vorschau"
 #: driver/xscreensaver-demo.glade.h:58
 msgid "Preview"
 msgstr "Vorschau"
@@ -198,12 +198,12 @@ msgstr "Nur ein Bildschirmschoner"
 msgid "Random Screen Saver"
 msgstr "Zufälliger Bildschirmschoner"
 
 msgid "Random Screen Saver"
 msgstr "Zufälliger Bildschirmschoner"
 
-#: driver/demo-Gtk-widgets.c:571 driver/demo-Gtk.c:2134
+#: driver/demo-Gtk-widgets.c:571 driver/demo-Gtk.c:2141
 #: driver/xscreensaver-demo.glade.h:75
 msgid "Use"
 msgstr "Verwenden"
 
 #: driver/xscreensaver-demo.glade.h:75
 msgid "Use"
 msgstr "Verwenden"
 
-#: driver/demo-Gtk-widgets.c:591 driver/demo-Gtk.c:2144
+#: driver/demo-Gtk-widgets.c:591 driver/demo-Gtk.c:2151
 #: driver/xscreensaver-demo.glade.h:63
 msgid "Screen Saver"
 msgstr "Bildschirmschoner"
 #: driver/xscreensaver-demo.glade.h:63
 msgid "Screen Saver"
 msgstr "Bildschirmschoner"
@@ -455,7 +455,7 @@ msgid "Visual:"
 msgstr "Visuell:"
 
 #: driver/demo-Gtk-widgets.c:1550 driver/demo-Gtk-widgets.c:1573
 msgstr "Visuell:"
 
 #: driver/demo-Gtk-widgets.c:1550 driver/demo-Gtk-widgets.c:1573
-#: driver/demo-Gtk.c:1538 driver/demo-Gtk.c:2864
+#: driver/demo-Gtk.c:1545 driver/demo-Gtk.c:2871
 #: driver/xscreensaver-demo.glade.h:5 driver/xscreensaver-demo.glade2.h:3
 msgid "Any"
 msgstr "Beliebig"
 #: driver/xscreensaver-demo.glade.h:5 driver/xscreensaver-demo.glade2.h:3
 msgid "Any"
 msgstr "Beliebig"
@@ -558,7 +558,7 @@ msgstr "Grundlegend <<"
 msgid "Back to the graphical configuration options."
 msgstr "Zurück zu den grafischen Konfigurationsoptionen"
 
 msgid "Back to the graphical configuration options."
 msgstr "Zurück zu den grafischen Konfigurationsoptionen"
 
-#: driver/demo-Gtk-widgets.c:1709 driver/demo-Gtk.c:741
+#: driver/demo-Gtk-widgets.c:1709 driver/demo-Gtk.c:748
 #: driver/xscreensaver-demo.glade.h:54
 msgid "OK"
 msgstr "OK"
 #: driver/xscreensaver-demo.glade.h:54
 msgid "OK"
 msgstr "OK"
@@ -567,11 +567,11 @@ msgstr "OK"
 msgid "Cancel"
 msgstr "Abbrechen"
 
 msgid "Cancel"
 msgstr "Abbrechen"
 
-#: driver/demo-Gtk.c:649
+#: driver/demo-Gtk.c:656
 msgid "For updates, check http://www.jwz.org/xscreensaver/"
 msgstr "Besuchen Sie http://www.jwz.org/xscreensaver/, um Updates zu erhalten"
 
 msgid "For updates, check http://www.jwz.org/xscreensaver/"
 msgstr "Besuchen Sie http://www.jwz.org/xscreensaver/, um Updates zu erhalten"
 
-#: driver/demo-Gtk.c:779
+#: driver/demo-Gtk.c:786
 msgid ""
 "Error:\n"
 "\n"
 msgid ""
 "Error:\n"
 "\n"
@@ -581,7 +581,7 @@ msgstr ""
 "\n"
 "Es wurde keine Adresse angegeben.\n"
 
 "\n"
 "Es wurde keine Adresse angegeben.\n"
 
-#: driver/demo-Gtk.c:865
+#: driver/demo-Gtk.c:872
 msgid ""
 "Error:\n"
 "\n"
 msgid ""
 "Error:\n"
 "\n"
@@ -593,7 +593,7 @@ msgstr ""
 "Der XScreenSaver-Dämon konnte nicht korrekt gestartet werden.\n"
 "\n"
 
 "Der XScreenSaver-Dämon konnte nicht korrekt gestartet werden.\n"
 "\n"
 
-#: driver/demo-Gtk.c:877
+#: driver/demo-Gtk.c:884
 msgid ""
 "You are running as root.  This usually means that xscreensaver\n"
 "was unable to contact your X server because access control is\n"
 msgid ""
 "You are running as root.  This usually means that xscreensaver\n"
 "was unable to contact your X server because access control is\n"
@@ -629,11 +629,11 @@ msgstr ""
 "Sie sollten X nicht als »root« ausführen. Anstattdessen sollten Sie\n"
 "sich als normaler Benutzer anmelden und falls notwendig »su« verwenden."
 
 "Sie sollten X nicht als »root« ausführen. Anstattdessen sollten Sie\n"
 "sich als normaler Benutzer anmelden und falls notwendig »su« verwenden."
 
-#: driver/demo-Gtk.c:893
+#: driver/demo-Gtk.c:900
 msgid "Please check your $PATH and permissions."
 msgstr "Bitte überprüfen Sie Ihre $PATH-Variable und Berechtigungen."
 
 msgid "Please check your $PATH and permissions."
 msgstr "Bitte überprüfen Sie Ihre $PATH-Variable und Berechtigungen."
 
-#: driver/demo-Gtk.c:928
+#: driver/demo-Gtk.c:935
 msgid ""
 "Error:\n"
 "\n"
 msgid ""
 "Error:\n"
 "\n"
@@ -643,7 +643,7 @@ msgstr ""
 "\n"
 "Anfänglicher Dateiname konnte nicht ermittelt werden!\n"
 
 "\n"
 "Anfänglicher Dateiname konnte nicht ermittelt werden!\n"
 
-#: driver/demo-Gtk.c:933
+#: driver/demo-Gtk.c:940
 #, c-format
 msgid ""
 "Error:\n"
 #, c-format
 msgid ""
 "Error:\n"
@@ -654,7 +654,7 @@ msgstr ""
 "\n"
 "%s konnte nicht geschrieben werden\n"
 
 "\n"
 "%s konnte nicht geschrieben werden\n"
 
-#: driver/demo-Gtk.c:992
+#: driver/demo-Gtk.c:999
 msgid ""
 "Error:\n"
 "\n"
 msgid ""
 "Error:\n"
 "\n"
@@ -664,7 +664,7 @@ msgstr ""
 "\n"
 "kein »manualCommand«-Ressourcensatz."
 
 "\n"
 "kein »manualCommand«-Ressourcensatz."
 
-#: driver/demo-Gtk.c:1173
+#: driver/demo-Gtk.c:1180
 #, c-format
 msgid ""
 "Error:\n"
 #, c-format
 msgid ""
 "Error:\n"
@@ -675,7 +675,7 @@ msgstr ""
 "\n"
 "Zeitformat »%s« konnte nicht interpretiert werden\n"
 
 "\n"
 "Zeitformat »%s« konnte nicht interpretiert werden\n"
 
-#: driver/demo-Gtk.c:1829
+#: driver/demo-Gtk.c:1836
 #, c-format
 msgid ""
 "Error:\n"
 #, c-format
 msgid ""
 "Error:\n"
@@ -686,28 +686,28 @@ msgstr ""
 "\n"
 "Verzeichnis »%s« existiert nicht\n"
 
 "\n"
 "Verzeichnis »%s« existiert nicht\n"
 
-#: driver/demo-Gtk.c:2546
+#: driver/demo-Gtk.c:2553
 msgid "Descriptions not available: no XML support compiled in."
 msgstr "Beschreibungen nicht verfügbar: Keine XML-Unterstützung einkompiliert."
 
 msgid "Descriptions not available: no XML support compiled in."
 msgstr "Beschreibungen nicht verfügbar: Keine XML-Unterstützung einkompiliert."
 
-#: driver/demo-Gtk.c:2551
+#: driver/demo-Gtk.c:2558
 msgid "No description available."
 msgstr "Keine Beschreibung verfügbar."
 
 msgid "No description available."
 msgstr "Keine Beschreibung verfügbar."
 
-#: driver/demo-Gtk.c:2816
+#: driver/demo-Gtk.c:2823
 msgid "Blank Screen"
 msgstr "Bildschirm schwärzen"
 
 msgid "Blank Screen"
 msgstr "Bildschirm schwärzen"
 
-#: driver/demo-Gtk.c:2822
+#: driver/demo-Gtk.c:2829
 msgid "Screen Saver Disabled"
 msgstr "Bildschirmschoner deaktiviert"
 
 msgid "Screen Saver Disabled"
 msgstr "Bildschirmschoner deaktiviert"
 
-#: driver/demo-Gtk.c:2855
+#: driver/demo-Gtk.c:2862
 #, c-format
 msgid "%s: %.100s Settings"
 msgstr ""
 
 #, c-format
 msgid "%s: %.100s Settings"
 msgstr ""
 
-#: driver/demo-Gtk.c:3010
+#: driver/demo-Gtk.c:3017
 #, c-format
 msgid ""
 "Warning:\n"
 #, c-format
 msgid ""
 "Warning:\n"
@@ -718,23 +718,23 @@ msgstr ""
 "\n"
 "Datei »%s« wurde geändert, wird neu geladen.\n"
 
 "\n"
 "Datei »%s« wurde geändert, wird neu geladen.\n"
 
-#: driver/demo-Gtk.c:3092
+#: driver/demo-Gtk.c:3099
 msgid "No Preview"
 msgstr "Keine Vorschau"
 
 msgid "No Preview"
 msgstr "Keine Vorschau"
 
-#: driver/demo-Gtk.c:3092
+#: driver/demo-Gtk.c:3099
 msgid "Available"
 msgstr "Verfügbar"
 
 msgid "Available"
 msgstr "Verfügbar"
 
-#: driver/demo-Gtk.c:3093
+#: driver/demo-Gtk.c:3100
 msgid "Not"
 msgstr ""
 
 msgid "Not"
 msgstr ""
 
-#: driver/demo-Gtk.c:3093
+#: driver/demo-Gtk.c:3100
 msgid "Installed"
 msgstr ""
 
 msgid "Installed"
 msgstr ""
 
-#: driver/demo-Gtk.c:3858
+#: driver/demo-Gtk.c:3865
 #, c-format
 msgid ""
 "Warning:\n"
 #, c-format
 msgid ""
 "Warning:\n"
@@ -748,7 +748,7 @@ msgstr ""
 "für die Anzeige »%s« nicht.\n"
 "Soll er jetzt gestartet werden?"
 
 "für die Anzeige »%s« nicht.\n"
 "Soll er jetzt gestartet werden?"
 
-#: driver/demo-Gtk.c:3868
+#: driver/demo-Gtk.c:3875
 #, c-format
 msgid ""
 "Warning:\n"
 #, c-format
 msgid ""
 "Warning:\n"
@@ -781,7 +781,7 @@ msgstr ""
 "den Bildschirmschoner als »%s« neu starten.\n"
 "\n"
 
 "den Bildschirmschoner als »%s« neu starten.\n"
 "\n"
 
-#: driver/demo-Gtk.c:3893
+#: driver/demo-Gtk.c:3900
 #, c-format
 msgid ""
 "Warning:\n"
 #, c-format
 msgid ""
 "Warning:\n"
@@ -809,7 +809,7 @@ msgstr ""
 "\n"
 "Soll der Dämon auf »%s« jetzt als »%s« neu gestartet werden?\n"
 
 "\n"
 "Soll der Dämon auf »%s« jetzt als »%s« neu gestartet werden?\n"
 
-#: driver/demo-Gtk.c:3915
+#: driver/demo-Gtk.c:3922
 #, c-format
 msgid ""
 "Warning:\n"
 #, c-format
 msgid ""
 "Warning:\n"
@@ -829,12 +829,12 @@ msgstr ""
 "\n"
 "Soll der XScreenSaver-Dämon jetzt neu gestartet werden?\n"
 
 "\n"
 "Soll der XScreenSaver-Dämon jetzt neu gestartet werden?\n"
 
-#: driver/demo-Gtk.c:4372
+#: driver/demo-Gtk.c:4379
 #, c-format
 msgid "%s: unknown option: %s\n"
 msgstr "%s: Unbekannte Option »%s«\n"
 
 #, c-format
 msgid "%s: unknown option: %s\n"
 msgstr "%s: Unbekannte Option »%s«\n"
 
-#: driver/demo-Gtk.c:4436
+#: driver/demo-Gtk.c:4443
 #, fuzzy
 msgid "Screensaver Preferences"
 msgstr "Bildschirmschoner"
 #, fuzzy
 msgid "Screensaver Preferences"
 msgstr "Bildschirmschoner"
@@ -1059,22 +1059,23 @@ msgstr "Arme"
 #: 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/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:5 hacks/config/flyingtoasters.xml.h:5
-#: hacks/config/fontglide.xml.h:4 hacks/config/forest.xml.h:1
-#: hacks/config/fuzzyflakes.xml.h:7 hacks/config/galaxy.xml.h:3
-#: hacks/config/gears.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:6
-#: 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/fadeplot.xml.h:4 hacks/config/fireworkx.xml.h:3
+#: 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:2 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/fuzzyflakes.xml.h:7
+#: hacks/config/galaxy.xml.h:3 hacks/config/gears.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:6 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/intermomentary.xml.h:1 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/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
@@ -1092,23 +1093,24 @@ msgstr "Arme"
 #: hacks/config/pacman.xml.h:1 hacks/config/penetrate.xml.h:3
 #: hacks/config/penrose.xml.h:6 hacks/config/petri.xml.h:5
 #: hacks/config/phosphor.xml.h:4 hacks/config/piecewise.xml.h:4
 #: hacks/config/pacman.xml.h:1 hacks/config/penetrate.xml.h:3
 #: hacks/config/penrose.xml.h:6 hacks/config/petri.xml.h:5
 #: hacks/config/phosphor.xml.h:4 hacks/config/piecewise.xml.h:4
-#: hacks/config/pipes.xml.h:5 hacks/config/polyhedra.xml.h:18
-#: hacks/config/polyominoes.xml.h:2 hacks/config/polytopes.xml.h:11
-#: hacks/config/pong.xml.h:1 hacks/config/popsquares.xml.h:3
-#: hacks/config/providence.xml.h:2 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 hacks/config/rocks.xml.h:4
-#: hacks/config/rotor.xml.h:3 hacks/config/rubik.xml.h:3
-#: hacks/config/sballs.xml.h:4 hacks/config/shadebobs.xml.h:3
-#: hacks/config/sierpinski.xml.h:2 hacks/config/sierpinski3d.xml.h:2
-#: hacks/config/slidescreen.xml.h:2 hacks/config/slip.xml.h:2
-#: hacks/config/speedmine.xml.h:3 hacks/config/sphere.xml.h:2
-#: hacks/config/spheremonics.xml.h:5 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:1 hacks/config/superquadrics.xml.h:4
+#: hacks/config/pinion.xml.h:5 hacks/config/pipes.xml.h:5
+#: hacks/config/polyhedra.xml.h:18 hacks/config/polyominoes.xml.h:2
+#: hacks/config/polytopes.xml.h:11 hacks/config/pong.xml.h:1
+#: hacks/config/popsquares.xml.h:3 hacks/config/providence.xml.h:2
+#: 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
+#: hacks/config/rocks.xml.h:4 hacks/config/rotor.xml.h:3
+#: hacks/config/rubik.xml.h:3 hacks/config/sballs.xml.h:4
+#: hacks/config/shadebobs.xml.h:3 hacks/config/sierpinski.xml.h:2
+#: hacks/config/sierpinski3d.xml.h:2 hacks/config/slidescreen.xml.h:2
+#: hacks/config/slip.xml.h:2 hacks/config/speedmine.xml.h:3
+#: hacks/config/sphere.xml.h:2 hacks/config/spheremonics.xml.h:5
+#: 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:1
+#: hacks/config/substrate.xml.h:2 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/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
@@ -1130,8 +1132,9 @@ msgstr "Schnell"
 #: hacks/config/fuzzyflakes.xml.h:8 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/fuzzyflakes.xml.h:8 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/wormhole.xml.h:3 hacks/config/xfishtank.xml.h:4
+#: hacks/config/substrate.xml.h:3 hacks/config/thornbird.xml.h:3
+#: hacks/config/whirlwindwarp.xml.h:1 hacks/config/wormhole.xml.h:3
+#: hacks/config/xfishtank.xml.h:4
 msgid "Few"
 msgstr "Wenige"
 
 msgid "Few"
 msgstr "Wenige"
 
@@ -1147,7 +1150,7 @@ msgstr "Wenige"
 #: hacks/config/epicycle.xml.h:8 hacks/config/eruption.xml.h:12
 #: hacks/config/euler2d.xml.h:8 hacks/config/fadeplot.xml.h:6
 #: hacks/config/flag.xml.h:5 hacks/config/flame.xml.h:11
 #: hacks/config/epicycle.xml.h:8 hacks/config/eruption.xml.h:12
 #: hacks/config/euler2d.xml.h:8 hacks/config/fadeplot.xml.h:6
 #: hacks/config/flag.xml.h:5 hacks/config/flame.xml.h:11
-#: hacks/config/flow.xml.h:8 hacks/config/fluidballs.xml.h:13
+#: hacks/config/flow.xml.h:7 hacks/config/fluidballs.xml.h:13
 #: hacks/config/forest.xml.h:3 hacks/config/fuzzyflakes.xml.h:12
 #: 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/forest.xml.h:3 hacks/config/fuzzyflakes.xml.h:12
 #: hacks/config/galaxy.xml.h:6 hacks/config/grav.xml.h:4
 #: hacks/config/halo.xml.h:4 hacks/config/hopalong.xml.h:15
@@ -1185,7 +1188,7 @@ msgstr "Viele"
 #: 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/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/flow.xml.h:8 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/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
@@ -1239,22 +1242,23 @@ msgstr ""
 #: 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/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/flyingtoasters.xml.h:11
-#: hacks/config/fontglide.xml.h:13 hacks/config/forest.xml.h:5
-#: hacks/config/fuzzyflakes.xml.h:15 hacks/config/galaxy.xml.h:10
-#: hacks/config/gears.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:8 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:10 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/fadeplot.xml.h:8 hacks/config/fireworkx.xml.h:9
+#: 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:10 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/fuzzyflakes.xml.h:15
+#: hacks/config/galaxy.xml.h:11 hacks/config/gears.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:8
+#: 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:10
+#: 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/intermomentary.xml.h:4 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/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
@@ -1272,23 +1276,24 @@ msgstr ""
 #: hacks/config/pacman.xml.h:5 hacks/config/penetrate.xml.h:6
 #: hacks/config/penrose.xml.h:11 hacks/config/petri.xml.h:23
 #: hacks/config/phosphor.xml.h:7 hacks/config/piecewise.xml.h:9
 #: hacks/config/pacman.xml.h:5 hacks/config/penetrate.xml.h:6
 #: hacks/config/penrose.xml.h:11 hacks/config/petri.xml.h:23
 #: hacks/config/phosphor.xml.h:7 hacks/config/piecewise.xml.h:9
-#: hacks/config/pipes.xml.h:15 hacks/config/polyhedra.xml.h:119
-#: hacks/config/polyominoes.xml.h:10 hacks/config/polytopes.xml.h:20
-#: hacks/config/pong.xml.h:4 hacks/config/popsquares.xml.h:5
-#: hacks/config/providence.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 hacks/config/rocks.xml.h:9
-#: hacks/config/rotor.xml.h:11 hacks/config/rubik.xml.h:9
-#: hacks/config/sballs.xml.h:13 hacks/config/shadebobs.xml.h:9
-#: hacks/config/sierpinski.xml.h:7 hacks/config/sierpinski3d.xml.h:8
-#: hacks/config/slidescreen.xml.h:6 hacks/config/slip.xml.h:7
-#: hacks/config/speedmine.xml.h:13 hacks/config/sphere.xml.h:5
-#: hacks/config/spheremonics.xml.h:19 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:4 hacks/config/superquadrics.xml.h:8
+#: hacks/config/pinion.xml.h:13 hacks/config/pipes.xml.h:15
+#: hacks/config/polyhedra.xml.h:119 hacks/config/polyominoes.xml.h:10
+#: hacks/config/polytopes.xml.h:20 hacks/config/pong.xml.h:4
+#: hacks/config/popsquares.xml.h:5 hacks/config/providence.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
+#: hacks/config/rocks.xml.h:9 hacks/config/rotor.xml.h:11
+#: hacks/config/rubik.xml.h:9 hacks/config/sballs.xml.h:13
+#: hacks/config/shadebobs.xml.h:9 hacks/config/sierpinski.xml.h:7
+#: hacks/config/sierpinski3d.xml.h:8 hacks/config/slidescreen.xml.h:6
+#: hacks/config/slip.xml.h:7 hacks/config/speedmine.xml.h:13
+#: hacks/config/sphere.xml.h:5 hacks/config/spheremonics.xml.h:19
+#: 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:4
+#: hacks/config/substrate.xml.h:10 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/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
@@ -1321,17 +1326,18 @@ msgstr "Langsam"
 #: hacks/config/engine.xml.h:16 hacks/config/epicycle.xml.h:11
 #: 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/engine.xml.h:16 hacks/config/epicycle.xml.h:11
 #: 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/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/fuzzyflakes.xml.h:17
-#: hacks/config/galaxy.xml.h:11 hacks/config/glblur.xml.h:17
-#: hacks/config/glforestfire.xml.h:15 hacks/config/glplanet.xml.h:10
-#: 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:11 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/fireworkx.xml.h:11 hacks/config/flag.xml.h:9
+#: hacks/config/flame.xml.h:15 hacks/config/flipflop.xml.h:7
+#: hacks/config/flipscreen3d.xml.h:7 hacks/config/flow.xml.h:12
+#: hacks/config/fluidballs.xml.h:20 hacks/config/forest.xml.h:6
+#: hacks/config/fuzzyflakes.xml.h:17 hacks/config/galaxy.xml.h:12
+#: hacks/config/glblur.xml.h:17 hacks/config/glforestfire.xml.h:15
+#: hacks/config/glplanet.xml.h:10 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:11
+#: 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/intermomentary.xml.h:5 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/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
@@ -1360,16 +1366,16 @@ msgstr "Langsam"
 #: 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/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/xplanet.xml.h:60 hacks/config/xrayswarm.xml.h:4
-#: hacks/config/zoom.xml.h:7
+#: hacks/config/strange.xml.h:5 hacks/config/substrate.xml.h:11
+#: 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/xplanet.xml.h:60
+#: hacks/config/xrayswarm.xml.h:4 hacks/config/zoom.xml.h:7
 msgid "Speed"
 msgstr "Geschwindigkeit"
 
 msgid "Speed"
 msgstr "Geschwindigkeit"
 
@@ -1412,8 +1418,8 @@ msgstr ""
 #: hacks/config/discrete.xml.h:11 hacks/config/drift.xml.h:14
 #: hacks/config/epicycle.xml.h:13 hacks/config/euler2d.xml.h:17
 #: hacks/config/fadeplot.xml.h:12 hacks/config/flag.xml.h:13
 #: hacks/config/discrete.xml.h:11 hacks/config/drift.xml.h:14
 #: hacks/config/epicycle.xml.h:13 hacks/config/euler2d.xml.h:17
 #: hacks/config/fadeplot.xml.h:12 hacks/config/flag.xml.h:13
-#: hacks/config/flame.xml.h:16 hacks/config/flow.xml.h:18
-#: hacks/config/forest.xml.h:8 hacks/config/galaxy.xml.h:13
+#: hacks/config/flame.xml.h:16 hacks/config/flow.xml.h:15
+#: hacks/config/forest.xml.h:8 hacks/config/galaxy.xml.h:14
 #: hacks/config/grav.xml.h:11 hacks/config/halo.xml.h:13
 #: hacks/config/hopalong.xml.h:25 hacks/config/ifs.xml.h:8
 #: hacks/config/imsmap.xml.h:15 hacks/config/interference.xml.h:19
 #: hacks/config/grav.xml.h:11 hacks/config/halo.xml.h:13
 #: hacks/config/hopalong.xml.h:25 hacks/config/ifs.xml.h:8
 #: hacks/config/imsmap.xml.h:15 hacks/config/interference.xml.h:19
@@ -1517,7 +1523,7 @@ msgstr "Vierseitige Zellen"
 #: 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/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/flag.xml.h:4 hacks/config/flow.xml.h:4
 #: hacks/config/fluidballs.xml.h:12 hacks/config/fuzzyflakes.xml.h:10
 #: 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/fluidballs.xml.h:12 hacks/config/fuzzyflakes.xml.h:10
 #: hacks/config/gleidescope.xml.h:7 hacks/config/halftone.xml.h:8
 #: hacks/config/hopalong.xml.h:13 hacks/config/interference.xml.h:11
@@ -1549,7 +1555,7 @@ msgstr "Sechsseitige Zellen"
 #: 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/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/flag.xml.h:8 hacks/config/flow.xml.h:11
 #: hacks/config/fluidballs.xml.h:19 hacks/config/fuzzyflakes.xml.h:16
 #: 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/fluidballs.xml.h:19 hacks/config/fuzzyflakes.xml.h:16
 #: hacks/config/gleidescope.xml.h:12 hacks/config/halftone.xml.h:14
 #: hacks/config/hopalong.xml.h:22 hacks/config/interference.xml.h:18
@@ -1568,7 +1574,7 @@ msgstr "Dreiseitige Zellen"
 
 #: 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/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/flag.xml.h:12 hacks/config/flow.xml.h:14
 #: hacks/config/lissie.xml.h:12 hacks/config/loop.xml.h:11
 #: hacks/config/rubik.xml.h:12 hacks/config/sierpinski.xml.h:11
 #: hacks/config/slip.xml.h:11
 #: hacks/config/lissie.xml.h:12 hacks/config/loop.xml.h:11
 #: hacks/config/rubik.xml.h:12 hacks/config/sierpinski.xml.h:11
 #: hacks/config/slip.xml.h:11
@@ -1620,13 +1626,14 @@ msgstr ""
 #: hacks/config/menger.xml.h:15 hacks/config/mirrorblob.xml.h:18
 #: hacks/config/moebius.xml.h:6 hacks/config/molecule.xml.h:21
 #: hacks/config/morph3d.xml.h:5 hacks/config/noof.xml.h:4
 #: hacks/config/menger.xml.h:15 hacks/config/mirrorblob.xml.h:18
 #: hacks/config/moebius.xml.h:6 hacks/config/molecule.xml.h:21
 #: hacks/config/morph3d.xml.h:5 hacks/config/noof.xml.h:4
-#: hacks/config/pipes.xml.h:14 hacks/config/polyhedra.xml.h:118
-#: hacks/config/polytopes.xml.h:18 hacks/config/providence.xml.h:4
-#: 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
+#: hacks/config/pinion.xml.h:12 hacks/config/pipes.xml.h:14
+#: hacks/config/polyhedra.xml.h:118 hacks/config/polytopes.xml.h:18
+#: hacks/config/providence.xml.h:4 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 "Bilder pro Sekunde anzeigen"
 
 msgid "Show Frames-per-Second"
 msgstr "Bilder pro Sekunde anzeigen"
 
@@ -1790,11 +1797,12 @@ msgstr "Geschwindigkeit der Wale"
 #: hacks/config/lament.xml.h:9 hacks/config/lavalite.xml.h:32
 #: hacks/config/menger.xml.h:21 hacks/config/mirrorblob.xml.h:24
 #: hacks/config/moebius.xml.h:11 hacks/config/molecule.xml.h:26
 #: hacks/config/lament.xml.h:9 hacks/config/lavalite.xml.h:32
 #: hacks/config/menger.xml.h:21 hacks/config/mirrorblob.xml.h:24
 #: hacks/config/moebius.xml.h:11 hacks/config/molecule.xml.h:26
-#: hacks/config/polyhedra.xml.h:173 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
+#: hacks/config/pinion.xml.h:15 hacks/config/polyhedra.xml.h:173
+#: 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 "Drahtgitter"
 
 msgid "Wireframe"
 msgstr "Drahtgitter"
 
@@ -1882,14 +1890,15 @@ msgstr "Linien"
 #: 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/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/mismunch.xml.h:3
-#: 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 hacks/config/spheremonics.xml.h:7
+#: hacks/config/flow.xml.h:6 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/mismunch.xml.h:3 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
+#: hacks/config/spheremonics.xml.h:7 hacks/config/substrate.xml.h:6
 #: hacks/config/wander.xml.h:10 hacks/config/whirlwindwarp.xml.h:3
 msgid "Long"
 msgstr "Lang"
 #: hacks/config/wander.xml.h:10 hacks/config/whirlwindwarp.xml.h:3
 msgid "Long"
 msgstr "Lang"
@@ -1936,13 +1945,14 @@ msgstr "Schwellwert für Rückstoß"
 #: 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/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/metaballs.xml.h:12 hacks/config/mismunch.xml.h:8
-#: 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/flow.xml.h:9 hacks/config/galaxy.xml.h:9
+#: hacks/config/klein.xml.h:5 hacks/config/laser.xml.h:9
+#: hacks/config/menger.xml.h:14 hacks/config/metaballs.xml.h:12
+#: hacks/config/mismunch.xml.h:8 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/substrate.xml.h:9
 #: hacks/config/wander.xml.h:12 hacks/config/whirlwindwarp.xml.h:6
 msgid "Short"
 msgstr "Kurz"
 #: hacks/config/wander.xml.h:12 hacks/config/whirlwindwarp.xml.h:6
 msgid "Short"
 msgstr "Kurz"
@@ -2147,10 +2157,10 @@ msgstr ""
 #: 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/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/polyhedra.xml.h:3 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/wormhole.xml.h:1
-#: hacks/config/xfishtank.xml.h:1
+#: hacks/config/pinion.xml.h:3 hacks/config/polyhedra.xml.h:3
+#: 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/wormhole.xml.h:1 hacks/config/xfishtank.xml.h:1
 msgid "Animation Speed"
 msgstr "Animationsgeschwindigkeit"
 
 msgid "Animation Speed"
 msgstr "Animationsgeschwindigkeit"
 
@@ -2234,8 +2244,9 @@ msgstr ""
 #: 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/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/starfish.xml.h:2 hacks/config/substrate.xml.h:1
+#: hacks/config/vidwhacker.xml.h:3 hacks/config/wander.xml.h:7
+#: hacks/config/xspirograph.xml.h:3
 msgid "Duration"
 msgstr "Dauer"
 
 msgid "Duration"
 msgstr "Dauer"
 
@@ -2497,7 +2508,7 @@ msgstr "Bauteile"
 msgid "Rotate"
 msgstr "Rotieren"
 
 msgid "Rotate"
 msgstr "Rotieren"
 
-#: hacks/config/circuit.xml.h:8
+#: hacks/config/circuit.xml.h:8 hacks/config/pinion.xml.h:10
 msgid "Rotation Speed"
 msgstr "Rotationsgeschwindigkeit"
 
 msgid "Rotation Speed"
 msgstr "Rotationsgeschwindigkeit"
 
@@ -2583,11 +2594,12 @@ msgstr "1 Sekunde"
 msgid "Coral"
 msgstr "Koralle"
 
 msgid "Coral"
 msgstr "Koralle"
 
-#: hacks/config/coral.xml.h:4 hacks/config/gflux.xml.h:3
-#: hacks/config/glblur.xml.h:2 hacks/config/glmatrix.xml.h:3
-#: 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
+#: hacks/config/coral.xml.h:4 hacks/config/fireworkx.xml.h:2
+#: hacks/config/gflux.xml.h:3 hacks/config/glblur.xml.h:2
+#: hacks/config/glmatrix.xml.h:3 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
 msgid "Dense"
 msgstr "Dicht"
 
 msgid "Dense"
 msgstr "Dicht"
 
@@ -2602,12 +2614,12 @@ msgstr ""
 "Simuliert Korallenwachstum, wenngleich etwas langsam. Geschrieben von "
 "Frederick Röber."
 
 "Simuliert Korallenwachstum, wenngleich etwas langsam. Geschrieben von "
 "Frederick Röber."
 
-#: hacks/config/coral.xml.h:13 hacks/config/gflux.xml.h:13
-#: hacks/config/glblur.xml.h:16 hacks/config/glmatrix.xml.h:19
-#: hacks/config/imsmap.xml.h:13 hacks/config/lavalite.xml.h:29
-#: hacks/config/pyro.xml.h:14 hacks/config/qix.xml.h:21
-#: hacks/config/squiral.xml.h:15 hacks/config/xearth.xml.h:24
-#: hacks/config/xmatrix.xml.h:17
+#: hacks/config/coral.xml.h:13 hacks/config/fireworkx.xml.h:10
+#: hacks/config/gflux.xml.h:13 hacks/config/glblur.xml.h:16
+#: hacks/config/glmatrix.xml.h:19 hacks/config/imsmap.xml.h:13
+#: hacks/config/lavalite.xml.h:29 hacks/config/pyro.xml.h:14
+#: hacks/config/qix.xml.h:21 hacks/config/squiral.xml.h:15
+#: hacks/config/xearth.xml.h:24 hacks/config/xmatrix.xml.h:17
 msgid "Sparse"
 msgstr ""
 
 msgid "Sparse"
 msgstr ""
 
@@ -2639,7 +2651,7 @@ msgid "Center on Screen"
 msgstr "Auf dem Bildschirm zentrieren"
 
 #: hacks/config/crystal.xml.h:2 hacks/config/deluxe.xml.h:1
 msgstr "Auf dem Bildschirm zentrieren"
 
 #: hacks/config/crystal.xml.h:2 hacks/config/deluxe.xml.h:1
-#: hacks/config/fadeplot.xml.h:1 hacks/config/flow.xml.h:3
+#: hacks/config/fadeplot.xml.h:1 hacks/config/flow.xml.h:1
 #: hacks/config/galaxy.xml.h:1 hacks/config/glforestfire.xml.h:1
 #: hacks/config/grav.xml.h:1 hacks/config/julia.xml.h:1
 #: hacks/config/laser.xml.h:1 hacks/config/lisa.xml.h:1
 #: hacks/config/galaxy.xml.h:1 hacks/config/glforestfire.xml.h:1
 #: hacks/config/grav.xml.h:1 hacks/config/julia.xml.h:1
 #: hacks/config/laser.xml.h:1 hacks/config/lisa.xml.h:1
@@ -3426,7 +3438,7 @@ msgstr "2D-Attraktoren erlauben"
 msgid "Half"
 msgstr "Halo"
 
 msgid "Half"
 msgstr "Halo"
 
-#: hacks/config/fireflies.xml.h:17
+#: hacks/config/fireflies.xml.h:17 hacks/config/pinion.xml.h:7
 #, fuzzy
 msgid "Huge"
 msgstr "Großfeuer"
 #, fuzzy
 msgid "Huge"
 msgstr "Großfeuer"
@@ -3523,7 +3535,7 @@ msgstr ""
 msgid "Swarm tails glow"
 msgstr ""
 
 msgid "Swarm tails glow"
 msgstr ""
 
-#: hacks/config/fireflies.xml.h:43
+#: hacks/config/fireflies.xml.h:43 hacks/config/pinion.xml.h:14
 #, fuzzy
 msgid "Tiny"
 msgstr "Dünn"
 #, fuzzy
 msgid "Tiny"
 msgstr "Dünn"
@@ -3541,6 +3553,33 @@ msgstr "Wind"
 msgid "Wind picks up"
 msgstr ""
 
 msgid "Wind picks up"
 msgstr ""
 
+#: hacks/config/fireworkx.xml.h:1 hacks/config/lavalite.xml.h:3
+msgid "Activity"
+msgstr "Aktivität"
+
+#: hacks/config/fireworkx.xml.h:4
+msgid "Fast Fade (more realistic)"
+msgstr ""
+
+#: hacks/config/fireworkx.xml.h:5
+#, fuzzy
+msgid "Fireworkx"
+msgstr "_Datei"
+
+#: hacks/config/fireworkx.xml.h:6
+#, fuzzy
+msgid "Light effect"
+msgstr "Blitzeffekt"
+
+#: hacks/config/fireworkx.xml.h:7
+msgid "Pyrotechnics simulation eye-candy. Written by Rony B. Chandran."
+msgstr ""
+
+#: hacks/config/fireworkx.xml.h:8
+#, fuzzy
+msgid "Shoot"
+msgstr "Kurz"
+
 #: hacks/config/flag.xml.h:1
 msgid "Bitmap for Flag"
 msgstr "Bild als Flagge"
 #: hacks/config/flag.xml.h:1
 msgid "Bitmap for Flag"
 msgstr "Bild als Flagge"
@@ -3615,43 +3654,46 @@ msgid ""
 "around and deforms it in various ways. Written by Ben Buxton."
 msgstr ""
 
 "around and deforms it in various ways. Written by Ben Buxton."
 msgstr ""
 
-#: hacks/config/flow.xml.h:1
-msgid "Allow 2D Attractors"
-msgstr "2D-Attraktoren erlauben"
+#: hacks/config/flow.xml.h:3
+msgid "Flow"
+msgstr "Fluss"
 
 
-#: hacks/config/flow.xml.h:2
+#: hacks/config/flow.xml.h:5
+#, fuzzy
+msgid "Length of trails"
+msgstr "Spuren verlassen"
+
+#: hacks/config/flow.xml.h:13
 msgid ""
 msgid ""
-"Another series of strange attractors: a flowing series of points, making "
-"strange rotational shapes. Written by Tim Auckland."
+"Strange attractors formed of flows in a 3D differential equation phase "
+"space. Written by Tim Auckland."
 msgstr ""
 
 msgstr ""
 
-#: hacks/config/flow.xml.h:5
-msgid "Flow"
-msgstr "Fluss"
-
-#: hacks/config/flow.xml.h:6
-msgid "Freeze Some Bees"
-msgstr "Einige Bienen einfrieren"
+#: hacks/config/flow.xml.h:16
+msgid "turn on/off bounding box."
+msgstr ""
 
 
-#: hacks/config/flow.xml.h:10
-msgid "Ride a Trained Bee"
-msgstr "Auf einer dressierten Biene reiten"
+#: hacks/config/flow.xml.h:17
+#, fuzzy
+msgid "turn on/off double buffering."
+msgstr "Doppel-Puffer"
 
 
-#: hacks/config/flow.xml.h:11
-msgid "Rotate Around Attractor"
-msgstr "Um Attraktoren rotieren"
+#: hacks/config/flow.xml.h:18
+msgid "turn on/off periodic attractors."
+msgstr ""
 
 
-#: hacks/config/flow.xml.h:12
-msgid "Show Bounding Box"
+#: hacks/config/flow.xml.h:19
+msgid "turn on/off ride in the flow."
 msgstr ""
 
 msgstr ""
 
-#: hacks/config/flow.xml.h:14
-msgid "Slow Bees with Antifreeze"
-msgstr "Langsame Bienen, die nicht gefrieren"
+#: hacks/config/flow.xml.h:20
+#, fuzzy
+msgid "turn on/off rotating around attractor."
+msgstr "Um Attraktoren rotieren"
 
 
-#: hacks/config/flow.xml.h:19
-msgid "Zoom In and Out"
-msgstr "Ein- und Auszoomen"
+#: hacks/config/flow.xml.h:21
+msgid "turn on/off search for new attractors."
+msgstr ""
 
 #: hacks/config/fluidballs.xml.h:1
 #, fuzzy
 
 #: hacks/config/fluidballs.xml.h:1
 #, fuzzy
@@ -3875,7 +3917,12 @@ msgstr "Zufällige Bewegung"
 msgid "Galaxy"
 msgstr "Galaxie"
 
 msgid "Galaxy"
 msgstr "Galaxie"
 
-#: hacks/config/galaxy.xml.h:9 hacks/config/lisa.xml.h:7
+#: hacks/config/galaxy.xml.h:8
+#, fuzzy
+msgid "Rotate Viewpoint"
+msgstr "Rotation"
+
+#: hacks/config/galaxy.xml.h:10 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/pong.xml.h:3
 #: hacks/config/rotor.xml.h:10 hacks/config/rubik.xml.h:8
 #: hacks/config/lissie.xml.h:8 hacks/config/loop.xml.h:6
 #: hacks/config/penrose.xml.h:10 hacks/config/pong.xml.h:3
 #: hacks/config/rotor.xml.h:10 hacks/config/rubik.xml.h:8
@@ -3884,7 +3931,7 @@ msgstr "Galaxie"
 msgid "Size"
 msgstr "Größe"
 
 msgid "Size"
 msgstr "Größe"
 
-#: hacks/config/galaxy.xml.h:12
+#: hacks/config/galaxy.xml.h:13
 msgid ""
 "This draws spinning galaxies, which then collide and scatter their stars to "
 "the, uh, four winds or something. Originally an Amiga program by Uli "
 msgid ""
 "This draws spinning galaxies, which then collide and scatter their stars to "
 "the, uh, four winds or something. Originally an Amiga program by Uli "
@@ -4203,9 +4250,9 @@ msgid ""
 "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 "
 "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."
+"of this window: the tab at the top of the *other* window.) 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
 msgstr ""
 
 #: hacks/config/glslideshow.xml.h:17
@@ -4756,6 +4803,27 @@ msgstr "Anzahl der Wellen"
 msgid "Wave Size"
 msgstr "Wellenhöhe"
 
 msgid "Wave Size"
 msgstr "Wellenhöhe"
 
+#: hacks/config/intermomentary.xml.h:2
+msgid "Intermomentary"
+msgstr ""
+
+#: hacks/config/intermomentary.xml.h:3
+#, fuzzy
+msgid "Number of Discs"
+msgstr "Zahl der Kreise"
+
+#: hacks/config/intermomentary.xml.h:6
+msgid ""
+"The Intersection Momentary is a fun visualization defining the relationships "
+"between objects with Casey Reas, William Ngan, and Robert Hodgin. "
+"Commissioned for display at the Whitney Museum of American Art. A surface "
+"filled with 100 medium to small sized circles. Each circle has a different "
+"size and direction, but moves at the same slow rate. Display: A. The "
+"instantaneous intersections of the circles. B. The aggregate intersections "
+"of the circles. Ported to XScreensaver from the art project \"InterMomentary"
+"\" at http://www.complexification.net"
+msgstr ""
+
 #: hacks/config/jigglypuff.xml.h:2
 msgid "Chrome"
 msgstr ""
 #: hacks/config/jigglypuff.xml.h:2
 msgid "Chrome"
 msgstr ""
@@ -4980,10 +5048,6 @@ msgstr ""
 msgid "10"
 msgstr "10"
 
 msgid "10"
 msgstr "10"
 
-#: hacks/config/lavalite.xml.h:3
-msgid "Activity"
-msgstr "Aktivität"
-
 #: hacks/config/lavalite.xml.h:4
 msgid "Classic Lavalite"
 msgstr "Klassische Lavalampe"
 #: hacks/config/lavalite.xml.h:4
 msgid "Classic Lavalite"
 msgstr "Klassische Lavalampe"
@@ -5738,6 +5802,44 @@ msgid ""
 "invisibility at intersection points. Written by Geoffrey Irving."
 msgstr ""
 
 "invisibility at intersection points. Written by Geoffrey Irving."
 msgstr ""
 
+#: hacks/config/pinion.xml.h:1
+#, fuzzy
+msgid "100"
+msgstr "100%"
+
+#: hacks/config/pinion.xml.h:2
+msgid "2000"
+msgstr ""
+
+#: hacks/config/pinion.xml.h:4
+#, fuzzy
+msgid ""
+"Draws an interconnected set of gears moving across the screen. Written by "
+"Jamie Zawinski."
+msgstr ""
+"Dieses zeichnet zufällig gefärbte und getupfte Rechtecke. Geschrieben von "
+"Hamie Zawinski."
+
+#: hacks/config/pinion.xml.h:6
+#, fuzzy
+msgid "Gear Size"
+msgstr "Gittergröße"
+
+#: hacks/config/pinion.xml.h:8
+#, fuzzy
+msgid "Max RPM"
+msgstr "Max. Ringe"
+
+#: hacks/config/pinion.xml.h:9
+#, fuzzy
+msgid "Pinion"
+msgstr "Zusammenhalt"
+
+#: hacks/config/pinion.xml.h:11
+#, fuzzy
+msgid "Scrolling Speed"
+msgstr "Scroll-Geschwindigkeit"
+
 #: hacks/config/pipes.xml.h:1
 msgid "Allow Tight Turns"
 msgstr "Scharfe Kurven erlauben"
 #: hacks/config/pipes.xml.h:1
 msgid "Allow Tight Turns"
 msgstr "Scharfe Kurven erlauben"
@@ -5767,7 +5869,8 @@ msgstr ""
 "kennen Sie möglicherweise diesen GL-Hack. Diese Version stammt von Marcelo "
 "Vianna."
 
 "kennen Sie möglicherweise diesen GL-Hack. Diese Version stammt von Marcelo "
 "Vianna."
 
-#: hacks/config/pipes.xml.h:9 hacks/config/wormhole.xml.h:4
+#: hacks/config/pipes.xml.h:9 hacks/config/substrate.xml.h:7
+#: hacks/config/wormhole.xml.h:4
 msgid "Lots"
 msgstr "Viele"
 
 msgid "Lots"
 msgstr "Viele"
 
@@ -7010,22 +7113,26 @@ msgid "Ping subnet/30 (2 hosts)"
 msgstr ""
 
 #: hacks/config/sonar.xml.h:10
 msgstr ""
 
 #: hacks/config/sonar.xml.h:10
-msgid "Simulation Team Members"
+msgid "Resolve Host Names"
 msgstr ""
 
 #: hacks/config/sonar.xml.h:11
 msgstr ""
 
 #: hacks/config/sonar.xml.h:11
+msgid "Simulation Team Members"
+msgstr ""
+
+#: hacks/config/sonar.xml.h:12
 msgid "Sonar"
 msgstr "Sonar"
 
 msgid "Sonar"
 msgstr "Sonar"
 
-#: hacks/config/sonar.xml.h:12
+#: hacks/config/sonar.xml.h:13
 msgid "Team A Name"
 msgstr "Name des 1. Teams"
 
 msgid "Team A Name"
 msgstr "Name des 1. Teams"
 
-#: hacks/config/sonar.xml.h:13
+#: hacks/config/sonar.xml.h:14
 msgid "Team B Name"
 msgstr "Name des 2. Teams"
 
 msgid "Team B Name"
 msgstr "Name des 2. Teams"
 
-#: hacks/config/sonar.xml.h:14
+#: hacks/config/sonar.xml.h:15
 msgid ""
 "This program draws a simulation of a sonar screen. By default, it displays a "
 "random assortment of ``bogies'' on the screen, but if installed as \"setuid "
 msgid ""
 "This program draws a simulation of a sonar screen. By default, it displays a "
 "random assortment of ``bogies'' on the screen, but if installed as \"setuid "
@@ -7034,7 +7141,7 @@ msgid ""
 "Martin and Jamie Zawinski."
 msgstr ""
 
 "Martin and Jamie Zawinski."
 msgstr ""
 
-#: hacks/config/sonar.xml.h:15
+#: hacks/config/sonar.xml.h:16
 msgid "vs."
 msgstr "gegen"
 
 msgid "vs."
 msgstr "gegen"
 
@@ -7318,6 +7425,33 @@ msgid ""
 "Written by Massimino Pascal."
 msgstr ""
 
 "Written by Massimino Pascal."
 msgstr ""
 
+#: hacks/config/substrate.xml.h:4
+#, fuzzy
+msgid "Initial Cracks"
+msgstr "Teilchendichte"
+
+#: hacks/config/substrate.xml.h:5
+msgid ""
+"Lines like crystals grow on a computational substrate. A simple "
+"perpendicular growth rule creates intricate city-like structures. By J. "
+"Tarbell and Mike Kershaw."
+msgstr ""
+
+#: hacks/config/substrate.xml.h:8
+#, fuzzy
+msgid "Sandgrains"
+msgstr "Grundlegend"
+
+#: hacks/config/substrate.xml.h:12
+#, fuzzy
+msgid "Substrate"
+msgstr "Zustände"
+
+#: hacks/config/substrate.xml.h:13
+#, fuzzy
+msgid "Wireframe only"
+msgstr "Drahtgitter"
+
 #: hacks/config/superquadrics.xml.h:3
 msgid ""
 "Ed Mackey reports that he wrote the first version of this program in BASIC "
 #: hacks/config/superquadrics.xml.h:3
 msgid ""
 "Ed Mackey reports that he wrote the first version of this program in BASIC "
@@ -8531,6 +8665,21 @@ msgstr ""
 "Linsen blicken, anstatt nur wie eine einfache Vergrößerung. Geschrieben von "
 "James Macnicol."
 
 "Linsen blicken, anstatt nur wie eine einfache Vergrößerung. Geschrieben von "
 "James Macnicol."
 
+#~ msgid "Allow 2D Attractors"
+#~ msgstr "2D-Attraktoren erlauben"
+
+#~ msgid "Freeze Some Bees"
+#~ msgstr "Einige Bienen einfrieren"
+
+#~ msgid "Ride a Trained Bee"
+#~ msgstr "Auf einer dressierten Biene reiten"
+
+#~ msgid "Slow Bees with Antifreeze"
+#~ msgstr "Langsame Bienen, die nicht gefrieren"
+
+#~ msgid "Zoom In and Out"
+#~ msgstr "Ein- und Auszoomen"
+
 #~ msgid "Scary Colors"
 #~ msgstr "Schreckliche Farben"
 
 #~ msgid "Scary Colors"
 #~ msgstr "Schreckliche Farben"
 
index b8cc06384f993b5c19f54c66923346f71caad4e4..2bee0638b3a3c6aeb59f1481f95bd90eaa5473e6 100644 (file)
--- a/po/es.po
+++ b/po/es.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: HEAD\n"
 "Report-Msgid-Bugs-To: \n"
 msgstr ""
 "Project-Id-Version: HEAD\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2004-10-04 16:25+0200\n"
+"POT-Creation-Date: 2004-12-22 12:51+0100\n"
 "PO-Revision-Date: 2002-11-06 13:01-0300\n"
 "Last-Translator: Pablo Gonzalo del Campo <pablodc@bigfoot.com>\n"
 "Language-Team: Spanish <traductores@es.gnome.org>\n"
 "PO-Revision-Date: 2002-11-06 13:01-0300\n"
 "Last-Translator: Pablo Gonzalo del Campo <pablodc@bigfoot.com>\n"
 "Language-Team: Spanish <traductores@es.gnome.org>\n"
@@ -153,7 +153,7 @@ msgstr "Cuanto tiempo antes de que el monitor se oscurezca por completo."
 msgid "minutes"
 msgstr "minutos"
 
 msgid "minutes"
 msgstr "minutos"
 
-#: driver/demo-Gtk-widgets.c:482 driver/demo-Gtk.c:2845
+#: driver/demo-Gtk-widgets.c:482 driver/demo-Gtk.c:2852
 #: driver/xscreensaver-demo.glade.h:58
 msgid "Preview"
 msgstr "Previsualizar"
 #: driver/xscreensaver-demo.glade.h:58
 msgid "Preview"
 msgstr "Previsualizar"
@@ -200,12 +200,12 @@ msgstr "Sólo un salvapantalla"
 msgid "Random Screen Saver"
 msgstr "Salvapantalla al azar"
 
 msgid "Random Screen Saver"
 msgstr "Salvapantalla al azar"
 
-#: driver/demo-Gtk-widgets.c:571 driver/demo-Gtk.c:2134
+#: driver/demo-Gtk-widgets.c:571 driver/demo-Gtk.c:2141
 #: driver/xscreensaver-demo.glade.h:75
 msgid "Use"
 msgstr "Usar"
 
 #: driver/xscreensaver-demo.glade.h:75
 msgid "Use"
 msgstr "Usar"
 
-#: driver/demo-Gtk-widgets.c:591 driver/demo-Gtk.c:2144
+#: driver/demo-Gtk-widgets.c:591 driver/demo-Gtk.c:2151
 #: driver/xscreensaver-demo.glade.h:63
 msgid "Screen Saver"
 msgstr "Salvapantalla"
 #: driver/xscreensaver-demo.glade.h:63
 msgid "Screen Saver"
 msgstr "Salvapantalla"
@@ -457,7 +457,7 @@ msgid "Visual:"
 msgstr "Visual:"
 
 #: driver/demo-Gtk-widgets.c:1550 driver/demo-Gtk-widgets.c:1573
 msgstr "Visual:"
 
 #: driver/demo-Gtk-widgets.c:1550 driver/demo-Gtk-widgets.c:1573
-#: driver/demo-Gtk.c:1538 driver/demo-Gtk.c:2864
+#: driver/demo-Gtk.c:1545 driver/demo-Gtk.c:2871
 #: driver/xscreensaver-demo.glade.h:5 driver/xscreensaver-demo.glade2.h:3
 msgid "Any"
 msgstr "Cualquiera"
 #: driver/xscreensaver-demo.glade.h:5 driver/xscreensaver-demo.glade2.h:3
 msgid "Any"
 msgstr "Cualquiera"
@@ -559,7 +559,7 @@ msgstr "Normal <<"
 msgid "Back to the graphical configuration options."
 msgstr "Volver a las opciones de configuración gráfica."
 
 msgid "Back to the graphical configuration options."
 msgstr "Volver a las opciones de configuración gráfica."
 
-#: driver/demo-Gtk-widgets.c:1709 driver/demo-Gtk.c:741
+#: driver/demo-Gtk-widgets.c:1709 driver/demo-Gtk.c:748
 #: driver/xscreensaver-demo.glade.h:54
 msgid "OK"
 msgstr "Aceptar"
 #: driver/xscreensaver-demo.glade.h:54
 msgid "OK"
 msgstr "Aceptar"
@@ -568,11 +568,11 @@ msgstr "Aceptar"
 msgid "Cancel"
 msgstr "Cancelar"
 
 msgid "Cancel"
 msgstr "Cancelar"
 
-#: driver/demo-Gtk.c:649
+#: driver/demo-Gtk.c:656
 msgid "For updates, check http://www.jwz.org/xscreensaver/"
 msgstr "Por actualizaciones visite la página http://www.jwz.org/xscreensaver/"
 
 msgid "For updates, check http://www.jwz.org/xscreensaver/"
 msgstr "Por actualizaciones visite la página http://www.jwz.org/xscreensaver/"
 
-#: driver/demo-Gtk.c:779
+#: driver/demo-Gtk.c:786
 msgid ""
 "Error:\n"
 "\n"
 msgid ""
 "Error:\n"
 "\n"
@@ -582,7 +582,7 @@ msgstr ""
 "\n"
 "No se ha especificado una dirección para la ayuda.\n"
 
 "\n"
 "No se ha especificado una dirección para la ayuda.\n"
 
-#: driver/demo-Gtk.c:865
+#: driver/demo-Gtk.c:872
 msgid ""
 "Error:\n"
 "\n"
 msgid ""
 "Error:\n"
 "\n"
@@ -594,7 +594,7 @@ msgstr ""
 "El demonio del XScreenSaver no se ha iniciado correctamente.\n"
 "\n"
 
 "El demonio del XScreenSaver no se ha iniciado correctamente.\n"
 "\n"
 
-#: driver/demo-Gtk.c:877
+#: driver/demo-Gtk.c:884
 msgid ""
 "You are running as root.  This usually means that xscreensaver\n"
 "was unable to contact your X server because access control is\n"
 msgid ""
 "You are running as root.  This usually means that xscreensaver\n"
 "was unable to contact your X server because access control is\n"
@@ -628,11 +628,11 @@ msgstr ""
 "Usted no debería ejecutar X como root. En vez de eso debería conectarse\n"
 "como un usuario normal y utilizar el comando «su» cuando sea necesario."
 
 "Usted no debería ejecutar X como root. En vez de eso debería conectarse\n"
 "como un usuario normal y utilizar el comando «su» cuando sea necesario."
 
-#: driver/demo-Gtk.c:893
+#: driver/demo-Gtk.c:900
 msgid "Please check your $PATH and permissions."
 msgstr "Por favor chequee su variable $PATH y los permisos."
 
 msgid "Please check your $PATH and permissions."
 msgstr "Por favor chequee su variable $PATH y los permisos."
 
-#: driver/demo-Gtk.c:928
+#: driver/demo-Gtk.c:935
 msgid ""
 "Error:\n"
 "\n"
 msgid ""
 "Error:\n"
 "\n"
@@ -642,7 +642,7 @@ msgstr ""
 "\n"
 "¡No se ha podido determinar el nombre del archivo init!\n"
 
 "\n"
 "¡No se ha podido determinar el nombre del archivo init!\n"
 
-#: driver/demo-Gtk.c:933
+#: driver/demo-Gtk.c:940
 #, c-format
 msgid ""
 "Error:\n"
 #, c-format
 msgid ""
 "Error:\n"
@@ -653,7 +653,7 @@ msgstr ""
 "\n"
 "No se ha podido escribir %s\n"
 
 "\n"
 "No se ha podido escribir %s\n"
 
-#: driver/demo-Gtk.c:992
+#: driver/demo-Gtk.c:999
 msgid ""
 "Error:\n"
 "\n"
 msgid ""
 "Error:\n"
 "\n"
@@ -663,7 +663,7 @@ msgstr ""
 "\n"
 "No se ha encontrado el recurso de configuración «manualCommand»."
 
 "\n"
 "No se ha encontrado el recurso de configuración «manualCommand»."
 
-#: driver/demo-Gtk.c:1173
+#: driver/demo-Gtk.c:1180
 #, c-format
 msgid ""
 "Error:\n"
 #, c-format
 msgid ""
 "Error:\n"
@@ -674,7 +674,7 @@ msgstr ""
 "\n"
 "Formato de hora inválido: «%s»\n"
 
 "\n"
 "Formato de hora inválido: «%s»\n"
 
-#: driver/demo-Gtk.c:1829
+#: driver/demo-Gtk.c:1836
 #, c-format
 msgid ""
 "Error:\n"
 #, c-format
 msgid ""
 "Error:\n"
@@ -685,29 +685,29 @@ msgstr ""
 "\n"
 "El directorio no existe: «%s»\n"
 
 "\n"
 "El directorio no existe: «%s»\n"
 
-#: driver/demo-Gtk.c:2546
+#: driver/demo-Gtk.c:2553
 msgid "Descriptions not available: no XML support compiled in."
 msgstr ""
 "Descripciones no disponibles: No se ha compilado con el soporte para XML."
 
 msgid "Descriptions not available: no XML support compiled in."
 msgstr ""
 "Descripciones no disponibles: No se ha compilado con el soporte para XML."
 
-#: driver/demo-Gtk.c:2551
+#: driver/demo-Gtk.c:2558
 msgid "No description available."
 msgstr "No hay descripción disponible"
 
 msgid "No description available."
 msgstr "No hay descripción disponible"
 
-#: driver/demo-Gtk.c:2816
+#: driver/demo-Gtk.c:2823
 msgid "Blank Screen"
 msgstr "Activar protector"
 
 msgid "Blank Screen"
 msgstr "Activar protector"
 
-#: driver/demo-Gtk.c:2822
+#: driver/demo-Gtk.c:2829
 msgid "Screen Saver Disabled"
 msgstr "Salvapantalla desactivado"
 
 msgid "Screen Saver Disabled"
 msgstr "Salvapantalla desactivado"
 
-#: driver/demo-Gtk.c:2855
+#: driver/demo-Gtk.c:2862
 #, c-format
 msgid "%s: %.100s Settings"
 msgstr ""
 
 #, c-format
 msgid "%s: %.100s Settings"
 msgstr ""
 
-#: driver/demo-Gtk.c:3010
+#: driver/demo-Gtk.c:3017
 #, c-format
 msgid ""
 "Warning:\n"
 #, c-format
 msgid ""
 "Warning:\n"
@@ -718,23 +718,23 @@ msgstr ""
 "\n"
 "El archivo «%s» ha cambiado. Reiniciando.\n"
 
 "\n"
 "El archivo «%s» ha cambiado. Reiniciando.\n"
 
-#: driver/demo-Gtk.c:3092
+#: driver/demo-Gtk.c:3099
 msgid "No Preview"
 msgstr "Sin vista previa"
 
 msgid "No Preview"
 msgstr "Sin vista previa"
 
-#: driver/demo-Gtk.c:3092
+#: driver/demo-Gtk.c:3099
 msgid "Available"
 msgstr "Disponibles"
 
 msgid "Available"
 msgstr "Disponibles"
 
-#: driver/demo-Gtk.c:3093
+#: driver/demo-Gtk.c:3100
 msgid "Not"
 msgstr ""
 
 msgid "Not"
 msgstr ""
 
-#: driver/demo-Gtk.c:3093
+#: driver/demo-Gtk.c:3100
 msgid "Installed"
 msgstr ""
 
 msgid "Installed"
 msgstr ""
 
-#: driver/demo-Gtk.c:3858
+#: driver/demo-Gtk.c:3865
 #, c-format
 msgid ""
 "Warning:\n"
 #, c-format
 msgid ""
 "Warning:\n"
@@ -747,7 +747,7 @@ msgstr ""
 "El demonio del XScreenSaver no parece estar ejecutándose\n"
 "en la pantalla «%s». ¿Desea ejecutarlo ahora?"
 
 "El demonio del XScreenSaver no parece estar ejecutándose\n"
 "en la pantalla «%s». ¿Desea ejecutarlo ahora?"
 
-#: driver/demo-Gtk.c:3868
+#: driver/demo-Gtk.c:3875
 #, c-format
 msgid ""
 "Warning:\n"
 #, c-format
 msgid ""
 "Warning:\n"
@@ -780,7 +780,7 @@ msgstr ""
 "\n"
 "¿Reiniciar el demonio del XScreenSaver ahora?\n"
 
 "\n"
 "¿Reiniciar el demonio del XScreenSaver ahora?\n"
 
-#: driver/demo-Gtk.c:3893
+#: driver/demo-Gtk.c:3900
 #, c-format
 msgid ""
 "Warning:\n"
 #, c-format
 msgid ""
 "Warning:\n"
@@ -807,7 +807,7 @@ msgstr ""
 "\n"
 "¿Reiniciar el demonio en «%s» como «%s» en este momento?\n"
 
 "\n"
 "¿Reiniciar el demonio en «%s» como «%s» en este momento?\n"
 
-#: driver/demo-Gtk.c:3915
+#: driver/demo-Gtk.c:3922
 #, c-format
 msgid ""
 "Warning:\n"
 #, c-format
 msgid ""
 "Warning:\n"
@@ -827,12 +827,12 @@ msgstr ""
 "\n"
 "¿Reiniciar el demonio del XScreenSaver ahora?\n"
 
 "\n"
 "¿Reiniciar el demonio del XScreenSaver ahora?\n"
 
-#: driver/demo-Gtk.c:4372
+#: driver/demo-Gtk.c:4379
 #, c-format
 msgid "%s: unknown option: %s\n"
 msgstr "%s: opción desconocida: %s\n"
 
 #, c-format
 msgid "%s: unknown option: %s\n"
 msgstr "%s: opción desconocida: %s\n"
 
-#: driver/demo-Gtk.c:4436
+#: driver/demo-Gtk.c:4443
 #, fuzzy
 msgid "Screensaver Preferences"
 msgstr "Salvapantallas"
 #, fuzzy
 msgid "Screensaver Preferences"
 msgstr "Salvapantallas"
@@ -1055,22 +1055,23 @@ msgstr "Brazos"
 #: 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/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:5 hacks/config/flyingtoasters.xml.h:5
-#: hacks/config/fontglide.xml.h:4 hacks/config/forest.xml.h:1
-#: hacks/config/fuzzyflakes.xml.h:7 hacks/config/galaxy.xml.h:3
-#: hacks/config/gears.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:6
-#: 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/fadeplot.xml.h:4 hacks/config/fireworkx.xml.h:3
+#: 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:2 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/fuzzyflakes.xml.h:7
+#: hacks/config/galaxy.xml.h:3 hacks/config/gears.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:6 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/intermomentary.xml.h:1 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/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
@@ -1088,23 +1089,24 @@ msgstr "Brazos"
 #: hacks/config/pacman.xml.h:1 hacks/config/penetrate.xml.h:3
 #: hacks/config/penrose.xml.h:6 hacks/config/petri.xml.h:5
 #: hacks/config/phosphor.xml.h:4 hacks/config/piecewise.xml.h:4
 #: hacks/config/pacman.xml.h:1 hacks/config/penetrate.xml.h:3
 #: hacks/config/penrose.xml.h:6 hacks/config/petri.xml.h:5
 #: hacks/config/phosphor.xml.h:4 hacks/config/piecewise.xml.h:4
-#: hacks/config/pipes.xml.h:5 hacks/config/polyhedra.xml.h:18
-#: hacks/config/polyominoes.xml.h:2 hacks/config/polytopes.xml.h:11
-#: hacks/config/pong.xml.h:1 hacks/config/popsquares.xml.h:3
-#: hacks/config/providence.xml.h:2 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 hacks/config/rocks.xml.h:4
-#: hacks/config/rotor.xml.h:3 hacks/config/rubik.xml.h:3
-#: hacks/config/sballs.xml.h:4 hacks/config/shadebobs.xml.h:3
-#: hacks/config/sierpinski.xml.h:2 hacks/config/sierpinski3d.xml.h:2
-#: hacks/config/slidescreen.xml.h:2 hacks/config/slip.xml.h:2
-#: hacks/config/speedmine.xml.h:3 hacks/config/sphere.xml.h:2
-#: hacks/config/spheremonics.xml.h:5 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:1 hacks/config/superquadrics.xml.h:4
+#: hacks/config/pinion.xml.h:5 hacks/config/pipes.xml.h:5
+#: hacks/config/polyhedra.xml.h:18 hacks/config/polyominoes.xml.h:2
+#: hacks/config/polytopes.xml.h:11 hacks/config/pong.xml.h:1
+#: hacks/config/popsquares.xml.h:3 hacks/config/providence.xml.h:2
+#: 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
+#: hacks/config/rocks.xml.h:4 hacks/config/rotor.xml.h:3
+#: hacks/config/rubik.xml.h:3 hacks/config/sballs.xml.h:4
+#: hacks/config/shadebobs.xml.h:3 hacks/config/sierpinski.xml.h:2
+#: hacks/config/sierpinski3d.xml.h:2 hacks/config/slidescreen.xml.h:2
+#: hacks/config/slip.xml.h:2 hacks/config/speedmine.xml.h:3
+#: hacks/config/sphere.xml.h:2 hacks/config/spheremonics.xml.h:5
+#: 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:1
+#: hacks/config/substrate.xml.h:2 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/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
@@ -1126,8 +1128,9 @@ msgstr "Rápido"
 #: hacks/config/fuzzyflakes.xml.h:8 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/fuzzyflakes.xml.h:8 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/wormhole.xml.h:3 hacks/config/xfishtank.xml.h:4
+#: hacks/config/substrate.xml.h:3 hacks/config/thornbird.xml.h:3
+#: hacks/config/whirlwindwarp.xml.h:1 hacks/config/wormhole.xml.h:3
+#: hacks/config/xfishtank.xml.h:4
 msgid "Few"
 msgstr "Poco"
 
 msgid "Few"
 msgstr "Poco"
 
@@ -1143,7 +1146,7 @@ msgstr "Poco"
 #: hacks/config/epicycle.xml.h:8 hacks/config/eruption.xml.h:12
 #: hacks/config/euler2d.xml.h:8 hacks/config/fadeplot.xml.h:6
 #: hacks/config/flag.xml.h:5 hacks/config/flame.xml.h:11
 #: hacks/config/epicycle.xml.h:8 hacks/config/eruption.xml.h:12
 #: hacks/config/euler2d.xml.h:8 hacks/config/fadeplot.xml.h:6
 #: hacks/config/flag.xml.h:5 hacks/config/flame.xml.h:11
-#: hacks/config/flow.xml.h:8 hacks/config/fluidballs.xml.h:13
+#: hacks/config/flow.xml.h:7 hacks/config/fluidballs.xml.h:13
 #: hacks/config/forest.xml.h:3 hacks/config/fuzzyflakes.xml.h:12
 #: 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/forest.xml.h:3 hacks/config/fuzzyflakes.xml.h:12
 #: hacks/config/galaxy.xml.h:6 hacks/config/grav.xml.h:4
 #: hacks/config/halo.xml.h:4 hacks/config/hopalong.xml.h:15
@@ -1181,7 +1184,7 @@ msgstr "Muchas"
 #: 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/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/flow.xml.h:8 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/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
@@ -1235,22 +1238,23 @@ msgstr ""
 #: 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/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/flyingtoasters.xml.h:11
-#: hacks/config/fontglide.xml.h:13 hacks/config/forest.xml.h:5
-#: hacks/config/fuzzyflakes.xml.h:15 hacks/config/galaxy.xml.h:10
-#: hacks/config/gears.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:8 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:10 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/fadeplot.xml.h:8 hacks/config/fireworkx.xml.h:9
+#: 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:10 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/fuzzyflakes.xml.h:15
+#: hacks/config/galaxy.xml.h:11 hacks/config/gears.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:8
+#: 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:10
+#: 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/intermomentary.xml.h:4 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/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
@@ -1268,23 +1272,24 @@ msgstr ""
 #: hacks/config/pacman.xml.h:5 hacks/config/penetrate.xml.h:6
 #: hacks/config/penrose.xml.h:11 hacks/config/petri.xml.h:23
 #: hacks/config/phosphor.xml.h:7 hacks/config/piecewise.xml.h:9
 #: hacks/config/pacman.xml.h:5 hacks/config/penetrate.xml.h:6
 #: hacks/config/penrose.xml.h:11 hacks/config/petri.xml.h:23
 #: hacks/config/phosphor.xml.h:7 hacks/config/piecewise.xml.h:9
-#: hacks/config/pipes.xml.h:15 hacks/config/polyhedra.xml.h:119
-#: hacks/config/polyominoes.xml.h:10 hacks/config/polytopes.xml.h:20
-#: hacks/config/pong.xml.h:4 hacks/config/popsquares.xml.h:5
-#: hacks/config/providence.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 hacks/config/rocks.xml.h:9
-#: hacks/config/rotor.xml.h:11 hacks/config/rubik.xml.h:9
-#: hacks/config/sballs.xml.h:13 hacks/config/shadebobs.xml.h:9
-#: hacks/config/sierpinski.xml.h:7 hacks/config/sierpinski3d.xml.h:8
-#: hacks/config/slidescreen.xml.h:6 hacks/config/slip.xml.h:7
-#: hacks/config/speedmine.xml.h:13 hacks/config/sphere.xml.h:5
-#: hacks/config/spheremonics.xml.h:19 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:4 hacks/config/superquadrics.xml.h:8
+#: hacks/config/pinion.xml.h:13 hacks/config/pipes.xml.h:15
+#: hacks/config/polyhedra.xml.h:119 hacks/config/polyominoes.xml.h:10
+#: hacks/config/polytopes.xml.h:20 hacks/config/pong.xml.h:4
+#: hacks/config/popsquares.xml.h:5 hacks/config/providence.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
+#: hacks/config/rocks.xml.h:9 hacks/config/rotor.xml.h:11
+#: hacks/config/rubik.xml.h:9 hacks/config/sballs.xml.h:13
+#: hacks/config/shadebobs.xml.h:9 hacks/config/sierpinski.xml.h:7
+#: hacks/config/sierpinski3d.xml.h:8 hacks/config/slidescreen.xml.h:6
+#: hacks/config/slip.xml.h:7 hacks/config/speedmine.xml.h:13
+#: hacks/config/sphere.xml.h:5 hacks/config/spheremonics.xml.h:19
+#: 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:4
+#: hacks/config/substrate.xml.h:10 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/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
@@ -1317,17 +1322,18 @@ msgstr "Lento"
 #: hacks/config/engine.xml.h:16 hacks/config/epicycle.xml.h:11
 #: 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/engine.xml.h:16 hacks/config/epicycle.xml.h:11
 #: 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/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/fuzzyflakes.xml.h:17
-#: hacks/config/galaxy.xml.h:11 hacks/config/glblur.xml.h:17
-#: hacks/config/glforestfire.xml.h:15 hacks/config/glplanet.xml.h:10
-#: 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:11 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/fireworkx.xml.h:11 hacks/config/flag.xml.h:9
+#: hacks/config/flame.xml.h:15 hacks/config/flipflop.xml.h:7
+#: hacks/config/flipscreen3d.xml.h:7 hacks/config/flow.xml.h:12
+#: hacks/config/fluidballs.xml.h:20 hacks/config/forest.xml.h:6
+#: hacks/config/fuzzyflakes.xml.h:17 hacks/config/galaxy.xml.h:12
+#: hacks/config/glblur.xml.h:17 hacks/config/glforestfire.xml.h:15
+#: hacks/config/glplanet.xml.h:10 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:11
+#: 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/intermomentary.xml.h:5 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/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
@@ -1356,16 +1362,16 @@ msgstr "Lento"
 #: 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/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/xplanet.xml.h:60 hacks/config/xrayswarm.xml.h:4
-#: hacks/config/zoom.xml.h:7
+#: hacks/config/strange.xml.h:5 hacks/config/substrate.xml.h:11
+#: 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/xplanet.xml.h:60
+#: hacks/config/xrayswarm.xml.h:4 hacks/config/zoom.xml.h:7
 msgid "Speed"
 msgstr "Velocidad"
 
 msgid "Speed"
 msgstr "Velocidad"
 
@@ -1408,8 +1414,8 @@ msgstr ""
 #: hacks/config/discrete.xml.h:11 hacks/config/drift.xml.h:14
 #: hacks/config/epicycle.xml.h:13 hacks/config/euler2d.xml.h:17
 #: hacks/config/fadeplot.xml.h:12 hacks/config/flag.xml.h:13
 #: hacks/config/discrete.xml.h:11 hacks/config/drift.xml.h:14
 #: hacks/config/epicycle.xml.h:13 hacks/config/euler2d.xml.h:17
 #: hacks/config/fadeplot.xml.h:12 hacks/config/flag.xml.h:13
-#: hacks/config/flame.xml.h:16 hacks/config/flow.xml.h:18
-#: hacks/config/forest.xml.h:8 hacks/config/galaxy.xml.h:13
+#: hacks/config/flame.xml.h:16 hacks/config/flow.xml.h:15
+#: hacks/config/forest.xml.h:8 hacks/config/galaxy.xml.h:14
 #: hacks/config/grav.xml.h:11 hacks/config/halo.xml.h:13
 #: hacks/config/hopalong.xml.h:25 hacks/config/ifs.xml.h:8
 #: hacks/config/imsmap.xml.h:15 hacks/config/interference.xml.h:19
 #: hacks/config/grav.xml.h:11 hacks/config/halo.xml.h:13
 #: hacks/config/hopalong.xml.h:25 hacks/config/ifs.xml.h:8
 #: hacks/config/imsmap.xml.h:15 hacks/config/interference.xml.h:19
@@ -1515,7 +1521,7 @@ msgstr "Celdas de cuatro caras"
 #: 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/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/flag.xml.h:4 hacks/config/flow.xml.h:4
 #: hacks/config/fluidballs.xml.h:12 hacks/config/fuzzyflakes.xml.h:10
 #: 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/fluidballs.xml.h:12 hacks/config/fuzzyflakes.xml.h:10
 #: hacks/config/gleidescope.xml.h:7 hacks/config/halftone.xml.h:8
 #: hacks/config/hopalong.xml.h:13 hacks/config/interference.xml.h:11
@@ -1547,7 +1553,7 @@ msgstr "Celdas de seis lados"
 #: 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/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/flag.xml.h:8 hacks/config/flow.xml.h:11
 #: hacks/config/fluidballs.xml.h:19 hacks/config/fuzzyflakes.xml.h:16
 #: 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/fluidballs.xml.h:19 hacks/config/fuzzyflakes.xml.h:16
 #: hacks/config/gleidescope.xml.h:12 hacks/config/halftone.xml.h:14
 #: hacks/config/hopalong.xml.h:22 hacks/config/interference.xml.h:18
@@ -1566,7 +1572,7 @@ msgstr "Celdas de tres lados"
 
 #: 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/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/flag.xml.h:12 hacks/config/flow.xml.h:14
 #: hacks/config/lissie.xml.h:12 hacks/config/loop.xml.h:11
 #: hacks/config/rubik.xml.h:12 hacks/config/sierpinski.xml.h:11
 #: hacks/config/slip.xml.h:11
 #: hacks/config/lissie.xml.h:12 hacks/config/loop.xml.h:11
 #: hacks/config/rubik.xml.h:12 hacks/config/sierpinski.xml.h:11
 #: hacks/config/slip.xml.h:11
@@ -1617,13 +1623,14 @@ msgstr ""
 #: hacks/config/menger.xml.h:15 hacks/config/mirrorblob.xml.h:18
 #: hacks/config/moebius.xml.h:6 hacks/config/molecule.xml.h:21
 #: hacks/config/morph3d.xml.h:5 hacks/config/noof.xml.h:4
 #: hacks/config/menger.xml.h:15 hacks/config/mirrorblob.xml.h:18
 #: hacks/config/moebius.xml.h:6 hacks/config/molecule.xml.h:21
 #: hacks/config/morph3d.xml.h:5 hacks/config/noof.xml.h:4
-#: hacks/config/pipes.xml.h:14 hacks/config/polyhedra.xml.h:118
-#: hacks/config/polytopes.xml.h:18 hacks/config/providence.xml.h:4
-#: 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
+#: hacks/config/pinion.xml.h:12 hacks/config/pipes.xml.h:14
+#: hacks/config/polyhedra.xml.h:118 hacks/config/polytopes.xml.h:18
+#: hacks/config/providence.xml.h:4 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 "Mostrar cuadros por segundo"
 
 msgid "Show Frames-per-Second"
 msgstr "Mostrar cuadros por segundo"
 
@@ -1790,11 +1797,12 @@ msgstr "Velocidad de la ballena"
 #: hacks/config/lament.xml.h:9 hacks/config/lavalite.xml.h:32
 #: hacks/config/menger.xml.h:21 hacks/config/mirrorblob.xml.h:24
 #: hacks/config/moebius.xml.h:11 hacks/config/molecule.xml.h:26
 #: hacks/config/lament.xml.h:9 hacks/config/lavalite.xml.h:32
 #: hacks/config/menger.xml.h:21 hacks/config/mirrorblob.xml.h:24
 #: hacks/config/moebius.xml.h:11 hacks/config/molecule.xml.h:26
-#: hacks/config/polyhedra.xml.h:173 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
+#: hacks/config/pinion.xml.h:15 hacks/config/polyhedra.xml.h:173
+#: 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 "Marco de alambre"
 
 msgid "Wireframe"
 msgstr "Marco de alambre"
 
@@ -1893,14 +1901,15 @@ msgstr "Líneas"
 #: 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/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/mismunch.xml.h:3
-#: 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 hacks/config/spheremonics.xml.h:7
+#: hacks/config/flow.xml.h:6 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/mismunch.xml.h:3 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
+#: hacks/config/spheremonics.xml.h:7 hacks/config/substrate.xml.h:6
 #: hacks/config/wander.xml.h:10 hacks/config/whirlwindwarp.xml.h:3
 msgid "Long"
 msgstr "Longitud"
 #: hacks/config/wander.xml.h:10 hacks/config/whirlwindwarp.xml.h:3
 msgid "Long"
 msgstr "Longitud"
@@ -1948,13 +1957,14 @@ msgstr "Repulsión de aislamiento"
 #: 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/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/metaballs.xml.h:12 hacks/config/mismunch.xml.h:8
-#: 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/flow.xml.h:9 hacks/config/galaxy.xml.h:9
+#: hacks/config/klein.xml.h:5 hacks/config/laser.xml.h:9
+#: hacks/config/menger.xml.h:14 hacks/config/metaballs.xml.h:12
+#: hacks/config/mismunch.xml.h:8 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/substrate.xml.h:9
 #: hacks/config/wander.xml.h:12 hacks/config/whirlwindwarp.xml.h:6
 msgid "Short"
 msgstr "Corto"
 #: hacks/config/wander.xml.h:12 hacks/config/whirlwindwarp.xml.h:6
 msgid "Short"
 msgstr "Corto"
@@ -2176,10 +2186,10 @@ msgstr ""
 #: 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/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/polyhedra.xml.h:3 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/wormhole.xml.h:1
-#: hacks/config/xfishtank.xml.h:1
+#: hacks/config/pinion.xml.h:3 hacks/config/polyhedra.xml.h:3
+#: 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/wormhole.xml.h:1 hacks/config/xfishtank.xml.h:1
 msgid "Animation Speed"
 msgstr "Velocidad de la animación"
 
 msgid "Animation Speed"
 msgstr "Velocidad de la animación"
 
@@ -2263,8 +2273,9 @@ msgstr ""
 #: 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/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/starfish.xml.h:2 hacks/config/substrate.xml.h:1
+#: hacks/config/vidwhacker.xml.h:3 hacks/config/wander.xml.h:7
+#: hacks/config/xspirograph.xml.h:3
 msgid "Duration"
 msgstr "Duración"
 
 msgid "Duration"
 msgstr "Duración"
 
@@ -2533,7 +2544,7 @@ msgstr "Partes"
 msgid "Rotate"
 msgstr "Rotar"
 
 msgid "Rotate"
 msgstr "Rotar"
 
-#: hacks/config/circuit.xml.h:8
+#: hacks/config/circuit.xml.h:8 hacks/config/pinion.xml.h:10
 msgid "Rotation Speed"
 msgstr "Velocidad de rotación"
 
 msgid "Rotation Speed"
 msgstr "Velocidad de rotación"
 
@@ -2622,11 +2633,12 @@ msgstr "1 segundo"
 msgid "Coral"
 msgstr "Coral"
 
 msgid "Coral"
 msgstr "Coral"
 
-#: hacks/config/coral.xml.h:4 hacks/config/gflux.xml.h:3
-#: hacks/config/glblur.xml.h:2 hacks/config/glmatrix.xml.h:3
-#: 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
+#: hacks/config/coral.xml.h:4 hacks/config/fireworkx.xml.h:2
+#: hacks/config/gflux.xml.h:3 hacks/config/glblur.xml.h:2
+#: hacks/config/glmatrix.xml.h:3 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
 msgid "Dense"
 msgstr "Denso"
 
 msgid "Dense"
 msgstr "Denso"
 
@@ -2641,12 +2653,12 @@ msgstr ""
 "Simula el crecimiento de coral, aunque un poco mas lento. Escrito por "
 "Frederick Roeber."
 
 "Simula el crecimiento de coral, aunque un poco mas lento. Escrito por "
 "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
-#: hacks/config/imsmap.xml.h:13 hacks/config/lavalite.xml.h:29
-#: hacks/config/pyro.xml.h:14 hacks/config/qix.xml.h:21
-#: hacks/config/squiral.xml.h:15 hacks/config/xearth.xml.h:24
-#: hacks/config/xmatrix.xml.h:17
+#: hacks/config/coral.xml.h:13 hacks/config/fireworkx.xml.h:10
+#: hacks/config/gflux.xml.h:13 hacks/config/glblur.xml.h:16
+#: hacks/config/glmatrix.xml.h:19 hacks/config/imsmap.xml.h:13
+#: hacks/config/lavalite.xml.h:29 hacks/config/pyro.xml.h:14
+#: hacks/config/qix.xml.h:21 hacks/config/squiral.xml.h:15
+#: hacks/config/xearth.xml.h:24 hacks/config/xmatrix.xml.h:17
 msgid "Sparse"
 msgstr "Esparcido"
 
 msgid "Sparse"
 msgstr "Esparcido"
 
@@ -2681,7 +2693,7 @@ msgid "Center on Screen"
 msgstr "Centrar en la pantalla"
 
 #: hacks/config/crystal.xml.h:2 hacks/config/deluxe.xml.h:1
 msgstr "Centrar en la pantalla"
 
 #: hacks/config/crystal.xml.h:2 hacks/config/deluxe.xml.h:1
-#: hacks/config/fadeplot.xml.h:1 hacks/config/flow.xml.h:3
+#: hacks/config/fadeplot.xml.h:1 hacks/config/flow.xml.h:1
 #: hacks/config/galaxy.xml.h:1 hacks/config/glforestfire.xml.h:1
 #: hacks/config/grav.xml.h:1 hacks/config/julia.xml.h:1
 #: hacks/config/laser.xml.h:1 hacks/config/lisa.xml.h:1
 #: hacks/config/galaxy.xml.h:1 hacks/config/glforestfire.xml.h:1
 #: hacks/config/grav.xml.h:1 hacks/config/julia.xml.h:1
 #: hacks/config/laser.xml.h:1 hacks/config/lisa.xml.h:1
@@ -3508,7 +3520,7 @@ msgstr "Permitir atractores 2D"
 msgid "Half"
 msgstr "Halo"
 
 msgid "Half"
 msgstr "Halo"
 
-#: hacks/config/fireflies.xml.h:17
+#: hacks/config/fireflies.xml.h:17 hacks/config/pinion.xml.h:7
 #, fuzzy
 msgid "Huge"
 msgstr "Fuego Enorme"
 #, fuzzy
 msgid "Huge"
 msgstr "Fuego Enorme"
@@ -3605,7 +3617,7 @@ msgstr ""
 msgid "Swarm tails glow"
 msgstr ""
 
 msgid "Swarm tails glow"
 msgstr ""
 
-#: hacks/config/fireflies.xml.h:43
+#: hacks/config/fireflies.xml.h:43 hacks/config/pinion.xml.h:14
 #, fuzzy
 msgid "Tiny"
 msgstr "Finura"
 #, fuzzy
 msgid "Tiny"
 msgstr "Finura"
@@ -3623,6 +3635,33 @@ msgstr "Viento"
 msgid "Wind picks up"
 msgstr ""
 
 msgid "Wind picks up"
 msgstr ""
 
+#: hacks/config/fireworkx.xml.h:1 hacks/config/lavalite.xml.h:3
+msgid "Activity"
+msgstr "Actividad"
+
+#: hacks/config/fireworkx.xml.h:4
+msgid "Fast Fade (more realistic)"
+msgstr ""
+
+#: hacks/config/fireworkx.xml.h:5
+#, fuzzy
+msgid "Fireworkx"
+msgstr "_Archivo"
+
+#: hacks/config/fireworkx.xml.h:6
+#, fuzzy
+msgid "Light effect"
+msgstr "Efecto de rayos"
+
+#: hacks/config/fireworkx.xml.h:7
+msgid "Pyrotechnics simulation eye-candy. Written by Rony B. Chandran."
+msgstr ""
+
+#: hacks/config/fireworkx.xml.h:8
+#, fuzzy
+msgid "Shoot"
+msgstr "Corto"
+
 #: hacks/config/flag.xml.h:1
 msgid "Bitmap for Flag"
 msgstr "Gráfico para la bandera"
 #: hacks/config/flag.xml.h:1
 msgid "Bitmap for Flag"
 msgstr "Gráfico para la bandera"
@@ -3704,46 +3743,49 @@ msgstr ""
 "Toma una imagen del escritorio, la convierte en un mapa de textura GL y la "
 "hace girar alrededor y deformarse de varios modos. Escrito por Ben Buxton."
 
 "Toma una imagen del escritorio, la convierte en un mapa de textura GL y la "
 "hace girar alrededor y deformarse de varios modos. Escrito por Ben Buxton."
 
-#: hacks/config/flow.xml.h:1
-msgid "Allow 2D Attractors"
-msgstr "Permitir atractores 2D"
+#: hacks/config/flow.xml.h:3
+msgid "Flow"
+msgstr "Flujo"
+
+#: hacks/config/flow.xml.h:5
+#, fuzzy
+msgid "Length of trails"
+msgstr "Dejar rastros"
 
 
-#: hacks/config/flow.xml.h:2
+#: hacks/config/flow.xml.h:13
 #, fuzzy
 msgid ""
 #, fuzzy
 msgid ""
-"Another series of strange attractors: a flowing series of points, making "
-"strange rotational shapes. Written by Tim Auckland."
+"Strange attractors formed of flows in a 3D differential equation phase "
+"space. Written by Tim Auckland."
 msgstr ""
 "Otra serie de extraños atractores: una serie de puntos flotantes, haciendo "
 "extrañas formas rotativas. Escrito por Jeff Butterworth."
 
 msgstr ""
 "Otra serie de extraños atractores: una serie de puntos flotantes, haciendo "
 "extrañas formas rotativas. Escrito por Jeff Butterworth."
 
-#: hacks/config/flow.xml.h:5
-msgid "Flow"
-msgstr "Flujo"
-
-#: hacks/config/flow.xml.h:6
-msgid "Freeze Some Bees"
-msgstr "Congelar algunas abejas"
+#: hacks/config/flow.xml.h:16
+msgid "turn on/off bounding box."
+msgstr ""
 
 
-#: hacks/config/flow.xml.h:10
-msgid "Ride a Trained Bee"
-msgstr "Montar una abeja entrenada"
+#: hacks/config/flow.xml.h:17
+#, fuzzy
+msgid "turn on/off double buffering."
+msgstr "Buffer doble"
 
 
-#: hacks/config/flow.xml.h:11
-msgid "Rotate Around Attractor"
-msgstr "Girar alrededor del atractor"
+#: hacks/config/flow.xml.h:18
+msgid "turn on/off periodic attractors."
+msgstr ""
 
 
-#: hacks/config/flow.xml.h:12
-msgid "Show Bounding Box"
-msgstr "Mostrar caja rodeadora"
+#: hacks/config/flow.xml.h:19
+msgid "turn on/off ride in the flow."
+msgstr ""
 
 
-#: hacks/config/flow.xml.h:14
-msgid "Slow Bees with Antifreeze"
-msgstr "Ralentizar abejas con anticongelante"
+#: hacks/config/flow.xml.h:20
+#, fuzzy
+msgid "turn on/off rotating around attractor."
+msgstr "Girar alrededor del atractor"
 
 
-#: hacks/config/flow.xml.h:19
-msgid "Zoom In and Out"
-msgstr "Acercar y alejar"
+#: hacks/config/flow.xml.h:21
+msgid "turn on/off search for new attractors."
+msgstr ""
 
 #: hacks/config/fluidballs.xml.h:1
 #, fuzzy
 
 #: hacks/config/fluidballs.xml.h:1
 #, fuzzy
@@ -3972,7 +4014,12 @@ msgstr "Movimiento aleatorio"
 msgid "Galaxy"
 msgstr "Galaxia"
 
 msgid "Galaxy"
 msgstr "Galaxia"
 
-#: hacks/config/galaxy.xml.h:9 hacks/config/lisa.xml.h:7
+#: hacks/config/galaxy.xml.h:8
+#, fuzzy
+msgid "Rotate Viewpoint"
+msgstr "Movimiento lineal"
+
+#: hacks/config/galaxy.xml.h:10 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/pong.xml.h:3
 #: hacks/config/rotor.xml.h:10 hacks/config/rubik.xml.h:8
 #: hacks/config/lissie.xml.h:8 hacks/config/loop.xml.h:6
 #: hacks/config/penrose.xml.h:10 hacks/config/pong.xml.h:3
 #: hacks/config/rotor.xml.h:10 hacks/config/rubik.xml.h:8
@@ -3981,7 +4028,7 @@ msgstr "Galaxia"
 msgid "Size"
 msgstr "Tamaño"
 
 msgid "Size"
 msgstr "Tamaño"
 
-#: hacks/config/galaxy.xml.h:12
+#: hacks/config/galaxy.xml.h:13
 msgid ""
 "This draws spinning galaxies, which then collide and scatter their stars to "
 "the, uh, four winds or something. Originally an Amiga program by Uli "
 msgid ""
 "This draws spinning galaxies, which then collide and scatter their stars to "
 "the, uh, four winds or something. Originally an Amiga program by Uli "
@@ -4314,9 +4361,9 @@ msgid ""
 "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 "
 "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."
+"of this window: the tab at the top of the *other* window.) 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
 msgstr ""
 
 #: hacks/config/glslideshow.xml.h:17
@@ -4915,6 +4962,27 @@ msgstr "Número de ondas"
 msgid "Wave Size"
 msgstr "Tamaño de onda"
 
 msgid "Wave Size"
 msgstr "Tamaño de onda"
 
+#: hacks/config/intermomentary.xml.h:2
+msgid "Intermomentary"
+msgstr ""
+
+#: hacks/config/intermomentary.xml.h:3
+#, fuzzy
+msgid "Number of Discs"
+msgstr "Número de círculos"
+
+#: hacks/config/intermomentary.xml.h:6
+msgid ""
+"The Intersection Momentary is a fun visualization defining the relationships "
+"between objects with Casey Reas, William Ngan, and Robert Hodgin. "
+"Commissioned for display at the Whitney Museum of American Art. A surface "
+"filled with 100 medium to small sized circles. Each circle has a different "
+"size and direction, but moves at the same slow rate. Display: A. The "
+"instantaneous intersections of the circles. B. The aggregate intersections "
+"of the circles. Ported to XScreensaver from the art project \"InterMomentary"
+"\" at http://www.complexification.net"
+msgstr ""
+
 #: hacks/config/jigglypuff.xml.h:2
 msgid "Chrome"
 msgstr ""
 #: hacks/config/jigglypuff.xml.h:2
 msgid "Chrome"
 msgstr ""
@@ -5164,10 +5232,6 @@ msgstr ""
 msgid "10"
 msgstr "10"
 
 msgid "10"
 msgstr "10"
 
-#: hacks/config/lavalite.xml.h:3
-msgid "Activity"
-msgstr "Actividad"
-
 #: hacks/config/lavalite.xml.h:4
 msgid "Classic Lavalite"
 msgstr "Lampara clásica"
 #: hacks/config/lavalite.xml.h:4
 msgid "Classic Lavalite"
 msgstr "Lampara clásica"
@@ -5991,6 +6055,44 @@ msgid ""
 "invisibility at intersection points. Written by Geoffrey Irving."
 msgstr ""
 
 "invisibility at intersection points. Written by Geoffrey Irving."
 msgstr ""
 
+#: hacks/config/pinion.xml.h:1
+#, fuzzy
+msgid "100"
+msgstr "100%"
+
+#: hacks/config/pinion.xml.h:2
+msgid "2000"
+msgstr ""
+
+#: hacks/config/pinion.xml.h:4
+#, fuzzy
+msgid ""
+"Draws an interconnected set of gears moving across the screen. Written by "
+"Jamie Zawinski."
+msgstr ""
+"Dibuja aleatoriamente rectángulos coloreados y granulados. Escrito por Jamie "
+"Zawinski."
+
+#: hacks/config/pinion.xml.h:6
+#, fuzzy
+msgid "Gear Size"
+msgstr "Tamaño de la grilla"
+
+#: hacks/config/pinion.xml.h:8
+#, fuzzy
+msgid "Max RPM"
+msgstr "Anillos máximos"
+
+#: hacks/config/pinion.xml.h:9
+#, fuzzy
+msgid "Pinion"
+msgstr "Empaquetado"
+
+#: hacks/config/pinion.xml.h:11
+#, fuzzy
+msgid "Scrolling Speed"
+msgstr "Velocidad de desplazamiento"
+
 #: hacks/config/pipes.xml.h:1
 msgid "Allow Tight Turns"
 msgstr "Permitir giros cerrados"
 #: hacks/config/pipes.xml.h:1
 msgid "Allow Tight Turns"
 msgstr "Permitir giros cerrados"
@@ -6020,7 +6122,8 @@ msgstr ""
 "Windows NT probablemente haya visto este hack GL. Esta versión fue creada "
 "por Marcelo Vianna."
 
 "Windows NT probablemente haya visto este hack GL. Esta versión fue creada "
 "por Marcelo Vianna."
 
-#: hacks/config/pipes.xml.h:9 hacks/config/wormhole.xml.h:4
+#: hacks/config/pipes.xml.h:9 hacks/config/substrate.xml.h:7
+#: hacks/config/wormhole.xml.h:4
 msgid "Lots"
 msgstr "Muchos"
 
 msgid "Lots"
 msgstr "Muchos"
 
@@ -7338,22 +7441,26 @@ msgid "Ping subnet/30 (2 hosts)"
 msgstr ""
 
 #: hacks/config/sonar.xml.h:10
 msgstr ""
 
 #: hacks/config/sonar.xml.h:10
+msgid "Resolve Host Names"
+msgstr ""
+
+#: hacks/config/sonar.xml.h:11
 msgid "Simulation Team Members"
 msgstr "Simulación de miembros del equipo"
 
 msgid "Simulation Team Members"
 msgstr "Simulación de miembros del equipo"
 
-#: hacks/config/sonar.xml.h:11
+#: hacks/config/sonar.xml.h:12
 msgid "Sonar"
 msgstr "Sonar"
 
 msgid "Sonar"
 msgstr "Sonar"
 
-#: hacks/config/sonar.xml.h:12
+#: hacks/config/sonar.xml.h:13
 msgid "Team A Name"
 msgstr "Nombre del equipo A"
 
 msgid "Team A Name"
 msgstr "Nombre del equipo A"
 
-#: hacks/config/sonar.xml.h:13
+#: hacks/config/sonar.xml.h:14
 msgid "Team B Name"
 msgstr "Nombre del equipo B"
 
 msgid "Team B Name"
 msgstr "Nombre del equipo B"
 
-#: hacks/config/sonar.xml.h:14
+#: hacks/config/sonar.xml.h:15
 #, fuzzy
 msgid ""
 "This program draws a simulation of a sonar screen. By default, it displays a "
 #, fuzzy
 msgid ""
 "This program draws a simulation of a sonar screen. By default, it displays a "
@@ -7370,7 +7477,7 @@ msgstr ""
 "(¿Procesos?, ¿Conexiones activas de red?, ¿Uso de CPU por usuario?). Escrito "
 "por Stephen Martin."
 
 "(¿Procesos?, ¿Conexiones activas de red?, ¿Uso de CPU por usuario?). Escrito "
 "por Stephen Martin."
 
-#: hacks/config/sonar.xml.h:15
+#: hacks/config/sonar.xml.h:16
 msgid "vs."
 msgstr "vs."
 
 msgid "vs."
 msgstr "vs."
 
@@ -7696,6 +7803,33 @@ msgstr ""
 "de puntos que se intercambian y giran alrededor. El movimiento es muy "
 "bonito. Escrito por Massimino Pascal."
 
 "de puntos que se intercambian y giran alrededor. El movimiento es muy "
 "bonito. Escrito por Massimino Pascal."
 
+#: hacks/config/substrate.xml.h:4
+#, fuzzy
+msgid "Initial Cracks"
+msgstr "Densidad de la partícula"
+
+#: hacks/config/substrate.xml.h:5
+msgid ""
+"Lines like crystals grow on a computational substrate. A simple "
+"perpendicular growth rule creates intricate city-like structures. By J. "
+"Tarbell and Mike Kershaw."
+msgstr ""
+
+#: hacks/config/substrate.xml.h:8
+#, fuzzy
+msgid "Sandgrains"
+msgstr "Estándar"
+
+#: hacks/config/substrate.xml.h:12
+#, fuzzy
+msgid "Substrate"
+msgstr "Estados"
+
+#: hacks/config/substrate.xml.h:13
+#, fuzzy
+msgid "Wireframe only"
+msgstr "Marco de alambre"
+
 #: hacks/config/superquadrics.xml.h:3
 msgid ""
 "Ed Mackey reports that he wrote the first version of this program in BASIC "
 #: hacks/config/superquadrics.xml.h:3
 msgid ""
 "Ed Mackey reports that he wrote the first version of this program in BASIC "
@@ -8966,6 +9100,24 @@ msgstr ""
 "lenses el resultado es similar a mirar a través de varios lentes "
 "superpuestos mas que un simple acercamiento. Escrito por James Macnicol."
 
 "lenses el resultado es similar a mirar a través de varios lentes "
 "superpuestos mas que un simple acercamiento. Escrito por James Macnicol."
 
+#~ msgid "Allow 2D Attractors"
+#~ msgstr "Permitir atractores 2D"
+
+#~ msgid "Freeze Some Bees"
+#~ msgstr "Congelar algunas abejas"
+
+#~ msgid "Ride a Trained Bee"
+#~ msgstr "Montar una abeja entrenada"
+
+#~ msgid "Show Bounding Box"
+#~ msgstr "Mostrar caja rodeadora"
+
+#~ msgid "Slow Bees with Antifreeze"
+#~ msgstr "Ralentizar abejas con anticongelante"
+
+#~ msgid "Zoom In and Out"
+#~ msgstr "Acercar y alejar"
+
 #~ msgid "Ping Subnet"
 #~ msgstr "Ping en la subred"
 
 #~ msgid "Ping Subnet"
 #~ msgstr "Ping en la subred"
 
index 232e1e4847efd591181c52856bbea29269427517..a4aebad221f2583d40801c72dd81ee0d777c9739 100644 (file)
--- a/po/et.po
+++ b/po/et.po
@@ -6,7 +6,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: xscreensaver\n"
 "Report-Msgid-Bugs-To: \n"
 msgstr ""
 "Project-Id-Version: xscreensaver\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2004-10-04 16:25+0200\n"
+"POT-Creation-Date: 2004-12-22 12:51+0100\n"
 "PO-Revision-Date: 2002-08-29 20:14+0300\n"
 "Last-Translator: Tõivo Leedjärv <toivo@linux.ee>\n"
 "Language-Team: Estonian <gnome-et@linux.ee>\n"
 "PO-Revision-Date: 2002-08-29 20:14+0300\n"
 "Last-Translator: Tõivo Leedjärv <toivo@linux.ee>\n"
 "Language-Team: Estonian <gnome-et@linux.ee>\n"
@@ -145,7 +145,7 @@ msgstr "Kui pika aja pärast läheb ekraan täiesti mustaks."
 msgid "minutes"
 msgstr "minuti pärast"
 
 msgid "minutes"
 msgstr "minuti pärast"
 
-#: driver/demo-Gtk-widgets.c:482 driver/demo-Gtk.c:2845
+#: driver/demo-Gtk-widgets.c:482 driver/demo-Gtk.c:2852
 #: driver/xscreensaver-demo.glade.h:58
 msgid "Preview"
 msgstr "Eelvaade"
 #: driver/xscreensaver-demo.glade.h:58
 msgid "Preview"
 msgstr "Eelvaade"
@@ -190,12 +190,12 @@ msgstr "Ainult üks ekraanisäästja"
 msgid "Random Screen Saver"
 msgstr "Suvaline ekraanisäästja"
 
 msgid "Random Screen Saver"
 msgstr "Suvaline ekraanisäästja"
 
-#: driver/demo-Gtk-widgets.c:571 driver/demo-Gtk.c:2134
+#: driver/demo-Gtk-widgets.c:571 driver/demo-Gtk.c:2141
 #: driver/xscreensaver-demo.glade.h:75
 msgid "Use"
 msgstr ""
 
 #: driver/xscreensaver-demo.glade.h:75
 msgid "Use"
 msgstr ""
 
-#: driver/demo-Gtk-widgets.c:591 driver/demo-Gtk.c:2144
+#: driver/demo-Gtk-widgets.c:591 driver/demo-Gtk.c:2151
 #: driver/xscreensaver-demo.glade.h:63
 msgid "Screen Saver"
 msgstr "Ekraanisäästja"
 #: driver/xscreensaver-demo.glade.h:63
 msgid "Screen Saver"
 msgstr "Ekraanisäästja"
@@ -425,7 +425,7 @@ msgid "Visual:"
 msgstr ""
 
 #: driver/demo-Gtk-widgets.c:1550 driver/demo-Gtk-widgets.c:1573
 msgstr ""
 
 #: driver/demo-Gtk-widgets.c:1550 driver/demo-Gtk-widgets.c:1573
-#: driver/demo-Gtk.c:1538 driver/demo-Gtk.c:2864
+#: driver/demo-Gtk.c:1545 driver/demo-Gtk.c:2871
 #: driver/xscreensaver-demo.glade.h:5 driver/xscreensaver-demo.glade2.h:3
 msgid "Any"
 msgstr "Ükskõik milline"
 #: driver/xscreensaver-demo.glade.h:5 driver/xscreensaver-demo.glade2.h:3
 msgid "Any"
 msgstr "Ükskõik milline"
@@ -524,7 +524,7 @@ msgstr ""
 msgid "Back to the graphical configuration options."
 msgstr ""
 
 msgid "Back to the graphical configuration options."
 msgstr ""
 
-#: driver/demo-Gtk-widgets.c:1709 driver/demo-Gtk.c:741
+#: driver/demo-Gtk-widgets.c:1709 driver/demo-Gtk.c:748
 #: driver/xscreensaver-demo.glade.h:54
 msgid "OK"
 msgstr "Olgu"
 #: driver/xscreensaver-demo.glade.h:54
 msgid "OK"
 msgstr "Olgu"
@@ -533,18 +533,18 @@ msgstr "Olgu"
 msgid "Cancel"
 msgstr "Loobu"
 
 msgid "Cancel"
 msgstr "Loobu"
 
-#: driver/demo-Gtk.c:649
+#: driver/demo-Gtk.c:656
 msgid "For updates, check http://www.jwz.org/xscreensaver/"
 msgstr "Uuendusi leiad aadressilt http://www.jwz.org/xscreensaver/"
 
 msgid "For updates, check http://www.jwz.org/xscreensaver/"
 msgstr "Uuendusi leiad aadressilt http://www.jwz.org/xscreensaver/"
 
-#: driver/demo-Gtk.c:779
+#: driver/demo-Gtk.c:786
 msgid ""
 "Error:\n"
 "\n"
 "No Help URL has been specified.\n"
 msgstr ""
 
 msgid ""
 "Error:\n"
 "\n"
 "No Help URL has been specified.\n"
 msgstr ""
 
-#: driver/demo-Gtk.c:865
+#: driver/demo-Gtk.c:872
 msgid ""
 "Error:\n"
 "\n"
 msgid ""
 "Error:\n"
 "\n"
@@ -552,7 +552,7 @@ msgid ""
 "\n"
 msgstr ""
 
 "\n"
 msgstr ""
 
-#: driver/demo-Gtk.c:877
+#: driver/demo-Gtk.c:884
 msgid ""
 "You are running as root.  This usually means that xscreensaver\n"
 "was unable to contact your X server because access control is\n"
 msgid ""
 "You are running as root.  This usually means that xscreensaver\n"
 "was unable to contact your X server because access control is\n"
@@ -571,18 +571,18 @@ msgid ""
 "normal user, and `su' as necessary."
 msgstr ""
 
 "normal user, and `su' as necessary."
 msgstr ""
 
-#: driver/demo-Gtk.c:893
+#: driver/demo-Gtk.c:900
 msgid "Please check your $PATH and permissions."
 msgstr ""
 
 msgid "Please check your $PATH and permissions."
 msgstr ""
 
-#: driver/demo-Gtk.c:928
+#: driver/demo-Gtk.c:935
 msgid ""
 "Error:\n"
 "\n"
 "Couldn't determine init file name!\n"
 msgstr ""
 
 msgid ""
 "Error:\n"
 "\n"
 "Couldn't determine init file name!\n"
 msgstr ""
 
-#: driver/demo-Gtk.c:933
+#: driver/demo-Gtk.c:940
 #, c-format
 msgid ""
 "Error:\n"
 #, c-format
 msgid ""
 "Error:\n"
@@ -590,14 +590,14 @@ msgid ""
 "Couldn't write %s\n"
 msgstr ""
 
 "Couldn't write %s\n"
 msgstr ""
 
-#: driver/demo-Gtk.c:992
+#: driver/demo-Gtk.c:999
 msgid ""
 "Error:\n"
 "\n"
 "no `manualCommand' resource set."
 msgstr ""
 
 msgid ""
 "Error:\n"
 "\n"
 "no `manualCommand' resource set."
 msgstr ""
 
-#: driver/demo-Gtk.c:1173
+#: driver/demo-Gtk.c:1180
 #, c-format
 msgid ""
 "Error:\n"
 #, c-format
 msgid ""
 "Error:\n"
@@ -605,7 +605,7 @@ msgid ""
 "Unparsable time format: \"%s\"\n"
 msgstr ""
 
 "Unparsable time format: \"%s\"\n"
 msgstr ""
 
-#: driver/demo-Gtk.c:1829
+#: driver/demo-Gtk.c:1836
 #, c-format
 msgid ""
 "Error:\n"
 #, c-format
 msgid ""
 "Error:\n"
@@ -613,28 +613,28 @@ msgid ""
 "Directory does not exist: \"%s\"\n"
 msgstr ""
 
 "Directory does not exist: \"%s\"\n"
 msgstr ""
 
-#: driver/demo-Gtk.c:2546
+#: driver/demo-Gtk.c:2553
 msgid "Descriptions not available: no XML support compiled in."
 msgstr ""
 
 msgid "Descriptions not available: no XML support compiled in."
 msgstr ""
 
-#: driver/demo-Gtk.c:2551
+#: driver/demo-Gtk.c:2558
 msgid "No description available."
 msgstr ""
 
 msgid "No description available."
 msgstr ""
 
-#: driver/demo-Gtk.c:2816
+#: driver/demo-Gtk.c:2823
 msgid "Blank Screen"
 msgstr "Must ekraan"
 
 msgid "Blank Screen"
 msgstr "Must ekraan"
 
-#: driver/demo-Gtk.c:2822
+#: driver/demo-Gtk.c:2829
 msgid "Screen Saver Disabled"
 msgstr "Ekraanisäästja keelatud"
 
 msgid "Screen Saver Disabled"
 msgstr "Ekraanisäästja keelatud"
 
-#: driver/demo-Gtk.c:2855
+#: driver/demo-Gtk.c:2862
 #, c-format
 msgid "%s: %.100s Settings"
 msgstr ""
 
 #, c-format
 msgid "%s: %.100s Settings"
 msgstr ""
 
-#: driver/demo-Gtk.c:3010
+#: driver/demo-Gtk.c:3017
 #, c-format
 msgid ""
 "Warning:\n"
 #, c-format
 msgid ""
 "Warning:\n"
@@ -642,23 +642,23 @@ msgid ""
 "file \"%s\" has changed, reloading.\n"
 msgstr ""
 
 "file \"%s\" has changed, reloading.\n"
 msgstr ""
 
-#: driver/demo-Gtk.c:3092
+#: driver/demo-Gtk.c:3099
 msgid "No Preview"
 msgstr "Eelvaadet pole"
 
 msgid "No Preview"
 msgstr "Eelvaadet pole"
 
-#: driver/demo-Gtk.c:3092
+#: driver/demo-Gtk.c:3099
 msgid "Available"
 msgstr "saadaval"
 
 msgid "Available"
 msgstr "saadaval"
 
-#: driver/demo-Gtk.c:3093
+#: driver/demo-Gtk.c:3100
 msgid "Not"
 msgstr ""
 
 msgid "Not"
 msgstr ""
 
-#: driver/demo-Gtk.c:3093
+#: driver/demo-Gtk.c:3100
 msgid "Installed"
 msgstr ""
 
 msgid "Installed"
 msgstr ""
 
-#: driver/demo-Gtk.c:3858
+#: driver/demo-Gtk.c:3865
 #, c-format
 msgid ""
 "Warning:\n"
 #, c-format
 msgid ""
 "Warning:\n"
@@ -667,7 +667,7 @@ msgid ""
 "on display \"%s\".  Launch it now?"
 msgstr ""
 
 "on display \"%s\".  Launch it now?"
 msgstr ""
 
-#: driver/demo-Gtk.c:3868
+#: driver/demo-Gtk.c:3875
 #, c-format
 msgid ""
 "Warning:\n"
 #, c-format
 msgid ""
 "Warning:\n"
@@ -686,7 +686,7 @@ msgid ""
 "Restart the xscreensaver daemon now?\n"
 msgstr ""
 
 "Restart the xscreensaver daemon now?\n"
 msgstr ""
 
-#: driver/demo-Gtk.c:3893
+#: driver/demo-Gtk.c:3900
 #, c-format
 msgid ""
 "Warning:\n"
 #, c-format
 msgid ""
 "Warning:\n"
@@ -702,7 +702,7 @@ msgid ""
 "Restart the daemon on \"%s\" as \"%s\" now?\n"
 msgstr ""
 
 "Restart the daemon on \"%s\" as \"%s\" now?\n"
 msgstr ""
 
-#: driver/demo-Gtk.c:3915
+#: driver/demo-Gtk.c:3922
 #, c-format
 msgid ""
 "Warning:\n"
 #, c-format
 msgid ""
 "Warning:\n"
@@ -714,12 +714,12 @@ msgid ""
 "Restart the xscreensaver daemon now?\n"
 msgstr ""
 
 "Restart the xscreensaver daemon now?\n"
 msgstr ""
 
-#: driver/demo-Gtk.c:4372
+#: driver/demo-Gtk.c:4379
 #, c-format
 msgid "%s: unknown option: %s\n"
 msgstr ""
 
 #, c-format
 msgid "%s: unknown option: %s\n"
 msgstr ""
 
-#: driver/demo-Gtk.c:4436
+#: driver/demo-Gtk.c:4443
 #, fuzzy
 msgid "Screensaver Preferences"
 msgstr "Ekraanisäästja"
 #, fuzzy
 msgid "Screensaver Preferences"
 msgstr "Ekraanisäästja"
@@ -953,22 +953,23 @@ msgstr ""
 #: 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/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:5 hacks/config/flyingtoasters.xml.h:5
-#: hacks/config/fontglide.xml.h:4 hacks/config/forest.xml.h:1
-#: hacks/config/fuzzyflakes.xml.h:7 hacks/config/galaxy.xml.h:3
-#: hacks/config/gears.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:6
-#: 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/fadeplot.xml.h:4 hacks/config/fireworkx.xml.h:3
+#: 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:2 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/fuzzyflakes.xml.h:7
+#: hacks/config/galaxy.xml.h:3 hacks/config/gears.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:6 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/intermomentary.xml.h:1 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/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
@@ -986,23 +987,24 @@ msgstr ""
 #: hacks/config/pacman.xml.h:1 hacks/config/penetrate.xml.h:3
 #: hacks/config/penrose.xml.h:6 hacks/config/petri.xml.h:5
 #: hacks/config/phosphor.xml.h:4 hacks/config/piecewise.xml.h:4
 #: hacks/config/pacman.xml.h:1 hacks/config/penetrate.xml.h:3
 #: hacks/config/penrose.xml.h:6 hacks/config/petri.xml.h:5
 #: hacks/config/phosphor.xml.h:4 hacks/config/piecewise.xml.h:4
-#: hacks/config/pipes.xml.h:5 hacks/config/polyhedra.xml.h:18
-#: hacks/config/polyominoes.xml.h:2 hacks/config/polytopes.xml.h:11
-#: hacks/config/pong.xml.h:1 hacks/config/popsquares.xml.h:3
-#: hacks/config/providence.xml.h:2 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 hacks/config/rocks.xml.h:4
-#: hacks/config/rotor.xml.h:3 hacks/config/rubik.xml.h:3
-#: hacks/config/sballs.xml.h:4 hacks/config/shadebobs.xml.h:3
-#: hacks/config/sierpinski.xml.h:2 hacks/config/sierpinski3d.xml.h:2
-#: hacks/config/slidescreen.xml.h:2 hacks/config/slip.xml.h:2
-#: hacks/config/speedmine.xml.h:3 hacks/config/sphere.xml.h:2
-#: hacks/config/spheremonics.xml.h:5 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:1 hacks/config/superquadrics.xml.h:4
+#: hacks/config/pinion.xml.h:5 hacks/config/pipes.xml.h:5
+#: hacks/config/polyhedra.xml.h:18 hacks/config/polyominoes.xml.h:2
+#: hacks/config/polytopes.xml.h:11 hacks/config/pong.xml.h:1
+#: hacks/config/popsquares.xml.h:3 hacks/config/providence.xml.h:2
+#: 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
+#: hacks/config/rocks.xml.h:4 hacks/config/rotor.xml.h:3
+#: hacks/config/rubik.xml.h:3 hacks/config/sballs.xml.h:4
+#: hacks/config/shadebobs.xml.h:3 hacks/config/sierpinski.xml.h:2
+#: hacks/config/sierpinski3d.xml.h:2 hacks/config/slidescreen.xml.h:2
+#: hacks/config/slip.xml.h:2 hacks/config/speedmine.xml.h:3
+#: hacks/config/sphere.xml.h:2 hacks/config/spheremonics.xml.h:5
+#: 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:1
+#: hacks/config/substrate.xml.h:2 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/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
@@ -1024,8 +1026,9 @@ msgstr "Kiire"
 #: hacks/config/fuzzyflakes.xml.h:8 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/fuzzyflakes.xml.h:8 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/wormhole.xml.h:3 hacks/config/xfishtank.xml.h:4
+#: hacks/config/substrate.xml.h:3 hacks/config/thornbird.xml.h:3
+#: hacks/config/whirlwindwarp.xml.h:1 hacks/config/wormhole.xml.h:3
+#: hacks/config/xfishtank.xml.h:4
 msgid "Few"
 msgstr ""
 
 msgid "Few"
 msgstr ""
 
@@ -1041,7 +1044,7 @@ msgstr ""
 #: hacks/config/epicycle.xml.h:8 hacks/config/eruption.xml.h:12
 #: hacks/config/euler2d.xml.h:8 hacks/config/fadeplot.xml.h:6
 #: hacks/config/flag.xml.h:5 hacks/config/flame.xml.h:11
 #: hacks/config/epicycle.xml.h:8 hacks/config/eruption.xml.h:12
 #: hacks/config/euler2d.xml.h:8 hacks/config/fadeplot.xml.h:6
 #: hacks/config/flag.xml.h:5 hacks/config/flame.xml.h:11
-#: hacks/config/flow.xml.h:8 hacks/config/fluidballs.xml.h:13
+#: hacks/config/flow.xml.h:7 hacks/config/fluidballs.xml.h:13
 #: hacks/config/forest.xml.h:3 hacks/config/fuzzyflakes.xml.h:12
 #: 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/forest.xml.h:3 hacks/config/fuzzyflakes.xml.h:12
 #: hacks/config/galaxy.xml.h:6 hacks/config/grav.xml.h:4
 #: hacks/config/halo.xml.h:4 hacks/config/hopalong.xml.h:15
@@ -1079,7 +1082,7 @@ msgstr "Mitu"
 #: 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/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/flow.xml.h:8 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/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
@@ -1133,22 +1136,23 @@ msgstr ""
 #: 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/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/flyingtoasters.xml.h:11
-#: hacks/config/fontglide.xml.h:13 hacks/config/forest.xml.h:5
-#: hacks/config/fuzzyflakes.xml.h:15 hacks/config/galaxy.xml.h:10
-#: hacks/config/gears.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:8 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:10 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/fadeplot.xml.h:8 hacks/config/fireworkx.xml.h:9
+#: 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:10 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/fuzzyflakes.xml.h:15
+#: hacks/config/galaxy.xml.h:11 hacks/config/gears.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:8
+#: 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:10
+#: 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/intermomentary.xml.h:4 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/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
@@ -1166,23 +1170,24 @@ msgstr ""
 #: hacks/config/pacman.xml.h:5 hacks/config/penetrate.xml.h:6
 #: hacks/config/penrose.xml.h:11 hacks/config/petri.xml.h:23
 #: hacks/config/phosphor.xml.h:7 hacks/config/piecewise.xml.h:9
 #: hacks/config/pacman.xml.h:5 hacks/config/penetrate.xml.h:6
 #: hacks/config/penrose.xml.h:11 hacks/config/petri.xml.h:23
 #: hacks/config/phosphor.xml.h:7 hacks/config/piecewise.xml.h:9
-#: hacks/config/pipes.xml.h:15 hacks/config/polyhedra.xml.h:119
-#: hacks/config/polyominoes.xml.h:10 hacks/config/polytopes.xml.h:20
-#: hacks/config/pong.xml.h:4 hacks/config/popsquares.xml.h:5
-#: hacks/config/providence.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 hacks/config/rocks.xml.h:9
-#: hacks/config/rotor.xml.h:11 hacks/config/rubik.xml.h:9
-#: hacks/config/sballs.xml.h:13 hacks/config/shadebobs.xml.h:9
-#: hacks/config/sierpinski.xml.h:7 hacks/config/sierpinski3d.xml.h:8
-#: hacks/config/slidescreen.xml.h:6 hacks/config/slip.xml.h:7
-#: hacks/config/speedmine.xml.h:13 hacks/config/sphere.xml.h:5
-#: hacks/config/spheremonics.xml.h:19 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:4 hacks/config/superquadrics.xml.h:8
+#: hacks/config/pinion.xml.h:13 hacks/config/pipes.xml.h:15
+#: hacks/config/polyhedra.xml.h:119 hacks/config/polyominoes.xml.h:10
+#: hacks/config/polytopes.xml.h:20 hacks/config/pong.xml.h:4
+#: hacks/config/popsquares.xml.h:5 hacks/config/providence.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
+#: hacks/config/rocks.xml.h:9 hacks/config/rotor.xml.h:11
+#: hacks/config/rubik.xml.h:9 hacks/config/sballs.xml.h:13
+#: hacks/config/shadebobs.xml.h:9 hacks/config/sierpinski.xml.h:7
+#: hacks/config/sierpinski3d.xml.h:8 hacks/config/slidescreen.xml.h:6
+#: hacks/config/slip.xml.h:7 hacks/config/speedmine.xml.h:13
+#: hacks/config/sphere.xml.h:5 hacks/config/spheremonics.xml.h:19
+#: 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:4
+#: hacks/config/substrate.xml.h:10 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/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
@@ -1215,17 +1220,18 @@ msgstr "Aeglane"
 #: hacks/config/engine.xml.h:16 hacks/config/epicycle.xml.h:11
 #: 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/engine.xml.h:16 hacks/config/epicycle.xml.h:11
 #: 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/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/fuzzyflakes.xml.h:17
-#: hacks/config/galaxy.xml.h:11 hacks/config/glblur.xml.h:17
-#: hacks/config/glforestfire.xml.h:15 hacks/config/glplanet.xml.h:10
-#: 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:11 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/fireworkx.xml.h:11 hacks/config/flag.xml.h:9
+#: hacks/config/flame.xml.h:15 hacks/config/flipflop.xml.h:7
+#: hacks/config/flipscreen3d.xml.h:7 hacks/config/flow.xml.h:12
+#: hacks/config/fluidballs.xml.h:20 hacks/config/forest.xml.h:6
+#: hacks/config/fuzzyflakes.xml.h:17 hacks/config/galaxy.xml.h:12
+#: hacks/config/glblur.xml.h:17 hacks/config/glforestfire.xml.h:15
+#: hacks/config/glplanet.xml.h:10 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:11
+#: 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/intermomentary.xml.h:5 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/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
@@ -1254,16 +1260,16 @@ msgstr "Aeglane"
 #: 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/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/xplanet.xml.h:60 hacks/config/xrayswarm.xml.h:4
-#: hacks/config/zoom.xml.h:7
+#: hacks/config/strange.xml.h:5 hacks/config/substrate.xml.h:11
+#: 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/xplanet.xml.h:60
+#: hacks/config/xrayswarm.xml.h:4 hacks/config/zoom.xml.h:7
 msgid "Speed"
 msgstr "Kiirus"
 
 msgid "Speed"
 msgstr "Kiirus"
 
@@ -1306,8 +1312,8 @@ msgstr ""
 #: hacks/config/discrete.xml.h:11 hacks/config/drift.xml.h:14
 #: hacks/config/epicycle.xml.h:13 hacks/config/euler2d.xml.h:17
 #: hacks/config/fadeplot.xml.h:12 hacks/config/flag.xml.h:13
 #: hacks/config/discrete.xml.h:11 hacks/config/drift.xml.h:14
 #: hacks/config/epicycle.xml.h:13 hacks/config/euler2d.xml.h:17
 #: hacks/config/fadeplot.xml.h:12 hacks/config/flag.xml.h:13
-#: hacks/config/flame.xml.h:16 hacks/config/flow.xml.h:18
-#: hacks/config/forest.xml.h:8 hacks/config/galaxy.xml.h:13
+#: hacks/config/flame.xml.h:16 hacks/config/flow.xml.h:15
+#: hacks/config/forest.xml.h:8 hacks/config/galaxy.xml.h:14
 #: hacks/config/grav.xml.h:11 hacks/config/halo.xml.h:13
 #: hacks/config/hopalong.xml.h:25 hacks/config/ifs.xml.h:8
 #: hacks/config/imsmap.xml.h:15 hacks/config/interference.xml.h:19
 #: hacks/config/grav.xml.h:11 hacks/config/halo.xml.h:13
 #: hacks/config/hopalong.xml.h:25 hacks/config/ifs.xml.h:8
 #: hacks/config/imsmap.xml.h:15 hacks/config/interference.xml.h:19
@@ -1404,7 +1410,7 @@ msgstr ""
 #: 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/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/flag.xml.h:4 hacks/config/flow.xml.h:4
 #: hacks/config/fluidballs.xml.h:12 hacks/config/fuzzyflakes.xml.h:10
 #: 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/fluidballs.xml.h:12 hacks/config/fuzzyflakes.xml.h:10
 #: hacks/config/gleidescope.xml.h:7 hacks/config/halftone.xml.h:8
 #: hacks/config/hopalong.xml.h:13 hacks/config/interference.xml.h:11
@@ -1436,7 +1442,7 @@ msgstr ""
 #: 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/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/flag.xml.h:8 hacks/config/flow.xml.h:11
 #: hacks/config/fluidballs.xml.h:19 hacks/config/fuzzyflakes.xml.h:16
 #: 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/fluidballs.xml.h:19 hacks/config/fuzzyflakes.xml.h:16
 #: hacks/config/gleidescope.xml.h:12 hacks/config/halftone.xml.h:14
 #: hacks/config/hopalong.xml.h:22 hacks/config/interference.xml.h:18
@@ -1455,7 +1461,7 @@ msgstr ""
 
 #: 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/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/flag.xml.h:12 hacks/config/flow.xml.h:14
 #: hacks/config/lissie.xml.h:12 hacks/config/loop.xml.h:11
 #: hacks/config/rubik.xml.h:12 hacks/config/sierpinski.xml.h:11
 #: hacks/config/slip.xml.h:11
 #: hacks/config/lissie.xml.h:12 hacks/config/loop.xml.h:11
 #: hacks/config/rubik.xml.h:12 hacks/config/sierpinski.xml.h:11
 #: hacks/config/slip.xml.h:11
@@ -1505,13 +1511,14 @@ msgstr ""
 #: hacks/config/menger.xml.h:15 hacks/config/mirrorblob.xml.h:18
 #: hacks/config/moebius.xml.h:6 hacks/config/molecule.xml.h:21
 #: hacks/config/morph3d.xml.h:5 hacks/config/noof.xml.h:4
 #: hacks/config/menger.xml.h:15 hacks/config/mirrorblob.xml.h:18
 #: hacks/config/moebius.xml.h:6 hacks/config/molecule.xml.h:21
 #: hacks/config/morph3d.xml.h:5 hacks/config/noof.xml.h:4
-#: hacks/config/pipes.xml.h:14 hacks/config/polyhedra.xml.h:118
-#: hacks/config/polytopes.xml.h:18 hacks/config/providence.xml.h:4
-#: 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
+#: hacks/config/pinion.xml.h:12 hacks/config/pipes.xml.h:14
+#: hacks/config/polyhedra.xml.h:118 hacks/config/polytopes.xml.h:18
+#: hacks/config/providence.xml.h:4 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 ""
 
 msgid "Show Frames-per-Second"
 msgstr ""
 
@@ -1670,11 +1677,12 @@ msgstr ""
 #: hacks/config/lament.xml.h:9 hacks/config/lavalite.xml.h:32
 #: hacks/config/menger.xml.h:21 hacks/config/mirrorblob.xml.h:24
 #: hacks/config/moebius.xml.h:11 hacks/config/molecule.xml.h:26
 #: hacks/config/lament.xml.h:9 hacks/config/lavalite.xml.h:32
 #: hacks/config/menger.xml.h:21 hacks/config/mirrorblob.xml.h:24
 #: hacks/config/moebius.xml.h:11 hacks/config/molecule.xml.h:26
-#: hacks/config/polyhedra.xml.h:173 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
+#: hacks/config/pinion.xml.h:15 hacks/config/polyhedra.xml.h:173
+#: 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 ""
 
 msgid "Wireframe"
 msgstr ""
 
@@ -1762,14 +1770,15 @@ msgstr ""
 #: 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/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/mismunch.xml.h:3
-#: 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 hacks/config/spheremonics.xml.h:7
+#: hacks/config/flow.xml.h:6 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/mismunch.xml.h:3 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
+#: hacks/config/spheremonics.xml.h:7 hacks/config/substrate.xml.h:6
 #: hacks/config/wander.xml.h:10 hacks/config/whirlwindwarp.xml.h:3
 msgid "Long"
 msgstr "Pikk"
 #: hacks/config/wander.xml.h:10 hacks/config/whirlwindwarp.xml.h:3
 msgid "Long"
 msgstr "Pikk"
@@ -1816,13 +1825,14 @@ msgstr ""
 #: 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/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/metaballs.xml.h:12 hacks/config/mismunch.xml.h:8
-#: 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/flow.xml.h:9 hacks/config/galaxy.xml.h:9
+#: hacks/config/klein.xml.h:5 hacks/config/laser.xml.h:9
+#: hacks/config/menger.xml.h:14 hacks/config/metaballs.xml.h:12
+#: hacks/config/mismunch.xml.h:8 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/substrate.xml.h:9
 #: hacks/config/wander.xml.h:12 hacks/config/whirlwindwarp.xml.h:6
 msgid "Short"
 msgstr "Lühike"
 #: hacks/config/wander.xml.h:12 hacks/config/whirlwindwarp.xml.h:6
 msgid "Short"
 msgstr "Lühike"
@@ -2021,10 +2031,10 @@ msgstr ""
 #: 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/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/polyhedra.xml.h:3 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/wormhole.xml.h:1
-#: hacks/config/xfishtank.xml.h:1
+#: hacks/config/pinion.xml.h:3 hacks/config/polyhedra.xml.h:3
+#: 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/wormhole.xml.h:1 hacks/config/xfishtank.xml.h:1
 msgid "Animation Speed"
 msgstr "Animatsiooni kiirus"
 
 msgid "Animation Speed"
 msgstr "Animatsiooni kiirus"
 
@@ -2101,8 +2111,9 @@ msgstr ""
 #: 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/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/starfish.xml.h:2 hacks/config/substrate.xml.h:1
+#: hacks/config/vidwhacker.xml.h:3 hacks/config/wander.xml.h:7
+#: hacks/config/xspirograph.xml.h:3
 msgid "Duration"
 msgstr "Kestus"
 
 msgid "Duration"
 msgstr "Kestus"
 
@@ -2349,7 +2360,7 @@ msgstr ""
 msgid "Rotate"
 msgstr ""
 
 msgid "Rotate"
 msgstr ""
 
-#: hacks/config/circuit.xml.h:8
+#: hacks/config/circuit.xml.h:8 hacks/config/pinion.xml.h:10
 msgid "Rotation Speed"
 msgstr ""
 
 msgid "Rotation Speed"
 msgstr ""
 
@@ -2433,11 +2444,12 @@ msgstr ""
 msgid "Coral"
 msgstr ""
 
 msgid "Coral"
 msgstr ""
 
-#: hacks/config/coral.xml.h:4 hacks/config/gflux.xml.h:3
-#: hacks/config/glblur.xml.h:2 hacks/config/glmatrix.xml.h:3
-#: 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
+#: hacks/config/coral.xml.h:4 hacks/config/fireworkx.xml.h:2
+#: hacks/config/gflux.xml.h:3 hacks/config/glblur.xml.h:2
+#: hacks/config/glmatrix.xml.h:3 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
 msgid "Dense"
 msgstr ""
 
 msgid "Dense"
 msgstr ""
 
@@ -2450,12 +2462,12 @@ msgid ""
 "Simulates coral growth, albeit somewhat slowly. Written by Frederick Roeber."
 msgstr ""
 
 "Simulates coral growth, albeit somewhat slowly. Written by Frederick Roeber."
 msgstr ""
 
-#: hacks/config/coral.xml.h:13 hacks/config/gflux.xml.h:13
-#: hacks/config/glblur.xml.h:16 hacks/config/glmatrix.xml.h:19
-#: hacks/config/imsmap.xml.h:13 hacks/config/lavalite.xml.h:29
-#: hacks/config/pyro.xml.h:14 hacks/config/qix.xml.h:21
-#: hacks/config/squiral.xml.h:15 hacks/config/xearth.xml.h:24
-#: hacks/config/xmatrix.xml.h:17
+#: hacks/config/coral.xml.h:13 hacks/config/fireworkx.xml.h:10
+#: hacks/config/gflux.xml.h:13 hacks/config/glblur.xml.h:16
+#: hacks/config/glmatrix.xml.h:19 hacks/config/imsmap.xml.h:13
+#: hacks/config/lavalite.xml.h:29 hacks/config/pyro.xml.h:14
+#: hacks/config/qix.xml.h:21 hacks/config/squiral.xml.h:15
+#: hacks/config/xearth.xml.h:24 hacks/config/xmatrix.xml.h:17
 msgid "Sparse"
 msgstr ""
 
 msgid "Sparse"
 msgstr ""
 
@@ -2484,7 +2496,7 @@ msgid "Center on Screen"
 msgstr ""
 
 #: hacks/config/crystal.xml.h:2 hacks/config/deluxe.xml.h:1
 msgstr ""
 
 #: hacks/config/crystal.xml.h:2 hacks/config/deluxe.xml.h:1
-#: hacks/config/fadeplot.xml.h:1 hacks/config/flow.xml.h:3
+#: hacks/config/fadeplot.xml.h:1 hacks/config/flow.xml.h:1
 #: hacks/config/galaxy.xml.h:1 hacks/config/glforestfire.xml.h:1
 #: hacks/config/grav.xml.h:1 hacks/config/julia.xml.h:1
 #: hacks/config/laser.xml.h:1 hacks/config/lisa.xml.h:1
 #: hacks/config/galaxy.xml.h:1 hacks/config/glforestfire.xml.h:1
 #: hacks/config/grav.xml.h:1 hacks/config/julia.xml.h:1
 #: hacks/config/laser.xml.h:1 hacks/config/lisa.xml.h:1
@@ -3232,7 +3244,7 @@ msgstr ""
 msgid "Half"
 msgstr ""
 
 msgid "Half"
 msgstr ""
 
-#: hacks/config/fireflies.xml.h:17
+#: hacks/config/fireflies.xml.h:17 hacks/config/pinion.xml.h:7
 msgid "Huge"
 msgstr ""
 
 msgid "Huge"
 msgstr ""
 
@@ -3321,7 +3333,7 @@ msgstr ""
 msgid "Swarm tails glow"
 msgstr ""
 
 msgid "Swarm tails glow"
 msgstr ""
 
-#: hacks/config/fireflies.xml.h:43
+#: hacks/config/fireflies.xml.h:43 hacks/config/pinion.xml.h:14
 msgid "Tiny"
 msgstr ""
 
 msgid "Tiny"
 msgstr ""
 
@@ -3337,6 +3349,32 @@ msgstr ""
 msgid "Wind picks up"
 msgstr ""
 
 msgid "Wind picks up"
 msgstr ""
 
+#: hacks/config/fireworkx.xml.h:1 hacks/config/lavalite.xml.h:3
+msgid "Activity"
+msgstr ""
+
+#: hacks/config/fireworkx.xml.h:4
+msgid "Fast Fade (more realistic)"
+msgstr ""
+
+#: hacks/config/fireworkx.xml.h:5
+#, fuzzy
+msgid "Fireworkx"
+msgstr "_Fail"
+
+#: hacks/config/fireworkx.xml.h:6
+msgid "Light effect"
+msgstr ""
+
+#: hacks/config/fireworkx.xml.h:7
+msgid "Pyrotechnics simulation eye-candy. Written by Rony B. Chandran."
+msgstr ""
+
+#: hacks/config/fireworkx.xml.h:8
+#, fuzzy
+msgid "Shoot"
+msgstr "Lühike"
+
 #: hacks/config/flag.xml.h:1
 msgid "Bitmap for Flag"
 msgstr ""
 #: hacks/config/flag.xml.h:1
 msgid "Bitmap for Flag"
 msgstr ""
@@ -3410,42 +3448,42 @@ msgid ""
 "around and deforms it in various ways. Written by Ben Buxton."
 msgstr ""
 
 "around and deforms it in various ways. Written by Ben Buxton."
 msgstr ""
 
-#: hacks/config/flow.xml.h:1
-msgid "Allow 2D Attractors"
+#: hacks/config/flow.xml.h:3
+msgid "Flow"
 msgstr ""
 
 msgstr ""
 
-#: hacks/config/flow.xml.h:2
-msgid ""
-"Another series of strange attractors: a flowing series of points, making "
-"strange rotational shapes. Written by Tim Auckland."
+#: hacks/config/flow.xml.h:5
+msgid "Length of trails"
 msgstr ""
 
 msgstr ""
 
-#: hacks/config/flow.xml.h:5
-msgid "Flow"
+#: hacks/config/flow.xml.h:13
+msgid ""
+"Strange attractors formed of flows in a 3D differential equation phase "
+"space. Written by Tim Auckland."
 msgstr ""
 
 msgstr ""
 
-#: hacks/config/flow.xml.h:6
-msgid "Freeze Some Bees"
+#: hacks/config/flow.xml.h:16
+msgid "turn on/off bounding box."
 msgstr ""
 
 msgstr ""
 
-#: hacks/config/flow.xml.h:10
-msgid "Ride a Trained Bee"
+#: hacks/config/flow.xml.h:17
+msgid "turn on/off double buffering."
 msgstr ""
 
 msgstr ""
 
-#: hacks/config/flow.xml.h:11
-msgid "Rotate Around Attractor"
+#: hacks/config/flow.xml.h:18
+msgid "turn on/off periodic attractors."
 msgstr ""
 
 msgstr ""
 
-#: hacks/config/flow.xml.h:12
-msgid "Show Bounding Box"
+#: hacks/config/flow.xml.h:19
+msgid "turn on/off ride in the flow."
 msgstr ""
 
 msgstr ""
 
-#: hacks/config/flow.xml.h:14
-msgid "Slow Bees with Antifreeze"
+#: hacks/config/flow.xml.h:20
+msgid "turn on/off rotating around attractor."
 msgstr ""
 
 msgstr ""
 
-#: hacks/config/flow.xml.h:19
-msgid "Zoom In and Out"
+#: hacks/config/flow.xml.h:21
+msgid "turn on/off search for new attractors."
 msgstr ""
 
 #: hacks/config/fluidballs.xml.h:1
 msgstr ""
 
 #: hacks/config/fluidballs.xml.h:1
@@ -3654,7 +3692,11 @@ msgstr ""
 msgid "Galaxy"
 msgstr ""
 
 msgid "Galaxy"
 msgstr ""
 
-#: hacks/config/galaxy.xml.h:9 hacks/config/lisa.xml.h:7
+#: hacks/config/galaxy.xml.h:8
+msgid "Rotate Viewpoint"
+msgstr ""
+
+#: hacks/config/galaxy.xml.h:10 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/pong.xml.h:3
 #: hacks/config/rotor.xml.h:10 hacks/config/rubik.xml.h:8
 #: hacks/config/lissie.xml.h:8 hacks/config/loop.xml.h:6
 #: hacks/config/penrose.xml.h:10 hacks/config/pong.xml.h:3
 #: hacks/config/rotor.xml.h:10 hacks/config/rubik.xml.h:8
@@ -3663,7 +3705,7 @@ msgstr ""
 msgid "Size"
 msgstr "Suurus"
 
 msgid "Size"
 msgstr "Suurus"
 
-#: hacks/config/galaxy.xml.h:12
+#: hacks/config/galaxy.xml.h:13
 msgid ""
 "This draws spinning galaxies, which then collide and scatter their stars to "
 "the, uh, four winds or something. Originally an Amiga program by Uli "
 msgid ""
 "This draws spinning galaxies, which then collide and scatter their stars to "
 "the, uh, four winds or something. Originally an Amiga program by Uli "
@@ -3965,9 +4007,9 @@ msgid ""
 "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 "
 "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."
+"of this window: the tab at the top of the *other* window.) 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
 msgstr ""
 
 #: hacks/config/glslideshow.xml.h:17
@@ -4492,6 +4534,27 @@ msgstr ""
 msgid "Wave Size"
 msgstr ""
 
 msgid "Wave Size"
 msgstr ""
 
+#: hacks/config/intermomentary.xml.h:2
+msgid "Intermomentary"
+msgstr ""
+
+#: hacks/config/intermomentary.xml.h:3
+#, fuzzy
+msgid "Number of Discs"
+msgstr "Puude arv"
+
+#: hacks/config/intermomentary.xml.h:6
+msgid ""
+"The Intersection Momentary is a fun visualization defining the relationships "
+"between objects with Casey Reas, William Ngan, and Robert Hodgin. "
+"Commissioned for display at the Whitney Museum of American Art. A surface "
+"filled with 100 medium to small sized circles. Each circle has a different "
+"size and direction, but moves at the same slow rate. Display: A. The "
+"instantaneous intersections of the circles. B. The aggregate intersections "
+"of the circles. Ported to XScreensaver from the art project \"InterMomentary"
+"\" at http://www.complexification.net"
+msgstr ""
+
 #: hacks/config/jigglypuff.xml.h:2
 msgid "Chrome"
 msgstr ""
 #: hacks/config/jigglypuff.xml.h:2
 msgid "Chrome"
 msgstr ""
@@ -4711,10 +4774,6 @@ msgstr ""
 msgid "10"
 msgstr ""
 
 msgid "10"
 msgstr ""
 
-#: hacks/config/lavalite.xml.h:3
-msgid "Activity"
-msgstr ""
-
 #: hacks/config/lavalite.xml.h:4
 msgid "Classic Lavalite"
 msgstr ""
 #: hacks/config/lavalite.xml.h:4
 msgid "Classic Lavalite"
 msgstr ""
@@ -5429,6 +5488,39 @@ msgid ""
 "invisibility at intersection points. Written by Geoffrey Irving."
 msgstr ""
 
 "invisibility at intersection points. Written by Geoffrey Irving."
 msgstr ""
 
+#: hacks/config/pinion.xml.h:1
+msgid "100"
+msgstr ""
+
+#: hacks/config/pinion.xml.h:2
+msgid "2000"
+msgstr ""
+
+#: hacks/config/pinion.xml.h:4
+msgid ""
+"Draws an interconnected set of gears moving across the screen. Written by "
+"Jamie Zawinski."
+msgstr ""
+
+#: hacks/config/pinion.xml.h:6
+#, fuzzy
+msgid "Gear Size"
+msgstr "Suurus"
+
+#: hacks/config/pinion.xml.h:8
+msgid "Max RPM"
+msgstr ""
+
+#: hacks/config/pinion.xml.h:9
+#, fuzzy
+msgid "Pinion"
+msgstr "Pikk"
+
+#: hacks/config/pinion.xml.h:11
+#, fuzzy
+msgid "Scrolling Speed"
+msgstr "Animatsiooni kiirus"
+
 #: hacks/config/pipes.xml.h:1
 msgid "Allow Tight Turns"
 msgstr ""
 #: hacks/config/pipes.xml.h:1
 msgid "Allow Tight Turns"
 msgstr ""
@@ -5455,7 +5547,8 @@ msgid ""
 "probably seen this GL hack. This version is by Marcelo Vianna."
 msgstr ""
 
 "probably seen this GL hack. This version is by Marcelo Vianna."
 msgstr ""
 
-#: hacks/config/pipes.xml.h:9 hacks/config/wormhole.xml.h:4
+#: hacks/config/pipes.xml.h:9 hacks/config/substrate.xml.h:7
+#: hacks/config/wormhole.xml.h:4
 msgid "Lots"
 msgstr ""
 
 msgid "Lots"
 msgstr ""
 
@@ -6662,22 +6755,26 @@ msgid "Ping subnet/30 (2 hosts)"
 msgstr ""
 
 #: hacks/config/sonar.xml.h:10
 msgstr ""
 
 #: hacks/config/sonar.xml.h:10
-msgid "Simulation Team Members"
+msgid "Resolve Host Names"
 msgstr ""
 
 #: hacks/config/sonar.xml.h:11
 msgstr ""
 
 #: hacks/config/sonar.xml.h:11
-msgid "Sonar"
+msgid "Simulation Team Members"
 msgstr ""
 
 #: hacks/config/sonar.xml.h:12
 msgstr ""
 
 #: hacks/config/sonar.xml.h:12
-msgid "Team A Name"
+msgid "Sonar"
 msgstr ""
 
 #: hacks/config/sonar.xml.h:13
 msgstr ""
 
 #: hacks/config/sonar.xml.h:13
-msgid "Team B Name"
+msgid "Team A Name"
 msgstr ""
 
 #: hacks/config/sonar.xml.h:14
 msgstr ""
 
 #: hacks/config/sonar.xml.h:14
+msgid "Team B Name"
+msgstr ""
+
+#: hacks/config/sonar.xml.h:15
 msgid ""
 "This program draws a simulation of a sonar screen. By default, it displays a "
 "random assortment of ``bogies'' on the screen, but if installed as \"setuid "
 msgid ""
 "This program draws a simulation of a sonar screen. By default, it displays a "
 "random assortment of ``bogies'' on the screen, but if installed as \"setuid "
@@ -6686,7 +6783,7 @@ msgid ""
 "Martin and Jamie Zawinski."
 msgstr ""
 
 "Martin and Jamie Zawinski."
 msgstr ""
 
-#: hacks/config/sonar.xml.h:15
+#: hacks/config/sonar.xml.h:16
 msgid "vs."
 msgstr ""
 
 msgid "vs."
 msgstr ""
 
@@ -6959,6 +7056,30 @@ msgid ""
 "Written by Massimino Pascal."
 msgstr ""
 
 "Written by Massimino Pascal."
 msgstr ""
 
+#: hacks/config/substrate.xml.h:4
+#, fuzzy
+msgid "Initial Cracks"
+msgstr "Installi värvikaart"
+
+#: hacks/config/substrate.xml.h:5
+msgid ""
+"Lines like crystals grow on a computational substrate. A simple "
+"perpendicular growth rule creates intricate city-like structures. By J. "
+"Tarbell and Mike Kershaw."
+msgstr ""
+
+#: hacks/config/substrate.xml.h:8
+msgid "Sandgrains"
+msgstr ""
+
+#: hacks/config/substrate.xml.h:12
+msgid "Substrate"
+msgstr ""
+
+#: hacks/config/substrate.xml.h:13
+msgid "Wireframe only"
+msgstr ""
+
 #: hacks/config/superquadrics.xml.h:3
 msgid ""
 "Ed Mackey reports that he wrote the first version of this program in BASIC "
 #: hacks/config/superquadrics.xml.h:3
 msgid ""
 "Ed Mackey reports that he wrote the first version of this program in BASIC "
index 4a1277e5192ce52b1cb119cc3e43508b42a95d22..c0c3af0945142978fe37284a5119bd76fb2d9370 100644 (file)
--- a/po/fi.po
+++ b/po/fi.po
@@ -6,7 +6,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: xscreensaver\n"
 "Report-Msgid-Bugs-To: \n"
 msgstr ""
 "Project-Id-Version: xscreensaver\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2004-03-03 14:11+0100\n"
+"POT-Creation-Date: 2004-12-22 12:51+0100\n"
 "PO-Revision-Date: 2004-11-27 13:24+0200\n"
 "Last-Translator: Lauri Nurmi <lanurmi@iki.fi>\n"
 "Language-Team: Finnish <virheet@gnome-fi.org>\n"
 "PO-Revision-Date: 2004-11-27 13:24+0200\n"
 "Last-Translator: Lauri Nurmi <lanurmi@iki.fi>\n"
 "Language-Team: Finnish <virheet@gnome-fi.org>\n"
@@ -14,11 +14,11 @@ msgstr ""
 "Content-Type: text/plain; charset=utf-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 
 "Content-Type: text/plain; charset=utf-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 
-#: driver/demo-Gtk-conf.c:732
+#: driver/demo-Gtk-conf.c:818
 msgid "Browse..."
 msgstr "Selaa..."
 
 msgid "Browse..."
 msgstr "Selaa..."
 
-#: driver/demo-Gtk-conf.c:1024
+#: driver/demo-Gtk-conf.c:1110
 msgid "Select file."
 msgstr "Valitse tiedosto."
 
 msgid "Select file."
 msgstr "Valitse tiedosto."
 
@@ -27,8 +27,7 @@ msgstr "Valitse tiedosto."
 msgid "Couldn't find pixmap file: %s"
 msgstr ""
 
 msgid "Couldn't find pixmap file: %s"
 msgstr ""
 
-#: driver/demo-Gtk-support.c:147
-#: driver/demo-Gtk-support.c:179
+#: driver/demo-Gtk-support.c:147 driver/demo-Gtk-support.c:179
 #, c-format
 msgid "Error loading pixmap file: %s"
 msgstr ""
 #, c-format
 msgid "Error loading pixmap file: %s"
 msgstr ""
@@ -38,596 +37,526 @@ msgstr ""
 msgid "reason: %s\n"
 msgstr "syy: %s\n"
 
 msgid "reason: %s\n"
 msgstr "syy: %s\n"
 
-#: driver/demo-Gtk-widgets.c:161
-#: driver/xscreensaver-demo.glade.h:89
+#: driver/demo-Gtk-widgets.c:161 driver/xscreensaver-demo.glade.h:89
 #: driver/xscreensaver-demo.glade2.h:65
 msgid "XScreenSaver"
 msgstr "XScreenSaver"
 
 #: driver/xscreensaver-demo.glade2.h:65
 msgid "XScreenSaver"
 msgstr "XScreenSaver"
 
-#: driver/demo-Gtk-widgets.c:182
-#: driver/xscreensaver-demo.glade2.h:76
+#: driver/demo-Gtk-widgets.c:182 driver/xscreensaver-demo.glade2.h:76
 msgid "_File"
 msgstr "_Tiedosto"
 
 msgid "_File"
 msgstr "_Tiedosto"
 
-#: driver/demo-Gtk-widgets.c:202
-#: driver/xscreensaver-demo.glade.h:93
+#: driver/demo-Gtk-widgets.c:202 driver/xscreensaver-demo.glade.h:93
 #: driver/xscreensaver-demo.glade2.h:70
 msgid "_Blank Screen Now"
 msgstr ""
 
 #: driver/xscreensaver-demo.glade2.h:70
 msgid "_Blank Screen Now"
 msgstr ""
 
-#: driver/demo-Gtk-widgets.c:211
-#: driver/xscreensaver-demo.glade.h:2
-msgid "Activate the XScreenSaver daemon now (locking the screen if so configured.)"
+#: 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 ""
 
 msgstr ""
 
-#: driver/demo-Gtk-widgets.c:215
-#: driver/xscreensaver-demo.glade.h:97
+#: driver/demo-Gtk-widgets.c:215 driver/xscreensaver-demo.glade.h:97
 #: driver/xscreensaver-demo.glade2.h:80
 msgid "_Lock Screen Now"
 msgstr "_Lukitse näyttö nyt"
 
 #: driver/xscreensaver-demo.glade2.h:80
 msgid "_Lock Screen Now"
 msgstr "_Lukitse näyttö nyt"
 
-#: driver/demo-Gtk-widgets.c:224
-#: 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 ""
 
 msgid "Lock the screen now (even if \"Lock Screen\" is unchecked.)"
 msgstr ""
 
-#: driver/demo-Gtk-widgets.c:228
-#: driver/xscreensaver-demo.glade.h:96
+#: driver/demo-Gtk-widgets.c:228 driver/xscreensaver-demo.glade.h:96
 #: driver/xscreensaver-demo.glade2.h:78
 msgid "_Kill Daemon"
 msgstr ""
 
 #: driver/xscreensaver-demo.glade2.h:78
 msgid "_Kill Daemon"
 msgstr ""
 
-#: driver/demo-Gtk-widgets.c:237
-#: 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 ""
 
 msgid "Tell the running XScreenSaver daemon to exit."
 msgstr ""
 
-#: driver/demo-Gtk-widgets.c:241
-#: driver/xscreensaver-demo.glade.h:98
+#: driver/demo-Gtk-widgets.c:241 driver/xscreensaver-demo.glade.h:98
 #: driver/xscreensaver-demo.glade2.h:86
 msgid "_Restart Daemon"
 msgstr ""
 
 #: driver/xscreensaver-demo.glade2.h:86
 msgid "_Restart Daemon"
 msgstr ""
 
-#: driver/demo-Gtk-widgets.c:250
-#: 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 ""
 
 msgid "Kill and re-launch the XScreenSaver daemon."
 msgstr ""
 
-#: driver/demo-Gtk-widgets.c:263
-#: driver/xscreensaver-demo.glade.h:95
+#: driver/demo-Gtk-widgets.c:263 driver/xscreensaver-demo.glade.h:95
 msgid "_Exit"
 msgstr "_Sulje"
 
 msgid "_Exit"
 msgstr "_Sulje"
 
-#: 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.)"
+#: 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.)"
 msgstr ""
 
 msgstr ""
 
-#: driver/demo-Gtk-widgets.c:276
-#: driver/xscreensaver-demo.glade2.h:77
+#: driver/demo-Gtk-widgets.c:276 driver/xscreensaver-demo.glade2.h:77
 msgid "_Help"
 msgstr "O_hje"
 
 msgid "_Help"
 msgstr "O_hje"
 
-#: driver/demo-Gtk-widgets.c:296
-#: driver/xscreensaver-demo.glade.h:92
+#: driver/demo-Gtk-widgets.c:296 driver/xscreensaver-demo.glade.h:92
 #: driver/xscreensaver-demo.glade2.h:66
 msgid "_About..."
 msgstr "_Tietoja..."
 
 #: driver/xscreensaver-demo.glade2.h:66
 msgid "_About..."
 msgstr "_Tietoja..."
 
-#: driver/demo-Gtk-widgets.c:305
-#: driver/xscreensaver-demo.glade.h:30
+#: driver/demo-Gtk-widgets.c:305 driver/xscreensaver-demo.glade.h:30
 msgid "Display version information."
 msgstr "Näytä versiotiedot."
 
 msgid "Display version information."
 msgstr "Näytä versiotiedot."
 
-#: driver/demo-Gtk-widgets.c:309
-#: driver/xscreensaver-demo.glade.h:94
+#: driver/demo-Gtk-widgets.c:309 driver/xscreensaver-demo.glade.h:94
 #: driver/xscreensaver-demo.glade2.h:75
 msgid "_Documentation..."
 msgstr ""
 
 #: driver/xscreensaver-demo.glade2.h:75
 msgid "_Documentation..."
 msgstr ""
 
-#: driver/demo-Gtk-widgets.c:318
-#: 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 ""
 
 msgid "Go to the documentation on the XScreenSaver web page."
 msgstr ""
 
-#: driver/demo-Gtk-widgets.c:348
-#: driver/xscreensaver-demo.glade.h:18
+#: driver/demo-Gtk-widgets.c:348 driver/xscreensaver-demo.glade.h:18
 msgid "Cycle After"
 msgstr "Vaihda seuraavaan"
 
 msgid "Cycle After"
 msgstr "Vaihda seuraavaan"
 
-#: driver/demo-Gtk-widgets.c:370
-#: driver/xscreensaver-demo.glade.h:78
+#: 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 "Vaaditaanko näytönsäästäjästä poistumiseen salasana."
 
 #: driver/xscreensaver-demo.glade2.h:54
 msgid "Whether a password should be required to un-blank the screen."
 msgstr "Vaaditaanko näytönsäästäjästä poistumiseen salasana."
 
-#: driver/demo-Gtk-widgets.c:372
-#: driver/xscreensaver-demo.glade.h:50
+#: driver/demo-Gtk-widgets.c:372 driver/xscreensaver-demo.glade.h:50
 msgid "Lock Screen After"
 msgstr "Lukitse näyttö"
 
 msgid "Lock Screen After"
 msgstr "Lukitse näyttö"
 
-#: driver/demo-Gtk-widgets.c:380
-#: driver/xscreensaver-demo.glade.h:8
+#: driver/demo-Gtk-widgets.c:380 driver/xscreensaver-demo.glade.h:8
 msgid "Blank After"
 msgstr "Käynnistä"
 
 msgid "Blank After"
 msgstr "Käynnistä"
 
-#: 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/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 "Viive ennen näytön siirtymistä valmiustilaan."
 
 #: driver/xscreensaver-demo.glade.h:43
 msgid "How long before the monitor goes completely black."
 msgstr "Viive ennen näytön siirtymistä valmiustilaan."
 
-#: 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
+#: 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 " minuutin kuluttua"
 
 msgid "minutes"
 msgstr " minuutin kuluttua"
 
-#: driver/demo-Gtk-widgets.c:482
-#: driver/demo-Gtk.c:2837
+#: driver/demo-Gtk-widgets.c:482 driver/demo-Gtk.c:2852
 #: driver/xscreensaver-demo.glade.h:58
 msgid "Preview"
 msgstr "Esikatselu"
 
 #: driver/xscreensaver-demo.glade.h:58
 msgid "Preview"
 msgstr "Esikatselu"
 
-#: driver/demo-Gtk-widgets.c:490
-#: driver/xscreensaver-demo.glade.h:21
+#: driver/demo-Gtk-widgets.c:490 driver/xscreensaver-demo.glade.h:21
 #: driver/xscreensaver-demo.glade2.h:12
 #: driver/xscreensaver-demo.glade2.h:12
-msgid "Demo the selected screen saver in full-screen mode (click the mouse to return.)"
-msgstr "Esittele valittua näytönsäästäjää kokoruututilassa (paluu hiirtä napsauttamalla)."
+msgid ""
+"Demo the selected screen saver in full-screen mode (click the mouse to "
+"return.)"
+msgstr ""
+"Esittele valittua näytönsäästäjää kokoruututilassa (paluu hiirtä "
+"napsauttamalla)."
 
 
-#: driver/demo-Gtk-widgets.c:492
-#: driver/xscreensaver-demo.glade.h:65
+#: driver/demo-Gtk-widgets.c:492 driver/xscreensaver-demo.glade.h:65
 msgid "Settings..."
 msgstr "Asetukset..."
 
 msgid "Settings..."
 msgstr "Asetukset..."
 
-#: driver/demo-Gtk-widgets.c:500
-#: 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 "Valitun näytönsäästäjän selitys ja mukautettavat asetukset."
 
 #: driver/xscreensaver-demo.glade2.h:9
 msgid "Customization and explanation of the selected screen saver."
 msgstr "Valitun näytönsäästäjän selitys ja mukautettavat asetukset."
 
-#: driver/demo-Gtk-widgets.c:521
-#: driver/xscreensaver-demo.glade.h:52
+#: driver/demo-Gtk-widgets.c:521 driver/xscreensaver-demo.glade.h:52
 msgid "Mode:"
 msgstr "Tila:"
 
 msgid "Mode:"
 msgstr "Tila:"
 
-#: driver/demo-Gtk-widgets.c:539
-#: driver/xscreensaver-demo.glade.h:25
+#: driver/demo-Gtk-widgets.c:539 driver/xscreensaver-demo.glade.h:25
 #: driver/xscreensaver-demo.glade2.h:16
 msgid "Disable Screen Saver"
 msgstr "Näytönsäästäjä pois käytöstä"
 
 #: driver/xscreensaver-demo.glade2.h:16
 msgid "Disable Screen Saver"
 msgstr "Näytönsäästäjä pois käytöstä"
 
-#: driver/demo-Gtk-widgets.c:542
-#: 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 "Pelkkä tyhjä ruutu"
 
 #: driver/xscreensaver-demo.glade2.h:5
 msgid "Blank Screen Only"
 msgstr "Pelkkä tyhjä ruutu"
 
-#: driver/demo-Gtk-widgets.c:545
-#: driver/xscreensaver-demo.glade.h:56
+#: driver/demo-Gtk-widgets.c:545 driver/xscreensaver-demo.glade.h:56
 #: driver/xscreensaver-demo.glade2.h:42
 msgid "Only One Screen Saver"
 msgstr "Vain yksi näytönsäästäjä"
 
 #: driver/xscreensaver-demo.glade2.h:42
 msgid "Only One Screen Saver"
 msgstr "Vain yksi näytönsäästäjä"
 
-#: driver/demo-Gtk-widgets.c:548
-#: driver/xscreensaver-demo.glade.h:60
+#: driver/demo-Gtk-widgets.c:548 driver/xscreensaver-demo.glade.h:60
 #: driver/xscreensaver-demo.glade2.h:44
 msgid "Random Screen Saver"
 msgstr "Satunnainen näytönsäästäjä"
 
 #: driver/xscreensaver-demo.glade2.h:44
 msgid "Random Screen Saver"
 msgstr "Satunnainen näytönsäästäjä"
 
-#: driver/demo-Gtk-widgets.c:571
-#: driver/demo-Gtk.c:2126
+#: driver/demo-Gtk-widgets.c:571 driver/demo-Gtk.c:2141
 #: driver/xscreensaver-demo.glade.h:75
 msgid "Use"
 msgstr ""
 
 #: driver/xscreensaver-demo.glade.h:75
 msgid "Use"
 msgstr ""
 
-#: driver/demo-Gtk-widgets.c:591
-#: driver/demo-Gtk.c:2136
+#: driver/demo-Gtk-widgets.c:591 driver/demo-Gtk.c:2151
 #: driver/xscreensaver-demo.glade.h:63
 msgid "Screen Saver"
 msgstr "Näytönsäästäjä"
 
 #: driver/xscreensaver-demo.glade.h:63
 msgid "Screen Saver"
 msgstr "Näytönsäästäjä"
 
-#: driver/demo-Gtk-widgets.c:644
-#: driver/xscreensaver-demo.glade.h:91
+#: driver/demo-Gtk-widgets.c:644 driver/xscreensaver-demo.glade.h:91
 msgid "\\/"
 msgstr ""
 
 msgid "\\/"
 msgstr ""
 
-#: driver/demo-Gtk-widgets.c:652
-#: driver/xscreensaver-demo.glade.h:61
+#: driver/demo-Gtk-widgets.c:652 driver/xscreensaver-demo.glade.h:61
 #: driver/xscreensaver-demo.glade2.h:45
 #: driver/xscreensaver-demo.glade2.h:45
-msgid "Run the next screen saver in the list in full-screen mode (click the mouse to return.)"
+msgid ""
+"Run the next screen saver in the list in full-screen mode (click the mouse "
+"to return.)"
 msgstr ""
 
 #: driver/demo-Gtk-widgets.c:654
 msgid "/\\"
 msgstr ""
 
 msgstr ""
 
 #: driver/demo-Gtk-widgets.c:654
 msgid "/\\"
 msgstr ""
 
-#: driver/demo-Gtk-widgets.c:662
-#: driver/xscreensaver-demo.glade.h:62
+#: driver/demo-Gtk-widgets.c:662 driver/xscreensaver-demo.glade.h:62
 #: driver/xscreensaver-demo.glade2.h:46
 #: driver/xscreensaver-demo.glade2.h:46
-msgid "Run the previous screen saver in the list in full-screen mode (click the mouse to return.)"
+msgid ""
+"Run the previous screen saver in the list in full-screen mode (click the "
+"mouse to return.)"
 msgstr ""
 
 msgstr ""
 
-#: driver/demo-Gtk-widgets.c:664
-#: driver/demo-Gtk-widgets.c:1607
-#: driver/xscreensaver-demo.glade.h:22
-#: driver/xscreensaver-demo.glade2.h:13
+#: 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 "Kuvaus"
 
 msgid "Description"
 msgstr "Kuvaus"
 
-#: driver/demo-Gtk-widgets.c:691
-#: driver/xscreensaver-demo.glade.h:26
+#: driver/demo-Gtk-widgets.c:691 driver/xscreensaver-demo.glade.h:26
 msgid "Display Modes"
 msgstr "Näytönsäästäjät"
 
 msgid "Display Modes"
 msgstr "Näytönsäästäjät"
 
-#: driver/demo-Gtk-widgets.c:707
-#: driver/xscreensaver-demo.glade.h:23
+#: driver/demo-Gtk-widgets.c:707 driver/xscreensaver-demo.glade.h:23
 #: driver/xscreensaver-demo.glade2.h:14
 msgid "Diagnostics"
 msgstr "Vianetsintä"
 
 #: driver/xscreensaver-demo.glade2.h:14
 msgid "Diagnostics"
 msgstr "Vianetsintä"
 
-#: driver/demo-Gtk-widgets.c:751
-#: 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 "Näyttääkö palvelin paljon vianetsintätulosteita."
 
 #: driver/xscreensaver-demo.glade2.h:56
 msgid "Whether the daemon should print lots of debugging information."
 msgstr "Näyttääkö palvelin paljon vianetsintätulosteita."
 
-#: driver/demo-Gtk-widgets.c:753
-#: driver/xscreensaver-demo.glade.h:76
+#: driver/demo-Gtk-widgets.c:753 driver/xscreensaver-demo.glade.h:76
 msgid "Verbose Diagnostics"
 msgstr "Monisanainen vianetsintä"
 
 msgid "Verbose Diagnostics"
 msgstr "Monisanainen vianetsintä"
 
-#: driver/demo-Gtk-widgets.c:768
-#: driver/xscreensaver-demo.glade.h:79
+#: driver/demo-Gtk-widgets.c:768 driver/xscreensaver-demo.glade.h:79
 #: driver/xscreensaver-demo.glade2.h:55
 #: driver/xscreensaver-demo.glade2.h:55
-msgid "Whether any error output of the display modes should be redirected to the screen."
+msgid ""
+"Whether any error output of the display modes should be redirected to the "
+"screen."
 msgstr "Näytetäänkö näytönsäästäjien mahdolliset virhetulosteet näytöllä."
 
 msgstr "Näytetäänkö näytönsäästäjien mahdolliset virhetulosteet näytöllä."
 
-#: driver/demo-Gtk-widgets.c:770
-#: driver/xscreensaver-demo.glade.h:29
+#: driver/demo-Gtk-widgets.c:770 driver/xscreensaver-demo.glade.h:29
 msgid "Display Subprocess Errors"
 msgstr "Näytä aliprosessien virheilmoitukset"
 
 msgid "Display Subprocess Errors"
 msgstr "Näytä aliprosessien virheilmoitukset"
 
-#: driver/demo-Gtk-widgets.c:785
-#: driver/xscreensaver-demo.glade.h:87
+#: driver/demo-Gtk-widgets.c:785 driver/xscreensaver-demo.glade.h:87
 #: driver/xscreensaver-demo.glade2.h:63
 #: 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 "Näytetäänkö palvelinta käynnistäessä aloitusruutu (joka sisältää versionumeron ja \"Ohje\"-painikkeen)."
+msgid ""
+"Whether the splash screen (with the version number and `Help' button) should "
+"be momentarily displayed when the daemon first starts up."
+msgstr ""
+"Näytetäänkö palvelinta käynnistäessä aloitusruutu (joka sisältää "
+"versionumeron ja \"Ohje\"-painikkeen)."
 
 
-#: driver/demo-Gtk-widgets.c:787
-#: 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 "Näytä aloitusruutu käynnistettäessä"
 
 msgid "Display Splash Screen at Startup"
 msgstr "Näytä aloitusruutu käynnistettäessä"
 
-#: driver/demo-Gtk-widgets.c:796
-#: 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 "Värikartat"
 
 #: driver/xscreensaver-demo.glade2.h:8
 msgid "Colormaps"
 msgstr "Värikartat"
 
-#: driver/demo-Gtk-widgets.c:840
-#: driver/xscreensaver-demo.glade.h:88
+#: driver/demo-Gtk-widgets.c:840 driver/xscreensaver-demo.glade.h:88
 #: driver/xscreensaver-demo.glade2.h:64
 #: driver/xscreensaver-demo.glade2.h:64
-msgid "Whether to install a private colormap when running in 8-bit mode on the default Visual."
-msgstr "Käytetäänkö omaa värikarttaa toimittaessa 8-bittisessä väritilassa oletusnäytöllä."
+msgid ""
+"Whether to install a private colormap when running in 8-bit mode on the "
+"default Visual."
+msgstr ""
+"Käytetäänkö omaa värikarttaa toimittaessa 8-bittisessä väritilassa "
+"oletusnäytöllä."
 
 
-#: driver/demo-Gtk-widgets.c:842
-#: driver/xscreensaver-demo.glade.h:48
+#: driver/demo-Gtk-widgets.c:842 driver/xscreensaver-demo.glade.h:48
 msgid "Install Colormap"
 msgstr "Käytä värikarttaa"
 
 msgid "Install Colormap"
 msgstr "Käytä värikarttaa"
 
-#: driver/demo-Gtk-widgets.c:865
-#: driver/xscreensaver-demo.glade.h:86
+#: driver/demo-Gtk-widgets.c:865 driver/xscreensaver-demo.glade.h:86
 #: driver/xscreensaver-demo.glade2.h:62
 #: driver/xscreensaver-demo.glade2.h:62
-msgid "Whether the screen should slowly fade to black when the screen saver activates."
-msgstr "Himmennetäänkö näyttö vähitellen mustaksi näytönsäästäjän käynnistyessä."
+msgid ""
+"Whether the screen should slowly fade to black when the screen saver "
+"activates."
+msgstr ""
+"Himmennetäänkö näyttö vähitellen mustaksi näytönsäästäjän käynnistyessä."
 
 
-#: driver/demo-Gtk-widgets.c:867
-#: 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 "Himmennä mustaksi säästäjän käynnistyessä"
 
 msgid "Fade To Black When Blanking"
 msgstr "Himmennä mustaksi säästäjän käynnistyessä"
 
-#: driver/demo-Gtk-widgets.c:882
-#: driver/xscreensaver-demo.glade.h:85
+#: driver/demo-Gtk-widgets.c:882 driver/xscreensaver-demo.glade.h:85
 #: driver/xscreensaver-demo.glade2.h:61
 #: driver/xscreensaver-demo.glade2.h:61
-msgid "Whether the screen should slowly fade in from black when the screen saver deactivates."
+msgid ""
+"Whether the screen should slowly fade in from black when the screen saver "
+"deactivates."
 msgstr "Kirkastuuko näyttö hitaasti mustasta näytönsäästäjän poistuessa."
 
 msgstr "Kirkastuuko näyttö hitaasti mustasta näytönsäästäjän poistuessa."
 
-#: driver/demo-Gtk-widgets.c:884
-#: 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 "Kirkasta kuva mustasta poistuttaessa säästäjästä"
 
 msgid "Fade From Black When Unblanking"
 msgstr "Kirkasta kuva mustasta poistuttaessa säästäjästä"
 
-#: driver/demo-Gtk-widgets.c:910
-#: driver/xscreensaver-demo.glade.h:34
+#: driver/demo-Gtk-widgets.c:910 driver/xscreensaver-demo.glade.h:34
 msgid "Fade Duration"
 msgstr "Himmennyksen/kirkastuksen kesto"
 
 msgid "Fade Duration"
 msgstr "Himmennyksen/kirkastuksen kesto"
 
-#: driver/demo-Gtk-widgets.c:928
-#: 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 "Kauanko näytön himmeneminen/kirkastuminen kestää."
 
 #: driver/xscreensaver-demo.glade2.h:31
 msgid "How long it should take for the screen to fade in and out."
 msgstr "Kauanko näytön himmeneminen/kirkastuminen kestää."
 
-#: driver/demo-Gtk-widgets.c:932
-#: driver/xscreensaver-demo.glade.h:100
+#: driver/demo-Gtk-widgets.c:932 driver/xscreensaver-demo.glade.h:100
 #: driver/xscreensaver-demo.glade2.h:96
 msgid "seconds"
 msgstr " sekuntia"
 
 #: driver/xscreensaver-demo.glade2.h:96
 msgid "seconds"
 msgstr " sekuntia"
 
-#: driver/demo-Gtk-widgets.c:942
-#: driver/xscreensaver-demo.glade.h:27
+#: driver/demo-Gtk-widgets.c:942 driver/xscreensaver-demo.glade.h:27
 #: driver/xscreensaver-demo.glade2.h:17
 msgid "Display Power Management"
 msgstr "Näytön virransäästö"
 
 #: driver/xscreensaver-demo.glade2.h:17
 msgid "Display Power Management"
 msgstr "Näytön virransäästö"
 
-#: driver/demo-Gtk-widgets.c:986
-#: 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 "Sammutetaanko näyttö hetken kuluttua."
 
 #: driver/xscreensaver-demo.glade2.h:60
 msgid "Whether the monitor should be powered down after a while."
 msgstr "Sammutetaanko näyttö hetken kuluttua."
 
-#: driver/demo-Gtk-widgets.c:988
-#: driver/xscreensaver-demo.glade.h:57
+#: driver/demo-Gtk-widgets.c:988 driver/xscreensaver-demo.glade.h:57
 msgid "Power Management Enabled"
 msgstr "Virransäästö käytössä"
 
 msgid "Power Management Enabled"
 msgstr "Virransäästö käytössä"
 
-#: driver/demo-Gtk-widgets.c:1056
-#: driver/xscreensaver-demo.glade.h:55
+#: driver/demo-Gtk-widgets.c:1056 driver/xscreensaver-demo.glade.h:55
 msgid "Off After"
 msgstr "Virrankatkaisu"
 
 msgid "Off After"
 msgstr "Virrankatkaisu"
 
-#: driver/demo-Gtk-widgets.c:1069
-#: driver/xscreensaver-demo.glade.h:70
+#: driver/demo-Gtk-widgets.c:1069 driver/xscreensaver-demo.glade.h:70
 msgid "Suspend After"
 msgstr "Virransäästö"
 
 msgid "Suspend After"
 msgstr "Virransäästö"
 
-#: driver/demo-Gtk-widgets.c:1082
-#: driver/xscreensaver-demo.glade.h:68
+#: driver/demo-Gtk-widgets.c:1082 driver/xscreensaver-demo.glade.h:68
 msgid "Standby After"
 msgstr "Valmiustila "
 
 msgid "Standby After"
 msgstr "Valmiustila "
 
-#: driver/demo-Gtk-widgets.c:1105
-#: 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 "Viive ennen näytön siirtymistä virransäästötilaan."
 
 #: driver/xscreensaver-demo.glade2.h:33
 msgid "How long until the monitor goes into power-saving mode."
 msgstr "Viive ennen näytön siirtymistä virransäästötilaan."
 
-#: driver/demo-Gtk-widgets.c:1119
-#: 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 "Viive ennen näytön virrankatkaisua."
 
 #: driver/xscreensaver-demo.glade2.h:34
 msgid "How long until the monitor powers down."
 msgstr "Viive ennen näytön virrankatkaisua."
 
-#: driver/demo-Gtk-widgets.c:1123
-#: driver/xscreensaver-demo.glade.h:47
+#: driver/demo-Gtk-widgets.c:1123 driver/xscreensaver-demo.glade.h:47
 #: driver/xscreensaver-demo.glade2.h:35
 msgid "Image Manipulation"
 msgstr "Kuvanmuuntelu"
 
 #: driver/xscreensaver-demo.glade2.h:35
 msgid "Image Manipulation"
 msgstr "Kuvanmuuntelu"
 
-#: driver/demo-Gtk-widgets.c:1167
-#: driver/xscreensaver-demo.glade.h:81
+#: driver/demo-Gtk-widgets.c:1167 driver/xscreensaver-demo.glade.h:81
 #: driver/xscreensaver-demo.glade2.h:57
 #: driver/xscreensaver-demo.glade2.h:57
-msgid "Whether the image-manipulating modes should be allowed to operate on an image of your desktop."
-msgstr "Sallitaanko kuvaa muuntelevien näytönsäästäjien käyttää työpöydän kuvaa."
+msgid ""
+"Whether the image-manipulating modes should be allowed to operate on an "
+"image of your desktop."
+msgstr ""
+"Sallitaanko kuvaa muuntelevien näytönsäästäjien käyttää työpöydän kuvaa."
 
 
-#: driver/demo-Gtk-widgets.c:1169
-#: driver/xscreensaver-demo.glade.h:39
+#: driver/demo-Gtk-widgets.c:1169 driver/xscreensaver-demo.glade.h:39
 msgid "Grab Desktop Images"
 msgstr "Kaappaa työpöydän kuva"
 
 msgid "Grab Desktop Images"
 msgstr "Kaappaa työpöydän kuva"
 
-#: 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)."
-msgstr "Käyttävätkö kuvaa muuntelevat näytönsäästäjät järjestelmän (mahdollisesta) videosisääntulosta kaapattuja kuvia."
+#: 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)."
+msgstr ""
+"Käyttävätkö kuvaa muuntelevat näytönsäästäjät järjestelmän (mahdollisesta) "
+"videosisääntulosta kaapattuja kuvia."
 
 
-#: driver/demo-Gtk-widgets.c:1186
-#: driver/xscreensaver-demo.glade.h:40
+#: driver/demo-Gtk-widgets.c:1186 driver/xscreensaver-demo.glade.h:40
 msgid "Grab Video Frames"
 msgstr "Kaappaa videokuvia"
 
 msgid "Grab Video Frames"
 msgstr "Kaappaa videokuvia"
 
-#: driver/demo-Gtk-widgets.c:1201
-#: driver/xscreensaver-demo.glade.h:83
+#: driver/demo-Gtk-widgets.c:1201 driver/xscreensaver-demo.glade.h:83
 #: driver/xscreensaver-demo.glade2.h:59
 #: driver/xscreensaver-demo.glade2.h:59
-msgid "Whether the image-manipulating modes should operate on random images loaded from disk."
-msgstr "Käyttävätkö kuvaa muuntelevat näytönsäästäjät satunnaisia levyltä ladattuja kuvia."
+msgid ""
+"Whether the image-manipulating modes should operate on random images loaded "
+"from disk."
+msgstr ""
+"Käyttävätkö kuvaa muuntelevat näytönsäästäjät satunnaisia levyltä ladattuja "
+"kuvia."
 
 
-#: driver/demo-Gtk-widgets.c:1203
-#: driver/xscreensaver-demo.glade.h:12
+#: driver/demo-Gtk-widgets.c:1203 driver/xscreensaver-demo.glade.h:12
 msgid "Choose Random Image:"
 msgstr "Valitse satunnaiset kuvat:"
 
 msgid "Choose Random Image:"
 msgstr "Valitse satunnaiset kuvat:"
 
-#: driver/demo-Gtk-widgets.c:1236
-#: 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 "Hakemisto, josta kuvat valitaan satunnaisesti."
 
 #: driver/xscreensaver-demo.glade2.h:52
 msgid "The directory from which images will be randomly chosen."
 msgstr "Hakemisto, josta kuvat valitaan satunnaisesti."
 
-#: driver/demo-Gtk-widgets.c:1238
-#: driver/xscreensaver-demo.glade.h:10
+#: driver/demo-Gtk-widgets.c:1238 driver/xscreensaver-demo.glade.h:10
 msgid "Browse"
 msgstr "Selaa"
 
 msgid "Browse"
 msgstr "Selaa"
 
-#: driver/demo-Gtk-widgets.c:1246
-#: driver/demo-Gtk-widgets.c:1599
-#: driver/xscreensaver-demo.glade.h:3
-#: driver/xscreensaver-demo.glade2.h:2
+#: 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 "Lisäasetukset"
 
 msgid "Advanced"
 msgstr "Lisäasetukset"
 
-#: driver/demo-Gtk-widgets.c:1444
-#: driver/xscreensaver-demo.glade.h:90
+#: driver/demo-Gtk-widgets.c:1444 driver/xscreensaver-demo.glade.h:90
 msgid "XScreenSaver: Mode-Specific Settings"
 msgstr ""
 
 msgid "XScreenSaver: Mode-Specific Settings"
 msgstr ""
 
-#: driver/demo-Gtk-widgets.c:1466
-#: driver/xscreensaver-demo.glade.h:64
+#: driver/demo-Gtk-widgets.c:1466 driver/xscreensaver-demo.glade.h:64
 #: driver/xscreensaver-demo.glade2.h:47
 msgid "Settings"
 msgstr "Asetukset"
 
 #: driver/xscreensaver-demo.glade2.h:47
 msgid "Settings"
 msgstr "Asetukset"
 
-#: driver/demo-Gtk-widgets.c:1495
-#: driver/xscreensaver-demo.glade.h:66
+#: driver/demo-Gtk-widgets.c:1495 driver/xscreensaver-demo.glade.h:66
 #: driver/xscreensaver-demo.glade2.h:49
 msgid "Standard"
 msgstr ""
 
 #: driver/xscreensaver-demo.glade2.h:49
 msgid "Standard"
 msgstr ""
 
-#: driver/demo-Gtk-widgets.c:1532
-#: driver/xscreensaver-demo.glade.h:77
+#: driver/demo-Gtk-widgets.c:1532 driver/xscreensaver-demo.glade.h:77
 msgid "Visual:"
 msgstr ""
 
 msgid "Visual:"
 msgstr ""
 
-#: driver/demo-Gtk-widgets.c:1550
-#: driver/demo-Gtk-widgets.c:1573
-#: driver/demo-Gtk.c:1533
-#: driver/demo-Gtk.c:2856
-#: driver/xscreensaver-demo.glade.h:5
-#: driver/xscreensaver-demo.glade2.h:3
+#: driver/demo-Gtk-widgets.c:1550 driver/demo-Gtk-widgets.c:1573
+#: driver/demo-Gtk.c:1545 driver/demo-Gtk.c:2871
+#: driver/xscreensaver-demo.glade.h:5 driver/xscreensaver-demo.glade2.h:3
 msgid "Any"
 msgstr ""
 
 msgid "Any"
 msgstr ""
 
-#: driver/demo-Gtk-widgets.c:1551
-#: 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 ""
 
 #: driver/xscreensaver-demo.glade2.h:4
 msgid "Best"
 msgstr ""
 
-#: driver/demo-Gtk-widgets.c:1552
-#: driver/xscreensaver-demo.glade.h:19
+#: driver/demo-Gtk-widgets.c:1552 driver/xscreensaver-demo.glade.h:19
 #: driver/xscreensaver-demo.glade2.h:10
 msgid "Default"
 msgstr ""
 
 #: driver/xscreensaver-demo.glade2.h:10
 msgid "Default"
 msgstr ""
 
-#: driver/demo-Gtk-widgets.c:1553
-#: driver/xscreensaver-demo.glade.h:20
+#: driver/demo-Gtk-widgets.c:1553 driver/xscreensaver-demo.glade.h:20
 #: driver/xscreensaver-demo.glade2.h:11
 msgid "Default-N"
 msgstr ""
 
 #: driver/xscreensaver-demo.glade2.h:11
 msgid "Default-N"
 msgstr ""
 
-#: driver/demo-Gtk-widgets.c:1554
-#: driver/xscreensaver-demo.glade.h:37
+#: driver/demo-Gtk-widgets.c:1554 driver/xscreensaver-demo.glade.h:37
 #: driver/xscreensaver-demo.glade2.h:23
 msgid "GL"
 msgstr ""
 
 #: driver/xscreensaver-demo.glade2.h:23
 msgid "GL"
 msgstr ""
 
-#: driver/demo-Gtk-widgets.c:1555
-#: driver/xscreensaver-demo.glade.h:74
+#: driver/demo-Gtk-widgets.c:1555 driver/xscreensaver-demo.glade.h:74
 #: driver/xscreensaver-demo.glade2.h:53
 msgid "TrueColor"
 msgstr ""
 
 #: driver/xscreensaver-demo.glade2.h:53
 msgid "TrueColor"
 msgstr ""
 
-#: driver/demo-Gtk-widgets.c:1556
-#: driver/xscreensaver-demo.glade.h:59
+#: driver/demo-Gtk-widgets.c:1556 driver/xscreensaver-demo.glade.h:59
 #: driver/xscreensaver-demo.glade2.h:43
 msgid "PseudoColor"
 msgstr ""
 
 #: driver/xscreensaver-demo.glade2.h:43
 msgid "PseudoColor"
 msgstr ""
 
-#: driver/demo-Gtk-widgets.c:1557
-#: driver/xscreensaver-demo.glade.h:69
+#: driver/demo-Gtk-widgets.c:1557 driver/xscreensaver-demo.glade.h:69
 #: driver/xscreensaver-demo.glade2.h:50
 msgid "StaticGray"
 msgstr ""
 
 #: driver/xscreensaver-demo.glade2.h:50
 msgid "StaticGray"
 msgstr ""
 
-#: driver/demo-Gtk-widgets.c:1558
-#: driver/xscreensaver-demo.glade.h:42
+#: driver/demo-Gtk-widgets.c:1558 driver/xscreensaver-demo.glade.h:42
 #: driver/xscreensaver-demo.glade2.h:27
 msgid "GrayScale"
 msgstr ""
 
 #: driver/xscreensaver-demo.glade2.h:27
 msgid "GrayScale"
 msgstr ""
 
-#: driver/demo-Gtk-widgets.c:1559
-#: driver/xscreensaver-demo.glade.h:24
+#: driver/demo-Gtk-widgets.c:1559 driver/xscreensaver-demo.glade.h:24
 #: driver/xscreensaver-demo.glade2.h:15
 msgid "DirectColor"
 msgstr ""
 
 #: driver/xscreensaver-demo.glade2.h:15
 msgid "DirectColor"
 msgstr ""
 
-#: driver/demo-Gtk-widgets.c:1560
-#: driver/xscreensaver-demo.glade.h:14
-#: driver/xscreensaver-demo.glade2.h:7
+#: driver/demo-Gtk-widgets.c:1560 driver/xscreensaver-demo.glade.h:14
+#: driver/xscreensaver-demo.glade2.h:7 hacks/config/fuzzyflakes.xml.h:3
 msgid "Color"
 msgstr ""
 
 msgid "Color"
 msgstr ""
 
-#: driver/demo-Gtk-widgets.c:1561
-#: driver/xscreensaver-demo.glade.h:41
+#: driver/demo-Gtk-widgets.c:1561 driver/xscreensaver-demo.glade.h:41
 #: driver/xscreensaver-demo.glade2.h:26
 msgid "Gray"
 msgstr ""
 
 #: driver/xscreensaver-demo.glade2.h:26
 msgid "Gray"
 msgstr ""
 
-#: driver/demo-Gtk-widgets.c:1562
-#: driver/xscreensaver-demo.glade.h:53
+#: driver/demo-Gtk-widgets.c:1562 driver/xscreensaver-demo.glade.h:53
 #: driver/xscreensaver-demo.glade2.h:37
 msgid "Mono"
 msgstr ""
 
 #: driver/xscreensaver-demo.glade2.h:37
 msgid "Mono"
 msgstr ""
 
-#: 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."
+#: 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."
 msgstr ""
 
 msgstr ""
 
-#: driver/demo-Gtk-widgets.c:1575
-#: driver/xscreensaver-demo.glade.h:16
+#: driver/demo-Gtk-widgets.c:1575 driver/xscreensaver-demo.glade.h:16
 msgid "Command Line:"
 msgstr ""
 
 msgid "Command Line:"
 msgstr ""
 
-#: driver/demo-Gtk-widgets.c:1647
-#: driver/xscreensaver-demo.glade.h:31
+#: driver/demo-Gtk-widgets.c:1647 driver/xscreensaver-demo.glade.h:31
 msgid "Documentation..."
 msgstr ""
 
 msgid "Documentation..."
 msgstr ""
 
-#: driver/demo-Gtk-widgets.c:1655
-#: 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 ""
 
 msgid "Click here to read the manual for this display mode, if it has one."
 msgstr ""
 
-#: driver/demo-Gtk-widgets.c:1680
-#: driver/xscreensaver-demo.glade.h:4
+#: driver/demo-Gtk-widgets.c:1680 driver/xscreensaver-demo.glade.h:4
 msgid "Advanced >>"
 msgstr "Lisäasetukset >>"
 
 msgid "Advanced >>"
 msgstr "Lisäasetukset >>"
 
-#: driver/demo-Gtk-widgets.c:1688
-#: 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 ""
 
 msgid "Edit the command line directly."
 msgstr ""
 
-#: driver/demo-Gtk-widgets.c:1690
-#: driver/xscreensaver-demo.glade.h:67
+#: driver/demo-Gtk-widgets.c:1690 driver/xscreensaver-demo.glade.h:67
 msgid "Standard <<"
 msgstr "Perusasetukset <<"
 
 msgid "Standard <<"
 msgstr "Perusasetukset <<"
 
-#: driver/demo-Gtk-widgets.c:1698
-#: 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 ""
 
 msgid "Back to the graphical configuration options."
 msgstr ""
 
-#: driver/demo-Gtk-widgets.c:1709
-#: driver/demo-Gtk.c:736
+#: driver/demo-Gtk-widgets.c:1709 driver/demo-Gtk.c:748
 #: driver/xscreensaver-demo.glade.h:54
 msgid "OK"
 msgstr "OK"
 
 #: driver/xscreensaver-demo.glade.h:54
 msgid "OK"
 msgstr "OK"
 
-#: driver/demo-Gtk-widgets.c:1718
-#: driver/xscreensaver-demo.glade.h:11
+#: driver/demo-Gtk-widgets.c:1718 driver/xscreensaver-demo.glade.h:11
 msgid "Cancel"
 msgstr "Peru"
 
 msgid "Cancel"
 msgstr "Peru"
 
-#: driver/demo-Gtk.c:644
+#: driver/demo-Gtk.c:656
 msgid "For updates, check http://www.jwz.org/xscreensaver/"
 msgstr ""
 
 msgid "For updates, check http://www.jwz.org/xscreensaver/"
 msgstr ""
 
-#: driver/demo-Gtk.c:774
+#: driver/demo-Gtk.c:786
 msgid ""
 "Error:\n"
 "\n"
 "No Help URL has been specified.\n"
 msgstr ""
 
 msgid ""
 "Error:\n"
 "\n"
 "No Help URL has been specified.\n"
 msgstr ""
 
-#: driver/demo-Gtk.c:860
+#: driver/demo-Gtk.c:872
 msgid ""
 "Error:\n"
 "\n"
 msgid ""
 "Error:\n"
 "\n"
@@ -635,7 +564,7 @@ msgid ""
 "\n"
 msgstr ""
 
 "\n"
 msgstr ""
 
-#: driver/demo-Gtk.c:872
+#: driver/demo-Gtk.c:884
 msgid ""
 "You are running as root.  This usually means that xscreensaver\n"
 "was unable to contact your X server because access control is\n"
 msgid ""
 "You are running as root.  This usually means that xscreensaver\n"
 "was unable to contact your X server because access control is\n"
@@ -654,18 +583,18 @@ msgid ""
 "normal user, and `su' as necessary."
 msgstr ""
 
 "normal user, and `su' as necessary."
 msgstr ""
 
-#: driver/demo-Gtk.c:888
+#: driver/demo-Gtk.c:900
 msgid "Please check your $PATH and permissions."
 msgstr ""
 
 msgid "Please check your $PATH and permissions."
 msgstr ""
 
-#: driver/demo-Gtk.c:923
+#: driver/demo-Gtk.c:935
 msgid ""
 "Error:\n"
 "\n"
 "Couldn't determine init file name!\n"
 msgstr ""
 
 msgid ""
 "Error:\n"
 "\n"
 "Couldn't determine init file name!\n"
 msgstr ""
 
-#: driver/demo-Gtk.c:928
+#: driver/demo-Gtk.c:940
 #, c-format
 msgid ""
 "Error:\n"
 #, c-format
 msgid ""
 "Error:\n"
@@ -673,14 +602,14 @@ msgid ""
 "Couldn't write %s\n"
 msgstr ""
 
 "Couldn't write %s\n"
 msgstr ""
 
-#: driver/demo-Gtk.c:987
+#: driver/demo-Gtk.c:999
 msgid ""
 "Error:\n"
 "\n"
 "no `manualCommand' resource set."
 msgstr ""
 
 msgid ""
 "Error:\n"
 "\n"
 "no `manualCommand' resource set."
 msgstr ""
 
-#: driver/demo-Gtk.c:1168
+#: driver/demo-Gtk.c:1180
 #, c-format
 msgid ""
 "Error:\n"
 #, c-format
 msgid ""
 "Error:\n"
@@ -688,7 +617,7 @@ msgid ""
 "Unparsable time format: \"%s\"\n"
 msgstr ""
 
 "Unparsable time format: \"%s\"\n"
 msgstr ""
 
-#: driver/demo-Gtk.c:1824
+#: driver/demo-Gtk.c:1836
 #, c-format
 msgid ""
 "Error:\n"
 #, c-format
 msgid ""
 "Error:\n"
@@ -696,28 +625,28 @@ msgid ""
 "Directory does not exist: \"%s\"\n"
 msgstr ""
 
 "Directory does not exist: \"%s\"\n"
 msgstr ""
 
-#: driver/demo-Gtk.c:2538
+#: driver/demo-Gtk.c:2553
 msgid "Descriptions not available: no XML support compiled in."
 msgstr ""
 
 msgid "Descriptions not available: no XML support compiled in."
 msgstr ""
 
-#: driver/demo-Gtk.c:2543
+#: driver/demo-Gtk.c:2558
 msgid "No description available."
 msgstr "Kuvausta ei ole saatavilla."
 
 msgid "No description available."
 msgstr "Kuvausta ei ole saatavilla."
 
-#: driver/demo-Gtk.c:2808
+#: driver/demo-Gtk.c:2823
 msgid "Blank Screen"
 msgstr "Tyhjä ruutu"
 
 msgid "Blank Screen"
 msgstr "Tyhjä ruutu"
 
-#: driver/demo-Gtk.c:2814
+#: driver/demo-Gtk.c:2829
 msgid "Screen Saver Disabled"
 msgstr "Näytönsäästäjä poissa käytöstä"
 
 msgid "Screen Saver Disabled"
 msgstr "Näytönsäästäjä poissa käytöstä"
 
-#: driver/demo-Gtk.c:2847
+#: driver/demo-Gtk.c:2862
 #, c-format
 msgid "%s: %.100s Settings"
 msgstr "%s: %.100s -asetukset"
 
 #, c-format
 msgid "%s: %.100s Settings"
 msgstr "%s: %.100s -asetukset"
 
-#: driver/demo-Gtk.c:3002
+#: driver/demo-Gtk.c:3017
 #, c-format
 msgid ""
 "Warning:\n"
 #, c-format
 msgid ""
 "Warning:\n"
@@ -725,23 +654,23 @@ msgid ""
 "file \"%s\" has changed, reloading.\n"
 msgstr ""
 
 "file \"%s\" has changed, reloading.\n"
 msgstr ""
 
-#: driver/demo-Gtk.c:3084
+#: driver/demo-Gtk.c:3099
 msgid "No Preview"
 msgstr ""
 
 msgid "No Preview"
 msgstr ""
 
-#: driver/demo-Gtk.c:3084
+#: driver/demo-Gtk.c:3099
 msgid "Available"
 msgstr ""
 
 msgid "Available"
 msgstr ""
 
-#: driver/demo-Gtk.c:3085
+#: driver/demo-Gtk.c:3100
 msgid "Not"
 msgstr ""
 
 msgid "Not"
 msgstr ""
 
-#: driver/demo-Gtk.c:3085
+#: driver/demo-Gtk.c:3100
 msgid "Installed"
 msgstr ""
 
 msgid "Installed"
 msgstr ""
 
-#: driver/demo-Gtk.c:3811
+#: driver/demo-Gtk.c:3865
 #, c-format
 msgid ""
 "Warning:\n"
 #, c-format
 msgid ""
 "Warning:\n"
@@ -754,7 +683,7 @@ msgstr ""
 "XScreenSaver-palvelin ei vaikuta olevan\n"
 "käynnissä näytöllä \"%s\". Käynnistetäänkö se nyt?"
 
 "XScreenSaver-palvelin ei vaikuta olevan\n"
 "käynnissä näytöllä \"%s\". Käynnistetäänkö se nyt?"
 
-#: driver/demo-Gtk.c:3821
+#: driver/demo-Gtk.c:3875
 #, c-format
 msgid ""
 "Warning:\n"
 #, c-format
 msgid ""
 "Warning:\n"
@@ -773,7 +702,7 @@ msgid ""
 "Restart the xscreensaver daemon now?\n"
 msgstr ""
 
 "Restart the xscreensaver daemon now?\n"
 msgstr ""
 
-#: driver/demo-Gtk.c:3846
+#: driver/demo-Gtk.c:3900
 #, c-format
 msgid ""
 "Warning:\n"
 #, c-format
 msgid ""
 "Warning:\n"
@@ -789,7 +718,7 @@ msgid ""
 "Restart the daemon on \"%s\" as \"%s\" now?\n"
 msgstr ""
 
 "Restart the daemon on \"%s\" as \"%s\" now?\n"
 msgstr ""
 
-#: driver/demo-Gtk.c:3868
+#: driver/demo-Gtk.c:3922
 #, c-format
 msgid ""
 "Warning:\n"
 #, c-format
 msgid ""
 "Warning:\n"
@@ -801,12 +730,12 @@ msgid ""
 "Restart the xscreensaver daemon now?\n"
 msgstr ""
 
 "Restart the xscreensaver daemon now?\n"
 msgstr ""
 
-#: driver/demo-Gtk.c:4325
+#: driver/demo-Gtk.c:4379
 #, c-format
 msgid "%s: unknown option: %s\n"
 msgstr "%s: tuntematon valitsin: %s\n"
 
 #, c-format
 msgid "%s: unknown option: %s\n"
 msgstr "%s: tuntematon valitsin: %s\n"
 
-#: driver/demo-Gtk.c:4389
+#: driver/demo-Gtk.c:4443
 msgid "Screensaver Preferences"
 msgstr "Näytönsäästäjän ominaisuudet"
 
 msgid "Screensaver Preferences"
 msgstr "Näytönsäästäjän ominaisuudet"
 
@@ -860,15 +789,21 @@ msgstr "Kaappaa vid_eokuvia"
 
 #: driver/xscreensaver-demo.glade2.h:28
 msgid "How long after the screen blanks until a password will be required."
 
 #: driver/xscreensaver-demo.glade2.h:28
 msgid "How long after the screen blanks until a password will be required."
-msgstr "Kuinka pian näytönsäästäjän käynnistymisen jälkeen vaaditaan salasanaa siitä poistumiseen."
+msgstr ""
+"Kuinka pian näytönsäästäjän käynnistymisen jälkeen vaaditaan salasanaa siitä "
+"poistumiseen."
 
 #: driver/xscreensaver-demo.glade2.h:29
 msgid "How long before the screensaver activates."
 msgstr "Näytönsäästäjän käynnistymisviive."
 
 #: driver/xscreensaver-demo.glade2.h:30
 
 #: driver/xscreensaver-demo.glade2.h:29
 msgid "How long before the screensaver activates."
 msgstr "Näytönsäästäjän käynnistymisviive."
 
 #: driver/xscreensaver-demo.glade2.h:30
-msgid "How long each display mode should run before choosing a new one (in Random mode.)"
-msgstr "Kauanko käytetään yhtä näytönsäästäjää ennen vaihtamista seuraavaan (satunnaisessa tilassa)."
+msgid ""
+"How long each display mode should run before choosing a new one (in Random "
+"mode.)"
+msgstr ""
+"Kauanko käytetään yhtä näytönsäästäjää ennen vaihtamista seuraavaan "
+"(satunnaisessa tilassa)."
 
 #: driver/xscreensaver-demo.glade2.h:32
 msgid "How long until the monitor goes completely black."
 
 #: driver/xscreensaver-demo.glade2.h:32
 msgid "How long until the monitor goes completely black."
@@ -903,8 +838,12 @@ msgid "Sus_pend After"
 msgstr "Virrans_äästö"
 
 #: driver/xscreensaver-demo.glade2.h:58
 msgstr "Virrans_äästö"
 
 #: 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 "Käyttävätkö kuvaa muuntelevat näytönsäästäjät järjestelmän (mahdollisesta) videosisääntulosta kaapattuja kuvia."
+msgid ""
+"Whether the image-manipulating modes should operate on images captured from "
+"the system's video input (if there is one.)"
+msgstr ""
+"Käyttävätkö kuvaa muuntelevat näytönsäästäjät järjestelmän (mahdollisesta) "
+"videosisääntulosta kaapattuja kuvia."
 
 #: driver/xscreensaver-demo.glade2.h:67
 msgid "_Advanced"
 
 #: driver/xscreensaver-demo.glade2.h:67
 msgid "_Advanced"
@@ -994,330 +933,185 @@ msgstr ""
 msgid "Anemone"
 msgstr ""
 
 msgid "Anemone"
 msgstr ""
 
-#: hacks/config/anemone.xml.h:2
+#: hacks/config/anemone.xml.h:2 hacks/config/fuzzyflakes.xml.h:1
 msgid "Arms"
 msgstr ""
 
 msgid "Arms"
 msgstr ""
 
-#: 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:5
-#: 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/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: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: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/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:6
-#: 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/metaballs.xml.h:4
-#: hacks/config/mirrorblob.xml.h:12
-#: hacks/config/mismunch.xml.h:2
-#: 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/noof.xml.h:2
-#: hacks/config/pacman.xml.h:1
-#: hacks/config/penetrate.xml.h:3
-#: hacks/config/penrose.xml.h:6
-#: hacks/config/petri.xml.h:5
-#: hacks/config/phosphor.xml.h:4
-#: 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:1
-#: 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
-#: hacks/config/rocks.xml.h:4
-#: hacks/config/rotor.xml.h:3
-#: hacks/config/rubik.xml.h:3
-#: hacks/config/sballs.xml.h:4
-#: hacks/config/shadebobs.xml.h:3
-#: hacks/config/sierpinski.xml.h:2
-#: hacks/config/sierpinski3d.xml.h:2
-#: hacks/config/slidescreen.xml.h:2
-#: hacks/config/slip.xml.h:2
-#: hacks/config/speedmine.xml.h:3
-#: hacks/config/sphere.xml.h:2
-#: hacks/config/spheremonics.xml.h:5
-#: 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: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
-#: hacks/config/webcollage.xml.h:4
-#: hacks/config/worm.xml.h:3
-#: hacks/config/wormhole.xml.h:2
-#: hacks/config/xearth.xml.h:7
-#: hacks/config/xfishtank.xml.h:3
-#: hacks/config/xflame.xml.h:4
-#: hacks/config/xjack.xml.h:1
-#: hacks/config/xmatrix.xml.h:5
-#: hacks/config/xmountains.xml.h:1
-#: hacks/config/xplanet.xml.h:8
-#: hacks/config/xrayswarm.xml.h:2
+#: hacks/config/anemone.xml.h:3 hacks/config/anemotaxis.xml.h:5
+#: hacks/config/ant.xml.h:6 hacks/config/antinspect.xml.h:4
+#: 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:5
+#: 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/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: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/fireworkx.xml.h:3
+#: 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:2 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/fuzzyflakes.xml.h:7
+#: hacks/config/galaxy.xml.h:3 hacks/config/gears.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:6 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/intermomentary.xml.h:1 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/memscroller.xml.h:5
+#: hacks/config/menger.xml.h:3 hacks/config/metaballs.xml.h:4
+#: hacks/config/mirrorblob.xml.h:12 hacks/config/mismunch.xml.h:2
+#: 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/noof.xml.h:2
+#: hacks/config/pacman.xml.h:1 hacks/config/penetrate.xml.h:3
+#: hacks/config/penrose.xml.h:6 hacks/config/petri.xml.h:5
+#: hacks/config/phosphor.xml.h:4 hacks/config/piecewise.xml.h:4
+#: hacks/config/pinion.xml.h:5 hacks/config/pipes.xml.h:5
+#: hacks/config/polyhedra.xml.h:18 hacks/config/polyominoes.xml.h:2
+#: hacks/config/polytopes.xml.h:11 hacks/config/pong.xml.h:1
+#: hacks/config/popsquares.xml.h:3 hacks/config/providence.xml.h:2
+#: 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
+#: hacks/config/rocks.xml.h:4 hacks/config/rotor.xml.h:3
+#: hacks/config/rubik.xml.h:3 hacks/config/sballs.xml.h:4
+#: hacks/config/shadebobs.xml.h:3 hacks/config/sierpinski.xml.h:2
+#: hacks/config/sierpinski3d.xml.h:2 hacks/config/slidescreen.xml.h:2
+#: hacks/config/slip.xml.h:2 hacks/config/speedmine.xml.h:3
+#: hacks/config/sphere.xml.h:2 hacks/config/spheremonics.xml.h:5
+#: 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:1
+#: hacks/config/substrate.xml.h:2 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 hacks/config/webcollage.xml.h:4
+#: hacks/config/worm.xml.h:3 hacks/config/wormhole.xml.h:2
+#: hacks/config/xearth.xml.h:7 hacks/config/xfishtank.xml.h:3
+#: hacks/config/xflame.xml.h:4 hacks/config/xjack.xml.h:1
+#: hacks/config/xmatrix.xml.h:5 hacks/config/xmountains.xml.h:13
+#: hacks/config/xplanet.xml.h:8 hacks/config/xrayswarm.xml.h:2
 #: hacks/config/zoom.xml.h:2
 msgid "Fast"
 msgstr ""
 
 #: hacks/config/zoom.xml.h:2
 msgid "Fast"
 msgstr ""
 
-#: 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/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/wormhole.xml.h:3
+#: hacks/config/anemone.xml.h:4 hacks/config/anemotaxis.xml.h:6
+#: 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/eruption.xml.h:6 hacks/config/euler2d.xml.h:4
+#: hacks/config/flame.xml.h:7 hacks/config/fluidballs.xml.h:6
+#: hacks/config/fuzzyflakes.xml.h:8 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/substrate.xml.h:3 hacks/config/thornbird.xml.h:3
+#: hacks/config/whirlwindwarp.xml.h:1 hacks/config/wormhole.xml.h:3
 #: hacks/config/xfishtank.xml.h:4
 msgid "Few"
 msgstr ""
 
 #: hacks/config/xfishtank.xml.h:4
 msgid "Few"
 msgstr ""
 
-#: 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
-#: hacks/config/critical.xml.h:4
-#: hacks/config/crystal.xml.h:8
-#: hacks/config/cubenetic.xml.h:13
-#: hacks/config/cynosure.xml.h:6
-#: hacks/config/deco.xml.h:5
-#: hacks/config/deluxe.xml.h:6
-#: hacks/config/demon.xml.h:6
-#: hacks/config/discrete.xml.h:4
-#: hacks/config/drift.xml.h:9
-#: hacks/config/epicycle.xml.h:8
-#: hacks/config/eruption.xml.h:12
-#: hacks/config/euler2d.xml.h:8
-#: hacks/config/fadeplot.xml.h:6
-#: hacks/config/flag.xml.h:5
-#: hacks/config/flame.xml.h:11
-#: hacks/config/flow.xml.h:8
-#: hacks/config/fluidballs.xml.h:13
-#: hacks/config/forest.xml.h:3
-#: 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: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
-#: hacks/config/metaballs.xml.h:6
-#: hacks/config/mismunch.xml.h:4
-#: hacks/config/moire.xml.h:5
-#: hacks/config/moire2.xml.h:3
-#: hacks/config/mountain.xml.h:4
-#: hacks/config/nerverot.xml.h:15
-#: hacks/config/pedal.xml.h:6
-#: hacks/config/penrose.xml.h:7
-#: hacks/config/petri.xml.h:11
-#: hacks/config/polyominoes.xml.h:5
-#: hacks/config/qix.xml.h:14
-#: hacks/config/rd-bomb.xml.h:12
-#: hacks/config/ripples.xml.h:7
-#: hacks/config/rocks.xml.h:5
-#: hacks/config/rotor.xml.h:6
-#: 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: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
-#: hacks/config/xearth.xml.h:12
+#: hacks/config/anemone.xml.h:5 hacks/config/anemotaxis.xml.h:7
+#: 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 hacks/config/critical.xml.h:4
+#: hacks/config/crystal.xml.h:8 hacks/config/cubenetic.xml.h:13
+#: hacks/config/cynosure.xml.h:6 hacks/config/deco.xml.h:5
+#: hacks/config/deluxe.xml.h:6 hacks/config/demon.xml.h:6
+#: hacks/config/discrete.xml.h:4 hacks/config/drift.xml.h:9
+#: hacks/config/epicycle.xml.h:8 hacks/config/eruption.xml.h:12
+#: hacks/config/euler2d.xml.h:8 hacks/config/fadeplot.xml.h:6
+#: hacks/config/flag.xml.h:5 hacks/config/flame.xml.h:11
+#: hacks/config/flow.xml.h:7 hacks/config/fluidballs.xml.h:13
+#: hacks/config/forest.xml.h:3 hacks/config/fuzzyflakes.xml.h:12
+#: 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: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
+#: hacks/config/metaballs.xml.h:6 hacks/config/mismunch.xml.h:4
+#: hacks/config/moire.xml.h:5 hacks/config/moire2.xml.h:3
+#: hacks/config/mountain.xml.h:4 hacks/config/nerverot.xml.h:15
+#: hacks/config/pedal.xml.h:6 hacks/config/penrose.xml.h:7
+#: hacks/config/petri.xml.h:11 hacks/config/polyominoes.xml.h:5
+#: hacks/config/qix.xml.h:14 hacks/config/rd-bomb.xml.h:12
+#: hacks/config/ripples.xml.h:7 hacks/config/rocks.xml.h:5
+#: hacks/config/rotor.xml.h:6 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: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 hacks/config/xearth.xml.h:12
 #: hacks/config/xfishtank.xml.h:8
 msgid "Many"
 msgstr ""
 
 #: hacks/config/xfishtank.xml.h:8
 msgid "Many"
 msgstr ""
 
-#: 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/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/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
+#: 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/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:8 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/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 ""
 
 msgid "Number of Colors"
 msgstr ""
 
-#: hacks/config/anemone.xml.h:7
-#: hacks/config/fireflies.xml.h:32
+#: hacks/config/anemone.xml.h:7 hacks/config/fireflies.xml.h:32
 #: hacks/config/pyro.xml.h:8
 msgid "Often"
 msgstr ""
 #: hacks/config/pyro.xml.h:8
 msgid "Often"
 msgstr ""
@@ -1326,299 +1120,162 @@ msgstr ""
 msgid "Rarely"
 msgstr ""
 
 msgid "Rarely"
 msgstr ""
 
-#: 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:7
-#: 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/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: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/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/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:10
-#: 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: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/metaballs.xml.h:13
-#: hacks/config/mirrorblob.xml.h:19
-#: hacks/config/mismunch.xml.h:10
-#: 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/noof.xml.h:5
-#: hacks/config/pacman.xml.h:5
-#: hacks/config/penetrate.xml.h:6
-#: hacks/config/penrose.xml.h:11
-#: hacks/config/petri.xml.h:23
-#: hacks/config/phosphor.xml.h:7
-#: 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:4
-#: 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
-#: hacks/config/rocks.xml.h:9
-#: hacks/config/rotor.xml.h:11
-#: hacks/config/rubik.xml.h:9
-#: hacks/config/sballs.xml.h:13
-#: hacks/config/shadebobs.xml.h:9
-#: hacks/config/sierpinski.xml.h:7
-#: hacks/config/sierpinski3d.xml.h:8
-#: hacks/config/slidescreen.xml.h:6
-#: hacks/config/slip.xml.h:7
-#: hacks/config/speedmine.xml.h:13
-#: hacks/config/sphere.xml.h:5
-#: hacks/config/spheremonics.xml.h:19
-#: 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: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/wormhole.xml.h:5
-#: 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:15
-#: hacks/config/xmountains.xml.h:4
-#: hacks/config/xplanet.xml.h:59
-#: hacks/config/xrayswarm.xml.h:3
-#: hacks/config/zoom.xml.h:6
+#: hacks/config/anemone.xml.h:9 hacks/config/anemotaxis.xml.h:10
+#: hacks/config/ant.xml.h:15 hacks/config/antinspect.xml.h:6
+#: 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:7
+#: 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:7 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/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: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/fireworkx.xml.h:9
+#: 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:10 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/fuzzyflakes.xml.h:15
+#: hacks/config/galaxy.xml.h:11 hacks/config/gears.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:8
+#: 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:10
+#: 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/intermomentary.xml.h:4 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: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/memscroller.xml.h:7
+#: hacks/config/menger.xml.h:16 hacks/config/metaballs.xml.h:13
+#: hacks/config/mirrorblob.xml.h:19 hacks/config/mismunch.xml.h:10
+#: 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/noof.xml.h:5
+#: hacks/config/pacman.xml.h:5 hacks/config/penetrate.xml.h:6
+#: hacks/config/penrose.xml.h:11 hacks/config/petri.xml.h:23
+#: hacks/config/phosphor.xml.h:7 hacks/config/piecewise.xml.h:9
+#: hacks/config/pinion.xml.h:13 hacks/config/pipes.xml.h:15
+#: hacks/config/polyhedra.xml.h:119 hacks/config/polyominoes.xml.h:10
+#: hacks/config/polytopes.xml.h:20 hacks/config/pong.xml.h:4
+#: hacks/config/popsquares.xml.h:5 hacks/config/providence.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
+#: hacks/config/rocks.xml.h:9 hacks/config/rotor.xml.h:11
+#: hacks/config/rubik.xml.h:9 hacks/config/sballs.xml.h:13
+#: hacks/config/shadebobs.xml.h:9 hacks/config/sierpinski.xml.h:7
+#: hacks/config/sierpinski3d.xml.h:8 hacks/config/slidescreen.xml.h:6
+#: hacks/config/slip.xml.h:7 hacks/config/speedmine.xml.h:13
+#: hacks/config/sphere.xml.h:5 hacks/config/spheremonics.xml.h:19
+#: 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:4
+#: hacks/config/substrate.xml.h:10 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/wormhole.xml.h:5
+#: 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:15 hacks/config/xplanet.xml.h:59
+#: hacks/config/xrayswarm.xml.h:3 hacks/config/zoom.xml.h:6
 msgid "Slow"
 msgstr ""
 
 msgid "Slow"
 msgstr ""
 
-#: 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:8
-#: 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
-#: hacks/config/dangerball.xml.h:6
-#: hacks/config/decayscreen.xml.h:18
-#: hacks/config/deluxe.xml.h:9
-#: hacks/config/demon.xml.h:10
-#: hacks/config/discrete.xml.h:9
-#: hacks/config/distort.xml.h:13
-#: hacks/config/drift.xml.h:13
-#: hacks/config/endgame.xml.h:6
-#: hacks/config/engine.xml.h:16
-#: hacks/config/epicycle.xml.h:11
-#: 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/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:11
-#: 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:21
-#: hacks/config/mismunch.xml.h:12
-#: 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/noof.xml.h:6
-#: hacks/config/pacman.xml.h:6
-#: hacks/config/penrose.xml.h:12
-#: hacks/config/petri.xml.h:25
-#: hacks/config/phosphor.xml.h:8
-#: hacks/config/piecewise.xml.h:11
-#: hacks/config/pipes.xml.h:16
-#: hacks/config/polyominoes.xml.h:11
-#: hacks/config/pong.xml.h:5
-#: 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/xplanet.xml.h:60
-#: hacks/config/xrayswarm.xml.h:4
-#: hacks/config/zoom.xml.h:7
+#: hacks/config/anemone.xml.h:10 hacks/config/anemotaxis.xml.h:12
+#: hacks/config/ant.xml.h:17 hacks/config/antinspect.xml.h:7
+#: 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:8 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
+#: hacks/config/dangerball.xml.h:6 hacks/config/decayscreen.xml.h:18
+#: hacks/config/deluxe.xml.h:9 hacks/config/demon.xml.h:10
+#: hacks/config/discrete.xml.h:9 hacks/config/distort.xml.h:13
+#: hacks/config/drift.xml.h:13 hacks/config/endgame.xml.h:6
+#: hacks/config/engine.xml.h:16 hacks/config/epicycle.xml.h:11
+#: 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/fireworkx.xml.h:11 hacks/config/flag.xml.h:9
+#: hacks/config/flame.xml.h:15 hacks/config/flipflop.xml.h:7
+#: hacks/config/flipscreen3d.xml.h:7 hacks/config/flow.xml.h:12
+#: hacks/config/fluidballs.xml.h:20 hacks/config/forest.xml.h:6
+#: hacks/config/fuzzyflakes.xml.h:17 hacks/config/galaxy.xml.h:12
+#: hacks/config/glblur.xml.h:17 hacks/config/glforestfire.xml.h:15
+#: hacks/config/glplanet.xml.h:10 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:11
+#: 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/intermomentary.xml.h:5 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/memscroller.xml.h:8
+#: hacks/config/menger.xml.h:18 hacks/config/metaballs.xml.h:15
+#: hacks/config/mirrorblob.xml.h:21 hacks/config/mismunch.xml.h:12
+#: 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/noof.xml.h:6
+#: hacks/config/pacman.xml.h:6 hacks/config/penrose.xml.h:12
+#: hacks/config/petri.xml.h:25 hacks/config/phosphor.xml.h:8
+#: hacks/config/piecewise.xml.h:11 hacks/config/pipes.xml.h:16
+#: hacks/config/polyominoes.xml.h:11 hacks/config/pong.xml.h:5
+#: hacks/config/popsquares.xml.h:6 hacks/config/providence.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/substrate.xml.h:11
+#: 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/xplanet.xml.h:60
+#: hacks/config/xrayswarm.xml.h:4 hacks/config/zoom.xml.h:7
 msgid "Speed"
 msgstr ""
 
 msgid "Speed"
 msgstr ""
 
@@ -1626,31 +1283,24 @@ msgstr ""
 msgid "Tentacles"
 msgstr ""
 
 msgid "Tentacles"
 msgstr ""
 
-#: 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/anemone.xml.h:12 hacks/config/cubestorm.xml.h:11
+#: hacks/config/deluxe.xml.h:10 hacks/config/fuzzyflakes.xml.h:18
+#: 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 ""
 
 #: hacks/config/thornbird.xml.h:9
 msgid "Thick"
 msgstr ""
 
-#: hacks/config/anemone.xml.h:13
-#: hacks/config/glknots.xml.h:20
-#: hacks/config/moire2.xml.h:8
+#: hacks/config/anemone.xml.h:13 hacks/config/fuzzyflakes.xml.h:19
+#: hacks/config/glknots.xml.h:20 hacks/config/moire2.xml.h:8
 #: hacks/config/thornbird.xml.h:10
 msgid "Thickness"
 msgstr ""
 
 #: hacks/config/thornbird.xml.h:10
 msgid "Thickness"
 msgstr ""
 
-#: 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/anemone.xml.h:14 hacks/config/cubestorm.xml.h:12
+#: hacks/config/deluxe.xml.h:11 hacks/config/fuzzyflakes.xml.h:20
+#: 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 ""
 #: hacks/config/thornbird.xml.h:11
 msgid "Thin"
 msgstr ""
@@ -1659,64 +1309,35 @@ msgstr ""
 msgid "Turn speed"
 msgstr ""
 
 msgid "Turn speed"
 msgstr ""
 
-#: 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
-#: hacks/config/cynosure.xml.h:11
-#: hacks/config/deco.xml.h:10
-#: hacks/config/deluxe.xml.h:14
-#: hacks/config/demon.xml.h:13
-#: hacks/config/discrete.xml.h:11
-#: hacks/config/drift.xml.h:14
-#: hacks/config/epicycle.xml.h:13
-#: hacks/config/euler2d.xml.h:17
-#: hacks/config/fadeplot.xml.h:12
-#: hacks/config/flag.xml.h:13
-#: hacks/config/flame.xml.h:16
-#: hacks/config/flow.xml.h:18
-#: hacks/config/forest.xml.h:8
-#: hacks/config/galaxy.xml.h:13
-#: hacks/config/grav.xml.h:11
-#: hacks/config/halo.xml.h:13
-#: hacks/config/hopalong.xml.h:25
-#: hacks/config/ifs.xml.h:8
-#: 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
-#: hacks/config/metaballs.xml.h:16
-#: hacks/config/moire.xml.h:11
-#: hacks/config/moire2.xml.h:9
-#: hacks/config/mountain.xml.h:9
-#: hacks/config/nerverot.xml.h:23
-#: hacks/config/penrose.xml.h:13
-#: hacks/config/polyominoes.xml.h:12
-#: hacks/config/rd-bomb.xml.h:20
-#: hacks/config/rocks.xml.h:12
-#: hacks/config/rotor.xml.h:13
-#: 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: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
+#: 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
+#: hacks/config/cynosure.xml.h:11 hacks/config/deco.xml.h:10
+#: hacks/config/deluxe.xml.h:14 hacks/config/demon.xml.h:13
+#: hacks/config/discrete.xml.h:11 hacks/config/drift.xml.h:14
+#: hacks/config/epicycle.xml.h:13 hacks/config/euler2d.xml.h:17
+#: hacks/config/fadeplot.xml.h:12 hacks/config/flag.xml.h:13
+#: hacks/config/flame.xml.h:16 hacks/config/flow.xml.h:15
+#: hacks/config/forest.xml.h:8 hacks/config/galaxy.xml.h:14
+#: hacks/config/grav.xml.h:11 hacks/config/halo.xml.h:13
+#: hacks/config/hopalong.xml.h:25 hacks/config/ifs.xml.h:8
+#: 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
+#: hacks/config/metaballs.xml.h:16 hacks/config/moire.xml.h:11
+#: hacks/config/moire2.xml.h:9 hacks/config/mountain.xml.h:9
+#: hacks/config/nerverot.xml.h:23 hacks/config/penrose.xml.h:13
+#: hacks/config/polyominoes.xml.h:12 hacks/config/rd-bomb.xml.h:20
+#: hacks/config/rocks.xml.h:12 hacks/config/rotor.xml.h:13
+#: 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: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
 #: hacks/config/xfishtank.xml.h:11
 msgid "Two"
 msgstr ""
 #: hacks/config/xfishtank.xml.h:11
 msgid "Two"
 msgstr ""
@@ -1729,8 +1350,46 @@ msgstr ""
 msgid "Withdraw freqency"
 msgstr ""
 
 msgid "Withdraw freqency"
 msgstr ""
 
+#: hacks/config/anemotaxis.xml.h:1
+msgid "Anemotaxis"
+msgstr ""
+
+#: hacks/config/anemotaxis.xml.h:2
+msgid ""
+"Anemotaxis demonstrates a search algorithm designed for locating a source of "
+"odor in turbulent atmosphere. The searcher is able to sense the odor and "
+"determine local instantaneous wind direction. The goal is to find the source "
+"in the shortest mean time. Written by Eugene Balkovsky."
+msgstr ""
+
+#: hacks/config/anemotaxis.xml.h:3
+msgid "Distance"
+msgstr ""
+
+#: hacks/config/anemotaxis.xml.h:4 hacks/config/hyperball.xml.h:1
+#: hacks/config/hypercube.xml.h:1
+msgid "Far"
+msgstr ""
+
+#: hacks/config/anemotaxis.xml.h:8 hacks/config/hyperball.xml.h:7
+#: hacks/config/hypercube.xml.h:6
+msgid "Near"
+msgstr ""
+
+#: hacks/config/anemotaxis.xml.h:9
+msgid "Searchers"
+msgstr ""
+
+#: hacks/config/anemotaxis.xml.h:11
+msgid "Sources"
+msgstr ""
+
 #: hacks/config/ant.xml.h:1
 #: hacks/config/ant.xml.h:1
-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 path. Then, as they pass over changed pixels, their behavior is influenced. Written by David Bagley."
+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 "
+"path. Then, as they pass over changed pixels, their behavior is influenced. "
+"Written by David Bagley."
 msgstr ""
 
 #: hacks/config/ant.xml.h:2
 msgstr ""
 
 #: hacks/config/ant.xml.h:2
@@ -1753,31 +1412,19 @@ msgstr ""
 msgid "Four Sided Cells"
 msgstr ""
 
 msgid "Four Sided Cells"
 msgstr ""
 
-#: 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
+#: 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:4
+#: hacks/config/fluidballs.xml.h:12 hacks/config/fuzzyflakes.xml.h:10
+#: 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 ""
 
 msgid "Large"
 msgstr ""
 
@@ -1789,8 +1436,7 @@ msgstr ""
 msgid "Random Cell Shape"
 msgstr ""
 
 msgid "Random Cell Shape"
 msgstr ""
 
-#: hacks/config/ant.xml.h:13
-#: hacks/config/speedmine.xml.h:11
+#: hacks/config/ant.xml.h:13 hacks/config/speedmine.xml.h:11
 msgid "Sharp Turns"
 msgstr ""
 
 msgid "Sharp Turns"
 msgstr ""
 
@@ -1798,31 +1444,19 @@ msgstr ""
 msgid "Six Sided Cells"
 msgstr ""
 
 msgid "Six Sided Cells"
 msgstr ""
 
-#: 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/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:11
+#: hacks/config/fluidballs.xml.h:19 hacks/config/fuzzyflakes.xml.h:16
+#: 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 ""
 #: hacks/config/slip.xml.h:8
 msgid "Small"
 msgstr ""
@@ -1831,16 +1465,11 @@ msgstr ""
 msgid "Three Sided Cells"
 msgstr ""
 
 msgid "Three Sided Cells"
 msgstr ""
 
-#: 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
-#: hacks/config/rubik.xml.h:12
-#: hacks/config/sierpinski.xml.h:11
+#: 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:14
+#: hacks/config/lissie.xml.h:12 hacks/config/loop.xml.h:11
+#: hacks/config/rubik.xml.h:12 hacks/config/sierpinski.xml.h:11
 #: hacks/config/slip.xml.h:11
 msgid "Timeout"
 msgstr ""
 #: hacks/config/slip.xml.h:11
 msgid "Timeout"
 msgstr ""
@@ -1853,68 +1482,60 @@ msgstr ""
 msgid "Twelve Sided Cells"
 msgstr ""
 
 msgid "Twelve Sided Cells"
 msgstr ""
 
+#: hacks/config/antinspect.xml.h:1
+msgid "AntInspect"
+msgstr ""
+
+#: hacks/config/antinspect.xml.h:2
+msgid "Draw Shadows"
+msgstr ""
+
+#: hacks/config/antinspect.xml.h:3
+msgid ""
+"Draws a trio of ants moving their spheres around a circle. Written by Blair "
+"Tennessy."
+msgstr ""
+
+#: hacks/config/antinspect.xml.h:5 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:6
+#: 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:7
+#: 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:18
+#: hacks/config/moebius.xml.h:6 hacks/config/molecule.xml.h:21
+#: hacks/config/morph3d.xml.h:5 hacks/config/noof.xml.h:4
+#: hacks/config/pinion.xml.h:12 hacks/config/pipes.xml.h:14
+#: hacks/config/polyhedra.xml.h:118 hacks/config/polytopes.xml.h:18
+#: hacks/config/providence.xml.h:4 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 ""
+
 #: hacks/config/antspotlight.xml.h:1
 msgid "AntSpotlight"
 msgstr ""
 
 #: hacks/config/antspotlight.xml.h:2
 #: hacks/config/antspotlight.xml.h:1
 msgid "AntSpotlight"
 msgstr ""
 
 #: 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:18
-#: hacks/config/moebius.xml.h:6
-#: hacks/config/molecule.xml.h:21
-#: hacks/config/morph3d.xml.h:5
-#: hacks/config/noof.xml.h:4
-#: 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"
+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/apollonian.xml.h:1
 msgstr ""
 
 #: hacks/config/apollonian.xml.h:1
@@ -1938,7 +1559,9 @@ msgid "Include Alternate Geometries"
 msgstr ""
 
 #: hacks/config/apollonian.xml.h:9
 msgstr ""
 
 #: hacks/config/apollonian.xml.h:9
-msgid "Packs a large circle with smaller circles, demonstrating the Descartes Circle Theorem. Written by Allan R. Wilks and David Bagley."
+msgid ""
+"Packs a large circle with smaller circles, demonstrating the Descartes "
+"Circle Theorem. Written by Allan R. Wilks and David Bagley."
 msgstr ""
 
 #: hacks/config/apollonian.xml.h:10
 msgstr ""
 
 #: hacks/config/apollonian.xml.h:10
@@ -1953,14 +1576,21 @@ msgstr ""
 msgid "Basic Programming Mode"
 msgstr ""
 
 msgid "Basic Programming Mode"
 msgstr ""
 
-#: hacks/config/apple2.xml.h:3
-#: hacks/config/halo.xml.h:8
+#: hacks/config/apple2.xml.h:3 hacks/config/halo.xml.h:8
 #: hacks/config/imsmap.xml.h:11
 msgid "Random Mode"
 msgstr ""
 
 #: hacks/config/apple2.xml.h:4
 #: hacks/config/imsmap.xml.h:11
 msgid "Random Mode"
 msgstr ""
 
 #: 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."
+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 ""
 
 #: hacks/config/apple2.xml.h:5
 msgstr ""
 
 #: hacks/config/apple2.xml.h:5
@@ -1971,10 +1601,8 @@ msgstr ""
 msgid "Text Mode"
 msgstr ""
 
 msgid "Text Mode"
 msgstr ""
 
-#: hacks/config/apple2.xml.h:7
-#: hacks/config/fontglide.xml.h:15
-#: hacks/config/noseguy.xml.h:7
-#: hacks/config/phosphor.xml.h:9
+#: hacks/config/apple2.xml.h:7 hacks/config/fontglide.xml.h:15
+#: hacks/config/noseguy.xml.h:7 hacks/config/phosphor.xml.h:9
 #: hacks/config/starwars.xml.h:17
 msgid "Text Program"
 msgstr ""
 #: hacks/config/starwars.xml.h:17
 msgid "Text Program"
 msgstr ""
@@ -2019,70 +1647,47 @@ msgstr ""
 msgid "Shy"
 msgstr ""
 
 msgid "Shy"
 msgstr ""
 
-#: hacks/config/atlantis.xml.h:14
-#: hacks/config/boxed.xml.h:7
-#: hacks/config/cage.xml.h:5
-#: hacks/config/extrusion.xml.h:12
-#: hacks/config/gears.xml.h:8
-#: hacks/config/glblur.xml.h:15
-#: hacks/config/glplanet.xml.h:7
-#: hacks/config/glsnake.xml.h:13
-#: hacks/config/gltext.xml.h:14
-#: hacks/config/menger.xml.h:17
-#: hacks/config/mismunch.xml.h:11
-#: hacks/config/molecule.xml.h:23
-#: hacks/config/munch.xml.h:8
-#: hacks/config/sierpinski3d.xml.h:9
-#: hacks/config/speedmine.xml.h:14
-#: hacks/config/spheremonics.xml.h:21
-#: hacks/config/sproingies.xml.h:7
-#: hacks/config/stairs.xml.h:4
-#: hacks/config/stonerview.xml.h:2
+#: hacks/config/atlantis.xml.h:14 hacks/config/cage.xml.h:5
+#: hacks/config/extrusion.xml.h:12 hacks/config/gears.xml.h:8
+#: hacks/config/glblur.xml.h:15 hacks/config/glplanet.xml.h:9
+#: hacks/config/glsnake.xml.h:13 hacks/config/gltext.xml.h:14
+#: hacks/config/menger.xml.h:17 hacks/config/mismunch.xml.h:11
+#: hacks/config/molecule.xml.h:23 hacks/config/munch.xml.h:8
+#: hacks/config/sierpinski3d.xml.h:9 hacks/config/speedmine.xml.h:14
+#: hacks/config/spheremonics.xml.h:21 hacks/config/sproingies.xml.h:7
+#: hacks/config/stairs.xml.h:4 hacks/config/stonerview.xml.h:2
 #: hacks/config/superquadrics.xml.h:9
 msgid "Solid"
 msgstr ""
 
 #: hacks/config/atlantis.xml.h:15
 #: hacks/config/superquadrics.xml.h:9
 msgid "Solid"
 msgstr ""
 
 #: hacks/config/atlantis.xml.h:15
-msgid "This is xfishtank writ large: a GL animation of a number of sharks, dolphins, and whales. The swimming motions are great. Originally written by Mark Kilgard."
+msgid ""
+"This is xfishtank writ large: a GL animation of a number of sharks, "
+"dolphins, and whales. The swimming motions are great. Originally written by "
+"Mark Kilgard."
 msgstr ""
 
 #: hacks/config/atlantis.xml.h:16
 msgid "Whale Speed"
 msgstr ""
 
 msgstr ""
 
 #: hacks/config/atlantis.xml.h:16
 msgid "Whale Speed"
 msgstr ""
 
-#: hacks/config/atlantis.xml.h:17
-#: hacks/config/atunnel.xml.h:10
-#: hacks/config/blinkbox.xml.h:9
-#: 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:15
-#: 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:24
-#: 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/atlantis.xml.h:17 hacks/config/atunnel.xml.h:10
+#: hacks/config/blinkbox.xml.h:9 hacks/config/blocktube.xml.h:13
+#: 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:15 hacks/config/glsnake.xml.h:15
+#: 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:24
+#: hacks/config/moebius.xml.h:11 hacks/config/molecule.xml.h:26
+#: hacks/config/pinion.xml.h:15 hacks/config/polyhedra.xml.h:173
+#: 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 ""
 #: hacks/config/superquadrics.xml.h:12
 msgid "Wireframe"
 msgstr ""
@@ -2099,8 +1704,7 @@ msgstr ""
 msgid "Ball Mass"
 msgstr ""
 
 msgid "Ball Mass"
 msgstr ""
 
-#: hacks/config/attraction.xml.h:4
-#: hacks/config/fluidballs.xml.h:3
+#: hacks/config/attraction.xml.h:4 hacks/config/fluidballs.xml.h:3
 msgid "Balls"
 msgstr ""
 
 msgid "Balls"
 msgstr ""
 
@@ -2108,10 +1712,8 @@ msgstr ""
 msgid "Bounce Off Walls"
 msgstr ""
 
 msgid "Bounce Off Walls"
 msgstr ""
 
-#: hacks/config/attraction.xml.h:6
-#: hacks/config/hopalong.xml.h:1
-#: hacks/config/interference.xml.h:5
-#: hacks/config/qix.xml.h:2
+#: hacks/config/attraction.xml.h:6 hacks/config/hopalong.xml.h:1
+#: hacks/config/interference.xml.h:5 hacks/config/qix.xml.h:2
 #: hacks/config/wander.xml.h:3
 msgid "Color Contrast"
 msgstr ""
 #: hacks/config/wander.xml.h:3
 msgid "Color Contrast"
 msgstr ""
@@ -2124,34 +1726,21 @@ msgstr ""
 msgid "Filled Splines"
 msgstr ""
 
 msgid "Filled Splines"
 msgstr ""
 
-#: hacks/config/attraction.xml.h:10
-#: hacks/config/ccurve.xml.h:9
-#: 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/superquadrics.xml.h:5
-#: hacks/config/t3d.xml.h:7
-#: hacks/config/twang.xml.h:5
-#: hacks/config/wander.xml.h:8
+#: hacks/config/attraction.xml.h:10 hacks/config/ccurve.xml.h:9
+#: 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/superquadrics.xml.h:5 hacks/config/t3d.xml.h:7
+#: hacks/config/twang.xml.h:5 hacks/config/wander.xml.h:8
+#: hacks/config/xmountains.xml.h:17
 msgid "High"
 msgstr ""
 
 msgid "High"
 msgstr ""
 
@@ -2164,75 +1753,56 @@ msgid "Inward"
 msgstr ""
 
 #: hacks/config/attraction.xml.h:14
 msgstr ""
 
 #: hacks/config/attraction.xml.h:14
-msgid "Like qix, this uses a simple simple motion model to generate many different display modes. The control points attract each other up to a certain distance, and then begin to repel each other. The attraction/repulsion is proportional to the distance between any two particles, similar to the strong and weak nuclear forces. One of the most interesting ways to watch this hack is simply as bouncing balls, because their motions and interactions with each other are so odd. Sometimes two balls will get into a tight orbit around each other, to be interrupted later by a third, or by the edge of the screen. It looks quite chaotic. Written by Jamie Zawinski, based on Lisp code by John Pezaris."
-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:10
+msgid ""
+"Like qix, this uses a simple simple motion model to generate many different "
+"display modes. The control points attract each other up to a certain "
+"distance, and then begin to repel each other. The attraction/repulsion is "
+"proportional to the distance between any two particles, similar to the "
+"strong and weak nuclear forces. One of the most interesting ways to watch "
+"this hack is simply as bouncing balls, because their motions and "
+"interactions with each other are so odd. Sometimes two balls will get into a "
+"tight orbit around each other, to be interrupted later by a third, or by the "
+"edge of the screen. It looks quite chaotic. Written by Jamie Zawinski, based "
+"on Lisp code by John Pezaris."
+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:10
 msgid "Lines"
 msgstr ""
 
 msgid "Lines"
 msgstr ""
 
-#: 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/mismunch.xml.h:3
-#: 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
-#: hacks/config/spheremonics.xml.h:7
-#: hacks/config/wander.xml.h:10
-#: hacks/config/whirlwindwarp.xml.h:3
+#: 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/flow.xml.h:6 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/mismunch.xml.h:3 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
+#: hacks/config/spheremonics.xml.h:7 hacks/config/substrate.xml.h:6
+#: hacks/config/wander.xml.h:10 hacks/config/whirlwindwarp.xml.h:3
 msgid "Long"
 msgstr ""
 
 msgid "Long"
 msgstr ""
 
-#: hacks/config/attraction.xml.h:17
-#: hacks/config/ccurve.xml.h:10
-#: 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/superquadrics.xml.h:6
-#: hacks/config/t3d.xml.h:8
-#: hacks/config/twang.xml.h:7
-#: hacks/config/wander.xml.h:11
+#: hacks/config/attraction.xml.h:17 hacks/config/ccurve.xml.h:10
+#: 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/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 ""
 
 msgid "Low"
 msgstr ""
 
@@ -2248,9 +1818,8 @@ msgstr ""
 msgid "Polygons"
 msgstr ""
 
 msgid "Polygons"
 msgstr ""
 
-#: hacks/config/attraction.xml.h:23
-#: hacks/config/spotlight.xml.h:3
-#: hacks/config/xplanet.xml.h:55
+#: hacks/config/attraction.xml.h:23 hacks/config/fuzzyflakes.xml.h:13
+#: hacks/config/spotlight.xml.h:3 hacks/config/xplanet.xml.h:55
 msgid "Radius"
 msgstr ""
 
 msgid "Radius"
 msgstr ""
 
@@ -2258,30 +1827,19 @@ msgstr ""
 msgid "Repulsion Threshold"
 msgstr ""
 
 msgid "Repulsion Threshold"
 msgstr ""
 
-#: 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/metaballs.xml.h:12
-#: hacks/config/mismunch.xml.h:8
-#: 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/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/flow.xml.h:9 hacks/config/galaxy.xml.h:9
+#: hacks/config/klein.xml.h:5 hacks/config/laser.xml.h:9
+#: hacks/config/menger.xml.h:14 hacks/config/metaballs.xml.h:12
+#: hacks/config/mismunch.xml.h:8 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/substrate.xml.h:9
+#: hacks/config/wander.xml.h:12 hacks/config/whirlwindwarp.xml.h:6
 msgid "Short"
 msgstr ""
 
 msgid "Short"
 msgstr ""
 
@@ -2289,13 +1847,11 @@ msgstr ""
 msgid "Splines"
 msgstr ""
 
 msgid "Splines"
 msgstr ""
 
-#: hacks/config/attraction.xml.h:30
-#: hacks/config/fireflies.xml.h:42
+#: hacks/config/attraction.xml.h:30 hacks/config/fireflies.xml.h:42
 msgid "Tails"
 msgstr ""
 
 msgid "Tails"
 msgstr ""
 
-#: hacks/config/attraction.xml.h:31
-#: hacks/config/euler2d.xml.h:16
+#: hacks/config/attraction.xml.h:31 hacks/config/euler2d.xml.h:16
 #: hacks/config/juggle.xml.h:9
 msgid "Trail Length"
 msgstr ""
 #: hacks/config/juggle.xml.h:9
 msgid "Trail Length"
 msgstr ""
@@ -2305,21 +1861,20 @@ msgid "Atunnel"
 msgstr ""
 
 #: hacks/config/atunnel.xml.h:2
 msgstr ""
 
 #: 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."
+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 ""
 
 msgstr ""
 
-#: 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/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 ""
 
 #: hacks/config/sballs.xml.h:6
 msgid "Normal"
 msgstr ""
 
-#: hacks/config/atunnel.xml.h:8
-#: hacks/config/glforestfire.xml.h:18
-#: hacks/config/lament.xml.h:8
-#: hacks/config/sballs.xml.h:17
+#: 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 ""
 
 msgid "Untextured"
 msgstr ""
 
@@ -2344,7 +1899,9 @@ msgid "Scrolling Barcodes"
 msgstr ""
 
 #: hacks/config/barcode.xml.h:8
 msgstr ""
 
 #: hacks/config/barcode.xml.h:8
-msgid "This draws a random sequence of colorful barcodes scrolling across your screen. CONSUME! By Dan Bornstein."
+msgid ""
+"This draws a random sequence of colorful barcodes scrolling across your "
+"screen. CONSUME! By Dan Bornstein."
 msgstr ""
 
 #: hacks/config/blaster.xml.h:1
 msgstr ""
 
 #: hacks/config/blaster.xml.h:1
@@ -2352,11 +1909,13 @@ msgid "Blaster"
 msgstr ""
 
 #: hacks/config/blaster.xml.h:2
 msgstr ""
 
 #: hacks/config/blaster.xml.h:2
-msgid "Draws a simulation of flying space-combat robots (cleverly disguised as colored circles) doing battle in front of a moving star field. Written by Jonathan Lin."
+msgid ""
+"Draws a simulation of flying space-combat robots (cleverly disguised as "
+"colored circles) doing battle in front of a moving star field. Written by "
+"Jonathan Lin."
 msgstr ""
 
 msgstr ""
 
-#: hacks/config/blaster.xml.h:5
-#: hacks/config/penetrate.xml.h:4
+#: hacks/config/blaster.xml.h:5 hacks/config/penetrate.xml.h:4
 msgid "Lasers"
 msgstr ""
 
 msgid "Lasers"
 msgstr ""
 
@@ -2364,7 +1923,7 @@ msgstr ""
 msgid "Robots"
 msgstr ""
 
 msgid "Robots"
 msgstr ""
 
-#: hacks/config/blaster.xml.h:10
+#: hacks/config/blaster.xml.h:10 hacks/config/glplanet.xml.h:11
 msgid "Stars"
 msgstr ""
 
 msgid "Stars"
 msgstr ""
 
@@ -2380,13 +1939,14 @@ msgstr ""
 msgid "Dissolve"
 msgstr ""
 
 msgid "Dissolve"
 msgstr ""
 
-#: hacks/config/blinkbox.xml.h:4
-#: hacks/config/phosphor.xml.h:3
+#: hacks/config/blinkbox.xml.h:4 hacks/config/phosphor.xml.h:3
 msgid "Fade"
 msgstr ""
 
 #: hacks/config/blinkbox.xml.h:6
 msgid "Fade"
 msgstr ""
 
 #: hacks/config/blinkbox.xml.h:6
-msgid "Shows a ball contained inside of a bounding box. Colored blocks blink in when the ball hits the edges. Written by Jeremy English."
+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
 msgstr ""
 
 #: hacks/config/blitspin.xml.h:1
@@ -2410,7 +1970,16 @@ msgid "Grab Screen"
 msgstr ""
 
 #: hacks/config/blitspin.xml.h:8
 msgstr ""
 
 #: hacks/config/blitspin.xml.h:8
-msgid "The ``blitspin'' hack repeatedly rotates a bitmap by 90 degrees by using logical operations: the bitmap is divided into quadrants, and the quadrants are shifted clockwise. Then the same thing is done again with progressively smaller quadrants, except that all sub-quadrants of a given size are rotated in parallel. Written by Jamie Zawinski based on some cool SmallTalk code seen in in Byte Magazine in 1981. As you watch it, the image appears to dissolve into static and then reconstitute itself, but rotated. You can provide the image to use, as an XBM or XPM file, or tell it to grab a screen image and rotate that."
+msgid ""
+"The ``blitspin'' hack repeatedly rotates a bitmap by 90 degrees by using "
+"logical operations: the bitmap is divided into quadrants, and the quadrants "
+"are shifted clockwise. Then the same thing is done again with progressively "
+"smaller quadrants, except that all sub-quadrants of a given size are rotated "
+"in parallel. Written by Jamie Zawinski based on some cool SmallTalk code "
+"seen in in Byte Magazine in 1981. As you watch it, the image appears to "
+"dissolve into static and then reconstitute itself, but rotated. You can "
+"provide the image to use, as an XBM or XPM file, or tell it to grab a screen "
+"image and rotate that."
 msgstr ""
 
 #: hacks/config/blocktube.xml.h:1
 msgstr ""
 
 #: hacks/config/blocktube.xml.h:1
@@ -2434,15 +2003,16 @@ msgid "Solid Blocks"
 msgstr ""
 
 #: hacks/config/blocktube.xml.h:12
 msgstr ""
 
 #: 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."
+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 ""
 
 msgstr ""
 
 #: hacks/config/bouboule.xml.h:1
 msgid "Bouboule"
 msgstr ""
 
-#: hacks/config/bouboule.xml.h:2
-#: hacks/config/rocks.xml.h:3
+#: hacks/config/bouboule.xml.h:2 hacks/config/rocks.xml.h:3
 msgid "Do Red/Blue 3D seperation"
 msgstr ""
 
 msgid "Do Red/Blue 3D seperation"
 msgstr ""
 
@@ -2451,29 +2021,24 @@ msgid "Number of Spots"
 msgstr ""
 
 #: hacks/config/bouboule.xml.h:10
 msgstr ""
 
 #: hacks/config/bouboule.xml.h:10
-msgid "This draws what looks like a spinning, deforming balloon with varying-sized spots painted on its invisible surface. Written by Jeremie Petit."
+msgid ""
+"This draws what looks like a spinning, deforming balloon with varying-sized "
+"spots painted on its invisible surface. Written by Jeremie Petit."
 msgstr ""
 
 #: hacks/config/bouncingcow.xml.h:1
 msgid "A Cow. A Trampoline. Together, they fight crime. By Jamie Zawinski."
 msgstr ""
 
 msgstr ""
 
 #: hacks/config/bouncingcow.xml.h:1
 msgid "A Cow. A Trampoline. Together, they fight crime. By Jamie Zawinski."
 msgstr ""
 
-#: 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/wormhole.xml.h:1
-#: hacks/config/xfishtank.xml.h:1
+#: 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/pinion.xml.h:3 hacks/config/polyhedra.xml.h:3
+#: 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/wormhole.xml.h:1 hacks/config/xfishtank.xml.h:1
 msgid "Animation Speed"
 msgstr ""
 
 msgid "Animation Speed"
 msgstr ""
 
@@ -2510,7 +2075,15 @@ msgid "Boxed"
 msgstr ""
 
 #: hacks/config/boxed.xml.h:3
 msgstr ""
 
 #: hacks/config/boxed.xml.h:3
-msgid "Draws a box full of 3D bouncing balls that explode. Written by Sander van Grieken."
+msgid ""
+"Draws a box full of 3D bouncing balls that explode. Written by Sander van "
+"Grieken."
+msgstr ""
+
+#: hacks/config/boxed.xml.h:5 hacks/config/cubestorm.xml.h:5
+#: hacks/config/fontglide.xml.h:9 hacks/config/glknots.xml.h:6
+#: hacks/config/polyhedra.xml.h:85
+msgid "Motion Speed"
 msgstr ""
 
 #: hacks/config/braid.xml.h:1
 msgstr ""
 
 #: hacks/config/braid.xml.h:1
@@ -2518,51 +2091,35 @@ msgid "Braid"
 msgstr ""
 
 #: hacks/config/braid.xml.h:2
 msgstr ""
 
 #: hacks/config/braid.xml.h:2
-msgid "Draws random color-cycling inter-braided concentric circles. Written by John Neil."
-msgstr ""
-
-#: 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/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:5
-#: 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/mismunch.xml.h:1
-#: 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
+msgid ""
+"Draws random color-cycling inter-braided concentric circles. Written by John "
+"Neil."
+msgstr ""
+
+#: 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/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:5 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/mismunch.xml.h:1 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/polyhedra.xml.h:17
+#: 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/substrate.xml.h:1
+#: hacks/config/vidwhacker.xml.h:3 hacks/config/wander.xml.h:7
 #: hacks/config/xspirograph.xml.h:3
 msgid "Duration"
 msgstr ""
 
 #: hacks/config/xspirograph.xml.h:3
 msgid "Duration"
 msgstr ""
 
-#: hacks/config/braid.xml.h:5
-#: hacks/config/epicycle.xml.h:7
+#: hacks/config/braid.xml.h:5 hacks/config/epicycle.xml.h:7
 #: hacks/config/nerverot.xml.h:12
 msgid "Line Thickness"
 msgstr ""
 #: hacks/config/nerverot.xml.h:12
 msgid "Line Thickness"
 msgstr ""
@@ -2571,15 +2128,12 @@ msgstr ""
 msgid "Max Rings"
 msgstr ""
 
 msgid "Max Rings"
 msgstr ""
 
-#: hacks/config/bsod.xml.h:1
-#: hacks/config/molecule.xml.h:1
-#: hacks/config/vidwhacker.xml.h:1
-#: hacks/config/webcollage.xml.h:1
+#: hacks/config/bsod.xml.h:1 hacks/config/molecule.xml.h:1
+#: hacks/config/vidwhacker.xml.h:1 hacks/config/webcollage.xml.h:1
 msgid "2 minutes"
 msgstr ""
 
 msgid "2 minutes"
 msgstr ""
 
-#: hacks/config/bsod.xml.h:2
-#: hacks/config/molecule.xml.h:2
+#: hacks/config/bsod.xml.h:2 hacks/config/molecule.xml.h:2
 msgid "5 seconds"
 msgstr ""
 
 msgid "5 seconds"
 msgstr ""
 
@@ -2604,7 +2158,10 @@ msgid "BSOD"
 msgstr ""
 
 #: hacks/config/bsod.xml.h:8
 msgstr ""
 
 #: 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."
+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 ""
 
 #: hacks/config/bsod.xml.h:10
 msgstr ""
 
 #: hacks/config/bsod.xml.h:10
@@ -2620,54 +2177,58 @@ msgid "Linux"
 msgstr "Linux"
 
 #: hacks/config/bsod.xml.h:13
 msgstr "Linux"
 
 #: hacks/config/bsod.xml.h:13
-msgid "Mac Bomb"
+msgid "MS-DOS"
 msgstr ""
 
 #: hacks/config/bsod.xml.h:14
 msgstr ""
 
 #: hacks/config/bsod.xml.h:14
+msgid "Mac Bomb"
+msgstr ""
+
+#: hacks/config/bsod.xml.h:15
 msgid "MacOS X"
 msgstr "MacOS X"
 
 msgid "MacOS X"
 msgstr "MacOS X"
 
-#: hacks/config/bsod.xml.h:15
+#: hacks/config/bsod.xml.h:16
 msgid "MacsBug"
 msgstr ""
 
 msgid "MacsBug"
 msgstr ""
 
-#: hacks/config/bsod.xml.h:16
+#: hacks/config/bsod.xml.h:17
 msgid "NCD X Terminal"
 msgstr ""
 
 msgid "NCD X Terminal"
 msgstr ""
 
-#: hacks/config/bsod.xml.h:17
+#: hacks/config/bsod.xml.h:18
 msgid "OS/390"
 msgstr "OS/390"
 
 msgid "OS/390"
 msgstr "OS/390"
 
-#: hacks/config/bsod.xml.h:18
+#: hacks/config/bsod.xml.h:19
 msgid "SCO"
 msgstr "SCO"
 
 msgid "SCO"
 msgstr "SCO"
 
-#: hacks/config/bsod.xml.h:19
+#: hacks/config/bsod.xml.h:20
 msgid "Sad Mac"
 msgstr ""
 
 msgid "Sad Mac"
 msgstr ""
 
-#: hacks/config/bsod.xml.h:20
+#: hacks/config/bsod.xml.h:21
 msgid "Solaris"
 msgstr "Solaris"
 
 msgid "Solaris"
 msgstr "Solaris"
 
-#: hacks/config/bsod.xml.h:21
+#: hacks/config/bsod.xml.h:22
 msgid "Sparc Linux"
 msgstr ""
 
 msgid "Sparc Linux"
 msgstr ""
 
-#: hacks/config/bsod.xml.h:22
+#: hacks/config/bsod.xml.h:23
 msgid "VMS"
 msgstr ""
 
 msgid "VMS"
 msgstr ""
 
-#: hacks/config/bsod.xml.h:23
+#: hacks/config/bsod.xml.h:24
 msgid "Windows 2000"
 msgstr "Windows 2000"
 
 msgid "Windows 2000"
 msgstr "Windows 2000"
 
-#: hacks/config/bsod.xml.h:24
+#: hacks/config/bsod.xml.h:25
 msgid "Windows 3.1"
 msgstr "Windows 3.1"
 
 msgid "Windows 3.1"
 msgstr "Windows 3.1"
 
-#: hacks/config/bsod.xml.h:25
+#: hacks/config/bsod.xml.h:26
 msgid "Windows NT"
 msgstr "Windows NT"
 
 msgid "Windows NT"
 msgstr "Windows NT"
 
@@ -2676,11 +2237,12 @@ msgid "Bubble3D"
 msgstr ""
 
 #: hacks/config/bubble3d.xml.h:2
 msgstr ""
 
 #: hacks/config/bubble3d.xml.h:2
-msgid "Draws a stream of rising, undulating 3D bubbles, rising toward the top of the screen, with nice specular reflections. Written by Richard Jones."
+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 ""
 
 msgstr ""
 
-#: hacks/config/bubbles.xml.h:1
-#: hacks/config/xfishtank.xml.h:2
+#: hacks/config/bubbles.xml.h:1 hacks/config/xfishtank.xml.h:2
 msgid "Bubbles"
 msgstr ""
 
 msgid "Bubbles"
 msgstr ""
 
@@ -2713,11 +2275,17 @@ msgid "Leave Trails"
 msgstr ""
 
 #: hacks/config/bubbles.xml.h:12
 msgstr ""
 
 #: hacks/config/bubbles.xml.h:12
-msgid "This simulates the kind of bubble formation that happens when water boils:small bubbles appear, and as they get closer to each other, they combine to form larger bubbles, which eventually pop. Written by James Macnicol."
+msgid ""
+"This simulates the kind of bubble formation that happens when water boils:"
+"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 ""
 
 #: hacks/config/bumps.xml.h:1
 msgstr ""
 
 #: hacks/config/bumps.xml.h:1
-msgid "A bit like `Spotlight', except that instead of merely exposing part of your desktop, it creates a bump map from it. Basically, it 3D-izes a roaming section of your desktop, based on color intensity. Written by Shane Smit."
+msgid ""
+"A bit like `Spotlight', except that instead of merely exposing part of your "
+"desktop, it creates a bump map from it. Basically, it 3D-izes a roaming "
+"section of your desktop, based on color intensity. Written by Shane Smit."
 msgstr ""
 
 #: hacks/config/bumps.xml.h:2
 msgstr ""
 
 #: hacks/config/bumps.xml.h:2
@@ -2729,20 +2297,21 @@ msgid "Cage"
 msgstr ""
 
 #: hacks/config/cage.xml.h:7
 msgstr ""
 
 #: hacks/config/cage.xml.h:7
-msgid "This draws Escher's ``Impossible Cage,'' a 3d analog of a moebius strip, and rotates it in three dimensions. Written by Marcelo Vianna."
+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 ""
 
 #: hacks/config/ccurve.xml.h:1
 msgid "0 seconds"
 msgstr "0 sekuntia"
 
 msgstr ""
 
 #: hacks/config/ccurve.xml.h:1
 msgid "0 seconds"
 msgstr "0 sekuntia"
 
-#: hacks/config/ccurve.xml.h:2
-#: hacks/config/epicycle.xml.h:1
+#: hacks/config/ccurve.xml.h:2 hacks/config/epicycle.xml.h:1
 msgid "1 minute"
 msgstr "1 minuutti"
 
 msgid "1 minute"
 msgstr "1 minuutti"
 
-#: hacks/config/ccurve.xml.h:3
-#: hacks/config/epicycle.xml.h:2
+#: hacks/config/ccurve.xml.h:3 hacks/config/epicycle.xml.h:2
+#: hacks/config/polyhedra.xml.h:1
 msgid "1 second"
 msgstr "1 sekunti"
 
 msgid "1 second"
 msgstr "1 sekunti"
 
@@ -2750,23 +2319,21 @@ msgstr "1 sekunti"
 msgid "C Curve"
 msgstr ""
 
 msgid "C Curve"
 msgstr ""
 
-#: hacks/config/ccurve.xml.h:5
+#: hacks/config/ccurve.xml.h:5 hacks/config/fuzzyflakes.xml.h:4
 msgid "Delay"
 msgstr ""
 
 msgid "Delay"
 msgstr ""
 
-#: 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:2
+#: 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:2
 msgid "Density"
 msgstr ""
 
 #: hacks/config/ccurve.xml.h:8
 msgid "Density"
 msgstr ""
 
 #: hacks/config/ccurve.xml.h:8
-msgid "Generates self-similar linear fractals, including the classic ``C Curve.'' Written by Rick Campbell."
+msgid ""
+"Generates self-similar linear fractals, including the classic ``C Curve.'' "
+"Written by Rick Campbell."
 msgstr ""
 
 #: hacks/config/circuit.xml.h:1
 msgstr ""
 
 #: hacks/config/circuit.xml.h:1
@@ -2777,8 +2344,7 @@ msgstr ""
 msgid "Circuit"
 msgstr ""
 
 msgid "Circuit"
 msgstr ""
 
-#: hacks/config/circuit.xml.h:3
-#: hacks/config/gflux.xml.h:4
+#: hacks/config/circuit.xml.h:3 hacks/config/gflux.xml.h:4
 #: hacks/config/pulsar.xml.h:2
 msgid "Directional Lighting"
 msgstr ""
 #: hacks/config/pulsar.xml.h:2
 msgid "Directional Lighting"
 msgstr ""
@@ -2791,27 +2357,22 @@ msgstr ""
 msgid "Parts"
 msgstr ""
 
 msgid "Parts"
 msgstr ""
 
-#: hacks/config/circuit.xml.h:7
-#: hacks/config/flipscreen3d.xml.h:4
-#: hacks/config/gleidescope.xml.h:9
+#: hacks/config/circuit.xml.h:7 hacks/config/flipscreen3d.xml.h:4
+#: hacks/config/gleidescope.xml.h:9 hacks/config/glplanet.xml.h:6
 msgid "Rotate"
 msgstr ""
 
 msgid "Rotate"
 msgstr ""
 
-#: hacks/config/circuit.xml.h:8
+#: hacks/config/circuit.xml.h:8 hacks/config/pinion.xml.h:10
 msgid "Rotation Speed"
 msgstr ""
 
 msgid "Rotation Speed"
 msgstr ""
 
-#: 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
+#: 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 ""
 
 msgid "Spin"
 msgstr ""
 
-#: hacks/config/cloudlife.xml.h:1
-#: hacks/config/demon.xml.h:2
+#: hacks/config/cloudlife.xml.h:1 hacks/config/demon.xml.h:2
 #: hacks/config/petri.xml.h:1
 msgid "Cell Size"
 msgstr ""
 #: hacks/config/petri.xml.h:1
 msgid "Cell Size"
 msgstr ""
@@ -2821,7 +2382,12 @@ msgid "CloudLife"
 msgstr ""
 
 #: hacks/config/cloudlife.xml.h:4
 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."
+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
 msgstr ""
 
 #: hacks/config/cloudlife.xml.h:6
@@ -2844,45 +2410,34 @@ msgstr ""
 msgid "Compass"
 msgstr ""
 
 msgid "Compass"
 msgstr ""
 
-#: hacks/config/compass.xml.h:2
-#: hacks/config/deluxe.xml.h:3
-#: 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/compass.xml.h:2 hacks/config/deluxe.xml.h:3
+#: hacks/config/fontglide.xml.h:3 hacks/config/fuzzyflakes.xml.h:5
+#: 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 ""
 
 #: hacks/config/compass.xml.h:6
 #: hacks/config/pipes.xml.h:4
 msgid "Double Buffer"
 msgstr ""
 
 #: hacks/config/compass.xml.h:6
-msgid "This draws a compass, with all elements spinning about randomly, for that ``lost and nauseous'' feeling. Written by Jamie Zawinski."
-msgstr ""
-
-#: hacks/config/coral.xml.h:1
-#: hacks/config/deco.xml.h:1
-#: hacks/config/helix.xml.h:1
-#: hacks/config/imsmap.xml.h:1
-#: hacks/config/jigsaw.xml.h:2
-#: hacks/config/moire.xml.h:1
-#: hacks/config/pedal.xml.h:1
-#: hacks/config/rorschach.xml.h:1
-#: hacks/config/rotzoomer.xml.h:2
-#: hacks/config/wander.xml.h:2
+msgid ""
+"This draws a compass, with all elements spinning about randomly, for that "
+"``lost and nauseous'' feeling. Written by Jamie Zawinski."
+msgstr ""
+
+#: hacks/config/coral.xml.h:1 hacks/config/deco.xml.h:1
+#: hacks/config/helix.xml.h:1 hacks/config/imsmap.xml.h:1
+#: hacks/config/jigsaw.xml.h:2 hacks/config/moire.xml.h:1
+#: hacks/config/pedal.xml.h:1 hacks/config/rorschach.xml.h:1
+#: hacks/config/rotzoomer.xml.h:2 hacks/config/wander.xml.h:2
 #: hacks/config/xspirograph.xml.h:1
 msgid "1 Minute"
 msgstr ""
 
 #: hacks/config/xspirograph.xml.h:1
 msgid "1 Minute"
 msgstr ""
 
-#: hacks/config/coral.xml.h:2
-#: hacks/config/deco.xml.h:2
-#: hacks/config/glslideshow.xml.h:1
-#: hacks/config/helix.xml.h:2
-#: hacks/config/imsmap.xml.h:2
-#: hacks/config/moire.xml.h:2
-#: hacks/config/pedal.xml.h:2
-#: hacks/config/penrose.xml.h:1
-#: hacks/config/rorschach.xml.h:2
-#: hacks/config/xspirograph.xml.h:2
+#: hacks/config/coral.xml.h:2 hacks/config/deco.xml.h:2
+#: hacks/config/glslideshow.xml.h:1 hacks/config/helix.xml.h:2
+#: hacks/config/imsmap.xml.h:2 hacks/config/moire.xml.h:2
+#: hacks/config/pedal.xml.h:2 hacks/config/penrose.xml.h:1
+#: hacks/config/rorschach.xml.h:2 hacks/config/xspirograph.xml.h:2
 msgid "1 Second"
 msgstr ""
 
 msgid "1 Second"
 msgstr ""
 
@@ -2890,39 +2445,30 @@ msgstr ""
 msgid "Coral"
 msgstr ""
 
 msgid "Coral"
 msgstr ""
 
-#: hacks/config/coral.xml.h:4
-#: hacks/config/gflux.xml.h:3
-#: hacks/config/glblur.xml.h:2
-#: hacks/config/glmatrix.xml.h:3
-#: 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/coral.xml.h:4 hacks/config/fireworkx.xml.h:2
+#: hacks/config/gflux.xml.h:3 hacks/config/glblur.xml.h:2
+#: hacks/config/glmatrix.xml.h:3 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
 msgid "Dense"
 msgstr ""
 
 #: hacks/config/xearth.xml.h:4
 msgid "Dense"
 msgstr ""
 
-#: hacks/config/coral.xml.h:10
-#: hacks/config/squiral.xml.h:13
+#: hacks/config/coral.xml.h:10 hacks/config/squiral.xml.h:13
 msgid "Seeds"
 msgstr ""
 
 #: hacks/config/coral.xml.h:11
 msgid "Seeds"
 msgstr ""
 
 #: hacks/config/coral.xml.h:11
-msgid "Simulates coral growth, albeit somewhat slowly. Written by Frederick Roeber."
-msgstr ""
-
-#: hacks/config/coral.xml.h:13
-#: hacks/config/gflux.xml.h:13
-#: hacks/config/glblur.xml.h:16
-#: hacks/config/glmatrix.xml.h:19
-#: hacks/config/imsmap.xml.h:13
-#: hacks/config/lavalite.xml.h:29
-#: hacks/config/pyro.xml.h:14
-#: hacks/config/qix.xml.h:21
-#: hacks/config/squiral.xml.h:15
-#: hacks/config/xearth.xml.h:24
-#: hacks/config/xmatrix.xml.h:17
+msgid ""
+"Simulates coral growth, albeit somewhat slowly. Written by Frederick Roeber."
+msgstr ""
+
+#: hacks/config/coral.xml.h:13 hacks/config/fireworkx.xml.h:10
+#: hacks/config/gflux.xml.h:13 hacks/config/glblur.xml.h:16
+#: hacks/config/glmatrix.xml.h:19 hacks/config/imsmap.xml.h:13
+#: hacks/config/lavalite.xml.h:29 hacks/config/pyro.xml.h:14
+#: hacks/config/qix.xml.h:21 hacks/config/squiral.xml.h:15
+#: hacks/config/xearth.xml.h:24 hacks/config/xmatrix.xml.h:17
 msgid "Sparse"
 msgstr ""
 
 msgid "Sparse"
 msgstr ""
 
@@ -2931,7 +2477,9 @@ msgid "Cosmos"
 msgstr ""
 
 #: hacks/config/cosmos.xml.h:2
 msgstr ""
 
 #: hacks/config/cosmos.xml.h:2
-msgid "Draws fireworks and zooming, fading flares. By Tom Campbell. You can find it at &lt;http://cosmos.dnsalias.net/cosmos/&gt;"
+msgid ""
+"Draws fireworks and zooming, fading flares. By Tom Campbell. You can find it "
+"at &lt;http://www.cosmosx.org/&gt;"
 msgstr ""
 
 #: hacks/config/critical.xml.h:1
 msgstr ""
 
 #: hacks/config/critical.xml.h:1
@@ -2939,39 +2487,28 @@ msgid "Critical"
 msgstr ""
 
 #: hacks/config/critical.xml.h:2
 msgstr ""
 
 #: hacks/config/critical.xml.h:2
-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."
+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 ""
 
 #: hacks/config/crystal.xml.h:1
 msgid "Center on Screen"
 msgstr ""
 
 msgstr ""
 
 #: hacks/config/crystal.xml.h:1
 msgid "Center on Screen"
 msgstr ""
 
-#: hacks/config/crystal.xml.h:2
-#: hacks/config/deluxe.xml.h:1
-#: hacks/config/fadeplot.xml.h:1
-#: hacks/config/flow.xml.h:3
-#: hacks/config/galaxy.xml.h:1
-#: hacks/config/glforestfire.xml.h:1
-#: hacks/config/grav.xml.h:1
-#: hacks/config/julia.xml.h:1
-#: hacks/config/laser.xml.h:1
-#: hacks/config/lisa.xml.h:1
-#: hacks/config/lissie.xml.h:2
-#: hacks/config/morph3d.xml.h:2
-#: hacks/config/mountain.xml.h:1
-#: hacks/config/piecewise.xml.h:2
-#: hacks/config/qix.xml.h:4
-#: hacks/config/rocks.xml.h:2
-#: hacks/config/rotor.xml.h:2
-#: hacks/config/rubik.xml.h:1
-#: hacks/config/shadebobs.xml.h:1
-#: hacks/config/sierpinski.xml.h:1
-#: hacks/config/slip.xml.h:1
-#: hacks/config/spiral.xml.h:1
-#: hacks/config/sproingies.xml.h:1
-#: hacks/config/superquadrics.xml.h:1
-#: hacks/config/swirl.xml.h:1
-#: hacks/config/worm.xml.h:2
+#: hacks/config/crystal.xml.h:2 hacks/config/deluxe.xml.h:1
+#: hacks/config/fadeplot.xml.h:1 hacks/config/flow.xml.h:1
+#: hacks/config/galaxy.xml.h:1 hacks/config/glforestfire.xml.h:1
+#: hacks/config/grav.xml.h:1 hacks/config/julia.xml.h:1
+#: hacks/config/laser.xml.h:1 hacks/config/lisa.xml.h:1
+#: hacks/config/lissie.xml.h:2 hacks/config/morph3d.xml.h:2
+#: hacks/config/mountain.xml.h:1 hacks/config/piecewise.xml.h:2
+#: hacks/config/qix.xml.h:4 hacks/config/rocks.xml.h:2
+#: hacks/config/rotor.xml.h:2 hacks/config/rubik.xml.h:1
+#: hacks/config/shadebobs.xml.h:1 hacks/config/sierpinski.xml.h:1
+#: hacks/config/slip.xml.h:1 hacks/config/spiral.xml.h:1
+#: hacks/config/sproingies.xml.h:1 hacks/config/superquadrics.xml.h:1
+#: hacks/config/swirl.xml.h:1 hacks/config/worm.xml.h:2
 msgid "Count"
 msgstr ""
 
 msgid "Count"
 msgstr ""
 
@@ -2983,8 +2520,7 @@ msgstr ""
 msgid "Draw Cell"
 msgstr ""
 
 msgid "Draw Cell"
 msgstr ""
 
-#: hacks/config/crystal.xml.h:5
-#: hacks/config/spheremonics.xml.h:3
+#: hacks/config/crystal.xml.h:5 hacks/config/spheremonics.xml.h:3
 #: hacks/config/xearth.xml.h:6
 msgid "Draw Grid"
 msgstr ""
 #: hacks/config/xearth.xml.h:6
 msgid "Draw Grid"
 msgstr ""
@@ -2994,7 +2530,9 @@ msgid "Horizontal Symmetries"
 msgstr ""
 
 #: hacks/config/crystal.xml.h:9
 msgstr ""
 
 #: 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."
+msgid ""
+"Moving polygons, similar to a kaleidescope (more like a kaleidescope than "
+"the hack called `kaleid,' actually.) This one by Jouk Jansen."
 msgstr ""
 
 #: hacks/config/crystal.xml.h:14
 msgstr ""
 
 #: hacks/config/crystal.xml.h:14
@@ -3021,94 +2559,73 @@ msgstr ""
 msgid "Display Wireframe"
 msgstr ""
 
 msgid "Display Wireframe"
 msgstr ""
 
-#: 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/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/polyhedra.xml.h:16
 #: hacks/config/spheremonics.xml.h:1
 msgid "Don't Rotate"
 msgstr ""
 
 #: hacks/config/cubenetic.xml.h:7
 #: hacks/config/spheremonics.xml.h:1
 msgid "Don't Rotate"
 msgstr ""
 
 #: hacks/config/cubenetic.xml.h:7
-msgid "Draws a pulsating set of overlapping boxes with ever-chaning blobby patterns undulating across their surfaces. It's sort of a cubist Lavalite. Written by Jamie Zawinski."
+msgid ""
+"Draws a pulsating set of overlapping boxes with ever-chaning blobby patterns "
+"undulating across their surfaces. It's sort of a cubist Lavalite. Written by "
+"Jamie Zawinski."
 msgstr ""
 
 msgstr ""
 
-#: hacks/config/cubenetic.xml.h:14
-#: hacks/config/glblur.xml.h:6
-#: hacks/config/glknots.xml.h:8
-#: hacks/config/gltext.xml.h:5
-#: hacks/config/lavalite.xml.h:19
-#: hacks/config/menger.xml.h:7
-#: hacks/config/molecule.xml.h:14
+#: hacks/config/cubenetic.xml.h:14 hacks/config/glblur.xml.h:6
+#: hacks/config/glknots.xml.h:8 hacks/config/gltext.xml.h:5
+#: hacks/config/lavalite.xml.h:19 hacks/config/menger.xml.h:7
+#: hacks/config/molecule.xml.h:14 hacks/config/polyhedra.xml.h:110
 #: hacks/config/spheremonics.xml.h:10
 msgid "Rotate around X and Y axes"
 msgstr ""
 
 #: hacks/config/spheremonics.xml.h:10
 msgid "Rotate around X and Y axes"
 msgstr ""
 
-#: hacks/config/cubenetic.xml.h:15
-#: hacks/config/glblur.xml.h:7
-#: hacks/config/glknots.xml.h:9
-#: hacks/config/gltext.xml.h:6
-#: hacks/config/lavalite.xml.h:20
-#: hacks/config/menger.xml.h:8
-#: hacks/config/molecule.xml.h:15
+#: hacks/config/cubenetic.xml.h:15 hacks/config/glblur.xml.h:7
+#: hacks/config/glknots.xml.h:9 hacks/config/gltext.xml.h:6
+#: hacks/config/lavalite.xml.h:20 hacks/config/menger.xml.h:8
+#: hacks/config/molecule.xml.h:15 hacks/config/polyhedra.xml.h:111
 #: hacks/config/spheremonics.xml.h:11
 msgid "Rotate around X and Z axes"
 msgstr ""
 
 #: hacks/config/spheremonics.xml.h:11
 msgid "Rotate around X and Z axes"
 msgstr ""
 
-#: hacks/config/cubenetic.xml.h:16
-#: hacks/config/glblur.xml.h:8
-#: hacks/config/glknots.xml.h:10
-#: hacks/config/gltext.xml.h:7
-#: hacks/config/lavalite.xml.h:21
-#: hacks/config/menger.xml.h:9
-#: hacks/config/molecule.xml.h:16
+#: hacks/config/cubenetic.xml.h:16 hacks/config/glblur.xml.h:8
+#: hacks/config/glknots.xml.h:10 hacks/config/gltext.xml.h:7
+#: hacks/config/lavalite.xml.h:21 hacks/config/menger.xml.h:9
+#: hacks/config/molecule.xml.h:16 hacks/config/polyhedra.xml.h:112
 #: hacks/config/spheremonics.xml.h:12
 msgid "Rotate around X axis"
 msgstr ""
 
 #: hacks/config/spheremonics.xml.h:12
 msgid "Rotate around X axis"
 msgstr ""
 
-#: hacks/config/cubenetic.xml.h:17
-#: hacks/config/glblur.xml.h:9
-#: hacks/config/glknots.xml.h:11
-#: hacks/config/gltext.xml.h:8
-#: hacks/config/lavalite.xml.h:22
-#: hacks/config/menger.xml.h:10
-#: hacks/config/molecule.xml.h:17
+#: hacks/config/cubenetic.xml.h:17 hacks/config/glblur.xml.h:9
+#: hacks/config/glknots.xml.h:11 hacks/config/gltext.xml.h:8
+#: hacks/config/lavalite.xml.h:22 hacks/config/menger.xml.h:10
+#: hacks/config/molecule.xml.h:17 hacks/config/polyhedra.xml.h:113
 #: hacks/config/spheremonics.xml.h:13
 msgid "Rotate around Y and Z axes"
 msgstr ""
 
 #: hacks/config/spheremonics.xml.h:13
 msgid "Rotate around Y and Z axes"
 msgstr ""
 
-#: hacks/config/cubenetic.xml.h:18
-#: hacks/config/glblur.xml.h:10
-#: hacks/config/glknots.xml.h:12
-#: hacks/config/gltext.xml.h:9
-#: hacks/config/lavalite.xml.h:23
-#: hacks/config/menger.xml.h:11
-#: hacks/config/molecule.xml.h:18
+#: hacks/config/cubenetic.xml.h:18 hacks/config/glblur.xml.h:10
+#: hacks/config/glknots.xml.h:12 hacks/config/gltext.xml.h:9
+#: hacks/config/lavalite.xml.h:23 hacks/config/menger.xml.h:11
+#: hacks/config/molecule.xml.h:18 hacks/config/polyhedra.xml.h:114
 #: hacks/config/spheremonics.xml.h:14
 msgid "Rotate around Y axis"
 msgstr ""
 
 #: hacks/config/spheremonics.xml.h:14
 msgid "Rotate around Y axis"
 msgstr ""
 
-#: hacks/config/cubenetic.xml.h:19
-#: hacks/config/glblur.xml.h:11
-#: hacks/config/glknots.xml.h:13
-#: hacks/config/gltext.xml.h:10
-#: hacks/config/lavalite.xml.h:24
-#: hacks/config/menger.xml.h:12
-#: hacks/config/molecule.xml.h:19
+#: hacks/config/cubenetic.xml.h:19 hacks/config/glblur.xml.h:11
+#: hacks/config/glknots.xml.h:13 hacks/config/gltext.xml.h:10
+#: hacks/config/lavalite.xml.h:24 hacks/config/menger.xml.h:12
+#: hacks/config/molecule.xml.h:19 hacks/config/polyhedra.xml.h:115
 #: hacks/config/spheremonics.xml.h:15
 msgid "Rotate around Z axis"
 msgstr ""
 
 #: hacks/config/spheremonics.xml.h:15
 msgid "Rotate around Z axis"
 msgstr ""
 
-#: hacks/config/cubenetic.xml.h:20
-#: hacks/config/glblur.xml.h:12
-#: hacks/config/glknots.xml.h:14
-#: hacks/config/gltext.xml.h:11
-#: hacks/config/lavalite.xml.h:25
-#: hacks/config/menger.xml.h:13
-#: hacks/config/molecule.xml.h:20
+#: hacks/config/cubenetic.xml.h:20 hacks/config/glblur.xml.h:12
+#: hacks/config/glknots.xml.h:14 hacks/config/gltext.xml.h:11
+#: hacks/config/lavalite.xml.h:25 hacks/config/menger.xml.h:13
+#: hacks/config/molecule.xml.h:20 hacks/config/polyhedra.xml.h:116
 #: hacks/config/spheremonics.xml.h:16
 msgid "Rotate around all three axes"
 msgstr ""
 #: hacks/config/spheremonics.xml.h:16
 msgid "Rotate around all three axes"
 msgstr ""
@@ -3125,18 +2642,13 @@ msgstr ""
 msgid "Surface Pattern Speed"
 msgstr ""
 
 msgid "Surface Pattern Speed"
 msgstr ""
 
-#: 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/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/glplanet.xml.h:14
+#: 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/polyhedra.xml.h:172 hacks/config/spheremonics.xml.h:25
 #: hacks/config/wander.xml.h:15
 msgid "Wander"
 msgstr ""
 #: hacks/config/wander.xml.h:15
 msgid "Wander"
 msgstr ""
@@ -3146,13 +2658,9 @@ msgid "CubeStorm"
 msgstr ""
 
 #: hacks/config/cubestorm.xml.h:3
 msgstr ""
 
 #: 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"
+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:6
 msgstr ""
 
 #: hacks/config/cubestorm.xml.h:6
@@ -3164,7 +2672,11 @@ msgid "Strut Thickness"
 msgstr ""
 
 #: hacks/config/cynosure.xml.h:1
 msgstr ""
 
 #: hacks/config/cynosure.xml.h:1
-msgid "A hack similar to `greynetic', but less frenetic. The first implementation was by Stephen Linhart; then Ozymandias G. Desiderata wrote a Java applet clone. That clone was discovered by Jamie Zawinski, and ported to C for inclusion here."
+msgid ""
+"A hack similar to `greynetic', but less frenetic. The first implementation "
+"was by Stephen Linhart; then Ozymandias G. Desiderata wrote a Java applet "
+"clone. That clone was discovered by Jamie Zawinski, and ported to C for "
+"inclusion here."
 msgstr ""
 
 #: hacks/config/cynosure.xml.h:2
 msgstr ""
 
 #: hacks/config/cynosure.xml.h:2
@@ -3176,7 +2688,9 @@ msgid "DangerBall"
 msgstr ""
 
 #: hacks/config/dangerball.xml.h:2
 msgstr ""
 
 #: hacks/config/dangerball.xml.h:2
-msgid "Draws a ball that periodically extrudes many random spikes. Ouch! Written by Jamie Zawinski."
+msgid ""
+"Draws a ball that periodically extrudes many random spikes. Ouch! Written by "
+"Jamie Zawinski."
 msgstr ""
 
 #: hacks/config/dangerball.xml.h:7
 msgstr ""
 
 #: hacks/config/dangerball.xml.h:7
@@ -3252,15 +2766,19 @@ msgid "Stretchy Melt"
 msgstr ""
 
 #: hacks/config/decayscreen.xml.h:20
 msgstr ""
 
 #: hacks/config/decayscreen.xml.h:20
-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, Vivek Khera, Jamie Zawinski, and Vince Levey."
+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, Vivek Khera, Jamie Zawinski, and Vince Levey."
 msgstr ""
 
 #: hacks/config/deco.xml.h:3
 msgid "Deco"
 msgstr ""
 
 msgstr ""
 
 #: hacks/config/deco.xml.h:3
 msgid "Deco"
 msgstr ""
 
-#: hacks/config/deco.xml.h:6
-#: hacks/config/menger.xml.h:5
+#: hacks/config/deco.xml.h:6 hacks/config/menger.xml.h:5
 #: hacks/config/sierpinski3d.xml.h:4
 msgid "Max Depth"
 msgstr ""
 #: hacks/config/sierpinski3d.xml.h:4
 msgid "Max Depth"
 msgstr ""
@@ -3270,13 +2788,15 @@ msgid "Min Size"
 msgstr ""
 
 #: hacks/config/deco.xml.h:9
 msgstr ""
 
 #: hacks/config/deco.xml.h:9
-msgid "This one subdivides and colors rectangles randomly. It looks kind of like Brady-Bunch-era rec-room wall paneling. (Raven says: ``this screensaver is ugly enough to peel paint.'') Written by Jamie Zawinski, inspired by Java code by Michael Bayne."
+msgid ""
+"This one subdivides and colors rectangles randomly. It looks kind of like "
+"Brady-Bunch-era rec-room wall paneling. (Raven says: ``this screensaver is "
+"ugly enough to peel paint.'') Written by Jamie Zawinski, inspired by Java "
+"code by Michael Bayne."
 msgstr ""
 
 msgstr ""
 
-#: hacks/config/deco.xml.h:11
-#: hacks/config/rd-bomb.xml.h:23
-#: hacks/config/whirlygig.xml.h:20
-#: hacks/config/xearth.xml.h:33
+#: hacks/config/deco.xml.h:11 hacks/config/rd-bomb.xml.h:23
+#: hacks/config/whirlygig.xml.h:20 hacks/config/xearth.xml.h:33
 #: hacks/config/zoom.xml.h:10
 msgid "x"
 msgstr ""
 #: hacks/config/zoom.xml.h:10
 msgid "x"
 msgstr ""
@@ -3286,7 +2806,11 @@ msgid "Deluxe"
 msgstr ""
 
 #: hacks/config/deluxe.xml.h:12
 msgstr ""
 
 #: hacks/config/deluxe.xml.h:12
-msgid "This draws a pulsing sequence of stars, circles, and lines. It would look better if it was faster, but as far as I can tell, there is no way to make this be both: fast, and flicker-free. Yet another reason X sucks. Written by Jamie Zawinski."
+msgid ""
+"This draws a pulsing sequence of stars, circles, and lines. It would look "
+"better if it was faster, but as far as I can tell, there is no way to make "
+"this be both: fast, and flicker-free. Yet another reason X sucks. Written by "
+"Jamie Zawinski."
 msgstr ""
 
 #: hacks/config/deluxe.xml.h:13
 msgstr ""
 
 #: hacks/config/deluxe.xml.h:13
@@ -3294,7 +2818,9 @@ msgid "Transparency"
 msgstr ""
 
 #: hacks/config/demon.xml.h:1
 msgstr ""
 
 #: hacks/config/demon.xml.h:1
-msgid "A cellular automaton that starts with a random field, and organizes it into stripes and spirals. Written by David Bagley."
+msgid ""
+"A cellular automaton that starts with a random field, and organizes it into "
+"stripes and spirals. Written by David Bagley."
 msgstr ""
 
 #: hacks/config/demon.xml.h:3
 msgstr ""
 
 #: hacks/config/demon.xml.h:3
@@ -3310,7 +2836,9 @@ msgid "Discrete"
 msgstr ""
 
 #: hacks/config/discrete.xml.h:5
 msgstr ""
 
 #: hacks/config/discrete.xml.h:5
-msgid "More ``discrete map'' systems, including new variants of Hopalong and Julia, and a few others. Written by Tim Auckland."
+msgid ""
+"More ``discrete map'' systems, including new variants of Hopalong and Julia, "
+"and a few others. Written by Tim Auckland."
 msgstr ""
 
 #: hacks/config/distort.xml.h:1
 msgstr ""
 
 #: hacks/config/distort.xml.h:1
@@ -3346,17 +2874,16 @@ msgid "Swamp Thing"
 msgstr ""
 
 #: hacks/config/distort.xml.h:15
 msgstr ""
 
 #: hacks/config/distort.xml.h:15
-msgid "This hack grabs an image of the screen, and then lets a transparent lens wander around the screen, magnifying whatever is underneath. Written by Jonas Munsin."
+msgid ""
+"This hack grabs an image of the screen, and then lets a transparent lens "
+"wander around the screen, magnifying whatever is underneath. Written by "
+"Jonas Munsin."
 msgstr ""
 
 msgstr ""
 
-#: hacks/config/distort.xml.h:16
-#: hacks/config/moire.xml.h:12
-#: hacks/config/rd-bomb.xml.h:21
-#: hacks/config/ripples.xml.h:15
-#: hacks/config/rotzoomer.xml.h:10
-#: hacks/config/swirl.xml.h:10
-#: hacks/config/twang.xml.h:15
-#: hacks/config/xflame.xml.h:7
+#: hacks/config/distort.xml.h:16 hacks/config/moire.xml.h:12
+#: hacks/config/rd-bomb.xml.h:21 hacks/config/ripples.xml.h:15
+#: 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 ""
 
 msgid "Use Shared Memory"
 msgstr ""
 
@@ -3377,7 +2904,10 @@ msgid "High Dimensional Sphere"
 msgstr ""
 
 #: hacks/config/drift.xml.h:6
 msgstr ""
 
 #: hacks/config/drift.xml.h:6
-msgid "How could one possibly describe this except as ``drifting recursive fractal cosmic flames?'' Another fine hack from the Scott Draves collection of fine hacks."
+msgid ""
+"How could one possibly describe this except as ``drifting recursive fractal "
+"cosmic flames?'' Another fine hack from the Scott Draves collection of fine "
+"hacks."
 msgstr ""
 
 #: hacks/config/drift.xml.h:7
 msgstr ""
 
 #: hacks/config/drift.xml.h:7
@@ -3389,7 +2919,14 @@ msgid "ElectricSheep"
 msgstr ""
 
 #: hacks/config/electricsheep.xml.h:2
 msgstr ""
 
 #: 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, always-on connection to the Internet. By Scott Draves. You can find it at &lt;http://www.electricsheep.org/&gt;."
+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, 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:3
 msgstr ""
 
 #: hacks/config/electricsheep.xml.h:3
@@ -3421,7 +2958,9 @@ msgid "URL"
 msgstr ""
 
 #: hacks/config/endgame.xml.h:1
 msgstr ""
 
 #: hacks/config/endgame.xml.h:1
-msgid "Black slips out of three mating nets, but the fourth one holds him tight! A brilliant composition! Written by Blair Tennessy."
+msgid ""
+"Black slips out of three mating nets, but the fourth one holds him tight! A "
+"brilliant composition! Written by Blair Tennessy."
 msgstr ""
 
 #: hacks/config/endgame.xml.h:2
 msgstr ""
 
 #: hacks/config/endgame.xml.h:2
@@ -3449,7 +2988,9 @@ msgid "Dodge Viper (10 cylinders, V)"
 msgstr ""
 
 #: hacks/config/engine.xml.h:6
 msgstr ""
 
 #: hacks/config/engine.xml.h:6
-msgid "Draws a simple model of an engine that floats around the screen. Written by Ben Buxton and Ed Beroset."
+msgid ""
+"Draws a simple model of an engine that floats around the screen. Written by "
+"Ben Buxton and Ed Beroset."
 msgstr ""
 
 #: hacks/config/engine.xml.h:7
 msgstr ""
 
 #: hacks/config/engine.xml.h:7
@@ -3493,7 +3034,11 @@ msgid "Harmonics"
 msgstr ""
 
 #: hacks/config/epicycle.xml.h:12
 msgstr ""
 
 #: hacks/config/epicycle.xml.h:12
-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, several times. These were the basis for the pre-heliocentric model of planetary motion. Written by James Youngman."
+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, "
+"several times. These were the basis for the pre-heliocentric model of "
+"planetary motion. Written by James Youngman."
 msgstr ""
 
 #: hacks/config/eruption.xml.h:1
 msgstr ""
 
 #: hacks/config/eruption.xml.h:1
@@ -3508,10 +3053,8 @@ msgstr ""
 msgid "Eruption"
 msgstr ""
 
 msgid "Eruption"
 msgstr ""
 
-#: hacks/config/eruption.xml.h:7
-#: hacks/config/fluidballs.xml.h:9
-#: hacks/config/qix.xml.h:9
-#: hacks/config/speedmine.xml.h:4
+#: 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 ""
 
 msgid "Gravity"
 msgstr ""
 
@@ -3547,8 +3090,7 @@ msgstr ""
 msgid "Euler2d"
 msgstr ""
 
 msgid "Euler2d"
 msgstr ""
 
-#: hacks/config/euler2d.xml.h:10
-#: hacks/config/whirlwindwarp.xml.h:5
+#: hacks/config/euler2d.xml.h:10 hacks/config/whirlwindwarp.xml.h:5
 msgid "Particles"
 msgstr ""
 
 msgid "Particles"
 msgstr ""
 
@@ -3557,11 +3099,16 @@ msgid "Power"
 msgstr ""
 
 #: hacks/config/euler2d.xml.h:13
 msgstr ""
 
 #: hacks/config/euler2d.xml.h:13
-msgid "Simulates two dimensional Incompressible Inviscid Fluid Flow. Written by Stephen Montgomery-Smith."
+msgid ""
+"Simulates two dimensional Incompressible Inviscid Fluid Flow. Written by "
+"Stephen Montgomery-Smith."
 msgstr ""
 
 #: hacks/config/extrusion.xml.h:1
 msgstr ""
 
 #: hacks/config/extrusion.xml.h:1
-msgid "Draws various rotating extruded shapes that twist around, lengthen, and turn inside out. Created by David Konerding from the samples that come with the GL Extrusion library by Linas Vepstas."
+msgid ""
+"Draws various rotating extruded shapes that twist around, lengthen, and turn "
+"inside out. Created by David Konerding from the samples that come with the "
+"GL Extrusion library by Linas Vepstas."
 msgstr ""
 
 #: hacks/config/extrusion.xml.h:2
 msgstr ""
 
 #: hacks/config/extrusion.xml.h:2
@@ -3584,8 +3131,7 @@ msgstr ""
 msgid "Join Offset"
 msgstr ""
 
 msgid "Join Offset"
 msgstr ""
 
-#: hacks/config/extrusion.xml.h:8
-#: hacks/config/polytopes.xml.h:16
+#: hacks/config/extrusion.xml.h:8 hacks/config/polytopes.xml.h:16
 msgid "Random Object"
 msgstr ""
 
 msgid "Random Object"
 msgstr ""
 
@@ -3605,19 +3151,19 @@ msgstr ""
 msgid "Twistoid"
 msgstr ""
 
 msgid "Twistoid"
 msgstr ""
 
-#: hacks/config/extrusion.xml.h:17
-#: hacks/config/glplanet.xml.h:9
+#: hacks/config/extrusion.xml.h:17 hacks/config/glplanet.xml.h:12
 #: hacks/config/pulsar.xml.h:19
 msgid "Use Flat Coloring"
 msgstr ""
 
 #: hacks/config/pulsar.xml.h:19
 msgid "Use Flat Coloring"
 msgstr ""
 
-#: hacks/config/extrusion.xml.h:18
-#: hacks/config/glplanet.xml.h:10
+#: hacks/config/extrusion.xml.h:18 hacks/config/glplanet.xml.h:13
 msgid "Use Lighting"
 msgstr ""
 
 #: hacks/config/fadeplot.xml.h:2
 msgid "Use Lighting"
 msgstr ""
 
 #: 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."
+msgid ""
+"Draws what looks like a waving ribbon following a sinusoidal path. Written "
+"by Bas van Gaalen and Charles Vidal."
 msgstr ""
 
 #: hacks/config/fadeplot.xml.h:3
 msgstr ""
 
 #: hacks/config/fadeplot.xml.h:3
@@ -3629,7 +3175,12 @@ msgid "10 times"
 msgstr ""
 
 #: hacks/config/fireflies.xml.h:2
 msgstr ""
 
 #: 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;."
+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
 msgstr ""
 
 #: hacks/config/fireflies.xml.h:3
@@ -3688,12 +3239,11 @@ msgstr ""
 msgid "Half"
 msgstr ""
 
 msgid "Half"
 msgstr ""
 
-#: hacks/config/fireflies.xml.h:17
+#: hacks/config/fireflies.xml.h:17 hacks/config/pinion.xml.h:7
 msgid "Huge"
 msgstr ""
 
 msgid "Huge"
 msgstr ""
 
-#: hacks/config/fireflies.xml.h:18
-#: hacks/config/fluidballs.xml.h:10
+#: hacks/config/fireflies.xml.h:18 hacks/config/fluidballs.xml.h:10
 msgid "Hurricane"
 msgstr ""
 
 msgid "Hurricane"
 msgstr ""
 
@@ -3753,8 +3303,7 @@ msgstr ""
 msgid "Split a swarm"
 msgstr ""
 
 msgid "Split a swarm"
 msgstr ""
 
-#: hacks/config/fireflies.xml.h:36
-#: hacks/config/fluidballs.xml.h:21
+#: hacks/config/fireflies.xml.h:36 hacks/config/fluidballs.xml.h:21
 #: hacks/config/glforestfire.xml.h:16
 msgid "Still"
 msgstr ""
 #: hacks/config/glforestfire.xml.h:16
 msgid "Still"
 msgstr ""
@@ -3779,7 +3328,7 @@ msgstr ""
 msgid "Swarm tails glow"
 msgstr ""
 
 msgid "Swarm tails glow"
 msgstr ""
 
-#: hacks/config/fireflies.xml.h:43
+#: hacks/config/fireflies.xml.h:43 hacks/config/pinion.xml.h:14
 msgid "Tiny"
 msgstr ""
 
 msgid "Tiny"
 msgstr ""
 
@@ -3787,8 +3336,7 @@ msgstr ""
 msgid "Wide"
 msgstr ""
 
 msgid "Wide"
 msgstr ""
 
-#: hacks/config/fireflies.xml.h:45
-#: hacks/config/fluidballs.xml.h:23
+#: hacks/config/fireflies.xml.h:45 hacks/config/fluidballs.xml.h:23
 msgid "Wind"
 msgstr ""
 
 msgid "Wind"
 msgstr ""
 
@@ -3796,6 +3344,30 @@ msgstr ""
 msgid "Wind picks up"
 msgstr ""
 
 msgid "Wind picks up"
 msgstr ""
 
+#: hacks/config/fireworkx.xml.h:1 hacks/config/lavalite.xml.h:3
+msgid "Activity"
+msgstr ""
+
+#: hacks/config/fireworkx.xml.h:4
+msgid "Fast Fade (more realistic)"
+msgstr ""
+
+#: hacks/config/fireworkx.xml.h:5
+msgid "Fireworkx"
+msgstr ""
+
+#: hacks/config/fireworkx.xml.h:6
+msgid "Light effect"
+msgstr ""
+
+#: hacks/config/fireworkx.xml.h:7
+msgid "Pyrotechnics simulation eye-candy. Written by Rony B. Chandran."
+msgstr ""
+
+#: hacks/config/fireworkx.xml.h:8
+msgid "Shoot"
+msgstr ""
+
 #: hacks/config/flag.xml.h:1
 msgid "Bitmap for Flag"
 msgstr ""
 #: hacks/config/flag.xml.h:1
 msgid "Bitmap for Flag"
 msgstr ""
@@ -3809,21 +3381,22 @@ msgid "Text for Flag"
 msgstr ""
 
 #: hacks/config/flag.xml.h:11
 msgstr ""
 
 #: hacks/config/flag.xml.h:11
-msgid "This draws a waving colored flag, that undulates its way around the screen. The trick is the flag can contain arbitrary text and images. By default, it displays either the current system name and OS type, or a picture of ``Bob,'' but you can replace the text or the image with a command-line option. Written by Charles Vidal and Jamie Zawinski."
+msgid ""
+"This draws a waving colored flag, that undulates its way around the screen. "
+"The trick is the flag can contain arbitrary text and images. By default, it "
+"displays either the current system name and OS type, or a picture of "
+"``Bob,'' but you can replace the text or the image with a command-line "
+"option. Written by Charles Vidal and Jamie Zawinski."
 msgstr ""
 
 msgstr ""
 
-#: hacks/config/flame.xml.h:1
-#: hacks/config/jigsaw.xml.h:1
-#: hacks/config/maze.xml.h:1
-#: hacks/config/rotzoomer.xml.h:1
+#: hacks/config/flame.xml.h:1 hacks/config/jigsaw.xml.h:1
+#: hacks/config/maze.xml.h:1 hacks/config/rotzoomer.xml.h:1
 #: hacks/config/wander.xml.h:1
 msgid "0 Seconds"
 msgstr ""
 
 #: hacks/config/wander.xml.h:1
 msgid "0 Seconds"
 msgstr ""
 
-#: hacks/config/flame.xml.h:2
-#: hacks/config/gleidescope.xml.h:1
-#: hacks/config/glslideshow.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
 #: hacks/config/mirrorblob.xml.h:1
 msgid "10 Seconds"
 msgstr ""
 #: hacks/config/mirrorblob.xml.h:1
 msgid "10 Seconds"
 msgstr ""
@@ -3832,8 +3405,7 @@ msgstr ""
 msgid "Another iterative fractal generator. Written by Scott Draves."
 msgstr ""
 
 msgid "Another iterative fractal generator. Written by Scott Draves."
 msgstr ""
 
-#: hacks/config/flame.xml.h:4
-#: hacks/config/jigglypuff.xml.h:4
+#: hacks/config/flame.xml.h:4 hacks/config/jigglypuff.xml.h:4
 msgid "Complexity"
 msgstr ""
 
 msgid "Complexity"
 msgstr ""
 
@@ -3850,7 +3422,9 @@ msgid "FlipFlop"
 msgstr ""
 
 #: hacks/config/flipflop.xml.h:3
 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."
+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
 msgstr ""
 
 #: hacks/config/flipflop.xml.h:6
@@ -3862,43 +3436,47 @@ msgid "Flipscreen3d"
 msgstr ""
 
 #: hacks/config/flipscreen3d.xml.h:3
 msgstr ""
 
 #: hacks/config/flipscreen3d.xml.h:3
-msgid "Grabs an image of the desktop, turns it into a GL texture map, and spins it around and deforms it in various ways. Written by Ben Buxton."
+msgid ""
+"Grabs an image of the desktop, turns it into a GL texture map, and spins it "
+"around and deforms it in various ways. Written by Ben Buxton."
 msgstr ""
 
 msgstr ""
 
-#: hacks/config/flow.xml.h:1
-msgid "Allow 2D Attractors"
+#: hacks/config/flow.xml.h:3
+msgid "Flow"
 msgstr ""
 
 msgstr ""
 
-#: hacks/config/flow.xml.h:2
-msgid "Another series of strange attractors: a flowing series of points, making strange rotational shapes. Written by Jeff Butterworth."
+#: hacks/config/flow.xml.h:5
+msgid "Length of trails"
 msgstr ""
 
 msgstr ""
 
-#: hacks/config/flow.xml.h:5
-msgid "Flow"
+#: hacks/config/flow.xml.h:13
+msgid ""
+"Strange attractors formed of flows in a 3D differential equation phase "
+"space. Written by Tim Auckland."
 msgstr ""
 
 msgstr ""
 
-#: hacks/config/flow.xml.h:6
-msgid "Freeze Some Bees"
+#: hacks/config/flow.xml.h:16
+msgid "turn on/off bounding box."
 msgstr ""
 
 msgstr ""
 
-#: hacks/config/flow.xml.h:10
-msgid "Ride a Trained Bee"
+#: hacks/config/flow.xml.h:17
+msgid "turn on/off double buffering."
 msgstr ""
 
 msgstr ""
 
-#: hacks/config/flow.xml.h:11
-msgid "Rotate Around Attractor"
+#: hacks/config/flow.xml.h:18
+msgid "turn on/off periodic attractors."
 msgstr ""
 
 msgstr ""
 
-#: hacks/config/flow.xml.h:12
-msgid "Show Bounding Box"
+#: hacks/config/flow.xml.h:19
+msgid "turn on/off ride in the flow."
 msgstr ""
 
 msgstr ""
 
-#: hacks/config/flow.xml.h:14
-msgid "Slow Bees with Antifreeze"
+#: hacks/config/flow.xml.h:20
+msgid "turn on/off rotating around attractor."
 msgstr ""
 
 msgstr ""
 
-#: hacks/config/flow.xml.h:19
-msgid "Zoom In and Out"
+#: hacks/config/flow.xml.h:21
+msgid "turn on/off search for new attractors."
 msgstr ""
 
 #: hacks/config/fluidballs.xml.h:1
 msgstr ""
 
 #: hacks/config/fluidballs.xml.h:1
@@ -3917,8 +3495,7 @@ msgstr ""
 msgid "FluidBalls"
 msgstr ""
 
 msgid "FluidBalls"
 msgstr ""
 
-#: hacks/config/fluidballs.xml.h:8
-#: hacks/config/twang.xml.h:4
+#: hacks/config/fluidballs.xml.h:8 hacks/config/twang.xml.h:4
 msgid "Friction"
 msgstr ""
 
 msgid "Friction"
 msgstr ""
 
@@ -3927,7 +3504,11 @@ msgid "Jupiter"
 msgstr ""
 
 #: hacks/config/fluidballs.xml.h:14
 msgstr ""
 
 #: hacks/config/fluidballs.xml.h:14
-msgid "Models the physics of bouncing balls, or of particles in a gas or fluid, depending on the settings. If \"Shake Box\" is selected, then every now and then, the box will be rotated, changing which direction is down (in order to keep the settled balls in motion.) By Peter Birtles and Jamie Zawinski."
+msgid ""
+"Models the physics of bouncing balls, or of particles in a gas or fluid, "
+"depending on the settings. If \"Shake Box\" is selected, then every now and "
+"then, the box will be rotated, changing which direction is down (in order to "
+"keep the settled balls in motion.) By Peter Birtles and Jamie Zawinski."
 msgstr ""
 
 #: hacks/config/fluidballs.xml.h:15
 msgstr ""
 
 #: hacks/config/fluidballs.xml.h:15
@@ -3970,16 +3551,18 @@ msgstr ""
 msgid "RGB"
 msgstr ""
 
 msgid "RGB"
 msgstr ""
 
-#: 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/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 ""
 
 #: hacks/config/flurry.xml.h:10
 #: hacks/config/whirlygig.xml.h:12
 msgid "Random"
 msgstr ""
 
 #: 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"
+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
 msgstr ""
 
 #: hacks/config/flurry.xml.h:11
@@ -3987,7 +3570,10 @@ msgid "Water"
 msgstr ""
 
 #: hacks/config/flyingtoasters.xml.h:1
 msgstr ""
 
 #: 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."
+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
 msgstr ""
 
 #: hacks/config/flyingtoasters.xml.h:2
@@ -4002,12 +3588,9 @@ msgstr ""
 msgid "Flying Toasters"
 msgstr ""
 
 msgid "Flying Toasters"
 msgstr ""
 
-#: 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/mirrorblob.xml.h:16
-#: hacks/config/pipes.xml.h:10
+#: 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/mirrorblob.xml.h:16 hacks/config/pipes.xml.h:10
 msgid "None"
 msgstr ""
 
 msgid "None"
 msgstr ""
 
@@ -4048,7 +3631,10 @@ msgid "Pages of text"
 msgstr ""
 
 #: hacks/config/fontglide.xml.h:11
 msgstr ""
 
 #: 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."
+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
 msgstr ""
 
 #: hacks/config/fontglide.xml.h:14
@@ -4059,35 +3645,60 @@ msgstr ""
 msgid "Vapor Trails"
 msgstr ""
 
 msgid "Vapor Trails"
 msgstr ""
 
-#: hacks/config/forest.xml.h:2
-#: hacks/config/glforestfire.xml.h:6
+#: hacks/config/forest.xml.h:2 hacks/config/glforestfire.xml.h:6
 msgid "Forest"
 msgstr ""
 
 #: hacks/config/forest.xml.h:7
 msgid "Forest"
 msgstr ""
 
 #: hacks/config/forest.xml.h:7
-msgid "This draws fractal trees. Written by Peter Baumung. Everybody loves fractals, right?"
+msgid ""
+"This draws fractal trees. Written by Peter Baumung. Everybody loves "
+"fractals, right?"
+msgstr ""
+
+#: hacks/config/fuzzyflakes.xml.h:2
+msgid "Border Thickness"
+msgstr ""
+
+#: hacks/config/fuzzyflakes.xml.h:6
+msgid ""
+"Falling colored snowflake/flower shapes. Inspired by the credits of the "
+"anime \"Azumanga Daioh\". Written by Barry Dmytro."
+msgstr ""
+
+#: hacks/config/fuzzyflakes.xml.h:9
+msgid "FuzzyFlakes"
+msgstr ""
+
+#: hacks/config/fuzzyflakes.xml.h:11 hacks/config/xspirograph.xml.h:4
+msgid "Layers"
+msgstr ""
+
+#: hacks/config/fuzzyflakes.xml.h:14
+msgid "Random Colors"
 msgstr ""
 
 #: hacks/config/galaxy.xml.h:4
 msgid "Galaxy"
 msgstr ""
 
 msgstr ""
 
 #: hacks/config/galaxy.xml.h:4
 msgid "Galaxy"
 msgstr ""
 
-#: 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/pong.xml.h:3
-#: 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/galaxy.xml.h:8
+msgid "Rotate Viewpoint"
+msgstr ""
+
+#: hacks/config/galaxy.xml.h:10 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/pong.xml.h:3
+#: 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 ""
 
 #: hacks/config/worm.xml.h:6
 msgid "Size"
 msgstr ""
 
-#: hacks/config/galaxy.xml.h:12
-msgid "This draws spinning galaxies, which then collide and scatter their stars to the, uh, four winds or something. Originally an Amiga program by Uli Siegmund."
+#: hacks/config/galaxy.xml.h:13
+msgid ""
+"This draws spinning galaxies, which then collide and scatter their stars to "
+"the, uh, four winds or something. Originally an Amiga program by Uli "
+"Siegmund."
 msgstr ""
 
 #: hacks/config/gears.xml.h:3
 msgstr ""
 
 #: hacks/config/gears.xml.h:3
@@ -4098,13 +3709,15 @@ msgstr ""
 msgid "Planetary Gear System"
 msgstr ""
 
 msgid "Planetary Gear System"
 msgstr ""
 
-#: hacks/config/gears.xml.h:5
-#: hacks/config/goop.xml.h:9
+#: hacks/config/gears.xml.h:5 hacks/config/goop.xml.h:9
 msgid "Rotational Speed"
 msgstr ""
 
 #: hacks/config/gears.xml.h:9
 msgid "Rotational Speed"
 msgstr ""
 
 #: hacks/config/gears.xml.h:9
-msgid "This draws sets of turning, interlocking gears, rotating in three dimensions. Another GL hack, by Danny Sung, Brian Paul, Ed Mackey, and Jamie Zawinski."
+msgid ""
+"This draws sets of turning, interlocking gears, rotating in three "
+"dimensions. Another GL hack, by Danny Sung, Brian Paul, Ed Mackey, and Jamie "
+"Zawinski."
 msgstr ""
 
 #: hacks/config/gears.xml.h:10
 msgstr ""
 
 #: hacks/config/gears.xml.h:10
@@ -4116,7 +3729,9 @@ msgid "Checkerboard"
 msgstr ""
 
 #: hacks/config/gflux.xml.h:5
 msgstr ""
 
 #: hacks/config/gflux.xml.h:5
-msgid "Draws a rippling waves on a rotating wireframe grid, using GL. Written by Josiah Pease."
+msgid ""
+"Draws a rippling waves on a rotating wireframe grid, using GL. Written by "
+"Josiah Pease."
 msgstr ""
 
 #: hacks/config/gflux.xml.h:7
 msgstr ""
 
 #: hacks/config/gflux.xml.h:7
@@ -4135,13 +3750,11 @@ msgstr ""
 msgid "Screen Image"
 msgstr "Näytön kuva"
 
 msgid "Screen Image"
 msgstr "Näytön kuva"
 
-#: hacks/config/gflux.xml.h:14
-#: hacks/config/interference.xml.h:21
+#: hacks/config/gflux.xml.h:14 hacks/config/interference.xml.h:21
 msgid "Wave Speed"
 msgstr ""
 
 msgid "Wave Speed"
 msgstr ""
 
-#: hacks/config/gflux.xml.h:15
-#: hacks/config/glmatrix.xml.h:20
+#: hacks/config/gflux.xml.h:15 hacks/config/glmatrix.xml.h:20
 msgid "Waves"
 msgstr ""
 
 msgid "Waves"
 msgstr ""
 
@@ -4158,17 +3771,25 @@ msgid "GLBlur"
 msgstr ""
 
 #: hacks/config/glblur.xml.h:18
 msgstr ""
 
 #: 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."
+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 ""
 
 msgstr ""
 
-#: hacks/config/gleidescope.xml.h:2
-#: hacks/config/glslideshow.xml.h:6
+#: hacks/config/gleidescope.xml.h:2 hacks/config/glslideshow.xml.h:6
 #: hacks/config/mirrorblob.xml.h:3
 msgid "5 Minutes"
 msgstr ""
 
 #: hacks/config/gleidescope.xml.h:3
 #: hacks/config/mirrorblob.xml.h:3
 msgid "5 Minutes"
 msgstr ""
 
 #: hacks/config/gleidescope.xml.h:3
-msgid "An OpenGL kaleidescope that operates on your desktop image, or on image files loaded from disk. Written by andrew dean."
+msgid ""
+"An OpenGL kaleidescope that operates on your desktop image, or on image "
+"files loaded from disk. Written by andrew dean."
 msgstr ""
 
 #: hacks/config/gleidescope.xml.h:4
 msgstr ""
 
 #: hacks/config/gleidescope.xml.h:4
@@ -4191,10 +3812,8 @@ msgstr ""
 msgid "Size of tube"
 msgstr ""
 
 msgid "Size of tube"
 msgstr ""
 
-#: hacks/config/gleidescope.xml.h:13
-#: hacks/config/hyperball.xml.h:16
-#: hacks/config/hypercube.xml.h:16
-#: hacks/config/zoom.xml.h:8
+#: 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 ""
 
 msgid "Zoom"
 msgstr ""
 
@@ -4203,11 +3822,14 @@ msgid "Desert"
 msgstr ""
 
 #: hacks/config/glforestfire.xml.h:3
 msgstr ""
 
 #: hacks/config/glforestfire.xml.h:3
-msgid "Draws an animation of sprinkling fire-like 3D triangles in a landscape filled with trees. Requires OpenGL, and a machine with fast hardware support for texture maps. Written by Eric Lassauge &lt;lassauge@free.fr&gt;."
+msgid ""
+"Draws an animation of sprinkling fire-like 3D triangles in a landscape "
+"filled with trees. Requires OpenGL, and a machine with fast hardware support "
+"for texture maps. Written by Eric Lassauge &lt;lassauge@users.sourceforge."
+"net&gt;."
 msgstr ""
 
 msgstr ""
 
-#: hacks/config/glforestfire.xml.h:5
-#: hacks/config/glmatrix.xml.h:9
+#: hacks/config/glforestfire.xml.h:5 hacks/config/glmatrix.xml.h:9
 msgid "Fog"
 msgstr ""
 
 msgid "Fog"
 msgstr ""
 
@@ -4240,11 +3862,12 @@ msgid "GLKnots"
 msgstr ""
 
 #: hacks/config/glknots.xml.h:5
 msgstr ""
 
 #: hacks/config/glknots.xml.h:5
-msgid "Generates some twisting 3d knot patterns. Spins 'em around. Written by Jamie Zawinski."
+msgid ""
+"Generates some twisting 3d knot patterns. Spins 'em around. Written by Jamie "
+"Zawinski."
 msgstr ""
 
 msgstr ""
 
-#: hacks/config/glknots.xml.h:7
-#: hacks/config/lavalite.xml.h:17
+#: hacks/config/glknots.xml.h:7 hacks/config/lavalite.xml.h:17
 #: hacks/config/spheremonics.xml.h:9
 msgid "Resolution"
 msgstr ""
 #: hacks/config/spheremonics.xml.h:9
 msgid "Resolution"
 msgstr ""
@@ -4253,13 +3876,12 @@ msgstr ""
 msgid "Segmented"
 msgstr ""
 
 msgid "Segmented"
 msgstr ""
 
-#: hacks/config/glknots.xml.h:18
-#: hacks/config/lavalite.xml.h:28
+#: hacks/config/glknots.xml.h:18 hacks/config/lavalite.xml.h:28
+#: hacks/config/xmountains.xml.h:25
 msgid "Smooth"
 msgstr ""
 
 msgid "Smooth"
 msgstr ""
 
-#: hacks/config/glmatrix.xml.h:2
-#: hacks/config/xmatrix.xml.h:1
+#: hacks/config/glmatrix.xml.h:2 hacks/config/xmatrix.xml.h:1
 msgid "Binary Encoding"
 msgstr ""
 
 msgid "Binary Encoding"
 msgstr ""
 
@@ -4276,15 +3898,18 @@ msgid "Draw Solid Boxes"
 msgstr ""
 
 #: hacks/config/glmatrix.xml.h:7
 msgstr ""
 
 #: hacks/config/glmatrix.xml.h:7
-msgid "Draws 3D dropping characters similar to what is seen in the title sequence of \"The Matrix\". See also \"xmatrix\" for a 2D rendering of the similar effect that appeared on the computer monitors actually *in* the movie. Written by Jamie Zawinski."
+msgid ""
+"Draws 3D dropping characters similar to what is seen in the title sequence "
+"of \"The Matrix\". See also \"xmatrix\" for a 2D rendering of the similar "
+"effect that appeared on the computer monitors actually *in* the movie. "
+"Written by Jamie Zawinski."
 msgstr ""
 
 #: hacks/config/glmatrix.xml.h:10
 msgid "GLMatrix"
 msgstr ""
 
 msgstr ""
 
 #: hacks/config/glmatrix.xml.h:10
 msgid "GLMatrix"
 msgstr ""
 
-#: hacks/config/glmatrix.xml.h:11
-#: hacks/config/xmatrix.xml.h:7
+#: hacks/config/glmatrix.xml.h:11 hacks/config/xmatrix.xml.h:7
 msgid "Genetic Encoding"
 msgstr ""
 
 msgid "Genetic Encoding"
 msgstr ""
 
@@ -4296,13 +3921,11 @@ msgstr ""
 msgid "Glyph Speed"
 msgstr ""
 
 msgid "Glyph Speed"
 msgstr ""
 
-#: hacks/config/glmatrix.xml.h:14
-#: hacks/config/xmatrix.xml.h:8
+#: hacks/config/glmatrix.xml.h:14 hacks/config/xmatrix.xml.h:8
 msgid "Hexadecimal Encoding"
 msgstr ""
 
 msgid "Hexadecimal Encoding"
 msgstr ""
 
-#: hacks/config/glmatrix.xml.h:15
-#: hacks/config/xmatrix.xml.h:11
+#: hacks/config/glmatrix.xml.h:15 hacks/config/xmatrix.xml.h:11
 msgid "Matrix Encoding"
 msgstr ""
 
 msgid "Matrix Encoding"
 msgstr ""
 
@@ -4311,7 +3934,11 @@ msgid "Panning"
 msgstr ""
 
 #: hacks/config/glplanet.xml.h:1
 msgstr ""
 
 #: hacks/config/glplanet.xml.h:1
-msgid "Draws a planet bouncing around in space. Written by David Konerding. The built-in image is a map of the earth (extracted from `xearth'), but you can wrap any texture around the sphere, e.g., the planetary textures that come with `ssystem'."
+msgid ""
+"Draws a planet bouncing around in space. Written by David Konerding. The "
+"built-in image is a map of the earth (extracted from `xearth'), but you can "
+"wrap any texture around the sphere, e.g., the planetary textures that come "
+"with `ssystem'."
 msgstr ""
 
 #: hacks/config/glplanet.xml.h:3
 msgstr ""
 
 #: hacks/config/glplanet.xml.h:3
@@ -4322,17 +3949,18 @@ msgstr ""
 msgid "Image File"
 msgstr ""
 
 msgid "Image File"
 msgstr ""
 
-#: hacks/config/glslideshow.xml.h:4
-#: hacks/config/rd-bomb.xml.h:5
+#: hacks/config/glplanet.xml.h:5
+msgid "Roll"
+msgstr ""
+
+#: hacks/config/glslideshow.xml.h:4 hacks/config/rd-bomb.xml.h:5
 #: hacks/config/xplanet.xml.h:4
 #, no-c-format
 msgid "100%"
 msgstr ""
 
 #: hacks/config/xplanet.xml.h:4
 #, no-c-format
 msgid "100%"
 msgstr ""
 
-#: hacks/config/glslideshow.xml.h:5
-#: hacks/config/glsnake.xml.h:2
-#: hacks/config/mirrorblob.xml.h:2
-#: hacks/config/penrose.xml.h:2
+#: hacks/config/glslideshow.xml.h:5 hacks/config/glsnake.xml.h:2
+#: hacks/config/mirrorblob.xml.h:2 hacks/config/penrose.xml.h:2
 msgid "30 Seconds"
 msgstr ""
 
 msgid "30 Seconds"
 msgstr ""
 
@@ -4345,8 +3973,7 @@ msgstr ""
 msgid "Always show at least this much of the image:"
 msgstr ""
 
 msgid "Always show at least this much of the image:"
 msgstr ""
 
-#: hacks/config/glslideshow.xml.h:10
-#: hacks/config/mirrorblob.xml.h:6
+#: hacks/config/glslideshow.xml.h:10 hacks/config/mirrorblob.xml.h:6
 msgid "Crossfade Duration:"
 msgstr ""
 
 msgid "Crossfade Duration:"
 msgstr ""
 
@@ -4359,7 +3986,15 @@ msgid "GLSlideshow"
 msgstr ""
 
 #: hacks/config/glslideshow.xml.h:14
 msgstr ""
 
 #: 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. 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."
+msgid ""
+"Loads a random sequence of images and smoothly scans and zooms around in "
+"each, fading from pan to pan. 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 tab at the top of the *other* window.) 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
 msgstr ""
 
 #: hacks/config/glslideshow.xml.h:17
@@ -4370,13 +4005,11 @@ msgstr ""
 msgid "Show Image Titles"
 msgstr ""
 
 msgid "Show Image Titles"
 msgstr ""
 
-#: hacks/config/glslideshow.xml.h:20
-#: hacks/config/mirrorblob.xml.h:22
+#: hacks/config/glslideshow.xml.h:20 hacks/config/mirrorblob.xml.h:22
 msgid "Time until loading a new image:"
 msgstr ""
 
 msgid "Time until loading a new image:"
 msgstr ""
 
-#: hacks/config/glsnake.xml.h:1
-#: hacks/config/lavalite.xml.h:1
+#: hacks/config/glsnake.xml.h:1 hacks/config/lavalite.xml.h:1
 msgid "1"
 msgstr ""
 
 msgid "1"
 msgstr ""
 
@@ -4385,7 +4018,9 @@ msgid "Angular Velocity"
 msgstr ""
 
 #: hacks/config/glsnake.xml.h:4
 msgstr ""
 
 #: hacks/config/glsnake.xml.h:4
-msgid "Draws a simulation of the Rubik's Snake puzzle. Written by Jamie Wilkinson, Andrew Bennetts, and Peter Aylett."
+msgid ""
+"Draws a simulation of the Rubik's Snake puzzle. Written by Jamie Wilkinson, "
+"Andrew Bennetts, and Peter Aylett."
 msgstr ""
 
 #: hacks/config/glsnake.xml.h:7
 msgstr ""
 
 #: hacks/config/glsnake.xml.h:7
@@ -4417,15 +4052,16 @@ msgid "Z Angular Velocity"
 msgstr ""
 
 #: hacks/config/gltext.xml.h:1
 msgstr ""
 
 #: hacks/config/gltext.xml.h:1
-msgid "Displays a few lines of text spinning around in a solid 3D font. Written by Jamie Zawinski."
+msgid ""
+"Displays a few lines of text spinning around in a solid 3D font. Written by "
+"Jamie Zawinski."
 msgstr ""
 
 #: hacks/config/gltext.xml.h:4
 msgid "GLText"
 msgstr ""
 
 msgstr ""
 
 #: hacks/config/gltext.xml.h:4
 msgid "GLText"
 msgstr ""
 
-#: hacks/config/gltext.xml.h:16
-#: hacks/config/noseguy.xml.h:5
+#: hacks/config/gltext.xml.h:16 hacks/config/noseguy.xml.h:5
 msgid "Text"
 msgstr ""
 
 msgid "Text"
 msgstr ""
 
@@ -4434,7 +4070,9 @@ msgid "Goban"
 msgstr ""
 
 #: hacks/config/goban.xml.h:2
 msgstr ""
 
 #: hacks/config/goban.xml.h:2
-msgid "Replays historical games of go (aka wei-chi and baduk) on the screen. By Scott Draves. You can find it at &lt;http://www.draves.org/goban/&gt;."
+msgid ""
+"Replays historical games of go (aka wei-chi and baduk) on the screen. By "
+"Scott Draves. You can find it at &lt;http://www.draves.org/goban/&gt;."
 msgstr ""
 
 #: hacks/config/goop.xml.h:1
 msgstr ""
 
 #: hacks/config/goop.xml.h:1
@@ -4466,7 +4104,14 @@ msgid "Subtractive Colors (transmitted light)"
 msgstr ""
 
 #: hacks/config/goop.xml.h:14
 msgstr ""
 
 #: hacks/config/goop.xml.h:14
-msgid "This draws set of animating, transparent, amoeba-like blobs. The blobs change shape as they wander around the screen, and they are translucent, so you can see the lower blobs through the higher ones, and when one passes over another, their colors merge. Written by Jamie Zawinski. I got the idea for this from a cool mouse pad I have, which achieves the same kind of effect in real life by having several layers plastic with colored oil between them. Written by Jamie Zawinski."
+msgid ""
+"This draws set of animating, transparent, amoeba-like blobs. The blobs "
+"change shape as they wander around the screen, and they are translucent, so "
+"you can see the lower blobs through the higher ones, and when one passes "
+"over another, their colors merge. I got the idea for this from a cool mouse "
+"pad I have, which achieves the same kind of effect in real life by having "
+"several layers plastic with colored oil between them. Written by Jamie "
+"Zawinski."
 msgstr ""
 
 #: hacks/config/goop.xml.h:15
 msgstr ""
 
 #: hacks/config/goop.xml.h:15
@@ -4490,7 +4135,9 @@ msgid "Orbital Decay"
 msgstr ""
 
 #: hacks/config/grav.xml.h:10
 msgstr ""
 
 #: hacks/config/grav.xml.h:10
-msgid "This program draws a simple orbital simulation. If you turn on trails, it looks kind of like a cloud-chamber photograph. Written by Greg Bowering."
+msgid ""
+"This program draws a simple orbital simulation. If you turn on trails, it "
+"looks kind of like a cloud-chamber photograph. Written by Greg Bowering."
 msgstr ""
 
 #: hacks/config/greynetic.xml.h:2
 msgstr ""
 
 #: hacks/config/greynetic.xml.h:2
@@ -4498,7 +4145,8 @@ msgid "Greynetic"
 msgstr ""
 
 #: hacks/config/greynetic.xml.h:5
 msgstr ""
 
 #: 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 ""
 
 #: hacks/config/halftone.xml.h:1
 msgstr ""
 
 #: hacks/config/halftone.xml.h:1
@@ -4514,7 +4162,11 @@ msgid "Dot size"
 msgstr ""
 
 #: hacks/config/halftone.xml.h:4
 msgstr ""
 
 #: 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;."
+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
 msgstr ""
 
 #: hacks/config/halftone.xml.h:5
@@ -4562,7 +4214,10 @@ msgid "Seuss Mode"
 msgstr ""
 
 #: hacks/config/halo.xml.h:12
 msgstr ""
 
 #: hacks/config/halo.xml.h:12
-msgid "This draws trippy psychedelic circular patterns that hurt to look at. It can also animate the control-points, but that takes a lot of CPU and bandwidth. Written by Jamie Zawinski."
+msgid ""
+"This draws trippy psychedelic circular patterns that hurt to look at. It can "
+"also animate the control-points, but that takes a lot of CPU and bandwidth. "
+"Written by Jamie Zawinski."
 msgstr ""
 
 #: hacks/config/helix.xml.h:4
 msgstr ""
 
 #: hacks/config/helix.xml.h:4
@@ -4570,7 +4225,9 @@ msgid "Helix"
 msgstr ""
 
 #: hacks/config/helix.xml.h:5
 msgstr ""
 
 #: hacks/config/helix.xml.h:5
-msgid "This repeatedly generates spirally string-art-ish patterns. Written by Jamie Zawinski."
+msgid ""
+"This repeatedly generates spirally string-art-ish patterns. Written by Jamie "
+"Zawinski."
 msgstr ""
 
 #: hacks/config/hopalong.xml.h:3
 msgstr ""
 
 #: hacks/config/hopalong.xml.h:3
@@ -4622,12 +4279,9 @@ msgid "Sine"
 msgstr ""
 
 #: hacks/config/hopalong.xml.h:24
 msgstr ""
 
 #: hacks/config/hopalong.xml.h:24
-msgid "This draws lacy fractal patterns, based on iteration in the imaginary plane, from a 1986 Scientific American article. Mostly written by Patrick Naughton."
-msgstr ""
-
-#: hacks/config/hyperball.xml.h:1
-#: hacks/config/hypercube.xml.h:1
-msgid "Far"
+msgid ""
+"This draws lacy fractal patterns, based on iteration in the imaginary plane, "
+"from a 1986 Scientific American article. Mostly written by Patrick Naughton."
 msgstr ""
 
 #: hacks/config/hyperball.xml.h:4
 msgstr ""
 
 #: hacks/config/hyperball.xml.h:4
@@ -4635,41 +4289,35 @@ msgid "Hyperball"
 msgstr ""
 
 #: hacks/config/hyperball.xml.h:5
 msgstr ""
 
 #: hacks/config/hyperball.xml.h:5
-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. 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 ""
-
-#: hacks/config/hyperball.xml.h:7
-#: hacks/config/hypercube.xml.h:6
-msgid "Near"
+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. 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 ""
 
 msgstr ""
 
-#: hacks/config/hyperball.xml.h:10
-#: hacks/config/hypercube.xml.h:10
+#: hacks/config/hyperball.xml.h:10 hacks/config/hypercube.xml.h:10
 msgid "XW Rotation"
 msgstr ""
 
 msgid "XW Rotation"
 msgstr ""
 
-#: hacks/config/hyperball.xml.h:11
-#: hacks/config/hypercube.xml.h:11
+#: hacks/config/hyperball.xml.h:11 hacks/config/hypercube.xml.h:11
 msgid "XY Rotation"
 msgstr ""
 
 msgid "XY Rotation"
 msgstr ""
 
-#: hacks/config/hyperball.xml.h:12
-#: hacks/config/hypercube.xml.h:12
+#: hacks/config/hyperball.xml.h:12 hacks/config/hypercube.xml.h:12
 msgid "XZ Rotation"
 msgstr ""
 
 msgid "XZ Rotation"
 msgstr ""
 
-#: hacks/config/hyperball.xml.h:13
-#: hacks/config/hypercube.xml.h:13
+#: hacks/config/hyperball.xml.h:13 hacks/config/hypercube.xml.h:13
 msgid "YW Rotation"
 msgstr ""
 
 msgid "YW Rotation"
 msgstr ""
 
-#: hacks/config/hyperball.xml.h:14
-#: hacks/config/hypercube.xml.h:14
+#: hacks/config/hyperball.xml.h:14 hacks/config/hypercube.xml.h:14
 msgid "YZ Rotation"
 msgstr ""
 
 msgid "YZ Rotation"
 msgstr ""
 
-#: hacks/config/hyperball.xml.h:15
-#: hacks/config/hypercube.xml.h:15
+#: hacks/config/hyperball.xml.h:15 hacks/config/hypercube.xml.h:15
 msgid "ZW Rotation"
 msgstr ""
 
 msgid "ZW Rotation"
 msgstr ""
 
@@ -4678,16 +4326,23 @@ msgid "Hypercube"
 msgstr ""
 
 #: hacks/config/hypercube.xml.h:9
 msgstr ""
 
 #: hacks/config/hypercube.xml.h:9
-msgid "This displays 2D projections of the sequence of 3D objects which are the projections of the 4D analog to the cube: as a square is composed of four lines, each touching two others; and a cube is composed of six squares, each 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. See also the \"polytopes\" hack for a more general version of this using OpenGL."
-msgstr ""
-
-#: hacks/config/hypertorus.xml.h:1
-#: hacks/config/polytopes.xml.h:1
+msgid ""
+"This displays 2D projections of the sequence of 3D objects which are the "
+"projections of the 4D analog to the cube: as a square is composed of four "
+"lines, each touching two others; and a cube is composed of six squares, each "
+"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. "
+"See also the \"polytopes\" hack for a more general version of this using "
+"OpenGL."
+msgstr ""
+
+#: hacks/config/hypertorus.xml.h:1 hacks/config/polytopes.xml.h:1
 msgid "-4.0"
 msgstr ""
 
 msgid "-4.0"
 msgstr ""
 
-#: hacks/config/hypertorus.xml.h:2
-#: hacks/config/polytopes.xml.h:5
+#: hacks/config/hypertorus.xml.h:2 hacks/config/polytopes.xml.h:5
 msgid "4.0"
 msgstr ""
 
 msgid "4.0"
 msgstr ""
 
@@ -4699,28 +4354,23 @@ msgstr ""
 msgid "Color Wheel"
 msgstr ""
 
 msgid "Color Wheel"
 msgstr ""
 
-#: hacks/config/hypertorus.xml.h:5
-#: hacks/config/polytopes.xml.h:10
+#: hacks/config/hypertorus.xml.h:5 hacks/config/polytopes.xml.h:10
 msgid "Display Speed"
 msgstr ""
 
 msgid "Display Speed"
 msgstr ""
 
-#: hacks/config/hypertorus.xml.h:7
-#: hacks/config/polytopes.xml.h:12
+#: hacks/config/hypertorus.xml.h:7 hacks/config/polytopes.xml.h:12
 msgid "Orthographic 3d"
 msgstr ""
 
 msgid "Orthographic 3d"
 msgstr ""
 
-#: hacks/config/hypertorus.xml.h:8
-#: hacks/config/polytopes.xml.h:13
+#: hacks/config/hypertorus.xml.h:8 hacks/config/polytopes.xml.h:13
 msgid "Orthographic 4d"
 msgstr ""
 
 msgid "Orthographic 4d"
 msgstr ""
 
-#: hacks/config/hypertorus.xml.h:9
-#: hacks/config/polytopes.xml.h:14
+#: hacks/config/hypertorus.xml.h:9 hacks/config/polytopes.xml.h:14
 msgid "Perspective 3d"
 msgstr ""
 
 msgid "Perspective 3d"
 msgstr ""
 
-#: hacks/config/hypertorus.xml.h:10
-#: hacks/config/polytopes.xml.h:15
+#: hacks/config/hypertorus.xml.h:10 hacks/config/polytopes.xml.h:15
 msgid "Perspective 4d"
 msgstr ""
 
 msgid "Perspective 4d"
 msgstr ""
 
@@ -4732,19 +4382,20 @@ msgstr ""
 msgid "Solid Object"
 msgstr ""
 
 msgid "Solid Object"
 msgstr ""
 
-#: hacks/config/hypertorus.xml.h:15
-#: hacks/config/mirrorblob.xml.h:20
-#: hacks/config/polytopes.xml.h:21
-#: hacks/config/pulsar.xml.h:16
+#: hacks/config/hypertorus.xml.h:15 hacks/config/mirrorblob.xml.h:20
+#: hacks/config/polytopes.xml.h:21 hacks/config/pulsar.xml.h:16
 msgid "Solid Surface"
 msgstr ""
 
 #: hacks/config/hypertorus.xml.h:16
 msgid "Solid Surface"
 msgstr ""
 
 #: 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."
+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 ""
 
 msgstr ""
 
-#: hacks/config/hypertorus.xml.h:17
-#: hacks/config/polytopes.xml.h:23
+#: hacks/config/hypertorus.xml.h:17 hacks/config/polytopes.xml.h:23
 msgid "Transparent Surface"
 msgstr ""
 
 msgid "Transparent Surface"
 msgstr ""
 
@@ -4752,38 +4403,31 @@ msgstr ""
 msgid "Two-Sided"
 msgstr ""
 
 msgid "Two-Sided"
 msgstr ""
 
-#: hacks/config/hypertorus.xml.h:19
-#: hacks/config/polytopes.xml.h:24
+#: hacks/config/hypertorus.xml.h:19 hacks/config/polytopes.xml.h:24
 msgid "WX Rotation Speed"
 msgstr ""
 
 msgid "WX Rotation Speed"
 msgstr ""
 
-#: hacks/config/hypertorus.xml.h:20
-#: hacks/config/polytopes.xml.h:25
+#: hacks/config/hypertorus.xml.h:20 hacks/config/polytopes.xml.h:25
 msgid "WY Rotation Speed"
 msgstr ""
 
 msgid "WY Rotation Speed"
 msgstr ""
 
-#: hacks/config/hypertorus.xml.h:21
-#: hacks/config/polytopes.xml.h:26
+#: hacks/config/hypertorus.xml.h:21 hacks/config/polytopes.xml.h:26
 msgid "WZ Rotation Speed"
 msgstr ""
 
 msgid "WZ Rotation Speed"
 msgstr ""
 
-#: hacks/config/hypertorus.xml.h:22
-#: hacks/config/polytopes.xml.h:27
+#: hacks/config/hypertorus.xml.h:22 hacks/config/polytopes.xml.h:27
 msgid "Wireframe Mesh"
 msgstr ""
 
 msgid "Wireframe Mesh"
 msgstr ""
 
-#: hacks/config/hypertorus.xml.h:23
-#: hacks/config/polytopes.xml.h:28
+#: hacks/config/hypertorus.xml.h:23 hacks/config/polytopes.xml.h:28
 msgid "XY Rotation Speed"
 msgstr ""
 
 msgid "XY Rotation Speed"
 msgstr ""
 
-#: hacks/config/hypertorus.xml.h:24
-#: hacks/config/polytopes.xml.h:29
+#: hacks/config/hypertorus.xml.h:24 hacks/config/polytopes.xml.h:29
 msgid "XZ Rotation Speed"
 msgstr ""
 
 msgid "XZ Rotation Speed"
 msgstr ""
 
-#: hacks/config/hypertorus.xml.h:25
-#: hacks/config/polytopes.xml.h:30
+#: hacks/config/hypertorus.xml.h:25 hacks/config/polytopes.xml.h:30
 msgid "YZ Rotation Speed"
 msgstr ""
 
 msgid "YZ Rotation Speed"
 msgstr ""
 
@@ -4792,7 +4436,9 @@ msgid "IFS"
 msgstr ""
 
 #: hacks/config/ifs.xml.h:7
 msgstr ""
 
 #: hacks/config/ifs.xml.h:7
-msgid "This one draws spinning, colliding iterated-function-system images. Written by Massimino Pascal."
+msgid ""
+"This one draws spinning, colliding iterated-function-system images. Written "
+"by Massimino Pascal."
 msgstr ""
 
 #: hacks/config/imsmap.xml.h:3
 msgstr ""
 
 #: hacks/config/imsmap.xml.h:3
@@ -4812,7 +4458,17 @@ msgid "Saturation Gradients"
 msgstr ""
 
 #: hacks/config/imsmap.xml.h:14
 msgstr ""
 
 #: hacks/config/imsmap.xml.h:14
-msgid "This generates random cloud-like patterns. It looks quite different in monochrome and color. The basic idea is to take four points on the edge of the image, and assign each a random ``elevation''. Then find the point between them, and give it a value which is the average of the other four, plus some small random offset. Then coloration is done based on elevation. The color selection is done by binding the elevation to either hue, saturation, or brightness, and assigning random values to the others. The ``brightness'' mode tends to yield cloudlike patterns, and the others tend to generate images that look like heat-maps or CAT-scans. Written by Juergen Nickelsen and Jamie Zawinski."
+msgid ""
+"This generates random cloud-like patterns. It looks quite different in "
+"monochrome and color. The basic idea is to take four points on the edge of "
+"the image, and assign each a random ``elevation''. Then find the point "
+"between them, and give it a value which is the average of the other four, "
+"plus some small random offset. Then coloration is done based on elevation. "
+"The color selection is done by binding the elevation to either hue, "
+"saturation, or brightness, and assigning random values to the others. The "
+"``brightness'' mode tends to yield cloudlike patterns, and the others tend "
+"to generate images that look like heat-maps or CAT-scans. Written by Juergen "
+"Nickelsen and Jamie Zawinski."
 msgstr ""
 
 #: hacks/config/interference.xml.h:1
 msgstr ""
 
 #: hacks/config/interference.xml.h:1
@@ -4828,7 +4484,10 @@ msgid "Anim Speed"
 msgstr ""
 
 #: hacks/config/interference.xml.h:4
 msgstr ""
 
 #: 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. Written by Hannu Mallat."
+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. "
+"Written by Hannu Mallat."
 msgstr ""
 
 #: hacks/config/interference.xml.h:9
 msgstr ""
 
 #: hacks/config/interference.xml.h:9
@@ -4839,10 +4498,8 @@ msgstr ""
 msgid "Interference"
 msgstr ""
 
 msgid "Interference"
 msgstr ""
 
-#: hacks/config/interference.xml.h:13
-#: hacks/config/t3d.xml.h:9
-#: hacks/config/xearth.xml.h:11
-#: hacks/config/zoom.xml.h:5
+#: 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 ""
 
 msgid "Magnification"
 msgstr ""
 
@@ -4854,6 +4511,26 @@ msgstr ""
 msgid "Wave Size"
 msgstr ""
 
 msgid "Wave Size"
 msgstr ""
 
+#: hacks/config/intermomentary.xml.h:2
+msgid "Intermomentary"
+msgstr ""
+
+#: hacks/config/intermomentary.xml.h:3
+msgid "Number of Discs"
+msgstr ""
+
+#: hacks/config/intermomentary.xml.h:6
+msgid ""
+"The Intersection Momentary is a fun visualization defining the relationships "
+"between objects with Casey Reas, William Ngan, and Robert Hodgin. "
+"Commissioned for display at the Whitney Museum of American Art. A surface "
+"filled with 100 medium to small sized circles. Each circle has a different "
+"size and direction, but moves at the same slow rate. Display: A. The "
+"instantaneous intersections of the circles. B. The aggregate intersections "
+"of the circles. Ported to XScreensaver from the art project \"InterMomentary"
+"\" at http://www.complexification.net"
+msgstr ""
+
 #: hacks/config/jigglypuff.xml.h:2
 msgid "Chrome"
 msgstr ""
 #: hacks/config/jigglypuff.xml.h:2
 msgid "Chrome"
 msgstr ""
@@ -4882,8 +4559,7 @@ msgstr ""
 msgid "Rotation speed"
 msgstr ""
 
 msgid "Rotation speed"
 msgstr ""
 
-#: hacks/config/jigglypuff.xml.h:17
-#: hacks/config/sphere.xml.h:7
+#: hacks/config/jigglypuff.xml.h:17 hacks/config/sphere.xml.h:7
 msgid "Sphere"
 msgstr ""
 
 msgid "Sphere"
 msgstr ""
 
@@ -4899,13 +4575,25 @@ msgstr ""
 msgid "Spoooooky"
 msgstr ""
 
 msgid "Spoooooky"
 msgstr ""
 
-#: hacks/config/jigglypuff.xml.h:21
+#: hacks/config/jigglypuff.xml.h:21 hacks/config/polyhedra.xml.h:155
 #: hacks/config/sballs.xml.h:16
 msgid "Tetrahedron"
 msgstr ""
 
 #: hacks/config/jigglypuff.xml.h:22
 #: hacks/config/sballs.xml.h:16
 msgid "Tetrahedron"
 msgstr ""
 
 #: 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"
+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
 msgstr ""
 
 #: hacks/config/jigglypuff.xml.h:23
@@ -4941,7 +4629,13 @@ msgid "Solved Duration"
 msgstr ""
 
 #: hacks/config/jigsaw.xml.h:8
 msgstr ""
 
 #: hacks/config/jigsaw.xml.h:8
-msgid "This grabs a screen image, carves it up into a jigsaw puzzle, shuffles it, and then solves the puzzle. This works especially well when you feed it an external video signal instead of letting it grab the screen image (actually, I guess this is generally true...) When it is grabbing a video image, it is sometimes pretty hard to guess what the image is going to look like once the puzzle is solved. Written by Jamie Zawinski."
+msgid ""
+"This grabs a screen image, carves it up into a jigsaw puzzle, shuffles it, "
+"and then solves the puzzle. This works especially well when you feed it an "
+"external video signal instead of letting it grab the screen image (actually, "
+"I guess this is generally true...) When it is grabbing a video image, it is "
+"sometimes pretty hard to guess what the image is going to look like once the "
+"puzzle is solved. Written by Jamie Zawinski."
 msgstr ""
 
 #: hacks/config/juggle.xml.h:1
 msgstr ""
 
 #: hacks/config/juggle.xml.h:1
@@ -4956,8 +4650,7 @@ msgstr ""
 msgid "Juggle"
 msgstr ""
 
 msgid "Juggle"
 msgstr ""
 
-#: hacks/config/julia.xml.h:3
-#: hacks/config/rorschach.xml.h:4
+#: hacks/config/julia.xml.h:3 hacks/config/rorschach.xml.h:4
 msgid "Iterations"
 msgstr ""
 
 msgid "Iterations"
 msgstr ""
 
@@ -4966,19 +4659,28 @@ msgid "Julia"
 msgstr ""
 
 #: hacks/config/julia.xml.h:11
 msgstr ""
 
 #: hacks/config/julia.xml.h:11
-msgid "This one draws spinning, animating (are you detecting a pattern here yet?) explorations of the Julia set. You've probably seen static images of this fractal form before, but it's a lot of fun to watch in motion as well. One interesting thing is that there is a small swinging dot passing in front of the image, which indicates the control point from which the rest of the image was generated. Written by Sean McCullough."
+msgid ""
+"This one draws spinning, animating (are you detecting a pattern here yet?) "
+"explorations of the Julia set. You've probably seen static images of this "
+"fractal form before, but it's a lot of fun to watch in motion as well. One "
+"interesting thing is that there is a small swinging dot passing in front of "
+"the image, which indicates the control point from which the rest of the "
+"image was generated. Written by Sean McCullough."
 msgstr ""
 
 #: hacks/config/kaleidescope.xml.h:1
 msgstr ""
 
 #: hacks/config/kaleidescope.xml.h:1
-msgid "Another clone of an ancient meme, consisting largely of frenetic rotational motion of colored lines. This one is by Ron Tapia. The motion is nice, but I think it needs more solids, or perhaps just brighter colors. More variations in the rotational speed might help, too."
+msgid ""
+"Another clone of an ancient meme, consisting largely of frenetic rotational "
+"motion of colored lines. This one is by Ron Tapia. The motion is nice, but I "
+"think it needs more solids, or perhaps just brighter colors. More variations "
+"in the rotational speed might help, too."
 msgstr ""
 
 #: hacks/config/kaleidescope.xml.h:4
 msgid "Kaleidescope"
 msgstr ""
 
 msgstr ""
 
 #: hacks/config/kaleidescope.xml.h:4
 msgid "Kaleidescope"
 msgstr ""
 
-#: hacks/config/kaleidescope.xml.h:6
-#: hacks/config/qix.xml.h:18
+#: hacks/config/kaleidescope.xml.h:6 hacks/config/qix.xml.h:18
 msgid "Segments"
 msgstr ""
 
 msgid "Segments"
 msgstr ""
 
@@ -4995,7 +4697,9 @@ msgid "Klein"
 msgstr ""
 
 #: hacks/config/klein.xml.h:10
 msgstr ""
 
 #: 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."
+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
 msgstr ""
 
 #: hacks/config/klein.xml.h:11
@@ -5015,11 +4719,16 @@ msgid "Randomize"
 msgstr ""
 
 #: hacks/config/kumppa.xml.h:10
 msgstr ""
 
 #: hacks/config/kumppa.xml.h:10
-msgid "Spiraling, spinning, and very, very fast splashes of color rush toward the screen. Written by Teemu Suutari."
+msgid ""
+"Spiraling, spinning, and very, very fast splashes of color rush toward the "
+"screen. Written by Teemu Suutari."
 msgstr ""
 
 #: hacks/config/lament.xml.h:1
 msgstr ""
 
 #: hacks/config/lament.xml.h:1
-msgid "Animates a simulation of Lemarchand's Box, repeatedly solving itself. Requires OpenGL, and a machine with fast hardware support for texture maps. Warning: occasionally opens doors. Written by Jamie Zawinski."
+msgid ""
+"Animates a simulation of Lemarchand's Box, repeatedly solving itself. "
+"Requires OpenGL, and a machine with fast hardware support for texture maps. "
+"Warning: occasionally opens doors. Written by Jamie Zawinski."
 msgstr ""
 
 #: hacks/config/lament.xml.h:3
 msgstr ""
 
 #: hacks/config/lament.xml.h:3
@@ -5031,17 +4740,15 @@ msgid "Laser"
 msgstr ""
 
 #: hacks/config/laser.xml.h:7
 msgstr ""
 
 #: hacks/config/laser.xml.h:7
-msgid "Moving radiating lines, that look vaguely like scanning laser beams. Written by Pascal Pensa. (Frankie say: relax.)"
+msgid ""
+"Moving radiating lines, that look vaguely like scanning laser beams. Written "
+"by Pascal Pensa. (Frankie say: relax.)"
 msgstr ""
 
 msgstr ""
 
-#: hacks/config/lavalite.xml.h:2
+#: hacks/config/lavalite.xml.h:2 hacks/config/xmountains.xml.h:2
 msgid "10"
 msgstr ""
 
 msgid "10"
 msgstr ""
 
-#: hacks/config/lavalite.xml.h:3
-msgid "Activity"
-msgstr ""
-
 #: hacks/config/lavalite.xml.h:4
 msgid "Classic Lavalite"
 msgstr ""
 #: hacks/config/lavalite.xml.h:4
 msgid "Classic Lavalite"
 msgstr ""
@@ -5051,7 +4758,15 @@ msgid "Cone Lavalite"
 msgstr ""
 
 #: hacks/config/lavalite.xml.h:8
 msgstr ""
 
 #: hacks/config/lavalite.xml.h:8
-msgid "Draws a 3D Simulation a Lava Lite(r): odd-shaped blobs of a mysterious substance are heated, slowly rise to the top of the bottle, and then drop back down as they cool. This program requires OpenGL and a fairly fast machine (both CPU and 3D performance.) Written by Jamie Zawinski. \"LAVA LITE(r) and the configuration of the LAVA(r) brand motion lamp are registered trademarks of Haggerty Enterprises, Inc. The configuration of the globe and base of the motion lamp are registered trademarks of Haggerty Enterprises, Inc. in the U.S.A. and in other countries around the world.\""
+msgid ""
+"Draws a 3D Simulation a Lava Lite(r): odd-shaped blobs of a mysterious "
+"substance are heated, slowly rise to the top of the bottle, and then drop "
+"back down as they cool. This program requires OpenGL and a fairly fast "
+"machine (both CPU and 3D performance.) Written by Jamie Zawinski. \"LAVA LITE"
+"(r) and the configuration of the LAVA(r) brand motion lamp are registered "
+"trademarks of Haggerty Enterprises, Inc. The configuration of the globe and "
+"base of the motion lamp are registered trademarks of Haggerty Enterprises, "
+"Inc. in the U.S.A. and in other countries around the world.\""
 msgstr ""
 
 #: hacks/config/lavalite.xml.h:9
 msgstr ""
 
 #: hacks/config/lavalite.xml.h:9
@@ -5083,7 +4798,9 @@ msgid "Lightning"
 msgstr ""
 
 #: hacks/config/lightning.xml.h:7
 msgstr ""
 
 #: hacks/config/lightning.xml.h:7
-msgid "This one draws crackling fractal lightning bolts. It's simple, direct, and to the point. If only it had sound... Written by Keith Romberg."
+msgid ""
+"This one draws crackling fractal lightning bolts. It's simple, direct, and "
+"to the point. If only it had sound... Written by Keith Romberg."
 msgstr ""
 
 #: hacks/config/lisa.xml.h:4
 msgstr ""
 
 #: hacks/config/lisa.xml.h:4
@@ -5095,11 +4812,16 @@ msgid "Steps"
 msgstr ""
 
 #: hacks/config/lisa.xml.h:11
 msgstr ""
 
 #: hacks/config/lisa.xml.h:11
-msgid "This draws Lisajous loops, by Caleb Cullen. Remember that device they had the Phantom Zone prisoners in during their trial in Superman? I think that was one of these."
+msgid ""
+"This draws Lisajous loops, by Caleb Cullen. Remember that device they had "
+"the Phantom Zone prisoners in during their trial in Superman? I think that "
+"was one of these."
 msgstr ""
 
 #: hacks/config/lissie.xml.h:1
 msgstr ""
 
 #: hacks/config/lissie.xml.h:1
-msgid "Another Lissajous figure. This one draws the progress of circular shapes along a path. Written by Alexander Jolk."
+msgid ""
+"Another Lissajous figure. This one draws the progress of circular shapes "
+"along a path. Written by Alexander Jolk."
 msgstr ""
 
 #: hacks/config/lissie.xml.h:5
 msgstr ""
 
 #: hacks/config/lissie.xml.h:5
@@ -5139,7 +4861,9 @@ msgid "Open and Closed Figures"
 msgstr ""
 
 #: hacks/config/lmorph.xml.h:15
 msgstr ""
 
 #: hacks/config/lmorph.xml.h:15
-msgid "This generates random spline-ish line drawings and morphs between them. Written by Sverre H. Huseby and Glenn T. Lines."
+msgid ""
+"This generates random spline-ish line drawings and morphs between them. "
+"Written by Sverre H. Huseby and Glenn T. Lines."
 msgstr ""
 
 #: hacks/config/loop.xml.h:3
 msgstr ""
 
 #: hacks/config/loop.xml.h:3
@@ -5147,15 +4871,16 @@ msgid "Loop"
 msgstr ""
 
 #: hacks/config/loop.xml.h:10
 msgstr ""
 
 #: hacks/config/loop.xml.h:10
-msgid "This one produces loop-shaped colonies that spawn, age, and eventually die. Written by David Bagley."
+msgid ""
+"This one produces loop-shaped colonies that spawn, age, and eventually die. "
+"Written by David Bagley."
 msgstr ""
 
 #: hacks/config/maze.xml.h:3
 msgid "Backtracking Generator"
 msgstr ""
 
 msgstr ""
 
 #: hacks/config/maze.xml.h:3
 msgid "Backtracking Generator"
 msgstr ""
 
-#: hacks/config/maze.xml.h:5
-#: hacks/config/slidescreen.xml.h:3
+#: hacks/config/maze.xml.h:5 hacks/config/slidescreen.xml.h:3
 msgid "Grid Size"
 msgstr ""
 
 msgid "Grid Size"
 msgstr ""
 
@@ -5196,7 +4921,36 @@ msgid "Solve Speed"
 msgstr ""
 
 #: hacks/config/maze.xml.h:16
 msgstr ""
 
 #: hacks/config/maze.xml.h:16
-msgid "This is the ancient X maze demo, modified to work with xscreensaver. It generates a random maze, then solves it with visual feedback. Originally by Jim Randell; modified by a cast of thousands."
+msgid ""
+"This is the ancient X maze demo, modified to work with xscreensaver. It "
+"generates a random maze, then solves it with visual feedback. Originally by "
+"Jim Randell; modified by a cast of thousands."
+msgstr ""
+
+#: hacks/config/memscroller.xml.h:1
+msgid "Draw Green"
+msgstr ""
+
+#: hacks/config/memscroller.xml.h:2
+msgid "Draw Random Numbers"
+msgstr ""
+
+#: hacks/config/memscroller.xml.h:3
+msgid "Draw in RGB"
+msgstr ""
+
+#: hacks/config/memscroller.xml.h:4
+msgid "Dump Memory"
+msgstr ""
+
+#: hacks/config/memscroller.xml.h:6
+msgid "MemScroller"
+msgstr ""
+
+#: hacks/config/memscroller.xml.h:9
+msgid ""
+"This draws a dump of its own process memory scrolling across the screen in "
+"three windows at three different rates. Written by Jamie Zawinski."
 msgstr ""
 
 #: hacks/config/menger.xml.h:6
 msgstr ""
 
 #: hacks/config/menger.xml.h:6
@@ -5204,7 +4958,10 @@ msgid "Menger"
 msgstr ""
 
 #: hacks/config/menger.xml.h:19
 msgstr ""
 
 #: hacks/config/menger.xml.h:19
-msgid "This draws the three-dimensional variant of the recursive Menger Gasket, a cube-based fractal object analagous to the Sierpinski Tetrahedron. Written by Jamie Zawinski."
+msgid ""
+"This draws the three-dimensional variant of the recursive Menger Gasket, a "
+"cube-based fractal object analagous to the Sierpinski Tetrahedron. Written "
+"by Jamie Zawinski."
 msgstr ""
 
 #: hacks/config/metaballs.xml.h:1
 msgstr ""
 
 #: hacks/config/metaballs.xml.h:1
@@ -5212,7 +4969,9 @@ msgid "Big"
 msgstr ""
 
 #: hacks/config/metaballs.xml.h:2
 msgstr ""
 
 #: hacks/config/metaballs.xml.h:2
-msgid "Draws two dimensional metaballs: overlapping and merging balls with fuzzy edges. By W.P. van Paassen."
+msgid ""
+"Draws two dimensional metaballs: overlapping and merging balls with fuzzy "
+"edges. By W.P. van Paassen."
 msgstr ""
 
 #: hacks/config/metaballs.xml.h:7
 msgstr ""
 
 #: hacks/config/metaballs.xml.h:7
@@ -5235,13 +4994,14 @@ msgstr ""
 msgid "Blobby"
 msgstr ""
 
 msgid "Blobby"
 msgstr ""
 
-#: hacks/config/mirrorblob.xml.h:5
-#: hacks/config/nerverot.xml.h:2
+#: hacks/config/mirrorblob.xml.h:5 hacks/config/nerverot.xml.h:2
 msgid "Calm"
 msgstr ""
 
 #: hacks/config/mirrorblob.xml.h:7
 msgid "Calm"
 msgstr ""
 
 #: hacks/config/mirrorblob.xml.h:7
-msgid "Draws a wobbly blob that distorts the image behind it. Requires OpenGL hardware acceleration for nice animation. Written by Jon Dowdall."
+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:8
 msgstr ""
 
 #: hacks/config/mirrorblob.xml.h:8
@@ -5293,7 +5053,9 @@ msgid "Mismunch"
 msgstr ""
 
 #: hacks/config/mismunch.xml.h:6
 msgstr ""
 
 #: hacks/config/mismunch.xml.h:6
-msgid "Munching errors! This is a creatively broken misimplementation of the classic munching squares graphics hack. Written by Steven Hazel."
+msgid ""
+"Munching errors! This is a creatively broken misimplementation of the "
+"classic munching squares graphics hack. Written by Steven Hazel."
 msgstr ""
 
 #: hacks/config/mismunch.xml.h:7
 msgstr ""
 
 #: hacks/config/mismunch.xml.h:7
@@ -5304,14 +5066,15 @@ msgstr ""
 msgid "Simultaneous Squares"
 msgstr ""
 
 msgid "Simultaneous Squares"
 msgstr ""
 
-#: hacks/config/mismunch.xml.h:13
-#: hacks/config/munch.xml.h:10
+#: hacks/config/mismunch.xml.h:13 hacks/config/munch.xml.h:10
 #: hacks/config/qix.xml.h:26
 msgid "XOR"
 msgstr ""
 
 #: hacks/config/moebius.xml.h:1
 #: hacks/config/qix.xml.h:26
 msgid "XOR"
 msgstr ""
 
 #: hacks/config/moebius.xml.h:1
-msgid "Another M. C. Escher hack by Marcelo Vianna, this one draws ``Moebius Strip II,'' a GL image of ants walking along the surface of a moebius strip."
+msgid ""
+"Another M. C. Escher hack by Marcelo Vianna, this one draws ``Moebius Strip "
+"II,'' a GL image of ants walking along the surface of a moebius strip."
 msgstr ""
 
 #: hacks/config/moebius.xml.h:2
 msgstr ""
 
 #: hacks/config/moebius.xml.h:2
@@ -5330,8 +5093,7 @@ msgstr ""
 msgid "Solid Floor"
 msgstr ""
 
 msgid "Solid Floor"
 msgstr ""
 
-#: hacks/config/moebius.xml.h:9
-#: hacks/config/qix.xml.h:20
+#: hacks/config/moebius.xml.h:9 hacks/config/qix.xml.h:20
 msgid "Solid Objects"
 msgstr ""
 
 msgid "Solid Objects"
 msgstr ""
 
@@ -5339,17 +5101,28 @@ msgstr ""
 msgid "Moire"
 msgstr ""
 
 msgid "Moire"
 msgstr ""
 
-#: hacks/config/moire.xml.h:8
-#: hacks/config/rorschach.xml.h:6
+#: hacks/config/moire.xml.h:8 hacks/config/rorschach.xml.h:6
 msgid "Offset"
 msgstr ""
 
 #: hacks/config/moire.xml.h:10
 msgid "Offset"
 msgstr ""
 
 #: hacks/config/moire.xml.h:10
-msgid "This one draws cool circular interference patterns. Most of the circles you see aren't explicitly rendered, but show up as a result of interactions between the other pixels that were drawn. Written by Jamie Zawinski, inspired by Java code by Michael Bayne. As he pointed out, the beauty of this one is that the heart of the display algorithm can be expressed with just a pair of loops and a handful of arithmetic, giving it a high ``display hack metric''."
+msgid ""
+"This one draws cool circular interference patterns. Most of the circles you "
+"see aren't explicitly rendered, but show up as a result of interactions "
+"between the other pixels that were drawn. Written by Jamie Zawinski, "
+"inspired by Java code by Michael Bayne. As he pointed out, the beauty of "
+"this one is that the heart of the display algorithm can be expressed with "
+"just a pair of loops and a handful of arithmetic, giving it a high ``display "
+"hack metric''."
 msgstr ""
 
 #: hacks/config/moire2.xml.h:1
 msgstr ""
 
 #: hacks/config/moire2.xml.h:1
-msgid "Another example of the fun you can have with moire interference patterns; this hack generates fields of concentric circles or ovals, and combines the planes with various operations. The planes are moving independently of one another, causing the interference lines to ``spray.'' Written by Jamie Zawinski."
+msgid ""
+"Another example of the fun you can have with moire interference patterns; "
+"this hack generates fields of concentric circles or ovals, and combines the "
+"planes with various operations. The planes are moving independently of one "
+"another, causing the interference lines to ``spray.'' Written by Jamie "
+"Zawinski."
 msgstr ""
 
 #: hacks/config/moire2.xml.h:4
 msgstr ""
 
 #: hacks/config/moire2.xml.h:4
@@ -5368,13 +5141,15 @@ msgstr ""
 msgid "Draw Atoms"
 msgstr ""
 
 msgid "Draw Atoms"
 msgstr ""
 
-#: hacks/config/molecule.xml.h:7
-#: hacks/config/spheremonics.xml.h:2
+#: hacks/config/molecule.xml.h:7 hacks/config/spheremonics.xml.h:2
 msgid "Draw Bounding Box"
 msgstr ""
 
 #: hacks/config/molecule.xml.h:8
 msgid "Draw Bounding Box"
 msgstr ""
 
 #: hacks/config/molecule.xml.h:8
-msgid "Draws several different representations of molecules. Some common molecules are built in, and it can also read PDB (Protein Data Base) files as input. Written by Jamie Zawinski."
+msgid ""
+"Draws several different representations of molecules. Some common molecules "
+"are built in, and it can also read PDB (Protein Data Base) files as input. "
+"Written by Jamie Zawinski."
 msgstr ""
 
 #: hacks/config/molecule.xml.h:11
 msgstr ""
 
 #: hacks/config/molecule.xml.h:11
@@ -5390,7 +5165,9 @@ msgid "PDB File or Directory"
 msgstr ""
 
 #: hacks/config/morph3d.xml.h:1
 msgstr ""
 
 #: hacks/config/morph3d.xml.h:1
-msgid "Another 3d shape-changing GL hack, by Marcelo Vianna. It has the same shiny-plastic feel as Superquadrics, as many computer-generated objects do..."
+msgid ""
+"Another 3d shape-changing GL hack, by Marcelo Vianna. It has the same shiny-"
+"plastic feel as Superquadrics, as many computer-generated objects do..."
 msgstr ""
 
 #: hacks/config/morph3d.xml.h:4
 msgstr ""
 
 #: hacks/config/morph3d.xml.h:4
@@ -5398,7 +5175,9 @@ msgid "Morph3D"
 msgstr ""
 
 #: hacks/config/mountain.xml.h:3
 msgstr ""
 
 #: hacks/config/mountain.xml.h:3
-msgid "Generates random 3d plots that look vaguely mountainous. Written by Pascal Pensa."
+msgid ""
+"Generates random 3d plots that look vaguely mountainous. Written by Pascal "
+"Pensa."
 msgstr ""
 
 #: hacks/config/mountain.xml.h:5
 msgstr ""
 
 #: hacks/config/mountain.xml.h:5
@@ -5406,7 +5185,11 @@ msgid "Mountain"
 msgstr ""
 
 #: hacks/config/munch.xml.h:1
 msgstr ""
 
 #: hacks/config/munch.xml.h:1
-msgid "DATAI 2 ADDB 1,2 ROTC 2,-22 XOR 1,2 JRST .-4 As reported by HAKMEM, in 1962, Jackson Wright wrote the above PDP-1 code. That code still lives on in this screenhack, some 35 years later. The number of lines of enclosing code has increased substantially, however. This version is by Tim Showalter."
+msgid ""
+"DATAI 2 ADDB 1,2 ROTC 2,-22 XOR 1,2 JRST .-4 As reported by HAKMEM, in 1962, "
+"Jackson Wright wrote the above PDP-1 code. That code still lives on in this "
+"screenhack, some 35 years later. The number of lines of enclosing code has "
+"increased substantially, however. This version is by Tim Showalter."
 msgstr ""
 
 #: hacks/config/munch.xml.h:5
 msgstr ""
 
 #: hacks/config/munch.xml.h:5
@@ -5430,7 +5213,9 @@ msgid "Crunchiness"
 msgstr ""
 
 #: hacks/config/nerverot.xml.h:7
 msgstr ""
 
 #: hacks/config/nerverot.xml.h:7
-msgid "Draws different shapes composed of nervously vibrating squiggles, as if seen through a camera operated by a monkey on crack. By Dan Bornstein."
+msgid ""
+"Draws different shapes composed of nervously vibrating squiggles, as if seen "
+"through a camera operated by a monkey on crack. By Dan Bornstein."
 msgstr ""
 
 #: hacks/config/nerverot.xml.h:10
 msgstr ""
 
 #: hacks/config/nerverot.xml.h:10
@@ -5445,8 +5230,7 @@ msgstr ""
 msgid "Nervousness"
 msgstr ""
 
 msgid "Nervousness"
 msgstr ""
 
-#: hacks/config/nerverot.xml.h:18
-#: hacks/config/pyro.xml.h:12
+#: hacks/config/nerverot.xml.h:18 hacks/config/pyro.xml.h:12
 msgid "Seldom"
 msgstr ""
 
 msgid "Seldom"
 msgstr ""
 
@@ -5463,7 +5247,11 @@ msgid "Noof"
 msgstr ""
 
 #: hacks/config/noseguy.xml.h:1
 msgstr ""
 
 #: hacks/config/noseguy.xml.h:1
-msgid "A little man with a big nose wanders around your screen saying things. The things which he says can come from a file, or from an external program like `zippy' or `fortune'. This was extracted from `xnlock' by Dan Heller. Colorized by Jamie Zawinski."
+msgid ""
+"A little man with a big nose wanders around your screen saying things. The "
+"things which he says can come from a file, or from an external program like "
+"`zippy' or `fortune'. This was extracted from `xnlock' by Dan Heller. "
+"Colorized by Jamie Zawinski."
 msgstr ""
 
 #: hacks/config/noseguy.xml.h:2
 msgstr ""
 
 #: hacks/config/noseguy.xml.h:2
@@ -5495,7 +5283,9 @@ msgid "Player Size"
 msgstr ""
 
 #: hacks/config/pacman.xml.h:4
 msgstr ""
 
 #: hacks/config/pacman.xml.h:4
-msgid "Simulates a game of Pac-Man on a randomly-created level. Written by Edwin de Jong."
+msgid ""
+"Simulates a game of Pac-Man on a randomly-created level. Written by Edwin de "
+"Jong."
 msgstr ""
 
 #: hacks/config/pedal.xml.h:7
 msgstr ""
 
 #: hacks/config/pedal.xml.h:7
@@ -5503,7 +5293,11 @@ msgid "Pedal"
 msgstr ""
 
 #: hacks/config/pedal.xml.h:8
 msgstr ""
 
 #: hacks/config/pedal.xml.h:8
-msgid "This is sort of a combination spirograph/string-art. It generates a large, complex polygon, and lets the X server do the bulk of the work by giving it an even/odd winding rule. Written by Dale Moore, based on some ancient PDP-11 code."
+msgid ""
+"This is sort of a combination spirograph/string-art. It generates a large, "
+"complex polygon, and lets the X server do the bulk of the work by giving it "
+"an even/odd winding rule. Written by Dale Moore, based on some ancient PDP-"
+"11 code."
 msgstr ""
 
 #: hacks/config/penetrate.xml.h:1
 msgstr ""
 
 #: hacks/config/penetrate.xml.h:1
@@ -5523,7 +5317,9 @@ msgid "Start badly, but learn"
 msgstr ""
 
 #: hacks/config/penetrate.xml.h:8
 msgstr ""
 
 #: hacks/config/penetrate.xml.h:8
-msgid "This hack simulates the classic arcade game Missile Command. Written by Adam Miller."
+msgid ""
+"This hack simulates the classic arcade game Missile Command. Written by Adam "
+"Miller."
 msgstr ""
 
 #: hacks/config/penrose.xml.h:3
 msgstr ""
 
 #: hacks/config/penrose.xml.h:3
@@ -5531,7 +5327,18 @@ msgid "Draw Ammann Lines"
 msgstr ""
 
 #: hacks/config/penrose.xml.h:4
 msgstr ""
 
 #: hacks/config/penrose.xml.h:4
-msgid "Draws quasiperiodic tilings; think of the implications on modern formica technology. Written by Timo Korvola. In April 1997, Sir Roger Penrose, a British math professor who has worked with Stephen Hawking on such topics as relativity, black holes, and whether time has a beginning, filed a copyright-infringement lawsuit against the Kimberly-Clark Corporation, which Penrose said copied a pattern he created (a pattern demonstrating that ``a nonrepeating pattern could exist in nature'') for its Kleenex quilted toilet paper. Penrose said he doesn't like litigation but, ``When it comes to the population of Great Britain being invited by a multinational to wipe their bottoms on what appears to be the work of a Knight of the Realm, then a last stand must be taken.'' As reported by News of the Weird #491, 4-jul-1997."
+msgid ""
+"Draws quasiperiodic tilings; think of the implications on modern formica "
+"technology. Written by Timo Korvola. In April 1997, Sir Roger Penrose, a "
+"British math professor who has worked with Stephen Hawking on such topics as "
+"relativity, black holes, and whether time has a beginning, filed a copyright-"
+"infringement lawsuit against the Kimberly-Clark Corporation, which Penrose "
+"said copied a pattern he created (a pattern demonstrating that ``a "
+"nonrepeating pattern could exist in nature'') for its Kleenex quilted toilet "
+"paper. Penrose said he doesn't like litigation but, ``When it comes to the "
+"population of Great Britain being invited by a multinational to wipe their "
+"bottoms on what appears to be the work of a Knight of the Realm, then a last "
+"stand must be taken.'' As reported by News of the Weird #491, 4-jul-1997."
 msgstr ""
 
 #: hacks/config/penrose.xml.h:9
 msgstr ""
 
 #: hacks/config/penrose.xml.h:9
@@ -5554,141 +5361,807 @@ msgstr ""
 msgid "Fertility"
 msgstr ""
 
 msgid "Fertility"
 msgstr ""
 
-#: hacks/config/petri.xml.h:12
-msgid "Maxium Lifespan"
+#: hacks/config/petri.xml.h:12
+msgid "Maxium Lifespan"
+msgstr ""
+
+#: hacks/config/petri.xml.h:13
+msgid "Maxium Rate of Death"
+msgstr ""
+
+#: hacks/config/petri.xml.h:14
+msgid "Maxium Rate of Growth"
+msgstr ""
+
+#: hacks/config/petri.xml.h:15
+msgid "Minium Lifespan"
+msgstr ""
+
+#: hacks/config/petri.xml.h:16
+msgid "Minium Rate of Death"
+msgstr ""
+
+#: hacks/config/petri.xml.h:17
+msgid "Minium Rate of Growth"
+msgstr ""
+
+#: hacks/config/petri.xml.h:18
+msgid "Mold Varieties"
+msgstr ""
+
+#: hacks/config/petri.xml.h:19
+msgid "Offspring"
+msgstr ""
+
+#: hacks/config/petri.xml.h:20
+msgid "Petri"
+msgstr ""
+
+#: hacks/config/petri.xml.h:21
+msgid "Quickly"
+msgstr ""
+
+#: hacks/config/petri.xml.h:24
+msgid "Slowly"
+msgstr ""
+
+#: hacks/config/petri.xml.h:26
+msgid "Square"
+msgstr ""
+
+#: hacks/config/petri.xml.h:27
+msgid ""
+"This simulates colonies of mold growing in a petri dish. Growing colored "
+"circles overlap and leave spiral interference in their wake. Written by Dan "
+"Bornstein."
+msgstr ""
+
+#: hacks/config/phosphor.xml.h:1
+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. "
+"Written by Jamie Zawinski."
+msgstr ""
+
+#: hacks/config/phosphor.xml.h:2
+msgid "Dump pipe"
+msgstr ""
+
+#: hacks/config/phosphor.xml.h:5
+msgid "Phosphor"
+msgstr ""
+
+#: hacks/config/phosphor.xml.h:6
+msgid "Scale"
+msgstr ""
+
+#: hacks/config/phosphor.xml.h:10
+msgid "Use PTY"
+msgstr ""
+
+#: hacks/config/piecewise.xml.h:1
+msgid "Color shifting speed"
+msgstr ""
+
+#: hacks/config/piecewise.xml.h:6
+msgid "Maximum radius"
+msgstr ""
+
+#: hacks/config/piecewise.xml.h:7
+msgid "Minimum radius"
+msgstr ""
+
+#: 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/pinion.xml.h:1
+msgid "100"
+msgstr ""
+
+#: hacks/config/pinion.xml.h:2
+msgid "2000"
+msgstr ""
+
+#: hacks/config/pinion.xml.h:4
+msgid ""
+"Draws an interconnected set of gears moving across the screen. Written by "
+"Jamie Zawinski."
+msgstr ""
+
+#: hacks/config/pinion.xml.h:6
+msgid "Gear Size"
+msgstr ""
+
+#: hacks/config/pinion.xml.h:8
+msgid "Max RPM"
+msgstr ""
+
+#: hacks/config/pinion.xml.h:9
+msgid "Pinion"
+msgstr ""
+
+#: hacks/config/pinion.xml.h:11
+msgid "Scrolling Speed"
+msgstr ""
+
+#: hacks/config/pipes.xml.h:1
+msgid "Allow Tight Turns"
+msgstr ""
+
+#: hacks/config/pipes.xml.h:2
+msgid "Ball Joints"
+msgstr ""
+
+#: hacks/config/pipes.xml.h:3
+msgid "Curved Pipes"
+msgstr ""
+
+#: hacks/config/pipes.xml.h:6
+msgid "Fisheye Lens"
+msgstr ""
+
+#: hacks/config/pipes.xml.h:7
+msgid "Gadgetry"
+msgstr ""
+
+#: hacks/config/pipes.xml.h:8
+msgid ""
+"If you've ever been in the same room with a Windows NT machine, you've "
+"probably seen this GL hack. This version is by Marcelo Vianna."
+msgstr ""
+
+#: hacks/config/pipes.xml.h:9 hacks/config/substrate.xml.h:7
+#: hacks/config/wormhole.xml.h:4
+msgid "Lots"
+msgstr ""
+
+#: hacks/config/pipes.xml.h:11
+msgid "Number of Pipe Systems"
+msgstr ""
+
+#: hacks/config/pipes.xml.h:12
+msgid "Pipe Fittings"
+msgstr ""
+
+#: hacks/config/pipes.xml.h:13
+msgid "Pipes"
+msgstr ""
+
+#: hacks/config/pipes.xml.h:17
+msgid "System Length"
+msgstr ""
+
+#: hacks/config/polyhedra.xml.h:2
+#, fuzzy
+msgid "30 seconds"
+msgstr "0 sekuntia"
+
+#: hacks/config/polyhedra.xml.h:4 hacks/config/sballs.xml.h:1
+msgid "Cube"
+msgstr ""
+
+#: hacks/config/polyhedra.xml.h:5
+msgid "Cubitruncated Cuboctahedron"
+msgstr ""
+
+#: hacks/config/polyhedra.xml.h:6
+msgid "Cuboctahedron"
+msgstr ""
+
+#: hacks/config/polyhedra.xml.h:7
+msgid "Cubohemioctahedron"
+msgstr ""
+
+#: hacks/config/polyhedra.xml.h:8
+msgid "Deltoidal Hexecontahedron"
+msgstr ""
+
+#: hacks/config/polyhedra.xml.h:9
+msgid "Deltoidal Icositetrahedron"
+msgstr ""
+
+#: hacks/config/polyhedra.xml.h:10
+msgid "Disdyakisdodecahedron"
+msgstr ""
+
+#: hacks/config/polyhedra.xml.h:11
+msgid "Disdyakistriacontahedron"
+msgstr ""
+
+#: hacks/config/polyhedra.xml.h:12
+msgid "Display Random Polyhedron"
+msgstr ""
+
+#: hacks/config/polyhedra.xml.h:13
+msgid ""
+"Displays different 3D solids and some information about each. A new solid is "
+"chosen every few seconds. There are 75 uniform polyhedra, plus 5 inifite "
+"sets of prisms and antiprisms; including their duals brings the total to "
+"160. Written by Dr. Zvi Har'El and Jamie Zawinski."
+msgstr ""
+
+#: hacks/config/polyhedra.xml.h:14
+msgid "Ditrigonal Dodecadodecahedron"
+msgstr ""
+
+#: hacks/config/polyhedra.xml.h:15 hacks/config/sballs.xml.h:2
+msgid "Dodecahedron"
+msgstr ""
+
+#: hacks/config/polyhedra.xml.h:19
+msgid "Great Cubicuboctahedron"
+msgstr ""
+
+#: hacks/config/polyhedra.xml.h:20
+msgid "Great Deltoidal Hexecontahedron"
+msgstr ""
+
+#: hacks/config/polyhedra.xml.h:21
+msgid "Great Deltoidal Icositetrahedron"
+msgstr ""
+
+#: hacks/config/polyhedra.xml.h:22
+msgid "Great Dirhombicosidodecacron"
+msgstr ""
+
+#: hacks/config/polyhedra.xml.h:23
+msgid "Great Dirhombicosidodecahedron"
+msgstr ""
+
+#: hacks/config/polyhedra.xml.h:24
+msgid "Great Disdyakisdodecahedron"
+msgstr ""
+
+#: hacks/config/polyhedra.xml.h:25
+msgid "Great Disdyakistriacontahedron"
+msgstr ""
+
+#: hacks/config/polyhedra.xml.h:26
+msgid "Great Ditrigonal Dodecacronic Hexecontahedron"
+msgstr ""
+
+#: hacks/config/polyhedra.xml.h:27
+msgid "Great Ditrigonal Dodecicosidodecahedron"
+msgstr ""
+
+#: hacks/config/polyhedra.xml.h:28
+msgid "Great Ditrigonal Icosidodecahedron"
+msgstr ""
+
+#: hacks/config/polyhedra.xml.h:29
+msgid "Great Dodecacronic Hexecontahedron"
+msgstr ""
+
+#: hacks/config/polyhedra.xml.h:30
+msgid "Great Dodecadodecahedron"
+msgstr ""
+
+#: hacks/config/polyhedra.xml.h:31
+msgid "Great Dodecahedron"
+msgstr ""
+
+#: hacks/config/polyhedra.xml.h:32
+msgid "Great Dodecahemicosacron"
+msgstr ""
+
+#: hacks/config/polyhedra.xml.h:33
+msgid "Great Dodecahemicosahedron"
+msgstr ""
+
+#: hacks/config/polyhedra.xml.h:34
+msgid "Great Dodecahemidodecacron"
+msgstr ""
+
+#: hacks/config/polyhedra.xml.h:35
+msgid "Great Dodecahemidodecahedron"
+msgstr ""
+
+#: hacks/config/polyhedra.xml.h:36
+msgid "Great Dodecicosacron"
+msgstr ""
+
+#: hacks/config/polyhedra.xml.h:37
+msgid "Great Dodecicosahedron"
+msgstr ""
+
+#: hacks/config/polyhedra.xml.h:38
+msgid "Great Dodecicosidodecahedron"
+msgstr ""
+
+#: hacks/config/polyhedra.xml.h:39
+msgid "Great Hexacronic Icositetrahedron"
+msgstr ""
+
+#: hacks/config/polyhedra.xml.h:40
+msgid "Great Hexagonal Hexecontahedron"
+msgstr ""
+
+#: hacks/config/polyhedra.xml.h:41
+msgid "Great Icosacronic Hexecontahedron"
+msgstr ""
+
+#: hacks/config/polyhedra.xml.h:42
+msgid "Great Icosahedron"
+msgstr ""
+
+#: hacks/config/polyhedra.xml.h:43
+msgid "Great Icosicosidodecahedron"
+msgstr ""
+
+#: hacks/config/polyhedra.xml.h:44
+msgid "Great Icosidodecahedron"
+msgstr ""
+
+#: hacks/config/polyhedra.xml.h:45
+msgid "Great Icosihemidodecacron"
+msgstr ""
+
+#: hacks/config/polyhedra.xml.h:46
+msgid "Great Icosihemidodecahedron"
+msgstr ""
+
+#: hacks/config/polyhedra.xml.h:47
+msgid "Great Inverted Pentagonal Hexecontahedron"
+msgstr ""
+
+#: hacks/config/polyhedra.xml.h:48
+msgid "Great Inverted Snub Icosidodecahedron"
+msgstr ""
+
+#: hacks/config/polyhedra.xml.h:49
+msgid "Great Pentagonal Hexecontahedron"
+msgstr ""
+
+#: hacks/config/polyhedra.xml.h:50
+msgid "Great Pentagrammic Hexecontahedron"
+msgstr ""
+
+#: hacks/config/polyhedra.xml.h:51
+msgid "Great Pentakisdodekahedron"
+msgstr ""
+
+#: hacks/config/polyhedra.xml.h:52
+msgid "Great Retrosnub Icosidodecahedron"
+msgstr ""
+
+#: hacks/config/polyhedra.xml.h:53
+msgid "Great Rhombic Triacontahedron"
+msgstr ""
+
+#: hacks/config/polyhedra.xml.h:54
+msgid "Great Rhombicosidodecahedron"
+msgstr ""
+
+#: hacks/config/polyhedra.xml.h:55
+msgid "Great Rhombicuboctahedron"
+msgstr ""
+
+#: hacks/config/polyhedra.xml.h:56
+msgid "Great Rhombidodecacron"
+msgstr ""
+
+#: hacks/config/polyhedra.xml.h:57
+msgid "Great Rhombidodecahedron"
+msgstr ""
+
+#: hacks/config/polyhedra.xml.h:58
+msgid "Great Rhombihexacron"
+msgstr ""
+
+#: hacks/config/polyhedra.xml.h:59
+msgid "Great Rhombihexahedron"
+msgstr ""
+
+#: hacks/config/polyhedra.xml.h:60
+msgid "Great Snub Dodecicosidodecahedron"
+msgstr ""
+
+#: hacks/config/polyhedra.xml.h:61
+msgid "Great Snub Icosidodecahedron"
+msgstr ""
+
+#: hacks/config/polyhedra.xml.h:62
+msgid "Great Stellapentakisdodecahedron"
+msgstr ""
+
+#: hacks/config/polyhedra.xml.h:63
+msgid "Great Stellated Dodecahedron"
+msgstr ""
+
+#: hacks/config/polyhedra.xml.h:64
+msgid "Great Stellated Truncated Dodecahedron"
+msgstr ""
+
+#: hacks/config/polyhedra.xml.h:65
+msgid "Great Triakisicosahedron"
+msgstr ""
+
+#: hacks/config/polyhedra.xml.h:66
+msgid "Great Triakisoctahedron"
+msgstr ""
+
+#: hacks/config/polyhedra.xml.h:67
+msgid "Great Triambic Icosahedron"
+msgstr ""
+
+#: hacks/config/polyhedra.xml.h:68
+msgid "Great Truncated Cuboctahedron"
+msgstr ""
+
+#: hacks/config/polyhedra.xml.h:69
+msgid "Great Truncated Icosahedron"
+msgstr ""
+
+#: hacks/config/polyhedra.xml.h:70
+msgid "Great Truncated Icosidodecahedron"
+msgstr ""
+
+#: hacks/config/polyhedra.xml.h:71
+msgid "Hexahemioctacron"
+msgstr ""
+
+#: hacks/config/polyhedra.xml.h:72 hacks/config/sballs.xml.h:5
+msgid "Icosahedron"
+msgstr ""
+
+#: hacks/config/polyhedra.xml.h:73
+msgid "Icosidodecadodecahedron"
+msgstr ""
+
+#: hacks/config/polyhedra.xml.h:74
+msgid "Icosidodecahedron"
+msgstr ""
+
+#: hacks/config/polyhedra.xml.h:75
+msgid "Icositruncated Dodecadodecahedron"
+msgstr ""
+
+#: hacks/config/polyhedra.xml.h:76
+msgid "Inverted Snub Dodecadodecahedron"
+msgstr ""
+
+#: hacks/config/polyhedra.xml.h:77
+msgid "Medial Deltoidal Hexecontahedron"
+msgstr ""
+
+#: hacks/config/polyhedra.xml.h:78
+msgid "Medial Disdyakistriacontahedron"
+msgstr ""
+
+#: hacks/config/polyhedra.xml.h:79
+msgid "Medial Hexagonal Hexecontahedron"
+msgstr ""
+
+#: hacks/config/polyhedra.xml.h:80
+msgid "Medial Icosacronic Hexecontahedron"
+msgstr ""
+
+#: hacks/config/polyhedra.xml.h:81
+msgid "Medial Inverted Pentagonal Hexecontahedron"
+msgstr ""
+
+#: hacks/config/polyhedra.xml.h:82
+msgid "Medial Pentagonal Hexecontahedron"
+msgstr ""
+
+#: hacks/config/polyhedra.xml.h:83
+msgid "Medial Rhombic Triacontahedron"
+msgstr ""
+
+#: hacks/config/polyhedra.xml.h:84
+msgid "Medial Triambic Icosahedron"
+msgstr ""
+
+#: hacks/config/polyhedra.xml.h:86 hacks/config/sballs.xml.h:7
+msgid "Octahedron"
+msgstr ""
+
+#: hacks/config/polyhedra.xml.h:87
+msgid "Octahemioctacron"
+msgstr ""
+
+#: hacks/config/polyhedra.xml.h:88
+msgid "Octahemioctahedron"
+msgstr ""
+
+#: hacks/config/polyhedra.xml.h:89
+msgid "Pentagonal Antiprism"
+msgstr ""
+
+#: hacks/config/polyhedra.xml.h:90
+msgid "Pentagonal Deltohedron"
+msgstr ""
+
+#: hacks/config/polyhedra.xml.h:91
+msgid "Pentagonal Dipyramid"
+msgstr ""
+
+#: hacks/config/polyhedra.xml.h:92
+msgid "Pentagonal Hexecontahedron"
+msgstr ""
+
+#: hacks/config/polyhedra.xml.h:93
+msgid "Pentagonal Icositetrahedron"
+msgstr ""
+
+#: hacks/config/polyhedra.xml.h:94
+msgid "Pentagonal Prism"
+msgstr ""
+
+#: hacks/config/polyhedra.xml.h:95
+msgid "Pentagrammic Antiprism"
+msgstr ""
+
+#: hacks/config/polyhedra.xml.h:96
+msgid "Pentagrammic Concave Deltohedron"
+msgstr ""
+
+#: hacks/config/polyhedra.xml.h:97
+msgid "Pentagrammic Crossed Antiprism"
+msgstr ""
+
+#: hacks/config/polyhedra.xml.h:98
+msgid "Pentagrammic Deltohedron"
+msgstr ""
+
+#: hacks/config/polyhedra.xml.h:99
+msgid "Pentagrammic Dipyramid"
+msgstr ""
+
+#: hacks/config/polyhedra.xml.h:100
+msgid "Pentagrammic Prism"
+msgstr ""
+
+#: hacks/config/polyhedra.xml.h:101
+msgid "Pentakisdodecahedron"
+msgstr ""
+
+#: hacks/config/polyhedra.xml.h:102
+msgid "Polyhedra"
+msgstr ""
+
+#: hacks/config/polyhedra.xml.h:103
+msgid "Rhombic Dodecahedron"
+msgstr ""
+
+#: hacks/config/polyhedra.xml.h:104
+msgid "Rhombic Triacontahedron"
+msgstr ""
+
+#: hacks/config/polyhedra.xml.h:105
+msgid "Rhombicosacron"
+msgstr ""
+
+#: hacks/config/polyhedra.xml.h:106
+msgid "Rhombicosahedron"
+msgstr ""
+
+#: hacks/config/polyhedra.xml.h:107
+msgid "Rhombicosidodecahedron"
+msgstr ""
+
+#: hacks/config/polyhedra.xml.h:108
+msgid "Rhombicuboctahedron"
+msgstr ""
+
+#: hacks/config/polyhedra.xml.h:109
+msgid "Rhombidodecadodecahedron"
+msgstr ""
+
+#: hacks/config/polyhedra.xml.h:117
+#, fuzzy
+msgid "Show Description"
+msgstr "Kuvaus"
+
+#: hacks/config/polyhedra.xml.h:120
+msgid "Small Cubicuboctahedron"
+msgstr ""
+
+#: hacks/config/polyhedra.xml.h:121
+msgid "Small Ditrigonal Dodecacronic Hexecontahedron"
+msgstr ""
+
+#: hacks/config/polyhedra.xml.h:122
+msgid "Small Ditrigonal Dodecicosidodecahedron"
+msgstr ""
+
+#: hacks/config/polyhedra.xml.h:123
+msgid "Small Ditrigonal Icosidodecahedron"
+msgstr ""
+
+#: hacks/config/polyhedra.xml.h:124
+msgid "Small Dodecacronic Hexecontahedron"
+msgstr ""
+
+#: hacks/config/polyhedra.xml.h:125
+msgid "Small Dodecahemicosacron"
+msgstr ""
+
+#: hacks/config/polyhedra.xml.h:126
+msgid "Small Dodecahemicosahedron"
+msgstr ""
+
+#: hacks/config/polyhedra.xml.h:127
+msgid "Small Dodecahemidodecacron"
+msgstr ""
+
+#: hacks/config/polyhedra.xml.h:128
+msgid "Small Dodecahemidodecahedron"
+msgstr ""
+
+#: hacks/config/polyhedra.xml.h:129
+msgid "Small Dodecicosacron"
+msgstr ""
+
+#: hacks/config/polyhedra.xml.h:130
+msgid "Small Dodecicosahedron"
+msgstr ""
+
+#: hacks/config/polyhedra.xml.h:131
+msgid "Small Dodecicosidodecahedron"
+msgstr ""
+
+#: hacks/config/polyhedra.xml.h:132
+msgid "Small Hexacronic Icositetrahedron"
+msgstr ""
+
+#: hacks/config/polyhedra.xml.h:133
+msgid "Small Hexagonal Hexecontahedron"
+msgstr ""
+
+#: hacks/config/polyhedra.xml.h:134
+msgid "Small Hexagrammic Hexecontahedron"
+msgstr ""
+
+#: hacks/config/polyhedra.xml.h:135
+msgid "Small Icosacronic Hexecontahedron"
+msgstr ""
+
+#: hacks/config/polyhedra.xml.h:136
+msgid "Small Icosicosidodecahedron"
+msgstr ""
+
+#: hacks/config/polyhedra.xml.h:137
+msgid "Small Icosihemidodecacron"
 msgstr ""
 
 msgstr ""
 
-#: hacks/config/petri.xml.h:13
-msgid "Maxium Rate of Death"
+#: hacks/config/polyhedra.xml.h:138
+msgid "Small Icosihemidodecahedron"
 msgstr ""
 
 msgstr ""
 
-#: hacks/config/petri.xml.h:14
-msgid "Maxium Rate of Growth"
+#: hacks/config/polyhedra.xml.h:139
+msgid "Small Retrosnub Icosicosidodecahedron"
 msgstr ""
 
 msgstr ""
 
-#: hacks/config/petri.xml.h:15
-msgid "Minium Lifespan"
+#: hacks/config/polyhedra.xml.h:140
+msgid "Small Rhombidodecacron"
 msgstr ""
 
 msgstr ""
 
-#: hacks/config/petri.xml.h:16
-msgid "Minium Rate of Death"
+#: hacks/config/polyhedra.xml.h:141
+msgid "Small Rhombidodecahedron"
 msgstr ""
 
 msgstr ""
 
-#: hacks/config/petri.xml.h:17
-msgid "Minium Rate of Growth"
+#: hacks/config/polyhedra.xml.h:142
+msgid "Small Rhombihexacron"
 msgstr ""
 
 msgstr ""
 
-#: hacks/config/petri.xml.h:18
-msgid "Mold Varieties"
+#: hacks/config/polyhedra.xml.h:143
+msgid "Small Rhombihexahedron"
 msgstr ""
 
 msgstr ""
 
-#: hacks/config/petri.xml.h:19
-msgid "Offspring"
+#: hacks/config/polyhedra.xml.h:144
+msgid "Small Snub Icosicosidodecahedron"
 msgstr ""
 
 msgstr ""
 
-#: hacks/config/petri.xml.h:20
-msgid "Petri"
+#: hacks/config/polyhedra.xml.h:145
+msgid "Small Stellapentakisdodecahedron"
 msgstr ""
 
 msgstr ""
 
-#: hacks/config/petri.xml.h:21
-msgid "Quickly"
+#: hacks/config/polyhedra.xml.h:146
+msgid "Small Stellated Dodecahedron"
 msgstr ""
 
 msgstr ""
 
-#: hacks/config/petri.xml.h:24
-msgid "Slowly"
+#: hacks/config/polyhedra.xml.h:147
+msgid "Small Stellated Truncated Dodecahedron"
 msgstr ""
 
 msgstr ""
 
-#: hacks/config/petri.xml.h:26
-msgid "Square"
+#: hacks/config/polyhedra.xml.h:148
+msgid "Small Triambic Icosahedron"
 msgstr ""
 
 msgstr ""
 
-#: hacks/config/petri.xml.h:27
-msgid "This simulates colonies of mold growing in a petri dish. Growing colored circles overlap and leave spiral interference in their wake. Written by Dan Bornstein."
+#: hacks/config/polyhedra.xml.h:149
+msgid "Snub Cube"
 msgstr ""
 
 msgstr ""
 
-#: hacks/config/phosphor.xml.h:1
-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. Written by Jamie Zawinski."
+#: hacks/config/polyhedra.xml.h:150
+msgid "Snub Dodecadodecahedron"
 msgstr ""
 
 msgstr ""
 
-#: hacks/config/phosphor.xml.h:2
-msgid "Dump pipe"
+#: hacks/config/polyhedra.xml.h:151
+msgid "Snub Dodecahedron"
 msgstr ""
 
 msgstr ""
 
-#: hacks/config/phosphor.xml.h:5
-msgid "Phosphor"
+#: hacks/config/polyhedra.xml.h:152
+msgid "Snub Icosidodecadodecahedron"
 msgstr ""
 
 msgstr ""
 
-#: hacks/config/phosphor.xml.h:6
-msgid "Scale"
+#: hacks/config/polyhedra.xml.h:153
+msgid "Stellated Truncated Hexahedron"
 msgstr ""
 
 msgstr ""
 
-#: hacks/config/phosphor.xml.h:10
-msgid "Use PTY"
+#: hacks/config/polyhedra.xml.h:154
+msgid "Tetradyakishexahedron"
 msgstr ""
 
 msgstr ""
 
-#: hacks/config/piecewise.xml.h:1
-msgid "Color shifting speed"
+#: hacks/config/polyhedra.xml.h:156
+msgid "Tetrahemihexacron"
 msgstr ""
 
 msgstr ""
 
-#: hacks/config/piecewise.xml.h:6
-msgid "Maximum radius"
+#: hacks/config/polyhedra.xml.h:157
+msgid "Tetrahemihexahedron"
 msgstr ""
 
 msgstr ""
 
-#: hacks/config/piecewise.xml.h:7
-msgid "Minimum radius"
+#: hacks/config/polyhedra.xml.h:158
+msgid "Tetrakishexahedron"
 msgstr ""
 
 msgstr ""
 
-#: hacks/config/piecewise.xml.h:8
-msgid "Piecewise"
+#: hacks/config/polyhedra.xml.h:159
+msgid "Triakisicosahedron"
 msgstr ""
 
 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."
+#: hacks/config/polyhedra.xml.h:160
+msgid "Triakisoctahedron"
 msgstr ""
 
 msgstr ""
 
-#: hacks/config/pipes.xml.h:1
-msgid "Allow Tight Turns"
+#: hacks/config/polyhedra.xml.h:161
+msgid "Triakistetrahedron"
 msgstr ""
 
 msgstr ""
 
-#: hacks/config/pipes.xml.h:2
-msgid "Ball Joints"
+#: hacks/config/polyhedra.xml.h:162
+msgid "Tridyakisicosahedron"
 msgstr ""
 
 msgstr ""
 
-#: hacks/config/pipes.xml.h:3
-msgid "Curved Pipes"
+#: hacks/config/polyhedra.xml.h:163
+msgid "Truncated Cube"
 msgstr ""
 
 msgstr ""
 
-#: hacks/config/pipes.xml.h:6
-msgid "Fisheye Lens"
+#: hacks/config/polyhedra.xml.h:164
+msgid "Truncated Cuboctahedron"
 msgstr ""
 
 msgstr ""
 
-#: hacks/config/pipes.xml.h:7
-msgid "Gadgetry"
+#: hacks/config/polyhedra.xml.h:165
+msgid "Truncated Dodecadodecahedron"
 msgstr ""
 
 msgstr ""
 
-#: hacks/config/pipes.xml.h:8
-msgid "If you've ever been in the same room with a Windows NT machine, you've probably seen this GL hack. This version is by Marcelo Vianna."
+#: hacks/config/polyhedra.xml.h:166
+msgid "Truncated Dodecahedron"
 msgstr ""
 
 msgstr ""
 
-#: hacks/config/pipes.xml.h:9
-#: hacks/config/wormhole.xml.h:4
-msgid "Lots"
+#: hacks/config/polyhedra.xml.h:167
+msgid "Truncated Great Dodecahedron"
 msgstr ""
 
 msgstr ""
 
-#: hacks/config/pipes.xml.h:11
-msgid "Number of Pipe Systems"
+#: hacks/config/polyhedra.xml.h:168
+msgid "Truncated Icosahedron"
 msgstr ""
 
 msgstr ""
 
-#: hacks/config/pipes.xml.h:12
-msgid "Pipe Fittings"
+#: hacks/config/polyhedra.xml.h:169
+msgid "Truncated Icosidodechedon"
 msgstr ""
 
 msgstr ""
 
-#: hacks/config/pipes.xml.h:13
-msgid "Pipes"
+#: hacks/config/polyhedra.xml.h:170
+msgid "Truncated Octahedron"
 msgstr ""
 
 msgstr ""
 
-#: hacks/config/pipes.xml.h:17
-msgid "System Length"
+#: hacks/config/polyhedra.xml.h:171
+msgid "Truncated Tetrahedron"
 msgstr ""
 
 #: hacks/config/polyominoes.xml.h:3
 msgstr ""
 
 #: hacks/config/polyominoes.xml.h:3
@@ -5700,7 +6173,9 @@ msgid "Polyominoes"
 msgstr ""
 
 #: hacks/config/polyominoes.xml.h:8
 msgstr ""
 
 #: hacks/config/polyominoes.xml.h:8
-msgid "Repeatedly attempts to completely fill a rectangle with irregularly-shaped puzzle pieces. Written by Stephen Montgomery-Smith."
+msgid ""
+"Repeatedly attempts to completely fill a rectangle with irregularly-shaped "
+"puzzle pieces. Written by Stephen Montgomery-Smith."
 msgstr ""
 
 #: hacks/config/polytopes.xml.h:2
 msgstr ""
 
 #: hacks/config/polytopes.xml.h:2
@@ -5740,7 +6215,12 @@ msgid "Single Color"
 msgstr ""
 
 #: hacks/config/polytopes.xml.h:22
 msgstr ""
 
 #: 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."
+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:2
 msgstr ""
 
 #: hacks/config/pong.xml.h:2
@@ -5748,7 +6228,10 @@ msgid "Pong"
 msgstr ""
 
 #: hacks/config/pong.xml.h:6
 msgstr ""
 
 #: hacks/config/pong.xml.h:6
-msgid "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."
+msgid ""
+"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."
 msgstr ""
 
 #: hacks/config/popsquares.xml.h:1
 msgstr ""
 
 #: hacks/config/popsquares.xml.h:1
@@ -5768,7 +6251,8 @@ msgid "Subdivision"
 msgstr ""
 
 #: hacks/config/popsquares.xml.h:9
 msgstr ""
 
 #: 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
 msgstr ""
 
 #: hacks/config/popsquares.xml.h:10
@@ -5779,12 +6263,29 @@ msgstr ""
 msgid "popsquares"
 msgstr ""
 
 msgid "popsquares"
 msgstr ""
 
+#: hacks/config/providence.xml.h:1
+msgid "Draw Eye"
+msgstr ""
+
+#: hacks/config/providence.xml.h:3
+msgid "Providence"
+msgstr ""
+
+#: hacks/config/providence.xml.h:7
+msgid ""
+"The providence code displays an eye, shrouded in glory, set upon the base of "
+"a pyramid. Written by Blair Tennessy."
+msgstr ""
+
 #: hacks/config/pulsar.xml.h:1
 msgid "Anti-alias Lines"
 msgstr ""
 
 #: hacks/config/pulsar.xml.h:3
 #: hacks/config/pulsar.xml.h:1
 msgid "Anti-alias Lines"
 msgstr ""
 
 #: hacks/config/pulsar.xml.h:3
-msgid "Draws some intersecting planes, making use of alpha blending, fog, textures, and mipmaps, plus a ``frames per second'' meter so that you can tell how fast your graphics card is... Requires OpenGL. Written by David Konerding."
+msgid ""
+"Draws some intersecting planes, making use of alpha blending, fog, textures, "
+"and mipmaps, plus a ``frames per second'' meter so that you can tell how "
+"fast your graphics card is... Requires OpenGL. Written by David Konerding."
 msgstr ""
 
 #: hacks/config/pulsar.xml.h:4
 msgstr ""
 
 #: hacks/config/pulsar.xml.h:4
@@ -5844,7 +6345,8 @@ msgid "Pyro"
 msgstr ""
 
 #: hacks/config/pyro.xml.h:11
 msgstr ""
 
 #: hacks/config/pyro.xml.h:11
-msgid "Pyro draws exploding fireworks. Blah blah blah. Written by Jamie Zawinski."
+msgid ""
+"Pyro draws exploding fireworks. Blah blah blah. Written by Jamie Zawinski."
 msgstr ""
 
 #: hacks/config/qix.xml.h:1
 msgstr ""
 
 #: hacks/config/qix.xml.h:1
@@ -5880,7 +6382,11 @@ msgid "Subtractive Colors"
 msgstr ""
 
 #: hacks/config/qix.xml.h:24
 msgstr ""
 
 #: hacks/config/qix.xml.h:24
-msgid "This is the swiss army chainsaw of qix programs. It bounces a series of line segments around the screen, and uses variations on this basic motion pattern to produce all sorts of different presentations: line segments, filled polygons, overlapping translucent areas... Written by Jamie Zawinski."
+msgid ""
+"This is the swiss army chainsaw of qix programs. It bounces a series of line "
+"segments around the screen, and uses variations on this basic motion pattern "
+"to produce all sorts of different presentations: line segments, filled "
+"polygons, overlapping translucent areas... Written by Jamie Zawinski."
 msgstr ""
 
 #: hacks/config/qix.xml.h:25
 msgstr ""
 
 #: hacks/config/qix.xml.h:25
@@ -5892,7 +6398,10 @@ msgid "Queens"
 msgstr ""
 
 #: hacks/config/queens.xml.h:5
 msgstr ""
 
 #: hacks/config/queens.xml.h:5
-msgid "Solves the N-Queens problem (where, in this program, N is between 5 and 10 queens.) The problem is: how may one place N queens on an NxN chessboard such that no queen can attack a sister? Written by Blair Tennessy."
+msgid ""
+"Solves the N-Queens problem (where, in this program, N is between 5 and 10 "
+"queens.) The problem is: how may one place N queens on an NxN chessboard "
+"such that no queen can attack a sister? Written by Blair Tennessy."
 msgstr ""
 
 #: hacks/config/rd-bomb.xml.h:1
 msgstr ""
 
 #: hacks/config/rd-bomb.xml.h:1
@@ -5905,7 +6414,10 @@ msgid "1%"
 msgstr ""
 
 #: hacks/config/rd-bomb.xml.h:7
 msgstr ""
 
 #: hacks/config/rd-bomb.xml.h:7
-msgid "Another variation of the `Bomb' program by Scott Draves. This draws a grid of growing square-like shapes that, once they overtake each other, react in unpredictable ways. ``RD'' stands for reaction-diffusion."
+msgid ""
+"Another variation of the `Bomb' program by Scott Draves. This draws a grid "
+"of growing square-like shapes that, once they overtake each other, react in "
+"unpredictable ways. ``RD'' stands for reaction-diffusion."
 msgstr ""
 
 #: hacks/config/rd-bomb.xml.h:8
 msgstr ""
 
 #: hacks/config/rd-bomb.xml.h:8
@@ -5928,8 +6440,7 @@ msgstr ""
 msgid "Seed Radius"
 msgstr ""
 
 msgid "Seed Radius"
 msgstr ""
 
-#: hacks/config/rd-bomb.xml.h:19
-#: hacks/config/twang.xml.h:12
+#: hacks/config/rd-bomb.xml.h:19 hacks/config/twang.xml.h:12
 msgid "Tile Size"
 msgstr ""
 
 msgid "Tile Size"
 msgstr ""
 
@@ -5978,7 +6489,10 @@ msgid "Storm"
 msgstr ""
 
 #: hacks/config/ripples.xml.h:14
 msgstr ""
 
 #: hacks/config/ripples.xml.h:14
-msgid "This draws rippling interference patterns like splashing water. With the -water option, it manipulates your desktop image to look like something is dripping into it. Written by Tom Hammersley."
+msgid ""
+"This draws rippling interference patterns like splashing water. With the -"
+"water option, it manipulates your desktop image to look like something is "
+"dripping into it. Written by Tom Hammersley."
 msgstr ""
 
 #: hacks/config/rocks.xml.h:7
 msgstr ""
 
 #: hacks/config/rocks.xml.h:7
@@ -5994,7 +6508,10 @@ msgid "Steering"
 msgstr ""
 
 #: hacks/config/rocks.xml.h:11
 msgstr ""
 
 #: hacks/config/rocks.xml.h:11
-msgid "This draws an animation of flight through an asteroid field, with changes in rotation and direction. It can also display 3D separations for red/blue glasses! Mostly written by Jamie Zawinski."
+msgid ""
+"This draws an animation of flight through an asteroid field, with changes in "
+"rotation and direction. It can also display 3D separations for red/blue "
+"glasses! Mostly written by Jamie Zawinski."
 msgstr ""
 
 #: hacks/config/rocks.xml.h:13
 msgstr ""
 
 #: hacks/config/rocks.xml.h:13
@@ -6006,7 +6523,12 @@ msgid "Rorschach"
 msgstr ""
 
 #: hacks/config/rorschach.xml.h:9
 msgstr ""
 
 #: hacks/config/rorschach.xml.h:9
-msgid "This generates random inkblot patterns. The algorithm is deceptively simple for how well it works; it merely walks a dot around the screen randomly, and then reflects the image horizontally, vertically, or both. Any deep-seated neurotic tendencies which this program reveals are your own problem. Written by Jamie Zawinski."
+msgid ""
+"This generates random inkblot patterns. The algorithm is deceptively simple "
+"for how well it works; it merely walks a dot around the screen randomly, and "
+"then reflects the image horizontally, vertically, or both. Any deep-seated "
+"neurotic tendencies which this program reveals are your own problem. Written "
+"by Jamie Zawinski."
 msgstr ""
 
 #: hacks/config/rorschach.xml.h:10
 msgstr ""
 
 #: hacks/config/rorschach.xml.h:10
@@ -6018,11 +6540,12 @@ msgid "With Y Symmetry"
 msgstr ""
 
 #: hacks/config/rotor.xml.h:1
 msgstr ""
 
 #: hacks/config/rotor.xml.h:1
-msgid "Another ancient xlock demo, this one by Tom Lawrence. It draws a line segment moving along a complex spiraling curve."
+msgid ""
+"Another ancient xlock demo, this one by Tom Lawrence. It draws a line "
+"segment moving along a complex spiraling curve."
 msgstr ""
 
 msgstr ""
 
-#: hacks/config/rotor.xml.h:4
-#: hacks/config/wander.xml.h:9
+#: hacks/config/rotor.xml.h:4 hacks/config/wander.xml.h:9
 msgid "Length"
 msgstr ""
 
 msgid "Length"
 msgstr ""
 
@@ -6035,7 +6558,9 @@ msgid "Animate"
 msgstr ""
 
 #: hacks/config/rotzoomer.xml.h:4
 msgstr ""
 
 #: hacks/config/rotzoomer.xml.h:4
-msgid "Creates a collage of rotated and scaled portions of the screen. Written by Claudio Matsuoka."
+msgid ""
+"Creates a collage of rotated and scaled portions of the screen. Written by "
+"Claudio Matsuoka."
 msgstr ""
 
 #: hacks/config/rotzoomer.xml.h:6
 msgstr ""
 
 #: hacks/config/rotzoomer.xml.h:6
@@ -6059,7 +6584,9 @@ msgid "Wandering Rectangles"
 msgstr ""
 
 #: hacks/config/rubik.xml.h:2
 msgstr ""
 
 #: hacks/config/rubik.xml.h:2
-msgid "Draws a Rubik's Cube that rotates in three dimensions and repeatedly shuffles and solves itself. Another fine GL hack by Marcelo Vianna."
+msgid ""
+"Draws a Rubik's Cube that rotates in three dimensions and repeatedly "
+"shuffles and solves itself. Another fine GL hack by Marcelo Vianna."
 msgstr ""
 
 #: hacks/config/rubik.xml.h:5
 msgstr ""
 
 #: hacks/config/rubik.xml.h:5
@@ -6070,24 +6597,11 @@ msgstr ""
 msgid "Show Shuffling"
 msgstr ""
 
 msgid "Show Shuffling"
 msgstr ""
 
-#: hacks/config/sballs.xml.h:1
-msgid "Cube"
-msgstr ""
-
-#: hacks/config/sballs.xml.h:2
-msgid "Dodecahedron"
-msgstr ""
-
 #: hacks/config/sballs.xml.h:3
 #: hacks/config/sballs.xml.h:3
-msgid "Draws an animation of textured balls spinning like crazy in GL. Requires OpenGL, and a machine with fast hardware support for texture maps. Written by Eric Lassauge &lt;lassauge@free.fr&gt;."
-msgstr ""
-
-#: hacks/config/sballs.xml.h:5
-msgid "Icosahedron"
-msgstr ""
-
-#: hacks/config/sballs.xml.h:7
-msgid "Octahedron"
+msgid ""
+"Draws an animation of textured balls spinning like crazy in GL. Requires "
+"OpenGL, and a machine with fast hardware support for texture maps. Written "
+"by Eric Lassauge &lt;lassauge@users.sourceforge.net&gt;."
 msgstr ""
 
 #: hacks/config/sballs.xml.h:8
 msgstr ""
 
 #: hacks/config/sballs.xml.h:8
@@ -6111,7 +6625,9 @@ msgid "ShadeBobs"
 msgstr ""
 
 #: hacks/config/shadebobs.xml.h:11
 msgstr ""
 
 #: hacks/config/shadebobs.xml.h:11
-msgid "This draws smoothly-shaded oscillating oval patterns, that look something like vapor trails or neon tubes. Written by Shane Smit."
+msgid ""
+"This draws smoothly-shaded oscillating oval patterns, that look something "
+"like vapor trails or neon tubes. Written by Shane Smit."
 msgstr ""
 
 #: hacks/config/sierpinski.xml.h:6
 msgstr ""
 
 #: hacks/config/sierpinski.xml.h:6
@@ -6119,7 +6635,9 @@ msgid "Sierpinski"
 msgstr ""
 
 #: hacks/config/sierpinski.xml.h:10
 msgstr ""
 
 #: hacks/config/sierpinski.xml.h:10
-msgid "This draws the two-dimensional variant of the recursive Sierpinski triangle fractal. Written by Desmond Daignault."
+msgid ""
+"This draws the two-dimensional variant of the recursive Sierpinski triangle "
+"fractal. Written by Desmond Daignault."
 msgstr ""
 
 #: hacks/config/sierpinski3d.xml.h:7
 msgstr ""
 
 #: hacks/config/sierpinski3d.xml.h:7
@@ -6127,11 +6645,12 @@ msgid "Sierpinski3D"
 msgstr ""
 
 #: hacks/config/sierpinski3d.xml.h:11
 msgstr ""
 
 #: hacks/config/sierpinski3d.xml.h:11
-msgid "This draws the three-dimensional variant of the recursive Sierpinski triangle fractal, using GL. Written by Tim Robinson and Jamie Zawinski."
+msgid ""
+"This draws the three-dimensional variant of the recursive Sierpinski "
+"triangle fractal, using GL. Written by Tim Robinson and Jamie Zawinski."
 msgstr ""
 
 msgstr ""
 
-#: hacks/config/slidescreen.xml.h:1
-#: hacks/config/twang.xml.h:1
+#: hacks/config/slidescreen.xml.h:1 hacks/config/twang.xml.h:1
 #: hacks/config/zoom.xml.h:1
 msgid "Border Width"
 msgstr ""
 #: hacks/config/zoom.xml.h:1
 msgid "Border Width"
 msgstr ""
@@ -6145,7 +6664,12 @@ msgid "SlideScreen"
 msgstr ""
 
 #: hacks/config/slidescreen.xml.h:8
 msgstr ""
 
 #: hacks/config/slidescreen.xml.h:8
-msgid "This takes an image, divides it into a grid, and then randomly shuffles the squares around as if it was one of those annoying ``16-puzzle'' games, where there is a grid of squares, one of which is missing. I hate trying to solve those puzzles, but watching one permute itself is more amusing. Written by Jamie Zawinski."
+msgid ""
+"This takes an image, divides it into a grid, and then randomly shuffles the "
+"squares around as if it was one of those annoying ``16-puzzle'' games, where "
+"there is a grid of squares, one of which is missing. I hate trying to solve "
+"those puzzles, but watching one permute itself is more amusing. Written by "
+"Jamie Zawinski."
 msgstr ""
 
 #: hacks/config/slip.xml.h:6
 msgstr ""
 
 #: hacks/config/slip.xml.h:6
@@ -6153,34 +6677,82 @@ msgid "Slip"
 msgstr ""
 
 #: hacks/config/slip.xml.h:10
 msgstr ""
 
 #: hacks/config/slip.xml.h:10
-msgid "This program throws some random bits on the screen, then sucks them through a jet engine and spews them out the other side. To avoid turning the image completely to mush, every now and then it will and then it interjects some splashes of color into the scene, or go into a spin cycle, or stretch the image like taffy, or (this is my addition) grab an image of your current desktop to chew on. Originally written by Scott Draves; whacked on by Jamie Zawinski."
+msgid ""
+"This program throws some random bits on the screen, then sucks them through "
+"a jet engine and spews them out the other side. To avoid turning the image "
+"completely to mush, every now and then it will and then it interjects some "
+"splashes of color into the scene, or go into a spin cycle, or stretch the "
+"image like taffy, or (this is my addition) grab an image of your current "
+"desktop to chew on. Originally written by Scott Draves; whacked on by Jamie "
+"Zawinski."
 msgstr ""
 
 #: hacks/config/sonar.xml.h:1
 msgstr ""
 
 #: hacks/config/sonar.xml.h:1
-msgid "Ping Subnet"
+msgid "Ping known hosts"
 msgstr ""
 
 #: hacks/config/sonar.xml.h:2
 msgstr ""
 
 #: hacks/config/sonar.xml.h:2
-msgid "Simulation Team Members"
+msgid "Ping mode..."
 msgstr ""
 
 #: hacks/config/sonar.xml.h:3
 msgstr ""
 
 #: hacks/config/sonar.xml.h:3
-msgid "Sonar"
+msgid "Ping subnet/24 (254 hosts)"
 msgstr ""
 
 #: hacks/config/sonar.xml.h:4
 msgstr ""
 
 #: hacks/config/sonar.xml.h:4
-msgid "Team A Name"
+msgid "Ping subnet/25 (126 hosts)"
 msgstr ""
 
 #: hacks/config/sonar.xml.h:5
 msgstr ""
 
 #: hacks/config/sonar.xml.h:5
-msgid "Team B Name"
+msgid "Ping subnet/26 (62 hosts)"
 msgstr ""
 
 #: hacks/config/sonar.xml.h:6
 msgstr ""
 
 #: hacks/config/sonar.xml.h:6
-msgid "This program draws a simulation of a sonar screen. Written by default, it displays a random assortment of ``bogies'' on the screen, but if compiled properly, it can ping (pun intended) your local network, and actually plot the proximity of the other hosts on your network to you. It would be easy to make it monitor other sources of data, too. (Processes? Active network connections? CPU usage per user?) Written by Stephen Martin."
+msgid "Ping subnet/27 (31 hosts)"
 msgstr ""
 
 #: hacks/config/sonar.xml.h:7
 msgstr ""
 
 #: hacks/config/sonar.xml.h:7
+msgid "Ping subnet/28 (14 hosts)"
+msgstr ""
+
+#: hacks/config/sonar.xml.h:8
+msgid "Ping subnet/29 (6 hosts)"
+msgstr ""
+
+#: hacks/config/sonar.xml.h:9
+msgid "Ping subnet/30 (2 hosts)"
+msgstr ""
+
+#: hacks/config/sonar.xml.h:10
+msgid "Resolve Host Names"
+msgstr ""
+
+#: hacks/config/sonar.xml.h:11
+msgid "Simulation Team Members"
+msgstr ""
+
+#: hacks/config/sonar.xml.h:12
+msgid "Sonar"
+msgstr ""
+
+#: hacks/config/sonar.xml.h:13
+msgid "Team A Name"
+msgstr ""
+
+#: hacks/config/sonar.xml.h:14
+msgid "Team B Name"
+msgstr ""
+
+#: hacks/config/sonar.xml.h:15
+msgid ""
+"This program draws a simulation of a sonar screen. By default, it displays a "
+"random assortment of ``bogies'' on the screen, but if installed as \"setuid "
+"root\", it can ping (pun intended) your local network, and actually plot the "
+"proximity of the other hosts on your network to you. Written by Stephen "
+"Martin and Jamie Zawinski."
+msgstr ""
+
+#: hacks/config/sonar.xml.h:16
 msgid "vs."
 msgstr ""
 
 msgid "vs."
 msgstr ""
 
@@ -6209,7 +6781,9 @@ msgid "Rocky Walls"
 msgstr ""
 
 #: hacks/config/speedmine.xml.h:12
 msgstr ""
 
 #: hacks/config/speedmine.xml.h:12
-msgid "Simulates speeding down a rocky mineshaft, or a funky dancing worm. Written by Conrad Parker."
+msgid ""
+"Simulates speeding down a rocky mineshaft, or a funky dancing worm. Written "
+"by Conrad Parker."
 msgstr ""
 
 #: hacks/config/speedmine.xml.h:16
 msgstr ""
 
 #: hacks/config/speedmine.xml.h:16
@@ -6220,21 +6794,30 @@ msgstr ""
 msgid "Thrust"
 msgstr ""
 
 msgid "Thrust"
 msgstr ""
 
-#: hacks/config/speedmine.xml.h:19
-#: hacks/config/worm.xml.h:10
+#: hacks/config/speedmine.xml.h:19 hacks/config/worm.xml.h:10
 msgid "Worm"
 msgstr ""
 
 #: hacks/config/sphere.xml.h:1
 msgid "Worm"
 msgstr ""
 
 #: hacks/config/sphere.xml.h:1
-msgid "Another of the classic screenhacks of the distant past, this one draws shaded spheres in multiple colors. This hack traces its lineage back to Tom Duff in 1982."
+msgid ""
+"Another of the classic screenhacks of the distant past, this one draws "
+"shaded spheres in multiple colors. This hack traces its lineage back to Tom "
+"Duff in 1982."
 msgstr ""
 
 msgstr ""
 
-#: hacks/config/sphereEversion.xml.h:1
+#: hacks/config/sphereeversion.xml.h:1
 msgid "SphereEversion"
 msgstr ""
 
 msgid "SphereEversion"
 msgstr ""
 
-#: hacks/config/sphereEversion.xml.h:2
-msgid "SphereEversion draws an animation of a sphere being turned inside out. A sphere can be turned inside out, without any tears, sharp creases or discontinuities, if the surface of the sphere is allowed to intersect itself. This program animates what is known as the Thurston Eversion. Written by Nathaniel Thurston and Michael McGuffin. This program is not included with the XScreenSaver package, but if you don't have it already, you can find it at &lt;http://www.dgp.utoronto.ca/~mjmcguff/eversion/&gt;."
+#: hacks/config/sphereeversion.xml.h:2
+msgid ""
+"SphereEversion draws an animation of a sphere being turned inside out. A "
+"sphere can be turned inside out, without any tears, sharp creases or "
+"discontinuities, if the surface of the sphere is allowed to intersect "
+"itself. This program animates what is known as the Thurston Eversion. "
+"Written by Nathaniel Thurston and Michael McGuffin. This program is not "
+"included with the XScreenSaver package, but if you don't have it already, "
+"you can find it at &lt;http://www.dgp.utoronto.ca/~mjmcguff/eversion/&gt;."
 msgstr ""
 
 #: hacks/config/spheremonics.xml.h:20
 msgstr ""
 
 #: hacks/config/spheremonics.xml.h:20
@@ -6246,16 +6829,21 @@ msgid "Spheremonics"
 msgstr ""
 
 #: hacks/config/spheremonics.xml.h:24
 msgstr ""
 
 #: hacks/config/spheremonics.xml.h:24
-msgid "These closed objects are commonly called spherical harmonics, although they are only remotely related to the mathematical definition found in the solution to certain wave functions, most notable the eigenfunctions of angular momentum operators. Written by Paul Bourke and Jamie Zawinski."
+msgid ""
+"These closed objects are commonly called spherical harmonics, although they "
+"are only remotely related to the mathematical definition found in the "
+"solution to certain wave functions, most notable the eigenfunctions of "
+"angular momentum operators. Written by Paul Bourke and Jamie Zawinski."
 msgstr ""
 
 msgstr ""
 
-#: hacks/config/spiral.xml.h:2
-#: hacks/config/superquadrics.xml.h:2
+#: hacks/config/spiral.xml.h:2 hacks/config/superquadrics.xml.h:2
 msgid "Cycles"
 msgstr ""
 
 #: hacks/config/spiral.xml.h:7
 msgid "Cycles"
 msgstr ""
 
 #: hacks/config/spiral.xml.h:7
-msgid "Moving circular patterns, by Peter Schmitzberger. Moving circular patterns means moire; interference patterns, of course."
+msgid ""
+"Moving circular patterns, by Peter Schmitzberger. Moving circular patterns "
+"means moire; interference patterns, of course."
 msgstr ""
 
 #: hacks/config/spiral.xml.h:11
 msgstr ""
 
 #: hacks/config/spiral.xml.h:11
@@ -6263,7 +6851,9 @@ msgid "Spiral"
 msgstr ""
 
 #: hacks/config/spotlight.xml.h:1
 msgstr ""
 
 #: hacks/config/spotlight.xml.h:1
-msgid "Draws a spotlight scanning across a black screen, illuminating the underlying desktop when it passes. Written by Rick Schultz."
+msgid ""
+"Draws a spotlight scanning across a black screen, illuminating the "
+"underlying desktop when it passes. Written by Rick Schultz."
 msgstr ""
 
 #: hacks/config/spotlight.xml.h:6
 msgstr ""
 
 #: hacks/config/spotlight.xml.h:6
@@ -6279,7 +6869,10 @@ msgid "Sproingies"
 msgstr ""
 
 #: hacks/config/squiral.xml.h:3
 msgstr ""
 
 #: hacks/config/squiral.xml.h:3
-msgid "Draws a set of interacting, square-spiral-producing automata. The spirals grow outward until they hit something, then they go around it. Written by Jeff Epler."
+msgid ""
+"Draws a set of interacting, square-spiral-producing automata. The spirals "
+"grow outward until they hit something, then they go around it. Written by "
+"Jeff Epler."
 msgstr ""
 
 #: hacks/config/squiral.xml.h:5
 msgstr ""
 
 #: hacks/config/squiral.xml.h:5
@@ -6290,8 +6883,7 @@ msgstr ""
 msgid "Left"
 msgstr ""
 
 msgid "Left"
 msgstr ""
 
-#: hacks/config/squiral.xml.h:11
-#: hacks/config/twang.xml.h:8
+#: hacks/config/squiral.xml.h:11 hacks/config/twang.xml.h:8
 msgid "Randomness"
 msgstr ""
 
 msgid "Randomness"
 msgstr ""
 
@@ -6308,7 +6900,18 @@ msgid "SSystem"
 msgstr ""
 
 #: hacks/config/ssystem.xml.h:2
 msgstr ""
 
 #: hacks/config/ssystem.xml.h:2
-msgid "SSystem is a GL Solar System simulator. It simulates flybys of Sun, the nine planets and a few major satellites, with four camera modes. Written by Raul Alonso. This is not included with the XScreenSaver package, but is packaged separately. Note: SSystem does not work as a screen saver on all systems, because it doesn't communicate with xscreensaver properly. It happens to work with some window managers, but not with others, so your mileage may vary. SSystem was once available at &lt;http://www1.las.es/~amil/ssystem/&gt;, but is now gone. You may still be able to find copies elsewhere. SSystem has since evolved into Celestia, found at &lt;http://www.shatters.net/celestia/&gt;. Sadly, Celestia does not work with xscreensaver at all. You are encouraged to nag the authors into adding xscreensaver support!"
+msgid ""
+"SSystem is a GL Solar System simulator. It simulates flybys of Sun, the nine "
+"planets and a few major satellites, with four camera modes. Written by Raul "
+"Alonso. This is not included with the XScreenSaver package, but is packaged "
+"separately. Note: SSystem does not work as a screen saver on all systems, "
+"because it doesn't communicate with xscreensaver properly. It happens to "
+"work with some window managers, but not with others, so your mileage may "
+"vary. SSystem was once available at &lt;http://www1.las.es/~amil/ssystem/"
+"&gt;, but is now gone. You may still be able to find copies elsewhere. "
+"SSystem has since evolved into Celestia, found at &lt;http://www.shatters."
+"net/celestia/&gt;. Sadly, Celestia does not work with xscreensaver at all. "
+"You are encouraged to nag the authors into adding xscreensaver support!"
 msgstr ""
 
 #: hacks/config/stairs.xml.h:6
 msgstr ""
 
 #: hacks/config/stairs.xml.h:6
@@ -6316,7 +6919,9 @@ msgid "Stairs"
 msgstr ""
 
 #: hacks/config/stairs.xml.h:8
 msgstr ""
 
 #: hacks/config/stairs.xml.h:8
-msgid "by Marcelo Vianna's third Escher GL hack, this one draws an ``infinite'' staircase."
+msgid ""
+"by Marcelo Vianna's third Escher GL hack, this one draws an ``infinite'' "
+"staircase."
 msgstr ""
 
 #: hacks/config/starfish.xml.h:1
 msgstr ""
 
 #: hacks/config/starfish.xml.h:1
@@ -6332,7 +6937,11 @@ msgid "Starfish"
 msgstr ""
 
 #: hacks/config/starfish.xml.h:13
 msgstr ""
 
 #: hacks/config/starfish.xml.h:13
-msgid "This generates a sequence of undulating, throbbing, star-like patterns which pulsate, rotate, and turn inside out. Another display mode uses these shapes to lay down a field of colors, which are then cycled. The motion is very organic. Written by Jamie Zawinski."
+msgid ""
+"This generates a sequence of undulating, throbbing, star-like patterns which "
+"pulsate, rotate, and turn inside out. Another display mode uses these shapes "
+"to lay down a field of colors, which are then cycled. The motion is very "
+"organic. Written by Jamie Zawinski."
 msgstr ""
 
 #: hacks/config/starwars.xml.h:2
 msgstr ""
 
 #: hacks/config/starwars.xml.h:2
@@ -6344,7 +6953,10 @@ msgid "Centered Text"
 msgstr ""
 
 #: hacks/config/starwars.xml.h:4
 msgstr ""
 
 #: hacks/config/starwars.xml.h:4
-msgid "Draws a stream of text slowly scrolling into the distance at an angle, over a star field, like at the beginning of the movie of the same name. Written by Jamie Zawinski and Claudio Matauoka."
+msgid ""
+"Draws a stream of text slowly scrolling into the distance at an angle, over "
+"a star field, like at the beginning of the movie of the same name. Written "
+"by Jamie Zawinski and Claudio Matauoka."
 msgstr ""
 
 #: hacks/config/starwars.xml.h:5
 msgstr ""
 
 #: hacks/config/starwars.xml.h:5
@@ -6392,7 +7004,10 @@ msgid "Wrap Long Lines"
 msgstr ""
 
 #: hacks/config/stonerview.xml.h:1
 msgstr ""
 
 #: hacks/config/stonerview.xml.h:1
-msgid "Chains of colorful squares dance around each other in complex spiral patterns. Written by Andrew Plotkin, based on SGI's `electropaint' screensaver."
+msgid ""
+"Chains of colorful squares dance around each other in complex spiral "
+"patterns. Written by Andrew Plotkin, based on SGI's `electropaint' "
+"screensaver."
 msgstr ""
 
 #: hacks/config/stonerview.xml.h:3
 msgstr ""
 
 #: hacks/config/stonerview.xml.h:3
@@ -6404,11 +7019,41 @@ msgid "Strange"
 msgstr ""
 
 #: hacks/config/strange.xml.h:7
 msgstr ""
 
 #: 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. Written by Massimino Pascal."
+msgid ""
+"This draws strange attractors: it's a colorful, unpredictably-animating "
+"field of dots that swoops and twists around. The motion is very nice. "
+"Written by Massimino Pascal."
+msgstr ""
+
+#: hacks/config/substrate.xml.h:4
+#, fuzzy
+msgid "Initial Cracks"
+msgstr "Käytä värikarttaa"
+
+#: hacks/config/substrate.xml.h:5
+msgid ""
+"Lines like crystals grow on a computational substrate. A simple "
+"perpendicular growth rule creates intricate city-like structures. By J. "
+"Tarbell and Mike Kershaw."
+msgstr ""
+
+#: hacks/config/substrate.xml.h:8
+msgid "Sandgrains"
+msgstr ""
+
+#: hacks/config/substrate.xml.h:12
+msgid "Substrate"
+msgstr ""
+
+#: hacks/config/substrate.xml.h:13
+msgid "Wireframe only"
 msgstr ""
 
 #: hacks/config/superquadrics.xml.h:3
 msgstr ""
 
 #: 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 GL and has specular reflections."
+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 "
+"GL and has specular reflections."
 msgstr ""
 
 #: hacks/config/superquadrics.xml.h:11
 msgstr ""
 
 #: hacks/config/superquadrics.xml.h:11
@@ -6416,7 +7061,10 @@ msgid "Superquadrics"
 msgstr ""
 
 #: hacks/config/swirl.xml.h:4
 msgstr ""
 
 #: hacks/config/swirl.xml.h:4
-msgid "More flowing, swirly patterns. This version is by M. Dobie and R. Taylor, but you might have seen a Mac program similar to this called FlowFazer. There is also a cool Java applet of a similar concept."
+msgid ""
+"More flowing, swirly patterns. This version is by M. Dobie and R. Taylor, "
+"but you might have seen a Mac program similar to this called FlowFazer. "
+"There is also a cool Java applet of a similar concept."
 msgstr ""
 
 #: hacks/config/swirl.xml.h:8
 msgstr ""
 
 #: hacks/config/swirl.xml.h:8
@@ -6456,7 +7104,9 @@ msgid "T3D"
 msgstr ""
 
 #: hacks/config/t3d.xml.h:15
 msgstr ""
 
 #: hacks/config/t3d.xml.h:15
-msgid "This draws a working analog clock composed of floating, throbbing bubbles. Written by Bernd Paysan."
+msgid ""
+"This draws a working analog clock composed of floating, throbbing bubbles. "
+"Written by Bernd Paysan."
 msgstr ""
 
 #: hacks/config/t3d.xml.h:16
 msgstr ""
 
 #: hacks/config/t3d.xml.h:16
@@ -6468,7 +7118,9 @@ msgid "Wobbliness"
 msgstr ""
 
 #: hacks/config/thornbird.xml.h:1
 msgstr ""
 
 #: hacks/config/thornbird.xml.h:1
-msgid "Displays a view of the ``Bird in a Thornbush'' fractal. Written by Tim Auckland."
+msgid ""
+"Displays a view of the ``Bird in a Thornbush'' fractal. Written by Tim "
+"Auckland."
 msgstr ""
 
 #: hacks/config/thornbird.xml.h:6
 msgstr ""
 
 #: hacks/config/thornbird.xml.h:6
@@ -6480,7 +7132,9 @@ msgid "Thornbird"
 msgstr ""
 
 #: hacks/config/triangle.xml.h:2
 msgstr ""
 
 #: hacks/config/triangle.xml.h:2
-msgid "Generates random mountain ranges using iterative subdivision of triangles. Written by Tobias Gloth."
+msgid ""
+"Generates random mountain ranges using iterative subdivision of triangles. "
+"Written by Tobias Gloth."
 msgstr ""
 
 #: hacks/config/triangle.xml.h:7
 msgstr ""
 
 #: hacks/config/triangle.xml.h:7
@@ -6488,7 +7142,9 @@ msgid "Triangle"
 msgstr ""
 
 #: hacks/config/truchet.xml.h:4
 msgstr ""
 
 #: hacks/config/truchet.xml.h:4
-msgid "This draws line- and arc-based Truchet patterns that tile the screen. Written by Adrian Likins."
+msgid ""
+"This draws line- and arc-based Truchet patterns that tile the screen. "
+"Written by Adrian Likins."
 msgstr ""
 
 #: hacks/config/truchet.xml.h:5
 msgstr ""
 
 #: hacks/config/truchet.xml.h:5
@@ -6496,7 +7152,8 @@ msgid "Truchet"
 msgstr ""
 
 #: hacks/config/twang.xml.h:2
 msgstr ""
 
 #: 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
 msgstr ""
 
 #: hacks/config/twang.xml.h:6
@@ -6523,8 +7180,7 @@ msgstr ""
 msgid "Vermiculate"
 msgstr ""
 
 msgid "Vermiculate"
 msgstr ""
 
-#: hacks/config/vidwhacker.xml.h:2
-#: hacks/config/webcollage.xml.h:2
+#: hacks/config/vidwhacker.xml.h:2 hacks/config/webcollage.xml.h:2
 msgid "2 seconds"
 msgstr ""
 
 msgid "2 seconds"
 msgstr ""
 
@@ -6533,7 +7189,13 @@ msgid "Image Directory"
 msgstr ""
 
 #: hacks/config/vidwhacker.xml.h:5
 msgstr ""
 
 #: hacks/config/vidwhacker.xml.h:5
-msgid "This is actually just a shell script that grabs a frame of video from the system's video input, and then uses some PBM filters (chosen at random) to manipulate and recombine the video frame in various ways (edge detection, subtracting the image from a rotated version of itself, etc.) Then it displays that image for a few seconds, and does it again. This works really well if you just feed broadcast television into it."
+msgid ""
+"This is actually just a shell script that grabs a frame of video from the "
+"system's video input, and then uses some PBM filters (chosen at random) to "
+"manipulate and recombine the video frame in various ways (edge detection, "
+"subtracting the image from a rotated version of itself, etc.) Then it "
+"displays that image for a few seconds, and does it again. This works really "
+"well if you just feed broadcast television into it."
 msgstr ""
 
 #: hacks/config/vidwhacker.xml.h:6
 msgstr ""
 
 #: hacks/config/vidwhacker.xml.h:6
@@ -6541,7 +7203,10 @@ msgid "VidWhacker"
 msgstr ""
 
 #: hacks/config/vines.xml.h:6
 msgstr ""
 
 #: hacks/config/vines.xml.h:6
-msgid "This one generates a continuous sequence of small, curvy geometric patterns. It scatters them around your screen until it fills up, then it clears the screen and starts over. Written by Tracy Camp and David Hansen."
+msgid ""
+"This one generates a continuous sequence of small, curvy geometric patterns. "
+"It scatters them around your screen until it fills up, then it clears the "
+"screen and starts over. Written by Tracy Camp and David Hansen."
 msgstr ""
 
 #: hacks/config/vines.xml.h:8
 msgstr ""
 
 #: hacks/config/vines.xml.h:8
@@ -6553,7 +7218,8 @@ msgid "Draw Spots"
 msgstr ""
 
 #: hacks/config/wander.xml.h:6
 msgstr ""
 
 #: 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
 msgstr ""
 
 #: hacks/config/wander.xml.h:14
@@ -6573,7 +7239,14 @@ msgid "Per-Image Filter Program"
 msgstr ""
 
 #: hacks/config/webcollage.xml.h:9
 msgstr ""
 
 #: hacks/config/webcollage.xml.h:9
-msgid "This program makes collages out of random images pulled off of the World Wide Web. It finds these images by doing random web searches, and then extracting images from the returned pages. It can also be set up to filter the images through the `VidWhacker' program, above, which looks really great. (Note that most of the images it finds are text, and not pictures. This is because most of the web is pictures of text. Which is pretty sad.) Written by Jamie Zawinski."
+msgid ""
+"This program makes collages out of random images pulled off of the World "
+"Wide Web. It finds these images by doing random web searches, and then "
+"extracting images from the returned pages. It can also be set up to filter "
+"the images through the `VidWhacker' program, above, which looks really "
+"great. (Note that most of the images it finds are text, and not pictures. "
+"This is because most of the web is pictures of text. Which is pretty sad.) "
+"Written by Jamie Zawinski."
 msgstr ""
 
 #: hacks/config/webcollage.xml.h:10
 msgstr ""
 
 #: hacks/config/webcollage.xml.h:10
@@ -6585,7 +7258,10 @@ msgid "WebCollage"
 msgstr ""
 
 #: hacks/config/whirlwindwarp.xml.h:2
 msgstr ""
 
 #: hacks/config/whirlwindwarp.xml.h:2
-msgid "Floating stars are acted upon by a mixture of simple 2D forcefields. The strength of each forcefield changes continuously, and it is also switched on and off at random. By Paul 'Joey' Clark."
+msgid ""
+"Floating stars are acted upon by a mixture of simple 2D forcefields. The "
+"strength of each forcefield changes continuously, and it is also switched on "
+"and off at random. By Paul 'Joey' Clark."
 msgstr ""
 
 #: hacks/config/whirlwindwarp.xml.h:7
 msgstr ""
 
 #: hacks/config/whirlwindwarp.xml.h:7
@@ -6657,7 +7333,10 @@ msgid "Wrap the screen"
 msgstr ""
 
 #: hacks/config/worm.xml.h:1
 msgstr ""
 
 #: hacks/config/worm.xml.h:1
-msgid "An ancient xlock hack that draws multicolored worms that crawl around the screen. Written by Brad Taylor, Dave Lemke, Boris Putanec, and Henrik Theiling."
+msgid ""
+"An ancient xlock hack that draws multicolored worms that crawl around the "
+"screen. Written by Brad Taylor, Dave Lemke, Boris Putanec, and Henrik "
+"Theiling."
 msgstr ""
 
 #: hacks/config/wormhole.xml.h:6
 msgstr ""
 
 #: hacks/config/wormhole.xml.h:6
@@ -6673,7 +7352,9 @@ msgid "Wormhole"
 msgstr ""
 
 #: hacks/config/wormhole.xml.h:9
 msgstr ""
 
 #: hacks/config/wormhole.xml.h:9
-msgid "Wormhole simulates flying through a colored wormhole in space. Written by Jon Rafkind."
+msgid ""
+"Wormhole simulates flying through a colored wormhole in space. Written by "
+"Jon Rafkind."
 msgstr ""
 
 #: hacks/config/xanalogtv.xml.h:1
 msgstr ""
 
 #: hacks/config/xanalogtv.xml.h:1
@@ -6681,7 +7362,12 @@ msgid "XAnalogTV"
 msgstr ""
 
 #: hacks/config/xanalogtv.xml.h:2
 msgstr ""
 
 #: hacks/config/xanalogtv.xml.h:2
-msgid "XAnalogTV shows a detailed simulation of an old TV set showing various 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. By Trevor Blackwell."
+msgid ""
+"XAnalogTV shows a detailed simulation of an old TV set showing various 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. By Trevor Blackwell."
 msgstr ""
 
 #: hacks/config/xaos.xml.h:1
 msgstr ""
 
 #: hacks/config/xaos.xml.h:1
@@ -6689,7 +7375,11 @@ msgid "XaoS"
 msgstr ""
 
 #: hacks/config/xaos.xml.h:2
 msgstr ""
 
 #: hacks/config/xaos.xml.h:2
-msgid "XaoS generates fast fly-through animations of the Mandelbrot and other fractal sets. Written by Thomas Marsh and Jan Hubicka. This is not included with the XScreenSaver package, but if you don't have it already, you can find it at &lt;http://xaos.theory.org/&gt;."
+msgid ""
+"XaoS generates fast fly-through animations of the Mandelbrot and other "
+"fractal sets. Written by Thomas Marsh and Jan Hubicka. This is not included "
+"with the XScreenSaver package, but if you don't have it already, you can "
+"find it at &lt;http://xaos.theory.org/&gt;."
 msgstr ""
 
 #: hacks/config/xdaliclock.xml.h:1
 msgstr ""
 
 #: hacks/config/xdaliclock.xml.h:1
@@ -6712,8 +7402,7 @@ msgstr ""
 msgid "Huge Font"
 msgstr ""
 
 msgid "Huge Font"
 msgstr ""
 
-#: hacks/config/xdaliclock.xml.h:6
-#: hacks/config/xmatrix.xml.h:10
+#: hacks/config/xdaliclock.xml.h:6 hacks/config/xmatrix.xml.h:10
 msgid "Large Font"
 msgstr ""
 
 msgid "Large Font"
 msgstr ""
 
@@ -6721,8 +7410,7 @@ msgstr ""
 msgid "Medium Font"
 msgstr ""
 
 msgid "Medium Font"
 msgstr ""
 
-#: hacks/config/xdaliclock.xml.h:8
-#: hacks/config/xmatrix.xml.h:16
+#: hacks/config/xdaliclock.xml.h:8 hacks/config/xmatrix.xml.h:16
 msgid "Small Font"
 msgstr ""
 
 msgid "Small Font"
 msgstr ""
 
@@ -6731,15 +7419,18 @@ msgid "XDaliClock"
 msgstr ""
 
 #: hacks/config/xdaliclock.xml.h:10
 msgstr ""
 
 #: hacks/config/xdaliclock.xml.h:10
-msgid "XDaliClock draws a large digital clock, the numbers of which change by ``melting'' into their new shapes. Written by Jamie Zawinski. This is not included with the XScreenSaver package, but if you don't have it already, you can find it at &lt;http://www.jwz.org/xdaliclock/&gt;."
+msgid ""
+"XDaliClock draws a large digital clock, the numbers of which change by "
+"``melting'' into their new shapes. Written by Jamie Zawinski. This is not "
+"included with the XScreenSaver package, but if you don't have it already, "
+"you can find it at &lt;http://www.jwz.org/xdaliclock/&gt;."
 msgstr ""
 
 #: hacks/config/xearth.xml.h:1
 msgid "Bright"
 msgstr ""
 
 msgstr ""
 
 #: hacks/config/xearth.xml.h:1
 msgid "Bright"
 msgstr ""
 
-#: hacks/config/xearth.xml.h:2
-#: hacks/config/xplanet.xml.h:7
+#: hacks/config/xearth.xml.h:2 hacks/config/xplanet.xml.h:7
 msgid "Date/Time Stamp"
 msgstr ""
 
 msgid "Date/Time Stamp"
 msgstr ""
 
@@ -6755,18 +7446,15 @@ msgstr ""
 msgid "Label Cities"
 msgstr ""
 
 msgid "Label Cities"
 msgstr ""
 
-#: hacks/config/xearth.xml.h:9
-#: hacks/config/xplanet.xml.h:49
+#: hacks/config/xearth.xml.h:9 hacks/config/xplanet.xml.h:49
 msgid "Lower Left"
 msgstr ""
 
 msgid "Lower Left"
 msgstr ""
 
-#: hacks/config/xearth.xml.h:10
-#: hacks/config/xplanet.xml.h:50
+#: hacks/config/xearth.xml.h:10 hacks/config/xplanet.xml.h:50
 msgid "Lower Right"
 msgstr ""
 
 msgid "Lower Right"
 msgstr ""
 
-#: hacks/config/xearth.xml.h:13
-#: hacks/config/xplanet.xml.h:51
+#: hacks/config/xearth.xml.h:13 hacks/config/xplanet.xml.h:51
 msgid "Mercator Projection"
 msgstr ""
 
 msgid "Mercator Projection"
 msgstr ""
 
@@ -6782,13 +7470,11 @@ msgstr ""
 msgid "North/South Rotation"
 msgstr ""
 
 msgid "North/South Rotation"
 msgstr ""
 
-#: hacks/config/xearth.xml.h:18
-#: hacks/config/xplanet.xml.h:53
+#: hacks/config/xearth.xml.h:18 hacks/config/xplanet.xml.h:53
 msgid "Orthographic Projection"
 msgstr ""
 
 msgid "Orthographic Projection"
 msgstr ""
 
-#: hacks/config/xearth.xml.h:19
-#: hacks/config/xplanet.xml.h:56
+#: hacks/config/xearth.xml.h:19 hacks/config/xplanet.xml.h:56
 msgid "Real Time"
 msgstr ""
 
 msgid "Real Time"
 msgstr ""
 
@@ -6808,23 +7494,26 @@ msgstr ""
 msgid "Terminator   Blurry"
 msgstr ""
 
 msgid "Terminator   Blurry"
 msgstr ""
 
-#: hacks/config/xearth.xml.h:27
-#: hacks/config/xplanet.xml.h:61
+#: hacks/config/xearth.xml.h:27 hacks/config/xplanet.xml.h:61
 msgid "Time Warp"
 msgstr ""
 
 msgid "Time Warp"
 msgstr ""
 
-#: hacks/config/xearth.xml.h:29
-#: hacks/config/xplanet.xml.h:62
+#: hacks/config/xearth.xml.h:29 hacks/config/xplanet.xml.h:62
 msgid "Upper Left"
 msgstr ""
 
 msgid "Upper Left"
 msgstr ""
 
-#: hacks/config/xearth.xml.h:30
-#: hacks/config/xplanet.xml.h:63
+#: hacks/config/xearth.xml.h:30 hacks/config/xplanet.xml.h:63
 msgid "Upper Right"
 msgstr ""
 
 #: hacks/config/xearth.xml.h:31
 msgid "Upper Right"
 msgstr ""
 
 #: hacks/config/xearth.xml.h:31
-msgid "XEarth 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 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;."
+msgid ""
+"XEarth 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 "
+"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;."
 msgstr ""
 
 #: hacks/config/xearth.xml.h:32
 msgstr ""
 
 #: hacks/config/xearth.xml.h:32
@@ -6840,7 +7529,10 @@ msgid "Fish Speed"
 msgstr ""
 
 #: hacks/config/xfishtank.xml.h:7
 msgstr ""
 
 #: hacks/config/xfishtank.xml.h:7
-msgid "Fish! This is not included with the XScreenSaver package, but if you don't have it already, you can find it at &lt;http://metalab.unc.edu/pub/Linux/X11/demos/&gt;."
+msgid ""
+"Fish! This is not included with the XScreenSaver package, but if you don't "
+"have it already, you can find it at &lt;http://metalab.unc.edu/pub/Linux/X11/"
+"demos/&gt;."
 msgstr ""
 
 #: hacks/config/xfishtank.xml.h:12
 msgstr ""
 
 #: hacks/config/xfishtank.xml.h:12
@@ -6852,7 +7544,9 @@ msgid "Bitmap File"
 msgstr ""
 
 #: hacks/config/xflame.xml.h:2
 msgstr ""
 
 #: hacks/config/xflame.xml.h:2
-msgid "Draws a simulation of pulsing fire. It can also take an arbitrary image and set it on fire too. Written by Carsten Haitzler, hacked on by many others."
+msgid ""
+"Draws a simulation of pulsing fire. It can also take an arbitrary image and "
+"set it on fire too. Written by Carsten Haitzler, hacked on by many others."
 msgstr ""
 
 #: hacks/config/xflame.xml.h:3
 msgstr ""
 
 #: hacks/config/xflame.xml.h:3
@@ -6864,7 +7558,11 @@ msgid "Xflame"
 msgstr ""
 
 #: hacks/config/xjack.xml.h:4
 msgstr ""
 
 #: hacks/config/xjack.xml.h:4
-msgid "This program behaves schizophrenically and makes a lot of typos. Written by Jamie Zawinski. If you haven't seen Stanley Kubrick's masterpiece, ``The Shining,'' you won't get it. Those who have describe this hack as ``inspired.''"
+msgid ""
+"This program behaves schizophrenically and makes a lot of typos. Written by "
+"Jamie Zawinski. If you haven't seen Stanley Kubrick's masterpiece, ``The "
+"Shining,'' you won't get it. Those who have describe this hack as "
+"``inspired.''"
 msgstr ""
 
 #: hacks/config/xjack.xml.h:5
 msgstr ""
 
 #: hacks/config/xjack.xml.h:5
@@ -6872,7 +7570,10 @@ msgid "Xjack"
 msgstr ""
 
 #: hacks/config/xlyap.xml.h:1
 msgstr ""
 
 #: hacks/config/xlyap.xml.h:1
-msgid "This generates pretty fractal pictures by doing funky math involving the ``Lyapunov exponent.'' It has a cool interactive mode, too. Written by Ron Record."
+msgid ""
+"This generates pretty fractal pictures by doing funky math involving the "
+"``Lyapunov exponent.'' It has a cool interactive mode, too. Written by Ron "
+"Record."
 msgstr ""
 
 #: hacks/config/xlyap.xml.h:2
 msgstr ""
 
 #: hacks/config/xlyap.xml.h:2
@@ -6880,7 +7581,11 @@ msgid "Xlyap"
 msgstr ""
 
 #: hacks/config/xmatrix.xml.h:3
 msgstr ""
 
 #: hacks/config/xmatrix.xml.h:3
-msgid "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."
+msgid ""
+"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 ""
 
 #: hacks/config/xmatrix.xml.h:4
 msgstr ""
 
 #: hacks/config/xmatrix.xml.h:4
@@ -6915,26 +7620,147 @@ msgstr ""
 msgid "Xmatrix"
 msgstr ""
 
 msgid "Xmatrix"
 msgstr ""
 
-#: hacks/config/xmountains.xml.h:2
-msgid "Reflections"
+#: hacks/config/xmountains.xml.h:1
+msgid "1.0"
 msgstr ""
 
 #: hacks/config/xmountains.xml.h:3
 msgstr ""
 
 #: hacks/config/xmountains.xml.h:3
-msgid "Side View"
+msgid "14"
+msgstr ""
+
+#: hacks/config/xmountains.xml.h:4
+msgid "7"
+msgstr ""
+
+#: hacks/config/xmountains.xml.h:5
+msgid "Altitude  Low"
 msgstr ""
 
 #: hacks/config/xmountains.xml.h:6
 msgstr ""
 
 #: hacks/config/xmountains.xml.h:6
-msgid "Top View"
+msgid "Ambient  Low"
 msgstr ""
 
 #: hacks/config/xmountains.xml.h:7
 msgstr ""
 
 #: hacks/config/xmountains.xml.h:7
-msgid "XMountains generates realistic-looking fractal terrains of snow-capped mountains near water, with either a top view or a side view. Written by Stephen Booth. This is not included with the XScreenSaver package, but if you don't have it already, you can find it at &lt;http://www.epcc.ed.ac.uk/~spb/xmountains/&gt;. Be sure to compile it with -DVROOT or it won't work right when launched by the xscreensaver daemon."
+msgid "Angle of Light"
 msgstr ""
 
 #: hacks/config/xmountains.xml.h:8
 msgstr ""
 
 #: hacks/config/xmountains.xml.h:8
+msgid "Contour  Low"
+msgstr ""
+
+#: hacks/config/xmountains.xml.h:9
+msgid "Contrast  Low"
+msgstr ""
+
+#: hacks/config/xmountains.xml.h:10
+msgid "Craggy"
+msgstr ""
+
+#: hacks/config/xmountains.xml.h:11
+msgid "Cross Update"
+msgstr ""
+
+#: hacks/config/xmountains.xml.h:12
+msgid "Distance  Low"
+msgstr ""
+
+#: hacks/config/xmountains.xml.h:14
+msgid "Foreground"
+msgstr ""
+
+#: hacks/config/xmountains.xml.h:15
+msgid "Fractal Options"
+msgstr ""
+
+#: hacks/config/xmountains.xml.h:16
+msgid "Height  Low"
+msgstr ""
+
+#: hacks/config/xmountains.xml.h:18
+msgid "Horizontal  Low"
+msgstr ""
+
+#: hacks/config/xmountains.xml.h:19
+msgid "Iteration  0"
+msgstr ""
+
+#: hacks/config/xmountains.xml.h:20
+msgid "Light Level"
+msgstr ""
+
+#: hacks/config/xmountains.xml.h:21
+msgid "Recursion  0"
+msgstr ""
+
+#: hacks/config/xmountains.xml.h:22
+msgid "Reflections"
+msgstr ""
+
+#: hacks/config/xmountains.xml.h:23
+msgid "Sea Level  Low"
+msgstr ""
+
+#: hacks/config/xmountains.xml.h:24
+msgid "Side View"
+msgstr ""
+
+#: hacks/config/xmountains.xml.h:26
+msgid "Smoothing  0"
+msgstr ""
+
+#: hacks/config/xmountains.xml.h:27
+msgid "Speed  Slow"
+msgstr ""
+
+#: hacks/config/xmountains.xml.h:28
+msgid "Terrain"
+msgstr ""
+
+#: hacks/config/xmountains.xml.h:29
+msgid "Top View"
+msgstr ""
+
+#: hacks/config/xmountains.xml.h:30
+msgid "V. Shift  Low"
+msgstr ""
+
+#: hacks/config/xmountains.xml.h:31
+msgid "V. Stretch  Low"
+msgstr ""
+
+#: hacks/config/xmountains.xml.h:32
+msgid "Variance  Low"
+msgstr ""
+
+#: hacks/config/xmountains.xml.h:33
+msgid "Vertical  Low"
+msgstr ""
+
+#: hacks/config/xmountains.xml.h:34
+msgid "Viewpoint"
+msgstr ""
+
+#: hacks/config/xmountains.xml.h:35
+msgid ""
+"XMountains generates realistic-looking fractal terrains of snow-capped "
+"mountains near water, with either a top view or a side view. Written by "
+"Stephen Booth. This is not included with the XScreenSaver package, but if "
+"you don't have it already, you can find it at &lt;http://www.epcc.ed.ac.uk/"
+"~spb/xmountains/&gt;. (Make sure you have version 2.7 or newer!)"
+msgstr ""
+
+#: hacks/config/xmountains.xml.h:36
+msgid "Xf  0.0"
+msgstr ""
+
+#: hacks/config/xmountains.xml.h:37
 msgid "Xmountains"
 msgstr ""
 
 msgid "Xmountains"
 msgstr ""
 
+#: hacks/config/xmountains.xml.h:38
+msgid "Yf  0.0"
+msgstr ""
+
 #: hacks/config/xplanet.xml.h:2
 #, no-c-format
 msgid "0%"
 #: hacks/config/xplanet.xml.h:2
 #, no-c-format
 msgid "0%"
@@ -7273,11 +8099,18 @@ msgid "Xplanet"
 msgstr ""
 
 #: hacks/config/xplanet.xml.h:101
 msgstr ""
 
 #: hacks/config/xplanet.xml.h:101
-msgid "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;."
+msgid ""
+"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;."
 msgstr ""
 
 #: hacks/config/xrayswarm.xml.h:1
 msgstr ""
 
 #: hacks/config/xrayswarm.xml.h:1
-msgid "Draws a few swarms of critters flying around the screen, with nicely faded color trails behind them. Written by Chris Leger."
+msgid ""
+"Draws a few swarms of critters flying around the screen, with nicely faded "
+"color trails behind them. Written by Chris Leger."
 msgstr ""
 
 #: hacks/config/xrayswarm.xml.h:5
 msgstr ""
 
 #: hacks/config/xrayswarm.xml.h:5
@@ -7285,19 +8118,19 @@ msgid "XRaySwarm"
 msgstr ""
 
 #: hacks/config/xsnow.xml.h:1
 msgstr ""
 
 #: hacks/config/xsnow.xml.h:1
-msgid "Draws falling snow and the occasional tiny Santa. By Rick Jansen. You can find it at &lt;http://www.euronet.nl/~rja/Xsnow/&gt;."
+msgid ""
+"Draws falling snow and the occasional tiny Santa. By Rick Jansen. You can "
+"find it at &lt;http://www.euronet.nl/~rja/Xsnow/&gt;."
 msgstr ""
 
 #: hacks/config/xsnow.xml.h:2
 msgid "Xsnow"
 msgstr ""
 
 msgstr ""
 
 #: hacks/config/xsnow.xml.h:2
 msgid "Xsnow"
 msgstr ""
 
-#: hacks/config/xspirograph.xml.h:4
-msgid "Layers"
-msgstr ""
-
 #: hacks/config/xspirograph.xml.h:5
 #: hacks/config/xspirograph.xml.h:5
-msgid "Simulates that pen-in-nested-plastic-gears toy from your childhood. By Rohit Singh."
+msgid ""
+"Simulates that pen-in-nested-plastic-gears toy from your childhood. By Rohit "
+"Singh."
 msgstr ""
 
 #: hacks/config/xspirograph.xml.h:6
 msgstr ""
 
 #: hacks/config/xspirograph.xml.h:6
@@ -7325,7 +8158,9 @@ msgid "XTeeVee"
 msgstr ""
 
 #: hacks/config/xteevee.xml.h:6
 msgstr ""
 
 #: hacks/config/xteevee.xml.h:6
-msgid "XTeeVee simulates various television problems, including static, loss of vertical hold, and a test pattern. By Greg Knauss."
+msgid ""
+"XTeeVee simulates various television problems, including static, loss of "
+"vertical hold, and a test pattern. By Greg Knauss."
 msgstr ""
 
 #: hacks/config/zoom.xml.h:3
 msgstr ""
 
 #: hacks/config/zoom.xml.h:3
@@ -7337,6 +8172,8 @@ msgid "Lenses"
 msgstr ""
 
 #: hacks/config/zoom.xml.h:9
 msgstr ""
 
 #: hacks/config/zoom.xml.h:9
-msgid "Zooms in on a part of the screen and then moves around. With the -lenses option the result is like looking through many overlapping lenses rather than just a simple zoom. Written by James Macnicol."
+msgid ""
+"Zooms in on a part of the screen and then moves around. With the -lenses "
+"option the result is like looking through many overlapping lenses rather "
+"than just a simple zoom. Written by James Macnicol."
 msgstr ""
 msgstr ""
-
index 97629f3f9c51601455a2490a7a98d30ad6375cc5..6cb283df2b2cdf88f37ed59a7d1198e85797b809 100644 (file)
--- a/po/fr.po
+++ b/po/fr.po
@@ -3,10 +3,10 @@
 #
 msgid ""
 msgstr ""
 #
 msgid ""
 msgstr ""
-"Project-Id-Version: xscreensaver 4.18\n"
+"Project-Id-Version: xscreensaver 4.19\n"
 "Report-Msgid-Bugs-To: \n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2004-10-04 16:25+0200\n"
-"PO-Revision-Date: 2002-07-28 01:03+0200\n"
+"POT-Creation-Date: 2004-12-22 12:51+0100\n"
+"PO-Revision-Date: 2004-12-22 12:51+0100\n"
 "Last-Translator: Eric Lassauge <lassauge@users.sourceforge.net>\n"
 "Language-Team: GNOME French Team <gnomefr@traduc.org>\n"
 "MIME-Version: 1.0\n"
 "Last-Translator: Eric Lassauge <lassauge@users.sourceforge.net>\n"
 "Language-Team: GNOME French Team <gnomefr@traduc.org>\n"
 "MIME-Version: 1.0\n"
@@ -15,7 +15,7 @@ msgstr ""
 
 #: driver/demo-Gtk-conf.c:818
 msgid "Browse..."
 
 #: driver/demo-Gtk-conf.c:818
 msgid "Browse..."
-msgstr "Parcourir... "
+msgstr "Parcourir ... "
 
 #: driver/demo-Gtk-conf.c:1110
 msgid "Select file."
 
 #: driver/demo-Gtk-conf.c:1110
 msgid "Select file."
@@ -24,17 +24,17 @@ msgstr "S
 #: driver/demo-Gtk-support.c:135
 #, c-format
 msgid "Couldn't find pixmap file: %s"
 #: driver/demo-Gtk-support.c:135
 #, c-format
 msgid "Couldn't find pixmap file: %s"
-msgstr "Impossible de trouver le fichier d'image : %s"
+msgstr "Impossible de trouver le fichier d'image : %s"
 
 #: driver/demo-Gtk-support.c:147 driver/demo-Gtk-support.c:179
 #, c-format
 msgid "Error loading pixmap file: %s"
 
 #: 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"
+msgstr "Erreur lors du chargement du fichier d'image : %s"
 
 #: driver/demo-Gtk-support.c:182
 #, c-format
 msgid "reason: %s\n"
 
 #: driver/demo-Gtk-support.c:182
 #, c-format
 msgid "reason: %s\n"
-msgstr "Raison: %s\n"
+msgstr "Raison : %s\n"
 
 #: driver/demo-Gtk-widgets.c:161 driver/xscreensaver-demo.glade.h:89
 #: driver/xscreensaver-demo.glade2.h:65
 
 #: driver/demo-Gtk-widgets.c:161 driver/xscreensaver-demo.glade.h:89
 #: driver/xscreensaver-demo.glade2.h:65
@@ -103,7 +103,7 @@ msgstr "_Aide"
 #: driver/demo-Gtk-widgets.c:296 driver/xscreensaver-demo.glade.h:92
 #: driver/xscreensaver-demo.glade2.h:66
 msgid "_About..."
 #: driver/demo-Gtk-widgets.c:296 driver/xscreensaver-demo.glade.h:92
 #: driver/xscreensaver-demo.glade2.h:66
 msgid "_About..."
-msgstr "A _propos..."
+msgstr "A _propos ..."
 
 #: driver/demo-Gtk-widgets.c:305 driver/xscreensaver-demo.glade.h:30
 msgid "Display version information."
 
 #: driver/demo-Gtk-widgets.c:305 driver/xscreensaver-demo.glade.h:30
 msgid "Display version information."
@@ -112,7 +112,7 @@ msgstr "Affiche les informations de version"
 #: driver/demo-Gtk-widgets.c:309 driver/xscreensaver-demo.glade.h:94
 #: driver/xscreensaver-demo.glade2.h:75
 msgid "_Documentation..."
 #: driver/demo-Gtk-widgets.c:309 driver/xscreensaver-demo.glade.h:94
 #: driver/xscreensaver-demo.glade2.h:75
 msgid "_Documentation..."
-msgstr "_Documentation..."
+msgstr "_Documentation ..."
 
 #: driver/demo-Gtk-widgets.c:318 driver/xscreensaver-demo.glade.h:38
 msgid "Go to the documentation on the XScreenSaver web page."
 
 #: driver/demo-Gtk-widgets.c:318 driver/xscreensaver-demo.glade.h:38
 msgid "Go to the documentation on the XScreenSaver web page."
@@ -148,7 +148,7 @@ msgstr "Dur
 msgid "minutes"
 msgstr "minutes"
 
 msgid "minutes"
 msgstr "minutes"
 
-#: driver/demo-Gtk-widgets.c:482 driver/demo-Gtk.c:2845
+#: driver/demo-Gtk-widgets.c:482 driver/demo-Gtk.c:2852
 #: driver/xscreensaver-demo.glade.h:58
 msgid "Preview"
 msgstr "Aperçu"
 #: driver/xscreensaver-demo.glade.h:58
 msgid "Preview"
 msgstr "Aperçu"
@@ -164,7 +164,7 @@ msgstr ""
 
 #: driver/demo-Gtk-widgets.c:492 driver/xscreensaver-demo.glade.h:65
 msgid "Settings..."
 
 #: driver/demo-Gtk-widgets.c:492 driver/xscreensaver-demo.glade.h:65
 msgid "Settings..."
-msgstr "Réglages..."
+msgstr "Réglages ..."
 
 #: driver/demo-Gtk-widgets.c:500 driver/xscreensaver-demo.glade.h:17
 #: driver/xscreensaver-demo.glade2.h:9
 
 #: driver/demo-Gtk-widgets.c:500 driver/xscreensaver-demo.glade.h:17
 #: driver/xscreensaver-demo.glade2.h:9
@@ -173,7 +173,7 @@ msgstr "Configuration et explications pour l'
 
 #: driver/demo-Gtk-widgets.c:521 driver/xscreensaver-demo.glade.h:52
 msgid "Mode:"
 
 #: driver/demo-Gtk-widgets.c:521 driver/xscreensaver-demo.glade.h:52
 msgid "Mode:"
-msgstr "Mode :"
+msgstr "Mode :"
 
 #: driver/demo-Gtk-widgets.c:539 driver/xscreensaver-demo.glade.h:25
 #: driver/xscreensaver-demo.glade2.h:16
 
 #: driver/demo-Gtk-widgets.c:539 driver/xscreensaver-demo.glade.h:25
 #: driver/xscreensaver-demo.glade2.h:16
@@ -195,12 +195,12 @@ msgstr "Seulement un 
 msgid "Random Screen Saver"
 msgstr "Économiseur d'écran aléatoire"
 
 msgid "Random Screen Saver"
 msgstr "Économiseur d'écran aléatoire"
 
-#: driver/demo-Gtk-widgets.c:571 driver/demo-Gtk.c:2134
+#: driver/demo-Gtk-widgets.c:571 driver/demo-Gtk.c:2141
 #: driver/xscreensaver-demo.glade.h:75
 msgid "Use"
 msgstr "Choisis"
 
 #: driver/xscreensaver-demo.glade.h:75
 msgid "Use"
 msgstr "Choisis"
 
-#: driver/demo-Gtk-widgets.c:591 driver/demo-Gtk.c:2144
+#: driver/demo-Gtk-widgets.c:591 driver/demo-Gtk.c:2151
 #: driver/xscreensaver-demo.glade.h:63
 msgid "Screen Saver"
 msgstr "Économiseur d'écran"
 #: driver/xscreensaver-demo.glade.h:63
 msgid "Screen Saver"
 msgstr "Économiseur d'écran"
@@ -414,7 +414,7 @@ msgstr ""
 
 #: driver/demo-Gtk-widgets.c:1203 driver/xscreensaver-demo.glade.h:12
 msgid "Choose Random Image:"
 
 #: driver/demo-Gtk-widgets.c:1203 driver/xscreensaver-demo.glade.h:12
 msgid "Choose Random Image:"
-msgstr "Choisir une image aléatoire :"
+msgstr "Choisir une image aléatoire :"
 
 #: driver/demo-Gtk-widgets.c:1236 driver/xscreensaver-demo.glade.h:73
 #: driver/xscreensaver-demo.glade2.h:52
 
 #: driver/demo-Gtk-widgets.c:1236 driver/xscreensaver-demo.glade.h:73
 #: driver/xscreensaver-demo.glade2.h:52
@@ -432,7 +432,7 @@ msgstr "Avanc
 
 #: driver/demo-Gtk-widgets.c:1444 driver/xscreensaver-demo.glade.h:90
 msgid "XScreenSaver: Mode-Specific Settings"
 
 #: 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"
+msgstr "XScreenSaver : réglages spécifiques au mode"
 
 #: driver/demo-Gtk-widgets.c:1466 driver/xscreensaver-demo.glade.h:64
 #: driver/xscreensaver-demo.glade2.h:47
 
 #: driver/demo-Gtk-widgets.c:1466 driver/xscreensaver-demo.glade.h:64
 #: driver/xscreensaver-demo.glade2.h:47
@@ -446,10 +446,10 @@ msgstr "Standard"
 
 #: driver/demo-Gtk-widgets.c:1532 driver/xscreensaver-demo.glade.h:77
 msgid "Visual:"
 
 #: driver/demo-Gtk-widgets.c:1532 driver/xscreensaver-demo.glade.h:77
 msgid "Visual:"
-msgstr "Visuel :"
+msgstr "Visuel :"
 
 #: driver/demo-Gtk-widgets.c:1550 driver/demo-Gtk-widgets.c:1573
 
 #: driver/demo-Gtk-widgets.c:1550 driver/demo-Gtk-widgets.c:1573
-#: driver/demo-Gtk.c:1538 driver/demo-Gtk.c:2864
+#: driver/demo-Gtk.c:1545 driver/demo-Gtk.c:2871
 #: driver/xscreensaver-demo.glade.h:5 driver/xscreensaver-demo.glade2.h:3
 msgid "Any"
 msgstr "N'importe"
 #: driver/xscreensaver-demo.glade.h:5 driver/xscreensaver-demo.glade2.h:3
 msgid "Any"
 msgstr "N'importe"
@@ -524,11 +524,11 @@ msgstr ""
 
 #: driver/demo-Gtk-widgets.c:1575 driver/xscreensaver-demo.glade.h:16
 msgid "Command Line:"
 
 #: driver/demo-Gtk-widgets.c:1575 driver/xscreensaver-demo.glade.h:16
 msgid "Command Line:"
-msgstr "Ligne de commande :"
+msgstr "Ligne de commande :"
 
 #: driver/demo-Gtk-widgets.c:1647 driver/xscreensaver-demo.glade.h:31
 msgid "Documentation..."
 
 #: driver/demo-Gtk-widgets.c:1647 driver/xscreensaver-demo.glade.h:31
 msgid "Documentation..."
-msgstr "Documentation..."
+msgstr "Documentation ..."
 
 #: 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."
 
 #: 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."
@@ -551,7 +551,7 @@ msgstr "Standard <<"
 msgid "Back to the graphical configuration options."
 msgstr "Retour aux options de configuration graphique."
 
 msgid "Back to the graphical configuration options."
 msgstr "Retour aux options de configuration graphique."
 
-#: driver/demo-Gtk-widgets.c:1709 driver/demo-Gtk.c:741
+#: driver/demo-Gtk-widgets.c:1709 driver/demo-Gtk.c:748
 #: driver/xscreensaver-demo.glade.h:54
 msgid "OK"
 msgstr "Valider"
 #: driver/xscreensaver-demo.glade.h:54
 msgid "OK"
 msgstr "Valider"
@@ -560,13 +560,14 @@ msgstr "Valider"
 msgid "Cancel"
 msgstr "Annuler"
 
 msgid "Cancel"
 msgstr "Annuler"
 
-#: driver/demo-Gtk.c:649
+#: driver/demo-Gtk.c:656
 msgid "For updates, check http://www.jwz.org/xscreensaver/"
 msgstr ""
 msgid "For updates, check http://www.jwz.org/xscreensaver/"
 msgstr ""
-"Traduction © 2004, Eric Lassauge http://lassauge.free.fr/xscreensaver/\n\n"
+"Traduction © 2004, Eric Lassauge http://lassauge.free.fr/xscreensaver/\n"
+"\n"
 "Pour les mises à jour, vérifier sur http://www.jwz.org/xscreensaver/"
 
 "Pour les mises à jour, vérifier sur http://www.jwz.org/xscreensaver/"
 
-#: driver/demo-Gtk.c:779
+#: driver/demo-Gtk.c:786
 msgid ""
 "Error:\n"
 "\n"
 msgid ""
 "Error:\n"
 "\n"
@@ -576,7 +577,7 @@ msgstr ""
 "\n"
 "Aucune URL d'aide spécifiée.\n"
 
 "\n"
 "Aucune URL d'aide spécifiée.\n"
 
-#: driver/demo-Gtk.c:865
+#: driver/demo-Gtk.c:872
 msgid ""
 "Error:\n"
 "\n"
 msgid ""
 "Error:\n"
 "\n"
@@ -588,7 +589,7 @@ msgstr ""
 "Le démon xscreensaver ne démarre pas correctement.\n"
 "\n"
 
 "Le démon xscreensaver ne démarre pas correctement.\n"
 "\n"
 
-#: driver/demo-Gtk.c:877
+#: driver/demo-Gtk.c:884
 msgid ""
 "You are running as root.  This usually means that xscreensaver\n"
 "was unable to contact your X server because access control is\n"
 msgid ""
 "You are running as root.  This usually means that xscreensaver\n"
 "was unable to contact your X server because access control is\n"
@@ -622,11 +623,11 @@ msgstr ""
 "se connecter en tant qu'utilisateur normal et utiliser\n"
 "«su» si nécessaire."
 
 "se connecter en tant qu'utilisateur normal et utiliser\n"
 "«su» si nécessaire."
 
-#: driver/demo-Gtk.c:893
+#: driver/demo-Gtk.c:900
 msgid "Please check your $PATH and permissions."
 msgstr "Vérifiez votre $PATH et les permissions."
 
 msgid "Please check your $PATH and permissions."
 msgstr "Vérifiez votre $PATH et les permissions."
 
-#: driver/demo-Gtk.c:928
+#: driver/demo-Gtk.c:935
 msgid ""
 "Error:\n"
 "\n"
 msgid ""
 "Error:\n"
 "\n"
@@ -636,7 +637,7 @@ msgstr ""
 "\n"
 "Impossible de déterminer le nom du fichier d'init !\n"
 
 "\n"
 "Impossible de déterminer le nom du fichier d'init !\n"
 
-#: driver/demo-Gtk.c:933
+#: driver/demo-Gtk.c:940
 #, c-format
 msgid ""
 "Error:\n"
 #, c-format
 msgid ""
 "Error:\n"
@@ -647,7 +648,7 @@ msgstr ""
 "\n"
 "Impossible d'écrire dans %s.\n"
 
 "\n"
 "Impossible d'écrire dans %s.\n"
 
-#: driver/demo-Gtk.c:992
+#: driver/demo-Gtk.c:999
 msgid ""
 "Error:\n"
 "\n"
 msgid ""
 "Error:\n"
 "\n"
@@ -657,7 +658,7 @@ msgstr ""
 "\n"
 "La ressource «manualCommand» n'est pas renseignée."
 
 "\n"
 "La ressource «manualCommand» n'est pas renseignée."
 
-#: driver/demo-Gtk.c:1173
+#: driver/demo-Gtk.c:1180
 #, c-format
 msgid ""
 "Error:\n"
 #, c-format
 msgid ""
 "Error:\n"
@@ -668,7 +669,7 @@ msgstr ""
 "\n"
 "Le format «%s» pour l'heure n'est pas exploitable.\n"
 
 "\n"
 "Le format «%s» pour l'heure n'est pas exploitable.\n"
 
-#: driver/demo-Gtk.c:1829
+#: driver/demo-Gtk.c:1836
 #, c-format
 msgid ""
 "Error:\n"
 #, c-format
 msgid ""
 "Error:\n"
@@ -679,28 +680,28 @@ msgstr ""
 "\n"
 "Répertoire «%s» inexistant.\n"
 
 "\n"
 "Répertoire «%s» inexistant.\n"
 
-#: driver/demo-Gtk.c:2546
+#: driver/demo-Gtk.c:2553
 msgid "Descriptions not available: no XML support compiled in."
 msgid "Descriptions not available: no XML support compiled in."
-msgstr "Descriptions indisponibles: pas de support XML compilé."
+msgstr "Descriptions indisponibles : pas de support XML compilé."
 
 
-#: driver/demo-Gtk.c:2551
+#: driver/demo-Gtk.c:2558
 msgid "No description available."
 msgstr "Aucune description disponible."
 
 msgid "No description available."
 msgstr "Aucune description disponible."
 
-#: driver/demo-Gtk.c:2816
+#: driver/demo-Gtk.c:2823
 msgid "Blank Screen"
 msgstr "Économiser l'écran uniquement"
 
 msgid "Blank Screen"
 msgstr "Économiser l'écran uniquement"
 
-#: driver/demo-Gtk.c:2822
+#: driver/demo-Gtk.c:2829
 msgid "Screen Saver Disabled"
 msgstr "Économiseur d'écran inhibé"
 
 msgid "Screen Saver Disabled"
 msgstr "Économiseur d'écran inhibé"
 
-#: driver/demo-Gtk.c:2855
+#: driver/demo-Gtk.c:2862
 #, c-format
 msgid "%s: %.100s Settings"
 #, c-format
 msgid "%s: %.100s Settings"
-msgstr "%s: réglages %.100s"
+msgstr "%s : réglages %.100s"
 
 
-#: driver/demo-Gtk.c:3010
+#: driver/demo-Gtk.c:3017
 #, c-format
 msgid ""
 "Warning:\n"
 #, c-format
 msgid ""
 "Warning:\n"
@@ -711,23 +712,23 @@ msgstr ""
 "\n"
 "le fichier «%s» a changé, rechargement.\n"
 
 "\n"
 "le fichier «%s» a changé, rechargement.\n"
 
-#: driver/demo-Gtk.c:3092
+#: driver/demo-Gtk.c:3099
 msgid "No Preview"
 msgstr "Pas d'aperçu"
 
 msgid "No Preview"
 msgstr "Pas d'aperçu"
 
-#: driver/demo-Gtk.c:3092
+#: driver/demo-Gtk.c:3099
 msgid "Available"
 msgstr "Disponible"
 
 msgid "Available"
 msgstr "Disponible"
 
-#: driver/demo-Gtk.c:3093
+#: driver/demo-Gtk.c:3100
 msgid "Not"
 msgstr "Non"
 
 msgid "Not"
 msgstr "Non"
 
-#: driver/demo-Gtk.c:3093
+#: driver/demo-Gtk.c:3100
 msgid "Installed"
 msgstr "installé"
 
 msgid "Installed"
 msgstr "installé"
 
-#: driver/demo-Gtk.c:3858
+#: driver/demo-Gtk.c:3865
 #, c-format
 msgid ""
 "Warning:\n"
 #, c-format
 msgid ""
 "Warning:\n"
@@ -740,7 +741,7 @@ msgstr ""
 "Le démon XScreenSaver n'est pas actif pour l'écran «%s». Le lancer "
 "maintenant ?"
 
 "Le démon XScreenSaver n'est pas actif pour l'écran «%s». Le lancer "
 "maintenant ?"
 
-#: driver/demo-Gtk.c:3868
+#: driver/demo-Gtk.c:3875
 #, c-format
 msgid ""
 "Warning:\n"
 #, c-format
 msgid ""
 "Warning:\n"
@@ -773,7 +774,7 @@ msgstr ""
 "\n"
 "Relancer le démon xscreensaver maintenant ?\n"
 
 "\n"
 "Relancer le démon xscreensaver maintenant ?\n"
 
-#: driver/demo-Gtk.c:3893
+#: driver/demo-Gtk.c:3900
 #, c-format
 msgid ""
 "Warning:\n"
 #, c-format
 msgid ""
 "Warning:\n"
@@ -800,7 +801,7 @@ msgstr ""
 "\n"
 "Relancer le démon sur «%s» en tant que «%s» maintenant ?\n"
 
 "\n"
 "Relancer le démon sur «%s» en tant que «%s» maintenant ?\n"
 
-#: driver/demo-Gtk.c:3915
+#: driver/demo-Gtk.c:3922
 #, c-format
 msgid ""
 "Warning:\n"
 #, c-format
 msgid ""
 "Warning:\n"
@@ -819,12 +820,12 @@ msgstr ""
 "\n"
 "Relancer le démon xscreensaver maintenant ?\n"
 
 "\n"
 "Relancer le démon xscreensaver maintenant ?\n"
 
-#: driver/demo-Gtk.c:4372
+#: driver/demo-Gtk.c:4379
 #, c-format
 msgid "%s: unknown option: %s\n"
 #, c-format
 msgid "%s: unknown option: %s\n"
-msgstr "%s: option inconnue : %s\n"
+msgstr "%s : option inconnue : %s\n"
 
 
-#: driver/demo-Gtk.c:4436
+#: driver/demo-Gtk.c:4443
 msgid "Screensaver Preferences"
 msgstr "Préférences économiseur d'écran"
 
 msgid "Screensaver Preferences"
 msgstr "Préférences économiseur d'écran"
 
@@ -846,7 +847,7 @@ msgstr "*"
 
 #: driver/xscreensaver-demo.glade2.h:6
 msgid "Choose _Random Image:"
 
 #: driver/xscreensaver-demo.glade2.h:6
 msgid "Choose _Random Image:"
-msgstr "Choisir une image _Aléatoire :"
+msgstr "Choisir une image _Aléatoire :"
 
 #: driver/xscreensaver-demo.glade2.h:18
 msgid "Display Subprocess _Errors"
 
 #: driver/xscreensaver-demo.glade2.h:18
 msgid "Display Subprocess _Errors"
@@ -951,7 +952,7 @@ msgstr "_Parcourir"
 
 #: driver/xscreensaver-demo.glade2.h:72
 msgid "_Command Line:"
 
 #: driver/xscreensaver-demo.glade2.h:72
 msgid "_Command Line:"
-msgstr "_Ligne de commande :"
+msgstr "_Ligne de commande :"
 
 #: driver/xscreensaver-demo.glade2.h:73
 msgid "_Cycle After"
 
 #: driver/xscreensaver-demo.glade2.h:73
 msgid "_Cycle After"
@@ -967,7 +968,7 @@ msgstr "_Verrouillage de l'
 
 #: driver/xscreensaver-demo.glade2.h:81
 msgid "_Mode:"
 
 #: driver/xscreensaver-demo.glade2.h:81
 msgid "_Mode:"
-msgstr "_Mode :"
+msgstr "_Mode :"
 
 #: driver/xscreensaver-demo.glade2.h:82
 msgid "_Off After"
 
 #: driver/xscreensaver-demo.glade2.h:82
 msgid "_Off After"
@@ -999,7 +1000,7 @@ msgstr "Diagnostiques verbeux"
 
 #: driver/xscreensaver-demo.glade2.h:90
 msgid "_Visual:"
 
 #: driver/xscreensaver-demo.glade2.h:90
 msgid "_Visual:"
-msgstr "_Visuels :"
+msgstr "_Visuels :"
 
 #: driver/xscreensaver-demo.glade2.h:91
 msgid "dialog1"
 
 #: driver/xscreensaver-demo.glade2.h:91
 msgid "dialog1"
@@ -1047,22 +1048,23 @@ msgstr "Bras"
 #: 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/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:5 hacks/config/flyingtoasters.xml.h:5
-#: hacks/config/fontglide.xml.h:4 hacks/config/forest.xml.h:1
-#: hacks/config/fuzzyflakes.xml.h:7 hacks/config/galaxy.xml.h:3
-#: hacks/config/gears.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:6
-#: 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/fadeplot.xml.h:4 hacks/config/fireworkx.xml.h:3
+#: 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:2 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/fuzzyflakes.xml.h:7
+#: hacks/config/galaxy.xml.h:3 hacks/config/gears.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:6 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/intermomentary.xml.h:1 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/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
@@ -1080,23 +1082,24 @@ msgstr "Bras"
 #: hacks/config/pacman.xml.h:1 hacks/config/penetrate.xml.h:3
 #: hacks/config/penrose.xml.h:6 hacks/config/petri.xml.h:5
 #: hacks/config/phosphor.xml.h:4 hacks/config/piecewise.xml.h:4
 #: hacks/config/pacman.xml.h:1 hacks/config/penetrate.xml.h:3
 #: hacks/config/penrose.xml.h:6 hacks/config/petri.xml.h:5
 #: hacks/config/phosphor.xml.h:4 hacks/config/piecewise.xml.h:4
-#: hacks/config/pipes.xml.h:5 hacks/config/polyhedra.xml.h:18
-#: hacks/config/polyominoes.xml.h:2 hacks/config/polytopes.xml.h:11
-#: hacks/config/pong.xml.h:1 hacks/config/popsquares.xml.h:3
-#: hacks/config/providence.xml.h:2 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 hacks/config/rocks.xml.h:4
-#: hacks/config/rotor.xml.h:3 hacks/config/rubik.xml.h:3
-#: hacks/config/sballs.xml.h:4 hacks/config/shadebobs.xml.h:3
-#: hacks/config/sierpinski.xml.h:2 hacks/config/sierpinski3d.xml.h:2
-#: hacks/config/slidescreen.xml.h:2 hacks/config/slip.xml.h:2
-#: hacks/config/speedmine.xml.h:3 hacks/config/sphere.xml.h:2
-#: hacks/config/spheremonics.xml.h:5 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:1 hacks/config/superquadrics.xml.h:4
+#: hacks/config/pinion.xml.h:5 hacks/config/pipes.xml.h:5
+#: hacks/config/polyhedra.xml.h:18 hacks/config/polyominoes.xml.h:2
+#: hacks/config/polytopes.xml.h:11 hacks/config/pong.xml.h:1
+#: hacks/config/popsquares.xml.h:3 hacks/config/providence.xml.h:2
+#: 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
+#: hacks/config/rocks.xml.h:4 hacks/config/rotor.xml.h:3
+#: hacks/config/rubik.xml.h:3 hacks/config/sballs.xml.h:4
+#: hacks/config/shadebobs.xml.h:3 hacks/config/sierpinski.xml.h:2
+#: hacks/config/sierpinski3d.xml.h:2 hacks/config/slidescreen.xml.h:2
+#: hacks/config/slip.xml.h:2 hacks/config/speedmine.xml.h:3
+#: hacks/config/sphere.xml.h:2 hacks/config/spheremonics.xml.h:5
+#: 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:1
+#: hacks/config/substrate.xml.h:2 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/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
@@ -1118,8 +1121,9 @@ msgstr "Rapide"
 #: hacks/config/fuzzyflakes.xml.h:8 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/fuzzyflakes.xml.h:8 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/wormhole.xml.h:3 hacks/config/xfishtank.xml.h:4
+#: hacks/config/substrate.xml.h:3 hacks/config/thornbird.xml.h:3
+#: hacks/config/whirlwindwarp.xml.h:1 hacks/config/wormhole.xml.h:3
+#: hacks/config/xfishtank.xml.h:4
 msgid "Few"
 msgstr "Peu"
 
 msgid "Few"
 msgstr "Peu"
 
@@ -1135,7 +1139,7 @@ msgstr "Peu"
 #: hacks/config/epicycle.xml.h:8 hacks/config/eruption.xml.h:12
 #: hacks/config/euler2d.xml.h:8 hacks/config/fadeplot.xml.h:6
 #: hacks/config/flag.xml.h:5 hacks/config/flame.xml.h:11
 #: hacks/config/epicycle.xml.h:8 hacks/config/eruption.xml.h:12
 #: hacks/config/euler2d.xml.h:8 hacks/config/fadeplot.xml.h:6
 #: hacks/config/flag.xml.h:5 hacks/config/flame.xml.h:11
-#: hacks/config/flow.xml.h:8 hacks/config/fluidballs.xml.h:13
+#: hacks/config/flow.xml.h:7 hacks/config/fluidballs.xml.h:13
 #: hacks/config/forest.xml.h:3 hacks/config/fuzzyflakes.xml.h:12
 #: 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/forest.xml.h:3 hacks/config/fuzzyflakes.xml.h:12
 #: hacks/config/galaxy.xml.h:6 hacks/config/grav.xml.h:4
 #: hacks/config/halo.xml.h:4 hacks/config/hopalong.xml.h:15
@@ -1173,7 +1177,7 @@ msgstr "Beaucoup"
 #: 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/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/flow.xml.h:8 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/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
@@ -1227,22 +1231,23 @@ msgstr "Rarement"
 #: 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/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/flyingtoasters.xml.h:11
-#: hacks/config/fontglide.xml.h:13 hacks/config/forest.xml.h:5
-#: hacks/config/fuzzyflakes.xml.h:15 hacks/config/galaxy.xml.h:10
-#: hacks/config/gears.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:8 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:10 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/fadeplot.xml.h:8 hacks/config/fireworkx.xml.h:9
+#: 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:10 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/fuzzyflakes.xml.h:15
+#: hacks/config/galaxy.xml.h:11 hacks/config/gears.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:8
+#: 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:10
+#: 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/intermomentary.xml.h:4 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/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
@@ -1260,23 +1265,24 @@ msgstr "Rarement"
 #: hacks/config/pacman.xml.h:5 hacks/config/penetrate.xml.h:6
 #: hacks/config/penrose.xml.h:11 hacks/config/petri.xml.h:23
 #: hacks/config/phosphor.xml.h:7 hacks/config/piecewise.xml.h:9
 #: hacks/config/pacman.xml.h:5 hacks/config/penetrate.xml.h:6
 #: hacks/config/penrose.xml.h:11 hacks/config/petri.xml.h:23
 #: hacks/config/phosphor.xml.h:7 hacks/config/piecewise.xml.h:9
-#: hacks/config/pipes.xml.h:15 hacks/config/polyhedra.xml.h:119
-#: hacks/config/polyominoes.xml.h:10 hacks/config/polytopes.xml.h:20
-#: hacks/config/pong.xml.h:4 hacks/config/popsquares.xml.h:5
-#: hacks/config/providence.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 hacks/config/rocks.xml.h:9
-#: hacks/config/rotor.xml.h:11 hacks/config/rubik.xml.h:9
-#: hacks/config/sballs.xml.h:13 hacks/config/shadebobs.xml.h:9
-#: hacks/config/sierpinski.xml.h:7 hacks/config/sierpinski3d.xml.h:8
-#: hacks/config/slidescreen.xml.h:6 hacks/config/slip.xml.h:7
-#: hacks/config/speedmine.xml.h:13 hacks/config/sphere.xml.h:5
-#: hacks/config/spheremonics.xml.h:19 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:4 hacks/config/superquadrics.xml.h:8
+#: hacks/config/pinion.xml.h:13 hacks/config/pipes.xml.h:15
+#: hacks/config/polyhedra.xml.h:119 hacks/config/polyominoes.xml.h:10
+#: hacks/config/polytopes.xml.h:20 hacks/config/pong.xml.h:4
+#: hacks/config/popsquares.xml.h:5 hacks/config/providence.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
+#: hacks/config/rocks.xml.h:9 hacks/config/rotor.xml.h:11
+#: hacks/config/rubik.xml.h:9 hacks/config/sballs.xml.h:13
+#: hacks/config/shadebobs.xml.h:9 hacks/config/sierpinski.xml.h:7
+#: hacks/config/sierpinski3d.xml.h:8 hacks/config/slidescreen.xml.h:6
+#: hacks/config/slip.xml.h:7 hacks/config/speedmine.xml.h:13
+#: hacks/config/sphere.xml.h:5 hacks/config/spheremonics.xml.h:19
+#: 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:4
+#: hacks/config/substrate.xml.h:10 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/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
@@ -1309,17 +1315,18 @@ msgstr "Lent(e)"
 #: hacks/config/engine.xml.h:16 hacks/config/epicycle.xml.h:11
 #: 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/engine.xml.h:16 hacks/config/epicycle.xml.h:11
 #: 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/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/fuzzyflakes.xml.h:17
-#: hacks/config/galaxy.xml.h:11 hacks/config/glblur.xml.h:17
-#: hacks/config/glforestfire.xml.h:15 hacks/config/glplanet.xml.h:10
-#: 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:11 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/fireworkx.xml.h:11 hacks/config/flag.xml.h:9
+#: hacks/config/flame.xml.h:15 hacks/config/flipflop.xml.h:7
+#: hacks/config/flipscreen3d.xml.h:7 hacks/config/flow.xml.h:12
+#: hacks/config/fluidballs.xml.h:20 hacks/config/forest.xml.h:6
+#: hacks/config/fuzzyflakes.xml.h:17 hacks/config/galaxy.xml.h:12
+#: hacks/config/glblur.xml.h:17 hacks/config/glforestfire.xml.h:15
+#: hacks/config/glplanet.xml.h:10 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:11
+#: 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/intermomentary.xml.h:5 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/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
@@ -1348,16 +1355,16 @@ msgstr "Lent(e)"
 #: 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/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/xplanet.xml.h:60 hacks/config/xrayswarm.xml.h:4
-#: hacks/config/zoom.xml.h:7
+#: hacks/config/strange.xml.h:5 hacks/config/substrate.xml.h:11
+#: 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/xplanet.xml.h:60
+#: hacks/config/xrayswarm.xml.h:4 hacks/config/zoom.xml.h:7
 msgid "Speed"
 msgstr "Vitesse"
 
 msgid "Speed"
 msgstr "Vitesse"
 
@@ -1400,8 +1407,8 @@ msgstr "Vitesse de rotation"
 #: hacks/config/discrete.xml.h:11 hacks/config/drift.xml.h:14
 #: hacks/config/epicycle.xml.h:13 hacks/config/euler2d.xml.h:17
 #: hacks/config/fadeplot.xml.h:12 hacks/config/flag.xml.h:13
 #: hacks/config/discrete.xml.h:11 hacks/config/drift.xml.h:14
 #: hacks/config/epicycle.xml.h:13 hacks/config/euler2d.xml.h:17
 #: hacks/config/fadeplot.xml.h:12 hacks/config/flag.xml.h:13
-#: hacks/config/flame.xml.h:16 hacks/config/flow.xml.h:18
-#: hacks/config/forest.xml.h:8 hacks/config/galaxy.xml.h:13
+#: hacks/config/flame.xml.h:16 hacks/config/flow.xml.h:15
+#: hacks/config/forest.xml.h:8 hacks/config/galaxy.xml.h:14
 #: hacks/config/grav.xml.h:11 hacks/config/halo.xml.h:13
 #: hacks/config/hopalong.xml.h:25 hacks/config/ifs.xml.h:8
 #: hacks/config/imsmap.xml.h:15 hacks/config/interference.xml.h:19
 #: hacks/config/grav.xml.h:11 hacks/config/halo.xml.h:13
 #: hacks/config/hopalong.xml.h:25 hacks/config/ifs.xml.h:8
 #: hacks/config/imsmap.xml.h:15 hacks/config/interference.xml.h:19
@@ -1503,7 +1510,7 @@ msgstr "Cellules 
 #: 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/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/flag.xml.h:4 hacks/config/flow.xml.h:4
 #: hacks/config/fluidballs.xml.h:12 hacks/config/fuzzyflakes.xml.h:10
 #: 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/fluidballs.xml.h:12 hacks/config/fuzzyflakes.xml.h:10
 #: hacks/config/gleidescope.xml.h:7 hacks/config/halftone.xml.h:8
 #: hacks/config/hopalong.xml.h:13 hacks/config/interference.xml.h:11
@@ -1535,7 +1542,7 @@ msgstr "Cellules 
 #: 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/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/flag.xml.h:8 hacks/config/flow.xml.h:11
 #: hacks/config/fluidballs.xml.h:19 hacks/config/fuzzyflakes.xml.h:16
 #: 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/fluidballs.xml.h:19 hacks/config/fuzzyflakes.xml.h:16
 #: hacks/config/gleidescope.xml.h:12 hacks/config/halftone.xml.h:14
 #: hacks/config/hopalong.xml.h:22 hacks/config/interference.xml.h:18
@@ -1554,7 +1561,7 @@ msgstr "Cellules 
 
 #: 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/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/flag.xml.h:12 hacks/config/flow.xml.h:14
 #: hacks/config/lissie.xml.h:12 hacks/config/loop.xml.h:11
 #: hacks/config/rubik.xml.h:12 hacks/config/sierpinski.xml.h:11
 #: hacks/config/slip.xml.h:11
 #: hacks/config/lissie.xml.h:12 hacks/config/loop.xml.h:11
 #: hacks/config/rubik.xml.h:12 hacks/config/sierpinski.xml.h:11
 #: hacks/config/slip.xml.h:11
@@ -1606,13 +1613,14 @@ msgstr ""
 #: hacks/config/menger.xml.h:15 hacks/config/mirrorblob.xml.h:18
 #: hacks/config/moebius.xml.h:6 hacks/config/molecule.xml.h:21
 #: hacks/config/morph3d.xml.h:5 hacks/config/noof.xml.h:4
 #: hacks/config/menger.xml.h:15 hacks/config/mirrorblob.xml.h:18
 #: hacks/config/moebius.xml.h:6 hacks/config/molecule.xml.h:21
 #: hacks/config/morph3d.xml.h:5 hacks/config/noof.xml.h:4
-#: hacks/config/pipes.xml.h:14 hacks/config/polyhedra.xml.h:118
-#: hacks/config/polytopes.xml.h:18 hacks/config/providence.xml.h:4
-#: 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
+#: hacks/config/pinion.xml.h:12 hacks/config/pipes.xml.h:14
+#: hacks/config/polyhedra.xml.h:118 hacks/config/polytopes.xml.h:18
+#: hacks/config/providence.xml.h:4 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)"
 
 msgid "Show Frames-per-Second"
 msgstr "Afficher «trames par seconde» (FPS)"
 
@@ -1784,11 +1792,12 @@ msgstr "Vitesse des baleines"
 #: hacks/config/lament.xml.h:9 hacks/config/lavalite.xml.h:32
 #: hacks/config/menger.xml.h:21 hacks/config/mirrorblob.xml.h:24
 #: hacks/config/moebius.xml.h:11 hacks/config/molecule.xml.h:26
 #: hacks/config/lament.xml.h:9 hacks/config/lavalite.xml.h:32
 #: hacks/config/menger.xml.h:21 hacks/config/mirrorblob.xml.h:24
 #: hacks/config/moebius.xml.h:11 hacks/config/molecule.xml.h:26
-#: hacks/config/polyhedra.xml.h:173 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
+#: hacks/config/pinion.xml.h:15 hacks/config/polyhedra.xml.h:173
+#: 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"
 
 msgid "Wireframe"
 msgstr "Fil de fer"
 
@@ -1887,14 +1896,15 @@ msgstr "Ligne"
 #: 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/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/mismunch.xml.h:3
-#: 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 hacks/config/spheremonics.xml.h:7
+#: hacks/config/flow.xml.h:6 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/mismunch.xml.h:3 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
+#: hacks/config/spheremonics.xml.h:7 hacks/config/substrate.xml.h:6
 #: hacks/config/wander.xml.h:10 hacks/config/whirlwindwarp.xml.h:3
 msgid "Long"
 msgstr "Long(ue)"
 #: hacks/config/wander.xml.h:10 hacks/config/whirlwindwarp.xml.h:3
 msgid "Long"
 msgstr "Long(ue)"
@@ -1941,13 +1951,14 @@ msgstr "Seuil de r
 #: 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/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/metaballs.xml.h:12 hacks/config/mismunch.xml.h:8
-#: 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/flow.xml.h:9 hacks/config/galaxy.xml.h:9
+#: hacks/config/klein.xml.h:5 hacks/config/laser.xml.h:9
+#: hacks/config/menger.xml.h:14 hacks/config/metaballs.xml.h:12
+#: hacks/config/mismunch.xml.h:8 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/substrate.xml.h:9
 #: hacks/config/wander.xml.h:12 hacks/config/whirlwindwarp.xml.h:6
 msgid "Short"
 msgstr "Court(e)"
 #: hacks/config/wander.xml.h:12 hacks/config/whirlwindwarp.xml.h:6
 msgid "Short"
 msgstr "Court(e)"
@@ -2164,10 +2175,10 @@ msgstr ""
 #: 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/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/polyhedra.xml.h:3 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/wormhole.xml.h:1
-#: hacks/config/xfishtank.xml.h:1
+#: hacks/config/pinion.xml.h:3 hacks/config/polyhedra.xml.h:3
+#: 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/wormhole.xml.h:1 hacks/config/xfishtank.xml.h:1
 msgid "Animation Speed"
 msgstr "Vitesse d'animation"
 
 msgid "Animation Speed"
 msgstr "Vitesse d'animation"
 
@@ -2246,8 +2257,9 @@ msgstr ""
 #: 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/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/starfish.xml.h:2 hacks/config/substrate.xml.h:1
+#: hacks/config/vidwhacker.xml.h:3 hacks/config/wander.xml.h:7
+#: hacks/config/xspirograph.xml.h:3
 msgid "Duration"
 msgstr "Durée"
 
 msgid "Duration"
 msgstr "Durée"
 
@@ -2511,7 +2523,7 @@ msgstr "Composants"
 msgid "Rotate"
 msgstr "Rotation globale"
 
 msgid "Rotate"
 msgstr "Rotation globale"
 
-#: hacks/config/circuit.xml.h:8
+#: hacks/config/circuit.xml.h:8 hacks/config/pinion.xml.h:10
 msgid "Rotation Speed"
 msgstr "Vitesse de rotation"
 
 msgid "Rotation Speed"
 msgstr "Vitesse de rotation"
 
@@ -2596,11 +2608,12 @@ msgstr "1 seconde"
 msgid "Coral"
 msgstr "Corail"
 
 msgid "Coral"
 msgstr "Corail"
 
-#: hacks/config/coral.xml.h:4 hacks/config/gflux.xml.h:3
-#: hacks/config/glblur.xml.h:2 hacks/config/glmatrix.xml.h:3
-#: 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
+#: hacks/config/coral.xml.h:4 hacks/config/fireworkx.xml.h:2
+#: hacks/config/gflux.xml.h:3 hacks/config/glblur.xml.h:2
+#: hacks/config/glmatrix.xml.h:3 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
 msgid "Dense"
 msgstr "Dense"
 
 msgid "Dense"
 msgstr "Dense"
 
@@ -2613,12 +2626,12 @@ msgid ""
 "Simulates coral growth, albeit somewhat slowly. Written by Frederick Roeber."
 msgstr ""
 
 "Simulates coral growth, albeit somewhat slowly. Written by Frederick Roeber."
 msgstr ""
 
-#: hacks/config/coral.xml.h:13 hacks/config/gflux.xml.h:13
-#: hacks/config/glblur.xml.h:16 hacks/config/glmatrix.xml.h:19
-#: hacks/config/imsmap.xml.h:13 hacks/config/lavalite.xml.h:29
-#: hacks/config/pyro.xml.h:14 hacks/config/qix.xml.h:21
-#: hacks/config/squiral.xml.h:15 hacks/config/xearth.xml.h:24
-#: hacks/config/xmatrix.xml.h:17
+#: hacks/config/coral.xml.h:13 hacks/config/fireworkx.xml.h:10
+#: hacks/config/gflux.xml.h:13 hacks/config/glblur.xml.h:16
+#: hacks/config/glmatrix.xml.h:19 hacks/config/imsmap.xml.h:13
+#: hacks/config/lavalite.xml.h:29 hacks/config/pyro.xml.h:14
+#: hacks/config/qix.xml.h:21 hacks/config/squiral.xml.h:15
+#: hacks/config/xearth.xml.h:24 hacks/config/xmatrix.xml.h:17
 msgid "Sparse"
 msgstr "Faible"
 
 msgid "Sparse"
 msgstr "Faible"
 
@@ -2650,7 +2663,7 @@ msgid "Center on Screen"
 msgstr "Centré sur l'écran"
 
 #: hacks/config/crystal.xml.h:2 hacks/config/deluxe.xml.h:1
 msgstr "Centré sur l'écran"
 
 #: hacks/config/crystal.xml.h:2 hacks/config/deluxe.xml.h:1
-#: hacks/config/fadeplot.xml.h:1 hacks/config/flow.xml.h:3
+#: hacks/config/fadeplot.xml.h:1 hacks/config/flow.xml.h:1
 #: hacks/config/galaxy.xml.h:1 hacks/config/glforestfire.xml.h:1
 #: hacks/config/grav.xml.h:1 hacks/config/julia.xml.h:1
 #: hacks/config/laser.xml.h:1 hacks/config/lisa.xml.h:1
 #: hacks/config/galaxy.xml.h:1 hacks/config/glforestfire.xml.h:1
 #: hacks/config/grav.xml.h:1 hacks/config/julia.xml.h:1
 #: hacks/config/laser.xml.h:1 hacks/config/lisa.xml.h:1
@@ -3434,7 +3447,7 @@ msgstr "Luminescence"
 msgid "Half"
 msgstr "Moitié"
 
 msgid "Half"
 msgstr "Moitié"
 
-#: hacks/config/fireflies.xml.h:17
+#: hacks/config/fireflies.xml.h:17 hacks/config/pinion.xml.h:7
 msgid "Huge"
 msgstr "Énorme"
 
 msgid "Huge"
 msgstr "Énorme"
 
@@ -3523,7 +3536,7 @@ msgstr "Hypervitesse des essaims"
 msgid "Swarm tails glow"
 msgstr "Queue des essaims luminescente"
 
 msgid "Swarm tails glow"
 msgstr "Queue des essaims luminescente"
 
-#: hacks/config/fireflies.xml.h:43
+#: hacks/config/fireflies.xml.h:43 hacks/config/pinion.xml.h:14
 msgid "Tiny"
 msgstr "Fin"
 
 msgid "Tiny"
 msgstr "Fin"
 
@@ -3539,6 +3552,30 @@ msgstr "Vent"
 msgid "Wind picks up"
 msgstr "Le vent reprend"
 
 msgid "Wind picks up"
 msgstr "Le vent reprend"
 
+#: hacks/config/fireworkx.xml.h:1 hacks/config/lavalite.xml.h:3
+msgid "Activity"
+msgstr "Activité"
+
+#: hacks/config/fireworkx.xml.h:4
+msgid "Fast Fade (more realistic)"
+msgstr "Fondu rapide (plus réaliste)"
+
+#: hacks/config/fireworkx.xml.h:5
+msgid "Fireworkx"
+msgstr "Feux d'artifice"
+
+#: hacks/config/fireworkx.xml.h:6
+msgid "Light effect"
+msgstr "Effet de lumière"
+
+#: hacks/config/fireworkx.xml.h:7
+msgid "Pyrotechnics simulation eye-candy. Written by Rony B. Chandran."
+msgstr "Simulation pyrotechnique visuelle. Écrit par Rony B. Chandran."
+
+#: hacks/config/fireworkx.xml.h:8
+msgid "Shoot"
+msgstr "Tir"
+
 #: hacks/config/flag.xml.h:1
 msgid "Bitmap for Flag"
 msgstr "Bitmap du drapeau"
 #: hacks/config/flag.xml.h:1
 msgid "Bitmap for Flag"
 msgstr "Bitmap du drapeau"
@@ -3617,45 +3654,45 @@ msgid ""
 "around and deforms it in various ways. Written by Ben Buxton."
 msgstr ""
 
 "around and deforms it in various ways. Written by Ben Buxton."
 msgstr ""
 
-#: hacks/config/flow.xml.h:1
-msgid "Allow 2D Attractors"
-msgstr "Autoriser les attracteurs 2D"
-
-#: hacks/config/flow.xml.h:2
-msgid ""
-"Another series of strange attractors: a flowing series of points, making "
-"strange rotational shapes. Written by Tim Auckland."
-msgstr ""
-"Une autre série d'attracteurs étranges : une série flottante de points, "
-"constituant d'étranges formes rotatives. Écrit par Tim Auckland."
-
-#: hacks/config/flow.xml.h:5
+#: hacks/config/flow.xml.h:3
 msgid "Flow"
 msgstr "Flux"
 
 msgid "Flow"
 msgstr "Flux"
 
-#: hacks/config/flow.xml.h:6
-msgid "Freeze Some Bees"
-msgstr "Geler des abeilles"
+#: hacks/config/flow.xml.h:5
+msgid "Length of trails"
+msgstr "Taille des traînées"
 
 
-#: hacks/config/flow.xml.h:10
-msgid "Ride a Trained Bee"
-msgstr "Utiliser une abeille dressée"
+#: hacks/config/flow.xml.h:13
+msgid ""
+"Strange attractors formed of flows in a 3D differential equation phase "
+"space. Written by Tim Auckland."
+msgstr ""
+"Attracteurs étranges formés de flux dans un espace 3D d'équation de phase. "
+"Écrit par Tim Auckland."
 
 
-#: hacks/config/flow.xml.h:11
-msgid "Rotate Around Attractor"
-msgstr "Tourner autour de l'attracteur"
+#: hacks/config/flow.xml.h:16
+msgid "turn on/off bounding box."
+msgstr "Boîte englobante."
 
 
-#: hacks/config/flow.xml.h:12
-msgid "Show Bounding Box"
-msgstr "Afficher une boîte bondissante"
+#: hacks/config/flow.xml.h:17
+msgid "turn on/off double buffering."
+msgstr "Double tampon."
 
 
-#: hacks/config/flow.xml.h:14
-msgid "Slow Bees with Antifreeze"
-msgstr "Ralentir les abeilles avec de l'antigel"
+#: hacks/config/flow.xml.h:18
+msgid "turn on/off periodic attractors."
+msgstr "Attracteurs périodiques."
 
 #: hacks/config/flow.xml.h:19
 
 #: hacks/config/flow.xml.h:19
-msgid "Zoom In and Out"
-msgstr "Zoom avant et arrière"
+msgid "turn on/off ride in the flow."
+msgstr "Circulation dans le flux."
+
+#: hacks/config/flow.xml.h:20
+msgid "turn on/off rotating around attractor."
+msgstr "Tourner autour de l'attracteur"
+
+#: hacks/config/flow.xml.h:21
+msgid "turn on/off search for new attractors."
+msgstr "Rechercher de nouveaux attracteurs"
 
 #: hacks/config/fluidballs.xml.h:1
 msgid "      Freefall"
 
 #: hacks/config/fluidballs.xml.h:1
 msgid "      Freefall"
@@ -3861,7 +3898,11 @@ msgstr "Couleurs al
 msgid "Galaxy"
 msgstr "Galaxie"
 
 msgid "Galaxy"
 msgstr "Galaxie"
 
-#: hacks/config/galaxy.xml.h:9 hacks/config/lisa.xml.h:7
+#: hacks/config/galaxy.xml.h:8
+msgid "Rotate Viewpoint"
+msgstr "Rotation du point de vue"
+
+#: hacks/config/galaxy.xml.h:10 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/pong.xml.h:3
 #: hacks/config/rotor.xml.h:10 hacks/config/rubik.xml.h:8
 #: hacks/config/lissie.xml.h:8 hacks/config/loop.xml.h:6
 #: hacks/config/penrose.xml.h:10 hacks/config/pong.xml.h:3
 #: hacks/config/rotor.xml.h:10 hacks/config/rubik.xml.h:8
@@ -3870,7 +3911,7 @@ msgstr "Galaxie"
 msgid "Size"
 msgstr "Taille"
 
 msgid "Size"
 msgstr "Taille"
 
-#: hacks/config/galaxy.xml.h:12
+#: hacks/config/galaxy.xml.h:13
 msgid ""
 "This draws spinning galaxies, which then collide and scatter their stars to "
 "the, uh, four winds or something. Originally an Amiga program by Uli "
 msgid ""
 "This draws spinning galaxies, which then collide and scatter their stars to "
 "the, uh, four winds or something. Originally an Amiga program by Uli "
@@ -4162,15 +4203,15 @@ msgstr "50 %"
 
 #: hacks/config/glslideshow.xml.h:9
 msgid "Always show at least this much of the image:"
 
 #: hacks/config/glslideshow.xml.h:9
 msgid "Always show at least this much of the image:"
-msgstr "Montre au moins ce % de l'image :"
+msgstr "Montre au moins ce % de l'image :"
 
 #: hacks/config/glslideshow.xml.h:10 hacks/config/mirrorblob.xml.h:6
 msgid "Crossfade Duration:"
 
 #: hacks/config/glslideshow.xml.h:10 hacks/config/mirrorblob.xml.h:6
 msgid "Crossfade Duration:"
-msgstr "Durée du fondu-enchaîné :"
+msgstr "Durée du fondu-enchaîné :"
 
 #: hacks/config/glslideshow.xml.h:11
 msgid "Frame Rate:"
 
 #: hacks/config/glslideshow.xml.h:11
 msgid "Frame Rate:"
-msgstr "Trames par seconde :"
+msgstr "Trames par seconde :"
 
 #: hacks/config/glslideshow.xml.h:12
 msgid "GLSlideshow"
 
 #: hacks/config/glslideshow.xml.h:12
 msgid "GLSlideshow"
@@ -4183,14 +4224,14 @@ msgid ""
 "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 "
 "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."
+"of this window: the tab at the top of the *other* window.) 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 ""
 
 #: hacks/config/glslideshow.xml.h:17
 msgid "Pan/Zoom Duration:"
-msgstr "Durée panoramique/zoom :"
+msgstr "Durée panoramique/zoom :"
 
 #: hacks/config/glslideshow.xml.h:19
 msgid "Show Image Titles"
 
 #: hacks/config/glslideshow.xml.h:19
 msgid "Show Image Titles"
@@ -4198,7 +4239,7 @@ msgstr "Montre le titre de l'image"
 
 #: hacks/config/glslideshow.xml.h:20 hacks/config/mirrorblob.xml.h:22
 msgid "Time until loading a new image:"
 
 #: hacks/config/glslideshow.xml.h:20 hacks/config/mirrorblob.xml.h:22
 msgid "Time until loading a new image:"
-msgstr "Durée avant chargement d'une nouvelle image :"
+msgstr "Durée avant chargement d'une nouvelle image :"
 
 #: hacks/config/glsnake.xml.h:1 hacks/config/lavalite.xml.h:1
 msgid "1"
 
 #: hacks/config/glsnake.xml.h:1 hacks/config/lavalite.xml.h:1
 msgid "1"
@@ -4565,11 +4606,11 @@ msgstr ""
 
 #: hacks/config/hypertorus.xml.h:1 hacks/config/polytopes.xml.h:1
 msgid "-4.0"
 
 #: hacks/config/hypertorus.xml.h:1 hacks/config/polytopes.xml.h:1
 msgid "-4.0"
-msgstr ""
+msgstr "-4.0"
 
 #: hacks/config/hypertorus.xml.h:2 hacks/config/polytopes.xml.h:5
 msgid "4.0"
 
 #: hacks/config/hypertorus.xml.h:2 hacks/config/polytopes.xml.h:5
 msgid "4.0"
-msgstr ""
+msgstr "4.0"
 
 #: hacks/config/hypertorus.xml.h:3
 msgid "4D Hypertorus"
 
 #: hacks/config/hypertorus.xml.h:3
 msgid "4D Hypertorus"
@@ -4753,6 +4794,26 @@ msgstr "Nombre de vagues"
 msgid "Wave Size"
 msgstr "Taille des vagues"
 
 msgid "Wave Size"
 msgstr "Taille des vagues"
 
+#: hacks/config/intermomentary.xml.h:2
+msgid "Intermomentary"
+msgstr "InterMomentary"
+
+#: hacks/config/intermomentary.xml.h:3
+msgid "Number of Discs"
+msgstr "Nombre de disques"
+
+#: hacks/config/intermomentary.xml.h:6
+msgid ""
+"The Intersection Momentary is a fun visualization defining the relationships "
+"between objects with Casey Reas, William Ngan, and Robert Hodgin. "
+"Commissioned for display at the Whitney Museum of American Art. A surface "
+"filled with 100 medium to small sized circles. Each circle has a different "
+"size and direction, but moves at the same slow rate. Display: A. The "
+"instantaneous intersections of the circles. B. The aggregate intersections "
+"of the circles. Ported to XScreensaver from the art project \"InterMomentary"
+"\" at http://www.complexification.net"
+msgstr ""
+
 #: hacks/config/jigglypuff.xml.h:2
 msgid "Chrome"
 msgstr "Chrome"
 #: hacks/config/jigglypuff.xml.h:2
 msgid "Chrome"
 msgstr "Chrome"
@@ -4775,7 +4836,7 @@ msgstr "Att
 
 #: hacks/config/jigglypuff.xml.h:10
 msgid "JigglyPuff"
 
 #: hacks/config/jigglypuff.xml.h:10
 msgid "JigglyPuff"
-msgstr ""
+msgstr "JigglyPuff"
 
 #: hacks/config/jigglypuff.xml.h:14
 msgid "Rotation speed"
 
 #: hacks/config/jigglypuff.xml.h:14
 msgid "Rotation speed"
@@ -4791,11 +4852,11 @@ msgstr "Force des sph
 
 #: hacks/config/jigglypuff.xml.h:19
 msgid "Spookiness"
 
 #: hacks/config/jigglypuff.xml.h:19
 msgid "Spookiness"
-msgstr ""
+msgstr "Niveau de frayeur"
 
 #: hacks/config/jigglypuff.xml.h:20
 msgid "Spoooooky"
 
 #: hacks/config/jigglypuff.xml.h:20
 msgid "Spoooooky"
-msgstr ""
+msgstr "Chair de poulesque (!)"
 
 #: hacks/config/jigglypuff.xml.h:21 hacks/config/polyhedra.xml.h:155
 #: hacks/config/sballs.xml.h:16
 
 #: hacks/config/jigglypuff.xml.h:21 hacks/config/polyhedra.xml.h:155
 #: hacks/config/sballs.xml.h:16
@@ -4996,10 +5057,6 @@ msgstr ""
 msgid "10"
 msgstr "10"
 
 msgid "10"
 msgstr "10"
 
-#: hacks/config/lavalite.xml.h:3
-msgid "Activity"
-msgstr "Activité"
-
 #: hacks/config/lavalite.xml.h:4
 msgid "Classic Lavalite"
 msgstr "Lavalite classique"
 #: hacks/config/lavalite.xml.h:4
 msgid "Classic Lavalite"
 msgstr "Lavalite classique"
@@ -5261,7 +5318,7 @@ msgstr "Nombre de m
 
 #: hacks/config/mirrorblob.xml.h:4
 msgid "Blobby"
 
 #: hacks/config/mirrorblob.xml.h:4
 msgid "Blobby"
-msgstr ""
+msgstr "Patés"
 
 #: hacks/config/mirrorblob.xml.h:5 hacks/config/nerverot.xml.h:2
 msgid "Calm"
 
 #: hacks/config/mirrorblob.xml.h:5 hacks/config/nerverot.xml.h:2
 msgid "Calm"
@@ -5295,11 +5352,11 @@ msgstr "Points"
 
 #: hacks/config/mirrorblob.xml.h:14
 msgid "Freaky"
 
 #: hacks/config/mirrorblob.xml.h:14
 msgid "Freaky"
-msgstr ""
+msgstr "Bizarre"
 
 #: hacks/config/mirrorblob.xml.h:15
 msgid "MirrorBlob"
 
 #: hacks/config/mirrorblob.xml.h:15
 msgid "MirrorBlob"
-msgstr ""
+msgstr "Tâches miroir"
 
 #: hacks/config/mirrorblob.xml.h:17
 msgid "Offset Texture Coordinates"
 
 #: hacks/config/mirrorblob.xml.h:17
 msgid "Offset Texture Coordinates"
@@ -5307,7 +5364,7 @@ msgstr "Offset des coordonn
 
 #: hacks/config/mirrorblob.xml.h:23
 msgid "Very Freaky"
 
 #: hacks/config/mirrorblob.xml.h:23
 msgid "Very Freaky"
-msgstr ""
+msgstr "Délirant"
 
 #: hacks/config/mirrorblob.xml.h:25
 msgid "X Resolution"
 
 #: hacks/config/mirrorblob.xml.h:25
 msgid "X Resolution"
@@ -5505,7 +5562,7 @@ msgstr "Couleurs"
 
 #: hacks/config/nerverot.xml.h:5
 msgid "Crunchiness"
 
 #: hacks/config/nerverot.xml.h:5
 msgid "Crunchiness"
-msgstr ""
+msgstr "Croquant"
 
 #: hacks/config/nerverot.xml.h:7
 msgid ""
 
 #: hacks/config/nerverot.xml.h:7
 msgid ""
@@ -5541,7 +5598,7 @@ msgstr ""
 
 #: hacks/config/noof.xml.h:3
 msgid "Noof"
 
 #: hacks/config/noof.xml.h:3
 msgid "Noof"
-msgstr ""
+msgstr "Noof"
 
 #: hacks/config/noseguy.xml.h:1
 msgid ""
 
 #: hacks/config/noseguy.xml.h:1
 msgid ""
@@ -5778,7 +5835,7 @@ msgstr "Rayon min"
 
 #: hacks/config/piecewise.xml.h:8
 msgid "Piecewise"
 
 #: hacks/config/piecewise.xml.h:8
 msgid "Piecewise"
-msgstr ""
+msgstr "Piecewise"
 
 #: hacks/config/piecewise.xml.h:12
 msgid ""
 
 #: hacks/config/piecewise.xml.h:12
 msgid ""
@@ -5786,6 +5843,38 @@ msgid ""
 "invisibility at intersection points. Written by Geoffrey Irving."
 msgstr ""
 
 "invisibility at intersection points. Written by Geoffrey Irving."
 msgstr ""
 
+#: hacks/config/pinion.xml.h:1
+msgid "100"
+msgstr "100"
+
+#: hacks/config/pinion.xml.h:2
+msgid "2000"
+msgstr "2000"
+
+#: hacks/config/pinion.xml.h:4
+msgid ""
+"Draws an interconnected set of gears moving across the screen. Written by "
+"Jamie Zawinski."
+msgstr ""
+"Dessine des engrenages interconnectés se déplacant dans l'écran. Écrit par "
+"Jamie Zawinski."
+
+#: hacks/config/pinion.xml.h:6
+msgid "Gear Size"
+msgstr "Taille des engrenages"
+
+#: hacks/config/pinion.xml.h:8
+msgid "Max RPM"
+msgstr "Vitesse max."
+
+#: hacks/config/pinion.xml.h:9
+msgid "Pinion"
+msgstr "Pinion"
+
+#: hacks/config/pinion.xml.h:11
+msgid "Scrolling Speed"
+msgstr "Vitesse de défilement"
+
 #: hacks/config/pipes.xml.h:1
 msgid "Allow Tight Turns"
 msgstr "Autoriser des virages serrés"
 #: hacks/config/pipes.xml.h:1
 msgid "Allow Tight Turns"
 msgstr "Autoriser des virages serrés"
@@ -5814,7 +5903,8 @@ msgstr ""
 "Si vous avez déjà croisé la route d'une machine Windows NT, vous avez "
 "certainement déjà vu ce hack GL. Cette version est de Marcelo Vianna."
 
 "Si vous avez déjà croisé la route d'une machine Windows NT, vous avez "
 "certainement déjà vu ce hack GL. Cette version est de Marcelo Vianna."
 
-#: hacks/config/pipes.xml.h:9 hacks/config/wormhole.xml.h:4
+#: hacks/config/pipes.xml.h:9 hacks/config/substrate.xml.h:7
+#: hacks/config/wormhole.xml.h:4
 msgid "Lots"
 msgstr "Beaucoup"
 
 msgid "Lots"
 msgstr "Beaucoup"
 
@@ -7069,22 +7159,26 @@ msgid "Ping subnet/30 (2 hosts)"
 msgstr "Ping sous-réseau/30 (2 hôtes)"
 
 #: hacks/config/sonar.xml.h:10
 msgstr "Ping sous-réseau/30 (2 hôtes)"
 
 #: hacks/config/sonar.xml.h:10
+msgid "Resolve Host Names"
+msgstr "Résolution des noms d'hôte"
+
+#: hacks/config/sonar.xml.h:11
 msgid "Simulation Team Members"
 msgstr "Membres de l'équipe simulation"
 
 msgid "Simulation Team Members"
 msgstr "Membres de l'équipe simulation"
 
-#: hacks/config/sonar.xml.h:11
+#: hacks/config/sonar.xml.h:12
 msgid "Sonar"
 msgstr "Sonar"
 
 msgid "Sonar"
 msgstr "Sonar"
 
-#: hacks/config/sonar.xml.h:12
+#: hacks/config/sonar.xml.h:13
 msgid "Team A Name"
 msgstr "Nom de l'équipe A"
 
 msgid "Team A Name"
 msgstr "Nom de l'équipe A"
 
-#: hacks/config/sonar.xml.h:13
+#: hacks/config/sonar.xml.h:14
 msgid "Team B Name"
 msgstr "Nom de l'équipe B"
 
 msgid "Team B Name"
 msgstr "Nom de l'équipe B"
 
-#: hacks/config/sonar.xml.h:14
+#: hacks/config/sonar.xml.h:15
 msgid ""
 "This program draws a simulation of a sonar screen. By default, it displays a "
 "random assortment of ``bogies'' on the screen, but if installed as \"setuid "
 msgid ""
 "This program draws a simulation of a sonar screen. By default, it displays a "
 "random assortment of ``bogies'' on the screen, but if installed as \"setuid "
@@ -7098,7 +7192,7 @@ msgstr ""
 "et calculer  la proximité des autres hôtes du réseau par rapport à vous."
 "Écrit par Stephen Martin et Jamie Zawinski."
 
 "et calculer  la proximité des autres hôtes du réseau par rapport à vous."
 "Écrit par Stephen Martin et Jamie Zawinski."
 
-#: hacks/config/sonar.xml.h:15
+#: hacks/config/sonar.xml.h:16
 msgid "vs."
 msgstr "contre"
 
 msgid "vs."
 msgstr "contre"
 
@@ -7397,6 +7491,29 @@ msgstr ""
 "colorés qui tournent et se tortillent de manière imprévisible. Le mouvement "
 "est très beau. Écrit par Massimino Pascal."
 
 "colorés qui tournent et se tortillent de manière imprévisible. Le mouvement "
 "est très beau. Écrit par Massimino Pascal."
 
+#: hacks/config/substrate.xml.h:4
+msgid "Initial Cracks"
+msgstr "Craquements initaux"
+
+#: hacks/config/substrate.xml.h:5
+msgid ""
+"Lines like crystals grow on a computational substrate. A simple "
+"perpendicular growth rule creates intricate city-like structures. By J. "
+"Tarbell and Mike Kershaw."
+msgstr ""
+
+#: hacks/config/substrate.xml.h:8
+msgid "Sandgrains"
+msgstr "Grains de sable"
+
+#: hacks/config/substrate.xml.h:12
+msgid "Substrate"
+msgstr "Substrat"
+
+#: hacks/config/substrate.xml.h:13
+msgid "Wireframe only"
+msgstr "Fil de fer"
+
 #: hacks/config/superquadrics.xml.h:3
 msgid ""
 "Ed Mackey reports that he wrote the first version of this program in BASIC "
 #: hacks/config/superquadrics.xml.h:3
 msgid ""
 "Ed Mackey reports that he wrote the first version of this program in BASIC "
@@ -7751,7 +7868,7 @@ msgstr ""
 
 #: hacks/config/xanalogtv.xml.h:1
 msgid "XAnalogTV"
 
 #: hacks/config/xanalogtv.xml.h:1
 msgid "XAnalogTV"
-msgstr ""
+msgstr "X TV analogique"
 
 #: hacks/config/xanalogtv.xml.h:2
 msgid ""
 
 #: hacks/config/xanalogtv.xml.h:2
 msgid ""
@@ -8040,7 +8157,7 @@ msgstr "Amplitude basse"
 
 #: hacks/config/xmountains.xml.h:6
 msgid "Ambient  Low"
 
 #: hacks/config/xmountains.xml.h:6
 msgid "Ambient  Low"
-msgstr ""
+msgstr "Environnement bas"
 
 #: hacks/config/xmountains.xml.h:7
 msgid "Angle of Light"
 
 #: hacks/config/xmountains.xml.h:7
 msgid "Angle of Light"
@@ -8056,15 +8173,15 @@ msgstr "Contraste bas"
 
 #: hacks/config/xmountains.xml.h:10
 msgid "Craggy"
 
 #: hacks/config/xmountains.xml.h:10
 msgid "Craggy"
-msgstr ""
+msgstr "Rocailleux"
 
 #: hacks/config/xmountains.xml.h:11
 msgid "Cross Update"
 
 #: hacks/config/xmountains.xml.h:11
 msgid "Cross Update"
-msgstr ""
+msgstr "Mise à jour croisée"
 
 #: hacks/config/xmountains.xml.h:12
 msgid "Distance  Low"
 
 #: hacks/config/xmountains.xml.h:12
 msgid "Distance  Low"
-msgstr ""
+msgstr "Distance faible"
 
 #: hacks/config/xmountains.xml.h:14
 msgid "Foreground"
 
 #: hacks/config/xmountains.xml.h:14
 msgid "Foreground"
@@ -8076,11 +8193,11 @@ msgstr "Options fractales"
 
 #: hacks/config/xmountains.xml.h:16
 msgid "Height  Low"
 
 #: hacks/config/xmountains.xml.h:16
 msgid "Height  Low"
-msgstr ""
+msgstr "Hauteur faible"
 
 #: hacks/config/xmountains.xml.h:18
 msgid "Horizontal  Low"
 
 #: hacks/config/xmountains.xml.h:18
 msgid "Horizontal  Low"
-msgstr ""
+msgstr "Horizontale faible"
 
 #: hacks/config/xmountains.xml.h:19
 msgid "Iteration  0"
 
 #: hacks/config/xmountains.xml.h:19
 msgid "Iteration  0"
@@ -8100,7 +8217,7 @@ msgstr "R
 
 #: hacks/config/xmountains.xml.h:23
 msgid "Sea Level  Low"
 
 #: hacks/config/xmountains.xml.h:23
 msgid "Sea Level  Low"
-msgstr ""
+msgstr "Niveau de la mer bas"
 
 #: hacks/config/xmountains.xml.h:24
 msgid "Side View"
 
 #: hacks/config/xmountains.xml.h:24
 msgid "Side View"
@@ -8124,19 +8241,19 @@ msgstr "Vue plongeante"
 
 #: hacks/config/xmountains.xml.h:30
 msgid "V. Shift  Low"
 
 #: hacks/config/xmountains.xml.h:30
 msgid "V. Shift  Low"
-msgstr ""
+msgstr "Décalage vert. faible"
 
 #: hacks/config/xmountains.xml.h:31
 msgid "V. Stretch  Low"
 
 #: hacks/config/xmountains.xml.h:31
 msgid "V. Stretch  Low"
-msgstr ""
+msgstr "Etirement vert. faible"
 
 #: hacks/config/xmountains.xml.h:32
 msgid "Variance  Low"
 
 #: hacks/config/xmountains.xml.h:32
 msgid "Variance  Low"
-msgstr ""
+msgstr "Variance faible"
 
 #: hacks/config/xmountains.xml.h:33
 msgid "Vertical  Low"
 
 #: hacks/config/xmountains.xml.h:33
 msgid "Vertical  Low"
-msgstr ""
+msgstr "Verticale faible"
 
 #: hacks/config/xmountains.xml.h:34
 msgid "Viewpoint"
 
 #: hacks/config/xmountains.xml.h:34
 msgid "Viewpoint"
index d4e8e6e2b98db4a2c8593d9a5aacda55b467fd7b..ea75627edfd51086b81e3b99c9cee3390ae9a2aa 100644 (file)
--- a/po/hu.po
+++ b/po/hu.po
@@ -6,7 +6,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: control-center VERSION\n"
 "Report-Msgid-Bugs-To: \n"
 msgstr ""
 "Project-Id-Version: control-center VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2004-10-04 16:25+0200\n"
+"POT-Creation-Date: 2004-12-22 12:51+0100\n"
 "PO-Revision-Date: 2002-08-23 22:31+0200\n"
 "Last-Translator: Emese Kovacs <emese@gnome.hu>\n"
 "Language-Team: Hungarian <hu@gnome.hu>\n"
 "PO-Revision-Date: 2002-08-23 22:31+0200\n"
 "Last-Translator: Emese Kovacs <emese@gnome.hu>\n"
 "Language-Team: Hungarian <hu@gnome.hu>\n"
@@ -150,7 +150,7 @@ msgstr ""
 msgid "minutes"
 msgstr " perc inaktivitás után."
 
 msgid "minutes"
 msgstr " perc inaktivitás után."
 
-#: driver/demo-Gtk-widgets.c:482 driver/demo-Gtk.c:2845
+#: driver/demo-Gtk-widgets.c:482 driver/demo-Gtk.c:2852
 #: driver/xscreensaver-demo.glade.h:58
 msgid "Preview"
 msgstr "Elõnézet"
 #: driver/xscreensaver-demo.glade.h:58
 msgid "Preview"
 msgstr "Elõnézet"
@@ -196,12 +196,12 @@ msgstr "K
 msgid "Random Screen Saver"
 msgstr "Véletlenszerû képernyõvédõ"
 
 msgid "Random Screen Saver"
 msgstr "Véletlenszerû képernyõvédõ"
 
-#: driver/demo-Gtk-widgets.c:571 driver/demo-Gtk.c:2134
+#: driver/demo-Gtk-widgets.c:571 driver/demo-Gtk.c:2141
 #: driver/xscreensaver-demo.glade.h:75
 msgid "Use"
 msgstr "Használat"
 
 #: driver/xscreensaver-demo.glade.h:75
 msgid "Use"
 msgstr "Használat"
 
-#: driver/demo-Gtk-widgets.c:591 driver/demo-Gtk.c:2144
+#: driver/demo-Gtk-widgets.c:591 driver/demo-Gtk.c:2151
 #: driver/xscreensaver-demo.glade.h:63
 msgid "Screen Saver"
 msgstr "Képernyõvédõ"
 #: driver/xscreensaver-demo.glade.h:63
 msgid "Screen Saver"
 msgstr "Képernyõvédõ"
@@ -442,7 +442,7 @@ msgid "Visual:"
 msgstr ""
 
 #: driver/demo-Gtk-widgets.c:1550 driver/demo-Gtk-widgets.c:1573
 msgstr ""
 
 #: driver/demo-Gtk-widgets.c:1550 driver/demo-Gtk-widgets.c:1573
-#: driver/demo-Gtk.c:1538 driver/demo-Gtk.c:2864
+#: driver/demo-Gtk.c:1545 driver/demo-Gtk.c:2871
 #: driver/xscreensaver-demo.glade.h:5 driver/xscreensaver-demo.glade2.h:3
 #, fuzzy
 msgid "Any"
 #: driver/xscreensaver-demo.glade.h:5 driver/xscreensaver-demo.glade2.h:3
 #, fuzzy
 msgid "Any"
@@ -553,7 +553,7 @@ msgstr ""
 msgid "Back to the graphical configuration options."
 msgstr ""
 
 msgid "Back to the graphical configuration options."
 msgstr ""
 
-#: driver/demo-Gtk-widgets.c:1709 driver/demo-Gtk.c:741
+#: driver/demo-Gtk-widgets.c:1709 driver/demo-Gtk.c:748
 #: driver/xscreensaver-demo.glade.h:54
 msgid "OK"
 msgstr "OK"
 #: driver/xscreensaver-demo.glade.h:54
 msgid "OK"
 msgstr "OK"
@@ -562,18 +562,18 @@ msgstr "OK"
 msgid "Cancel"
 msgstr ""
 
 msgid "Cancel"
 msgstr ""
 
-#: driver/demo-Gtk.c:649
+#: driver/demo-Gtk.c:656
 msgid "For updates, check http://www.jwz.org/xscreensaver/"
 msgstr ""
 
 msgid "For updates, check http://www.jwz.org/xscreensaver/"
 msgstr ""
 
-#: driver/demo-Gtk.c:779
+#: driver/demo-Gtk.c:786
 msgid ""
 "Error:\n"
 "\n"
 "No Help URL has been specified.\n"
 msgstr ""
 
 msgid ""
 "Error:\n"
 "\n"
 "No Help URL has been specified.\n"
 msgstr ""
 
-#: driver/demo-Gtk.c:865
+#: driver/demo-Gtk.c:872
 msgid ""
 "Error:\n"
 "\n"
 msgid ""
 "Error:\n"
 "\n"
@@ -581,7 +581,7 @@ msgid ""
 "\n"
 msgstr ""
 
 "\n"
 msgstr ""
 
-#: driver/demo-Gtk.c:877
+#: driver/demo-Gtk.c:884
 msgid ""
 "You are running as root.  This usually means that xscreensaver\n"
 "was unable to contact your X server because access control is\n"
 msgid ""
 "You are running as root.  This usually means that xscreensaver\n"
 "was unable to contact your X server because access control is\n"
@@ -600,18 +600,18 @@ msgid ""
 "normal user, and `su' as necessary."
 msgstr ""
 
 "normal user, and `su' as necessary."
 msgstr ""
 
-#: driver/demo-Gtk.c:893
+#: driver/demo-Gtk.c:900
 msgid "Please check your $PATH and permissions."
 msgstr ""
 
 msgid "Please check your $PATH and permissions."
 msgstr ""
 
-#: driver/demo-Gtk.c:928
+#: driver/demo-Gtk.c:935
 msgid ""
 "Error:\n"
 "\n"
 "Couldn't determine init file name!\n"
 msgstr ""
 
 msgid ""
 "Error:\n"
 "\n"
 "Couldn't determine init file name!\n"
 msgstr ""
 
-#: driver/demo-Gtk.c:933
+#: driver/demo-Gtk.c:940
 #, c-format
 msgid ""
 "Error:\n"
 #, c-format
 msgid ""
 "Error:\n"
@@ -619,14 +619,14 @@ msgid ""
 "Couldn't write %s\n"
 msgstr ""
 
 "Couldn't write %s\n"
 msgstr ""
 
-#: driver/demo-Gtk.c:992
+#: driver/demo-Gtk.c:999
 msgid ""
 "Error:\n"
 "\n"
 "no `manualCommand' resource set."
 msgstr ""
 
 msgid ""
 "Error:\n"
 "\n"
 "no `manualCommand' resource set."
 msgstr ""
 
-#: driver/demo-Gtk.c:1173
+#: driver/demo-Gtk.c:1180
 #, c-format
 msgid ""
 "Error:\n"
 #, c-format
 msgid ""
 "Error:\n"
@@ -634,7 +634,7 @@ msgid ""
 "Unparsable time format: \"%s\"\n"
 msgstr ""
 
 "Unparsable time format: \"%s\"\n"
 msgstr ""
 
-#: driver/demo-Gtk.c:1829
+#: driver/demo-Gtk.c:1836
 #, fuzzy, c-format
 msgid ""
 "Error:\n"
 #, fuzzy, c-format
 msgid ""
 "Error:\n"
@@ -642,29 +642,29 @@ msgid ""
 "Directory does not exist: \"%s\"\n"
 msgstr "A saját könyvtár nem létezik!\n"
 
 "Directory does not exist: \"%s\"\n"
 msgstr "A saját könyvtár nem létezik!\n"
 
-#: driver/demo-Gtk.c:2546
+#: driver/demo-Gtk.c:2553
 msgid "Descriptions not available: no XML support compiled in."
 msgstr ""
 
 msgid "Descriptions not available: no XML support compiled in."
 msgstr ""
 
-#: driver/demo-Gtk.c:2551
+#: driver/demo-Gtk.c:2558
 msgid "No description available."
 msgstr ""
 
 msgid "No description available."
 msgstr ""
 
-#: driver/demo-Gtk.c:2816
+#: driver/demo-Gtk.c:2823
 msgid "Blank Screen"
 msgstr ""
 
 msgid "Blank Screen"
 msgstr ""
 
-#: driver/demo-Gtk.c:2822
+#: driver/demo-Gtk.c:2829
 #, fuzzy
 msgid "Screen Saver Disabled"
 msgstr "Képernyõvédõ bemutató"
 
 #, fuzzy
 msgid "Screen Saver Disabled"
 msgstr "Képernyõvédõ bemutató"
 
-#: driver/demo-Gtk.c:2855
+#: driver/demo-Gtk.c:2862
 #, c-format
 msgid "%s: %.100s Settings"
 msgstr ""
 
 #, c-format
 msgid "%s: %.100s Settings"
 msgstr ""
 
-#: driver/demo-Gtk.c:3010
+#: driver/demo-Gtk.c:3017
 #, c-format
 msgid ""
 "Warning:\n"
 #, c-format
 msgid ""
 "Warning:\n"
@@ -672,25 +672,25 @@ msgid ""
 "file \"%s\" has changed, reloading.\n"
 msgstr ""
 
 "file \"%s\" has changed, reloading.\n"
 msgstr ""
 
-#: driver/demo-Gtk.c:3092
+#: driver/demo-Gtk.c:3099
 #, fuzzy
 msgid "No Preview"
 msgstr "Elõnézet"
 
 #, fuzzy
 msgid "No Preview"
 msgstr "Elõnézet"
 
-#: driver/demo-Gtk.c:3092
+#: driver/demo-Gtk.c:3099
 #, fuzzy
 msgid "Available"
 msgstr "Rendelkezésre álló témák"
 
 #, fuzzy
 msgid "Available"
 msgstr "Rendelkezésre álló témák"
 
-#: driver/demo-Gtk.c:3093
+#: driver/demo-Gtk.c:3100
 msgid "Not"
 msgstr ""
 
 msgid "Not"
 msgstr ""
 
-#: driver/demo-Gtk.c:3093
+#: driver/demo-Gtk.c:3100
 msgid "Installed"
 msgstr ""
 
 msgid "Installed"
 msgstr ""
 
-#: driver/demo-Gtk.c:3858
+#: driver/demo-Gtk.c:3865
 #, c-format
 msgid ""
 "Warning:\n"
 #, c-format
 msgid ""
 "Warning:\n"
@@ -699,7 +699,7 @@ msgid ""
 "on display \"%s\".  Launch it now?"
 msgstr ""
 
 "on display \"%s\".  Launch it now?"
 msgstr ""
 
-#: driver/demo-Gtk.c:3868
+#: driver/demo-Gtk.c:3875
 #, c-format
 msgid ""
 "Warning:\n"
 #, c-format
 msgid ""
 "Warning:\n"
@@ -718,7 +718,7 @@ msgid ""
 "Restart the xscreensaver daemon now?\n"
 msgstr ""
 
 "Restart the xscreensaver daemon now?\n"
 msgstr ""
 
-#: driver/demo-Gtk.c:3893
+#: driver/demo-Gtk.c:3900
 #, c-format
 msgid ""
 "Warning:\n"
 #, c-format
 msgid ""
 "Warning:\n"
@@ -734,7 +734,7 @@ msgid ""
 "Restart the daemon on \"%s\" as \"%s\" now?\n"
 msgstr ""
 
 "Restart the daemon on \"%s\" as \"%s\" now?\n"
 msgstr ""
 
-#: driver/demo-Gtk.c:3915
+#: driver/demo-Gtk.c:3922
 #, c-format
 msgid ""
 "Warning:\n"
 #, c-format
 msgid ""
 "Warning:\n"
@@ -746,12 +746,12 @@ msgid ""
 "Restart the xscreensaver daemon now?\n"
 msgstr ""
 
 "Restart the xscreensaver daemon now?\n"
 msgstr ""
 
-#: driver/demo-Gtk.c:4372
+#: driver/demo-Gtk.c:4379
 #, c-format
 msgid "%s: unknown option: %s\n"
 msgstr ""
 
 #, c-format
 msgid "%s: unknown option: %s\n"
 msgstr ""
 
-#: driver/demo-Gtk.c:4436
+#: driver/demo-Gtk.c:4443
 #, fuzzy
 msgid "Screensaver Preferences"
 msgstr "Képernyõvédõ"
 #, fuzzy
 msgid "Screensaver Preferences"
 msgstr "Képernyõvédõ"
@@ -982,22 +982,23 @@ msgstr ""
 #: 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/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:5 hacks/config/flyingtoasters.xml.h:5
-#: hacks/config/fontglide.xml.h:4 hacks/config/forest.xml.h:1
-#: hacks/config/fuzzyflakes.xml.h:7 hacks/config/galaxy.xml.h:3
-#: hacks/config/gears.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:6
-#: 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/fadeplot.xml.h:4 hacks/config/fireworkx.xml.h:3
+#: 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:2 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/fuzzyflakes.xml.h:7
+#: hacks/config/galaxy.xml.h:3 hacks/config/gears.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:6 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/intermomentary.xml.h:1 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/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
@@ -1015,23 +1016,24 @@ msgstr ""
 #: hacks/config/pacman.xml.h:1 hacks/config/penetrate.xml.h:3
 #: hacks/config/penrose.xml.h:6 hacks/config/petri.xml.h:5
 #: hacks/config/phosphor.xml.h:4 hacks/config/piecewise.xml.h:4
 #: hacks/config/pacman.xml.h:1 hacks/config/penetrate.xml.h:3
 #: hacks/config/penrose.xml.h:6 hacks/config/petri.xml.h:5
 #: hacks/config/phosphor.xml.h:4 hacks/config/piecewise.xml.h:4
-#: hacks/config/pipes.xml.h:5 hacks/config/polyhedra.xml.h:18
-#: hacks/config/polyominoes.xml.h:2 hacks/config/polytopes.xml.h:11
-#: hacks/config/pong.xml.h:1 hacks/config/popsquares.xml.h:3
-#: hacks/config/providence.xml.h:2 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 hacks/config/rocks.xml.h:4
-#: hacks/config/rotor.xml.h:3 hacks/config/rubik.xml.h:3
-#: hacks/config/sballs.xml.h:4 hacks/config/shadebobs.xml.h:3
-#: hacks/config/sierpinski.xml.h:2 hacks/config/sierpinski3d.xml.h:2
-#: hacks/config/slidescreen.xml.h:2 hacks/config/slip.xml.h:2
-#: hacks/config/speedmine.xml.h:3 hacks/config/sphere.xml.h:2
-#: hacks/config/spheremonics.xml.h:5 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:1 hacks/config/superquadrics.xml.h:4
+#: hacks/config/pinion.xml.h:5 hacks/config/pipes.xml.h:5
+#: hacks/config/polyhedra.xml.h:18 hacks/config/polyominoes.xml.h:2
+#: hacks/config/polytopes.xml.h:11 hacks/config/pong.xml.h:1
+#: hacks/config/popsquares.xml.h:3 hacks/config/providence.xml.h:2
+#: 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
+#: hacks/config/rocks.xml.h:4 hacks/config/rotor.xml.h:3
+#: hacks/config/rubik.xml.h:3 hacks/config/sballs.xml.h:4
+#: hacks/config/shadebobs.xml.h:3 hacks/config/sierpinski.xml.h:2
+#: hacks/config/sierpinski3d.xml.h:2 hacks/config/slidescreen.xml.h:2
+#: hacks/config/slip.xml.h:2 hacks/config/speedmine.xml.h:3
+#: hacks/config/sphere.xml.h:2 hacks/config/spheremonics.xml.h:5
+#: 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:1
+#: hacks/config/substrate.xml.h:2 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/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
@@ -1053,8 +1055,9 @@ msgstr "Gyors"
 #: hacks/config/fuzzyflakes.xml.h:8 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/fuzzyflakes.xml.h:8 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/wormhole.xml.h:3 hacks/config/xfishtank.xml.h:4
+#: hacks/config/substrate.xml.h:3 hacks/config/thornbird.xml.h:3
+#: hacks/config/whirlwindwarp.xml.h:1 hacks/config/wormhole.xml.h:3
+#: hacks/config/xfishtank.xml.h:4
 msgid "Few"
 msgstr ""
 
 msgid "Few"
 msgstr ""
 
@@ -1070,7 +1073,7 @@ msgstr ""
 #: hacks/config/epicycle.xml.h:8 hacks/config/eruption.xml.h:12
 #: hacks/config/euler2d.xml.h:8 hacks/config/fadeplot.xml.h:6
 #: hacks/config/flag.xml.h:5 hacks/config/flame.xml.h:11
 #: hacks/config/epicycle.xml.h:8 hacks/config/eruption.xml.h:12
 #: hacks/config/euler2d.xml.h:8 hacks/config/fadeplot.xml.h:6
 #: hacks/config/flag.xml.h:5 hacks/config/flame.xml.h:11
-#: hacks/config/flow.xml.h:8 hacks/config/fluidballs.xml.h:13
+#: hacks/config/flow.xml.h:7 hacks/config/fluidballs.xml.h:13
 #: hacks/config/forest.xml.h:3 hacks/config/fuzzyflakes.xml.h:12
 #: 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/forest.xml.h:3 hacks/config/fuzzyflakes.xml.h:12
 #: hacks/config/galaxy.xml.h:6 hacks/config/grav.xml.h:4
 #: hacks/config/halo.xml.h:4 hacks/config/hopalong.xml.h:15
@@ -1108,7 +1111,7 @@ msgstr ""
 #: 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/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/flow.xml.h:8 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/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
@@ -1162,22 +1165,23 @@ msgstr ""
 #: 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/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/flyingtoasters.xml.h:11
-#: hacks/config/fontglide.xml.h:13 hacks/config/forest.xml.h:5
-#: hacks/config/fuzzyflakes.xml.h:15 hacks/config/galaxy.xml.h:10
-#: hacks/config/gears.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:8 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:10 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/fadeplot.xml.h:8 hacks/config/fireworkx.xml.h:9
+#: 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:10 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/fuzzyflakes.xml.h:15
+#: hacks/config/galaxy.xml.h:11 hacks/config/gears.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:8
+#: 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:10
+#: 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/intermomentary.xml.h:4 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/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
@@ -1195,23 +1199,24 @@ msgstr ""
 #: hacks/config/pacman.xml.h:5 hacks/config/penetrate.xml.h:6
 #: hacks/config/penrose.xml.h:11 hacks/config/petri.xml.h:23
 #: hacks/config/phosphor.xml.h:7 hacks/config/piecewise.xml.h:9
 #: hacks/config/pacman.xml.h:5 hacks/config/penetrate.xml.h:6
 #: hacks/config/penrose.xml.h:11 hacks/config/petri.xml.h:23
 #: hacks/config/phosphor.xml.h:7 hacks/config/piecewise.xml.h:9
-#: hacks/config/pipes.xml.h:15 hacks/config/polyhedra.xml.h:119
-#: hacks/config/polyominoes.xml.h:10 hacks/config/polytopes.xml.h:20
-#: hacks/config/pong.xml.h:4 hacks/config/popsquares.xml.h:5
-#: hacks/config/providence.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 hacks/config/rocks.xml.h:9
-#: hacks/config/rotor.xml.h:11 hacks/config/rubik.xml.h:9
-#: hacks/config/sballs.xml.h:13 hacks/config/shadebobs.xml.h:9
-#: hacks/config/sierpinski.xml.h:7 hacks/config/sierpinski3d.xml.h:8
-#: hacks/config/slidescreen.xml.h:6 hacks/config/slip.xml.h:7
-#: hacks/config/speedmine.xml.h:13 hacks/config/sphere.xml.h:5
-#: hacks/config/spheremonics.xml.h:19 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:4 hacks/config/superquadrics.xml.h:8
+#: hacks/config/pinion.xml.h:13 hacks/config/pipes.xml.h:15
+#: hacks/config/polyhedra.xml.h:119 hacks/config/polyominoes.xml.h:10
+#: hacks/config/polytopes.xml.h:20 hacks/config/pong.xml.h:4
+#: hacks/config/popsquares.xml.h:5 hacks/config/providence.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
+#: hacks/config/rocks.xml.h:9 hacks/config/rotor.xml.h:11
+#: hacks/config/rubik.xml.h:9 hacks/config/sballs.xml.h:13
+#: hacks/config/shadebobs.xml.h:9 hacks/config/sierpinski.xml.h:7
+#: hacks/config/sierpinski3d.xml.h:8 hacks/config/slidescreen.xml.h:6
+#: hacks/config/slip.xml.h:7 hacks/config/speedmine.xml.h:13
+#: hacks/config/sphere.xml.h:5 hacks/config/spheremonics.xml.h:19
+#: 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:4
+#: hacks/config/substrate.xml.h:10 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/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
@@ -1244,17 +1249,18 @@ msgstr "Lass
 #: hacks/config/engine.xml.h:16 hacks/config/epicycle.xml.h:11
 #: 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/engine.xml.h:16 hacks/config/epicycle.xml.h:11
 #: 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/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/fuzzyflakes.xml.h:17
-#: hacks/config/galaxy.xml.h:11 hacks/config/glblur.xml.h:17
-#: hacks/config/glforestfire.xml.h:15 hacks/config/glplanet.xml.h:10
-#: 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:11 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/fireworkx.xml.h:11 hacks/config/flag.xml.h:9
+#: hacks/config/flame.xml.h:15 hacks/config/flipflop.xml.h:7
+#: hacks/config/flipscreen3d.xml.h:7 hacks/config/flow.xml.h:12
+#: hacks/config/fluidballs.xml.h:20 hacks/config/forest.xml.h:6
+#: hacks/config/fuzzyflakes.xml.h:17 hacks/config/galaxy.xml.h:12
+#: hacks/config/glblur.xml.h:17 hacks/config/glforestfire.xml.h:15
+#: hacks/config/glplanet.xml.h:10 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:11
+#: 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/intermomentary.xml.h:5 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/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
@@ -1283,16 +1289,16 @@ msgstr "Lass
 #: 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/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/xplanet.xml.h:60 hacks/config/xrayswarm.xml.h:4
-#: hacks/config/zoom.xml.h:7
+#: hacks/config/strange.xml.h:5 hacks/config/substrate.xml.h:11
+#: 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/xplanet.xml.h:60
+#: hacks/config/xrayswarm.xml.h:4 hacks/config/zoom.xml.h:7
 msgid "Speed"
 msgstr "Sebesség"
 
 msgid "Speed"
 msgstr "Sebesség"
 
@@ -1337,8 +1343,8 @@ msgstr ""
 #: hacks/config/discrete.xml.h:11 hacks/config/drift.xml.h:14
 #: hacks/config/epicycle.xml.h:13 hacks/config/euler2d.xml.h:17
 #: hacks/config/fadeplot.xml.h:12 hacks/config/flag.xml.h:13
 #: hacks/config/discrete.xml.h:11 hacks/config/drift.xml.h:14
 #: hacks/config/epicycle.xml.h:13 hacks/config/euler2d.xml.h:17
 #: hacks/config/fadeplot.xml.h:12 hacks/config/flag.xml.h:13
-#: hacks/config/flame.xml.h:16 hacks/config/flow.xml.h:18
-#: hacks/config/forest.xml.h:8 hacks/config/galaxy.xml.h:13
+#: hacks/config/flame.xml.h:16 hacks/config/flow.xml.h:15
+#: hacks/config/forest.xml.h:8 hacks/config/galaxy.xml.h:14
 #: hacks/config/grav.xml.h:11 hacks/config/halo.xml.h:13
 #: hacks/config/hopalong.xml.h:25 hacks/config/ifs.xml.h:8
 #: hacks/config/imsmap.xml.h:15 hacks/config/interference.xml.h:19
 #: hacks/config/grav.xml.h:11 hacks/config/halo.xml.h:13
 #: hacks/config/hopalong.xml.h:25 hacks/config/ifs.xml.h:8
 #: hacks/config/imsmap.xml.h:15 hacks/config/interference.xml.h:19
@@ -1441,7 +1447,7 @@ msgstr "N
 #: 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/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/flag.xml.h:4 hacks/config/flow.xml.h:4
 #: hacks/config/fluidballs.xml.h:12 hacks/config/fuzzyflakes.xml.h:10
 #: 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/fluidballs.xml.h:12 hacks/config/fuzzyflakes.xml.h:10
 #: hacks/config/gleidescope.xml.h:7 hacks/config/halftone.xml.h:8
 #: hacks/config/hopalong.xml.h:13 hacks/config/interference.xml.h:11
@@ -1473,7 +1479,7 @@ msgstr "Hatoldal
 #: 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/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/flag.xml.h:8 hacks/config/flow.xml.h:11
 #: hacks/config/fluidballs.xml.h:19 hacks/config/fuzzyflakes.xml.h:16
 #: 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/fluidballs.xml.h:19 hacks/config/fuzzyflakes.xml.h:16
 #: hacks/config/gleidescope.xml.h:12 hacks/config/halftone.xml.h:14
 #: hacks/config/hopalong.xml.h:22 hacks/config/interference.xml.h:18
@@ -1492,7 +1498,7 @@ msgstr "H
 
 #: 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/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/flag.xml.h:12 hacks/config/flow.xml.h:14
 #: hacks/config/lissie.xml.h:12 hacks/config/loop.xml.h:11
 #: hacks/config/rubik.xml.h:12 hacks/config/sierpinski.xml.h:11
 #: hacks/config/slip.xml.h:11
 #: hacks/config/lissie.xml.h:12 hacks/config/loop.xml.h:11
 #: hacks/config/rubik.xml.h:12 hacks/config/sierpinski.xml.h:11
 #: hacks/config/slip.xml.h:11
@@ -1543,13 +1549,14 @@ msgstr ""
 #: hacks/config/menger.xml.h:15 hacks/config/mirrorblob.xml.h:18
 #: hacks/config/moebius.xml.h:6 hacks/config/molecule.xml.h:21
 #: hacks/config/morph3d.xml.h:5 hacks/config/noof.xml.h:4
 #: hacks/config/menger.xml.h:15 hacks/config/mirrorblob.xml.h:18
 #: hacks/config/moebius.xml.h:6 hacks/config/molecule.xml.h:21
 #: hacks/config/morph3d.xml.h:5 hacks/config/noof.xml.h:4
-#: hacks/config/pipes.xml.h:14 hacks/config/polyhedra.xml.h:118
-#: hacks/config/polytopes.xml.h:18 hacks/config/providence.xml.h:4
-#: 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
+#: hacks/config/pinion.xml.h:12 hacks/config/pipes.xml.h:14
+#: hacks/config/polyhedra.xml.h:118 hacks/config/polytopes.xml.h:18
+#: hacks/config/providence.xml.h:4 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 ""
 
 msgid "Show Frames-per-Second"
 msgstr ""
 
@@ -1713,11 +1720,12 @@ msgstr "Sebess
 #: hacks/config/lament.xml.h:9 hacks/config/lavalite.xml.h:32
 #: hacks/config/menger.xml.h:21 hacks/config/mirrorblob.xml.h:24
 #: hacks/config/moebius.xml.h:11 hacks/config/molecule.xml.h:26
 #: hacks/config/lament.xml.h:9 hacks/config/lavalite.xml.h:32
 #: hacks/config/menger.xml.h:21 hacks/config/mirrorblob.xml.h:24
 #: hacks/config/moebius.xml.h:11 hacks/config/molecule.xml.h:26
-#: hacks/config/polyhedra.xml.h:173 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
+#: hacks/config/pinion.xml.h:15 hacks/config/polyhedra.xml.h:173
+#: 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 ""
 
 msgid "Wireframe"
 msgstr ""
 
@@ -1807,14 +1815,15 @@ msgstr "Kevesebb"
 #: 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/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/mismunch.xml.h:3
-#: 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 hacks/config/spheremonics.xml.h:7
+#: hacks/config/flow.xml.h:6 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/mismunch.xml.h:3 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
+#: hacks/config/spheremonics.xml.h:7 hacks/config/substrate.xml.h:6
 #: hacks/config/wander.xml.h:10 hacks/config/whirlwindwarp.xml.h:3
 #, fuzzy
 msgid "Long"
 #: hacks/config/wander.xml.h:10 hacks/config/whirlwindwarp.xml.h:3
 #, fuzzy
 msgid "Long"
@@ -1863,13 +1872,14 @@ msgstr "Ut
 #: 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/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/metaballs.xml.h:12 hacks/config/mismunch.xml.h:8
-#: 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/flow.xml.h:9 hacks/config/galaxy.xml.h:9
+#: hacks/config/klein.xml.h:5 hacks/config/laser.xml.h:9
+#: hacks/config/menger.xml.h:14 hacks/config/metaballs.xml.h:12
+#: hacks/config/mismunch.xml.h:8 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/substrate.xml.h:9
 #: hacks/config/wander.xml.h:12 hacks/config/whirlwindwarp.xml.h:6
 #, fuzzy
 msgid "Short"
 #: hacks/config/wander.xml.h:12 hacks/config/whirlwindwarp.xml.h:6
 #, fuzzy
 msgid "Short"
@@ -2082,10 +2092,10 @@ msgstr ""
 #: 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/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/polyhedra.xml.h:3 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/wormhole.xml.h:1
-#: hacks/config/xfishtank.xml.h:1
+#: hacks/config/pinion.xml.h:3 hacks/config/polyhedra.xml.h:3
+#: 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/wormhole.xml.h:1 hacks/config/xfishtank.xml.h:1
 msgid "Animation Speed"
 msgstr ""
 
 msgid "Animation Speed"
 msgstr ""
 
@@ -2165,8 +2175,9 @@ msgstr ""
 #: 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/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/starfish.xml.h:2 hacks/config/substrate.xml.h:1
+#: hacks/config/vidwhacker.xml.h:3 hacks/config/wander.xml.h:7
+#: hacks/config/xspirograph.xml.h:3
 msgid "Duration"
 msgstr "Idõtartam"
 
 msgid "Duration"
 msgstr "Idõtartam"
 
@@ -2429,7 +2440,7 @@ msgstr ""
 msgid "Rotate"
 msgstr "Gyorsasság"
 
 msgid "Rotate"
 msgstr "Gyorsasság"
 
-#: hacks/config/circuit.xml.h:8
+#: hacks/config/circuit.xml.h:8 hacks/config/pinion.xml.h:10
 #, fuzzy
 msgid "Rotation Speed"
 msgstr "Gyorsasság"
 #, fuzzy
 msgid "Rotation Speed"
 msgstr "Gyorsasság"
@@ -2519,11 +2530,12 @@ msgstr "M
 msgid "Coral"
 msgstr "Coral"
 
 msgid "Coral"
 msgstr "Coral"
 
-#: hacks/config/coral.xml.h:4 hacks/config/gflux.xml.h:3
-#: hacks/config/glblur.xml.h:2 hacks/config/glmatrix.xml.h:3
-#: 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
+#: hacks/config/coral.xml.h:4 hacks/config/fireworkx.xml.h:2
+#: hacks/config/gflux.xml.h:3 hacks/config/glblur.xml.h:2
+#: hacks/config/glmatrix.xml.h:3 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 "Sûrûbb"
 #, fuzzy
 msgid "Dense"
 msgstr "Sûrûbb"
@@ -2538,12 +2550,12 @@ msgid ""
 "Simulates coral growth, albeit somewhat slowly. Written by Frederick Roeber."
 msgstr ""
 
 "Simulates coral growth, albeit somewhat slowly. Written by Frederick Roeber."
 msgstr ""
 
-#: hacks/config/coral.xml.h:13 hacks/config/gflux.xml.h:13
-#: hacks/config/glblur.xml.h:16 hacks/config/glmatrix.xml.h:19
-#: hacks/config/imsmap.xml.h:13 hacks/config/lavalite.xml.h:29
-#: hacks/config/pyro.xml.h:14 hacks/config/qix.xml.h:21
-#: hacks/config/squiral.xml.h:15 hacks/config/xearth.xml.h:24
-#: hacks/config/xmatrix.xml.h:17
+#: hacks/config/coral.xml.h:13 hacks/config/fireworkx.xml.h:10
+#: hacks/config/gflux.xml.h:13 hacks/config/glblur.xml.h:16
+#: hacks/config/glmatrix.xml.h:19 hacks/config/imsmap.xml.h:13
+#: hacks/config/lavalite.xml.h:29 hacks/config/pyro.xml.h:14
+#: hacks/config/qix.xml.h:21 hacks/config/squiral.xml.h:15
+#: hacks/config/xearth.xml.h:24 hacks/config/xmatrix.xml.h:17
 #, fuzzy
 msgid "Sparse"
 msgstr "Sphere"
 #, fuzzy
 msgid "Sparse"
 msgstr "Sphere"
@@ -2575,7 +2587,7 @@ msgid "Center on Screen"
 msgstr "A képernyõ közepére"
 
 #: hacks/config/crystal.xml.h:2 hacks/config/deluxe.xml.h:1
 msgstr "A képernyõ közepére"
 
 #: hacks/config/crystal.xml.h:2 hacks/config/deluxe.xml.h:1
-#: hacks/config/fadeplot.xml.h:1 hacks/config/flow.xml.h:3
+#: hacks/config/fadeplot.xml.h:1 hacks/config/flow.xml.h:1
 #: hacks/config/galaxy.xml.h:1 hacks/config/glforestfire.xml.h:1
 #: hacks/config/grav.xml.h:1 hacks/config/julia.xml.h:1
 #: hacks/config/laser.xml.h:1 hacks/config/lisa.xml.h:1
 #: hacks/config/galaxy.xml.h:1 hacks/config/glforestfire.xml.h:1
 #: hacks/config/grav.xml.h:1 hacks/config/julia.xml.h:1
 #: hacks/config/laser.xml.h:1 hacks/config/lisa.xml.h:1
@@ -3365,7 +3377,7 @@ msgstr ""
 msgid "Half"
 msgstr "Halo"
 
 msgid "Half"
 msgstr "Halo"
 
-#: hacks/config/fireflies.xml.h:17
+#: hacks/config/fireflies.xml.h:17 hacks/config/pinion.xml.h:7
 #, fuzzy
 msgid "Huge"
 msgstr "Felhasználói betûkészlet"
 #, fuzzy
 msgid "Huge"
 msgstr "Felhasználói betûkészlet"
@@ -3461,7 +3473,7 @@ msgstr ""
 msgid "Swarm tails glow"
 msgstr ""
 
 msgid "Swarm tails glow"
 msgstr ""
 
-#: hacks/config/fireflies.xml.h:43
+#: hacks/config/fireflies.xml.h:43 hacks/config/pinion.xml.h:14
 #, fuzzy
 msgid "Tiny"
 msgstr "Ritkább"
 #, fuzzy
 msgid "Tiny"
 msgstr "Ritkább"
@@ -3479,6 +3491,33 @@ msgstr ""
 msgid "Wind picks up"
 msgstr ""
 
 msgid "Wind picks up"
 msgstr ""
 
+#: hacks/config/fireworkx.xml.h:1 hacks/config/lavalite.xml.h:3
+msgid "Activity"
+msgstr ""
+
+#: hacks/config/fireworkx.xml.h:4
+msgid "Fast Fade (more realistic)"
+msgstr ""
+
+#: hacks/config/fireworkx.xml.h:5
+#, fuzzy
+msgid "Fireworkx"
+msgstr "_Fájl"
+
+#: hacks/config/fireworkx.xml.h:6
+#, fuzzy
+msgid "Light effect"
+msgstr "Lightning"
+
+#: hacks/config/fireworkx.xml.h:7
+msgid "Pyrotechnics simulation eye-candy. Written by Rony B. Chandran."
+msgstr ""
+
+#: hacks/config/fireworkx.xml.h:8
+#, fuzzy
+msgid "Shoot"
+msgstr "Rövidebb"
+
 #: hacks/config/flag.xml.h:1
 msgid "Bitmap for Flag"
 msgstr ""
 #: hacks/config/flag.xml.h:1
 msgid "Bitmap for Flag"
 msgstr ""
@@ -3558,42 +3597,42 @@ msgid ""
 "around and deforms it in various ways. Written by Ben Buxton."
 msgstr ""
 
 "around and deforms it in various ways. Written by Ben Buxton."
 msgstr ""
 
-#: hacks/config/flow.xml.h:1
-msgid "Allow 2D Attractors"
+#: hacks/config/flow.xml.h:3
+msgid "Flow"
+msgstr "Flow"
+
+#: hacks/config/flow.xml.h:5
+msgid "Length of trails"
 msgstr ""
 
 msgstr ""
 
-#: hacks/config/flow.xml.h:2
+#: hacks/config/flow.xml.h:13
 msgid ""
 msgid ""
-"Another series of strange attractors: a flowing series of points, making "
-"strange rotational shapes. Written by Tim Auckland."
+"Strange attractors formed of flows in a 3D differential equation phase "
+"space. Written by Tim Auckland."
 msgstr ""
 
 msgstr ""
 
-#: hacks/config/flow.xml.h:5
-msgid "Flow"
-msgstr "Flow"
-
-#: hacks/config/flow.xml.h:6
-msgid "Freeze Some Bees"
+#: hacks/config/flow.xml.h:16
+msgid "turn on/off bounding box."
 msgstr ""
 
 msgstr ""
 
-#: hacks/config/flow.xml.h:10
-msgid "Ride a Trained Bee"
+#: hacks/config/flow.xml.h:17
+msgid "turn on/off double buffering."
 msgstr ""
 
 msgstr ""
 
-#: hacks/config/flow.xml.h:11
-msgid "Rotate Around Attractor"
+#: hacks/config/flow.xml.h:18
+msgid "turn on/off periodic attractors."
 msgstr ""
 
 msgstr ""
 
-#: hacks/config/flow.xml.h:12
-msgid "Show Bounding Box"
+#: hacks/config/flow.xml.h:19
+msgid "turn on/off ride in the flow."
 msgstr ""
 
 msgstr ""
 
-#: hacks/config/flow.xml.h:14
-msgid "Slow Bees with Antifreeze"
+#: hacks/config/flow.xml.h:20
+msgid "turn on/off rotating around attractor."
 msgstr ""
 
 msgstr ""
 
-#: hacks/config/flow.xml.h:19
-msgid "Zoom In and Out"
+#: hacks/config/flow.xml.h:21
+msgid "turn on/off search for new attractors."
 msgstr ""
 
 #: hacks/config/fluidballs.xml.h:1
 msgstr ""
 
 #: hacks/config/fluidballs.xml.h:1
@@ -3816,7 +3855,12 @@ msgstr "V
 msgid "Galaxy"
 msgstr "Galaxy"
 
 msgid "Galaxy"
 msgstr "Galaxy"
 
-#: hacks/config/galaxy.xml.h:9 hacks/config/lisa.xml.h:7
+#: hacks/config/galaxy.xml.h:8
+#, fuzzy
+msgid "Rotate Viewpoint"
+msgstr "Gyorsasság"
+
+#: hacks/config/galaxy.xml.h:10 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/pong.xml.h:3
 #: hacks/config/rotor.xml.h:10 hacks/config/rubik.xml.h:8
 #: hacks/config/lissie.xml.h:8 hacks/config/loop.xml.h:6
 #: hacks/config/penrose.xml.h:10 hacks/config/pong.xml.h:3
 #: hacks/config/rotor.xml.h:10 hacks/config/rubik.xml.h:8
@@ -3825,7 +3869,7 @@ msgstr "Galaxy"
 msgid "Size"
 msgstr "Méret"
 
 msgid "Size"
 msgstr "Méret"
 
-#: hacks/config/galaxy.xml.h:12
+#: hacks/config/galaxy.xml.h:13
 msgid ""
 "This draws spinning galaxies, which then collide and scatter their stars to "
 "the, uh, four winds or something. Originally an Amiga program by Uli "
 msgid ""
 "This draws spinning galaxies, which then collide and scatter their stars to "
 "the, uh, four winds or something. Originally an Amiga program by Uli "
@@ -4144,9 +4188,9 @@ msgid ""
 "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 "
 "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."
+"of this window: the tab at the top of the *other* window.) 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
 msgstr ""
 
 #: hacks/config/glslideshow.xml.h:17
@@ -4703,6 +4747,27 @@ msgstr "A hangy
 msgid "Wave Size"
 msgstr "Méret"
 
 msgid "Wave Size"
 msgstr "Méret"
 
+#: hacks/config/intermomentary.xml.h:2
+msgid "Intermomentary"
+msgstr ""
+
+#: hacks/config/intermomentary.xml.h:3
+#, fuzzy
+msgid "Number of Discs"
+msgstr "Színek száma"
+
+#: hacks/config/intermomentary.xml.h:6
+msgid ""
+"The Intersection Momentary is a fun visualization defining the relationships "
+"between objects with Casey Reas, William Ngan, and Robert Hodgin. "
+"Commissioned for display at the Whitney Museum of American Art. A surface "
+"filled with 100 medium to small sized circles. Each circle has a different "
+"size and direction, but moves at the same slow rate. Display: A. The "
+"instantaneous intersections of the circles. B. The aggregate intersections "
+"of the circles. Ported to XScreensaver from the art project \"InterMomentary"
+"\" at http://www.complexification.net"
+msgstr ""
+
 #: hacks/config/jigglypuff.xml.h:2
 msgid "Chrome"
 msgstr ""
 #: hacks/config/jigglypuff.xml.h:2
 msgid "Chrome"
 msgstr ""
@@ -4930,10 +4995,6 @@ msgstr ""
 msgid "10"
 msgstr ""
 
 msgid "10"
 msgstr ""
 
-#: hacks/config/lavalite.xml.h:3
-msgid "Activity"
-msgstr ""
-
 #: hacks/config/lavalite.xml.h:4
 msgid "Classic Lavalite"
 msgstr ""
 #: hacks/config/lavalite.xml.h:4
 msgid "Classic Lavalite"
 msgstr ""
@@ -5684,6 +5745,39 @@ msgid ""
 "invisibility at intersection points. Written by Geoffrey Irving."
 msgstr ""
 
 "invisibility at intersection points. Written by Geoffrey Irving."
 msgstr ""
 
+#: hacks/config/pinion.xml.h:1
+msgid "100"
+msgstr ""
+
+#: hacks/config/pinion.xml.h:2
+msgid "2000"
+msgstr ""
+
+#: hacks/config/pinion.xml.h:4
+msgid ""
+"Draws an interconnected set of gears moving across the screen. Written by "
+"Jamie Zawinski."
+msgstr ""
+
+#: hacks/config/pinion.xml.h:6
+#, fuzzy
+msgid "Gear Size"
+msgstr "Méret"
+
+#: hacks/config/pinion.xml.h:8
+msgid "Max RPM"
+msgstr ""
+
+#: hacks/config/pinion.xml.h:9
+#, fuzzy
+msgid "Pinion"
+msgstr "Hosszabb"
+
+#: hacks/config/pinion.xml.h:11
+#, fuzzy
+msgid "Scrolling Speed"
+msgstr "Slidescreen"
+
 #: hacks/config/pipes.xml.h:1
 msgid "Allow Tight Turns"
 msgstr ""
 #: hacks/config/pipes.xml.h:1
 msgid "Allow Tight Turns"
 msgstr ""
@@ -5711,7 +5805,8 @@ msgid ""
 "probably seen this GL hack. This version is by Marcelo Vianna."
 msgstr ""
 
 "probably seen this GL hack. This version is by Marcelo Vianna."
 msgstr ""
 
-#: hacks/config/pipes.xml.h:9 hacks/config/wormhole.xml.h:4
+#: hacks/config/pipes.xml.h:9 hacks/config/substrate.xml.h:7
+#: hacks/config/wormhole.xml.h:4
 msgid "Lots"
 msgstr ""
 
 msgid "Lots"
 msgstr ""
 
@@ -6956,22 +7051,26 @@ msgid "Ping subnet/30 (2 hosts)"
 msgstr ""
 
 #: hacks/config/sonar.xml.h:10
 msgstr ""
 
 #: hacks/config/sonar.xml.h:10
-msgid "Simulation Team Members"
+msgid "Resolve Host Names"
 msgstr ""
 
 #: hacks/config/sonar.xml.h:11
 msgstr ""
 
 #: hacks/config/sonar.xml.h:11
+msgid "Simulation Team Members"
+msgstr ""
+
+#: hacks/config/sonar.xml.h:12
 msgid "Sonar"
 msgstr "Sonar"
 
 msgid "Sonar"
 msgstr "Sonar"
 
-#: hacks/config/sonar.xml.h:12
+#: hacks/config/sonar.xml.h:13
 msgid "Team A Name"
 msgstr ""
 
 msgid "Team A Name"
 msgstr ""
 
-#: hacks/config/sonar.xml.h:13
+#: hacks/config/sonar.xml.h:14
 msgid "Team B Name"
 msgstr ""
 
 msgid "Team B Name"
 msgstr ""
 
-#: hacks/config/sonar.xml.h:14
+#: hacks/config/sonar.xml.h:15
 msgid ""
 "This program draws a simulation of a sonar screen. By default, it displays a "
 "random assortment of ``bogies'' on the screen, but if installed as \"setuid "
 msgid ""
 "This program draws a simulation of a sonar screen. By default, it displays a "
 "random assortment of ``bogies'' on the screen, but if installed as \"setuid "
@@ -6980,7 +7079,7 @@ msgid ""
 "Martin and Jamie Zawinski."
 msgstr ""
 
 "Martin and Jamie Zawinski."
 msgstr ""
 
-#: hacks/config/sonar.xml.h:15
+#: hacks/config/sonar.xml.h:16
 msgid "vs."
 msgstr ""
 
 msgid "vs."
 msgstr ""
 
@@ -7261,6 +7360,32 @@ msgid ""
 "Written by Massimino Pascal."
 msgstr ""
 
 "Written by Massimino Pascal."
 msgstr ""
 
+#: hacks/config/substrate.xml.h:4
+#, fuzzy
+msgid "Initial Cracks"
+msgstr "Sûrûség"
+
+#: hacks/config/substrate.xml.h:5
+msgid ""
+"Lines like crystals grow on a computational substrate. A simple "
+"perpendicular growth rule creates intricate city-like structures. By J. "
+"Tarbell and Mike Kershaw."
+msgstr ""
+
+#: hacks/config/substrate.xml.h:8
+#, fuzzy
+msgid "Sandgrains"
+msgstr "Sonar"
+
+#: hacks/config/substrate.xml.h:12
+#, fuzzy
+msgid "Substrate"
+msgstr "Lépésszám"
+
+#: hacks/config/substrate.xml.h:13
+msgid "Wireframe only"
+msgstr ""
+
 #: hacks/config/superquadrics.xml.h:3
 msgid ""
 "Ed Mackey reports that he wrote the first version of this program in BASIC "
 #: hacks/config/superquadrics.xml.h:3
 msgid ""
 "Ed Mackey reports that he wrote the first version of this program in BASIC "
index 8adf91a33c81ae84901b6d3d6dfe99b6e3080580..7098fa1a1040ce8f198d2cc146a7028c13efe078 100644 (file)
--- a/po/it.po
+++ b/po/it.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2004-10-04 16:25+0200\n"
+"POT-Creation-Date: 2004-12-22 12:51+0100\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -147,7 +147,7 @@ msgstr ""
 msgid "minutes"
 msgstr ""
 
 msgid "minutes"
 msgstr ""
 
-#: driver/demo-Gtk-widgets.c:482 driver/demo-Gtk.c:2845
+#: driver/demo-Gtk-widgets.c:482 driver/demo-Gtk.c:2852
 #: driver/xscreensaver-demo.glade.h:58
 msgid "Preview"
 msgstr ""
 #: driver/xscreensaver-demo.glade.h:58
 msgid "Preview"
 msgstr ""
@@ -195,12 +195,12 @@ msgstr "Salvaschermo"
 msgid "Random Screen Saver"
 msgstr "Salvaschermo"
 
 msgid "Random Screen Saver"
 msgstr "Salvaschermo"
 
-#: driver/demo-Gtk-widgets.c:571 driver/demo-Gtk.c:2134
+#: driver/demo-Gtk-widgets.c:571 driver/demo-Gtk.c:2141
 #: driver/xscreensaver-demo.glade.h:75
 msgid "Use"
 msgstr ""
 
 #: driver/xscreensaver-demo.glade.h:75
 msgid "Use"
 msgstr ""
 
-#: driver/demo-Gtk-widgets.c:591 driver/demo-Gtk.c:2144
+#: driver/demo-Gtk-widgets.c:591 driver/demo-Gtk.c:2151
 #: driver/xscreensaver-demo.glade.h:63
 #, fuzzy
 msgid "Screen Saver"
 #: driver/xscreensaver-demo.glade.h:63
 #, fuzzy
 msgid "Screen Saver"
@@ -431,7 +431,7 @@ msgid "Visual:"
 msgstr ""
 
 #: driver/demo-Gtk-widgets.c:1550 driver/demo-Gtk-widgets.c:1573
 msgstr ""
 
 #: driver/demo-Gtk-widgets.c:1550 driver/demo-Gtk-widgets.c:1573
-#: driver/demo-Gtk.c:1538 driver/demo-Gtk.c:2864
+#: driver/demo-Gtk.c:1545 driver/demo-Gtk.c:2871
 #: driver/xscreensaver-demo.glade.h:5 driver/xscreensaver-demo.glade2.h:3
 msgid "Any"
 msgstr ""
 #: driver/xscreensaver-demo.glade.h:5 driver/xscreensaver-demo.glade2.h:3
 msgid "Any"
 msgstr ""
@@ -530,7 +530,7 @@ msgstr ""
 msgid "Back to the graphical configuration options."
 msgstr ""
 
 msgid "Back to the graphical configuration options."
 msgstr ""
 
-#: driver/demo-Gtk-widgets.c:1709 driver/demo-Gtk.c:741
+#: driver/demo-Gtk-widgets.c:1709 driver/demo-Gtk.c:748
 #: driver/xscreensaver-demo.glade.h:54
 msgid "OK"
 msgstr ""
 #: driver/xscreensaver-demo.glade.h:54
 msgid "OK"
 msgstr ""
@@ -539,18 +539,18 @@ msgstr ""
 msgid "Cancel"
 msgstr ""
 
 msgid "Cancel"
 msgstr ""
 
-#: driver/demo-Gtk.c:649
+#: driver/demo-Gtk.c:656
 msgid "For updates, check http://www.jwz.org/xscreensaver/"
 msgstr ""
 
 msgid "For updates, check http://www.jwz.org/xscreensaver/"
 msgstr ""
 
-#: driver/demo-Gtk.c:779
+#: driver/demo-Gtk.c:786
 msgid ""
 "Error:\n"
 "\n"
 "No Help URL has been specified.\n"
 msgstr ""
 
 msgid ""
 "Error:\n"
 "\n"
 "No Help URL has been specified.\n"
 msgstr ""
 
-#: driver/demo-Gtk.c:865
+#: driver/demo-Gtk.c:872
 msgid ""
 "Error:\n"
 "\n"
 msgid ""
 "Error:\n"
 "\n"
@@ -558,7 +558,7 @@ msgid ""
 "\n"
 msgstr ""
 
 "\n"
 msgstr ""
 
-#: driver/demo-Gtk.c:877
+#: driver/demo-Gtk.c:884
 msgid ""
 "You are running as root.  This usually means that xscreensaver\n"
 "was unable to contact your X server because access control is\n"
 msgid ""
 "You are running as root.  This usually means that xscreensaver\n"
 "was unable to contact your X server because access control is\n"
@@ -577,18 +577,18 @@ msgid ""
 "normal user, and `su' as necessary."
 msgstr ""
 
 "normal user, and `su' as necessary."
 msgstr ""
 
-#: driver/demo-Gtk.c:893
+#: driver/demo-Gtk.c:900
 msgid "Please check your $PATH and permissions."
 msgstr ""
 
 msgid "Please check your $PATH and permissions."
 msgstr ""
 
-#: driver/demo-Gtk.c:928
+#: driver/demo-Gtk.c:935
 msgid ""
 "Error:\n"
 "\n"
 "Couldn't determine init file name!\n"
 msgstr ""
 
 msgid ""
 "Error:\n"
 "\n"
 "Couldn't determine init file name!\n"
 msgstr ""
 
-#: driver/demo-Gtk.c:933
+#: driver/demo-Gtk.c:940
 #, c-format
 msgid ""
 "Error:\n"
 #, c-format
 msgid ""
 "Error:\n"
@@ -596,14 +596,14 @@ msgid ""
 "Couldn't write %s\n"
 msgstr ""
 
 "Couldn't write %s\n"
 msgstr ""
 
-#: driver/demo-Gtk.c:992
+#: driver/demo-Gtk.c:999
 msgid ""
 "Error:\n"
 "\n"
 "no `manualCommand' resource set."
 msgstr ""
 
 msgid ""
 "Error:\n"
 "\n"
 "no `manualCommand' resource set."
 msgstr ""
 
-#: driver/demo-Gtk.c:1173
+#: driver/demo-Gtk.c:1180
 #, c-format
 msgid ""
 "Error:\n"
 #, c-format
 msgid ""
 "Error:\n"
@@ -611,7 +611,7 @@ msgid ""
 "Unparsable time format: \"%s\"\n"
 msgstr ""
 
 "Unparsable time format: \"%s\"\n"
 msgstr ""
 
-#: driver/demo-Gtk.c:1829
+#: driver/demo-Gtk.c:1836
 #, c-format
 msgid ""
 "Error:\n"
 #, c-format
 msgid ""
 "Error:\n"
@@ -619,29 +619,29 @@ msgid ""
 "Directory does not exist: \"%s\"\n"
 msgstr ""
 
 "Directory does not exist: \"%s\"\n"
 msgstr ""
 
-#: driver/demo-Gtk.c:2546
+#: driver/demo-Gtk.c:2553
 msgid "Descriptions not available: no XML support compiled in."
 msgstr ""
 
 msgid "Descriptions not available: no XML support compiled in."
 msgstr ""
 
-#: driver/demo-Gtk.c:2551
+#: driver/demo-Gtk.c:2558
 msgid "No description available."
 msgstr ""
 
 msgid "No description available."
 msgstr ""
 
-#: driver/demo-Gtk.c:2816
+#: driver/demo-Gtk.c:2823
 msgid "Blank Screen"
 msgstr ""
 
 msgid "Blank Screen"
 msgstr ""
 
-#: driver/demo-Gtk.c:2822
+#: driver/demo-Gtk.c:2829
 #, fuzzy
 msgid "Screen Saver Disabled"
 msgstr "Salvaschermo"
 
 #, fuzzy
 msgid "Screen Saver Disabled"
 msgstr "Salvaschermo"
 
-#: driver/demo-Gtk.c:2855
+#: driver/demo-Gtk.c:2862
 #, c-format
 msgid "%s: %.100s Settings"
 msgstr ""
 
 #, c-format
 msgid "%s: %.100s Settings"
 msgstr ""
 
-#: driver/demo-Gtk.c:3010
+#: driver/demo-Gtk.c:3017
 #, c-format
 msgid ""
 "Warning:\n"
 #, c-format
 msgid ""
 "Warning:\n"
@@ -649,23 +649,23 @@ msgid ""
 "file \"%s\" has changed, reloading.\n"
 msgstr ""
 
 "file \"%s\" has changed, reloading.\n"
 msgstr ""
 
-#: driver/demo-Gtk.c:3092
+#: driver/demo-Gtk.c:3099
 msgid "No Preview"
 msgstr ""
 
 msgid "No Preview"
 msgstr ""
 
-#: driver/demo-Gtk.c:3092
+#: driver/demo-Gtk.c:3099
 msgid "Available"
 msgstr ""
 
 msgid "Available"
 msgstr ""
 
-#: driver/demo-Gtk.c:3093
+#: driver/demo-Gtk.c:3100
 msgid "Not"
 msgstr ""
 
 msgid "Not"
 msgstr ""
 
-#: driver/demo-Gtk.c:3093
+#: driver/demo-Gtk.c:3100
 msgid "Installed"
 msgstr ""
 
 msgid "Installed"
 msgstr ""
 
-#: driver/demo-Gtk.c:3858
+#: driver/demo-Gtk.c:3865
 #, c-format
 msgid ""
 "Warning:\n"
 #, c-format
 msgid ""
 "Warning:\n"
@@ -674,7 +674,7 @@ msgid ""
 "on display \"%s\".  Launch it now?"
 msgstr ""
 
 "on display \"%s\".  Launch it now?"
 msgstr ""
 
-#: driver/demo-Gtk.c:3868
+#: driver/demo-Gtk.c:3875
 #, c-format
 msgid ""
 "Warning:\n"
 #, c-format
 msgid ""
 "Warning:\n"
@@ -693,7 +693,7 @@ msgid ""
 "Restart the xscreensaver daemon now?\n"
 msgstr ""
 
 "Restart the xscreensaver daemon now?\n"
 msgstr ""
 
-#: driver/demo-Gtk.c:3893
+#: driver/demo-Gtk.c:3900
 #, c-format
 msgid ""
 "Warning:\n"
 #, c-format
 msgid ""
 "Warning:\n"
@@ -709,7 +709,7 @@ msgid ""
 "Restart the daemon on \"%s\" as \"%s\" now?\n"
 msgstr ""
 
 "Restart the daemon on \"%s\" as \"%s\" now?\n"
 msgstr ""
 
-#: driver/demo-Gtk.c:3915
+#: driver/demo-Gtk.c:3922
 #, c-format
 msgid ""
 "Warning:\n"
 #, c-format
 msgid ""
 "Warning:\n"
@@ -721,12 +721,12 @@ msgid ""
 "Restart the xscreensaver daemon now?\n"
 msgstr ""
 
 "Restart the xscreensaver daemon now?\n"
 msgstr ""
 
-#: driver/demo-Gtk.c:4372
+#: driver/demo-Gtk.c:4379
 #, c-format
 msgid "%s: unknown option: %s\n"
 msgstr ""
 
 #, c-format
 msgid "%s: unknown option: %s\n"
 msgstr ""
 
-#: driver/demo-Gtk.c:4436
+#: driver/demo-Gtk.c:4443
 #, fuzzy
 msgid "Screensaver Preferences"
 msgstr "Salvaschermo"
 #, fuzzy
 msgid "Screensaver Preferences"
 msgstr "Salvaschermo"
@@ -944,22 +944,23 @@ msgstr ""
 #: 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/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:5 hacks/config/flyingtoasters.xml.h:5
-#: hacks/config/fontglide.xml.h:4 hacks/config/forest.xml.h:1
-#: hacks/config/fuzzyflakes.xml.h:7 hacks/config/galaxy.xml.h:3
-#: hacks/config/gears.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:6
-#: 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/fadeplot.xml.h:4 hacks/config/fireworkx.xml.h:3
+#: 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:2 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/fuzzyflakes.xml.h:7
+#: hacks/config/galaxy.xml.h:3 hacks/config/gears.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:6 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/intermomentary.xml.h:1 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/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
@@ -977,23 +978,24 @@ msgstr ""
 #: hacks/config/pacman.xml.h:1 hacks/config/penetrate.xml.h:3
 #: hacks/config/penrose.xml.h:6 hacks/config/petri.xml.h:5
 #: hacks/config/phosphor.xml.h:4 hacks/config/piecewise.xml.h:4
 #: hacks/config/pacman.xml.h:1 hacks/config/penetrate.xml.h:3
 #: hacks/config/penrose.xml.h:6 hacks/config/petri.xml.h:5
 #: hacks/config/phosphor.xml.h:4 hacks/config/piecewise.xml.h:4
-#: hacks/config/pipes.xml.h:5 hacks/config/polyhedra.xml.h:18
-#: hacks/config/polyominoes.xml.h:2 hacks/config/polytopes.xml.h:11
-#: hacks/config/pong.xml.h:1 hacks/config/popsquares.xml.h:3
-#: hacks/config/providence.xml.h:2 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 hacks/config/rocks.xml.h:4
-#: hacks/config/rotor.xml.h:3 hacks/config/rubik.xml.h:3
-#: hacks/config/sballs.xml.h:4 hacks/config/shadebobs.xml.h:3
-#: hacks/config/sierpinski.xml.h:2 hacks/config/sierpinski3d.xml.h:2
-#: hacks/config/slidescreen.xml.h:2 hacks/config/slip.xml.h:2
-#: hacks/config/speedmine.xml.h:3 hacks/config/sphere.xml.h:2
-#: hacks/config/spheremonics.xml.h:5 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:1 hacks/config/superquadrics.xml.h:4
+#: hacks/config/pinion.xml.h:5 hacks/config/pipes.xml.h:5
+#: hacks/config/polyhedra.xml.h:18 hacks/config/polyominoes.xml.h:2
+#: hacks/config/polytopes.xml.h:11 hacks/config/pong.xml.h:1
+#: hacks/config/popsquares.xml.h:3 hacks/config/providence.xml.h:2
+#: 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
+#: hacks/config/rocks.xml.h:4 hacks/config/rotor.xml.h:3
+#: hacks/config/rubik.xml.h:3 hacks/config/sballs.xml.h:4
+#: hacks/config/shadebobs.xml.h:3 hacks/config/sierpinski.xml.h:2
+#: hacks/config/sierpinski3d.xml.h:2 hacks/config/slidescreen.xml.h:2
+#: hacks/config/slip.xml.h:2 hacks/config/speedmine.xml.h:3
+#: hacks/config/sphere.xml.h:2 hacks/config/spheremonics.xml.h:5
+#: 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:1
+#: hacks/config/substrate.xml.h:2 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/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
@@ -1015,8 +1017,9 @@ msgstr ""
 #: hacks/config/fuzzyflakes.xml.h:8 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/fuzzyflakes.xml.h:8 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/wormhole.xml.h:3 hacks/config/xfishtank.xml.h:4
+#: hacks/config/substrate.xml.h:3 hacks/config/thornbird.xml.h:3
+#: hacks/config/whirlwindwarp.xml.h:1 hacks/config/wormhole.xml.h:3
+#: hacks/config/xfishtank.xml.h:4
 msgid "Few"
 msgstr ""
 
 msgid "Few"
 msgstr ""
 
@@ -1032,7 +1035,7 @@ msgstr ""
 #: hacks/config/epicycle.xml.h:8 hacks/config/eruption.xml.h:12
 #: hacks/config/euler2d.xml.h:8 hacks/config/fadeplot.xml.h:6
 #: hacks/config/flag.xml.h:5 hacks/config/flame.xml.h:11
 #: hacks/config/epicycle.xml.h:8 hacks/config/eruption.xml.h:12
 #: hacks/config/euler2d.xml.h:8 hacks/config/fadeplot.xml.h:6
 #: hacks/config/flag.xml.h:5 hacks/config/flame.xml.h:11
-#: hacks/config/flow.xml.h:8 hacks/config/fluidballs.xml.h:13
+#: hacks/config/flow.xml.h:7 hacks/config/fluidballs.xml.h:13
 #: hacks/config/forest.xml.h:3 hacks/config/fuzzyflakes.xml.h:12
 #: 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/forest.xml.h:3 hacks/config/fuzzyflakes.xml.h:12
 #: hacks/config/galaxy.xml.h:6 hacks/config/grav.xml.h:4
 #: hacks/config/halo.xml.h:4 hacks/config/hopalong.xml.h:15
@@ -1070,7 +1073,7 @@ msgstr ""
 #: 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/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/flow.xml.h:8 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/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
@@ -1124,22 +1127,23 @@ msgstr ""
 #: 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/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/flyingtoasters.xml.h:11
-#: hacks/config/fontglide.xml.h:13 hacks/config/forest.xml.h:5
-#: hacks/config/fuzzyflakes.xml.h:15 hacks/config/galaxy.xml.h:10
-#: hacks/config/gears.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:8 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:10 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/fadeplot.xml.h:8 hacks/config/fireworkx.xml.h:9
+#: 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:10 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/fuzzyflakes.xml.h:15
+#: hacks/config/galaxy.xml.h:11 hacks/config/gears.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:8
+#: 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:10
+#: 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/intermomentary.xml.h:4 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/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
@@ -1157,23 +1161,24 @@ msgstr ""
 #: hacks/config/pacman.xml.h:5 hacks/config/penetrate.xml.h:6
 #: hacks/config/penrose.xml.h:11 hacks/config/petri.xml.h:23
 #: hacks/config/phosphor.xml.h:7 hacks/config/piecewise.xml.h:9
 #: hacks/config/pacman.xml.h:5 hacks/config/penetrate.xml.h:6
 #: hacks/config/penrose.xml.h:11 hacks/config/petri.xml.h:23
 #: hacks/config/phosphor.xml.h:7 hacks/config/piecewise.xml.h:9
-#: hacks/config/pipes.xml.h:15 hacks/config/polyhedra.xml.h:119
-#: hacks/config/polyominoes.xml.h:10 hacks/config/polytopes.xml.h:20
-#: hacks/config/pong.xml.h:4 hacks/config/popsquares.xml.h:5
-#: hacks/config/providence.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 hacks/config/rocks.xml.h:9
-#: hacks/config/rotor.xml.h:11 hacks/config/rubik.xml.h:9
-#: hacks/config/sballs.xml.h:13 hacks/config/shadebobs.xml.h:9
-#: hacks/config/sierpinski.xml.h:7 hacks/config/sierpinski3d.xml.h:8
-#: hacks/config/slidescreen.xml.h:6 hacks/config/slip.xml.h:7
-#: hacks/config/speedmine.xml.h:13 hacks/config/sphere.xml.h:5
-#: hacks/config/spheremonics.xml.h:19 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:4 hacks/config/superquadrics.xml.h:8
+#: hacks/config/pinion.xml.h:13 hacks/config/pipes.xml.h:15
+#: hacks/config/polyhedra.xml.h:119 hacks/config/polyominoes.xml.h:10
+#: hacks/config/polytopes.xml.h:20 hacks/config/pong.xml.h:4
+#: hacks/config/popsquares.xml.h:5 hacks/config/providence.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
+#: hacks/config/rocks.xml.h:9 hacks/config/rotor.xml.h:11
+#: hacks/config/rubik.xml.h:9 hacks/config/sballs.xml.h:13
+#: hacks/config/shadebobs.xml.h:9 hacks/config/sierpinski.xml.h:7
+#: hacks/config/sierpinski3d.xml.h:8 hacks/config/slidescreen.xml.h:6
+#: hacks/config/slip.xml.h:7 hacks/config/speedmine.xml.h:13
+#: hacks/config/sphere.xml.h:5 hacks/config/spheremonics.xml.h:19
+#: 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:4
+#: hacks/config/substrate.xml.h:10 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/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
@@ -1206,17 +1211,18 @@ msgstr ""
 #: hacks/config/engine.xml.h:16 hacks/config/epicycle.xml.h:11
 #: 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/engine.xml.h:16 hacks/config/epicycle.xml.h:11
 #: 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/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/fuzzyflakes.xml.h:17
-#: hacks/config/galaxy.xml.h:11 hacks/config/glblur.xml.h:17
-#: hacks/config/glforestfire.xml.h:15 hacks/config/glplanet.xml.h:10
-#: 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:11 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/fireworkx.xml.h:11 hacks/config/flag.xml.h:9
+#: hacks/config/flame.xml.h:15 hacks/config/flipflop.xml.h:7
+#: hacks/config/flipscreen3d.xml.h:7 hacks/config/flow.xml.h:12
+#: hacks/config/fluidballs.xml.h:20 hacks/config/forest.xml.h:6
+#: hacks/config/fuzzyflakes.xml.h:17 hacks/config/galaxy.xml.h:12
+#: hacks/config/glblur.xml.h:17 hacks/config/glforestfire.xml.h:15
+#: hacks/config/glplanet.xml.h:10 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:11
+#: 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/intermomentary.xml.h:5 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/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
@@ -1245,16 +1251,16 @@ msgstr ""
 #: 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/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/xplanet.xml.h:60 hacks/config/xrayswarm.xml.h:4
-#: hacks/config/zoom.xml.h:7
+#: hacks/config/strange.xml.h:5 hacks/config/substrate.xml.h:11
+#: 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/xplanet.xml.h:60
+#: hacks/config/xrayswarm.xml.h:4 hacks/config/zoom.xml.h:7
 msgid "Speed"
 msgstr ""
 
 msgid "Speed"
 msgstr ""
 
@@ -1297,8 +1303,8 @@ msgstr ""
 #: hacks/config/discrete.xml.h:11 hacks/config/drift.xml.h:14
 #: hacks/config/epicycle.xml.h:13 hacks/config/euler2d.xml.h:17
 #: hacks/config/fadeplot.xml.h:12 hacks/config/flag.xml.h:13
 #: hacks/config/discrete.xml.h:11 hacks/config/drift.xml.h:14
 #: hacks/config/epicycle.xml.h:13 hacks/config/euler2d.xml.h:17
 #: hacks/config/fadeplot.xml.h:12 hacks/config/flag.xml.h:13
-#: hacks/config/flame.xml.h:16 hacks/config/flow.xml.h:18
-#: hacks/config/forest.xml.h:8 hacks/config/galaxy.xml.h:13
+#: hacks/config/flame.xml.h:16 hacks/config/flow.xml.h:15
+#: hacks/config/forest.xml.h:8 hacks/config/galaxy.xml.h:14
 #: hacks/config/grav.xml.h:11 hacks/config/halo.xml.h:13
 #: hacks/config/hopalong.xml.h:25 hacks/config/ifs.xml.h:8
 #: hacks/config/imsmap.xml.h:15 hacks/config/interference.xml.h:19
 #: hacks/config/grav.xml.h:11 hacks/config/halo.xml.h:13
 #: hacks/config/hopalong.xml.h:25 hacks/config/ifs.xml.h:8
 #: hacks/config/imsmap.xml.h:15 hacks/config/interference.xml.h:19
@@ -1395,7 +1401,7 @@ msgstr ""
 #: 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/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/flag.xml.h:4 hacks/config/flow.xml.h:4
 #: hacks/config/fluidballs.xml.h:12 hacks/config/fuzzyflakes.xml.h:10
 #: 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/fluidballs.xml.h:12 hacks/config/fuzzyflakes.xml.h:10
 #: hacks/config/gleidescope.xml.h:7 hacks/config/halftone.xml.h:8
 #: hacks/config/hopalong.xml.h:13 hacks/config/interference.xml.h:11
@@ -1427,7 +1433,7 @@ msgstr ""
 #: 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/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/flag.xml.h:8 hacks/config/flow.xml.h:11
 #: hacks/config/fluidballs.xml.h:19 hacks/config/fuzzyflakes.xml.h:16
 #: 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/fluidballs.xml.h:19 hacks/config/fuzzyflakes.xml.h:16
 #: hacks/config/gleidescope.xml.h:12 hacks/config/halftone.xml.h:14
 #: hacks/config/hopalong.xml.h:22 hacks/config/interference.xml.h:18
@@ -1446,7 +1452,7 @@ msgstr ""
 
 #: 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/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/flag.xml.h:12 hacks/config/flow.xml.h:14
 #: hacks/config/lissie.xml.h:12 hacks/config/loop.xml.h:11
 #: hacks/config/rubik.xml.h:12 hacks/config/sierpinski.xml.h:11
 #: hacks/config/slip.xml.h:11
 #: hacks/config/lissie.xml.h:12 hacks/config/loop.xml.h:11
 #: hacks/config/rubik.xml.h:12 hacks/config/sierpinski.xml.h:11
 #: hacks/config/slip.xml.h:11
@@ -1496,13 +1502,14 @@ msgstr ""
 #: hacks/config/menger.xml.h:15 hacks/config/mirrorblob.xml.h:18
 #: hacks/config/moebius.xml.h:6 hacks/config/molecule.xml.h:21
 #: hacks/config/morph3d.xml.h:5 hacks/config/noof.xml.h:4
 #: hacks/config/menger.xml.h:15 hacks/config/mirrorblob.xml.h:18
 #: hacks/config/moebius.xml.h:6 hacks/config/molecule.xml.h:21
 #: hacks/config/morph3d.xml.h:5 hacks/config/noof.xml.h:4
-#: hacks/config/pipes.xml.h:14 hacks/config/polyhedra.xml.h:118
-#: hacks/config/polytopes.xml.h:18 hacks/config/providence.xml.h:4
-#: 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
+#: hacks/config/pinion.xml.h:12 hacks/config/pipes.xml.h:14
+#: hacks/config/polyhedra.xml.h:118 hacks/config/polytopes.xml.h:18
+#: hacks/config/providence.xml.h:4 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 ""
 
 msgid "Show Frames-per-Second"
 msgstr ""
 
@@ -1661,11 +1668,12 @@ msgstr ""
 #: hacks/config/lament.xml.h:9 hacks/config/lavalite.xml.h:32
 #: hacks/config/menger.xml.h:21 hacks/config/mirrorblob.xml.h:24
 #: hacks/config/moebius.xml.h:11 hacks/config/molecule.xml.h:26
 #: hacks/config/lament.xml.h:9 hacks/config/lavalite.xml.h:32
 #: hacks/config/menger.xml.h:21 hacks/config/mirrorblob.xml.h:24
 #: hacks/config/moebius.xml.h:11 hacks/config/molecule.xml.h:26
-#: hacks/config/polyhedra.xml.h:173 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
+#: hacks/config/pinion.xml.h:15 hacks/config/polyhedra.xml.h:173
+#: 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 ""
 
 msgid "Wireframe"
 msgstr ""
 
@@ -1753,14 +1761,15 @@ msgstr ""
 #: 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/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/mismunch.xml.h:3
-#: 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 hacks/config/spheremonics.xml.h:7
+#: hacks/config/flow.xml.h:6 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/mismunch.xml.h:3 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
+#: hacks/config/spheremonics.xml.h:7 hacks/config/substrate.xml.h:6
 #: hacks/config/wander.xml.h:10 hacks/config/whirlwindwarp.xml.h:3
 msgid "Long"
 msgstr ""
 #: hacks/config/wander.xml.h:10 hacks/config/whirlwindwarp.xml.h:3
 msgid "Long"
 msgstr ""
@@ -1807,13 +1816,14 @@ msgstr ""
 #: 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/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/metaballs.xml.h:12 hacks/config/mismunch.xml.h:8
-#: 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/flow.xml.h:9 hacks/config/galaxy.xml.h:9
+#: hacks/config/klein.xml.h:5 hacks/config/laser.xml.h:9
+#: hacks/config/menger.xml.h:14 hacks/config/metaballs.xml.h:12
+#: hacks/config/mismunch.xml.h:8 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/substrate.xml.h:9
 #: hacks/config/wander.xml.h:12 hacks/config/whirlwindwarp.xml.h:6
 msgid "Short"
 msgstr ""
 #: hacks/config/wander.xml.h:12 hacks/config/whirlwindwarp.xml.h:6
 msgid "Short"
 msgstr ""
@@ -2010,10 +2020,10 @@ msgstr ""
 #: 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/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/polyhedra.xml.h:3 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/wormhole.xml.h:1
-#: hacks/config/xfishtank.xml.h:1
+#: hacks/config/pinion.xml.h:3 hacks/config/polyhedra.xml.h:3
+#: 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/wormhole.xml.h:1 hacks/config/xfishtank.xml.h:1
 msgid "Animation Speed"
 msgstr ""
 
 msgid "Animation Speed"
 msgstr ""
 
@@ -2088,8 +2098,9 @@ msgstr ""
 #: 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/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/starfish.xml.h:2 hacks/config/substrate.xml.h:1
+#: hacks/config/vidwhacker.xml.h:3 hacks/config/wander.xml.h:7
+#: hacks/config/xspirograph.xml.h:3
 msgid "Duration"
 msgstr ""
 
 msgid "Duration"
 msgstr ""
 
@@ -2336,7 +2347,7 @@ msgstr ""
 msgid "Rotate"
 msgstr ""
 
 msgid "Rotate"
 msgstr ""
 
-#: hacks/config/circuit.xml.h:8
+#: hacks/config/circuit.xml.h:8 hacks/config/pinion.xml.h:10
 msgid "Rotation Speed"
 msgstr ""
 
 msgid "Rotation Speed"
 msgstr ""
 
@@ -2419,11 +2430,12 @@ msgstr ""
 msgid "Coral"
 msgstr ""
 
 msgid "Coral"
 msgstr ""
 
-#: hacks/config/coral.xml.h:4 hacks/config/gflux.xml.h:3
-#: hacks/config/glblur.xml.h:2 hacks/config/glmatrix.xml.h:3
-#: 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
+#: hacks/config/coral.xml.h:4 hacks/config/fireworkx.xml.h:2
+#: hacks/config/gflux.xml.h:3 hacks/config/glblur.xml.h:2
+#: hacks/config/glmatrix.xml.h:3 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
 msgid "Dense"
 msgstr ""
 
 msgid "Dense"
 msgstr ""
 
@@ -2436,12 +2448,12 @@ msgid ""
 "Simulates coral growth, albeit somewhat slowly. Written by Frederick Roeber."
 msgstr ""
 
 "Simulates coral growth, albeit somewhat slowly. Written by Frederick Roeber."
 msgstr ""
 
-#: hacks/config/coral.xml.h:13 hacks/config/gflux.xml.h:13
-#: hacks/config/glblur.xml.h:16 hacks/config/glmatrix.xml.h:19
-#: hacks/config/imsmap.xml.h:13 hacks/config/lavalite.xml.h:29
-#: hacks/config/pyro.xml.h:14 hacks/config/qix.xml.h:21
-#: hacks/config/squiral.xml.h:15 hacks/config/xearth.xml.h:24
-#: hacks/config/xmatrix.xml.h:17
+#: hacks/config/coral.xml.h:13 hacks/config/fireworkx.xml.h:10
+#: hacks/config/gflux.xml.h:13 hacks/config/glblur.xml.h:16
+#: hacks/config/glmatrix.xml.h:19 hacks/config/imsmap.xml.h:13
+#: hacks/config/lavalite.xml.h:29 hacks/config/pyro.xml.h:14
+#: hacks/config/qix.xml.h:21 hacks/config/squiral.xml.h:15
+#: hacks/config/xearth.xml.h:24 hacks/config/xmatrix.xml.h:17
 msgid "Sparse"
 msgstr ""
 
 msgid "Sparse"
 msgstr ""
 
@@ -2470,7 +2482,7 @@ msgid "Center on Screen"
 msgstr ""
 
 #: hacks/config/crystal.xml.h:2 hacks/config/deluxe.xml.h:1
 msgstr ""
 
 #: hacks/config/crystal.xml.h:2 hacks/config/deluxe.xml.h:1
-#: hacks/config/fadeplot.xml.h:1 hacks/config/flow.xml.h:3
+#: hacks/config/fadeplot.xml.h:1 hacks/config/flow.xml.h:1
 #: hacks/config/galaxy.xml.h:1 hacks/config/glforestfire.xml.h:1
 #: hacks/config/grav.xml.h:1 hacks/config/julia.xml.h:1
 #: hacks/config/laser.xml.h:1 hacks/config/lisa.xml.h:1
 #: hacks/config/galaxy.xml.h:1 hacks/config/glforestfire.xml.h:1
 #: hacks/config/grav.xml.h:1 hacks/config/julia.xml.h:1
 #: hacks/config/laser.xml.h:1 hacks/config/lisa.xml.h:1
@@ -3212,7 +3224,7 @@ msgstr ""
 msgid "Half"
 msgstr ""
 
 msgid "Half"
 msgstr ""
 
-#: hacks/config/fireflies.xml.h:17
+#: hacks/config/fireflies.xml.h:17 hacks/config/pinion.xml.h:7
 msgid "Huge"
 msgstr ""
 
 msgid "Huge"
 msgstr ""
 
@@ -3301,7 +3313,7 @@ msgstr ""
 msgid "Swarm tails glow"
 msgstr ""
 
 msgid "Swarm tails glow"
 msgstr ""
 
-#: hacks/config/fireflies.xml.h:43
+#: hacks/config/fireflies.xml.h:43 hacks/config/pinion.xml.h:14
 msgid "Tiny"
 msgstr ""
 
 msgid "Tiny"
 msgstr ""
 
@@ -3317,6 +3329,30 @@ msgstr ""
 msgid "Wind picks up"
 msgstr ""
 
 msgid "Wind picks up"
 msgstr ""
 
+#: hacks/config/fireworkx.xml.h:1 hacks/config/lavalite.xml.h:3
+msgid "Activity"
+msgstr ""
+
+#: hacks/config/fireworkx.xml.h:4
+msgid "Fast Fade (more realistic)"
+msgstr ""
+
+#: hacks/config/fireworkx.xml.h:5
+msgid "Fireworkx"
+msgstr ""
+
+#: hacks/config/fireworkx.xml.h:6
+msgid "Light effect"
+msgstr ""
+
+#: hacks/config/fireworkx.xml.h:7
+msgid "Pyrotechnics simulation eye-candy. Written by Rony B. Chandran."
+msgstr ""
+
+#: hacks/config/fireworkx.xml.h:8
+msgid "Shoot"
+msgstr ""
+
 #: hacks/config/flag.xml.h:1
 msgid "Bitmap for Flag"
 msgstr ""
 #: hacks/config/flag.xml.h:1
 msgid "Bitmap for Flag"
 msgstr ""
@@ -3390,42 +3426,42 @@ msgid ""
 "around and deforms it in various ways. Written by Ben Buxton."
 msgstr ""
 
 "around and deforms it in various ways. Written by Ben Buxton."
 msgstr ""
 
-#: hacks/config/flow.xml.h:1
-msgid "Allow 2D Attractors"
+#: hacks/config/flow.xml.h:3
+msgid "Flow"
 msgstr ""
 
 msgstr ""
 
-#: hacks/config/flow.xml.h:2
-msgid ""
-"Another series of strange attractors: a flowing series of points, making "
-"strange rotational shapes. Written by Tim Auckland."
+#: hacks/config/flow.xml.h:5
+msgid "Length of trails"
 msgstr ""
 
 msgstr ""
 
-#: hacks/config/flow.xml.h:5
-msgid "Flow"
+#: hacks/config/flow.xml.h:13
+msgid ""
+"Strange attractors formed of flows in a 3D differential equation phase "
+"space. Written by Tim Auckland."
 msgstr ""
 
 msgstr ""
 
-#: hacks/config/flow.xml.h:6
-msgid "Freeze Some Bees"
+#: hacks/config/flow.xml.h:16
+msgid "turn on/off bounding box."
 msgstr ""
 
 msgstr ""
 
-#: hacks/config/flow.xml.h:10
-msgid "Ride a Trained Bee"
+#: hacks/config/flow.xml.h:17
+msgid "turn on/off double buffering."
 msgstr ""
 
 msgstr ""
 
-#: hacks/config/flow.xml.h:11
-msgid "Rotate Around Attractor"
+#: hacks/config/flow.xml.h:18
+msgid "turn on/off periodic attractors."
 msgstr ""
 
 msgstr ""
 
-#: hacks/config/flow.xml.h:12
-msgid "Show Bounding Box"
+#: hacks/config/flow.xml.h:19
+msgid "turn on/off ride in the flow."
 msgstr ""
 
 msgstr ""
 
-#: hacks/config/flow.xml.h:14
-msgid "Slow Bees with Antifreeze"
+#: hacks/config/flow.xml.h:20
+msgid "turn on/off rotating around attractor."
 msgstr ""
 
 msgstr ""
 
-#: hacks/config/flow.xml.h:19
-msgid "Zoom In and Out"
+#: hacks/config/flow.xml.h:21
+msgid "turn on/off search for new attractors."
 msgstr ""
 
 #: hacks/config/fluidballs.xml.h:1
 msgstr ""
 
 #: hacks/config/fluidballs.xml.h:1
@@ -3630,7 +3666,11 @@ msgstr ""
 msgid "Galaxy"
 msgstr ""
 
 msgid "Galaxy"
 msgstr ""
 
-#: hacks/config/galaxy.xml.h:9 hacks/config/lisa.xml.h:7
+#: hacks/config/galaxy.xml.h:8
+msgid "Rotate Viewpoint"
+msgstr ""
+
+#: hacks/config/galaxy.xml.h:10 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/pong.xml.h:3
 #: hacks/config/rotor.xml.h:10 hacks/config/rubik.xml.h:8
 #: hacks/config/lissie.xml.h:8 hacks/config/loop.xml.h:6
 #: hacks/config/penrose.xml.h:10 hacks/config/pong.xml.h:3
 #: hacks/config/rotor.xml.h:10 hacks/config/rubik.xml.h:8
@@ -3639,7 +3679,7 @@ msgstr ""
 msgid "Size"
 msgstr ""
 
 msgid "Size"
 msgstr ""
 
-#: hacks/config/galaxy.xml.h:12
+#: hacks/config/galaxy.xml.h:13
 msgid ""
 "This draws spinning galaxies, which then collide and scatter their stars to "
 "the, uh, four winds or something. Originally an Amiga program by Uli "
 msgid ""
 "This draws spinning galaxies, which then collide and scatter their stars to "
 "the, uh, four winds or something. Originally an Amiga program by Uli "
@@ -3938,9 +3978,9 @@ msgid ""
 "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 "
 "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."
+"of this window: the tab at the top of the *other* window.) 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
 msgstr ""
 
 #: hacks/config/glslideshow.xml.h:17
@@ -4457,6 +4497,26 @@ msgstr ""
 msgid "Wave Size"
 msgstr ""
 
 msgid "Wave Size"
 msgstr ""
 
+#: hacks/config/intermomentary.xml.h:2
+msgid "Intermomentary"
+msgstr ""
+
+#: hacks/config/intermomentary.xml.h:3
+msgid "Number of Discs"
+msgstr ""
+
+#: hacks/config/intermomentary.xml.h:6
+msgid ""
+"The Intersection Momentary is a fun visualization defining the relationships "
+"between objects with Casey Reas, William Ngan, and Robert Hodgin. "
+"Commissioned for display at the Whitney Museum of American Art. A surface "
+"filled with 100 medium to small sized circles. Each circle has a different "
+"size and direction, but moves at the same slow rate. Display: A. The "
+"instantaneous intersections of the circles. B. The aggregate intersections "
+"of the circles. Ported to XScreensaver from the art project \"InterMomentary"
+"\" at http://www.complexification.net"
+msgstr ""
+
 #: hacks/config/jigglypuff.xml.h:2
 msgid "Chrome"
 msgstr ""
 #: hacks/config/jigglypuff.xml.h:2
 msgid "Chrome"
 msgstr ""
@@ -4675,10 +4735,6 @@ msgstr ""
 msgid "10"
 msgstr ""
 
 msgid "10"
 msgstr ""
 
-#: hacks/config/lavalite.xml.h:3
-msgid "Activity"
-msgstr ""
-
 #: hacks/config/lavalite.xml.h:4
 msgid "Classic Lavalite"
 msgstr ""
 #: hacks/config/lavalite.xml.h:4
 msgid "Classic Lavalite"
 msgstr ""
@@ -5391,6 +5447,36 @@ msgid ""
 "invisibility at intersection points. Written by Geoffrey Irving."
 msgstr ""
 
 "invisibility at intersection points. Written by Geoffrey Irving."
 msgstr ""
 
+#: hacks/config/pinion.xml.h:1
+msgid "100"
+msgstr ""
+
+#: hacks/config/pinion.xml.h:2
+msgid "2000"
+msgstr ""
+
+#: hacks/config/pinion.xml.h:4
+msgid ""
+"Draws an interconnected set of gears moving across the screen. Written by "
+"Jamie Zawinski."
+msgstr ""
+
+#: hacks/config/pinion.xml.h:6
+msgid "Gear Size"
+msgstr ""
+
+#: hacks/config/pinion.xml.h:8
+msgid "Max RPM"
+msgstr ""
+
+#: hacks/config/pinion.xml.h:9
+msgid "Pinion"
+msgstr ""
+
+#: hacks/config/pinion.xml.h:11
+msgid "Scrolling Speed"
+msgstr ""
+
 #: hacks/config/pipes.xml.h:1
 msgid "Allow Tight Turns"
 msgstr ""
 #: hacks/config/pipes.xml.h:1
 msgid "Allow Tight Turns"
 msgstr ""
@@ -5417,7 +5503,8 @@ msgid ""
 "probably seen this GL hack. This version is by Marcelo Vianna."
 msgstr ""
 
 "probably seen this GL hack. This version is by Marcelo Vianna."
 msgstr ""
 
-#: hacks/config/pipes.xml.h:9 hacks/config/wormhole.xml.h:4
+#: hacks/config/pipes.xml.h:9 hacks/config/substrate.xml.h:7
+#: hacks/config/wormhole.xml.h:4
 msgid "Lots"
 msgstr ""
 
 msgid "Lots"
 msgstr ""
 
@@ -6621,22 +6708,26 @@ msgid "Ping subnet/30 (2 hosts)"
 msgstr ""
 
 #: hacks/config/sonar.xml.h:10
 msgstr ""
 
 #: hacks/config/sonar.xml.h:10
-msgid "Simulation Team Members"
+msgid "Resolve Host Names"
 msgstr ""
 
 #: hacks/config/sonar.xml.h:11
 msgstr ""
 
 #: hacks/config/sonar.xml.h:11
-msgid "Sonar"
+msgid "Simulation Team Members"
 msgstr ""
 
 #: hacks/config/sonar.xml.h:12
 msgstr ""
 
 #: hacks/config/sonar.xml.h:12
-msgid "Team A Name"
+msgid "Sonar"
 msgstr ""
 
 #: hacks/config/sonar.xml.h:13
 msgstr ""
 
 #: hacks/config/sonar.xml.h:13
-msgid "Team B Name"
+msgid "Team A Name"
 msgstr ""
 
 #: hacks/config/sonar.xml.h:14
 msgstr ""
 
 #: hacks/config/sonar.xml.h:14
+msgid "Team B Name"
+msgstr ""
+
+#: hacks/config/sonar.xml.h:15
 msgid ""
 "This program draws a simulation of a sonar screen. By default, it displays a "
 "random assortment of ``bogies'' on the screen, but if installed as \"setuid "
 msgid ""
 "This program draws a simulation of a sonar screen. By default, it displays a "
 "random assortment of ``bogies'' on the screen, but if installed as \"setuid "
@@ -6645,7 +6736,7 @@ msgid ""
 "Martin and Jamie Zawinski."
 msgstr ""
 
 "Martin and Jamie Zawinski."
 msgstr ""
 
-#: hacks/config/sonar.xml.h:15
+#: hacks/config/sonar.xml.h:16
 msgid "vs."
 msgstr ""
 
 msgid "vs."
 msgstr ""
 
@@ -6918,6 +7009,29 @@ msgid ""
 "Written by Massimino Pascal."
 msgstr ""
 
 "Written by Massimino Pascal."
 msgstr ""
 
+#: hacks/config/substrate.xml.h:4
+msgid "Initial Cracks"
+msgstr ""
+
+#: hacks/config/substrate.xml.h:5
+msgid ""
+"Lines like crystals grow on a computational substrate. A simple "
+"perpendicular growth rule creates intricate city-like structures. By J. "
+"Tarbell and Mike Kershaw."
+msgstr ""
+
+#: hacks/config/substrate.xml.h:8
+msgid "Sandgrains"
+msgstr ""
+
+#: hacks/config/substrate.xml.h:12
+msgid "Substrate"
+msgstr ""
+
+#: hacks/config/substrate.xml.h:13
+msgid "Wireframe only"
+msgstr ""
+
 #: hacks/config/superquadrics.xml.h:3
 msgid ""
 "Ed Mackey reports that he wrote the first version of this program in BASIC "
 #: hacks/config/superquadrics.xml.h:3
 msgid ""
 "Ed Mackey reports that he wrote the first version of this program in BASIC "
index 90c15fca2e0d8be394471b997a4356f919b59274..f408817f8978efa4021546e9b67460f11ec51b10 100644 (file)
--- a/po/ja.po
+++ b/po/ja.po
@@ -6,7 +6,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: xscreensaver 4.03\n"
 "Report-Msgid-Bugs-To: \n"
 msgstr ""
 "Project-Id-Version: xscreensaver 4.03\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2004-10-04 16:25+0200\n"
+"POT-Creation-Date: 2004-12-22 12:51+0100\n"
 "PO-Revision-Date: 2002-06-10 01:27+0900\n"
 "Last-Translator: Takeshi Aihana <aihana@gnome.gr.jp>\n"
 "Language-Team: Japanese <translation@gnome.gr.jp>\n"
 "PO-Revision-Date: 2002-06-10 01:27+0900\n"
 "Last-Translator: Takeshi Aihana <aihana@gnome.gr.jp>\n"
 "Language-Team: Japanese <translation@gnome.gr.jp>\n"
@@ -150,7 +150,7 @@ msgstr "自動的に XScreenSaver を起動するまでの時間です。"
 msgid "minutes"
 msgstr "分後"
 
 msgid "minutes"
 msgstr "分後"
 
-#: driver/demo-Gtk-widgets.c:482 driver/demo-Gtk.c:2845
+#: driver/demo-Gtk-widgets.c:482 driver/demo-Gtk.c:2852
 #: driver/xscreensaver-demo.glade.h:58
 msgid "Preview"
 msgstr "プレビュー"
 #: driver/xscreensaver-demo.glade.h:58
 msgid "Preview"
 msgstr "プレビュー"
@@ -197,12 +197,12 @@ msgstr "一つのスクリーンセーバーのみ"
 msgid "Random Screen Saver"
 msgstr "ランダムなスクリーンセーバー"
 
 msgid "Random Screen Saver"
 msgstr "ランダムなスクリーンセーバー"
 
-#: driver/demo-Gtk-widgets.c:571 driver/demo-Gtk.c:2134
+#: driver/demo-Gtk-widgets.c:571 driver/demo-Gtk.c:2141
 #: driver/xscreensaver-demo.glade.h:75
 msgid "Use"
 msgstr "ON"
 
 #: driver/xscreensaver-demo.glade.h:75
 msgid "Use"
 msgstr "ON"
 
-#: driver/demo-Gtk-widgets.c:591 driver/demo-Gtk.c:2144
+#: driver/demo-Gtk-widgets.c:591 driver/demo-Gtk.c:2151
 #: driver/xscreensaver-demo.glade.h:63
 msgid "Screen Saver"
 msgstr "スクリーンセーバー名"
 #: driver/xscreensaver-demo.glade.h:63
 msgid "Screen Saver"
 msgstr "スクリーンセーバー名"
@@ -451,7 +451,7 @@ msgid "Visual:"
 msgstr "表示:"
 
 #: driver/demo-Gtk-widgets.c:1550 driver/demo-Gtk-widgets.c:1573
 msgstr "表示:"
 
 #: driver/demo-Gtk-widgets.c:1550 driver/demo-Gtk-widgets.c:1573
-#: driver/demo-Gtk.c:1538 driver/demo-Gtk.c:2864
+#: driver/demo-Gtk.c:1545 driver/demo-Gtk.c:2871
 #: driver/xscreensaver-demo.glade.h:5 driver/xscreensaver-demo.glade2.h:3
 msgid "Any"
 msgstr "任せる"
 #: driver/xscreensaver-demo.glade.h:5 driver/xscreensaver-demo.glade2.h:3
 msgid "Any"
 msgstr "任せる"
@@ -554,7 +554,7 @@ msgstr "標準オプション <<"
 msgid "Back to the graphical configuration options."
 msgstr "標準の設定に戻ります。"
 
 msgid "Back to the graphical configuration options."
 msgstr "標準の設定に戻ります。"
 
-#: driver/demo-Gtk-widgets.c:1709 driver/demo-Gtk.c:741
+#: driver/demo-Gtk-widgets.c:1709 driver/demo-Gtk.c:748
 #: driver/xscreensaver-demo.glade.h:54
 msgid "OK"
 msgstr "OK"
 #: driver/xscreensaver-demo.glade.h:54
 msgid "OK"
 msgstr "OK"
@@ -563,11 +563,11 @@ msgstr "OK"
 msgid "Cancel"
 msgstr "キャンセル"
 
 msgid "Cancel"
 msgstr "キャンセル"
 
-#: driver/demo-Gtk.c:649
+#: driver/demo-Gtk.c:656
 msgid "For updates, check http://www.jwz.org/xscreensaver/"
 msgstr "更新情報については http://www.jwz.org/xscreensaver/ を参照して下さい。"
 
 msgid "For updates, check http://www.jwz.org/xscreensaver/"
 msgstr "更新情報については http://www.jwz.org/xscreensaver/ を参照して下さい。"
 
-#: driver/demo-Gtk.c:779
+#: driver/demo-Gtk.c:786
 msgid ""
 "Error:\n"
 "\n"
 msgid ""
 "Error:\n"
 "\n"
@@ -577,7 +577,7 @@ msgstr ""
 "\n"
 "ヘルプの URL が指定されていません。\n"
 
 "\n"
 "ヘルプの URL が指定されていません。\n"
 
-#: driver/demo-Gtk.c:865
+#: driver/demo-Gtk.c:872
 msgid ""
 "Error:\n"
 "\n"
 msgid ""
 "Error:\n"
 "\n"
@@ -589,7 +589,7 @@ msgstr ""
 "XScreenSaver デーモンが正しく起動されていません。\n"
 "\n"
 
 "XScreenSaver デーモンが正しく起動されていません。\n"
 "\n"
 
-#: driver/demo-Gtk.c:877
+#: driver/demo-Gtk.c:884
 msgid ""
 "You are running as root.  This usually means that xscreensaver\n"
 "was unable to contact your X server because access control is\n"
 msgid ""
 "You are running as root.  This usually means that xscreensaver\n"
 "was unable to contact your X server because access control is\n"
@@ -623,11 +623,11 @@ msgstr ""
 "root 権限で X サーバを起動しないで下さい。必要であれば、\n"
 "一般ユーザでログインして 'su' コマンドで代用して下さい。"
 
 "root 権限で X サーバを起動しないで下さい。必要であれば、\n"
 "一般ユーザでログインして 'su' コマンドで代用して下さい。"
 
-#: driver/demo-Gtk.c:893
+#: driver/demo-Gtk.c:900
 msgid "Please check your $PATH and permissions."
 msgstr "環境変数 $PATH とその権限を確認して下さい。"
 
 msgid "Please check your $PATH and permissions."
 msgstr "環境変数 $PATH とその権限を確認して下さい。"
 
-#: driver/demo-Gtk.c:928
+#: driver/demo-Gtk.c:935
 msgid ""
 "Error:\n"
 "\n"
 msgid ""
 "Error:\n"
 "\n"
@@ -637,7 +637,7 @@ msgstr ""
 "\n"
 "初期化ファイル名を特定できませんでした!\n"
 
 "\n"
 "初期化ファイル名を特定できませんでした!\n"
 
-#: driver/demo-Gtk.c:933
+#: driver/demo-Gtk.c:940
 #, c-format
 msgid ""
 "Error:\n"
 #, c-format
 msgid ""
 "Error:\n"
@@ -648,7 +648,7 @@ msgstr ""
 "\n"
 "%s に書き込めませんでした。\n"
 
 "\n"
 "%s に書き込めませんでした。\n"
 
-#: driver/demo-Gtk.c:992
+#: driver/demo-Gtk.c:999
 msgid ""
 "Error:\n"
 "\n"
 msgid ""
 "Error:\n"
 "\n"
@@ -658,7 +658,7 @@ msgstr ""
 "\n"
 "リソース 'manualCommand' がセットされていません。"
 
 "\n"
 "リソース 'manualCommand' がセットされていません。"
 
-#: driver/demo-Gtk.c:1173
+#: driver/demo-Gtk.c:1180
 #, c-format
 msgid ""
 "Error:\n"
 #, c-format
 msgid ""
 "Error:\n"
@@ -669,7 +669,7 @@ msgstr ""
 "\n"
 "時刻の書式を解析できません: \"%s\"\n"
 
 "\n"
 "時刻の書式を解析できません: \"%s\"\n"
 
-#: driver/demo-Gtk.c:1829
+#: driver/demo-Gtk.c:1836
 #, c-format
 msgid ""
 "Error:\n"
 #, c-format
 msgid ""
 "Error:\n"
@@ -680,28 +680,28 @@ msgstr ""
 "\n"
 "ディレクトリが存在しません: \"%s\"\n"
 
 "\n"
 "ディレクトリが存在しません: \"%s\"\n"
 
-#: driver/demo-Gtk.c:2546
+#: driver/demo-Gtk.c:2553
 msgid "Descriptions not available: no XML support compiled in."
 msgstr "説明が有効ではありません: XML サポートでコンパイルされていません。"
 
 msgid "Descriptions not available: no XML support compiled in."
 msgstr "説明が有効ではありません: XML サポートでコンパイルされていません。"
 
-#: driver/demo-Gtk.c:2551
+#: driver/demo-Gtk.c:2558
 msgid "No description available."
 msgstr "有効な説明はありません。"
 
 msgid "No description available."
 msgstr "有効な説明はありません。"
 
-#: driver/demo-Gtk.c:2816
+#: driver/demo-Gtk.c:2823
 msgid "Blank Screen"
 msgstr "ブランク・スクリーン"
 
 msgid "Blank Screen"
 msgstr "ブランク・スクリーン"
 
-#: driver/demo-Gtk.c:2822
+#: driver/demo-Gtk.c:2829
 msgid "Screen Saver Disabled"
 msgstr "スクリーンセーバーは無効です"
 
 msgid "Screen Saver Disabled"
 msgstr "スクリーンセーバーは無効です"
 
-#: driver/demo-Gtk.c:2855
+#: driver/demo-Gtk.c:2862
 #, c-format
 msgid "%s: %.100s Settings"
 msgstr ""
 
 #, c-format
 msgid "%s: %.100s Settings"
 msgstr ""
 
-#: driver/demo-Gtk.c:3010
+#: driver/demo-Gtk.c:3017
 #, c-format
 msgid ""
 "Warning:\n"
 #, c-format
 msgid ""
 "Warning:\n"
@@ -712,23 +712,23 @@ msgstr ""
 "\n"
 "ファイル \"%s\" が変更されました。再読込みします。\n"
 
 "\n"
 "ファイル \"%s\" が変更されました。再読込みします。\n"
 
-#: driver/demo-Gtk.c:3092
+#: driver/demo-Gtk.c:3099
 msgid "No Preview"
 msgstr "プレビューは"
 
 msgid "No Preview"
 msgstr "プレビューは"
 
-#: driver/demo-Gtk.c:3092
+#: driver/demo-Gtk.c:3099
 msgid "Available"
 msgstr "無効です。"
 
 msgid "Available"
 msgstr "無効です。"
 
-#: driver/demo-Gtk.c:3093
+#: driver/demo-Gtk.c:3100
 msgid "Not"
 msgstr ""
 
 msgid "Not"
 msgstr ""
 
-#: driver/demo-Gtk.c:3093
+#: driver/demo-Gtk.c:3100
 msgid "Installed"
 msgstr ""
 
 msgid "Installed"
 msgstr ""
 
-#: driver/demo-Gtk.c:3858
+#: driver/demo-Gtk.c:3865
 #, c-format
 msgid ""
 "Warning:\n"
 #, c-format
 msgid ""
 "Warning:\n"
@@ -741,7 +741,7 @@ msgstr ""
 "ディスプレイ \"%s\" 上で XScreenSaver デーモンが\n"
 "起動されていないようです。起動しますか?"
 
 "ディスプレイ \"%s\" 上で XScreenSaver デーモンが\n"
 "起動されていないようです。起動しますか?"
 
-#: driver/demo-Gtk.c:3868
+#: driver/demo-Gtk.c:3875
 #, c-format
 msgid ""
 "Warning:\n"
 #, c-format
 msgid ""
 "Warning:\n"
@@ -774,7 +774,7 @@ msgstr ""
 "\n"
 "XScreenSaver デモを再起動しますか?\n"
 
 "\n"
 "XScreenSaver デモを再起動しますか?\n"
 
-#: driver/demo-Gtk.c:3893
+#: driver/demo-Gtk.c:3900
 #, c-format
 msgid ""
 "Warning:\n"
 #, c-format
 msgid ""
 "Warning:\n"
@@ -801,7 +801,7 @@ msgstr ""
 "\n"
 "XScreenSaver デーモンを \"%s\" 上で \"%s\" から再起動しますか?\n"
 
 "\n"
 "XScreenSaver デーモンを \"%s\" 上で \"%s\" から再起動しますか?\n"
 
-#: driver/demo-Gtk.c:3915
+#: driver/demo-Gtk.c:3922
 #, c-format
 msgid ""
 "Warning:\n"
 #, c-format
 msgid ""
 "Warning:\n"
@@ -820,12 +820,12 @@ msgstr ""
 "\n"
 "XScreenSaver デーモンを再起動しますか?\n"
 
 "\n"
 "XScreenSaver デーモンを再起動しますか?\n"
 
-#: driver/demo-Gtk.c:4372
+#: driver/demo-Gtk.c:4379
 #, c-format
 msgid "%s: unknown option: %s\n"
 msgstr "%s: 不明なオプション: %s\n"
 
 #, c-format
 msgid "%s: unknown option: %s\n"
 msgstr "%s: 不明なオプション: %s\n"
 
-#: driver/demo-Gtk.c:4436
+#: driver/demo-Gtk.c:4443
 #, fuzzy
 msgid "Screensaver Preferences"
 msgstr "スクリーンセーバー"
 #, fuzzy
 msgid "Screensaver Preferences"
 msgstr "スクリーンセーバー"
@@ -1076,22 +1076,23 @@ msgstr ""
 #: 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/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:5 hacks/config/flyingtoasters.xml.h:5
-#: hacks/config/fontglide.xml.h:4 hacks/config/forest.xml.h:1
-#: hacks/config/fuzzyflakes.xml.h:7 hacks/config/galaxy.xml.h:3
-#: hacks/config/gears.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:6
-#: 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/fadeplot.xml.h:4 hacks/config/fireworkx.xml.h:3
+#: 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:2 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/fuzzyflakes.xml.h:7
+#: hacks/config/galaxy.xml.h:3 hacks/config/gears.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:6 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/intermomentary.xml.h:1 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/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
@@ -1109,23 +1110,24 @@ msgstr ""
 #: hacks/config/pacman.xml.h:1 hacks/config/penetrate.xml.h:3
 #: hacks/config/penrose.xml.h:6 hacks/config/petri.xml.h:5
 #: hacks/config/phosphor.xml.h:4 hacks/config/piecewise.xml.h:4
 #: hacks/config/pacman.xml.h:1 hacks/config/penetrate.xml.h:3
 #: hacks/config/penrose.xml.h:6 hacks/config/petri.xml.h:5
 #: hacks/config/phosphor.xml.h:4 hacks/config/piecewise.xml.h:4
-#: hacks/config/pipes.xml.h:5 hacks/config/polyhedra.xml.h:18
-#: hacks/config/polyominoes.xml.h:2 hacks/config/polytopes.xml.h:11
-#: hacks/config/pong.xml.h:1 hacks/config/popsquares.xml.h:3
-#: hacks/config/providence.xml.h:2 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 hacks/config/rocks.xml.h:4
-#: hacks/config/rotor.xml.h:3 hacks/config/rubik.xml.h:3
-#: hacks/config/sballs.xml.h:4 hacks/config/shadebobs.xml.h:3
-#: hacks/config/sierpinski.xml.h:2 hacks/config/sierpinski3d.xml.h:2
-#: hacks/config/slidescreen.xml.h:2 hacks/config/slip.xml.h:2
-#: hacks/config/speedmine.xml.h:3 hacks/config/sphere.xml.h:2
-#: hacks/config/spheremonics.xml.h:5 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:1 hacks/config/superquadrics.xml.h:4
+#: hacks/config/pinion.xml.h:5 hacks/config/pipes.xml.h:5
+#: hacks/config/polyhedra.xml.h:18 hacks/config/polyominoes.xml.h:2
+#: hacks/config/polytopes.xml.h:11 hacks/config/pong.xml.h:1
+#: hacks/config/popsquares.xml.h:3 hacks/config/providence.xml.h:2
+#: 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
+#: hacks/config/rocks.xml.h:4 hacks/config/rotor.xml.h:3
+#: hacks/config/rubik.xml.h:3 hacks/config/sballs.xml.h:4
+#: hacks/config/shadebobs.xml.h:3 hacks/config/sierpinski.xml.h:2
+#: hacks/config/sierpinski3d.xml.h:2 hacks/config/slidescreen.xml.h:2
+#: hacks/config/slip.xml.h:2 hacks/config/speedmine.xml.h:3
+#: hacks/config/sphere.xml.h:2 hacks/config/spheremonics.xml.h:5
+#: 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:1
+#: hacks/config/substrate.xml.h:2 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/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
@@ -1147,8 +1149,9 @@ msgstr ""
 #: hacks/config/fuzzyflakes.xml.h:8 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/fuzzyflakes.xml.h:8 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/wormhole.xml.h:3 hacks/config/xfishtank.xml.h:4
+#: hacks/config/substrate.xml.h:3 hacks/config/thornbird.xml.h:3
+#: hacks/config/whirlwindwarp.xml.h:1 hacks/config/wormhole.xml.h:3
+#: hacks/config/xfishtank.xml.h:4
 msgid "Few"
 msgstr ""
 
 msgid "Few"
 msgstr ""
 
@@ -1164,7 +1167,7 @@ msgstr ""
 #: hacks/config/epicycle.xml.h:8 hacks/config/eruption.xml.h:12
 #: hacks/config/euler2d.xml.h:8 hacks/config/fadeplot.xml.h:6
 #: hacks/config/flag.xml.h:5 hacks/config/flame.xml.h:11
 #: hacks/config/epicycle.xml.h:8 hacks/config/eruption.xml.h:12
 #: hacks/config/euler2d.xml.h:8 hacks/config/fadeplot.xml.h:6
 #: hacks/config/flag.xml.h:5 hacks/config/flame.xml.h:11
-#: hacks/config/flow.xml.h:8 hacks/config/fluidballs.xml.h:13
+#: hacks/config/flow.xml.h:7 hacks/config/fluidballs.xml.h:13
 #: hacks/config/forest.xml.h:3 hacks/config/fuzzyflakes.xml.h:12
 #: 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/forest.xml.h:3 hacks/config/fuzzyflakes.xml.h:12
 #: hacks/config/galaxy.xml.h:6 hacks/config/grav.xml.h:4
 #: hacks/config/halo.xml.h:4 hacks/config/hopalong.xml.h:15
@@ -1202,7 +1205,7 @@ msgstr ""
 #: 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/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/flow.xml.h:8 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/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
@@ -1256,22 +1259,23 @@ msgstr ""
 #: 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/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/flyingtoasters.xml.h:11
-#: hacks/config/fontglide.xml.h:13 hacks/config/forest.xml.h:5
-#: hacks/config/fuzzyflakes.xml.h:15 hacks/config/galaxy.xml.h:10
-#: hacks/config/gears.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:8 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:10 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/fadeplot.xml.h:8 hacks/config/fireworkx.xml.h:9
+#: 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:10 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/fuzzyflakes.xml.h:15
+#: hacks/config/galaxy.xml.h:11 hacks/config/gears.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:8
+#: 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:10
+#: 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/intermomentary.xml.h:4 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/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
@@ -1289,23 +1293,24 @@ msgstr ""
 #: hacks/config/pacman.xml.h:5 hacks/config/penetrate.xml.h:6
 #: hacks/config/penrose.xml.h:11 hacks/config/petri.xml.h:23
 #: hacks/config/phosphor.xml.h:7 hacks/config/piecewise.xml.h:9
 #: hacks/config/pacman.xml.h:5 hacks/config/penetrate.xml.h:6
 #: hacks/config/penrose.xml.h:11 hacks/config/petri.xml.h:23
 #: hacks/config/phosphor.xml.h:7 hacks/config/piecewise.xml.h:9
-#: hacks/config/pipes.xml.h:15 hacks/config/polyhedra.xml.h:119
-#: hacks/config/polyominoes.xml.h:10 hacks/config/polytopes.xml.h:20
-#: hacks/config/pong.xml.h:4 hacks/config/popsquares.xml.h:5
-#: hacks/config/providence.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 hacks/config/rocks.xml.h:9
-#: hacks/config/rotor.xml.h:11 hacks/config/rubik.xml.h:9
-#: hacks/config/sballs.xml.h:13 hacks/config/shadebobs.xml.h:9
-#: hacks/config/sierpinski.xml.h:7 hacks/config/sierpinski3d.xml.h:8
-#: hacks/config/slidescreen.xml.h:6 hacks/config/slip.xml.h:7
-#: hacks/config/speedmine.xml.h:13 hacks/config/sphere.xml.h:5
-#: hacks/config/spheremonics.xml.h:19 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:4 hacks/config/superquadrics.xml.h:8
+#: hacks/config/pinion.xml.h:13 hacks/config/pipes.xml.h:15
+#: hacks/config/polyhedra.xml.h:119 hacks/config/polyominoes.xml.h:10
+#: hacks/config/polytopes.xml.h:20 hacks/config/pong.xml.h:4
+#: hacks/config/popsquares.xml.h:5 hacks/config/providence.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
+#: hacks/config/rocks.xml.h:9 hacks/config/rotor.xml.h:11
+#: hacks/config/rubik.xml.h:9 hacks/config/sballs.xml.h:13
+#: hacks/config/shadebobs.xml.h:9 hacks/config/sierpinski.xml.h:7
+#: hacks/config/sierpinski3d.xml.h:8 hacks/config/slidescreen.xml.h:6
+#: hacks/config/slip.xml.h:7 hacks/config/speedmine.xml.h:13
+#: hacks/config/sphere.xml.h:5 hacks/config/spheremonics.xml.h:19
+#: 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:4
+#: hacks/config/substrate.xml.h:10 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/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
@@ -1338,17 +1343,18 @@ msgstr ""
 #: hacks/config/engine.xml.h:16 hacks/config/epicycle.xml.h:11
 #: 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/engine.xml.h:16 hacks/config/epicycle.xml.h:11
 #: 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/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/fuzzyflakes.xml.h:17
-#: hacks/config/galaxy.xml.h:11 hacks/config/glblur.xml.h:17
-#: hacks/config/glforestfire.xml.h:15 hacks/config/glplanet.xml.h:10
-#: 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:11 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/fireworkx.xml.h:11 hacks/config/flag.xml.h:9
+#: hacks/config/flame.xml.h:15 hacks/config/flipflop.xml.h:7
+#: hacks/config/flipscreen3d.xml.h:7 hacks/config/flow.xml.h:12
+#: hacks/config/fluidballs.xml.h:20 hacks/config/forest.xml.h:6
+#: hacks/config/fuzzyflakes.xml.h:17 hacks/config/galaxy.xml.h:12
+#: hacks/config/glblur.xml.h:17 hacks/config/glforestfire.xml.h:15
+#: hacks/config/glplanet.xml.h:10 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:11
+#: 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/intermomentary.xml.h:5 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/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
@@ -1377,16 +1383,16 @@ msgstr ""
 #: 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/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/xplanet.xml.h:60 hacks/config/xrayswarm.xml.h:4
-#: hacks/config/zoom.xml.h:7
+#: hacks/config/strange.xml.h:5 hacks/config/substrate.xml.h:11
+#: 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/xplanet.xml.h:60
+#: hacks/config/xrayswarm.xml.h:4 hacks/config/zoom.xml.h:7
 msgid "Speed"
 msgstr ""
 
 msgid "Speed"
 msgstr ""
 
@@ -1429,8 +1435,8 @@ msgstr ""
 #: hacks/config/discrete.xml.h:11 hacks/config/drift.xml.h:14
 #: hacks/config/epicycle.xml.h:13 hacks/config/euler2d.xml.h:17
 #: hacks/config/fadeplot.xml.h:12 hacks/config/flag.xml.h:13
 #: hacks/config/discrete.xml.h:11 hacks/config/drift.xml.h:14
 #: hacks/config/epicycle.xml.h:13 hacks/config/euler2d.xml.h:17
 #: hacks/config/fadeplot.xml.h:12 hacks/config/flag.xml.h:13
-#: hacks/config/flame.xml.h:16 hacks/config/flow.xml.h:18
-#: hacks/config/forest.xml.h:8 hacks/config/galaxy.xml.h:13
+#: hacks/config/flame.xml.h:16 hacks/config/flow.xml.h:15
+#: hacks/config/forest.xml.h:8 hacks/config/galaxy.xml.h:14
 #: hacks/config/grav.xml.h:11 hacks/config/halo.xml.h:13
 #: hacks/config/hopalong.xml.h:25 hacks/config/ifs.xml.h:8
 #: hacks/config/imsmap.xml.h:15 hacks/config/interference.xml.h:19
 #: hacks/config/grav.xml.h:11 hacks/config/halo.xml.h:13
 #: hacks/config/hopalong.xml.h:25 hacks/config/ifs.xml.h:8
 #: hacks/config/imsmap.xml.h:15 hacks/config/interference.xml.h:19
@@ -1527,7 +1533,7 @@ msgstr ""
 #: 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/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/flag.xml.h:4 hacks/config/flow.xml.h:4
 #: hacks/config/fluidballs.xml.h:12 hacks/config/fuzzyflakes.xml.h:10
 #: 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/fluidballs.xml.h:12 hacks/config/fuzzyflakes.xml.h:10
 #: hacks/config/gleidescope.xml.h:7 hacks/config/halftone.xml.h:8
 #: hacks/config/hopalong.xml.h:13 hacks/config/interference.xml.h:11
@@ -1559,7 +1565,7 @@ msgstr ""
 #: 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/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/flag.xml.h:8 hacks/config/flow.xml.h:11
 #: hacks/config/fluidballs.xml.h:19 hacks/config/fuzzyflakes.xml.h:16
 #: 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/fluidballs.xml.h:19 hacks/config/fuzzyflakes.xml.h:16
 #: hacks/config/gleidescope.xml.h:12 hacks/config/halftone.xml.h:14
 #: hacks/config/hopalong.xml.h:22 hacks/config/interference.xml.h:18
@@ -1578,7 +1584,7 @@ msgstr ""
 
 #: 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/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/flag.xml.h:12 hacks/config/flow.xml.h:14
 #: hacks/config/lissie.xml.h:12 hacks/config/loop.xml.h:11
 #: hacks/config/rubik.xml.h:12 hacks/config/sierpinski.xml.h:11
 #: hacks/config/slip.xml.h:11
 #: hacks/config/lissie.xml.h:12 hacks/config/loop.xml.h:11
 #: hacks/config/rubik.xml.h:12 hacks/config/sierpinski.xml.h:11
 #: hacks/config/slip.xml.h:11
@@ -1628,13 +1634,14 @@ msgstr ""
 #: hacks/config/menger.xml.h:15 hacks/config/mirrorblob.xml.h:18
 #: hacks/config/moebius.xml.h:6 hacks/config/molecule.xml.h:21
 #: hacks/config/morph3d.xml.h:5 hacks/config/noof.xml.h:4
 #: hacks/config/menger.xml.h:15 hacks/config/mirrorblob.xml.h:18
 #: hacks/config/moebius.xml.h:6 hacks/config/molecule.xml.h:21
 #: hacks/config/morph3d.xml.h:5 hacks/config/noof.xml.h:4
-#: hacks/config/pipes.xml.h:14 hacks/config/polyhedra.xml.h:118
-#: hacks/config/polytopes.xml.h:18 hacks/config/providence.xml.h:4
-#: 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
+#: hacks/config/pinion.xml.h:12 hacks/config/pipes.xml.h:14
+#: hacks/config/polyhedra.xml.h:118 hacks/config/polytopes.xml.h:18
+#: hacks/config/providence.xml.h:4 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 ""
 
 msgid "Show Frames-per-Second"
 msgstr ""
 
@@ -1793,11 +1800,12 @@ msgstr ""
 #: hacks/config/lament.xml.h:9 hacks/config/lavalite.xml.h:32
 #: hacks/config/menger.xml.h:21 hacks/config/mirrorblob.xml.h:24
 #: hacks/config/moebius.xml.h:11 hacks/config/molecule.xml.h:26
 #: hacks/config/lament.xml.h:9 hacks/config/lavalite.xml.h:32
 #: hacks/config/menger.xml.h:21 hacks/config/mirrorblob.xml.h:24
 #: hacks/config/moebius.xml.h:11 hacks/config/molecule.xml.h:26
-#: hacks/config/polyhedra.xml.h:173 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
+#: hacks/config/pinion.xml.h:15 hacks/config/polyhedra.xml.h:173
+#: 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 ""
 
 msgid "Wireframe"
 msgstr ""
 
@@ -1885,14 +1893,15 @@ msgstr ""
 #: 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/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/mismunch.xml.h:3
-#: 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 hacks/config/spheremonics.xml.h:7
+#: hacks/config/flow.xml.h:6 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/mismunch.xml.h:3 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
+#: hacks/config/spheremonics.xml.h:7 hacks/config/substrate.xml.h:6
 #: hacks/config/wander.xml.h:10 hacks/config/whirlwindwarp.xml.h:3
 msgid "Long"
 msgstr ""
 #: hacks/config/wander.xml.h:10 hacks/config/whirlwindwarp.xml.h:3
 msgid "Long"
 msgstr ""
@@ -1939,13 +1948,14 @@ msgstr ""
 #: 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/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/metaballs.xml.h:12 hacks/config/mismunch.xml.h:8
-#: 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/flow.xml.h:9 hacks/config/galaxy.xml.h:9
+#: hacks/config/klein.xml.h:5 hacks/config/laser.xml.h:9
+#: hacks/config/menger.xml.h:14 hacks/config/metaballs.xml.h:12
+#: hacks/config/mismunch.xml.h:8 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/substrate.xml.h:9
 #: hacks/config/wander.xml.h:12 hacks/config/whirlwindwarp.xml.h:6
 msgid "Short"
 msgstr ""
 #: hacks/config/wander.xml.h:12 hacks/config/whirlwindwarp.xml.h:6
 msgid "Short"
 msgstr ""
@@ -2143,10 +2153,10 @@ msgstr ""
 #: 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/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/polyhedra.xml.h:3 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/wormhole.xml.h:1
-#: hacks/config/xfishtank.xml.h:1
+#: hacks/config/pinion.xml.h:3 hacks/config/polyhedra.xml.h:3
+#: 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/wormhole.xml.h:1 hacks/config/xfishtank.xml.h:1
 msgid "Animation Speed"
 msgstr ""
 
 msgid "Animation Speed"
 msgstr ""
 
@@ -2222,8 +2232,9 @@ msgstr ""
 #: 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/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/starfish.xml.h:2 hacks/config/substrate.xml.h:1
+#: hacks/config/vidwhacker.xml.h:3 hacks/config/wander.xml.h:7
+#: hacks/config/xspirograph.xml.h:3
 msgid "Duration"
 msgstr ""
 
 msgid "Duration"
 msgstr ""
 
@@ -2470,7 +2481,7 @@ msgstr ""
 msgid "Rotate"
 msgstr ""
 
 msgid "Rotate"
 msgstr ""
 
-#: hacks/config/circuit.xml.h:8
+#: hacks/config/circuit.xml.h:8 hacks/config/pinion.xml.h:10
 msgid "Rotation Speed"
 msgstr ""
 
 msgid "Rotation Speed"
 msgstr ""
 
@@ -2553,11 +2564,12 @@ msgstr ""
 msgid "Coral"
 msgstr ""
 
 msgid "Coral"
 msgstr ""
 
-#: hacks/config/coral.xml.h:4 hacks/config/gflux.xml.h:3
-#: hacks/config/glblur.xml.h:2 hacks/config/glmatrix.xml.h:3
-#: 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
+#: hacks/config/coral.xml.h:4 hacks/config/fireworkx.xml.h:2
+#: hacks/config/gflux.xml.h:3 hacks/config/glblur.xml.h:2
+#: hacks/config/glmatrix.xml.h:3 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
 msgid "Dense"
 msgstr ""
 
 msgid "Dense"
 msgstr ""
 
@@ -2570,12 +2582,12 @@ msgid ""
 "Simulates coral growth, albeit somewhat slowly. Written by Frederick Roeber."
 msgstr ""
 
 "Simulates coral growth, albeit somewhat slowly. Written by Frederick Roeber."
 msgstr ""
 
-#: hacks/config/coral.xml.h:13 hacks/config/gflux.xml.h:13
-#: hacks/config/glblur.xml.h:16 hacks/config/glmatrix.xml.h:19
-#: hacks/config/imsmap.xml.h:13 hacks/config/lavalite.xml.h:29
-#: hacks/config/pyro.xml.h:14 hacks/config/qix.xml.h:21
-#: hacks/config/squiral.xml.h:15 hacks/config/xearth.xml.h:24
-#: hacks/config/xmatrix.xml.h:17
+#: hacks/config/coral.xml.h:13 hacks/config/fireworkx.xml.h:10
+#: hacks/config/gflux.xml.h:13 hacks/config/glblur.xml.h:16
+#: hacks/config/glmatrix.xml.h:19 hacks/config/imsmap.xml.h:13
+#: hacks/config/lavalite.xml.h:29 hacks/config/pyro.xml.h:14
+#: hacks/config/qix.xml.h:21 hacks/config/squiral.xml.h:15
+#: hacks/config/xearth.xml.h:24 hacks/config/xmatrix.xml.h:17
 msgid "Sparse"
 msgstr ""
 
 msgid "Sparse"
 msgstr ""
 
@@ -2604,7 +2616,7 @@ msgid "Center on Screen"
 msgstr ""
 
 #: hacks/config/crystal.xml.h:2 hacks/config/deluxe.xml.h:1
 msgstr ""
 
 #: hacks/config/crystal.xml.h:2 hacks/config/deluxe.xml.h:1
-#: hacks/config/fadeplot.xml.h:1 hacks/config/flow.xml.h:3
+#: hacks/config/fadeplot.xml.h:1 hacks/config/flow.xml.h:1
 #: hacks/config/galaxy.xml.h:1 hacks/config/glforestfire.xml.h:1
 #: hacks/config/grav.xml.h:1 hacks/config/julia.xml.h:1
 #: hacks/config/laser.xml.h:1 hacks/config/lisa.xml.h:1
 #: hacks/config/galaxy.xml.h:1 hacks/config/glforestfire.xml.h:1
 #: hacks/config/grav.xml.h:1 hacks/config/julia.xml.h:1
 #: hacks/config/laser.xml.h:1 hacks/config/lisa.xml.h:1
@@ -3348,7 +3360,7 @@ msgstr ""
 msgid "Half"
 msgstr ""
 
 msgid "Half"
 msgstr ""
 
-#: hacks/config/fireflies.xml.h:17
+#: hacks/config/fireflies.xml.h:17 hacks/config/pinion.xml.h:7
 msgid "Huge"
 msgstr ""
 
 msgid "Huge"
 msgstr ""
 
@@ -3437,7 +3449,7 @@ msgstr ""
 msgid "Swarm tails glow"
 msgstr ""
 
 msgid "Swarm tails glow"
 msgstr ""
 
-#: hacks/config/fireflies.xml.h:43
+#: hacks/config/fireflies.xml.h:43 hacks/config/pinion.xml.h:14
 msgid "Tiny"
 msgstr ""
 
 msgid "Tiny"
 msgstr ""
 
@@ -3453,6 +3465,31 @@ msgstr ""
 msgid "Wind picks up"
 msgstr ""
 
 msgid "Wind picks up"
 msgstr ""
 
+#: hacks/config/fireworkx.xml.h:1 hacks/config/lavalite.xml.h:3
+msgid "Activity"
+msgstr ""
+
+#: hacks/config/fireworkx.xml.h:4
+msgid "Fast Fade (more realistic)"
+msgstr ""
+
+#: hacks/config/fireworkx.xml.h:5
+#, fuzzy
+msgid "Fireworkx"
+msgstr "ファイル(_F)"
+
+#: hacks/config/fireworkx.xml.h:6
+msgid "Light effect"
+msgstr ""
+
+#: hacks/config/fireworkx.xml.h:7
+msgid "Pyrotechnics simulation eye-candy. Written by Rony B. Chandran."
+msgstr ""
+
+#: hacks/config/fireworkx.xml.h:8
+msgid "Shoot"
+msgstr ""
+
 #: hacks/config/flag.xml.h:1
 msgid "Bitmap for Flag"
 msgstr ""
 #: hacks/config/flag.xml.h:1
 msgid "Bitmap for Flag"
 msgstr ""
@@ -3526,42 +3563,42 @@ msgid ""
 "around and deforms it in various ways. Written by Ben Buxton."
 msgstr ""
 
 "around and deforms it in various ways. Written by Ben Buxton."
 msgstr ""
 
-#: hacks/config/flow.xml.h:1
-msgid "Allow 2D Attractors"
+#: hacks/config/flow.xml.h:3
+msgid "Flow"
 msgstr ""
 
 msgstr ""
 
-#: hacks/config/flow.xml.h:2
-msgid ""
-"Another series of strange attractors: a flowing series of points, making "
-"strange rotational shapes. Written by Tim Auckland."
+#: hacks/config/flow.xml.h:5
+msgid "Length of trails"
 msgstr ""
 
 msgstr ""
 
-#: hacks/config/flow.xml.h:5
-msgid "Flow"
+#: hacks/config/flow.xml.h:13
+msgid ""
+"Strange attractors formed of flows in a 3D differential equation phase "
+"space. Written by Tim Auckland."
 msgstr ""
 
 msgstr ""
 
-#: hacks/config/flow.xml.h:6
-msgid "Freeze Some Bees"
+#: hacks/config/flow.xml.h:16
+msgid "turn on/off bounding box."
 msgstr ""
 
 msgstr ""
 
-#: hacks/config/flow.xml.h:10
-msgid "Ride a Trained Bee"
+#: hacks/config/flow.xml.h:17
+msgid "turn on/off double buffering."
 msgstr ""
 
 msgstr ""
 
-#: hacks/config/flow.xml.h:11
-msgid "Rotate Around Attractor"
+#: hacks/config/flow.xml.h:18
+msgid "turn on/off periodic attractors."
 msgstr ""
 
 msgstr ""
 
-#: hacks/config/flow.xml.h:12
-msgid "Show Bounding Box"
+#: hacks/config/flow.xml.h:19
+msgid "turn on/off ride in the flow."
 msgstr ""
 
 msgstr ""
 
-#: hacks/config/flow.xml.h:14
-msgid "Slow Bees with Antifreeze"
+#: hacks/config/flow.xml.h:20
+msgid "turn on/off rotating around attractor."
 msgstr ""
 
 msgstr ""
 
-#: hacks/config/flow.xml.h:19
-msgid "Zoom In and Out"
+#: hacks/config/flow.xml.h:21
+msgid "turn on/off search for new attractors."
 msgstr ""
 
 #: hacks/config/fluidballs.xml.h:1
 msgstr ""
 
 #: hacks/config/fluidballs.xml.h:1
@@ -3767,7 +3804,11 @@ msgstr ""
 msgid "Galaxy"
 msgstr ""
 
 msgid "Galaxy"
 msgstr ""
 
-#: hacks/config/galaxy.xml.h:9 hacks/config/lisa.xml.h:7
+#: hacks/config/galaxy.xml.h:8
+msgid "Rotate Viewpoint"
+msgstr ""
+
+#: hacks/config/galaxy.xml.h:10 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/pong.xml.h:3
 #: hacks/config/rotor.xml.h:10 hacks/config/rubik.xml.h:8
 #: hacks/config/lissie.xml.h:8 hacks/config/loop.xml.h:6
 #: hacks/config/penrose.xml.h:10 hacks/config/pong.xml.h:3
 #: hacks/config/rotor.xml.h:10 hacks/config/rubik.xml.h:8
@@ -3776,7 +3817,7 @@ msgstr ""
 msgid "Size"
 msgstr ""
 
 msgid "Size"
 msgstr ""
 
-#: hacks/config/galaxy.xml.h:12
+#: hacks/config/galaxy.xml.h:13
 msgid ""
 "This draws spinning galaxies, which then collide and scatter their stars to "
 "the, uh, four winds or something. Originally an Amiga program by Uli "
 msgid ""
 "This draws spinning galaxies, which then collide and scatter their stars to "
 "the, uh, four winds or something. Originally an Amiga program by Uli "
@@ -4078,9 +4119,9 @@ msgid ""
 "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 "
 "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."
+"of this window: the tab at the top of the *other* window.) 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
 msgstr ""
 
 #: hacks/config/glslideshow.xml.h:17
@@ -4600,6 +4641,26 @@ msgstr ""
 msgid "Wave Size"
 msgstr ""
 
 msgid "Wave Size"
 msgstr ""
 
+#: hacks/config/intermomentary.xml.h:2
+msgid "Intermomentary"
+msgstr ""
+
+#: hacks/config/intermomentary.xml.h:3
+msgid "Number of Discs"
+msgstr ""
+
+#: hacks/config/intermomentary.xml.h:6
+msgid ""
+"The Intersection Momentary is a fun visualization defining the relationships "
+"between objects with Casey Reas, William Ngan, and Robert Hodgin. "
+"Commissioned for display at the Whitney Museum of American Art. A surface "
+"filled with 100 medium to small sized circles. Each circle has a different "
+"size and direction, but moves at the same slow rate. Display: A. The "
+"instantaneous intersections of the circles. B. The aggregate intersections "
+"of the circles. Ported to XScreensaver from the art project \"InterMomentary"
+"\" at http://www.complexification.net"
+msgstr ""
+
 #: hacks/config/jigglypuff.xml.h:2
 msgid "Chrome"
 msgstr ""
 #: hacks/config/jigglypuff.xml.h:2
 msgid "Chrome"
 msgstr ""
@@ -4819,10 +4880,6 @@ msgstr ""
 msgid "10"
 msgstr ""
 
 msgid "10"
 msgstr ""
 
-#: hacks/config/lavalite.xml.h:3
-msgid "Activity"
-msgstr ""
-
 #: hacks/config/lavalite.xml.h:4
 msgid "Classic Lavalite"
 msgstr ""
 #: hacks/config/lavalite.xml.h:4
 msgid "Classic Lavalite"
 msgstr ""
@@ -5537,6 +5594,36 @@ msgid ""
 "invisibility at intersection points. Written by Geoffrey Irving."
 msgstr ""
 
 "invisibility at intersection points. Written by Geoffrey Irving."
 msgstr ""
 
+#: hacks/config/pinion.xml.h:1
+msgid "100"
+msgstr ""
+
+#: hacks/config/pinion.xml.h:2
+msgid "2000"
+msgstr ""
+
+#: hacks/config/pinion.xml.h:4
+msgid ""
+"Draws an interconnected set of gears moving across the screen. Written by "
+"Jamie Zawinski."
+msgstr ""
+
+#: hacks/config/pinion.xml.h:6
+msgid "Gear Size"
+msgstr ""
+
+#: hacks/config/pinion.xml.h:8
+msgid "Max RPM"
+msgstr ""
+
+#: hacks/config/pinion.xml.h:9
+msgid "Pinion"
+msgstr ""
+
+#: hacks/config/pinion.xml.h:11
+msgid "Scrolling Speed"
+msgstr ""
+
 #: hacks/config/pipes.xml.h:1
 msgid "Allow Tight Turns"
 msgstr ""
 #: hacks/config/pipes.xml.h:1
 msgid "Allow Tight Turns"
 msgstr ""
@@ -5563,7 +5650,8 @@ msgid ""
 "probably seen this GL hack. This version is by Marcelo Vianna."
 msgstr ""
 
 "probably seen this GL hack. This version is by Marcelo Vianna."
 msgstr ""
 
-#: hacks/config/pipes.xml.h:9 hacks/config/wormhole.xml.h:4
+#: hacks/config/pipes.xml.h:9 hacks/config/substrate.xml.h:7
+#: hacks/config/wormhole.xml.h:4
 msgid "Lots"
 msgstr ""
 
 msgid "Lots"
 msgstr ""
 
@@ -6770,22 +6858,26 @@ msgid "Ping subnet/30 (2 hosts)"
 msgstr ""
 
 #: hacks/config/sonar.xml.h:10
 msgstr ""
 
 #: hacks/config/sonar.xml.h:10
-msgid "Simulation Team Members"
+msgid "Resolve Host Names"
 msgstr ""
 
 #: hacks/config/sonar.xml.h:11
 msgstr ""
 
 #: hacks/config/sonar.xml.h:11
-msgid "Sonar"
+msgid "Simulation Team Members"
 msgstr ""
 
 #: hacks/config/sonar.xml.h:12
 msgstr ""
 
 #: hacks/config/sonar.xml.h:12
-msgid "Team A Name"
+msgid "Sonar"
 msgstr ""
 
 #: hacks/config/sonar.xml.h:13
 msgstr ""
 
 #: hacks/config/sonar.xml.h:13
-msgid "Team B Name"
+msgid "Team A Name"
 msgstr ""
 
 #: hacks/config/sonar.xml.h:14
 msgstr ""
 
 #: hacks/config/sonar.xml.h:14
+msgid "Team B Name"
+msgstr ""
+
+#: hacks/config/sonar.xml.h:15
 msgid ""
 "This program draws a simulation of a sonar screen. By default, it displays a "
 "random assortment of ``bogies'' on the screen, but if installed as \"setuid "
 msgid ""
 "This program draws a simulation of a sonar screen. By default, it displays a "
 "random assortment of ``bogies'' on the screen, but if installed as \"setuid "
@@ -6794,7 +6886,7 @@ msgid ""
 "Martin and Jamie Zawinski."
 msgstr ""
 
 "Martin and Jamie Zawinski."
 msgstr ""
 
-#: hacks/config/sonar.xml.h:15
+#: hacks/config/sonar.xml.h:16
 msgid "vs."
 msgstr ""
 
 msgid "vs."
 msgstr ""
 
@@ -7067,6 +7159,31 @@ msgid ""
 "Written by Massimino Pascal."
 msgstr ""
 
 "Written by Massimino Pascal."
 msgstr ""
 
+#: hacks/config/substrate.xml.h:4
+#, fuzzy
+msgid "Initial Cracks"
+msgstr "カラーマップをインストールする"
+
+#: hacks/config/substrate.xml.h:5
+msgid ""
+"Lines like crystals grow on a computational substrate. A simple "
+"perpendicular growth rule creates intricate city-like structures. By J. "
+"Tarbell and Mike Kershaw."
+msgstr ""
+
+#: hacks/config/substrate.xml.h:8
+#, fuzzy
+msgid "Sandgrains"
+msgstr "標準"
+
+#: hacks/config/substrate.xml.h:12
+msgid "Substrate"
+msgstr ""
+
+#: hacks/config/substrate.xml.h:13
+msgid "Wireframe only"
+msgstr ""
+
 #: hacks/config/superquadrics.xml.h:3
 msgid ""
 "Ed Mackey reports that he wrote the first version of this program in BASIC "
 #: hacks/config/superquadrics.xml.h:3
 msgid ""
 "Ed Mackey reports that he wrote the first version of this program in BASIC "
index 7acbd3c89c22bd015c284ffc21b0a66da7922669..0ace9fbf851cab4d60b4d83e313dc053009ca99e 100644 (file)
--- a/po/ko.po
+++ b/po/ko.po
@@ -2,7 +2,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: xscreensaver 4.04\n"
 "Report-Msgid-Bugs-To: \n"
 msgstr ""
 "Project-Id-Version: xscreensaver 4.04\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2004-10-04 16:25+0200\n"
+"POT-Creation-Date: 2004-12-22 12:51+0100\n"
 "PO-Revision-Date: 2001-10-25 06:13:57+0900\n"
 "Last-Translator: Young-Ho Cha <ganadist@chollian.net>\n"
 "Language-Team: Korean <ko@li.org>\n"
 "PO-Revision-Date: 2001-10-25 06:13:57+0900\n"
 "Last-Translator: Young-Ho Cha <ganadist@chollian.net>\n"
 "Language-Team: Korean <ko@li.org>\n"
@@ -144,7 +144,7 @@ msgstr "화면이 완전히 검게 변하는데 걸리는 걸리는 시간입니
 msgid "minutes"
 msgstr "분"
 
 msgid "minutes"
 msgstr "분"
 
-#: driver/demo-Gtk-widgets.c:482 driver/demo-Gtk.c:2845
+#: driver/demo-Gtk-widgets.c:482 driver/demo-Gtk.c:2852
 #: driver/xscreensaver-demo.glade.h:58
 msgid "Preview"
 msgstr "미리보기"
 #: driver/xscreensaver-demo.glade.h:58
 msgid "Preview"
 msgstr "미리보기"
@@ -190,12 +190,12 @@ msgstr "화면보호기 하나만 사용"
 msgid "Random Screen Saver"
 msgstr "임의의 화면보호기 사용"
 
 msgid "Random Screen Saver"
 msgstr "임의의 화면보호기 사용"
 
-#: driver/demo-Gtk-widgets.c:571 driver/demo-Gtk.c:2134
+#: driver/demo-Gtk-widgets.c:571 driver/demo-Gtk.c:2141
 #: driver/xscreensaver-demo.glade.h:75
 msgid "Use"
 msgstr "사용"
 
 #: driver/xscreensaver-demo.glade.h:75
 msgid "Use"
 msgstr "사용"
 
-#: driver/demo-Gtk-widgets.c:591 driver/demo-Gtk.c:2144
+#: driver/demo-Gtk-widgets.c:591 driver/demo-Gtk.c:2151
 #: driver/xscreensaver-demo.glade.h:63
 msgid "Screen Saver"
 msgstr "화면 보호기"
 #: driver/xscreensaver-demo.glade.h:63
 msgid "Screen Saver"
 msgstr "화면 보호기"
@@ -429,7 +429,7 @@ msgid "Visual:"
 msgstr ""
 
 #: driver/demo-Gtk-widgets.c:1550 driver/demo-Gtk-widgets.c:1573
 msgstr ""
 
 #: driver/demo-Gtk-widgets.c:1550 driver/demo-Gtk-widgets.c:1573
-#: driver/demo-Gtk.c:1538 driver/demo-Gtk.c:2864
+#: driver/demo-Gtk.c:1545 driver/demo-Gtk.c:2871
 #: driver/xscreensaver-demo.glade.h:5 driver/xscreensaver-demo.glade2.h:3
 msgid "Any"
 msgstr ""
 #: driver/xscreensaver-demo.glade.h:5 driver/xscreensaver-demo.glade2.h:3
 msgid "Any"
 msgstr ""
@@ -528,7 +528,7 @@ msgstr "표준 <<"
 msgid "Back to the graphical configuration options."
 msgstr "그래픽 환경의 설정 옵션으로 되돌아 갑니다."
 
 msgid "Back to the graphical configuration options."
 msgstr "그래픽 환경의 설정 옵션으로 되돌아 갑니다."
 
-#: driver/demo-Gtk-widgets.c:1709 driver/demo-Gtk.c:741
+#: driver/demo-Gtk-widgets.c:1709 driver/demo-Gtk.c:748
 #: driver/xscreensaver-demo.glade.h:54
 msgid "OK"
 msgstr "확인"
 #: driver/xscreensaver-demo.glade.h:54
 msgid "OK"
 msgstr "확인"
@@ -537,11 +537,11 @@ msgstr "확인"
 msgid "Cancel"
 msgstr "취소"
 
 msgid "Cancel"
 msgstr "취소"
 
-#: driver/demo-Gtk.c:649
+#: driver/demo-Gtk.c:656
 msgid "For updates, check http://www.jwz.org/xscreensaver/"
 msgstr "업데이트 하려면 http://www.jwz.org/xscreensaver/ 를 확인하십시오"
 
 msgid "For updates, check http://www.jwz.org/xscreensaver/"
 msgstr "업데이트 하려면 http://www.jwz.org/xscreensaver/ 를 확인하십시오"
 
-#: driver/demo-Gtk.c:779
+#: driver/demo-Gtk.c:786
 msgid ""
 "Error:\n"
 "\n"
 msgid ""
 "Error:\n"
 "\n"
@@ -551,7 +551,7 @@ msgstr ""
 "\n"
 "도움말 URL이 지정되지 않았습니다.\n"
 
 "\n"
 "도움말 URL이 지정되지 않았습니다.\n"
 
-#: driver/demo-Gtk.c:865
+#: driver/demo-Gtk.c:872
 msgid ""
 "Error:\n"
 "\n"
 msgid ""
 "Error:\n"
 "\n"
@@ -562,7 +562,7 @@ msgstr ""
 "\n"
 "xscreensaver 데몬이 올바로 시작되지 않았습니다.\n"
 
 "\n"
 "xscreensaver 데몬이 올바로 시작되지 않았습니다.\n"
 
-#: driver/demo-Gtk.c:877
+#: driver/demo-Gtk.c:884
 msgid ""
 "You are running as root.  This usually means that xscreensaver\n"
 "was unable to contact your X server because access control is\n"
 msgid ""
 "You are running as root.  This usually means that xscreensaver\n"
 "was unable to contact your X server because access control is\n"
@@ -581,18 +581,18 @@ msgid ""
 "normal user, and `su' as necessary."
 msgstr ""
 
 "normal user, and `su' as necessary."
 msgstr ""
 
-#: driver/demo-Gtk.c:893
+#: driver/demo-Gtk.c:900
 msgid "Please check your $PATH and permissions."
 msgstr "경로와 허가권을 확인하십시오."
 
 msgid "Please check your $PATH and permissions."
 msgstr "경로와 허가권을 확인하십시오."
 
-#: driver/demo-Gtk.c:928
+#: driver/demo-Gtk.c:935
 msgid ""
 "Error:\n"
 "\n"
 "Couldn't determine init file name!\n"
 msgstr ""
 
 msgid ""
 "Error:\n"
 "\n"
 "Couldn't determine init file name!\n"
 msgstr ""
 
-#: driver/demo-Gtk.c:933
+#: driver/demo-Gtk.c:940
 #, c-format
 msgid ""
 "Error:\n"
 #, c-format
 msgid ""
 "Error:\n"
@@ -603,14 +603,14 @@ msgstr ""
 "\n"
 "%s을(를) 쓸 수 없습니다\n"
 
 "\n"
 "%s을(를) 쓸 수 없습니다\n"
 
-#: driver/demo-Gtk.c:992
+#: driver/demo-Gtk.c:999
 msgid ""
 "Error:\n"
 "\n"
 "no `manualCommand' resource set."
 msgstr ""
 
 msgid ""
 "Error:\n"
 "\n"
 "no `manualCommand' resource set."
 msgstr ""
 
-#: driver/demo-Gtk.c:1173
+#: driver/demo-Gtk.c:1180
 #, c-format
 msgid ""
 "Error:\n"
 #, c-format
 msgid ""
 "Error:\n"
@@ -618,7 +618,7 @@ msgid ""
 "Unparsable time format: \"%s\"\n"
 msgstr ""
 
 "Unparsable time format: \"%s\"\n"
 msgstr ""
 
-#: driver/demo-Gtk.c:1829
+#: driver/demo-Gtk.c:1836
 #, c-format
 msgid ""
 "Error:\n"
 #, c-format
 msgid ""
 "Error:\n"
@@ -626,28 +626,28 @@ msgid ""
 "Directory does not exist: \"%s\"\n"
 msgstr ""
 
 "Directory does not exist: \"%s\"\n"
 msgstr ""
 
-#: driver/demo-Gtk.c:2546
+#: driver/demo-Gtk.c:2553
 msgid "Descriptions not available: no XML support compiled in."
 msgstr ""
 
 msgid "Descriptions not available: no XML support compiled in."
 msgstr ""
 
-#: driver/demo-Gtk.c:2551
+#: driver/demo-Gtk.c:2558
 msgid "No description available."
 msgstr "설명이 없습니다"
 
 msgid "No description available."
 msgstr "설명이 없습니다"
 
-#: driver/demo-Gtk.c:2816
+#: driver/demo-Gtk.c:2823
 msgid "Blank Screen"
 msgstr "빈 화면"
 
 msgid "Blank Screen"
 msgstr "빈 화면"
 
-#: driver/demo-Gtk.c:2822
+#: driver/demo-Gtk.c:2829
 msgid "Screen Saver Disabled"
 msgstr "화면 보호기 사용않음"
 
 msgid "Screen Saver Disabled"
 msgstr "화면 보호기 사용않음"
 
-#: driver/demo-Gtk.c:2855
+#: driver/demo-Gtk.c:2862
 #, c-format
 msgid "%s: %.100s Settings"
 msgstr ""
 
 #, c-format
 msgid "%s: %.100s Settings"
 msgstr ""
 
-#: driver/demo-Gtk.c:3010
+#: driver/demo-Gtk.c:3017
 #, c-format
 msgid ""
 "Warning:\n"
 #, c-format
 msgid ""
 "Warning:\n"
@@ -655,23 +655,23 @@ msgid ""
 "file \"%s\" has changed, reloading.\n"
 msgstr ""
 
 "file \"%s\" has changed, reloading.\n"
 msgstr ""
 
-#: driver/demo-Gtk.c:3092
+#: driver/demo-Gtk.c:3099
 msgid "No Preview"
 msgstr "미리보기 없음"
 
 msgid "No Preview"
 msgstr "미리보기 없음"
 
-#: driver/demo-Gtk.c:3092
+#: driver/demo-Gtk.c:3099
 msgid "Available"
 msgstr ""
 
 msgid "Available"
 msgstr ""
 
-#: driver/demo-Gtk.c:3093
+#: driver/demo-Gtk.c:3100
 msgid "Not"
 msgstr ""
 
 msgid "Not"
 msgstr ""
 
-#: driver/demo-Gtk.c:3093
+#: driver/demo-Gtk.c:3100
 msgid "Installed"
 msgstr ""
 
 msgid "Installed"
 msgstr ""
 
-#: driver/demo-Gtk.c:3858
+#: driver/demo-Gtk.c:3865
 #, c-format
 msgid ""
 "Warning:\n"
 #, c-format
 msgid ""
 "Warning:\n"
@@ -680,7 +680,7 @@ msgid ""
 "on display \"%s\".  Launch it now?"
 msgstr ""
 
 "on display \"%s\".  Launch it now?"
 msgstr ""
 
-#: driver/demo-Gtk.c:3868
+#: driver/demo-Gtk.c:3875
 #, c-format
 msgid ""
 "Warning:\n"
 #, c-format
 msgid ""
 "Warning:\n"
@@ -699,7 +699,7 @@ msgid ""
 "Restart the xscreensaver daemon now?\n"
 msgstr ""
 
 "Restart the xscreensaver daemon now?\n"
 msgstr ""
 
-#: driver/demo-Gtk.c:3893
+#: driver/demo-Gtk.c:3900
 #, c-format
 msgid ""
 "Warning:\n"
 #, c-format
 msgid ""
 "Warning:\n"
@@ -715,7 +715,7 @@ msgid ""
 "Restart the daemon on \"%s\" as \"%s\" now?\n"
 msgstr ""
 
 "Restart the daemon on \"%s\" as \"%s\" now?\n"
 msgstr ""
 
-#: driver/demo-Gtk.c:3915
+#: driver/demo-Gtk.c:3922
 #, c-format
 msgid ""
 "Warning:\n"
 #, c-format
 msgid ""
 "Warning:\n"
@@ -727,12 +727,12 @@ msgid ""
 "Restart the xscreensaver daemon now?\n"
 msgstr ""
 
 "Restart the xscreensaver daemon now?\n"
 msgstr ""
 
-#: driver/demo-Gtk.c:4372
+#: driver/demo-Gtk.c:4379
 #, c-format
 msgid "%s: unknown option: %s\n"
 msgstr "%s: 알수없는 옵션: %s\n"
 
 #, c-format
 msgid "%s: unknown option: %s\n"
 msgstr "%s: 알수없는 옵션: %s\n"
 
-#: driver/demo-Gtk.c:4436
+#: driver/demo-Gtk.c:4443
 #, fuzzy
 msgid "Screensaver Preferences"
 msgstr "화면 보호기"
 #, fuzzy
 msgid "Screensaver Preferences"
 msgstr "화면 보호기"
@@ -952,22 +952,23 @@ msgstr ""
 #: 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/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:5 hacks/config/flyingtoasters.xml.h:5
-#: hacks/config/fontglide.xml.h:4 hacks/config/forest.xml.h:1
-#: hacks/config/fuzzyflakes.xml.h:7 hacks/config/galaxy.xml.h:3
-#: hacks/config/gears.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:6
-#: 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/fadeplot.xml.h:4 hacks/config/fireworkx.xml.h:3
+#: 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:2 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/fuzzyflakes.xml.h:7
+#: hacks/config/galaxy.xml.h:3 hacks/config/gears.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:6 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/intermomentary.xml.h:1 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/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
@@ -985,23 +986,24 @@ msgstr ""
 #: hacks/config/pacman.xml.h:1 hacks/config/penetrate.xml.h:3
 #: hacks/config/penrose.xml.h:6 hacks/config/petri.xml.h:5
 #: hacks/config/phosphor.xml.h:4 hacks/config/piecewise.xml.h:4
 #: hacks/config/pacman.xml.h:1 hacks/config/penetrate.xml.h:3
 #: hacks/config/penrose.xml.h:6 hacks/config/petri.xml.h:5
 #: hacks/config/phosphor.xml.h:4 hacks/config/piecewise.xml.h:4
-#: hacks/config/pipes.xml.h:5 hacks/config/polyhedra.xml.h:18
-#: hacks/config/polyominoes.xml.h:2 hacks/config/polytopes.xml.h:11
-#: hacks/config/pong.xml.h:1 hacks/config/popsquares.xml.h:3
-#: hacks/config/providence.xml.h:2 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 hacks/config/rocks.xml.h:4
-#: hacks/config/rotor.xml.h:3 hacks/config/rubik.xml.h:3
-#: hacks/config/sballs.xml.h:4 hacks/config/shadebobs.xml.h:3
-#: hacks/config/sierpinski.xml.h:2 hacks/config/sierpinski3d.xml.h:2
-#: hacks/config/slidescreen.xml.h:2 hacks/config/slip.xml.h:2
-#: hacks/config/speedmine.xml.h:3 hacks/config/sphere.xml.h:2
-#: hacks/config/spheremonics.xml.h:5 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:1 hacks/config/superquadrics.xml.h:4
+#: hacks/config/pinion.xml.h:5 hacks/config/pipes.xml.h:5
+#: hacks/config/polyhedra.xml.h:18 hacks/config/polyominoes.xml.h:2
+#: hacks/config/polytopes.xml.h:11 hacks/config/pong.xml.h:1
+#: hacks/config/popsquares.xml.h:3 hacks/config/providence.xml.h:2
+#: 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
+#: hacks/config/rocks.xml.h:4 hacks/config/rotor.xml.h:3
+#: hacks/config/rubik.xml.h:3 hacks/config/sballs.xml.h:4
+#: hacks/config/shadebobs.xml.h:3 hacks/config/sierpinski.xml.h:2
+#: hacks/config/sierpinski3d.xml.h:2 hacks/config/slidescreen.xml.h:2
+#: hacks/config/slip.xml.h:2 hacks/config/speedmine.xml.h:3
+#: hacks/config/sphere.xml.h:2 hacks/config/spheremonics.xml.h:5
+#: 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:1
+#: hacks/config/substrate.xml.h:2 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/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
@@ -1023,8 +1025,9 @@ msgstr "빠름"
 #: hacks/config/fuzzyflakes.xml.h:8 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/fuzzyflakes.xml.h:8 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/wormhole.xml.h:3 hacks/config/xfishtank.xml.h:4
+#: hacks/config/substrate.xml.h:3 hacks/config/thornbird.xml.h:3
+#: hacks/config/whirlwindwarp.xml.h:1 hacks/config/wormhole.xml.h:3
+#: hacks/config/xfishtank.xml.h:4
 msgid "Few"
 msgstr "적음"
 
 msgid "Few"
 msgstr "적음"
 
@@ -1040,7 +1043,7 @@ msgstr "적음"
 #: hacks/config/epicycle.xml.h:8 hacks/config/eruption.xml.h:12
 #: hacks/config/euler2d.xml.h:8 hacks/config/fadeplot.xml.h:6
 #: hacks/config/flag.xml.h:5 hacks/config/flame.xml.h:11
 #: hacks/config/epicycle.xml.h:8 hacks/config/eruption.xml.h:12
 #: hacks/config/euler2d.xml.h:8 hacks/config/fadeplot.xml.h:6
 #: hacks/config/flag.xml.h:5 hacks/config/flame.xml.h:11
-#: hacks/config/flow.xml.h:8 hacks/config/fluidballs.xml.h:13
+#: hacks/config/flow.xml.h:7 hacks/config/fluidballs.xml.h:13
 #: hacks/config/forest.xml.h:3 hacks/config/fuzzyflakes.xml.h:12
 #: 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/forest.xml.h:3 hacks/config/fuzzyflakes.xml.h:12
 #: hacks/config/galaxy.xml.h:6 hacks/config/grav.xml.h:4
 #: hacks/config/halo.xml.h:4 hacks/config/hopalong.xml.h:15
@@ -1078,7 +1081,7 @@ msgstr "많음"
 #: 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/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/flow.xml.h:8 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/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
@@ -1132,22 +1135,23 @@ msgstr ""
 #: 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/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/flyingtoasters.xml.h:11
-#: hacks/config/fontglide.xml.h:13 hacks/config/forest.xml.h:5
-#: hacks/config/fuzzyflakes.xml.h:15 hacks/config/galaxy.xml.h:10
-#: hacks/config/gears.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:8 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:10 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/fadeplot.xml.h:8 hacks/config/fireworkx.xml.h:9
+#: 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:10 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/fuzzyflakes.xml.h:15
+#: hacks/config/galaxy.xml.h:11 hacks/config/gears.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:8
+#: 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:10
+#: 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/intermomentary.xml.h:4 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/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
@@ -1165,23 +1169,24 @@ msgstr ""
 #: hacks/config/pacman.xml.h:5 hacks/config/penetrate.xml.h:6
 #: hacks/config/penrose.xml.h:11 hacks/config/petri.xml.h:23
 #: hacks/config/phosphor.xml.h:7 hacks/config/piecewise.xml.h:9
 #: hacks/config/pacman.xml.h:5 hacks/config/penetrate.xml.h:6
 #: hacks/config/penrose.xml.h:11 hacks/config/petri.xml.h:23
 #: hacks/config/phosphor.xml.h:7 hacks/config/piecewise.xml.h:9
-#: hacks/config/pipes.xml.h:15 hacks/config/polyhedra.xml.h:119
-#: hacks/config/polyominoes.xml.h:10 hacks/config/polytopes.xml.h:20
-#: hacks/config/pong.xml.h:4 hacks/config/popsquares.xml.h:5
-#: hacks/config/providence.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 hacks/config/rocks.xml.h:9
-#: hacks/config/rotor.xml.h:11 hacks/config/rubik.xml.h:9
-#: hacks/config/sballs.xml.h:13 hacks/config/shadebobs.xml.h:9
-#: hacks/config/sierpinski.xml.h:7 hacks/config/sierpinski3d.xml.h:8
-#: hacks/config/slidescreen.xml.h:6 hacks/config/slip.xml.h:7
-#: hacks/config/speedmine.xml.h:13 hacks/config/sphere.xml.h:5
-#: hacks/config/spheremonics.xml.h:19 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:4 hacks/config/superquadrics.xml.h:8
+#: hacks/config/pinion.xml.h:13 hacks/config/pipes.xml.h:15
+#: hacks/config/polyhedra.xml.h:119 hacks/config/polyominoes.xml.h:10
+#: hacks/config/polytopes.xml.h:20 hacks/config/pong.xml.h:4
+#: hacks/config/popsquares.xml.h:5 hacks/config/providence.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
+#: hacks/config/rocks.xml.h:9 hacks/config/rotor.xml.h:11
+#: hacks/config/rubik.xml.h:9 hacks/config/sballs.xml.h:13
+#: hacks/config/shadebobs.xml.h:9 hacks/config/sierpinski.xml.h:7
+#: hacks/config/sierpinski3d.xml.h:8 hacks/config/slidescreen.xml.h:6
+#: hacks/config/slip.xml.h:7 hacks/config/speedmine.xml.h:13
+#: hacks/config/sphere.xml.h:5 hacks/config/spheremonics.xml.h:19
+#: 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:4
+#: hacks/config/substrate.xml.h:10 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/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
@@ -1214,17 +1219,18 @@ msgstr "느림"
 #: hacks/config/engine.xml.h:16 hacks/config/epicycle.xml.h:11
 #: 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/engine.xml.h:16 hacks/config/epicycle.xml.h:11
 #: 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/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/fuzzyflakes.xml.h:17
-#: hacks/config/galaxy.xml.h:11 hacks/config/glblur.xml.h:17
-#: hacks/config/glforestfire.xml.h:15 hacks/config/glplanet.xml.h:10
-#: 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:11 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/fireworkx.xml.h:11 hacks/config/flag.xml.h:9
+#: hacks/config/flame.xml.h:15 hacks/config/flipflop.xml.h:7
+#: hacks/config/flipscreen3d.xml.h:7 hacks/config/flow.xml.h:12
+#: hacks/config/fluidballs.xml.h:20 hacks/config/forest.xml.h:6
+#: hacks/config/fuzzyflakes.xml.h:17 hacks/config/galaxy.xml.h:12
+#: hacks/config/glblur.xml.h:17 hacks/config/glforestfire.xml.h:15
+#: hacks/config/glplanet.xml.h:10 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:11
+#: 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/intermomentary.xml.h:5 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/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
@@ -1253,16 +1259,16 @@ msgstr "느림"
 #: 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/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/xplanet.xml.h:60 hacks/config/xrayswarm.xml.h:4
-#: hacks/config/zoom.xml.h:7
+#: hacks/config/strange.xml.h:5 hacks/config/substrate.xml.h:11
+#: 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/xplanet.xml.h:60
+#: hacks/config/xrayswarm.xml.h:4 hacks/config/zoom.xml.h:7
 msgid "Speed"
 msgstr "빠르기"
 
 msgid "Speed"
 msgstr "빠르기"
 
@@ -1306,8 +1312,8 @@ msgstr "움직임 빠르기"
 #: hacks/config/discrete.xml.h:11 hacks/config/drift.xml.h:14
 #: hacks/config/epicycle.xml.h:13 hacks/config/euler2d.xml.h:17
 #: hacks/config/fadeplot.xml.h:12 hacks/config/flag.xml.h:13
 #: hacks/config/discrete.xml.h:11 hacks/config/drift.xml.h:14
 #: hacks/config/epicycle.xml.h:13 hacks/config/euler2d.xml.h:17
 #: hacks/config/fadeplot.xml.h:12 hacks/config/flag.xml.h:13
-#: hacks/config/flame.xml.h:16 hacks/config/flow.xml.h:18
-#: hacks/config/forest.xml.h:8 hacks/config/galaxy.xml.h:13
+#: hacks/config/flame.xml.h:16 hacks/config/flow.xml.h:15
+#: hacks/config/forest.xml.h:8 hacks/config/galaxy.xml.h:14
 #: hacks/config/grav.xml.h:11 hacks/config/halo.xml.h:13
 #: hacks/config/hopalong.xml.h:25 hacks/config/ifs.xml.h:8
 #: hacks/config/imsmap.xml.h:15 hacks/config/interference.xml.h:19
 #: hacks/config/grav.xml.h:11 hacks/config/halo.xml.h:13
 #: hacks/config/hopalong.xml.h:25 hacks/config/ifs.xml.h:8
 #: hacks/config/imsmap.xml.h:15 hacks/config/interference.xml.h:19
@@ -1407,7 +1413,7 @@ msgstr "4각형 단위"
 #: 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/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/flag.xml.h:4 hacks/config/flow.xml.h:4
 #: hacks/config/fluidballs.xml.h:12 hacks/config/fuzzyflakes.xml.h:10
 #: 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/fluidballs.xml.h:12 hacks/config/fuzzyflakes.xml.h:10
 #: hacks/config/gleidescope.xml.h:7 hacks/config/halftone.xml.h:8
 #: hacks/config/hopalong.xml.h:13 hacks/config/interference.xml.h:11
@@ -1440,7 +1446,7 @@ msgstr "6각형 단위"
 #: 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/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/flag.xml.h:8 hacks/config/flow.xml.h:11
 #: hacks/config/fluidballs.xml.h:19 hacks/config/fuzzyflakes.xml.h:16
 #: 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/fluidballs.xml.h:19 hacks/config/fuzzyflakes.xml.h:16
 #: hacks/config/gleidescope.xml.h:12 hacks/config/halftone.xml.h:14
 #: hacks/config/hopalong.xml.h:22 hacks/config/interference.xml.h:18
@@ -1459,7 +1465,7 @@ msgstr "3각형 단위"
 
 #: 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/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/flag.xml.h:12 hacks/config/flow.xml.h:14
 #: hacks/config/lissie.xml.h:12 hacks/config/loop.xml.h:11
 #: hacks/config/rubik.xml.h:12 hacks/config/sierpinski.xml.h:11
 #: hacks/config/slip.xml.h:11
 #: hacks/config/lissie.xml.h:12 hacks/config/loop.xml.h:11
 #: hacks/config/rubik.xml.h:12 hacks/config/sierpinski.xml.h:11
 #: hacks/config/slip.xml.h:11
@@ -1510,13 +1516,14 @@ msgstr ""
 #: hacks/config/menger.xml.h:15 hacks/config/mirrorblob.xml.h:18
 #: hacks/config/moebius.xml.h:6 hacks/config/molecule.xml.h:21
 #: hacks/config/morph3d.xml.h:5 hacks/config/noof.xml.h:4
 #: hacks/config/menger.xml.h:15 hacks/config/mirrorblob.xml.h:18
 #: hacks/config/moebius.xml.h:6 hacks/config/molecule.xml.h:21
 #: hacks/config/morph3d.xml.h:5 hacks/config/noof.xml.h:4
-#: hacks/config/pipes.xml.h:14 hacks/config/polyhedra.xml.h:118
-#: hacks/config/polytopes.xml.h:18 hacks/config/providence.xml.h:4
-#: 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
+#: hacks/config/pinion.xml.h:12 hacks/config/pipes.xml.h:14
+#: hacks/config/polyhedra.xml.h:118 hacks/config/polytopes.xml.h:18
+#: hacks/config/providence.xml.h:4 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 "1초에 보여줄 수 있는 프레임 표시"
 
 msgid "Show Frames-per-Second"
 msgstr "1초에 보여줄 수 있는 프레임 표시"
 
@@ -1678,11 +1685,12 @@ msgstr "고래 빠르기"
 #: hacks/config/lament.xml.h:9 hacks/config/lavalite.xml.h:32
 #: hacks/config/menger.xml.h:21 hacks/config/mirrorblob.xml.h:24
 #: hacks/config/moebius.xml.h:11 hacks/config/molecule.xml.h:26
 #: hacks/config/lament.xml.h:9 hacks/config/lavalite.xml.h:32
 #: hacks/config/menger.xml.h:21 hacks/config/mirrorblob.xml.h:24
 #: hacks/config/moebius.xml.h:11 hacks/config/molecule.xml.h:26
-#: hacks/config/polyhedra.xml.h:173 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
+#: hacks/config/pinion.xml.h:15 hacks/config/polyhedra.xml.h:173
+#: 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 ""
 
 msgid "Wireframe"
 msgstr ""
 
@@ -1774,14 +1782,15 @@ msgstr "선"
 #: 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/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/mismunch.xml.h:3
-#: 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 hacks/config/spheremonics.xml.h:7
+#: hacks/config/flow.xml.h:6 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/mismunch.xml.h:3 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
+#: hacks/config/spheremonics.xml.h:7 hacks/config/substrate.xml.h:6
 #: hacks/config/wander.xml.h:10 hacks/config/whirlwindwarp.xml.h:3
 msgid "Long"
 msgstr "김"
 #: hacks/config/wander.xml.h:10 hacks/config/whirlwindwarp.xml.h:3
 msgid "Long"
 msgstr "김"
@@ -1828,13 +1837,14 @@ msgstr ""
 #: 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/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/metaballs.xml.h:12 hacks/config/mismunch.xml.h:8
-#: 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/flow.xml.h:9 hacks/config/galaxy.xml.h:9
+#: hacks/config/klein.xml.h:5 hacks/config/laser.xml.h:9
+#: hacks/config/menger.xml.h:14 hacks/config/metaballs.xml.h:12
+#: hacks/config/mismunch.xml.h:8 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/substrate.xml.h:9
 #: hacks/config/wander.xml.h:12 hacks/config/whirlwindwarp.xml.h:6
 msgid "Short"
 msgstr "짧음"
 #: hacks/config/wander.xml.h:12 hacks/config/whirlwindwarp.xml.h:6
 msgid "Short"
 msgstr "짧음"
@@ -2040,10 +2050,10 @@ msgstr ""
 #: 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/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/polyhedra.xml.h:3 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/wormhole.xml.h:1
-#: hacks/config/xfishtank.xml.h:1
+#: hacks/config/pinion.xml.h:3 hacks/config/polyhedra.xml.h:3
+#: 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/wormhole.xml.h:1 hacks/config/xfishtank.xml.h:1
 msgid "Animation Speed"
 msgstr "움직임 속도"
 
 msgid "Animation Speed"
 msgstr "움직임 속도"
 
@@ -2121,8 +2131,9 @@ msgstr ""
 #: 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/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/starfish.xml.h:2 hacks/config/substrate.xml.h:1
+#: hacks/config/vidwhacker.xml.h:3 hacks/config/wander.xml.h:7
+#: hacks/config/xspirograph.xml.h:3
 msgid "Duration"
 msgstr "시간"
 
 msgid "Duration"
 msgstr "시간"
 
@@ -2376,7 +2387,7 @@ msgstr ""
 msgid "Rotate"
 msgstr ""
 
 msgid "Rotate"
 msgstr ""
 
-#: hacks/config/circuit.xml.h:8
+#: hacks/config/circuit.xml.h:8 hacks/config/pinion.xml.h:10
 msgid "Rotation Speed"
 msgstr "회전 빠르기"
 
 msgid "Rotation Speed"
 msgstr "회전 빠르기"
 
@@ -2463,11 +2474,12 @@ msgstr "1초"
 msgid "Coral"
 msgstr "수정"
 
 msgid "Coral"
 msgstr "수정"
 
-#: hacks/config/coral.xml.h:4 hacks/config/gflux.xml.h:3
-#: hacks/config/glblur.xml.h:2 hacks/config/glmatrix.xml.h:3
-#: 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
+#: hacks/config/coral.xml.h:4 hacks/config/fireworkx.xml.h:2
+#: hacks/config/gflux.xml.h:3 hacks/config/glblur.xml.h:2
+#: hacks/config/glmatrix.xml.h:3 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
 msgid "Dense"
 msgstr "빡빡함"
 
 msgid "Dense"
 msgstr "빡빡함"
 
@@ -2480,12 +2492,12 @@ msgid ""
 "Simulates coral growth, albeit somewhat slowly. Written by Frederick Roeber."
 msgstr ""
 
 "Simulates coral growth, albeit somewhat slowly. Written by Frederick Roeber."
 msgstr ""
 
-#: hacks/config/coral.xml.h:13 hacks/config/gflux.xml.h:13
-#: hacks/config/glblur.xml.h:16 hacks/config/glmatrix.xml.h:19
-#: hacks/config/imsmap.xml.h:13 hacks/config/lavalite.xml.h:29
-#: hacks/config/pyro.xml.h:14 hacks/config/qix.xml.h:21
-#: hacks/config/squiral.xml.h:15 hacks/config/xearth.xml.h:24
-#: hacks/config/xmatrix.xml.h:17
+#: hacks/config/coral.xml.h:13 hacks/config/fireworkx.xml.h:10
+#: hacks/config/gflux.xml.h:13 hacks/config/glblur.xml.h:16
+#: hacks/config/glmatrix.xml.h:19 hacks/config/imsmap.xml.h:13
+#: hacks/config/lavalite.xml.h:29 hacks/config/pyro.xml.h:14
+#: hacks/config/qix.xml.h:21 hacks/config/squiral.xml.h:15
+#: hacks/config/xearth.xml.h:24 hacks/config/xmatrix.xml.h:17
 msgid "Sparse"
 msgstr "드뭄"
 
 msgid "Sparse"
 msgstr "드뭄"
 
@@ -2515,7 +2527,7 @@ msgid "Center on Screen"
 msgstr ""
 
 #: hacks/config/crystal.xml.h:2 hacks/config/deluxe.xml.h:1
 msgstr ""
 
 #: hacks/config/crystal.xml.h:2 hacks/config/deluxe.xml.h:1
-#: hacks/config/fadeplot.xml.h:1 hacks/config/flow.xml.h:3
+#: hacks/config/fadeplot.xml.h:1 hacks/config/flow.xml.h:1
 #: hacks/config/galaxy.xml.h:1 hacks/config/glforestfire.xml.h:1
 #: hacks/config/grav.xml.h:1 hacks/config/julia.xml.h:1
 #: hacks/config/laser.xml.h:1 hacks/config/lisa.xml.h:1
 #: hacks/config/galaxy.xml.h:1 hacks/config/glforestfire.xml.h:1
 #: hacks/config/grav.xml.h:1 hacks/config/julia.xml.h:1
 #: hacks/config/laser.xml.h:1 hacks/config/lisa.xml.h:1
@@ -3285,7 +3297,7 @@ msgstr ""
 msgid "Half"
 msgstr ""
 
 msgid "Half"
 msgstr ""
 
-#: hacks/config/fireflies.xml.h:17
+#: hacks/config/fireflies.xml.h:17 hacks/config/pinion.xml.h:7
 msgid "Huge"
 msgstr ""
 
 msgid "Huge"
 msgstr ""
 
@@ -3376,7 +3388,7 @@ msgstr ""
 msgid "Swarm tails glow"
 msgstr ""
 
 msgid "Swarm tails glow"
 msgstr ""
 
-#: hacks/config/fireflies.xml.h:43
+#: hacks/config/fireflies.xml.h:43 hacks/config/pinion.xml.h:14
 #, fuzzy
 msgid "Tiny"
 msgstr "얕음"
 #, fuzzy
 msgid "Tiny"
 msgstr "얕음"
@@ -3395,6 +3407,33 @@ msgstr "넓음"
 msgid "Wind picks up"
 msgstr ""
 
 msgid "Wind picks up"
 msgstr ""
 
+#: hacks/config/fireworkx.xml.h:1 hacks/config/lavalite.xml.h:3
+msgid "Activity"
+msgstr ""
+
+#: hacks/config/fireworkx.xml.h:4
+msgid "Fast Fade (more realistic)"
+msgstr ""
+
+#: hacks/config/fireworkx.xml.h:5
+#, fuzzy
+msgid "Fireworkx"
+msgstr "많이"
+
+#: hacks/config/fireworkx.xml.h:6
+#, fuzzy
+msgid "Light effect"
+msgstr "광원 효과"
+
+#: hacks/config/fireworkx.xml.h:7
+msgid "Pyrotechnics simulation eye-candy. Written by Rony B. Chandran."
+msgstr ""
+
+#: hacks/config/fireworkx.xml.h:8
+#, fuzzy
+msgid "Shoot"
+msgstr "짧음"
+
 #: hacks/config/flag.xml.h:1
 msgid "Bitmap for Flag"
 msgstr "깃발의 그림"
 #: hacks/config/flag.xml.h:1
 msgid "Bitmap for Flag"
 msgstr "깃발의 그림"
@@ -3469,42 +3508,44 @@ msgid ""
 "around and deforms it in various ways. Written by Ben Buxton."
 msgstr ""
 
 "around and deforms it in various ways. Written by Ben Buxton."
 msgstr ""
 
-#: hacks/config/flow.xml.h:1
-msgid "Allow 2D Attractors"
-msgstr ""
-
-#: hacks/config/flow.xml.h:2
-msgid ""
-"Another series of strange attractors: a flowing series of points, making "
-"strange rotational shapes. Written by Tim Auckland."
-msgstr ""
-
-#: hacks/config/flow.xml.h:5
+#: hacks/config/flow.xml.h:3
 msgid "Flow"
 msgstr "흐름"
 
 msgid "Flow"
 msgstr "흐름"
 
-#: hacks/config/flow.xml.h:6
-msgid "Freeze Some Bees"
+#: hacks/config/flow.xml.h:5
+#, fuzzy
+msgid "Length of trails"
+msgstr "꼬리"
+
+#: hacks/config/flow.xml.h:13
+msgid ""
+"Strange attractors formed of flows in a 3D differential equation phase "
+"space. Written by Tim Auckland."
 msgstr ""
 
 msgstr ""
 
-#: hacks/config/flow.xml.h:10
-msgid "Ride a Trained Bee"
+#: hacks/config/flow.xml.h:16
+msgid "turn on/off bounding box."
 msgstr ""
 
 msgstr ""
 
-#: hacks/config/flow.xml.h:11
-msgid "Rotate Around Attractor"
+#: hacks/config/flow.xml.h:17
+#, fuzzy
+msgid "turn on/off double buffering."
+msgstr "더블 버퍼링 사용"
+
+#: hacks/config/flow.xml.h:18
+msgid "turn on/off periodic attractors."
 msgstr ""
 
 msgstr ""
 
-#: hacks/config/flow.xml.h:12
-msgid "Show Bounding Box"
+#: hacks/config/flow.xml.h:19
+msgid "turn on/off ride in the flow."
 msgstr ""
 
 msgstr ""
 
-#: hacks/config/flow.xml.h:14
-msgid "Slow Bees with Antifreeze"
+#: hacks/config/flow.xml.h:20
+msgid "turn on/off rotating around attractor."
 msgstr ""
 
 msgstr ""
 
-#: hacks/config/flow.xml.h:19
-msgid "Zoom In and Out"
+#: hacks/config/flow.xml.h:21
+msgid "turn on/off search for new attractors."
 msgstr ""
 
 #: hacks/config/fluidballs.xml.h:1
 msgstr ""
 
 #: hacks/config/fluidballs.xml.h:1
@@ -3726,7 +3767,12 @@ msgstr "움직임 빠르기"
 msgid "Galaxy"
 msgstr ""
 
 msgid "Galaxy"
 msgstr ""
 
-#: hacks/config/galaxy.xml.h:9 hacks/config/lisa.xml.h:7
+#: hacks/config/galaxy.xml.h:8
+#, fuzzy
+msgid "Rotate Viewpoint"
+msgstr "반복:"
+
+#: hacks/config/galaxy.xml.h:10 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/pong.xml.h:3
 #: hacks/config/rotor.xml.h:10 hacks/config/rubik.xml.h:8
 #: hacks/config/lissie.xml.h:8 hacks/config/loop.xml.h:6
 #: hacks/config/penrose.xml.h:10 hacks/config/pong.xml.h:3
 #: hacks/config/rotor.xml.h:10 hacks/config/rubik.xml.h:8
@@ -3735,7 +3781,7 @@ msgstr ""
 msgid "Size"
 msgstr "크기"
 
 msgid "Size"
 msgstr "크기"
 
-#: hacks/config/galaxy.xml.h:12
+#: hacks/config/galaxy.xml.h:13
 msgid ""
 "This draws spinning galaxies, which then collide and scatter their stars to "
 "the, uh, four winds or something. Originally an Amiga program by Uli "
 msgid ""
 "This draws spinning galaxies, which then collide and scatter their stars to "
 "the, uh, four winds or something. Originally an Amiga program by Uli "
@@ -4049,9 +4095,9 @@ msgid ""
 "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 "
 "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."
+"of this window: the tab at the top of the *other* window.) 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
 msgstr ""
 
 #: hacks/config/glslideshow.xml.h:17
@@ -4602,6 +4648,27 @@ msgstr "물결 개수"
 msgid "Wave Size"
 msgstr "물결 크기"
 
 msgid "Wave Size"
 msgstr "물결 크기"
 
+#: hacks/config/intermomentary.xml.h:2
+msgid "Intermomentary"
+msgstr ""
+
+#: hacks/config/intermomentary.xml.h:3
+#, fuzzy
+msgid "Number of Discs"
+msgstr "원 개수"
+
+#: hacks/config/intermomentary.xml.h:6
+msgid ""
+"The Intersection Momentary is a fun visualization defining the relationships "
+"between objects with Casey Reas, William Ngan, and Robert Hodgin. "
+"Commissioned for display at the Whitney Museum of American Art. A surface "
+"filled with 100 medium to small sized circles. Each circle has a different "
+"size and direction, but moves at the same slow rate. Display: A. The "
+"instantaneous intersections of the circles. B. The aggregate intersections "
+"of the circles. Ported to XScreensaver from the art project \"InterMomentary"
+"\" at http://www.complexification.net"
+msgstr ""
+
 #: hacks/config/jigglypuff.xml.h:2
 msgid "Chrome"
 msgstr ""
 #: hacks/config/jigglypuff.xml.h:2
 msgid "Chrome"
 msgstr ""
@@ -4830,10 +4897,6 @@ msgstr ""
 msgid "10"
 msgstr ""
 
 msgid "10"
 msgstr ""
 
-#: hacks/config/lavalite.xml.h:3
-msgid "Activity"
-msgstr ""
-
 #: hacks/config/lavalite.xml.h:4
 msgid "Classic Lavalite"
 msgstr ""
 #: hacks/config/lavalite.xml.h:4
 msgid "Classic Lavalite"
 msgstr ""
@@ -5581,6 +5644,41 @@ msgid ""
 "invisibility at intersection points. Written by Geoffrey Irving."
 msgstr ""
 
 "invisibility at intersection points. Written by Geoffrey Irving."
 msgstr ""
 
+#: hacks/config/pinion.xml.h:1
+#, fuzzy
+msgid "100"
+msgstr "100%"
+
+#: hacks/config/pinion.xml.h:2
+msgid "2000"
+msgstr ""
+
+#: hacks/config/pinion.xml.h:4
+msgid ""
+"Draws an interconnected set of gears moving across the screen. Written by "
+"Jamie Zawinski."
+msgstr ""
+
+#: hacks/config/pinion.xml.h:6
+#, fuzzy
+msgid "Gear Size"
+msgstr "최대 크기"
+
+#: hacks/config/pinion.xml.h:8
+#, fuzzy
+msgid "Max RPM"
+msgstr "주요 설정"
+
+#: hacks/config/pinion.xml.h:9
+#, fuzzy
+msgid "Pinion"
+msgstr "김"
+
+#: hacks/config/pinion.xml.h:11
+#, fuzzy
+msgid "Scrolling Speed"
+msgstr "스크롤 빠르기"
+
 #: hacks/config/pipes.xml.h:1
 msgid "Allow Tight Turns"
 msgstr ""
 #: hacks/config/pipes.xml.h:1
 msgid "Allow Tight Turns"
 msgstr ""
@@ -5608,7 +5706,8 @@ msgid ""
 "probably seen this GL hack. This version is by Marcelo Vianna."
 msgstr ""
 
 "probably seen this GL hack. This version is by Marcelo Vianna."
 msgstr ""
 
-#: hacks/config/pipes.xml.h:9 hacks/config/wormhole.xml.h:4
+#: hacks/config/pipes.xml.h:9 hacks/config/substrate.xml.h:7
+#: hacks/config/wormhole.xml.h:4
 msgid "Lots"
 msgstr "많음"
 
 msgid "Lots"
 msgstr "많음"
 
@@ -6882,22 +6981,26 @@ msgid "Ping subnet/30 (2 hosts)"
 msgstr ""
 
 #: hacks/config/sonar.xml.h:10
 msgstr ""
 
 #: hacks/config/sonar.xml.h:10
-msgid "Simulation Team Members"
+msgid "Resolve Host Names"
 msgstr ""
 
 #: hacks/config/sonar.xml.h:11
 msgstr ""
 
 #: hacks/config/sonar.xml.h:11
+msgid "Simulation Team Members"
+msgstr ""
+
+#: hacks/config/sonar.xml.h:12
 msgid "Sonar"
 msgstr "음탐기"
 
 msgid "Sonar"
 msgstr "음탐기"
 
-#: hacks/config/sonar.xml.h:12
+#: hacks/config/sonar.xml.h:13
 msgid "Team A Name"
 msgstr "A 팀 이름"
 
 msgid "Team A Name"
 msgstr "A 팀 이름"
 
-#: hacks/config/sonar.xml.h:13
+#: hacks/config/sonar.xml.h:14
 msgid "Team B Name"
 msgstr "B 팀 이름"
 
 msgid "Team B Name"
 msgstr "B 팀 이름"
 
-#: hacks/config/sonar.xml.h:14
+#: hacks/config/sonar.xml.h:15
 msgid ""
 "This program draws a simulation of a sonar screen. By default, it displays a "
 "random assortment of ``bogies'' on the screen, but if installed as \"setuid "
 msgid ""
 "This program draws a simulation of a sonar screen. By default, it displays a "
 "random assortment of ``bogies'' on the screen, but if installed as \"setuid "
@@ -6906,7 +7009,7 @@ msgid ""
 "Martin and Jamie Zawinski."
 msgstr ""
 
 "Martin and Jamie Zawinski."
 msgstr ""
 
-#: hacks/config/sonar.xml.h:15
+#: hacks/config/sonar.xml.h:16
 msgid "vs."
 msgstr ""
 
 msgid "vs."
 msgstr ""
 
@@ -7184,6 +7287,32 @@ msgid ""
 "Written by Massimino Pascal."
 msgstr ""
 
 "Written by Massimino Pascal."
 msgstr ""
 
+#: hacks/config/substrate.xml.h:4
+#, fuzzy
+msgid "Initial Cracks"
+msgstr "조각 밀도"
+
+#: hacks/config/substrate.xml.h:5
+msgid ""
+"Lines like crystals grow on a computational substrate. A simple "
+"perpendicular growth rule creates intricate city-like structures. By J. "
+"Tarbell and Mike Kershaw."
+msgstr ""
+
+#: hacks/config/substrate.xml.h:8
+#, fuzzy
+msgid "Sandgrains"
+msgstr "표준 설정"
+
+#: hacks/config/substrate.xml.h:12
+#, fuzzy
+msgid "Substrate"
+msgstr "산"
+
+#: hacks/config/substrate.xml.h:13
+msgid "Wireframe only"
+msgstr ""
+
 #: hacks/config/superquadrics.xml.h:3
 msgid ""
 "Ed Mackey reports that he wrote the first version of this program in BASIC "
 #: hacks/config/superquadrics.xml.h:3
 msgid ""
 "Ed Mackey reports that he wrote the first version of this program in BASIC "
index 66ee7fe2b77c185f1d1a71e9ee2691b9ac654306..a8115965e69cedfab68a33e9f1059b0f8c2da8f2 100644 (file)
--- a/po/nl.po
+++ b/po/nl.po
@@ -9,7 +9,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: nl\n"
 "Report-Msgid-Bugs-To: \n"
 msgstr ""
 "Project-Id-Version: nl\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2004-10-04 16:25+0200\n"
+"POT-Creation-Date: 2004-12-22 12:51+0100\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"
 "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"
@@ -155,7 +155,7 @@ msgstr "Hoe lang voordat de monitor compleet op zwart gaat."
 msgid "minutes"
 msgstr "minuten"
 
 msgid "minutes"
 msgstr "minuten"
 
-#: driver/demo-Gtk-widgets.c:482 driver/demo-Gtk.c:2845
+#: driver/demo-Gtk-widgets.c:482 driver/demo-Gtk.c:2852
 #: driver/xscreensaver-demo.glade.h:58
 msgid "Preview"
 msgstr "Voorbeeld"
 #: driver/xscreensaver-demo.glade.h:58
 msgid "Preview"
 msgstr "Voorbeeld"
@@ -202,12 +202,12 @@ msgstr "Slechts één Schermbeveiliging"
 msgid "Random Screen Saver"
 msgstr "Willekeurige Schermbeveiliging"
 
 msgid "Random Screen Saver"
 msgstr "Willekeurige Schermbeveiliging"
 
-#: driver/demo-Gtk-widgets.c:571 driver/demo-Gtk.c:2134
+#: driver/demo-Gtk-widgets.c:571 driver/demo-Gtk.c:2141
 #: driver/xscreensaver-demo.glade.h:75
 msgid "Use"
 msgstr "Gebruik"
 
 #: driver/xscreensaver-demo.glade.h:75
 msgid "Use"
 msgstr "Gebruik"
 
-#: driver/demo-Gtk-widgets.c:591 driver/demo-Gtk.c:2144
+#: driver/demo-Gtk-widgets.c:591 driver/demo-Gtk.c:2151
 #: driver/xscreensaver-demo.glade.h:63
 msgid "Screen Saver"
 msgstr "Schermbeveiliging"
 #: driver/xscreensaver-demo.glade.h:63
 msgid "Screen Saver"
 msgstr "Schermbeveiliging"
@@ -455,7 +455,7 @@ msgid "Visual:"
 msgstr "Visueel:"
 
 #: driver/demo-Gtk-widgets.c:1550 driver/demo-Gtk-widgets.c:1573
 msgstr "Visueel:"
 
 #: driver/demo-Gtk-widgets.c:1550 driver/demo-Gtk-widgets.c:1573
-#: driver/demo-Gtk.c:1538 driver/demo-Gtk.c:2864
+#: driver/demo-Gtk.c:1545 driver/demo-Gtk.c:2871
 #: driver/xscreensaver-demo.glade.h:5 driver/xscreensaver-demo.glade2.h:3
 msgid "Any"
 msgstr "Iedere"
 #: driver/xscreensaver-demo.glade.h:5 driver/xscreensaver-demo.glade2.h:3
 msgid "Any"
 msgstr "Iedere"
@@ -558,7 +558,7 @@ msgstr "Standaard <<"
 msgid "Back to the graphical configuration options."
 msgstr "Terug naar de opties van de grafische configuratie."
 
 msgid "Back to the graphical configuration options."
 msgstr "Terug naar de opties van de grafische configuratie."
 
-#: driver/demo-Gtk-widgets.c:1709 driver/demo-Gtk.c:741
+#: driver/demo-Gtk-widgets.c:1709 driver/demo-Gtk.c:748
 #: driver/xscreensaver-demo.glade.h:54
 msgid "OK"
 msgstr "OK"
 #: driver/xscreensaver-demo.glade.h:54
 msgid "OK"
 msgstr "OK"
@@ -567,11 +567,11 @@ msgstr "OK"
 msgid "Cancel"
 msgstr "Annuleren"
 
 msgid "Cancel"
 msgstr "Annuleren"
 
-#: driver/demo-Gtk.c:649
+#: driver/demo-Gtk.c:656
 msgid "For updates, check http://www.jwz.org/xscreensaver/"
 msgstr "Voor bijgewerkte versies, ga naar http://www.jwz.org/xscreensaver/"
 
 msgid "For updates, check http://www.jwz.org/xscreensaver/"
 msgstr "Voor bijgewerkte versies, ga naar http://www.jwz.org/xscreensaver/"
 
-#: driver/demo-Gtk.c:779
+#: driver/demo-Gtk.c:786
 msgid ""
 "Error:\n"
 "\n"
 msgid ""
 "Error:\n"
 "\n"
@@ -581,7 +581,7 @@ msgstr ""
 "\n"
 "Er is geen Help-URL gespecificeerd.\n"
 
 "\n"
 "Er is geen Help-URL gespecificeerd.\n"
 
-#: driver/demo-Gtk.c:865
+#: driver/demo-Gtk.c:872
 msgid ""
 "Error:\n"
 "\n"
 msgid ""
 "Error:\n"
 "\n"
@@ -593,7 +593,7 @@ msgstr ""
 "De xcsreensaver daemon is niet goed opgestart.\n"
 "\n"
 
 "De xcsreensaver daemon is niet goed opgestart.\n"
 "\n"
 
-#: driver/demo-Gtk.c:877
+#: driver/demo-Gtk.c:884
 msgid ""
 "You are running as root.  This usually means that xscreensaver\n"
 "was unable to contact your X server because access control is\n"
 msgid ""
 "You are running as root.  This usually means that xscreensaver\n"
 "was unable to contact your X server because access control is\n"
@@ -628,11 +628,11 @@ msgstr ""
 "U zou X niet als root moeten draaien. U kunt beter als een\n"
 "normale gebruiken inloggen en 'su' gebruiken waar nodig."
 
 "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:893
+#: driver/demo-Gtk.c:900
 msgid "Please check your $PATH and permissions."
 msgstr "Controleer uw $PATH en permissies."
 
 msgid "Please check your $PATH and permissions."
 msgstr "Controleer uw $PATH en permissies."
 
-#: driver/demo-Gtk.c:928
+#: driver/demo-Gtk.c:935
 msgid ""
 "Error:\n"
 "\n"
 msgid ""
 "Error:\n"
 "\n"
@@ -642,7 +642,7 @@ msgstr ""
 "\n"
 "Kon de init-bestandsnaam niet bepalen!\n"
 
 "\n"
 "Kon de init-bestandsnaam niet bepalen!\n"
 
-#: driver/demo-Gtk.c:933
+#: driver/demo-Gtk.c:940
 #, c-format
 msgid ""
 "Error:\n"
 #, c-format
 msgid ""
 "Error:\n"
@@ -653,7 +653,7 @@ msgstr ""
 "\n"
 "Kon %s niet schrijven\n"
 
 "\n"
 "Kon %s niet schrijven\n"
 
-#: driver/demo-Gtk.c:992
+#: driver/demo-Gtk.c:999
 msgid ""
 "Error:\n"
 "\n"
 msgid ""
 "Error:\n"
 "\n"
@@ -663,7 +663,7 @@ msgstr ""
 "\n"
 "geen 'manualCommand' bron ingesteld."
 
 "\n"
 "geen 'manualCommand' bron ingesteld."
 
-#: driver/demo-Gtk.c:1173
+#: driver/demo-Gtk.c:1180
 #, c-format
 msgid ""
 "Error:\n"
 #, c-format
 msgid ""
 "Error:\n"
@@ -674,7 +674,7 @@ msgstr ""
 "\n"
 "Ongeldig tijdsformaat: \"%s\"\n"
 
 "\n"
 "Ongeldig tijdsformaat: \"%s\"\n"
 
-#: driver/demo-Gtk.c:1829
+#: driver/demo-Gtk.c:1836
 #, c-format
 msgid ""
 "Error:\n"
 #, c-format
 msgid ""
 "Error:\n"
@@ -685,29 +685,29 @@ msgstr ""
 "\n"
 "Map bestaat niet: \"%s\"\n"
 
 "\n"
 "Map bestaat niet: \"%s\"\n"
 
-#: driver/demo-Gtk.c:2546
+#: driver/demo-Gtk.c:2553
 msgid "Descriptions not available: no XML support compiled in."
 msgstr ""
 "Beschrijvingen niet beschikbaar: geen XML-ondersteuning meegecompileerd."
 
 msgid "Descriptions not available: no XML support compiled in."
 msgstr ""
 "Beschrijvingen niet beschikbaar: geen XML-ondersteuning meegecompileerd."
 
-#: driver/demo-Gtk.c:2551
+#: driver/demo-Gtk.c:2558
 msgid "No description available."
 msgstr "Geen beschrijving beschikbaar."
 
 msgid "No description available."
 msgstr "Geen beschrijving beschikbaar."
 
-#: driver/demo-Gtk.c:2816
+#: driver/demo-Gtk.c:2823
 msgid "Blank Screen"
 msgstr "Start Schermbeveiliging"
 
 msgid "Blank Screen"
 msgstr "Start Schermbeveiliging"
 
-#: driver/demo-Gtk.c:2822
+#: driver/demo-Gtk.c:2829
 msgid "Screen Saver Disabled"
 msgstr "Schermbeveiliging Uitgezet"
 
 msgid "Screen Saver Disabled"
 msgstr "Schermbeveiliging Uitgezet"
 
-#: driver/demo-Gtk.c:2855
+#: driver/demo-Gtk.c:2862
 #, c-format
 msgid "%s: %.100s Settings"
 msgstr ""
 
 #, c-format
 msgid "%s: %.100s Settings"
 msgstr ""
 
-#: driver/demo-Gtk.c:3010
+#: driver/demo-Gtk.c:3017
 #, c-format
 msgid ""
 "Warning:\n"
 #, c-format
 msgid ""
 "Warning:\n"
@@ -718,23 +718,23 @@ msgstr ""
 "\n"
 "bestand \"%s\" is veranderd. bezig met herladen.\n"
 
 "\n"
 "bestand \"%s\" is veranderd. bezig met herladen.\n"
 
-#: driver/demo-Gtk.c:3092
+#: driver/demo-Gtk.c:3099
 msgid "No Preview"
 msgstr "Geen Voorbeeld"
 
 msgid "No Preview"
 msgstr "Geen Voorbeeld"
 
-#: driver/demo-Gtk.c:3092
+#: driver/demo-Gtk.c:3099
 msgid "Available"
 msgstr "Beschikbaar"
 
 msgid "Available"
 msgstr "Beschikbaar"
 
-#: driver/demo-Gtk.c:3093
+#: driver/demo-Gtk.c:3100
 msgid "Not"
 msgstr "Niet"
 
 msgid "Not"
 msgstr "Niet"
 
-#: driver/demo-Gtk.c:3093
+#: driver/demo-Gtk.c:3100
 msgid "Installed"
 msgstr "Geïnstalleerd"
 
 msgid "Installed"
 msgstr "Geïnstalleerd"
 
-#: driver/demo-Gtk.c:3858
+#: driver/demo-Gtk.c:3865
 #, c-format
 msgid ""
 "Warning:\n"
 #, c-format
 msgid ""
 "Warning:\n"
@@ -747,7 +747,7 @@ msgstr ""
 "De XScreenSaver daemon loopt niet op \n"
 "scherm \"%s\". Nu opstarten?"
 
 "De XScreenSaver daemon loopt niet op \n"
 "scherm \"%s\". Nu opstarten?"
 
-#: driver/demo-Gtk.c:3868
+#: driver/demo-Gtk.c:3875
 #, c-format
 msgid ""
 "Warning:\n"
 #, c-format
 msgid ""
 "Warning:\n"
@@ -779,7 +779,7 @@ msgstr ""
 "\n"
 "De schermbeveiligings-daemon nu opnieuw opstarten?\n"
 
 "\n"
 "De schermbeveiligings-daemon nu opnieuw opstarten?\n"
 
-#: driver/demo-Gtk.c:3893
+#: driver/demo-Gtk.c:3900
 #, c-format
 msgid ""
 "Warning:\n"
 #, c-format
 msgid ""
 "Warning:\n"
@@ -806,7 +806,7 @@ msgstr ""
 "\n"
 "Herstart de daemon op \"%s\" als \"%s\" nu?\n"
 
 "\n"
 "Herstart de daemon op \"%s\" als \"%s\" nu?\n"
 
-#: driver/demo-Gtk.c:3915
+#: driver/demo-Gtk.c:3922
 #, c-format
 msgid ""
 "Warning:\n"
 #, c-format
 msgid ""
 "Warning:\n"
@@ -825,12 +825,12 @@ msgstr ""
 "\n"
 "De schermbeveiligings-daemon nu opnieuw opstarten?\n"
 
 "\n"
 "De schermbeveiligings-daemon nu opnieuw opstarten?\n"
 
-#: driver/demo-Gtk.c:4372
+#: driver/demo-Gtk.c:4379
 #, c-format
 msgid "%s: unknown option: %s\n"
 msgstr "%s: onbekende optie: %s\n"
 
 #, c-format
 msgid "%s: unknown option: %s\n"
 msgstr "%s: onbekende optie: %s\n"
 
-#: driver/demo-Gtk.c:4436
+#: driver/demo-Gtk.c:4443
 msgid "Screensaver Preferences"
 msgstr "Schermbeveiliging Voorkeuren"
 
 msgid "Screensaver Preferences"
 msgstr "Schermbeveiliging Voorkeuren"
 
@@ -1054,22 +1054,23 @@ msgstr "Armen"
 #: 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/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:5 hacks/config/flyingtoasters.xml.h:5
-#: hacks/config/fontglide.xml.h:4 hacks/config/forest.xml.h:1
-#: hacks/config/fuzzyflakes.xml.h:7 hacks/config/galaxy.xml.h:3
-#: hacks/config/gears.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:6
-#: 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/fadeplot.xml.h:4 hacks/config/fireworkx.xml.h:3
+#: 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:2 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/fuzzyflakes.xml.h:7
+#: hacks/config/galaxy.xml.h:3 hacks/config/gears.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:6 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/intermomentary.xml.h:1 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/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
@@ -1087,23 +1088,24 @@ msgstr "Armen"
 #: hacks/config/pacman.xml.h:1 hacks/config/penetrate.xml.h:3
 #: hacks/config/penrose.xml.h:6 hacks/config/petri.xml.h:5
 #: hacks/config/phosphor.xml.h:4 hacks/config/piecewise.xml.h:4
 #: hacks/config/pacman.xml.h:1 hacks/config/penetrate.xml.h:3
 #: hacks/config/penrose.xml.h:6 hacks/config/petri.xml.h:5
 #: hacks/config/phosphor.xml.h:4 hacks/config/piecewise.xml.h:4
-#: hacks/config/pipes.xml.h:5 hacks/config/polyhedra.xml.h:18
-#: hacks/config/polyominoes.xml.h:2 hacks/config/polytopes.xml.h:11
-#: hacks/config/pong.xml.h:1 hacks/config/popsquares.xml.h:3
-#: hacks/config/providence.xml.h:2 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 hacks/config/rocks.xml.h:4
-#: hacks/config/rotor.xml.h:3 hacks/config/rubik.xml.h:3
-#: hacks/config/sballs.xml.h:4 hacks/config/shadebobs.xml.h:3
-#: hacks/config/sierpinski.xml.h:2 hacks/config/sierpinski3d.xml.h:2
-#: hacks/config/slidescreen.xml.h:2 hacks/config/slip.xml.h:2
-#: hacks/config/speedmine.xml.h:3 hacks/config/sphere.xml.h:2
-#: hacks/config/spheremonics.xml.h:5 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:1 hacks/config/superquadrics.xml.h:4
+#: hacks/config/pinion.xml.h:5 hacks/config/pipes.xml.h:5
+#: hacks/config/polyhedra.xml.h:18 hacks/config/polyominoes.xml.h:2
+#: hacks/config/polytopes.xml.h:11 hacks/config/pong.xml.h:1
+#: hacks/config/popsquares.xml.h:3 hacks/config/providence.xml.h:2
+#: 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
+#: hacks/config/rocks.xml.h:4 hacks/config/rotor.xml.h:3
+#: hacks/config/rubik.xml.h:3 hacks/config/sballs.xml.h:4
+#: hacks/config/shadebobs.xml.h:3 hacks/config/sierpinski.xml.h:2
+#: hacks/config/sierpinski3d.xml.h:2 hacks/config/slidescreen.xml.h:2
+#: hacks/config/slip.xml.h:2 hacks/config/speedmine.xml.h:3
+#: hacks/config/sphere.xml.h:2 hacks/config/spheremonics.xml.h:5
+#: 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:1
+#: hacks/config/substrate.xml.h:2 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/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
@@ -1125,8 +1127,9 @@ msgstr "Snel"
 #: hacks/config/fuzzyflakes.xml.h:8 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/fuzzyflakes.xml.h:8 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/wormhole.xml.h:3 hacks/config/xfishtank.xml.h:4
+#: hacks/config/substrate.xml.h:3 hacks/config/thornbird.xml.h:3
+#: hacks/config/whirlwindwarp.xml.h:1 hacks/config/wormhole.xml.h:3
+#: hacks/config/xfishtank.xml.h:4
 msgid "Few"
 msgstr "Weinig"
 
 msgid "Few"
 msgstr "Weinig"
 
@@ -1142,7 +1145,7 @@ msgstr "Weinig"
 #: hacks/config/epicycle.xml.h:8 hacks/config/eruption.xml.h:12
 #: hacks/config/euler2d.xml.h:8 hacks/config/fadeplot.xml.h:6
 #: hacks/config/flag.xml.h:5 hacks/config/flame.xml.h:11
 #: hacks/config/epicycle.xml.h:8 hacks/config/eruption.xml.h:12
 #: hacks/config/euler2d.xml.h:8 hacks/config/fadeplot.xml.h:6
 #: hacks/config/flag.xml.h:5 hacks/config/flame.xml.h:11
-#: hacks/config/flow.xml.h:8 hacks/config/fluidballs.xml.h:13
+#: hacks/config/flow.xml.h:7 hacks/config/fluidballs.xml.h:13
 #: hacks/config/forest.xml.h:3 hacks/config/fuzzyflakes.xml.h:12
 #: 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/forest.xml.h:3 hacks/config/fuzzyflakes.xml.h:12
 #: hacks/config/galaxy.xml.h:6 hacks/config/grav.xml.h:4
 #: hacks/config/halo.xml.h:4 hacks/config/hopalong.xml.h:15
@@ -1180,7 +1183,7 @@ msgstr "Veel"
 #: 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/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/flow.xml.h:8 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/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
@@ -1234,22 +1237,23 @@ msgstr "Zelden"
 #: 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/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/flyingtoasters.xml.h:11
-#: hacks/config/fontglide.xml.h:13 hacks/config/forest.xml.h:5
-#: hacks/config/fuzzyflakes.xml.h:15 hacks/config/galaxy.xml.h:10
-#: hacks/config/gears.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:8 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:10 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/fadeplot.xml.h:8 hacks/config/fireworkx.xml.h:9
+#: 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:10 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/fuzzyflakes.xml.h:15
+#: hacks/config/galaxy.xml.h:11 hacks/config/gears.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:8
+#: 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:10
+#: 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/intermomentary.xml.h:4 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/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
@@ -1267,23 +1271,24 @@ msgstr "Zelden"
 #: hacks/config/pacman.xml.h:5 hacks/config/penetrate.xml.h:6
 #: hacks/config/penrose.xml.h:11 hacks/config/petri.xml.h:23
 #: hacks/config/phosphor.xml.h:7 hacks/config/piecewise.xml.h:9
 #: hacks/config/pacman.xml.h:5 hacks/config/penetrate.xml.h:6
 #: hacks/config/penrose.xml.h:11 hacks/config/petri.xml.h:23
 #: hacks/config/phosphor.xml.h:7 hacks/config/piecewise.xml.h:9
-#: hacks/config/pipes.xml.h:15 hacks/config/polyhedra.xml.h:119
-#: hacks/config/polyominoes.xml.h:10 hacks/config/polytopes.xml.h:20
-#: hacks/config/pong.xml.h:4 hacks/config/popsquares.xml.h:5
-#: hacks/config/providence.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 hacks/config/rocks.xml.h:9
-#: hacks/config/rotor.xml.h:11 hacks/config/rubik.xml.h:9
-#: hacks/config/sballs.xml.h:13 hacks/config/shadebobs.xml.h:9
-#: hacks/config/sierpinski.xml.h:7 hacks/config/sierpinski3d.xml.h:8
-#: hacks/config/slidescreen.xml.h:6 hacks/config/slip.xml.h:7
-#: hacks/config/speedmine.xml.h:13 hacks/config/sphere.xml.h:5
-#: hacks/config/spheremonics.xml.h:19 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:4 hacks/config/superquadrics.xml.h:8
+#: hacks/config/pinion.xml.h:13 hacks/config/pipes.xml.h:15
+#: hacks/config/polyhedra.xml.h:119 hacks/config/polyominoes.xml.h:10
+#: hacks/config/polytopes.xml.h:20 hacks/config/pong.xml.h:4
+#: hacks/config/popsquares.xml.h:5 hacks/config/providence.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
+#: hacks/config/rocks.xml.h:9 hacks/config/rotor.xml.h:11
+#: hacks/config/rubik.xml.h:9 hacks/config/sballs.xml.h:13
+#: hacks/config/shadebobs.xml.h:9 hacks/config/sierpinski.xml.h:7
+#: hacks/config/sierpinski3d.xml.h:8 hacks/config/slidescreen.xml.h:6
+#: hacks/config/slip.xml.h:7 hacks/config/speedmine.xml.h:13
+#: hacks/config/sphere.xml.h:5 hacks/config/spheremonics.xml.h:19
+#: 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:4
+#: hacks/config/substrate.xml.h:10 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/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
@@ -1316,17 +1321,18 @@ msgstr "Langzaam"
 #: hacks/config/engine.xml.h:16 hacks/config/epicycle.xml.h:11
 #: 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/engine.xml.h:16 hacks/config/epicycle.xml.h:11
 #: 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/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/fuzzyflakes.xml.h:17
-#: hacks/config/galaxy.xml.h:11 hacks/config/glblur.xml.h:17
-#: hacks/config/glforestfire.xml.h:15 hacks/config/glplanet.xml.h:10
-#: 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:11 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/fireworkx.xml.h:11 hacks/config/flag.xml.h:9
+#: hacks/config/flame.xml.h:15 hacks/config/flipflop.xml.h:7
+#: hacks/config/flipscreen3d.xml.h:7 hacks/config/flow.xml.h:12
+#: hacks/config/fluidballs.xml.h:20 hacks/config/forest.xml.h:6
+#: hacks/config/fuzzyflakes.xml.h:17 hacks/config/galaxy.xml.h:12
+#: hacks/config/glblur.xml.h:17 hacks/config/glforestfire.xml.h:15
+#: hacks/config/glplanet.xml.h:10 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:11
+#: 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/intermomentary.xml.h:5 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/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
@@ -1355,16 +1361,16 @@ msgstr "Langzaam"
 #: 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/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/xplanet.xml.h:60 hacks/config/xrayswarm.xml.h:4
-#: hacks/config/zoom.xml.h:7
+#: hacks/config/strange.xml.h:5 hacks/config/substrate.xml.h:11
+#: 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/xplanet.xml.h:60
+#: hacks/config/xrayswarm.xml.h:4 hacks/config/zoom.xml.h:7
 msgid "Speed"
 msgstr "Snelheid"
 
 msgid "Speed"
 msgstr "Snelheid"
 
@@ -1407,8 +1413,8 @@ msgstr "Draaisnelheid"
 #: hacks/config/discrete.xml.h:11 hacks/config/drift.xml.h:14
 #: hacks/config/epicycle.xml.h:13 hacks/config/euler2d.xml.h:17
 #: hacks/config/fadeplot.xml.h:12 hacks/config/flag.xml.h:13
 #: hacks/config/discrete.xml.h:11 hacks/config/drift.xml.h:14
 #: hacks/config/epicycle.xml.h:13 hacks/config/euler2d.xml.h:17
 #: hacks/config/fadeplot.xml.h:12 hacks/config/flag.xml.h:13
-#: hacks/config/flame.xml.h:16 hacks/config/flow.xml.h:18
-#: hacks/config/forest.xml.h:8 hacks/config/galaxy.xml.h:13
+#: hacks/config/flame.xml.h:16 hacks/config/flow.xml.h:15
+#: hacks/config/forest.xml.h:8 hacks/config/galaxy.xml.h:14
 #: hacks/config/grav.xml.h:11 hacks/config/halo.xml.h:13
 #: hacks/config/hopalong.xml.h:25 hacks/config/ifs.xml.h:8
 #: hacks/config/imsmap.xml.h:15 hacks/config/interference.xml.h:19
 #: hacks/config/grav.xml.h:11 hacks/config/halo.xml.h:13
 #: hacks/config/hopalong.xml.h:25 hacks/config/ifs.xml.h:8
 #: hacks/config/imsmap.xml.h:15 hacks/config/interference.xml.h:19
@@ -1512,7 +1518,7 @@ msgstr "Vierzijdige Cellen"
 #: 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/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/flag.xml.h:4 hacks/config/flow.xml.h:4
 #: hacks/config/fluidballs.xml.h:12 hacks/config/fuzzyflakes.xml.h:10
 #: 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/fluidballs.xml.h:12 hacks/config/fuzzyflakes.xml.h:10
 #: hacks/config/gleidescope.xml.h:7 hacks/config/halftone.xml.h:8
 #: hacks/config/hopalong.xml.h:13 hacks/config/interference.xml.h:11
@@ -1544,7 +1550,7 @@ msgstr "Zeskantige Cellen"
 #: 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/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/flag.xml.h:8 hacks/config/flow.xml.h:11
 #: hacks/config/fluidballs.xml.h:19 hacks/config/fuzzyflakes.xml.h:16
 #: 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/fluidballs.xml.h:19 hacks/config/fuzzyflakes.xml.h:16
 #: hacks/config/gleidescope.xml.h:12 hacks/config/halftone.xml.h:14
 #: hacks/config/hopalong.xml.h:22 hacks/config/interference.xml.h:18
@@ -1563,7 +1569,7 @@ 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
 
 #: 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/flag.xml.h:12 hacks/config/flow.xml.h:14
 #: hacks/config/lissie.xml.h:12 hacks/config/loop.xml.h:11
 #: hacks/config/rubik.xml.h:12 hacks/config/sierpinski.xml.h:11
 #: hacks/config/slip.xml.h:11
 #: hacks/config/lissie.xml.h:12 hacks/config/loop.xml.h:11
 #: hacks/config/rubik.xml.h:12 hacks/config/sierpinski.xml.h:11
 #: hacks/config/slip.xml.h:11
@@ -1614,13 +1620,14 @@ msgstr ""
 #: hacks/config/menger.xml.h:15 hacks/config/mirrorblob.xml.h:18
 #: hacks/config/moebius.xml.h:6 hacks/config/molecule.xml.h:21
 #: hacks/config/morph3d.xml.h:5 hacks/config/noof.xml.h:4
 #: hacks/config/menger.xml.h:15 hacks/config/mirrorblob.xml.h:18
 #: hacks/config/moebius.xml.h:6 hacks/config/molecule.xml.h:21
 #: hacks/config/morph3d.xml.h:5 hacks/config/noof.xml.h:4
-#: hacks/config/pipes.xml.h:14 hacks/config/polyhedra.xml.h:118
-#: hacks/config/polytopes.xml.h:18 hacks/config/providence.xml.h:4
-#: 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
+#: hacks/config/pinion.xml.h:12 hacks/config/pipes.xml.h:14
+#: hacks/config/polyhedra.xml.h:118 hacks/config/polytopes.xml.h:18
+#: hacks/config/providence.xml.h:4 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 "Toon Beelden-per-Seconde"
 
 msgid "Show Frames-per-Second"
 msgstr "Toon Beelden-per-Seconde"
 
@@ -1787,11 +1794,12 @@ msgstr "Walvis Snelheid"
 #: hacks/config/lament.xml.h:9 hacks/config/lavalite.xml.h:32
 #: hacks/config/menger.xml.h:21 hacks/config/mirrorblob.xml.h:24
 #: hacks/config/moebius.xml.h:11 hacks/config/molecule.xml.h:26
 #: hacks/config/lament.xml.h:9 hacks/config/lavalite.xml.h:32
 #: hacks/config/menger.xml.h:21 hacks/config/mirrorblob.xml.h:24
 #: hacks/config/moebius.xml.h:11 hacks/config/molecule.xml.h:26
-#: hacks/config/polyhedra.xml.h:173 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
+#: hacks/config/pinion.xml.h:15 hacks/config/polyhedra.xml.h:173
+#: 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 "Draadraamwerk"
 
 msgid "Wireframe"
 msgstr "Draadraamwerk"
 
@@ -1889,14 +1897,15 @@ msgstr "Lijnen"
 #: 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/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/mismunch.xml.h:3
-#: 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 hacks/config/spheremonics.xml.h:7
+#: hacks/config/flow.xml.h:6 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/mismunch.xml.h:3 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
+#: hacks/config/spheremonics.xml.h:7 hacks/config/substrate.xml.h:6
 #: hacks/config/wander.xml.h:10 hacks/config/whirlwindwarp.xml.h:3
 msgid "Long"
 msgstr "Lang"
 #: hacks/config/wander.xml.h:10 hacks/config/whirlwindwarp.xml.h:3
 msgid "Long"
 msgstr "Lang"
@@ -1943,13 +1952,14 @@ msgstr "Afstotingsdrempelwaarde"
 #: 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/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/metaballs.xml.h:12 hacks/config/mismunch.xml.h:8
-#: 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/flow.xml.h:9 hacks/config/galaxy.xml.h:9
+#: hacks/config/klein.xml.h:5 hacks/config/laser.xml.h:9
+#: hacks/config/menger.xml.h:14 hacks/config/metaballs.xml.h:12
+#: hacks/config/mismunch.xml.h:8 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/substrate.xml.h:9
 #: hacks/config/wander.xml.h:12 hacks/config/whirlwindwarp.xml.h:6
 msgid "Short"
 msgstr "Kort"
 #: hacks/config/wander.xml.h:12 hacks/config/whirlwindwarp.xml.h:6
 msgid "Short"
 msgstr "Kort"
@@ -2171,10 +2181,10 @@ msgstr ""
 #: 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/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/polyhedra.xml.h:3 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/wormhole.xml.h:1
-#: hacks/config/xfishtank.xml.h:1
+#: hacks/config/pinion.xml.h:3 hacks/config/polyhedra.xml.h:3
+#: 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/wormhole.xml.h:1 hacks/config/xfishtank.xml.h:1
 msgid "Animation Speed"
 msgstr "Animatiesnelheid"
 
 msgid "Animation Speed"
 msgstr "Animatiesnelheid"
 
@@ -2253,8 +2263,9 @@ msgstr ""
 #: 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/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/starfish.xml.h:2 hacks/config/substrate.xml.h:1
+#: hacks/config/vidwhacker.xml.h:3 hacks/config/wander.xml.h:7
+#: hacks/config/xspirograph.xml.h:3
 msgid "Duration"
 msgstr "Duur"
 
 msgid "Duration"
 msgstr "Duur"
 
@@ -2519,7 +2530,7 @@ msgstr "Onderdelen"
 msgid "Rotate"
 msgstr "Draaien"
 
 msgid "Rotate"
 msgstr "Draaien"
 
-#: hacks/config/circuit.xml.h:8
+#: hacks/config/circuit.xml.h:8 hacks/config/pinion.xml.h:10
 msgid "Rotation Speed"
 msgstr "Rotatie-Snelheid"
 
 msgid "Rotation Speed"
 msgstr "Rotatie-Snelheid"
 
@@ -2609,11 +2620,12 @@ msgstr "1 Seconde"
 msgid "Coral"
 msgstr "Koraal"
 
 msgid "Coral"
 msgstr "Koraal"
 
-#: hacks/config/coral.xml.h:4 hacks/config/gflux.xml.h:3
-#: hacks/config/glblur.xml.h:2 hacks/config/glmatrix.xml.h:3
-#: 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
+#: hacks/config/coral.xml.h:4 hacks/config/fireworkx.xml.h:2
+#: hacks/config/gflux.xml.h:3 hacks/config/glblur.xml.h:2
+#: hacks/config/glmatrix.xml.h:3 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
 msgid "Dense"
 msgstr "Dichter opeen"
 
 msgid "Dense"
 msgstr "Dichter opeen"
 
@@ -2628,12 +2640,12 @@ msgstr ""
 "Simulteerd Koraalgroei, alhoewel wat langzamer. Geschreven door Frederick-"
 "Roeber."
 
 "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
-#: hacks/config/imsmap.xml.h:13 hacks/config/lavalite.xml.h:29
-#: hacks/config/pyro.xml.h:14 hacks/config/qix.xml.h:21
-#: hacks/config/squiral.xml.h:15 hacks/config/xearth.xml.h:24
-#: hacks/config/xmatrix.xml.h:17
+#: hacks/config/coral.xml.h:13 hacks/config/fireworkx.xml.h:10
+#: hacks/config/gflux.xml.h:13 hacks/config/glblur.xml.h:16
+#: hacks/config/glmatrix.xml.h:19 hacks/config/imsmap.xml.h:13
+#: hacks/config/lavalite.xml.h:29 hacks/config/pyro.xml.h:14
+#: hacks/config/qix.xml.h:21 hacks/config/squiral.xml.h:15
+#: hacks/config/xearth.xml.h:24 hacks/config/xmatrix.xml.h:17
 msgid "Sparse"
 msgstr "Schaars"
 
 msgid "Sparse"
 msgstr "Schaars"
 
@@ -2668,7 +2680,7 @@ msgid "Center on Screen"
 msgstr "Centreren op beeldscherm"
 
 #: hacks/config/crystal.xml.h:2 hacks/config/deluxe.xml.h:1
 msgstr "Centreren op beeldscherm"
 
 #: hacks/config/crystal.xml.h:2 hacks/config/deluxe.xml.h:1
-#: hacks/config/fadeplot.xml.h:1 hacks/config/flow.xml.h:3
+#: hacks/config/fadeplot.xml.h:1 hacks/config/flow.xml.h:1
 #: hacks/config/galaxy.xml.h:1 hacks/config/glforestfire.xml.h:1
 #: hacks/config/grav.xml.h:1 hacks/config/julia.xml.h:1
 #: hacks/config/laser.xml.h:1 hacks/config/lisa.xml.h:1
 #: hacks/config/galaxy.xml.h:1 hacks/config/glforestfire.xml.h:1
 #: hacks/config/grav.xml.h:1 hacks/config/julia.xml.h:1
 #: hacks/config/laser.xml.h:1 hacks/config/lisa.xml.h:1
@@ -3443,7 +3455,7 @@ msgstr "Afkoel factor"
 msgid "Half"
 msgstr "Halo"
 
 msgid "Half"
 msgstr "Halo"
 
-#: hacks/config/fireflies.xml.h:17
+#: hacks/config/fireflies.xml.h:17 hacks/config/pinion.xml.h:7
 #, fuzzy
 msgid "Huge"
 msgstr "Groot Vuur"
 #, fuzzy
 msgid "Huge"
 msgstr "Groot Vuur"
@@ -3540,7 +3552,7 @@ msgstr ""
 msgid "Swarm tails glow"
 msgstr ""
 
 msgid "Swarm tails glow"
 msgstr ""
 
-#: hacks/config/fireflies.xml.h:43
+#: hacks/config/fireflies.xml.h:43 hacks/config/pinion.xml.h:14
 #, fuzzy
 msgid "Tiny"
 msgstr "Dun"
 #, fuzzy
 msgid "Tiny"
 msgstr "Dun"
@@ -3558,6 +3570,33 @@ msgstr "Wind"
 msgid "Wind picks up"
 msgstr ""
 
 msgid "Wind picks up"
 msgstr ""
 
+#: hacks/config/fireworkx.xml.h:1 hacks/config/lavalite.xml.h:3
+msgid "Activity"
+msgstr "Activiteit"
+
+#: hacks/config/fireworkx.xml.h:4
+msgid "Fast Fade (more realistic)"
+msgstr ""
+
+#: hacks/config/fireworkx.xml.h:5
+#, fuzzy
+msgid "Fireworkx"
+msgstr "Vuur"
+
+#: hacks/config/fireworkx.xml.h:6
+#, fuzzy
+msgid "Light effect"
+msgstr "Belichtingseffect"
+
+#: hacks/config/fireworkx.xml.h:7
+msgid "Pyrotechnics simulation eye-candy. Written by Rony B. Chandran."
+msgstr ""
+
+#: hacks/config/fireworkx.xml.h:8
+#, fuzzy
+msgid "Shoot"
+msgstr "Kort"
+
 #: hacks/config/flag.xml.h:1
 msgid "Bitmap for Flag"
 msgstr "Bitmap voor Vlag"
 #: hacks/config/flag.xml.h:1
 msgid "Bitmap for Flag"
 msgstr "Bitmap voor Vlag"
@@ -3637,43 +3676,46 @@ msgid ""
 "around and deforms it in various ways. Written by Ben Buxton."
 msgstr ""
 
 "around and deforms it in various ways. Written by Ben Buxton."
 msgstr ""
 
-#: hacks/config/flow.xml.h:1
-msgid "Allow 2D Attractors"
-msgstr "2D-Attractors Toestaan"
-
-#: hacks/config/flow.xml.h:2
-msgid ""
-"Another series of strange attractors: a flowing series of points, making "
-"strange rotational shapes. Written by Tim Auckland."
-msgstr ""
-
-#: hacks/config/flow.xml.h:5
+#: hacks/config/flow.xml.h:3
 msgid "Flow"
 msgstr "Stroming"
 
 msgid "Flow"
 msgstr "Stroming"
 
-#: hacks/config/flow.xml.h:6
-msgid "Freeze Some Bees"
-msgstr "Bevries Sommige Bijen"
+#: hacks/config/flow.xml.h:5
+#, fuzzy
+msgid "Length of trails"
+msgstr "Laat spoor achter"
 
 
-#: hacks/config/flow.xml.h:10
-msgid "Ride a Trained Bee"
-msgstr "Met een Getrainde Bij Meerijden"
+#: hacks/config/flow.xml.h:13
+msgid ""
+"Strange attractors formed of flows in a 3D differential equation phase "
+"space. Written by Tim Auckland."
+msgstr ""
 
 
-#: hacks/config/flow.xml.h:11
-msgid "Rotate Around Attractor"
-msgstr "Om de Aantrekker Heendraaien"
+#: hacks/config/flow.xml.h:16
+msgid "turn on/off bounding box."
+msgstr ""
 
 
-#: hacks/config/flow.xml.h:12
-msgid "Show Bounding Box"
-msgstr "Toon Begrensingsbalk"
+#: hacks/config/flow.xml.h:17
+#, fuzzy
+msgid "turn on/off double buffering."
+msgstr "Gebruik Dubbele Buffer"
 
 
-#: hacks/config/flow.xml.h:14
-msgid "Slow Bees with Antifreeze"
-msgstr "Bijen met Antivries Afremmen."
+#: hacks/config/flow.xml.h:18
+msgid "turn on/off periodic attractors."
+msgstr ""
 
 #: hacks/config/flow.xml.h:19
 
 #: hacks/config/flow.xml.h:19
-msgid "Zoom In and Out"
-msgstr "In en Uitzoomen"
+msgid "turn on/off ride in the flow."
+msgstr ""
+
+#: hacks/config/flow.xml.h:20
+#, fuzzy
+msgid "turn on/off rotating around attractor."
+msgstr "Om de Aantrekker Heendraaien"
+
+#: hacks/config/flow.xml.h:21
+msgid "turn on/off search for new attractors."
+msgstr ""
 
 #: hacks/config/fluidballs.xml.h:1
 msgid "      Freefall"
 
 #: hacks/config/fluidballs.xml.h:1
 msgid "      Freefall"
@@ -3888,7 +3930,12 @@ msgstr "Willekeurige Beweging"
 msgid "Galaxy"
 msgstr "Sterrenstelsel"
 
 msgid "Galaxy"
 msgstr "Sterrenstelsel"
 
-#: hacks/config/galaxy.xml.h:9 hacks/config/lisa.xml.h:7
+#: hacks/config/galaxy.xml.h:8
+#, fuzzy
+msgid "Rotate Viewpoint"
+msgstr "Lineaire beweging"
+
+#: hacks/config/galaxy.xml.h:10 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/pong.xml.h:3
 #: hacks/config/rotor.xml.h:10 hacks/config/rubik.xml.h:8
 #: hacks/config/lissie.xml.h:8 hacks/config/loop.xml.h:6
 #: hacks/config/penrose.xml.h:10 hacks/config/pong.xml.h:3
 #: hacks/config/rotor.xml.h:10 hacks/config/rubik.xml.h:8
@@ -3897,7 +3944,7 @@ msgstr "Sterrenstelsel"
 msgid "Size"
 msgstr "Grootte"
 
 msgid "Size"
 msgstr "Grootte"
 
-#: hacks/config/galaxy.xml.h:12
+#: hacks/config/galaxy.xml.h:13
 msgid ""
 "This draws spinning galaxies, which then collide and scatter their stars to "
 "the, uh, four winds or something. Originally an Amiga program by Uli "
 msgid ""
 "This draws spinning galaxies, which then collide and scatter their stars to "
 "the, uh, four winds or something. Originally an Amiga program by Uli "
@@ -4203,9 +4250,9 @@ msgid ""
 "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 "
 "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."
+"of this window: the tab at the top of the *other* window.) 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
 msgstr ""
 
 #: hacks/config/glslideshow.xml.h:17
@@ -4744,6 +4791,27 @@ msgstr "Aantal Golven"
 msgid "Wave Size"
 msgstr "Golfgrootte"
 
 msgid "Wave Size"
 msgstr "Golfgrootte"
 
+#: hacks/config/intermomentary.xml.h:2
+msgid "Intermomentary"
+msgstr ""
+
+#: hacks/config/intermomentary.xml.h:3
+#, fuzzy
+msgid "Number of Discs"
+msgstr "Aantal Sneden"
+
+#: hacks/config/intermomentary.xml.h:6
+msgid ""
+"The Intersection Momentary is a fun visualization defining the relationships "
+"between objects with Casey Reas, William Ngan, and Robert Hodgin. "
+"Commissioned for display at the Whitney Museum of American Art. A surface "
+"filled with 100 medium to small sized circles. Each circle has a different "
+"size and direction, but moves at the same slow rate. Display: A. The "
+"instantaneous intersections of the circles. B. The aggregate intersections "
+"of the circles. Ported to XScreensaver from the art project \"InterMomentary"
+"\" at http://www.complexification.net"
+msgstr ""
+
 #: hacks/config/jigglypuff.xml.h:2
 msgid "Chrome"
 msgstr "Chrome"
 #: hacks/config/jigglypuff.xml.h:2
 msgid "Chrome"
 msgstr "Chrome"
@@ -4966,10 +5034,6 @@ msgstr ""
 msgid "10"
 msgstr "10"
 
 msgid "10"
 msgstr "10"
 
-#: hacks/config/lavalite.xml.h:3
-msgid "Activity"
-msgstr "Activiteit"
-
 #: hacks/config/lavalite.xml.h:4
 msgid "Classic Lavalite"
 msgstr "Klassieke Lavalamp"
 #: hacks/config/lavalite.xml.h:4
 msgid "Classic Lavalite"
 msgstr "Klassieke Lavalamp"
@@ -5700,6 +5764,44 @@ msgid ""
 "invisibility at intersection points. Written by Geoffrey Irving."
 msgstr ""
 
 "invisibility at intersection points. Written by Geoffrey Irving."
 msgstr ""
 
+#: hacks/config/pinion.xml.h:1
+#, fuzzy
+msgid "100"
+msgstr "100%"
+
+#: hacks/config/pinion.xml.h:2
+msgid "2000"
+msgstr ""
+
+#: hacks/config/pinion.xml.h:4
+#, fuzzy
+msgid ""
+"Draws an interconnected set of gears moving across the screen. Written by "
+"Jamie Zawinski."
+msgstr ""
+"Deze toont willekeurig gekleurde en gestippelde rechthoeken. Geschreven door "
+"Jamie Zawinski."
+
+#: hacks/config/pinion.xml.h:6
+#, fuzzy
+msgid "Gear Size"
+msgstr "Raamwerk Grootte"
+
+#: hacks/config/pinion.xml.h:8
+#, fuzzy
+msgid "Max RPM"
+msgstr "Max Ringen"
+
+#: hacks/config/pinion.xml.h:9
+#, fuzzy
+msgid "Pinion"
+msgstr "Meedraaien"
+
+#: hacks/config/pinion.xml.h:11
+#, fuzzy
+msgid "Scrolling Speed"
+msgstr "Schuifsnelheid"
+
 #: hacks/config/pipes.xml.h:1
 msgid "Allow Tight Turns"
 msgstr "Scherpe Bochten Toestaan"
 #: hacks/config/pipes.xml.h:1
 msgid "Allow Tight Turns"
 msgstr "Scherpe Bochten Toestaan"
@@ -5726,7 +5828,8 @@ msgid ""
 "probably seen this GL hack. This version is by Marcelo Vianna."
 msgstr ""
 
 "probably seen this GL hack. This version is by Marcelo Vianna."
 msgstr ""
 
-#: hacks/config/pipes.xml.h:9 hacks/config/wormhole.xml.h:4
+#: hacks/config/pipes.xml.h:9 hacks/config/substrate.xml.h:7
+#: hacks/config/wormhole.xml.h:4
 msgid "Lots"
 msgstr "Vele"
 
 msgid "Lots"
 msgstr "Vele"
 
@@ -7005,22 +7108,26 @@ msgid "Ping subnet/30 (2 hosts)"
 msgstr ""
 
 #: hacks/config/sonar.xml.h:10
 msgstr ""
 
 #: hacks/config/sonar.xml.h:10
+msgid "Resolve Host Names"
+msgstr ""
+
+#: hacks/config/sonar.xml.h:11
 msgid "Simulation Team Members"
 msgstr "Simuleer Teamleden"
 
 msgid "Simulation Team Members"
 msgstr "Simuleer Teamleden"
 
-#: hacks/config/sonar.xml.h:11
+#: hacks/config/sonar.xml.h:12
 msgid "Sonar"
 msgstr "Sonar"
 
 msgid "Sonar"
 msgstr "Sonar"
 
-#: hacks/config/sonar.xml.h:12
+#: hacks/config/sonar.xml.h:13
 msgid "Team A Name"
 msgstr "Naam Team A"
 
 msgid "Team A Name"
 msgstr "Naam Team A"
 
-#: hacks/config/sonar.xml.h:13
+#: hacks/config/sonar.xml.h:14
 msgid "Team B Name"
 msgstr "Naam Team B"
 
 msgid "Team B Name"
 msgstr "Naam Team B"
 
-#: hacks/config/sonar.xml.h:14
+#: hacks/config/sonar.xml.h:15
 msgid ""
 "This program draws a simulation of a sonar screen. By default, it displays a "
 "random assortment of ``bogies'' on the screen, but if installed as \"setuid "
 msgid ""
 "This program draws a simulation of a sonar screen. By default, it displays a "
 "random assortment of ``bogies'' on the screen, but if installed as \"setuid "
@@ -7029,7 +7136,7 @@ msgid ""
 "Martin and Jamie Zawinski."
 msgstr ""
 
 "Martin and Jamie Zawinski."
 msgstr ""
 
-#: hacks/config/sonar.xml.h:15
+#: hacks/config/sonar.xml.h:16
 msgid "vs."
 msgstr "vs."
 
 msgid "vs."
 msgstr "vs."
 
@@ -7306,6 +7413,33 @@ msgid ""
 "Written by Massimino Pascal."
 msgstr ""
 
 "Written by Massimino Pascal."
 msgstr ""
 
+#: hacks/config/substrate.xml.h:4
+#, fuzzy
+msgid "Initial Cracks"
+msgstr "Voorafgaande Dichtheid"
+
+#: hacks/config/substrate.xml.h:5
+msgid ""
+"Lines like crystals grow on a computational substrate. A simple "
+"perpendicular growth rule creates intricate city-like structures. By J. "
+"Tarbell and Mike Kershaw."
+msgstr ""
+
+#: hacks/config/substrate.xml.h:8
+#, fuzzy
+msgid "Sandgrains"
+msgstr "Op zichzelf staand"
+
+#: hacks/config/substrate.xml.h:12
+#, fuzzy
+msgid "Substrate"
+msgstr "Toestanden"
+
+#: hacks/config/substrate.xml.h:13
+#, fuzzy
+msgid "Wireframe only"
+msgstr "Draadraamwerk-Koe"
+
 #: hacks/config/superquadrics.xml.h:3
 msgid ""
 "Ed Mackey reports that he wrote the first version of this program in BASIC "
 #: hacks/config/superquadrics.xml.h:3
 msgid ""
 "Ed Mackey reports that he wrote the first version of this program in BASIC "
@@ -8482,6 +8616,24 @@ msgstr ""
 "lenses is het resultaat alsof je door overlappende lenzen kijkt in plaats "
 "van een eenvoudige zoom. Geschreven door James Macnicol."
 
 "lenses is het resultaat alsof je door overlappende lenzen kijkt in plaats "
 "van een eenvoudige zoom. Geschreven door James Macnicol."
 
+#~ msgid "Allow 2D Attractors"
+#~ msgstr "2D-Attractors Toestaan"
+
+#~ msgid "Freeze Some Bees"
+#~ msgstr "Bevries Sommige Bijen"
+
+#~ msgid "Ride a Trained Bee"
+#~ msgstr "Met een Getrainde Bij Meerijden"
+
+#~ msgid "Show Bounding Box"
+#~ msgstr "Toon Begrensingsbalk"
+
+#~ msgid "Slow Bees with Antifreeze"
+#~ msgstr "Bijen met Antivries Afremmen."
+
+#~ msgid "Zoom In and Out"
+#~ msgstr "In en Uitzoomen"
+
 #~ msgid "Ping Subnet"
 #~ msgstr "Ping het Subnet"
 
 #~ msgid "Ping Subnet"
 #~ msgstr "Ping het Subnet"
 
index 94854bb0ef25379c75d80a77cbf6fd45d98e0655..248cd1709646a0ca6f48e1311b1cc9a19882e3b1 100644 (file)
--- a/po/no.po
+++ b/po/no.po
@@ -6,7 +6,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: control-center 1.5.8\n"
 "Report-Msgid-Bugs-To: \n"
 msgstr ""
 "Project-Id-Version: control-center 1.5.8\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2004-10-04 16:25+0200\n"
+"POT-Creation-Date: 2004-12-22 12:51+0100\n"
 "PO-Revision-Date: 2002-09-03 18:28+0200\n"
 "Last-Translator: Kjartan Maraas <kmaraas@gnome.org>\n"
 "Language-Team: Norwegian <no@li.org>\n"
 "PO-Revision-Date: 2002-09-03 18:28+0200\n"
 "Last-Translator: Kjartan Maraas <kmaraas@gnome.org>\n"
 "Language-Team: Norwegian <no@li.org>\n"
@@ -145,7 +145,7 @@ msgstr ""
 msgid "minutes"
 msgstr "minutter"
 
 msgid "minutes"
 msgstr "minutter"
 
-#: driver/demo-Gtk-widgets.c:482 driver/demo-Gtk.c:2845
+#: driver/demo-Gtk-widgets.c:482 driver/demo-Gtk.c:2852
 #: driver/xscreensaver-demo.glade.h:58
 msgid "Preview"
 msgstr "Forhåndsvisning"
 #: driver/xscreensaver-demo.glade.h:58
 msgid "Preview"
 msgstr "Forhåndsvisning"
@@ -190,12 +190,12 @@ msgstr "Kun 
 msgid "Random Screen Saver"
 msgstr "Tilfeldig skjermsparer"
 
 msgid "Random Screen Saver"
 msgstr "Tilfeldig skjermsparer"
 
-#: driver/demo-Gtk-widgets.c:571 driver/demo-Gtk.c:2134
+#: driver/demo-Gtk-widgets.c:571 driver/demo-Gtk.c:2141
 #: driver/xscreensaver-demo.glade.h:75
 msgid "Use"
 msgstr "Bruk"
 
 #: driver/xscreensaver-demo.glade.h:75
 msgid "Use"
 msgstr "Bruk"
 
-#: driver/demo-Gtk-widgets.c:591 driver/demo-Gtk.c:2144
+#: driver/demo-Gtk-widgets.c:591 driver/demo-Gtk.c:2151
 #: driver/xscreensaver-demo.glade.h:63
 msgid "Screen Saver"
 msgstr "Skjermsparer"
 #: driver/xscreensaver-demo.glade.h:63
 msgid "Screen Saver"
 msgstr "Skjermsparer"
@@ -425,7 +425,7 @@ msgid "Visual:"
 msgstr "Synlig:"
 
 #: driver/demo-Gtk-widgets.c:1550 driver/demo-Gtk-widgets.c:1573
 msgstr "Synlig:"
 
 #: driver/demo-Gtk-widgets.c:1550 driver/demo-Gtk-widgets.c:1573
-#: driver/demo-Gtk.c:1538 driver/demo-Gtk.c:2864
+#: driver/demo-Gtk.c:1545 driver/demo-Gtk.c:2871
 #: driver/xscreensaver-demo.glade.h:5 driver/xscreensaver-demo.glade2.h:3
 msgid "Any"
 msgstr "Enhver"
 #: driver/xscreensaver-demo.glade.h:5 driver/xscreensaver-demo.glade2.h:3
 msgid "Any"
 msgstr "Enhver"
@@ -524,7 +524,7 @@ msgstr "Generell <<"
 msgid "Back to the graphical configuration options."
 msgstr ""
 
 msgid "Back to the graphical configuration options."
 msgstr ""
 
-#: driver/demo-Gtk-widgets.c:1709 driver/demo-Gtk.c:741
+#: driver/demo-Gtk-widgets.c:1709 driver/demo-Gtk.c:748
 #: driver/xscreensaver-demo.glade.h:54
 msgid "OK"
 msgstr "OK"
 #: driver/xscreensaver-demo.glade.h:54
 msgid "OK"
 msgstr "OK"
@@ -533,11 +533,11 @@ msgstr "OK"
 msgid "Cancel"
 msgstr "Avbryt"
 
 msgid "Cancel"
 msgstr "Avbryt"
 
-#: driver/demo-Gtk.c:649
+#: driver/demo-Gtk.c:656
 msgid "For updates, check http://www.jwz.org/xscreensaver/"
 msgstr "For oppdateringer, sjekk http://www.jwz.org/xscreensaver/"
 
 msgid "For updates, check http://www.jwz.org/xscreensaver/"
 msgstr "For oppdateringer, sjekk http://www.jwz.org/xscreensaver/"
 
-#: driver/demo-Gtk.c:779
+#: driver/demo-Gtk.c:786
 msgid ""
 "Error:\n"
 "\n"
 msgid ""
 "Error:\n"
 "\n"
@@ -547,7 +547,7 @@ msgstr ""
 "\n"
 "Ingen URL oppgitt for hjelp.\n"
 
 "\n"
 "Ingen URL oppgitt for hjelp.\n"
 
-#: driver/demo-Gtk.c:865
+#: driver/demo-Gtk.c:872
 msgid ""
 "Error:\n"
 "\n"
 msgid ""
 "Error:\n"
 "\n"
@@ -558,7 +558,7 @@ msgstr ""
 "\n"
 "Xscreensaver daemonen startet ikke opp riktig.\n"
 
 "\n"
 "Xscreensaver daemonen startet ikke opp riktig.\n"
 
-#: driver/demo-Gtk.c:877
+#: driver/demo-Gtk.c:884
 msgid ""
 "You are running as root.  This usually means that xscreensaver\n"
 "was unable to contact your X server because access control is\n"
 msgid ""
 "You are running as root.  This usually means that xscreensaver\n"
 "was unable to contact your X server because access control is\n"
@@ -577,11 +577,11 @@ msgid ""
 "normal user, and `su' as necessary."
 msgstr ""
 
 "normal user, and `su' as necessary."
 msgstr ""
 
-#: driver/demo-Gtk.c:893
+#: driver/demo-Gtk.c:900
 msgid "Please check your $PATH and permissions."
 msgstr "Vennligst sjekk $PATH og rettigheter."
 
 msgid "Please check your $PATH and permissions."
 msgstr "Vennligst sjekk $PATH og rettigheter."
 
-#: driver/demo-Gtk.c:928
+#: driver/demo-Gtk.c:935
 msgid ""
 "Error:\n"
 "\n"
 msgid ""
 "Error:\n"
 "\n"
@@ -591,7 +591,7 @@ msgstr ""
 "\n"
 "Kunne ikke bestemme navn på initieringsfil!\n"
 
 "\n"
 "Kunne ikke bestemme navn på initieringsfil!\n"
 
-#: driver/demo-Gtk.c:933
+#: driver/demo-Gtk.c:940
 #, c-format
 msgid ""
 "Error:\n"
 #, c-format
 msgid ""
 "Error:\n"
@@ -602,7 +602,7 @@ msgstr ""
 "\n"
 "Kunne ikke skrive %s\n"
 
 "\n"
 "Kunne ikke skrive %s\n"
 
-#: driver/demo-Gtk.c:992
+#: driver/demo-Gtk.c:999
 msgid ""
 "Error:\n"
 "\n"
 msgid ""
 "Error:\n"
 "\n"
@@ -612,7 +612,7 @@ msgstr ""
 "\n"
 "ingen «manualCommand»-ressurs satt."
 
 "\n"
 "ingen «manualCommand»-ressurs satt."
 
-#: driver/demo-Gtk.c:1173
+#: driver/demo-Gtk.c:1180
 #, c-format
 msgid ""
 "Error:\n"
 #, c-format
 msgid ""
 "Error:\n"
@@ -623,7 +623,7 @@ msgstr ""
 "\n"
 "Forstår ikke tidsformatet: «%s»\n"
 
 "\n"
 "Forstår ikke tidsformatet: «%s»\n"
 
-#: driver/demo-Gtk.c:1829
+#: driver/demo-Gtk.c:1836
 #, c-format
 msgid ""
 "Error:\n"
 #, c-format
 msgid ""
 "Error:\n"
@@ -634,28 +634,28 @@ msgstr ""
 "\n"
 "Katalogen eksisterer ikke: «%s»\n"
 
 "\n"
 "Katalogen eksisterer ikke: «%s»\n"
 
-#: driver/demo-Gtk.c:2546
+#: driver/demo-Gtk.c:2553
 msgid "Descriptions not available: no XML support compiled in."
 msgstr "Beskrivelser ikke tilgjengelig: ingen støtte for XML kompilert inn."
 
 msgid "Descriptions not available: no XML support compiled in."
 msgstr "Beskrivelser ikke tilgjengelig: ingen støtte for XML kompilert inn."
 
-#: driver/demo-Gtk.c:2551
+#: driver/demo-Gtk.c:2558
 msgid "No description available."
 msgstr "Ingen beskrivelse tilgjengelig."
 
 msgid "No description available."
 msgstr "Ingen beskrivelse tilgjengelig."
 
-#: driver/demo-Gtk.c:2816
+#: driver/demo-Gtk.c:2823
 msgid "Blank Screen"
 msgstr "Blank skjerm"
 
 msgid "Blank Screen"
 msgstr "Blank skjerm"
 
-#: driver/demo-Gtk.c:2822
+#: driver/demo-Gtk.c:2829
 msgid "Screen Saver Disabled"
 msgstr "Skjermsparer deaktivert"
 
 msgid "Screen Saver Disabled"
 msgstr "Skjermsparer deaktivert"
 
-#: driver/demo-Gtk.c:2855
+#: driver/demo-Gtk.c:2862
 #, c-format
 msgid "%s: %.100s Settings"
 msgstr ""
 
 #, c-format
 msgid "%s: %.100s Settings"
 msgstr ""
 
-#: driver/demo-Gtk.c:3010
+#: driver/demo-Gtk.c:3017
 #, c-format
 msgid ""
 "Warning:\n"
 #, c-format
 msgid ""
 "Warning:\n"
@@ -663,23 +663,23 @@ msgid ""
 "file \"%s\" has changed, reloading.\n"
 msgstr ""
 
 "file \"%s\" has changed, reloading.\n"
 msgstr ""
 
-#: driver/demo-Gtk.c:3092
+#: driver/demo-Gtk.c:3099
 msgid "No Preview"
 msgstr "Ingen forhåndsvisning"
 
 msgid "No Preview"
 msgstr "Ingen forhåndsvisning"
 
-#: driver/demo-Gtk.c:3092
+#: driver/demo-Gtk.c:3099
 msgid "Available"
 msgstr "Tilgjengelig"
 
 msgid "Available"
 msgstr "Tilgjengelig"
 
-#: driver/demo-Gtk.c:3093
+#: driver/demo-Gtk.c:3100
 msgid "Not"
 msgstr ""
 
 msgid "Not"
 msgstr ""
 
-#: driver/demo-Gtk.c:3093
+#: driver/demo-Gtk.c:3100
 msgid "Installed"
 msgstr ""
 
 msgid "Installed"
 msgstr ""
 
-#: driver/demo-Gtk.c:3858
+#: driver/demo-Gtk.c:3865
 #, c-format
 msgid ""
 "Warning:\n"
 #, c-format
 msgid ""
 "Warning:\n"
@@ -688,7 +688,7 @@ msgid ""
 "on display \"%s\".  Launch it now?"
 msgstr ""
 
 "on display \"%s\".  Launch it now?"
 msgstr ""
 
-#: driver/demo-Gtk.c:3868
+#: driver/demo-Gtk.c:3875
 #, c-format
 msgid ""
 "Warning:\n"
 #, c-format
 msgid ""
 "Warning:\n"
@@ -707,7 +707,7 @@ msgid ""
 "Restart the xscreensaver daemon now?\n"
 msgstr ""
 
 "Restart the xscreensaver daemon now?\n"
 msgstr ""
 
-#: driver/demo-Gtk.c:3893
+#: driver/demo-Gtk.c:3900
 #, c-format
 msgid ""
 "Warning:\n"
 #, c-format
 msgid ""
 "Warning:\n"
@@ -723,7 +723,7 @@ msgid ""
 "Restart the daemon on \"%s\" as \"%s\" now?\n"
 msgstr ""
 
 "Restart the daemon on \"%s\" as \"%s\" now?\n"
 msgstr ""
 
-#: driver/demo-Gtk.c:3915
+#: driver/demo-Gtk.c:3922
 #, c-format
 msgid ""
 "Warning:\n"
 #, c-format
 msgid ""
 "Warning:\n"
@@ -735,12 +735,12 @@ msgid ""
 "Restart the xscreensaver daemon now?\n"
 msgstr ""
 
 "Restart the xscreensaver daemon now?\n"
 msgstr ""
 
-#: driver/demo-Gtk.c:4372
+#: driver/demo-Gtk.c:4379
 #, c-format
 msgid "%s: unknown option: %s\n"
 msgstr "%s: ukjent flagg: %s\n"
 
 #, c-format
 msgid "%s: unknown option: %s\n"
 msgstr "%s: ukjent flagg: %s\n"
 
-#: driver/demo-Gtk.c:4436
+#: driver/demo-Gtk.c:4443
 #, fuzzy
 msgid "Screensaver Preferences"
 msgstr "Skjermsparer"
 #, fuzzy
 msgid "Screensaver Preferences"
 msgstr "Skjermsparer"
@@ -958,22 +958,23 @@ msgstr "Armer"
 #: 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/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:5 hacks/config/flyingtoasters.xml.h:5
-#: hacks/config/fontglide.xml.h:4 hacks/config/forest.xml.h:1
-#: hacks/config/fuzzyflakes.xml.h:7 hacks/config/galaxy.xml.h:3
-#: hacks/config/gears.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:6
-#: 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/fadeplot.xml.h:4 hacks/config/fireworkx.xml.h:3
+#: 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:2 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/fuzzyflakes.xml.h:7
+#: hacks/config/galaxy.xml.h:3 hacks/config/gears.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:6 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/intermomentary.xml.h:1 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/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
@@ -991,23 +992,24 @@ msgstr "Armer"
 #: hacks/config/pacman.xml.h:1 hacks/config/penetrate.xml.h:3
 #: hacks/config/penrose.xml.h:6 hacks/config/petri.xml.h:5
 #: hacks/config/phosphor.xml.h:4 hacks/config/piecewise.xml.h:4
 #: hacks/config/pacman.xml.h:1 hacks/config/penetrate.xml.h:3
 #: hacks/config/penrose.xml.h:6 hacks/config/petri.xml.h:5
 #: hacks/config/phosphor.xml.h:4 hacks/config/piecewise.xml.h:4
-#: hacks/config/pipes.xml.h:5 hacks/config/polyhedra.xml.h:18
-#: hacks/config/polyominoes.xml.h:2 hacks/config/polytopes.xml.h:11
-#: hacks/config/pong.xml.h:1 hacks/config/popsquares.xml.h:3
-#: hacks/config/providence.xml.h:2 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 hacks/config/rocks.xml.h:4
-#: hacks/config/rotor.xml.h:3 hacks/config/rubik.xml.h:3
-#: hacks/config/sballs.xml.h:4 hacks/config/shadebobs.xml.h:3
-#: hacks/config/sierpinski.xml.h:2 hacks/config/sierpinski3d.xml.h:2
-#: hacks/config/slidescreen.xml.h:2 hacks/config/slip.xml.h:2
-#: hacks/config/speedmine.xml.h:3 hacks/config/sphere.xml.h:2
-#: hacks/config/spheremonics.xml.h:5 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:1 hacks/config/superquadrics.xml.h:4
+#: hacks/config/pinion.xml.h:5 hacks/config/pipes.xml.h:5
+#: hacks/config/polyhedra.xml.h:18 hacks/config/polyominoes.xml.h:2
+#: hacks/config/polytopes.xml.h:11 hacks/config/pong.xml.h:1
+#: hacks/config/popsquares.xml.h:3 hacks/config/providence.xml.h:2
+#: 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
+#: hacks/config/rocks.xml.h:4 hacks/config/rotor.xml.h:3
+#: hacks/config/rubik.xml.h:3 hacks/config/sballs.xml.h:4
+#: hacks/config/shadebobs.xml.h:3 hacks/config/sierpinski.xml.h:2
+#: hacks/config/sierpinski3d.xml.h:2 hacks/config/slidescreen.xml.h:2
+#: hacks/config/slip.xml.h:2 hacks/config/speedmine.xml.h:3
+#: hacks/config/sphere.xml.h:2 hacks/config/spheremonics.xml.h:5
+#: 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:1
+#: hacks/config/substrate.xml.h:2 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/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
@@ -1029,8 +1031,9 @@ msgstr "Fort"
 #: hacks/config/fuzzyflakes.xml.h:8 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/fuzzyflakes.xml.h:8 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/wormhole.xml.h:3 hacks/config/xfishtank.xml.h:4
+#: hacks/config/substrate.xml.h:3 hacks/config/thornbird.xml.h:3
+#: hacks/config/whirlwindwarp.xml.h:1 hacks/config/wormhole.xml.h:3
+#: hacks/config/xfishtank.xml.h:4
 msgid "Few"
 msgstr "Få"
 
 msgid "Few"
 msgstr "Få"
 
@@ -1046,7 +1049,7 @@ msgstr "F
 #: hacks/config/epicycle.xml.h:8 hacks/config/eruption.xml.h:12
 #: hacks/config/euler2d.xml.h:8 hacks/config/fadeplot.xml.h:6
 #: hacks/config/flag.xml.h:5 hacks/config/flame.xml.h:11
 #: hacks/config/epicycle.xml.h:8 hacks/config/eruption.xml.h:12
 #: hacks/config/euler2d.xml.h:8 hacks/config/fadeplot.xml.h:6
 #: hacks/config/flag.xml.h:5 hacks/config/flame.xml.h:11
-#: hacks/config/flow.xml.h:8 hacks/config/fluidballs.xml.h:13
+#: hacks/config/flow.xml.h:7 hacks/config/fluidballs.xml.h:13
 #: hacks/config/forest.xml.h:3 hacks/config/fuzzyflakes.xml.h:12
 #: 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/forest.xml.h:3 hacks/config/fuzzyflakes.xml.h:12
 #: hacks/config/galaxy.xml.h:6 hacks/config/grav.xml.h:4
 #: hacks/config/halo.xml.h:4 hacks/config/hopalong.xml.h:15
@@ -1084,7 +1087,7 @@ msgstr "Mange"
 #: 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/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/flow.xml.h:8 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/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
@@ -1138,22 +1141,23 @@ msgstr ""
 #: 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/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/flyingtoasters.xml.h:11
-#: hacks/config/fontglide.xml.h:13 hacks/config/forest.xml.h:5
-#: hacks/config/fuzzyflakes.xml.h:15 hacks/config/galaxy.xml.h:10
-#: hacks/config/gears.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:8 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:10 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/fadeplot.xml.h:8 hacks/config/fireworkx.xml.h:9
+#: 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:10 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/fuzzyflakes.xml.h:15
+#: hacks/config/galaxy.xml.h:11 hacks/config/gears.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:8
+#: 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:10
+#: 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/intermomentary.xml.h:4 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/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
@@ -1171,23 +1175,24 @@ msgstr ""
 #: hacks/config/pacman.xml.h:5 hacks/config/penetrate.xml.h:6
 #: hacks/config/penrose.xml.h:11 hacks/config/petri.xml.h:23
 #: hacks/config/phosphor.xml.h:7 hacks/config/piecewise.xml.h:9
 #: hacks/config/pacman.xml.h:5 hacks/config/penetrate.xml.h:6
 #: hacks/config/penrose.xml.h:11 hacks/config/petri.xml.h:23
 #: hacks/config/phosphor.xml.h:7 hacks/config/piecewise.xml.h:9
-#: hacks/config/pipes.xml.h:15 hacks/config/polyhedra.xml.h:119
-#: hacks/config/polyominoes.xml.h:10 hacks/config/polytopes.xml.h:20
-#: hacks/config/pong.xml.h:4 hacks/config/popsquares.xml.h:5
-#: hacks/config/providence.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 hacks/config/rocks.xml.h:9
-#: hacks/config/rotor.xml.h:11 hacks/config/rubik.xml.h:9
-#: hacks/config/sballs.xml.h:13 hacks/config/shadebobs.xml.h:9
-#: hacks/config/sierpinski.xml.h:7 hacks/config/sierpinski3d.xml.h:8
-#: hacks/config/slidescreen.xml.h:6 hacks/config/slip.xml.h:7
-#: hacks/config/speedmine.xml.h:13 hacks/config/sphere.xml.h:5
-#: hacks/config/spheremonics.xml.h:19 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:4 hacks/config/superquadrics.xml.h:8
+#: hacks/config/pinion.xml.h:13 hacks/config/pipes.xml.h:15
+#: hacks/config/polyhedra.xml.h:119 hacks/config/polyominoes.xml.h:10
+#: hacks/config/polytopes.xml.h:20 hacks/config/pong.xml.h:4
+#: hacks/config/popsquares.xml.h:5 hacks/config/providence.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
+#: hacks/config/rocks.xml.h:9 hacks/config/rotor.xml.h:11
+#: hacks/config/rubik.xml.h:9 hacks/config/sballs.xml.h:13
+#: hacks/config/shadebobs.xml.h:9 hacks/config/sierpinski.xml.h:7
+#: hacks/config/sierpinski3d.xml.h:8 hacks/config/slidescreen.xml.h:6
+#: hacks/config/slip.xml.h:7 hacks/config/speedmine.xml.h:13
+#: hacks/config/sphere.xml.h:5 hacks/config/spheremonics.xml.h:19
+#: 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:4
+#: hacks/config/substrate.xml.h:10 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/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
@@ -1220,17 +1225,18 @@ msgstr "Sakte"
 #: hacks/config/engine.xml.h:16 hacks/config/epicycle.xml.h:11
 #: 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/engine.xml.h:16 hacks/config/epicycle.xml.h:11
 #: 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/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/fuzzyflakes.xml.h:17
-#: hacks/config/galaxy.xml.h:11 hacks/config/glblur.xml.h:17
-#: hacks/config/glforestfire.xml.h:15 hacks/config/glplanet.xml.h:10
-#: 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:11 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/fireworkx.xml.h:11 hacks/config/flag.xml.h:9
+#: hacks/config/flame.xml.h:15 hacks/config/flipflop.xml.h:7
+#: hacks/config/flipscreen3d.xml.h:7 hacks/config/flow.xml.h:12
+#: hacks/config/fluidballs.xml.h:20 hacks/config/forest.xml.h:6
+#: hacks/config/fuzzyflakes.xml.h:17 hacks/config/galaxy.xml.h:12
+#: hacks/config/glblur.xml.h:17 hacks/config/glforestfire.xml.h:15
+#: hacks/config/glplanet.xml.h:10 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:11
+#: 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/intermomentary.xml.h:5 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/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
@@ -1259,16 +1265,16 @@ msgstr "Sakte"
 #: 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/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/xplanet.xml.h:60 hacks/config/xrayswarm.xml.h:4
-#: hacks/config/zoom.xml.h:7
+#: hacks/config/strange.xml.h:5 hacks/config/substrate.xml.h:11
+#: 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/xplanet.xml.h:60
+#: hacks/config/xrayswarm.xml.h:4 hacks/config/zoom.xml.h:7
 msgid "Speed"
 msgstr "Hastighet"
 
 msgid "Speed"
 msgstr "Hastighet"
 
@@ -1311,8 +1317,8 @@ msgstr ""
 #: hacks/config/discrete.xml.h:11 hacks/config/drift.xml.h:14
 #: hacks/config/epicycle.xml.h:13 hacks/config/euler2d.xml.h:17
 #: hacks/config/fadeplot.xml.h:12 hacks/config/flag.xml.h:13
 #: hacks/config/discrete.xml.h:11 hacks/config/drift.xml.h:14
 #: hacks/config/epicycle.xml.h:13 hacks/config/euler2d.xml.h:17
 #: hacks/config/fadeplot.xml.h:12 hacks/config/flag.xml.h:13
-#: hacks/config/flame.xml.h:16 hacks/config/flow.xml.h:18
-#: hacks/config/forest.xml.h:8 hacks/config/galaxy.xml.h:13
+#: hacks/config/flame.xml.h:16 hacks/config/flow.xml.h:15
+#: hacks/config/forest.xml.h:8 hacks/config/galaxy.xml.h:14
 #: hacks/config/grav.xml.h:11 hacks/config/halo.xml.h:13
 #: hacks/config/hopalong.xml.h:25 hacks/config/ifs.xml.h:8
 #: hacks/config/imsmap.xml.h:15 hacks/config/interference.xml.h:19
 #: hacks/config/grav.xml.h:11 hacks/config/halo.xml.h:13
 #: hacks/config/hopalong.xml.h:25 hacks/config/ifs.xml.h:8
 #: hacks/config/imsmap.xml.h:15 hacks/config/interference.xml.h:19
@@ -1413,7 +1419,7 @@ msgstr "Firesidede celler"
 #: 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/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/flag.xml.h:4 hacks/config/flow.xml.h:4
 #: hacks/config/fluidballs.xml.h:12 hacks/config/fuzzyflakes.xml.h:10
 #: 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/fluidballs.xml.h:12 hacks/config/fuzzyflakes.xml.h:10
 #: hacks/config/gleidescope.xml.h:7 hacks/config/halftone.xml.h:8
 #: hacks/config/hopalong.xml.h:13 hacks/config/interference.xml.h:11
@@ -1445,7 +1451,7 @@ msgstr "Sekssidede celler"
 #: 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/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/flag.xml.h:8 hacks/config/flow.xml.h:11
 #: hacks/config/fluidballs.xml.h:19 hacks/config/fuzzyflakes.xml.h:16
 #: 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/fluidballs.xml.h:19 hacks/config/fuzzyflakes.xml.h:16
 #: hacks/config/gleidescope.xml.h:12 hacks/config/halftone.xml.h:14
 #: hacks/config/hopalong.xml.h:22 hacks/config/interference.xml.h:18
@@ -1464,7 +1470,7 @@ msgstr "Tresidede celler"
 
 #: 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/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/flag.xml.h:12 hacks/config/flow.xml.h:14
 #: hacks/config/lissie.xml.h:12 hacks/config/loop.xml.h:11
 #: hacks/config/rubik.xml.h:12 hacks/config/sierpinski.xml.h:11
 #: hacks/config/slip.xml.h:11
 #: hacks/config/lissie.xml.h:12 hacks/config/loop.xml.h:11
 #: hacks/config/rubik.xml.h:12 hacks/config/sierpinski.xml.h:11
 #: hacks/config/slip.xml.h:11
@@ -1515,13 +1521,14 @@ msgstr ""
 #: hacks/config/menger.xml.h:15 hacks/config/mirrorblob.xml.h:18
 #: hacks/config/moebius.xml.h:6 hacks/config/molecule.xml.h:21
 #: hacks/config/morph3d.xml.h:5 hacks/config/noof.xml.h:4
 #: hacks/config/menger.xml.h:15 hacks/config/mirrorblob.xml.h:18
 #: hacks/config/moebius.xml.h:6 hacks/config/molecule.xml.h:21
 #: hacks/config/morph3d.xml.h:5 hacks/config/noof.xml.h:4
-#: hacks/config/pipes.xml.h:14 hacks/config/polyhedra.xml.h:118
-#: hacks/config/polytopes.xml.h:18 hacks/config/providence.xml.h:4
-#: 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
+#: hacks/config/pinion.xml.h:12 hacks/config/pipes.xml.h:14
+#: hacks/config/polyhedra.xml.h:118 hacks/config/polytopes.xml.h:18
+#: hacks/config/providence.xml.h:4 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 ""
 
 msgid "Show Frames-per-Second"
 msgstr ""
 
@@ -1682,11 +1689,12 @@ msgstr "Hvalens hastighet"
 #: hacks/config/lament.xml.h:9 hacks/config/lavalite.xml.h:32
 #: hacks/config/menger.xml.h:21 hacks/config/mirrorblob.xml.h:24
 #: hacks/config/moebius.xml.h:11 hacks/config/molecule.xml.h:26
 #: hacks/config/lament.xml.h:9 hacks/config/lavalite.xml.h:32
 #: hacks/config/menger.xml.h:21 hacks/config/mirrorblob.xml.h:24
 #: hacks/config/moebius.xml.h:11 hacks/config/molecule.xml.h:26
-#: hacks/config/polyhedra.xml.h:173 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
+#: hacks/config/pinion.xml.h:15 hacks/config/polyhedra.xml.h:173
+#: 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 ""
 
 msgid "Wireframe"
 msgstr ""
 
@@ -1774,14 +1782,15 @@ msgstr "Linjer"
 #: 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/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/mismunch.xml.h:3
-#: 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 hacks/config/spheremonics.xml.h:7
+#: hacks/config/flow.xml.h:6 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/mismunch.xml.h:3 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
+#: hacks/config/spheremonics.xml.h:7 hacks/config/substrate.xml.h:6
 #: hacks/config/wander.xml.h:10 hacks/config/whirlwindwarp.xml.h:3
 msgid "Long"
 msgstr "Langt"
 #: hacks/config/wander.xml.h:10 hacks/config/whirlwindwarp.xml.h:3
 msgid "Long"
 msgstr "Langt"
@@ -1828,13 +1837,14 @@ msgstr ""
 #: 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/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/metaballs.xml.h:12 hacks/config/mismunch.xml.h:8
-#: 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/flow.xml.h:9 hacks/config/galaxy.xml.h:9
+#: hacks/config/klein.xml.h:5 hacks/config/laser.xml.h:9
+#: hacks/config/menger.xml.h:14 hacks/config/metaballs.xml.h:12
+#: hacks/config/mismunch.xml.h:8 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/substrate.xml.h:9
 #: hacks/config/wander.xml.h:12 hacks/config/whirlwindwarp.xml.h:6
 msgid "Short"
 msgstr "Kort"
 #: hacks/config/wander.xml.h:12 hacks/config/whirlwindwarp.xml.h:6
 msgid "Short"
 msgstr "Kort"
@@ -2036,10 +2046,10 @@ msgstr ""
 #: 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/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/polyhedra.xml.h:3 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/wormhole.xml.h:1
-#: hacks/config/xfishtank.xml.h:1
+#: hacks/config/pinion.xml.h:3 hacks/config/polyhedra.xml.h:3
+#: 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/wormhole.xml.h:1 hacks/config/xfishtank.xml.h:1
 msgid "Animation Speed"
 msgstr "Animasjonshastighet"
 
 msgid "Animation Speed"
 msgstr "Animasjonshastighet"
 
@@ -2118,8 +2128,9 @@ msgstr ""
 #: 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/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/starfish.xml.h:2 hacks/config/substrate.xml.h:1
+#: hacks/config/vidwhacker.xml.h:3 hacks/config/wander.xml.h:7
+#: hacks/config/xspirograph.xml.h:3
 msgid "Duration"
 msgstr "Varighet"
 
 msgid "Duration"
 msgstr "Varighet"
 
@@ -2368,7 +2379,7 @@ msgstr "Deler"
 msgid "Rotate"
 msgstr "Roter"
 
 msgid "Rotate"
 msgstr "Roter"
 
-#: hacks/config/circuit.xml.h:8
+#: hacks/config/circuit.xml.h:8 hacks/config/pinion.xml.h:10
 msgid "Rotation Speed"
 msgstr "Roteringshastighet"
 
 msgid "Rotation Speed"
 msgstr "Roteringshastighet"
 
@@ -2454,11 +2465,12 @@ msgstr "1 sekund"
 msgid "Coral"
 msgstr "Korall"
 
 msgid "Coral"
 msgstr "Korall"
 
-#: hacks/config/coral.xml.h:4 hacks/config/gflux.xml.h:3
-#: hacks/config/glblur.xml.h:2 hacks/config/glmatrix.xml.h:3
-#: 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
+#: hacks/config/coral.xml.h:4 hacks/config/fireworkx.xml.h:2
+#: hacks/config/gflux.xml.h:3 hacks/config/glblur.xml.h:2
+#: hacks/config/glmatrix.xml.h:3 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
 msgid "Dense"
 msgstr "Tett"
 
 msgid "Dense"
 msgstr "Tett"
 
@@ -2471,12 +2483,12 @@ msgid ""
 "Simulates coral growth, albeit somewhat slowly. Written by Frederick Roeber."
 msgstr ""
 
 "Simulates coral growth, albeit somewhat slowly. Written by Frederick Roeber."
 msgstr ""
 
-#: hacks/config/coral.xml.h:13 hacks/config/gflux.xml.h:13
-#: hacks/config/glblur.xml.h:16 hacks/config/glmatrix.xml.h:19
-#: hacks/config/imsmap.xml.h:13 hacks/config/lavalite.xml.h:29
-#: hacks/config/pyro.xml.h:14 hacks/config/qix.xml.h:21
-#: hacks/config/squiral.xml.h:15 hacks/config/xearth.xml.h:24
-#: hacks/config/xmatrix.xml.h:17
+#: hacks/config/coral.xml.h:13 hacks/config/fireworkx.xml.h:10
+#: hacks/config/gflux.xml.h:13 hacks/config/glblur.xml.h:16
+#: hacks/config/glmatrix.xml.h:19 hacks/config/imsmap.xml.h:13
+#: hacks/config/lavalite.xml.h:29 hacks/config/pyro.xml.h:14
+#: hacks/config/qix.xml.h:21 hacks/config/squiral.xml.h:15
+#: hacks/config/xearth.xml.h:24 hacks/config/xmatrix.xml.h:17
 msgid "Sparse"
 msgstr ""
 
 msgid "Sparse"
 msgstr ""
 
@@ -2505,7 +2517,7 @@ msgid "Center on Screen"
 msgstr "Sentrer på skjermen"
 
 #: hacks/config/crystal.xml.h:2 hacks/config/deluxe.xml.h:1
 msgstr "Sentrer på skjermen"
 
 #: hacks/config/crystal.xml.h:2 hacks/config/deluxe.xml.h:1
-#: hacks/config/fadeplot.xml.h:1 hacks/config/flow.xml.h:3
+#: hacks/config/fadeplot.xml.h:1 hacks/config/flow.xml.h:1
 #: hacks/config/galaxy.xml.h:1 hacks/config/glforestfire.xml.h:1
 #: hacks/config/grav.xml.h:1 hacks/config/julia.xml.h:1
 #: hacks/config/laser.xml.h:1 hacks/config/lisa.xml.h:1
 #: hacks/config/galaxy.xml.h:1 hacks/config/glforestfire.xml.h:1
 #: hacks/config/grav.xml.h:1 hacks/config/julia.xml.h:1
 #: hacks/config/laser.xml.h:1 hacks/config/lisa.xml.h:1
@@ -3263,7 +3275,7 @@ msgstr ""
 msgid "Half"
 msgstr "Halo"
 
 msgid "Half"
 msgstr "Halo"
 
-#: hacks/config/fireflies.xml.h:17
+#: hacks/config/fireflies.xml.h:17 hacks/config/pinion.xml.h:7
 #, fuzzy
 msgid "Huge"
 msgstr "Storbrann"
 #, fuzzy
 msgid "Huge"
 msgstr "Storbrann"
@@ -3359,7 +3371,7 @@ msgstr ""
 msgid "Swarm tails glow"
 msgstr ""
 
 msgid "Swarm tails glow"
 msgstr ""
 
-#: hacks/config/fireflies.xml.h:43
+#: hacks/config/fireflies.xml.h:43 hacks/config/pinion.xml.h:14
 #, fuzzy
 msgid "Tiny"
 msgstr "Tynn"
 #, fuzzy
 msgid "Tiny"
 msgstr "Tynn"
@@ -3377,6 +3389,33 @@ msgstr "Vind"
 msgid "Wind picks up"
 msgstr ""
 
 msgid "Wind picks up"
 msgstr ""
 
+#: hacks/config/fireworkx.xml.h:1 hacks/config/lavalite.xml.h:3
+msgid "Activity"
+msgstr ""
+
+#: hacks/config/fireworkx.xml.h:4
+msgid "Fast Fade (more realistic)"
+msgstr ""
+
+#: hacks/config/fireworkx.xml.h:5
+#, fuzzy
+msgid "Fireworkx"
+msgstr "_Fil"
+
+#: hacks/config/fireworkx.xml.h:6
+#, fuzzy
+msgid "Light effect"
+msgstr "Lyneffekt"
+
+#: hacks/config/fireworkx.xml.h:7
+msgid "Pyrotechnics simulation eye-candy. Written by Rony B. Chandran."
+msgstr ""
+
+#: hacks/config/fireworkx.xml.h:8
+#, fuzzy
+msgid "Shoot"
+msgstr "Kort"
+
 #: hacks/config/flag.xml.h:1
 msgid "Bitmap for Flag"
 msgstr "Bitkart for flagg"
 #: hacks/config/flag.xml.h:1
 msgid "Bitmap for Flag"
 msgstr "Bitkart for flagg"
@@ -3451,42 +3490,44 @@ msgid ""
 "around and deforms it in various ways. Written by Ben Buxton."
 msgstr ""
 
 "around and deforms it in various ways. Written by Ben Buxton."
 msgstr ""
 
-#: hacks/config/flow.xml.h:1
-msgid "Allow 2D Attractors"
-msgstr ""
-
-#: hacks/config/flow.xml.h:2
-msgid ""
-"Another series of strange attractors: a flowing series of points, making "
-"strange rotational shapes. Written by Tim Auckland."
-msgstr ""
-
-#: hacks/config/flow.xml.h:5
+#: hacks/config/flow.xml.h:3
 msgid "Flow"
 msgstr "Flyt"
 
 msgid "Flow"
 msgstr "Flyt"
 
-#: hacks/config/flow.xml.h:6
-msgid "Freeze Some Bees"
+#: hacks/config/flow.xml.h:5
+#, fuzzy
+msgid "Length of trails"
+msgstr "Etterlat spor"
+
+#: hacks/config/flow.xml.h:13
+msgid ""
+"Strange attractors formed of flows in a 3D differential equation phase "
+"space. Written by Tim Auckland."
 msgstr ""
 
 msgstr ""
 
-#: hacks/config/flow.xml.h:10
-msgid "Ride a Trained Bee"
+#: hacks/config/flow.xml.h:16
+msgid "turn on/off bounding box."
 msgstr ""
 
 msgstr ""
 
-#: hacks/config/flow.xml.h:11
-msgid "Rotate Around Attractor"
+#: hacks/config/flow.xml.h:17
+#, fuzzy
+msgid "turn on/off double buffering."
+msgstr "Double buffer"
+
+#: hacks/config/flow.xml.h:18
+msgid "turn on/off periodic attractors."
 msgstr ""
 
 msgstr ""
 
-#: hacks/config/flow.xml.h:12
-msgid "Show Bounding Box"
+#: hacks/config/flow.xml.h:19
+msgid "turn on/off ride in the flow."
 msgstr ""
 
 msgstr ""
 
-#: hacks/config/flow.xml.h:14
-msgid "Slow Bees with Antifreeze"
+#: hacks/config/flow.xml.h:20
+msgid "turn on/off rotating around attractor."
 msgstr ""
 
 msgstr ""
 
-#: hacks/config/flow.xml.h:19
-msgid "Zoom In and Out"
+#: hacks/config/flow.xml.h:21
+msgid "turn on/off search for new attractors."
 msgstr ""
 
 #: hacks/config/fluidballs.xml.h:1
 msgstr ""
 
 #: hacks/config/fluidballs.xml.h:1
@@ -3709,7 +3750,12 @@ msgstr "Tilfeldig bevegelse"
 msgid "Galaxy"
 msgstr "Galakse"
 
 msgid "Galaxy"
 msgstr "Galakse"
 
-#: hacks/config/galaxy.xml.h:9 hacks/config/lisa.xml.h:7
+#: hacks/config/galaxy.xml.h:8
+#, fuzzy
+msgid "Rotate Viewpoint"
+msgstr "Lineær bevegelse"
+
+#: hacks/config/galaxy.xml.h:10 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/pong.xml.h:3
 #: hacks/config/rotor.xml.h:10 hacks/config/rubik.xml.h:8
 #: hacks/config/lissie.xml.h:8 hacks/config/loop.xml.h:6
 #: hacks/config/penrose.xml.h:10 hacks/config/pong.xml.h:3
 #: hacks/config/rotor.xml.h:10 hacks/config/rubik.xml.h:8
@@ -3718,7 +3764,7 @@ msgstr "Galakse"
 msgid "Size"
 msgstr "Størrelse"
 
 msgid "Size"
 msgstr "Størrelse"
 
-#: hacks/config/galaxy.xml.h:12
+#: hacks/config/galaxy.xml.h:13
 msgid ""
 "This draws spinning galaxies, which then collide and scatter their stars to "
 "the, uh, four winds or something. Originally an Amiga program by Uli "
 msgid ""
 "This draws spinning galaxies, which then collide and scatter their stars to "
 "the, uh, four winds or something. Originally an Amiga program by Uli "
@@ -4031,9 +4077,9 @@ msgid ""
 "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 "
 "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."
+"of this window: the tab at the top of the *other* window.) 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
 msgstr ""
 
 #: hacks/config/glslideshow.xml.h:17
@@ -4573,6 +4619,27 @@ msgstr "Antall b
 msgid "Wave Size"
 msgstr "Bølgestørrelse"
 
 msgid "Wave Size"
 msgstr "Bølgestørrelse"
 
+#: hacks/config/intermomentary.xml.h:2
+msgid "Intermomentary"
+msgstr ""
+
+#: hacks/config/intermomentary.xml.h:3
+#, fuzzy
+msgid "Number of Discs"
+msgstr "Antall sirkler"
+
+#: hacks/config/intermomentary.xml.h:6
+msgid ""
+"The Intersection Momentary is a fun visualization defining the relationships "
+"between objects with Casey Reas, William Ngan, and Robert Hodgin. "
+"Commissioned for display at the Whitney Museum of American Art. A surface "
+"filled with 100 medium to small sized circles. Each circle has a different "
+"size and direction, but moves at the same slow rate. Display: A. The "
+"instantaneous intersections of the circles. B. The aggregate intersections "
+"of the circles. Ported to XScreensaver from the art project \"InterMomentary"
+"\" at http://www.complexification.net"
+msgstr ""
+
 #: hacks/config/jigglypuff.xml.h:2
 msgid "Chrome"
 msgstr ""
 #: hacks/config/jigglypuff.xml.h:2
 msgid "Chrome"
 msgstr ""
@@ -4797,10 +4864,6 @@ msgstr ""
 msgid "10"
 msgstr ""
 
 msgid "10"
 msgstr ""
 
-#: hacks/config/lavalite.xml.h:3
-msgid "Activity"
-msgstr ""
-
 #: hacks/config/lavalite.xml.h:4
 msgid "Classic Lavalite"
 msgstr ""
 #: hacks/config/lavalite.xml.h:4
 msgid "Classic Lavalite"
 msgstr ""
@@ -5549,6 +5612,41 @@ msgid ""
 "invisibility at intersection points. Written by Geoffrey Irving."
 msgstr ""
 
 "invisibility at intersection points. Written by Geoffrey Irving."
 msgstr ""
 
+#: hacks/config/pinion.xml.h:1
+#, fuzzy
+msgid "100"
+msgstr "100%"
+
+#: hacks/config/pinion.xml.h:2
+msgid "2000"
+msgstr ""
+
+#: hacks/config/pinion.xml.h:4
+msgid ""
+"Draws an interconnected set of gears moving across the screen. Written by "
+"Jamie Zawinski."
+msgstr ""
+
+#: hacks/config/pinion.xml.h:6
+#, fuzzy
+msgid "Gear Size"
+msgstr "Maks størrelse"
+
+#: hacks/config/pinion.xml.h:8
+#, fuzzy
+msgid "Max RPM"
+msgstr "Maks antall ringer"
+
+#: hacks/config/pinion.xml.h:9
+#, fuzzy
+msgid "Pinion"
+msgstr "Pakking"
+
+#: hacks/config/pinion.xml.h:11
+#, fuzzy
+msgid "Scrolling Speed"
+msgstr "Rullehastighet"
+
 #: hacks/config/pipes.xml.h:1
 msgid "Allow Tight Turns"
 msgstr ""
 #: hacks/config/pipes.xml.h:1
 msgid "Allow Tight Turns"
 msgstr ""
@@ -5576,7 +5674,8 @@ msgid ""
 "probably seen this GL hack. This version is by Marcelo Vianna."
 msgstr ""
 
 "probably seen this GL hack. This version is by Marcelo Vianna."
 msgstr ""
 
-#: hacks/config/pipes.xml.h:9 hacks/config/wormhole.xml.h:4
+#: hacks/config/pipes.xml.h:9 hacks/config/substrate.xml.h:7
+#: hacks/config/wormhole.xml.h:4
 msgid "Lots"
 msgstr ""
 
 msgid "Lots"
 msgstr ""
 
@@ -6808,22 +6907,26 @@ msgid "Ping subnet/30 (2 hosts)"
 msgstr ""
 
 #: hacks/config/sonar.xml.h:10
 msgstr ""
 
 #: hacks/config/sonar.xml.h:10
+msgid "Resolve Host Names"
+msgstr ""
+
+#: hacks/config/sonar.xml.h:11
 msgid "Simulation Team Members"
 msgstr "Lagmedlemmer i simulasjonen"
 
 msgid "Simulation Team Members"
 msgstr "Lagmedlemmer i simulasjonen"
 
-#: hacks/config/sonar.xml.h:11
+#: hacks/config/sonar.xml.h:12
 msgid "Sonar"
 msgstr "Sonar"
 
 msgid "Sonar"
 msgstr "Sonar"
 
-#: hacks/config/sonar.xml.h:12
+#: hacks/config/sonar.xml.h:13
 msgid "Team A Name"
 msgstr "Navn på lag A"
 
 msgid "Team A Name"
 msgstr "Navn på lag A"
 
-#: hacks/config/sonar.xml.h:13
+#: hacks/config/sonar.xml.h:14
 msgid "Team B Name"
 msgstr "Navn på lag B"
 
 msgid "Team B Name"
 msgstr "Navn på lag B"
 
-#: hacks/config/sonar.xml.h:14
+#: hacks/config/sonar.xml.h:15
 msgid ""
 "This program draws a simulation of a sonar screen. By default, it displays a "
 "random assortment of ``bogies'' on the screen, but if installed as \"setuid "
 msgid ""
 "This program draws a simulation of a sonar screen. By default, it displays a "
 "random assortment of ``bogies'' on the screen, but if installed as \"setuid "
@@ -6832,7 +6935,7 @@ msgid ""
 "Martin and Jamie Zawinski."
 msgstr ""
 
 "Martin and Jamie Zawinski."
 msgstr ""
 
-#: hacks/config/sonar.xml.h:15
+#: hacks/config/sonar.xml.h:16
 msgid "vs."
 msgstr "mot"
 
 msgid "vs."
 msgstr "mot"
 
@@ -7106,6 +7209,32 @@ msgid ""
 "Written by Massimino Pascal."
 msgstr ""
 
 "Written by Massimino Pascal."
 msgstr ""
 
+#: hacks/config/substrate.xml.h:4
+#, fuzzy
+msgid "Initial Cracks"
+msgstr "Partikkeltetthet"
+
+#: hacks/config/substrate.xml.h:5
+msgid ""
+"Lines like crystals grow on a computational substrate. A simple "
+"perpendicular growth rule creates intricate city-like structures. By J. "
+"Tarbell and Mike Kershaw."
+msgstr ""
+
+#: hacks/config/substrate.xml.h:8
+#, fuzzy
+msgid "Sandgrains"
+msgstr "Forvalg"
+
+#: hacks/config/substrate.xml.h:12
+#, fuzzy
+msgid "Substrate"
+msgstr "Stater"
+
+#: hacks/config/substrate.xml.h:13
+msgid "Wireframe only"
+msgstr ""
+
 #: hacks/config/superquadrics.xml.h:3
 msgid ""
 "Ed Mackey reports that he wrote the first version of this program in BASIC "
 #: hacks/config/superquadrics.xml.h:3
 msgid ""
 "Ed Mackey reports that he wrote the first version of this program in BASIC "
index d08fda84a5fb879448bb98f6138c469e0662661c..32d1676b4ee28a66974333291a1d0a6d946d8604 100644 (file)
--- a/po/pl.po
+++ b/po/pl.po
@@ -10,7 +10,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: xscreensaver\n"
 "Report-Msgid-Bugs-To: \n"
 msgstr ""
 "Project-Id-Version: xscreensaver\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2004-10-04 16:25+0200\n"
+"POT-Creation-Date: 2004-12-22 12:51+0100\n"
 "PO-Revision-Date: 2002-06-05 17:30+0200\n"
 "Last-Translator: GNOME PL Team <translators@gnome.pl>\n"
 "Language-Team: Polish <pl@li.org>\n"
 "PO-Revision-Date: 2002-06-05 17:30+0200\n"
 "Last-Translator: GNOME PL Team <translators@gnome.pl>\n"
 "Language-Team: Polish <pl@li.org>\n"
@@ -149,7 +149,7 @@ msgstr "Okres, po którym obraz gaśnie zupełnie."
 msgid "minutes"
 msgstr "min."
 
 msgid "minutes"
 msgstr "min."
 
-#: driver/demo-Gtk-widgets.c:482 driver/demo-Gtk.c:2845
+#: driver/demo-Gtk-widgets.c:482 driver/demo-Gtk.c:2852
 #: driver/xscreensaver-demo.glade.h:58
 msgid "Preview"
 msgstr "Podgląd"
 #: driver/xscreensaver-demo.glade.h:58
 msgid "Preview"
 msgstr "Podgląd"
@@ -194,12 +194,12 @@ msgstr "Jeden wygaszacz ekranu"
 msgid "Random Screen Saver"
 msgstr "Losowy wygaszacz ekranu"
 
 msgid "Random Screen Saver"
 msgstr "Losowy wygaszacz ekranu"
 
-#: driver/demo-Gtk-widgets.c:571 driver/demo-Gtk.c:2134
+#: driver/demo-Gtk-widgets.c:571 driver/demo-Gtk.c:2141
 #: driver/xscreensaver-demo.glade.h:75
 msgid "Use"
 msgstr ""
 
 #: driver/xscreensaver-demo.glade.h:75
 msgid "Use"
 msgstr ""
 
-#: driver/demo-Gtk-widgets.c:591 driver/demo-Gtk.c:2144
+#: driver/demo-Gtk-widgets.c:591 driver/demo-Gtk.c:2151
 #: driver/xscreensaver-demo.glade.h:63
 msgid "Screen Saver"
 msgstr "Wygaszacz ekranu"
 #: driver/xscreensaver-demo.glade.h:63
 msgid "Screen Saver"
 msgstr "Wygaszacz ekranu"
@@ -439,7 +439,7 @@ msgid "Visual:"
 msgstr "Tryb wyświetlania:"
 
 #: driver/demo-Gtk-widgets.c:1550 driver/demo-Gtk-widgets.c:1573
 msgstr "Tryb wyświetlania:"
 
 #: driver/demo-Gtk-widgets.c:1550 driver/demo-Gtk-widgets.c:1573
-#: driver/demo-Gtk.c:1538 driver/demo-Gtk.c:2864
+#: driver/demo-Gtk.c:1545 driver/demo-Gtk.c:2871
 #: driver/xscreensaver-demo.glade.h:5 driver/xscreensaver-demo.glade2.h:3
 msgid "Any"
 msgstr "Dowolny"
 #: driver/xscreensaver-demo.glade.h:5 driver/xscreensaver-demo.glade2.h:3
 msgid "Any"
 msgstr "Dowolny"
@@ -540,7 +540,7 @@ msgstr "Standardowe <<"
 msgid "Back to the graphical configuration options."
 msgstr ""
 
 msgid "Back to the graphical configuration options."
 msgstr ""
 
-#: driver/demo-Gtk-widgets.c:1709 driver/demo-Gtk.c:741
+#: driver/demo-Gtk-widgets.c:1709 driver/demo-Gtk.c:748
 #: driver/xscreensaver-demo.glade.h:54
 msgid "OK"
 msgstr "OK"
 #: driver/xscreensaver-demo.glade.h:54
 msgid "OK"
 msgstr "OK"
@@ -549,18 +549,18 @@ msgstr "OK"
 msgid "Cancel"
 msgstr "Anuluj"
 
 msgid "Cancel"
 msgstr "Anuluj"
 
-#: driver/demo-Gtk.c:649
+#: driver/demo-Gtk.c:656
 msgid "For updates, check http://www.jwz.org/xscreensaver/"
 msgstr "Aktualizacji szukaj na witrynie http://www.jwz.org/xscreensaver/"
 
 msgid "For updates, check http://www.jwz.org/xscreensaver/"
 msgstr "Aktualizacji szukaj na witrynie http://www.jwz.org/xscreensaver/"
 
-#: driver/demo-Gtk.c:779
+#: driver/demo-Gtk.c:786
 msgid ""
 "Error:\n"
 "\n"
 "No Help URL has been specified.\n"
 msgstr ""
 
 msgid ""
 "Error:\n"
 "\n"
 "No Help URL has been specified.\n"
 msgstr ""
 
-#: driver/demo-Gtk.c:865
+#: driver/demo-Gtk.c:872
 msgid ""
 "Error:\n"
 "\n"
 msgid ""
 "Error:\n"
 "\n"
@@ -568,7 +568,7 @@ msgid ""
 "\n"
 msgstr ""
 
 "\n"
 msgstr ""
 
-#: driver/demo-Gtk.c:877
+#: driver/demo-Gtk.c:884
 msgid ""
 "You are running as root.  This usually means that xscreensaver\n"
 "was unable to contact your X server because access control is\n"
 msgid ""
 "You are running as root.  This usually means that xscreensaver\n"
 "was unable to contact your X server because access control is\n"
@@ -587,11 +587,11 @@ msgid ""
 "normal user, and `su' as necessary."
 msgstr ""
 
 "normal user, and `su' as necessary."
 msgstr ""
 
-#: driver/demo-Gtk.c:893
+#: driver/demo-Gtk.c:900
 msgid "Please check your $PATH and permissions."
 msgstr ""
 
 msgid "Please check your $PATH and permissions."
 msgstr ""
 
-#: driver/demo-Gtk.c:928
+#: driver/demo-Gtk.c:935
 msgid ""
 "Error:\n"
 "\n"
 msgid ""
 "Error:\n"
 "\n"
@@ -601,7 +601,7 @@ msgstr ""
 "\n"
 "Nie można określić nazwy pliku inicjującego!\n"
 
 "\n"
 "Nie można określić nazwy pliku inicjującego!\n"
 
-#: driver/demo-Gtk.c:933
+#: driver/demo-Gtk.c:940
 #, c-format
 msgid ""
 "Error:\n"
 #, c-format
 msgid ""
 "Error:\n"
@@ -609,14 +609,14 @@ msgid ""
 "Couldn't write %s\n"
 msgstr ""
 
 "Couldn't write %s\n"
 msgstr ""
 
-#: driver/demo-Gtk.c:992
+#: driver/demo-Gtk.c:999
 msgid ""
 "Error:\n"
 "\n"
 "no `manualCommand' resource set."
 msgstr ""
 
 msgid ""
 "Error:\n"
 "\n"
 "no `manualCommand' resource set."
 msgstr ""
 
-#: driver/demo-Gtk.c:1173
+#: driver/demo-Gtk.c:1180
 #, c-format
 msgid ""
 "Error:\n"
 #, c-format
 msgid ""
 "Error:\n"
@@ -624,7 +624,7 @@ msgid ""
 "Unparsable time format: \"%s\"\n"
 msgstr ""
 
 "Unparsable time format: \"%s\"\n"
 msgstr ""
 
-#: driver/demo-Gtk.c:1829
+#: driver/demo-Gtk.c:1836
 #, c-format
 msgid ""
 "Error:\n"
 #, c-format
 msgid ""
 "Error:\n"
@@ -635,28 +635,28 @@ msgstr ""
 "\n"
 "Katalog nie istnieje: \"%s\"\n"
 
 "\n"
 "Katalog nie istnieje: \"%s\"\n"
 
-#: driver/demo-Gtk.c:2546
+#: driver/demo-Gtk.c:2553
 msgid "Descriptions not available: no XML support compiled in."
 msgstr "Opisy nie są dostępne: brak wkompilowanej obsługi XML."
 
 msgid "Descriptions not available: no XML support compiled in."
 msgstr "Opisy nie są dostępne: brak wkompilowanej obsługi XML."
 
-#: driver/demo-Gtk.c:2551
+#: driver/demo-Gtk.c:2558
 msgid "No description available."
 msgstr "Brak opisu."
 
 msgid "No description available."
 msgstr "Brak opisu."
 
-#: driver/demo-Gtk.c:2816
+#: driver/demo-Gtk.c:2823
 msgid "Blank Screen"
 msgstr "Pusty ekran"
 
 msgid "Blank Screen"
 msgstr "Pusty ekran"
 
-#: driver/demo-Gtk.c:2822
+#: driver/demo-Gtk.c:2829
 msgid "Screen Saver Disabled"
 msgstr "Bez wygaszacza ekranu"
 
 msgid "Screen Saver Disabled"
 msgstr "Bez wygaszacza ekranu"
 
-#: driver/demo-Gtk.c:2855
+#: driver/demo-Gtk.c:2862
 #, c-format
 msgid "%s: %.100s Settings"
 msgstr ""
 
 #, c-format
 msgid "%s: %.100s Settings"
 msgstr ""
 
-#: driver/demo-Gtk.c:3010
+#: driver/demo-Gtk.c:3017
 #, c-format
 msgid ""
 "Warning:\n"
 #, c-format
 msgid ""
 "Warning:\n"
@@ -667,23 +667,23 @@ msgstr ""
 "\n"
 "Plik \"%s\" został zmieniony, zostaje wczytany ponownie.\n"
 
 "\n"
 "Plik \"%s\" został zmieniony, zostaje wczytany ponownie.\n"
 
-#: driver/demo-Gtk.c:3092
+#: driver/demo-Gtk.c:3099
 msgid "No Preview"
 msgstr "Brak podglądu"
 
 msgid "No Preview"
 msgstr "Brak podglądu"
 
-#: driver/demo-Gtk.c:3092
+#: driver/demo-Gtk.c:3099
 msgid "Available"
 msgstr "Dostępny"
 
 msgid "Available"
 msgstr "Dostępny"
 
-#: driver/demo-Gtk.c:3093
+#: driver/demo-Gtk.c:3100
 msgid "Not"
 msgstr ""
 
 msgid "Not"
 msgstr ""
 
-#: driver/demo-Gtk.c:3093
+#: driver/demo-Gtk.c:3100
 msgid "Installed"
 msgstr ""
 
 msgid "Installed"
 msgstr ""
 
-#: driver/demo-Gtk.c:3858
+#: driver/demo-Gtk.c:3865
 #, c-format
 msgid ""
 "Warning:\n"
 #, c-format
 msgid ""
 "Warning:\n"
@@ -697,7 +697,7 @@ msgstr ""
 "XScreenSaver, powiązany z ekranem \"%s\".\n"
 "Czy chcesz go teraz uruchomić?"
 
 "XScreenSaver, powiązany z ekranem \"%s\".\n"
 "Czy chcesz go teraz uruchomić?"
 
-#: driver/demo-Gtk.c:3868
+#: driver/demo-Gtk.c:3875
 #, c-format
 msgid ""
 "Warning:\n"
 #, c-format
 msgid ""
 "Warning:\n"
@@ -730,7 +730,7 @@ msgstr ""
 "\n"
 "Czy chcesz teraz ponownie uruchomić program demona xscreensaver?\n"
 
 "\n"
 "Czy chcesz teraz ponownie uruchomić program demona xscreensaver?\n"
 
-#: driver/demo-Gtk.c:3893
+#: driver/demo-Gtk.c:3900
 #, c-format
 msgid ""
 "Warning:\n"
 #, c-format
 msgid ""
 "Warning:\n"
@@ -758,7 +758,7 @@ msgstr ""
 "Czy chcesz teraz ponownie uruchomić program demona xscreensaver\n"
 "na komputerze \"%s\" jako użytkownik \"%s\"?\n"
 
 "Czy chcesz teraz ponownie uruchomić program demona xscreensaver\n"
 "na komputerze \"%s\" jako użytkownik \"%s\"?\n"
 
-#: driver/demo-Gtk.c:3915
+#: driver/demo-Gtk.c:3922
 #, c-format
 msgid ""
 "Warning:\n"
 #, c-format
 msgid ""
 "Warning:\n"
@@ -777,12 +777,12 @@ msgstr ""
 "\n"
 "Czy chcesz teraz ponownie uruchomić program demona xscreensaver?\n"
 
 "\n"
 "Czy chcesz teraz ponownie uruchomić program demona xscreensaver?\n"
 
-#: driver/demo-Gtk.c:4372
+#: driver/demo-Gtk.c:4379
 #, c-format
 msgid "%s: unknown option: %s\n"
 msgstr "%s: nieznana opcja: %s\n"
 
 #, c-format
 msgid "%s: unknown option: %s\n"
 msgstr "%s: nieznana opcja: %s\n"
 
-#: driver/demo-Gtk.c:4436
+#: driver/demo-Gtk.c:4443
 #, fuzzy
 msgid "Screensaver Preferences"
 msgstr "Wygaszacz ekranu"
 #, fuzzy
 msgid "Screensaver Preferences"
 msgstr "Wygaszacz ekranu"
@@ -1003,22 +1003,23 @@ msgstr ""
 #: 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/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:5 hacks/config/flyingtoasters.xml.h:5
-#: hacks/config/fontglide.xml.h:4 hacks/config/forest.xml.h:1
-#: hacks/config/fuzzyflakes.xml.h:7 hacks/config/galaxy.xml.h:3
-#: hacks/config/gears.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:6
-#: 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/fadeplot.xml.h:4 hacks/config/fireworkx.xml.h:3
+#: 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:2 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/fuzzyflakes.xml.h:7
+#: hacks/config/galaxy.xml.h:3 hacks/config/gears.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:6 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/intermomentary.xml.h:1 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/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
@@ -1036,23 +1037,24 @@ msgstr ""
 #: hacks/config/pacman.xml.h:1 hacks/config/penetrate.xml.h:3
 #: hacks/config/penrose.xml.h:6 hacks/config/petri.xml.h:5
 #: hacks/config/phosphor.xml.h:4 hacks/config/piecewise.xml.h:4
 #: hacks/config/pacman.xml.h:1 hacks/config/penetrate.xml.h:3
 #: hacks/config/penrose.xml.h:6 hacks/config/petri.xml.h:5
 #: hacks/config/phosphor.xml.h:4 hacks/config/piecewise.xml.h:4
-#: hacks/config/pipes.xml.h:5 hacks/config/polyhedra.xml.h:18
-#: hacks/config/polyominoes.xml.h:2 hacks/config/polytopes.xml.h:11
-#: hacks/config/pong.xml.h:1 hacks/config/popsquares.xml.h:3
-#: hacks/config/providence.xml.h:2 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 hacks/config/rocks.xml.h:4
-#: hacks/config/rotor.xml.h:3 hacks/config/rubik.xml.h:3
-#: hacks/config/sballs.xml.h:4 hacks/config/shadebobs.xml.h:3
-#: hacks/config/sierpinski.xml.h:2 hacks/config/sierpinski3d.xml.h:2
-#: hacks/config/slidescreen.xml.h:2 hacks/config/slip.xml.h:2
-#: hacks/config/speedmine.xml.h:3 hacks/config/sphere.xml.h:2
-#: hacks/config/spheremonics.xml.h:5 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:1 hacks/config/superquadrics.xml.h:4
+#: hacks/config/pinion.xml.h:5 hacks/config/pipes.xml.h:5
+#: hacks/config/polyhedra.xml.h:18 hacks/config/polyominoes.xml.h:2
+#: hacks/config/polytopes.xml.h:11 hacks/config/pong.xml.h:1
+#: hacks/config/popsquares.xml.h:3 hacks/config/providence.xml.h:2
+#: 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
+#: hacks/config/rocks.xml.h:4 hacks/config/rotor.xml.h:3
+#: hacks/config/rubik.xml.h:3 hacks/config/sballs.xml.h:4
+#: hacks/config/shadebobs.xml.h:3 hacks/config/sierpinski.xml.h:2
+#: hacks/config/sierpinski3d.xml.h:2 hacks/config/slidescreen.xml.h:2
+#: hacks/config/slip.xml.h:2 hacks/config/speedmine.xml.h:3
+#: hacks/config/sphere.xml.h:2 hacks/config/spheremonics.xml.h:5
+#: 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:1
+#: hacks/config/substrate.xml.h:2 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/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
@@ -1074,8 +1076,9 @@ msgstr "Szybkie"
 #: hacks/config/fuzzyflakes.xml.h:8 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/fuzzyflakes.xml.h:8 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/wormhole.xml.h:3 hacks/config/xfishtank.xml.h:4
+#: hacks/config/substrate.xml.h:3 hacks/config/thornbird.xml.h:3
+#: hacks/config/whirlwindwarp.xml.h:1 hacks/config/wormhole.xml.h:3
+#: hacks/config/xfishtank.xml.h:4
 msgid "Few"
 msgstr ""
 
 msgid "Few"
 msgstr ""
 
@@ -1091,7 +1094,7 @@ msgstr ""
 #: hacks/config/epicycle.xml.h:8 hacks/config/eruption.xml.h:12
 #: hacks/config/euler2d.xml.h:8 hacks/config/fadeplot.xml.h:6
 #: hacks/config/flag.xml.h:5 hacks/config/flame.xml.h:11
 #: hacks/config/epicycle.xml.h:8 hacks/config/eruption.xml.h:12
 #: hacks/config/euler2d.xml.h:8 hacks/config/fadeplot.xml.h:6
 #: hacks/config/flag.xml.h:5 hacks/config/flame.xml.h:11
-#: hacks/config/flow.xml.h:8 hacks/config/fluidballs.xml.h:13
+#: hacks/config/flow.xml.h:7 hacks/config/fluidballs.xml.h:13
 #: hacks/config/forest.xml.h:3 hacks/config/fuzzyflakes.xml.h:12
 #: 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/forest.xml.h:3 hacks/config/fuzzyflakes.xml.h:12
 #: hacks/config/galaxy.xml.h:6 hacks/config/grav.xml.h:4
 #: hacks/config/halo.xml.h:4 hacks/config/hopalong.xml.h:15
@@ -1129,7 +1132,7 @@ msgstr "Wiele"
 #: 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/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/flow.xml.h:8 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/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
@@ -1184,22 +1187,23 @@ msgstr ""
 #: 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/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/flyingtoasters.xml.h:11
-#: hacks/config/fontglide.xml.h:13 hacks/config/forest.xml.h:5
-#: hacks/config/fuzzyflakes.xml.h:15 hacks/config/galaxy.xml.h:10
-#: hacks/config/gears.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:8 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:10 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/fadeplot.xml.h:8 hacks/config/fireworkx.xml.h:9
+#: 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:10 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/fuzzyflakes.xml.h:15
+#: hacks/config/galaxy.xml.h:11 hacks/config/gears.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:8
+#: 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:10
+#: 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/intermomentary.xml.h:4 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/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
@@ -1217,23 +1221,24 @@ msgstr ""
 #: hacks/config/pacman.xml.h:5 hacks/config/penetrate.xml.h:6
 #: hacks/config/penrose.xml.h:11 hacks/config/petri.xml.h:23
 #: hacks/config/phosphor.xml.h:7 hacks/config/piecewise.xml.h:9
 #: hacks/config/pacman.xml.h:5 hacks/config/penetrate.xml.h:6
 #: hacks/config/penrose.xml.h:11 hacks/config/petri.xml.h:23
 #: hacks/config/phosphor.xml.h:7 hacks/config/piecewise.xml.h:9
-#: hacks/config/pipes.xml.h:15 hacks/config/polyhedra.xml.h:119
-#: hacks/config/polyominoes.xml.h:10 hacks/config/polytopes.xml.h:20
-#: hacks/config/pong.xml.h:4 hacks/config/popsquares.xml.h:5
-#: hacks/config/providence.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 hacks/config/rocks.xml.h:9
-#: hacks/config/rotor.xml.h:11 hacks/config/rubik.xml.h:9
-#: hacks/config/sballs.xml.h:13 hacks/config/shadebobs.xml.h:9
-#: hacks/config/sierpinski.xml.h:7 hacks/config/sierpinski3d.xml.h:8
-#: hacks/config/slidescreen.xml.h:6 hacks/config/slip.xml.h:7
-#: hacks/config/speedmine.xml.h:13 hacks/config/sphere.xml.h:5
-#: hacks/config/spheremonics.xml.h:19 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:4 hacks/config/superquadrics.xml.h:8
+#: hacks/config/pinion.xml.h:13 hacks/config/pipes.xml.h:15
+#: hacks/config/polyhedra.xml.h:119 hacks/config/polyominoes.xml.h:10
+#: hacks/config/polytopes.xml.h:20 hacks/config/pong.xml.h:4
+#: hacks/config/popsquares.xml.h:5 hacks/config/providence.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
+#: hacks/config/rocks.xml.h:9 hacks/config/rotor.xml.h:11
+#: hacks/config/rubik.xml.h:9 hacks/config/sballs.xml.h:13
+#: hacks/config/shadebobs.xml.h:9 hacks/config/sierpinski.xml.h:7
+#: hacks/config/sierpinski3d.xml.h:8 hacks/config/slidescreen.xml.h:6
+#: hacks/config/slip.xml.h:7 hacks/config/speedmine.xml.h:13
+#: hacks/config/sphere.xml.h:5 hacks/config/spheremonics.xml.h:19
+#: 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:4
+#: hacks/config/substrate.xml.h:10 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/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
@@ -1266,17 +1271,18 @@ msgstr "Wolne"
 #: hacks/config/engine.xml.h:16 hacks/config/epicycle.xml.h:11
 #: 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/engine.xml.h:16 hacks/config/epicycle.xml.h:11
 #: 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/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/fuzzyflakes.xml.h:17
-#: hacks/config/galaxy.xml.h:11 hacks/config/glblur.xml.h:17
-#: hacks/config/glforestfire.xml.h:15 hacks/config/glplanet.xml.h:10
-#: 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:11 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/fireworkx.xml.h:11 hacks/config/flag.xml.h:9
+#: hacks/config/flame.xml.h:15 hacks/config/flipflop.xml.h:7
+#: hacks/config/flipscreen3d.xml.h:7 hacks/config/flow.xml.h:12
+#: hacks/config/fluidballs.xml.h:20 hacks/config/forest.xml.h:6
+#: hacks/config/fuzzyflakes.xml.h:17 hacks/config/galaxy.xml.h:12
+#: hacks/config/glblur.xml.h:17 hacks/config/glforestfire.xml.h:15
+#: hacks/config/glplanet.xml.h:10 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:11
+#: 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/intermomentary.xml.h:5 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/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
@@ -1305,16 +1311,16 @@ msgstr "Wolne"
 #: 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/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/xplanet.xml.h:60 hacks/config/xrayswarm.xml.h:4
-#: hacks/config/zoom.xml.h:7
+#: hacks/config/strange.xml.h:5 hacks/config/substrate.xml.h:11
+#: 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/xplanet.xml.h:60
+#: hacks/config/xrayswarm.xml.h:4 hacks/config/zoom.xml.h:7
 msgid "Speed"
 msgstr "Tempo"
 
 msgid "Speed"
 msgstr "Tempo"
 
@@ -1357,8 +1363,8 @@ msgstr ""
 #: hacks/config/discrete.xml.h:11 hacks/config/drift.xml.h:14
 #: hacks/config/epicycle.xml.h:13 hacks/config/euler2d.xml.h:17
 #: hacks/config/fadeplot.xml.h:12 hacks/config/flag.xml.h:13
 #: hacks/config/discrete.xml.h:11 hacks/config/drift.xml.h:14
 #: hacks/config/epicycle.xml.h:13 hacks/config/euler2d.xml.h:17
 #: hacks/config/fadeplot.xml.h:12 hacks/config/flag.xml.h:13
-#: hacks/config/flame.xml.h:16 hacks/config/flow.xml.h:18
-#: hacks/config/forest.xml.h:8 hacks/config/galaxy.xml.h:13
+#: hacks/config/flame.xml.h:16 hacks/config/flow.xml.h:15
+#: hacks/config/forest.xml.h:8 hacks/config/galaxy.xml.h:14
 #: hacks/config/grav.xml.h:11 hacks/config/halo.xml.h:13
 #: hacks/config/hopalong.xml.h:25 hacks/config/ifs.xml.h:8
 #: hacks/config/imsmap.xml.h:15 hacks/config/interference.xml.h:19
 #: hacks/config/grav.xml.h:11 hacks/config/halo.xml.h:13
 #: hacks/config/hopalong.xml.h:25 hacks/config/ifs.xml.h:8
 #: hacks/config/imsmap.xml.h:15 hacks/config/interference.xml.h:19
@@ -1459,7 +1465,7 @@ msgstr "Komórki czterokątne"
 #: 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/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/flag.xml.h:4 hacks/config/flow.xml.h:4
 #: hacks/config/fluidballs.xml.h:12 hacks/config/fuzzyflakes.xml.h:10
 #: 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/fluidballs.xml.h:12 hacks/config/fuzzyflakes.xml.h:10
 #: hacks/config/gleidescope.xml.h:7 hacks/config/halftone.xml.h:8
 #: hacks/config/hopalong.xml.h:13 hacks/config/interference.xml.h:11
@@ -1491,7 +1497,7 @@ msgstr "Komórki sześciokątne"
 #: 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/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/flag.xml.h:8 hacks/config/flow.xml.h:11
 #: hacks/config/fluidballs.xml.h:19 hacks/config/fuzzyflakes.xml.h:16
 #: 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/fluidballs.xml.h:19 hacks/config/fuzzyflakes.xml.h:16
 #: hacks/config/gleidescope.xml.h:12 hacks/config/halftone.xml.h:14
 #: hacks/config/hopalong.xml.h:22 hacks/config/interference.xml.h:18
@@ -1510,7 +1516,7 @@ msgstr "Komórki trójkątne"
 
 #: 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/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/flag.xml.h:12 hacks/config/flow.xml.h:14
 #: hacks/config/lissie.xml.h:12 hacks/config/loop.xml.h:11
 #: hacks/config/rubik.xml.h:12 hacks/config/sierpinski.xml.h:11
 #: hacks/config/slip.xml.h:11
 #: hacks/config/lissie.xml.h:12 hacks/config/loop.xml.h:11
 #: hacks/config/rubik.xml.h:12 hacks/config/sierpinski.xml.h:11
 #: hacks/config/slip.xml.h:11
@@ -1562,13 +1568,14 @@ msgstr ""
 #: hacks/config/menger.xml.h:15 hacks/config/mirrorblob.xml.h:18
 #: hacks/config/moebius.xml.h:6 hacks/config/molecule.xml.h:21
 #: hacks/config/morph3d.xml.h:5 hacks/config/noof.xml.h:4
 #: hacks/config/menger.xml.h:15 hacks/config/mirrorblob.xml.h:18
 #: hacks/config/moebius.xml.h:6 hacks/config/molecule.xml.h:21
 #: hacks/config/morph3d.xml.h:5 hacks/config/noof.xml.h:4
-#: hacks/config/pipes.xml.h:14 hacks/config/polyhedra.xml.h:118
-#: hacks/config/polytopes.xml.h:18 hacks/config/providence.xml.h:4
-#: 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
+#: hacks/config/pinion.xml.h:12 hacks/config/pipes.xml.h:14
+#: hacks/config/polyhedra.xml.h:118 hacks/config/polytopes.xml.h:18
+#: hacks/config/providence.xml.h:4 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 "Wyświetlanie liczby klatek na sekundę"
 
 msgid "Show Frames-per-Second"
 msgstr "Wyświetlanie liczby klatek na sekundę"
 
@@ -1732,11 +1739,12 @@ msgstr "Tempo ruchu wieloryba"
 #: hacks/config/lament.xml.h:9 hacks/config/lavalite.xml.h:32
 #: hacks/config/menger.xml.h:21 hacks/config/mirrorblob.xml.h:24
 #: hacks/config/moebius.xml.h:11 hacks/config/molecule.xml.h:26
 #: hacks/config/lament.xml.h:9 hacks/config/lavalite.xml.h:32
 #: hacks/config/menger.xml.h:21 hacks/config/mirrorblob.xml.h:24
 #: hacks/config/moebius.xml.h:11 hacks/config/molecule.xml.h:26
-#: hacks/config/polyhedra.xml.h:173 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
+#: hacks/config/pinion.xml.h:15 hacks/config/polyhedra.xml.h:173
+#: 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 "Szkielet"
 
 msgid "Wireframe"
 msgstr "Szkielet"
 
@@ -1825,14 +1833,15 @@ msgstr "Linie"
 #: 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/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/mismunch.xml.h:3
-#: 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 hacks/config/spheremonics.xml.h:7
+#: hacks/config/flow.xml.h:6 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/mismunch.xml.h:3 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
+#: hacks/config/spheremonics.xml.h:7 hacks/config/substrate.xml.h:6
 #: hacks/config/wander.xml.h:10 hacks/config/whirlwindwarp.xml.h:3
 msgid "Long"
 msgstr "Długie"
 #: hacks/config/wander.xml.h:10 hacks/config/whirlwindwarp.xml.h:3
 msgid "Long"
 msgstr "Długie"
@@ -1880,13 +1889,14 @@ msgstr "Prz_esunięcie progowe:"
 #: 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/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/metaballs.xml.h:12 hacks/config/mismunch.xml.h:8
-#: 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/flow.xml.h:9 hacks/config/galaxy.xml.h:9
+#: hacks/config/klein.xml.h:5 hacks/config/laser.xml.h:9
+#: hacks/config/menger.xml.h:14 hacks/config/metaballs.xml.h:12
+#: hacks/config/mismunch.xml.h:8 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/substrate.xml.h:9
 #: hacks/config/wander.xml.h:12 hacks/config/whirlwindwarp.xml.h:6
 msgid "Short"
 msgstr "Krótkie"
 #: hacks/config/wander.xml.h:12 hacks/config/whirlwindwarp.xml.h:6
 msgid "Short"
 msgstr "Krótkie"
@@ -2089,10 +2099,10 @@ msgstr ""
 #: 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/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/polyhedra.xml.h:3 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/wormhole.xml.h:1
-#: hacks/config/xfishtank.xml.h:1
+#: hacks/config/pinion.xml.h:3 hacks/config/polyhedra.xml.h:3
+#: 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/wormhole.xml.h:1 hacks/config/xfishtank.xml.h:1
 msgid "Animation Speed"
 msgstr "Tempo animacji"
 
 msgid "Animation Speed"
 msgstr "Tempo animacji"
 
@@ -2172,8 +2182,9 @@ msgstr ""
 #: 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/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/starfish.xml.h:2 hacks/config/substrate.xml.h:1
+#: hacks/config/vidwhacker.xml.h:3 hacks/config/wander.xml.h:7
+#: hacks/config/xspirograph.xml.h:3
 msgid "Duration"
 msgstr "Okres"
 
 msgid "Duration"
 msgstr "Okres"
 
@@ -2428,7 +2439,7 @@ msgstr "Części"
 msgid "Rotate"
 msgstr ""
 
 msgid "Rotate"
 msgstr ""
 
-#: hacks/config/circuit.xml.h:8
+#: hacks/config/circuit.xml.h:8 hacks/config/pinion.xml.h:10
 msgid "Rotation Speed"
 msgstr "Tempo rotacji"
 
 msgid "Rotation Speed"
 msgstr "Tempo rotacji"
 
@@ -2515,11 +2526,12 @@ msgstr "1 sekunda"
 msgid "Coral"
 msgstr "Koral"
 
 msgid "Coral"
 msgstr "Koral"
 
-#: hacks/config/coral.xml.h:4 hacks/config/gflux.xml.h:3
-#: hacks/config/glblur.xml.h:2 hacks/config/glmatrix.xml.h:3
-#: 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
+#: hacks/config/coral.xml.h:4 hacks/config/fireworkx.xml.h:2
+#: hacks/config/gflux.xml.h:3 hacks/config/glblur.xml.h:2
+#: hacks/config/glmatrix.xml.h:3 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 "Ogólne"
 #, fuzzy
 msgid "Dense"
 msgstr "Ogólne"
@@ -2533,12 +2545,12 @@ msgid ""
 "Simulates coral growth, albeit somewhat slowly. Written by Frederick Roeber."
 msgstr ""
 
 "Simulates coral growth, albeit somewhat slowly. Written by Frederick Roeber."
 msgstr ""
 
-#: hacks/config/coral.xml.h:13 hacks/config/gflux.xml.h:13
-#: hacks/config/glblur.xml.h:16 hacks/config/glmatrix.xml.h:19
-#: hacks/config/imsmap.xml.h:13 hacks/config/lavalite.xml.h:29
-#: hacks/config/pyro.xml.h:14 hacks/config/qix.xml.h:21
-#: hacks/config/squiral.xml.h:15 hacks/config/xearth.xml.h:24
-#: hacks/config/xmatrix.xml.h:17
+#: hacks/config/coral.xml.h:13 hacks/config/fireworkx.xml.h:10
+#: hacks/config/gflux.xml.h:13 hacks/config/glblur.xml.h:16
+#: hacks/config/glmatrix.xml.h:19 hacks/config/imsmap.xml.h:13
+#: hacks/config/lavalite.xml.h:29 hacks/config/pyro.xml.h:14
+#: hacks/config/qix.xml.h:21 hacks/config/squiral.xml.h:15
+#: hacks/config/xearth.xml.h:24 hacks/config/xmatrix.xml.h:17
 #, fuzzy
 msgid "Sparse"
 msgstr "Schody"
 #, fuzzy
 msgid "Sparse"
 msgstr "Schody"
@@ -2568,7 +2580,7 @@ msgid "Center on Screen"
 msgstr "Wyśrodkowanie na ekranie"
 
 #: hacks/config/crystal.xml.h:2 hacks/config/deluxe.xml.h:1
 msgstr "Wyśrodkowanie na ekranie"
 
 #: hacks/config/crystal.xml.h:2 hacks/config/deluxe.xml.h:1
-#: hacks/config/fadeplot.xml.h:1 hacks/config/flow.xml.h:3
+#: hacks/config/fadeplot.xml.h:1 hacks/config/flow.xml.h:1
 #: hacks/config/galaxy.xml.h:1 hacks/config/glforestfire.xml.h:1
 #: hacks/config/grav.xml.h:1 hacks/config/julia.xml.h:1
 #: hacks/config/laser.xml.h:1 hacks/config/lisa.xml.h:1
 #: hacks/config/galaxy.xml.h:1 hacks/config/glforestfire.xml.h:1
 #: hacks/config/grav.xml.h:1 hacks/config/julia.xml.h:1
 #: hacks/config/laser.xml.h:1 hacks/config/lisa.xml.h:1
@@ -3349,7 +3361,7 @@ msgstr ""
 msgid "Half"
 msgstr "Halo"
 
 msgid "Half"
 msgstr "Halo"
 
-#: hacks/config/fireflies.xml.h:17
+#: hacks/config/fireflies.xml.h:17 hacks/config/pinion.xml.h:7
 #, fuzzy
 msgid "Huge"
 msgstr "Potężna czcionka"
 #, fuzzy
 msgid "Huge"
 msgstr "Potężna czcionka"
@@ -3446,7 +3458,7 @@ msgstr ""
 msgid "Swarm tails glow"
 msgstr ""
 
 msgid "Swarm tails glow"
 msgstr ""
 
-#: hacks/config/fireflies.xml.h:43
+#: hacks/config/fireflies.xml.h:43 hacks/config/pinion.xml.h:14
 msgid "Tiny"
 msgstr ""
 
 msgid "Tiny"
 msgstr ""
 
@@ -3464,6 +3476,32 @@ msgstr "Windows"
 msgid "Wind picks up"
 msgstr ""
 
 msgid "Wind picks up"
 msgstr ""
 
+#: hacks/config/fireworkx.xml.h:1 hacks/config/lavalite.xml.h:3
+msgid "Activity"
+msgstr ""
+
+#: hacks/config/fireworkx.xml.h:4
+msgid "Fast Fade (more realistic)"
+msgstr ""
+
+#: hacks/config/fireworkx.xml.h:5
+#, fuzzy
+msgid "Fireworkx"
+msgstr "_Plik"
+
+#: hacks/config/fireworkx.xml.h:6
+msgid "Light effect"
+msgstr ""
+
+#: hacks/config/fireworkx.xml.h:7
+msgid "Pyrotechnics simulation eye-candy. Written by Rony B. Chandran."
+msgstr ""
+
+#: hacks/config/fireworkx.xml.h:8
+#, fuzzy
+msgid "Shoot"
+msgstr "Krótkie"
+
 #: hacks/config/flag.xml.h:1
 msgid "Bitmap for Flag"
 msgstr "Bitmapa na fladze"
 #: hacks/config/flag.xml.h:1
 msgid "Bitmap for Flag"
 msgstr "Bitmapa na fladze"
@@ -3540,42 +3578,44 @@ msgid ""
 "around and deforms it in various ways. Written by Ben Buxton."
 msgstr ""
 
 "around and deforms it in various ways. Written by Ben Buxton."
 msgstr ""
 
-#: hacks/config/flow.xml.h:1
-msgid "Allow 2D Attractors"
-msgstr ""
-
-#: hacks/config/flow.xml.h:2
-msgid ""
-"Another series of strange attractors: a flowing series of points, making "
-"strange rotational shapes. Written by Tim Auckland."
-msgstr ""
-
-#: hacks/config/flow.xml.h:5
+#: hacks/config/flow.xml.h:3
 msgid "Flow"
 msgstr "Przepływ"
 
 msgid "Flow"
 msgstr "Przepływ"
 
-#: hacks/config/flow.xml.h:6
-msgid "Freeze Some Bees"
+#: hacks/config/flow.xml.h:5
+#, fuzzy
+msgid "Length of trails"
+msgstr "Nałożenie z operacją XOR"
+
+#: hacks/config/flow.xml.h:13
+msgid ""
+"Strange attractors formed of flows in a 3D differential equation phase "
+"space. Written by Tim Auckland."
 msgstr ""
 
 msgstr ""
 
-#: hacks/config/flow.xml.h:10
-msgid "Ride a Trained Bee"
+#: hacks/config/flow.xml.h:16
+msgid "turn on/off bounding box."
 msgstr ""
 
 msgstr ""
 
-#: hacks/config/flow.xml.h:11
-msgid "Rotate Around Attractor"
+#: hacks/config/flow.xml.h:17
+#, fuzzy
+msgid "turn on/off double buffering."
+msgstr "Podwójne buforowanie"
+
+#: hacks/config/flow.xml.h:18
+msgid "turn on/off periodic attractors."
 msgstr ""
 
 msgstr ""
 
-#: hacks/config/flow.xml.h:12
-msgid "Show Bounding Box"
+#: hacks/config/flow.xml.h:19
+msgid "turn on/off ride in the flow."
 msgstr ""
 
 msgstr ""
 
-#: hacks/config/flow.xml.h:14
-msgid "Slow Bees with Antifreeze"
+#: hacks/config/flow.xml.h:20
+msgid "turn on/off rotating around attractor."
 msgstr ""
 
 msgstr ""
 
-#: hacks/config/flow.xml.h:19
-msgid "Zoom In and Out"
+#: hacks/config/flow.xml.h:21
+msgid "turn on/off search for new attractors."
 msgstr ""
 
 #: hacks/config/fluidballs.xml.h:1
 msgstr ""
 
 #: hacks/config/fluidballs.xml.h:1
@@ -3798,7 +3838,12 @@ msgstr "Losowy ruch"
 msgid "Galaxy"
 msgstr "Galaktyka"
 
 msgid "Galaxy"
 msgstr "Galaktyka"
 
-#: hacks/config/galaxy.xml.h:9 hacks/config/lisa.xml.h:7
+#: hacks/config/galaxy.xml.h:8
+#, fuzzy
+msgid "Rotate Viewpoint"
+msgstr "Ruch liniowy"
+
+#: hacks/config/galaxy.xml.h:10 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/pong.xml.h:3
 #: hacks/config/rotor.xml.h:10 hacks/config/rubik.xml.h:8
 #: hacks/config/lissie.xml.h:8 hacks/config/loop.xml.h:6
 #: hacks/config/penrose.xml.h:10 hacks/config/pong.xml.h:3
 #: hacks/config/rotor.xml.h:10 hacks/config/rubik.xml.h:8
@@ -3807,7 +3852,7 @@ msgstr "Galaktyka"
 msgid "Size"
 msgstr "Rozmiar"
 
 msgid "Size"
 msgstr "Rozmiar"
 
-#: hacks/config/galaxy.xml.h:12
+#: hacks/config/galaxy.xml.h:13
 msgid ""
 "This draws spinning galaxies, which then collide and scatter their stars to "
 "the, uh, four winds or something. Originally an Amiga program by Uli "
 msgid ""
 "This draws spinning galaxies, which then collide and scatter their stars to "
 "the, uh, four winds or something. Originally an Amiga program by Uli "
@@ -4123,9 +4168,9 @@ msgid ""
 "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 "
 "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."
+"of this window: the tab at the top of the *other* window.) 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
 msgstr ""
 
 #: hacks/config/glslideshow.xml.h:17
@@ -4675,6 +4720,27 @@ msgstr "Liczba fal"
 msgid "Wave Size"
 msgstr "Rozmiar fali"
 
 msgid "Wave Size"
 msgstr "Rozmiar fali"
 
+#: hacks/config/intermomentary.xml.h:2
+msgid "Intermomentary"
+msgstr ""
+
+#: hacks/config/intermomentary.xml.h:3
+#, fuzzy
+msgid "Number of Discs"
+msgstr "Liczba okręgów"
+
+#: hacks/config/intermomentary.xml.h:6
+msgid ""
+"The Intersection Momentary is a fun visualization defining the relationships "
+"between objects with Casey Reas, William Ngan, and Robert Hodgin. "
+"Commissioned for display at the Whitney Museum of American Art. A surface "
+"filled with 100 medium to small sized circles. Each circle has a different "
+"size and direction, but moves at the same slow rate. Display: A. The "
+"instantaneous intersections of the circles. B. The aggregate intersections "
+"of the circles. Ported to XScreensaver from the art project \"InterMomentary"
+"\" at http://www.complexification.net"
+msgstr ""
+
 #: hacks/config/jigglypuff.xml.h:2
 msgid "Chrome"
 msgstr ""
 #: hacks/config/jigglypuff.xml.h:2
 msgid "Chrome"
 msgstr ""
@@ -4900,10 +4966,6 @@ msgstr ""
 msgid "10"
 msgstr "100%"
 
 msgid "10"
 msgstr "100%"
 
-#: hacks/config/lavalite.xml.h:3
-msgid "Activity"
-msgstr ""
-
 #: hacks/config/lavalite.xml.h:4
 msgid "Classic Lavalite"
 msgstr ""
 #: hacks/config/lavalite.xml.h:4
 msgid "Classic Lavalite"
 msgstr ""
@@ -5647,6 +5709,41 @@ msgid ""
 "invisibility at intersection points. Written by Geoffrey Irving."
 msgstr ""
 
 "invisibility at intersection points. Written by Geoffrey Irving."
 msgstr ""
 
+#: hacks/config/pinion.xml.h:1
+#, fuzzy
+msgid "100"
+msgstr "100%"
+
+#: hacks/config/pinion.xml.h:2
+msgid "2000"
+msgstr ""
+
+#: hacks/config/pinion.xml.h:4
+msgid ""
+"Draws an interconnected set of gears moving across the screen. Written by "
+"Jamie Zawinski."
+msgstr ""
+
+#: hacks/config/pinion.xml.h:6
+#, fuzzy
+msgid "Gear Size"
+msgstr "Maksymalny rozmiar"
+
+#: hacks/config/pinion.xml.h:8
+#, fuzzy
+msgid "Max RPM"
+msgstr "Maksimum pierścieni"
+
+#: hacks/config/pinion.xml.h:9
+#, fuzzy
+msgid "Pinion"
+msgstr "Pakiety"
+
+#: hacks/config/pinion.xml.h:11
+#, fuzzy
+msgid "Scrolling Speed"
+msgstr "Tempo przewijania"
+
 #: hacks/config/pipes.xml.h:1
 msgid "Allow Tight Turns"
 msgstr ""
 #: hacks/config/pipes.xml.h:1
 msgid "Allow Tight Turns"
 msgstr ""
@@ -5675,7 +5772,8 @@ msgid ""
 "probably seen this GL hack. This version is by Marcelo Vianna."
 msgstr ""
 
 "probably seen this GL hack. This version is by Marcelo Vianna."
 msgstr ""
 
-#: hacks/config/pipes.xml.h:9 hacks/config/wormhole.xml.h:4
+#: hacks/config/pipes.xml.h:9 hacks/config/substrate.xml.h:7
+#: hacks/config/wormhole.xml.h:4
 #, fuzzy
 msgid "Lots"
 msgstr "Układ"
 #, fuzzy
 msgid "Lots"
 msgstr "Układ"
@@ -6907,22 +7005,26 @@ msgid "Ping subnet/30 (2 hosts)"
 msgstr ""
 
 #: hacks/config/sonar.xml.h:10
 msgstr ""
 
 #: hacks/config/sonar.xml.h:10
-msgid "Simulation Team Members"
+msgid "Resolve Host Names"
 msgstr ""
 
 #: hacks/config/sonar.xml.h:11
 msgstr ""
 
 #: hacks/config/sonar.xml.h:11
+msgid "Simulation Team Members"
+msgstr ""
+
+#: hacks/config/sonar.xml.h:12
 msgid "Sonar"
 msgstr "Sonar"
 
 msgid "Sonar"
 msgstr "Sonar"
 
-#: hacks/config/sonar.xml.h:12
+#: hacks/config/sonar.xml.h:13
 msgid "Team A Name"
 msgstr ""
 
 msgid "Team A Name"
 msgstr ""
 
-#: hacks/config/sonar.xml.h:13
+#: hacks/config/sonar.xml.h:14
 msgid "Team B Name"
 msgstr ""
 
 msgid "Team B Name"
 msgstr ""
 
-#: hacks/config/sonar.xml.h:14
+#: hacks/config/sonar.xml.h:15
 msgid ""
 "This program draws a simulation of a sonar screen. By default, it displays a "
 "random assortment of ``bogies'' on the screen, but if installed as \"setuid "
 msgid ""
 "This program draws a simulation of a sonar screen. By default, it displays a "
 "random assortment of ``bogies'' on the screen, but if installed as \"setuid "
@@ -6931,7 +7033,7 @@ msgid ""
 "Martin and Jamie Zawinski."
 msgstr ""
 
 "Martin and Jamie Zawinski."
 msgstr ""
 
-#: hacks/config/sonar.xml.h:15
+#: hacks/config/sonar.xml.h:16
 msgid "vs."
 msgstr ""
 
 msgid "vs."
 msgstr ""
 
@@ -7211,6 +7313,33 @@ msgid ""
 "Written by Massimino Pascal."
 msgstr ""
 
 "Written by Massimino Pascal."
 msgstr ""
 
+#: hacks/config/substrate.xml.h:4
+#, fuzzy
+msgid "Initial Cracks"
+msgstr "Gęstość cząstek"
+
+#: hacks/config/substrate.xml.h:5
+msgid ""
+"Lines like crystals grow on a computational substrate. A simple "
+"perpendicular growth rule creates intricate city-like structures. By J. "
+"Tarbell and Mike Kershaw."
+msgstr ""
+
+#: hacks/config/substrate.xml.h:8
+#, fuzzy
+msgid "Sandgrains"
+msgstr "Standardowe"
+
+#: hacks/config/substrate.xml.h:12
+#, fuzzy
+msgid "Substrate"
+msgstr "Stany"
+
+#: hacks/config/substrate.xml.h:13
+#, fuzzy
+msgid "Wireframe only"
+msgstr "Szkielet"
+
 #: hacks/config/superquadrics.xml.h:3
 msgid ""
 "Ed Mackey reports that he wrote the first version of this program in BASIC "
 #: hacks/config/superquadrics.xml.h:3
 msgid ""
 "Ed Mackey reports that he wrote the first version of this program in BASIC "
index b8926ad0cea58f2f5fffb36883b33120ccb99789..24c9c2a84259f7133dc9c7092bddabdff056044d 100644 (file)
--- a/po/pt.po
+++ b/po/pt.po
@@ -6,7 +6,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: 2.0\n"
 "Report-Msgid-Bugs-To: \n"
 msgstr ""
 "Project-Id-Version: 2.0\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2004-10-04 16:25+0200\n"
+"POT-Creation-Date: 2004-12-22 12:51+0100\n"
 "PO-Revision-Date: 2002-04-27 01:15+0000\n"
 "Last-Translator: Duarte Loreto <happyguy_pt@hotmail.com>\n"
 "Language-Team: Potuguese <gnome_pt@yahoogroups.com>\n"
 "PO-Revision-Date: 2002-04-27 01:15+0000\n"
 "Last-Translator: Duarte Loreto <happyguy_pt@hotmail.com>\n"
 "Language-Team: Potuguese <gnome_pt@yahoogroups.com>\n"
@@ -148,7 +148,7 @@ msgstr "Quanto tempo at
 msgid "minutes"
 msgstr "minutos"
 
 msgid "minutes"
 msgstr "minutos"
 
-#: driver/demo-Gtk-widgets.c:482 driver/demo-Gtk.c:2845
+#: driver/demo-Gtk-widgets.c:482 driver/demo-Gtk.c:2852
 #: driver/xscreensaver-demo.glade.h:58
 msgid "Preview"
 msgstr "Prever"
 #: driver/xscreensaver-demo.glade.h:58
 msgid "Preview"
 msgstr "Prever"
@@ -195,12 +195,12 @@ msgstr "Apenas Uma Protec
 msgid "Random Screen Saver"
 msgstr "Protecção de Ecrã Aleatória"
 
 msgid "Random Screen Saver"
 msgstr "Protecção de Ecrã Aleatória"
 
-#: driver/demo-Gtk-widgets.c:571 driver/demo-Gtk.c:2134
+#: driver/demo-Gtk-widgets.c:571 driver/demo-Gtk.c:2141
 #: driver/xscreensaver-demo.glade.h:75
 msgid "Use"
 msgstr "Utilizar"
 
 #: driver/xscreensaver-demo.glade.h:75
 msgid "Use"
 msgstr "Utilizar"
 
-#: driver/demo-Gtk-widgets.c:591 driver/demo-Gtk.c:2144
+#: driver/demo-Gtk-widgets.c:591 driver/demo-Gtk.c:2151
 #: driver/xscreensaver-demo.glade.h:63
 msgid "Screen Saver"
 msgstr "Protecção de Ecrã"
 #: driver/xscreensaver-demo.glade.h:63
 msgid "Screen Saver"
 msgstr "Protecção de Ecrã"
@@ -450,7 +450,7 @@ msgid "Visual:"
 msgstr "Visual:"
 
 #: driver/demo-Gtk-widgets.c:1550 driver/demo-Gtk-widgets.c:1573
 msgstr "Visual:"
 
 #: driver/demo-Gtk-widgets.c:1550 driver/demo-Gtk-widgets.c:1573
-#: driver/demo-Gtk.c:1538 driver/demo-Gtk.c:2864
+#: driver/demo-Gtk.c:1545 driver/demo-Gtk.c:2871
 #: driver/xscreensaver-demo.glade.h:5 driver/xscreensaver-demo.glade2.h:3
 msgid "Any"
 msgstr "Qualquer"
 #: driver/xscreensaver-demo.glade.h:5 driver/xscreensaver-demo.glade2.h:3
 msgid "Any"
 msgstr "Qualquer"
@@ -551,7 +551,7 @@ msgstr "Standard <<"
 msgid "Back to the graphical configuration options."
 msgstr "Regressar às opções de configuração gráfica."
 
 msgid "Back to the graphical configuration options."
 msgstr "Regressar às opções de configuração gráfica."
 
-#: driver/demo-Gtk-widgets.c:1709 driver/demo-Gtk.c:741
+#: driver/demo-Gtk-widgets.c:1709 driver/demo-Gtk.c:748
 #: driver/xscreensaver-demo.glade.h:54
 msgid "OK"
 msgstr "OK"
 #: driver/xscreensaver-demo.glade.h:54
 msgid "OK"
 msgstr "OK"
@@ -560,11 +560,11 @@ msgstr "OK"
 msgid "Cancel"
 msgstr "Cancelar"
 
 msgid "Cancel"
 msgstr "Cancelar"
 
-#: driver/demo-Gtk.c:649
+#: driver/demo-Gtk.c:656
 msgid "For updates, check http://www.jwz.org/xscreensaver/"
 msgstr "Para actualizações, consulte http://www.jwz.org/xscreensaver/"
 
 msgid "For updates, check http://www.jwz.org/xscreensaver/"
 msgstr "Para actualizações, consulte http://www.jwz.org/xscreensaver/"
 
-#: driver/demo-Gtk.c:779
+#: driver/demo-Gtk.c:786
 msgid ""
 "Error:\n"
 "\n"
 msgid ""
 "Error:\n"
 "\n"
@@ -574,7 +574,7 @@ msgstr ""
 "\n"
 "Não foi especificado nenhum URL de ajuda.\n"
 
 "\n"
 "Não foi especificado nenhum URL de ajuda.\n"
 
-#: driver/demo-Gtk.c:865
+#: driver/demo-Gtk.c:872
 msgid ""
 "Error:\n"
 "\n"
 msgid ""
 "Error:\n"
 "\n"
@@ -586,7 +586,7 @@ msgstr ""
 "O deamon de protecção de ecrã não arrancou apropriadamente.\n"
 "\n"
 
 "O deamon de protecção de ecrã não arrancou apropriadamente.\n"
 "\n"
 
-#: driver/demo-Gtk.c:877
+#: driver/demo-Gtk.c:884
 msgid ""
 "You are running as root.  This usually means that xscreensaver\n"
 "was unable to contact your X server because access control is\n"
 msgid ""
 "You are running as root.  This usually means that xscreensaver\n"
 "was unable to contact your X server because access control is\n"
@@ -620,11 +620,11 @@ msgstr ""
 "Não deverá executar o X como root. Deverá iniciar uma sessão como\n"
 "utilizador normal, e executar o `su' quando necessário."
 
 "Não deverá executar o X como root. Deverá iniciar uma sessão como\n"
 "utilizador normal, e executar o `su' quando necessário."
 
-#: driver/demo-Gtk.c:893
+#: driver/demo-Gtk.c:900
 msgid "Please check your $PATH and permissions."
 msgstr "Verifique o seu $PATH e permissões."
 
 msgid "Please check your $PATH and permissions."
 msgstr "Verifique o seu $PATH e permissões."
 
-#: driver/demo-Gtk.c:928
+#: driver/demo-Gtk.c:935
 msgid ""
 "Error:\n"
 "\n"
 msgid ""
 "Error:\n"
 "\n"
@@ -634,7 +634,7 @@ msgstr ""
 "\n"
 "Incapaz de determinar nome do ficheiro init!\n"
 
 "\n"
 "Incapaz de determinar nome do ficheiro init!\n"
 
-#: driver/demo-Gtk.c:933
+#: driver/demo-Gtk.c:940
 #, c-format
 msgid ""
 "Error:\n"
 #, c-format
 msgid ""
 "Error:\n"
@@ -645,7 +645,7 @@ msgstr ""
 "\n"
 "Incapaz de escrever %s\n"
 
 "\n"
 "Incapaz de escrever %s\n"
 
-#: driver/demo-Gtk.c:992
+#: driver/demo-Gtk.c:999
 msgid ""
 "Error:\n"
 "\n"
 msgid ""
 "Error:\n"
 "\n"
@@ -655,7 +655,7 @@ msgstr ""
 "\n"
 "nenhum conjunto de recursos `manualCommand'."
 
 "\n"
 "nenhum conjunto de recursos `manualCommand'."
 
-#: driver/demo-Gtk.c:1173
+#: driver/demo-Gtk.c:1180
 #, c-format
 msgid ""
 "Error:\n"
 #, c-format
 msgid ""
 "Error:\n"
@@ -666,7 +666,7 @@ msgstr ""
 "\n"
 "Formato de hora imparseável: \"%s\"\n"
 
 "\n"
 "Formato de hora imparseável: \"%s\"\n"
 
-#: driver/demo-Gtk.c:1829
+#: driver/demo-Gtk.c:1836
 #, c-format
 msgid ""
 "Error:\n"
 #, c-format
 msgid ""
 "Error:\n"
@@ -677,28 +677,28 @@ msgstr ""
 "\n"
 "Directório não existe: \"%s\"\n"
 
 "\n"
 "Directório não existe: \"%s\"\n"
 
-#: driver/demo-Gtk.c:2546
+#: driver/demo-Gtk.c:2553
 msgid "Descriptions not available: no XML support compiled in."
 msgstr "Descrições indisponíveis: nenhum suporte XML compilado."
 
 msgid "Descriptions not available: no XML support compiled in."
 msgstr "Descrições indisponíveis: nenhum suporte XML compilado."
 
-#: driver/demo-Gtk.c:2551
+#: driver/demo-Gtk.c:2558
 msgid "No description available."
 msgstr "Nenhuma descrição disponível"
 
 msgid "No description available."
 msgstr "Nenhuma descrição disponível"
 
-#: driver/demo-Gtk.c:2816
+#: driver/demo-Gtk.c:2823
 msgid "Blank Screen"
 msgstr "Ecrã Preto"
 
 msgid "Blank Screen"
 msgstr "Ecrã Preto"
 
-#: driver/demo-Gtk.c:2822
+#: driver/demo-Gtk.c:2829
 msgid "Screen Saver Disabled"
 msgstr "Protecção de Ecrã Desactiva"
 
 msgid "Screen Saver Disabled"
 msgstr "Protecção de Ecrã Desactiva"
 
-#: driver/demo-Gtk.c:2855
+#: driver/demo-Gtk.c:2862
 #, c-format
 msgid "%s: %.100s Settings"
 msgstr ""
 
 #, c-format
 msgid "%s: %.100s Settings"
 msgstr ""
 
-#: driver/demo-Gtk.c:3010
+#: driver/demo-Gtk.c:3017
 #, c-format
 msgid ""
 "Warning:\n"
 #, c-format
 msgid ""
 "Warning:\n"
@@ -709,23 +709,23 @@ msgstr ""
 "\n"
 "ficheiro \"%s\" foi modificado, a reler.\n"
 
 "\n"
 "ficheiro \"%s\" foi modificado, a reler.\n"
 
-#: driver/demo-Gtk.c:3092
+#: driver/demo-Gtk.c:3099
 msgid "No Preview"
 msgstr "sem Previsão"
 
 msgid "No Preview"
 msgstr "sem Previsão"
 
-#: driver/demo-Gtk.c:3092
+#: driver/demo-Gtk.c:3099
 msgid "Available"
 msgstr "Disponível"
 
 msgid "Available"
 msgstr "Disponível"
 
-#: driver/demo-Gtk.c:3093
+#: driver/demo-Gtk.c:3100
 msgid "Not"
 msgstr ""
 
 msgid "Not"
 msgstr ""
 
-#: driver/demo-Gtk.c:3093
+#: driver/demo-Gtk.c:3100
 msgid "Installed"
 msgstr ""
 
 msgid "Installed"
 msgstr ""
 
-#: driver/demo-Gtk.c:3858
+#: driver/demo-Gtk.c:3865
 #, c-format
 msgid ""
 "Warning:\n"
 #, c-format
 msgid ""
 "Warning:\n"
@@ -738,7 +738,7 @@ msgstr ""
 "Parece que o deamon do XScreenSaver não está em\n"
 "execução no ecrã \"%s\". Lança-lo agora?"
 
 "Parece que o deamon do XScreenSaver não está em\n"
 "execução no ecrã \"%s\". Lança-lo agora?"
 
-#: driver/demo-Gtk.c:3868
+#: driver/demo-Gtk.c:3875
 #, c-format
 msgid ""
 "Warning:\n"
 #, c-format
 msgid ""
 "Warning:\n"
@@ -771,7 +771,7 @@ msgstr ""
 "\n"
 "Reiniciar o deamon do screensaver agora?\n"
 
 "\n"
 "Reiniciar o deamon do screensaver agora?\n"
 
-#: driver/demo-Gtk.c:3893
+#: driver/demo-Gtk.c:3900
 #, c-format
 msgid ""
 "Warning:\n"
 #, c-format
 msgid ""
 "Warning:\n"
@@ -798,7 +798,7 @@ msgstr ""
 "\n"
 "Reiniciar agora o deamon em \"%s\" como \"%s\"?\n"
 
 "\n"
 "Reiniciar agora o deamon em \"%s\" como \"%s\"?\n"
 
-#: driver/demo-Gtk.c:3915
+#: driver/demo-Gtk.c:3922
 #, c-format
 msgid ""
 "Warning:\n"
 #, c-format
 msgid ""
 "Warning:\n"
@@ -817,12 +817,12 @@ msgstr ""
 "\n"
 "Reiniciar agora o deamon do xscreensaver?\n"
 
 "\n"
 "Reiniciar agora o deamon do xscreensaver?\n"
 
-#: driver/demo-Gtk.c:4372
+#: driver/demo-Gtk.c:4379
 #, c-format
 msgid "%s: unknown option: %s\n"
 msgstr "%s: opção desconhecida: %s\n"
 
 #, c-format
 msgid "%s: unknown option: %s\n"
 msgstr "%s: opção desconhecida: %s\n"
 
-#: driver/demo-Gtk.c:4436
+#: driver/demo-Gtk.c:4443
 #, fuzzy
 msgid "Screensaver Preferences"
 msgstr "Protecção Ecrã"
 #, fuzzy
 msgid "Screensaver Preferences"
 msgstr "Protecção Ecrã"
@@ -1072,22 +1072,23 @@ msgstr ""
 #: 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/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:5 hacks/config/flyingtoasters.xml.h:5
-#: hacks/config/fontglide.xml.h:4 hacks/config/forest.xml.h:1
-#: hacks/config/fuzzyflakes.xml.h:7 hacks/config/galaxy.xml.h:3
-#: hacks/config/gears.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:6
-#: 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/fadeplot.xml.h:4 hacks/config/fireworkx.xml.h:3
+#: 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:2 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/fuzzyflakes.xml.h:7
+#: hacks/config/galaxy.xml.h:3 hacks/config/gears.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:6 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/intermomentary.xml.h:1 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/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
@@ -1105,23 +1106,24 @@ msgstr ""
 #: hacks/config/pacman.xml.h:1 hacks/config/penetrate.xml.h:3
 #: hacks/config/penrose.xml.h:6 hacks/config/petri.xml.h:5
 #: hacks/config/phosphor.xml.h:4 hacks/config/piecewise.xml.h:4
 #: hacks/config/pacman.xml.h:1 hacks/config/penetrate.xml.h:3
 #: hacks/config/penrose.xml.h:6 hacks/config/petri.xml.h:5
 #: hacks/config/phosphor.xml.h:4 hacks/config/piecewise.xml.h:4
-#: hacks/config/pipes.xml.h:5 hacks/config/polyhedra.xml.h:18
-#: hacks/config/polyominoes.xml.h:2 hacks/config/polytopes.xml.h:11
-#: hacks/config/pong.xml.h:1 hacks/config/popsquares.xml.h:3
-#: hacks/config/providence.xml.h:2 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 hacks/config/rocks.xml.h:4
-#: hacks/config/rotor.xml.h:3 hacks/config/rubik.xml.h:3
-#: hacks/config/sballs.xml.h:4 hacks/config/shadebobs.xml.h:3
-#: hacks/config/sierpinski.xml.h:2 hacks/config/sierpinski3d.xml.h:2
-#: hacks/config/slidescreen.xml.h:2 hacks/config/slip.xml.h:2
-#: hacks/config/speedmine.xml.h:3 hacks/config/sphere.xml.h:2
-#: hacks/config/spheremonics.xml.h:5 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:1 hacks/config/superquadrics.xml.h:4
+#: hacks/config/pinion.xml.h:5 hacks/config/pipes.xml.h:5
+#: hacks/config/polyhedra.xml.h:18 hacks/config/polyominoes.xml.h:2
+#: hacks/config/polytopes.xml.h:11 hacks/config/pong.xml.h:1
+#: hacks/config/popsquares.xml.h:3 hacks/config/providence.xml.h:2
+#: 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
+#: hacks/config/rocks.xml.h:4 hacks/config/rotor.xml.h:3
+#: hacks/config/rubik.xml.h:3 hacks/config/sballs.xml.h:4
+#: hacks/config/shadebobs.xml.h:3 hacks/config/sierpinski.xml.h:2
+#: hacks/config/sierpinski3d.xml.h:2 hacks/config/slidescreen.xml.h:2
+#: hacks/config/slip.xml.h:2 hacks/config/speedmine.xml.h:3
+#: hacks/config/sphere.xml.h:2 hacks/config/spheremonics.xml.h:5
+#: 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:1
+#: hacks/config/substrate.xml.h:2 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/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
@@ -1143,8 +1145,9 @@ msgstr "R
 #: hacks/config/fuzzyflakes.xml.h:8 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/fuzzyflakes.xml.h:8 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/wormhole.xml.h:3 hacks/config/xfishtank.xml.h:4
+#: hacks/config/substrate.xml.h:3 hacks/config/thornbird.xml.h:3
+#: hacks/config/whirlwindwarp.xml.h:1 hacks/config/wormhole.xml.h:3
+#: hacks/config/xfishtank.xml.h:4
 msgid "Few"
 msgstr "Poucos"
 
 msgid "Few"
 msgstr "Poucos"
 
@@ -1160,7 +1163,7 @@ msgstr "Poucos"
 #: hacks/config/epicycle.xml.h:8 hacks/config/eruption.xml.h:12
 #: hacks/config/euler2d.xml.h:8 hacks/config/fadeplot.xml.h:6
 #: hacks/config/flag.xml.h:5 hacks/config/flame.xml.h:11
 #: hacks/config/epicycle.xml.h:8 hacks/config/eruption.xml.h:12
 #: hacks/config/euler2d.xml.h:8 hacks/config/fadeplot.xml.h:6
 #: hacks/config/flag.xml.h:5 hacks/config/flame.xml.h:11
-#: hacks/config/flow.xml.h:8 hacks/config/fluidballs.xml.h:13
+#: hacks/config/flow.xml.h:7 hacks/config/fluidballs.xml.h:13
 #: hacks/config/forest.xml.h:3 hacks/config/fuzzyflakes.xml.h:12
 #: 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/forest.xml.h:3 hacks/config/fuzzyflakes.xml.h:12
 #: hacks/config/galaxy.xml.h:6 hacks/config/grav.xml.h:4
 #: hacks/config/halo.xml.h:4 hacks/config/hopalong.xml.h:15
@@ -1198,7 +1201,7 @@ msgstr "Muito"
 #: 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/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/flow.xml.h:8 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/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
@@ -1252,22 +1255,23 @@ msgstr ""
 #: 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/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/flyingtoasters.xml.h:11
-#: hacks/config/fontglide.xml.h:13 hacks/config/forest.xml.h:5
-#: hacks/config/fuzzyflakes.xml.h:15 hacks/config/galaxy.xml.h:10
-#: hacks/config/gears.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:8 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:10 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/fadeplot.xml.h:8 hacks/config/fireworkx.xml.h:9
+#: 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:10 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/fuzzyflakes.xml.h:15
+#: hacks/config/galaxy.xml.h:11 hacks/config/gears.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:8
+#: 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:10
+#: 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/intermomentary.xml.h:4 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/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
@@ -1285,23 +1289,24 @@ msgstr ""
 #: hacks/config/pacman.xml.h:5 hacks/config/penetrate.xml.h:6
 #: hacks/config/penrose.xml.h:11 hacks/config/petri.xml.h:23
 #: hacks/config/phosphor.xml.h:7 hacks/config/piecewise.xml.h:9
 #: hacks/config/pacman.xml.h:5 hacks/config/penetrate.xml.h:6
 #: hacks/config/penrose.xml.h:11 hacks/config/petri.xml.h:23
 #: hacks/config/phosphor.xml.h:7 hacks/config/piecewise.xml.h:9
-#: hacks/config/pipes.xml.h:15 hacks/config/polyhedra.xml.h:119
-#: hacks/config/polyominoes.xml.h:10 hacks/config/polytopes.xml.h:20
-#: hacks/config/pong.xml.h:4 hacks/config/popsquares.xml.h:5
-#: hacks/config/providence.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 hacks/config/rocks.xml.h:9
-#: hacks/config/rotor.xml.h:11 hacks/config/rubik.xml.h:9
-#: hacks/config/sballs.xml.h:13 hacks/config/shadebobs.xml.h:9
-#: hacks/config/sierpinski.xml.h:7 hacks/config/sierpinski3d.xml.h:8
-#: hacks/config/slidescreen.xml.h:6 hacks/config/slip.xml.h:7
-#: hacks/config/speedmine.xml.h:13 hacks/config/sphere.xml.h:5
-#: hacks/config/spheremonics.xml.h:19 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:4 hacks/config/superquadrics.xml.h:8
+#: hacks/config/pinion.xml.h:13 hacks/config/pipes.xml.h:15
+#: hacks/config/polyhedra.xml.h:119 hacks/config/polyominoes.xml.h:10
+#: hacks/config/polytopes.xml.h:20 hacks/config/pong.xml.h:4
+#: hacks/config/popsquares.xml.h:5 hacks/config/providence.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
+#: hacks/config/rocks.xml.h:9 hacks/config/rotor.xml.h:11
+#: hacks/config/rubik.xml.h:9 hacks/config/sballs.xml.h:13
+#: hacks/config/shadebobs.xml.h:9 hacks/config/sierpinski.xml.h:7
+#: hacks/config/sierpinski3d.xml.h:8 hacks/config/slidescreen.xml.h:6
+#: hacks/config/slip.xml.h:7 hacks/config/speedmine.xml.h:13
+#: hacks/config/sphere.xml.h:5 hacks/config/spheremonics.xml.h:19
+#: 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:4
+#: hacks/config/substrate.xml.h:10 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/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
@@ -1334,17 +1339,18 @@ msgstr "Devagar"
 #: hacks/config/engine.xml.h:16 hacks/config/epicycle.xml.h:11
 #: 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/engine.xml.h:16 hacks/config/epicycle.xml.h:11
 #: 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/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/fuzzyflakes.xml.h:17
-#: hacks/config/galaxy.xml.h:11 hacks/config/glblur.xml.h:17
-#: hacks/config/glforestfire.xml.h:15 hacks/config/glplanet.xml.h:10
-#: 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:11 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/fireworkx.xml.h:11 hacks/config/flag.xml.h:9
+#: hacks/config/flame.xml.h:15 hacks/config/flipflop.xml.h:7
+#: hacks/config/flipscreen3d.xml.h:7 hacks/config/flow.xml.h:12
+#: hacks/config/fluidballs.xml.h:20 hacks/config/forest.xml.h:6
+#: hacks/config/fuzzyflakes.xml.h:17 hacks/config/galaxy.xml.h:12
+#: hacks/config/glblur.xml.h:17 hacks/config/glforestfire.xml.h:15
+#: hacks/config/glplanet.xml.h:10 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:11
+#: 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/intermomentary.xml.h:5 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/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
@@ -1373,16 +1379,16 @@ msgstr "Devagar"
 #: 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/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/xplanet.xml.h:60 hacks/config/xrayswarm.xml.h:4
-#: hacks/config/zoom.xml.h:7
+#: hacks/config/strange.xml.h:5 hacks/config/substrate.xml.h:11
+#: 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/xplanet.xml.h:60
+#: hacks/config/xrayswarm.xml.h:4 hacks/config/zoom.xml.h:7
 msgid "Speed"
 msgstr "Velocidade"
 
 msgid "Speed"
 msgstr "Velocidade"
 
@@ -1425,8 +1431,8 @@ msgstr ""
 #: hacks/config/discrete.xml.h:11 hacks/config/drift.xml.h:14
 #: hacks/config/epicycle.xml.h:13 hacks/config/euler2d.xml.h:17
 #: hacks/config/fadeplot.xml.h:12 hacks/config/flag.xml.h:13
 #: hacks/config/discrete.xml.h:11 hacks/config/drift.xml.h:14
 #: hacks/config/epicycle.xml.h:13 hacks/config/euler2d.xml.h:17
 #: hacks/config/fadeplot.xml.h:12 hacks/config/flag.xml.h:13
-#: hacks/config/flame.xml.h:16 hacks/config/flow.xml.h:18
-#: hacks/config/forest.xml.h:8 hacks/config/galaxy.xml.h:13
+#: hacks/config/flame.xml.h:16 hacks/config/flow.xml.h:15
+#: hacks/config/forest.xml.h:8 hacks/config/galaxy.xml.h:14
 #: hacks/config/grav.xml.h:11 hacks/config/halo.xml.h:13
 #: hacks/config/hopalong.xml.h:25 hacks/config/ifs.xml.h:8
 #: hacks/config/imsmap.xml.h:15 hacks/config/interference.xml.h:19
 #: hacks/config/grav.xml.h:11 hacks/config/halo.xml.h:13
 #: hacks/config/hopalong.xml.h:25 hacks/config/ifs.xml.h:8
 #: hacks/config/imsmap.xml.h:15 hacks/config/interference.xml.h:19
@@ -1531,7 +1537,7 @@ msgstr "C
 #: 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/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/flag.xml.h:4 hacks/config/flow.xml.h:4
 #: hacks/config/fluidballs.xml.h:12 hacks/config/fuzzyflakes.xml.h:10
 #: 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/fluidballs.xml.h:12 hacks/config/fuzzyflakes.xml.h:10
 #: hacks/config/gleidescope.xml.h:7 hacks/config/halftone.xml.h:8
 #: hacks/config/hopalong.xml.h:13 hacks/config/interference.xml.h:11
@@ -1563,7 +1569,7 @@ msgstr "C
 #: 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/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/flag.xml.h:8 hacks/config/flow.xml.h:11
 #: hacks/config/fluidballs.xml.h:19 hacks/config/fuzzyflakes.xml.h:16
 #: 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/fluidballs.xml.h:19 hacks/config/fuzzyflakes.xml.h:16
 #: hacks/config/gleidescope.xml.h:12 hacks/config/halftone.xml.h:14
 #: hacks/config/hopalong.xml.h:22 hacks/config/interference.xml.h:18
@@ -1582,7 +1588,7 @@ msgstr "C
 
 #: 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/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/flag.xml.h:12 hacks/config/flow.xml.h:14
 #: hacks/config/lissie.xml.h:12 hacks/config/loop.xml.h:11
 #: hacks/config/rubik.xml.h:12 hacks/config/sierpinski.xml.h:11
 #: hacks/config/slip.xml.h:11
 #: hacks/config/lissie.xml.h:12 hacks/config/loop.xml.h:11
 #: hacks/config/rubik.xml.h:12 hacks/config/sierpinski.xml.h:11
 #: hacks/config/slip.xml.h:11
@@ -1633,13 +1639,14 @@ msgstr ""
 #: hacks/config/menger.xml.h:15 hacks/config/mirrorblob.xml.h:18
 #: hacks/config/moebius.xml.h:6 hacks/config/molecule.xml.h:21
 #: hacks/config/morph3d.xml.h:5 hacks/config/noof.xml.h:4
 #: hacks/config/menger.xml.h:15 hacks/config/mirrorblob.xml.h:18
 #: hacks/config/moebius.xml.h:6 hacks/config/molecule.xml.h:21
 #: hacks/config/morph3d.xml.h:5 hacks/config/noof.xml.h:4
-#: hacks/config/pipes.xml.h:14 hacks/config/polyhedra.xml.h:118
-#: hacks/config/polytopes.xml.h:18 hacks/config/providence.xml.h:4
-#: 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
+#: hacks/config/pinion.xml.h:12 hacks/config/pipes.xml.h:14
+#: hacks/config/polyhedra.xml.h:118 hacks/config/polytopes.xml.h:18
+#: hacks/config/providence.xml.h:4 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 "Mostrar Frames-por-Segundo"
 
 msgid "Show Frames-per-Second"
 msgstr "Mostrar Frames-por-Segundo"
 
@@ -1806,11 +1813,12 @@ msgstr "Velocidade Baleia"
 #: hacks/config/lament.xml.h:9 hacks/config/lavalite.xml.h:32
 #: hacks/config/menger.xml.h:21 hacks/config/mirrorblob.xml.h:24
 #: hacks/config/moebius.xml.h:11 hacks/config/molecule.xml.h:26
 #: hacks/config/lament.xml.h:9 hacks/config/lavalite.xml.h:32
 #: hacks/config/menger.xml.h:21 hacks/config/mirrorblob.xml.h:24
 #: hacks/config/moebius.xml.h:11 hacks/config/molecule.xml.h:26
-#: hacks/config/polyhedra.xml.h:173 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
+#: hacks/config/pinion.xml.h:15 hacks/config/polyhedra.xml.h:173
+#: 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 "Delimitação"
 
 msgid "Wireframe"
 msgstr "Delimitação"
 
@@ -1908,14 +1916,15 @@ msgstr "Linhas"
 #: 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/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/mismunch.xml.h:3
-#: 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 hacks/config/spheremonics.xml.h:7
+#: hacks/config/flow.xml.h:6 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/mismunch.xml.h:3 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
+#: hacks/config/spheremonics.xml.h:7 hacks/config/substrate.xml.h:6
 #: hacks/config/wander.xml.h:10 hacks/config/whirlwindwarp.xml.h:3
 msgid "Long"
 msgstr "Longo"
 #: hacks/config/wander.xml.h:10 hacks/config/whirlwindwarp.xml.h:3
 msgid "Long"
 msgstr "Longo"
@@ -1962,13 +1971,14 @@ msgstr "Margem de Repulsa"
 #: 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/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/metaballs.xml.h:12 hacks/config/mismunch.xml.h:8
-#: 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/flow.xml.h:9 hacks/config/galaxy.xml.h:9
+#: hacks/config/klein.xml.h:5 hacks/config/laser.xml.h:9
+#: hacks/config/menger.xml.h:14 hacks/config/metaballs.xml.h:12
+#: hacks/config/mismunch.xml.h:8 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/substrate.xml.h:9
 #: hacks/config/wander.xml.h:12 hacks/config/whirlwindwarp.xml.h:6
 msgid "Short"
 msgstr "Pequena"
 #: hacks/config/wander.xml.h:12 hacks/config/whirlwindwarp.xml.h:6
 msgid "Short"
 msgstr "Pequena"
@@ -2191,10 +2201,10 @@ msgstr ""
 #: 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/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/polyhedra.xml.h:3 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/wormhole.xml.h:1
-#: hacks/config/xfishtank.xml.h:1
+#: hacks/config/pinion.xml.h:3 hacks/config/polyhedra.xml.h:3
+#: 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/wormhole.xml.h:1 hacks/config/xfishtank.xml.h:1
 msgid "Animation Speed"
 msgstr "Velocidade Animação"
 
 msgid "Animation Speed"
 msgstr "Velocidade Animação"
 
@@ -2278,8 +2288,9 @@ msgstr ""
 #: 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/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/starfish.xml.h:2 hacks/config/substrate.xml.h:1
+#: hacks/config/vidwhacker.xml.h:3 hacks/config/wander.xml.h:7
+#: hacks/config/xspirograph.xml.h:3
 msgid "Duration"
 msgstr "Duração"
 
 msgid "Duration"
 msgstr "Duração"
 
@@ -2547,7 +2558,7 @@ msgstr "Partes"
 msgid "Rotate"
 msgstr "Rodar"
 
 msgid "Rotate"
 msgstr "Rodar"
 
-#: hacks/config/circuit.xml.h:8
+#: hacks/config/circuit.xml.h:8 hacks/config/pinion.xml.h:10
 msgid "Rotation Speed"
 msgstr "Velocidade Rotação"
 
 msgid "Rotation Speed"
 msgstr "Velocidade Rotação"
 
@@ -2635,11 +2646,12 @@ msgstr "1 Segundo"
 msgid "Coral"
 msgstr "Coral"
 
 msgid "Coral"
 msgstr "Coral"
 
-#: hacks/config/coral.xml.h:4 hacks/config/gflux.xml.h:3
-#: hacks/config/glblur.xml.h:2 hacks/config/glmatrix.xml.h:3
-#: 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
+#: hacks/config/coral.xml.h:4 hacks/config/fireworkx.xml.h:2
+#: hacks/config/gflux.xml.h:3 hacks/config/glblur.xml.h:2
+#: hacks/config/glmatrix.xml.h:3 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
 msgid "Dense"
 msgstr "Denso"
 
 msgid "Dense"
 msgstr "Denso"
 
@@ -2655,12 +2667,12 @@ msgstr ""
 "Simula crescimento de corais, se bem que algo lentamente. Esta imagem não "
 "lhe faz justiça. Escrito por Frederick Roeber."
 
 "Simula crescimento de corais, se bem que algo lentamente. Esta imagem não "
 "lhe faz justiça. Escrito por 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
-#: hacks/config/imsmap.xml.h:13 hacks/config/lavalite.xml.h:29
-#: hacks/config/pyro.xml.h:14 hacks/config/qix.xml.h:21
-#: hacks/config/squiral.xml.h:15 hacks/config/xearth.xml.h:24
-#: hacks/config/xmatrix.xml.h:17
+#: hacks/config/coral.xml.h:13 hacks/config/fireworkx.xml.h:10
+#: hacks/config/gflux.xml.h:13 hacks/config/glblur.xml.h:16
+#: hacks/config/glmatrix.xml.h:19 hacks/config/imsmap.xml.h:13
+#: hacks/config/lavalite.xml.h:29 hacks/config/pyro.xml.h:14
+#: hacks/config/qix.xml.h:21 hacks/config/squiral.xml.h:15
+#: hacks/config/xearth.xml.h:24 hacks/config/xmatrix.xml.h:17
 msgid "Sparse"
 msgstr "Escasso"
 
 msgid "Sparse"
 msgstr "Escasso"
 
@@ -2695,7 +2707,7 @@ msgid "Center on Screen"
 msgstr "Centrar no Ecrã"
 
 #: hacks/config/crystal.xml.h:2 hacks/config/deluxe.xml.h:1
 msgstr "Centrar no Ecrã"
 
 #: hacks/config/crystal.xml.h:2 hacks/config/deluxe.xml.h:1
-#: hacks/config/fadeplot.xml.h:1 hacks/config/flow.xml.h:3
+#: hacks/config/fadeplot.xml.h:1 hacks/config/flow.xml.h:1
 #: hacks/config/galaxy.xml.h:1 hacks/config/glforestfire.xml.h:1
 #: hacks/config/grav.xml.h:1 hacks/config/julia.xml.h:1
 #: hacks/config/laser.xml.h:1 hacks/config/lisa.xml.h:1
 #: hacks/config/galaxy.xml.h:1 hacks/config/glforestfire.xml.h:1
 #: hacks/config/grav.xml.h:1 hacks/config/julia.xml.h:1
 #: hacks/config/laser.xml.h:1 hacks/config/lisa.xml.h:1
@@ -3520,7 +3532,7 @@ msgstr "Permitir Atrac
 msgid "Half"
 msgstr "Halo"
 
 msgid "Half"
 msgstr "Halo"
 
-#: hacks/config/fireflies.xml.h:17
+#: hacks/config/fireflies.xml.h:17 hacks/config/pinion.xml.h:7
 #, fuzzy
 msgid "Huge"
 msgstr "Fogo Enorme"
 #, fuzzy
 msgid "Huge"
 msgstr "Fogo Enorme"
@@ -3617,7 +3629,7 @@ msgstr ""
 msgid "Swarm tails glow"
 msgstr ""
 
 msgid "Swarm tails glow"
 msgstr ""
 
-#: hacks/config/fireflies.xml.h:43
+#: hacks/config/fireflies.xml.h:43 hacks/config/pinion.xml.h:14
 #, fuzzy
 msgid "Tiny"
 msgstr "Fino"
 #, fuzzy
 msgid "Tiny"
 msgstr "Fino"
@@ -3636,6 +3648,33 @@ msgstr "Windows"
 msgid "Wind picks up"
 msgstr ""
 
 msgid "Wind picks up"
 msgstr ""
 
+#: hacks/config/fireworkx.xml.h:1 hacks/config/lavalite.xml.h:3
+msgid "Activity"
+msgstr ""
+
+#: hacks/config/fireworkx.xml.h:4
+msgid "Fast Fade (more realistic)"
+msgstr ""
+
+#: hacks/config/fireworkx.xml.h:5
+#, fuzzy
+msgid "Fireworkx"
+msgstr "_Ficheiro"
+
+#: hacks/config/fireworkx.xml.h:6
+#, fuzzy
+msgid "Light effect"
+msgstr "Efeito Relâmpago"
+
+#: hacks/config/fireworkx.xml.h:7
+msgid "Pyrotechnics simulation eye-candy. Written by Rony B. Chandran."
+msgstr ""
+
+#: hacks/config/fireworkx.xml.h:8
+#, fuzzy
+msgid "Shoot"
+msgstr "Pequena"
+
 #: hacks/config/flag.xml.h:1
 msgid "Bitmap for Flag"
 msgstr "Bitmap para Bandeira"
 #: hacks/config/flag.xml.h:1
 msgid "Bitmap for Flag"
 msgstr "Bitmap para Bandeira"
@@ -3715,46 +3754,49 @@ msgid ""
 "around and deforms it in various ways. Written by Ben Buxton."
 msgstr ""
 
 "around and deforms it in various ways. Written by Ben Buxton."
 msgstr ""
 
-#: hacks/config/flow.xml.h:1
-msgid "Allow 2D Attractors"
-msgstr "Permitir Atracções 2D"
+#: hacks/config/flow.xml.h:3
+msgid "Flow"
+msgstr "Fluxo"
+
+#: hacks/config/flow.xml.h:5
+#, fuzzy
+msgid "Length of trails"
+msgstr "Deixar Rasto"
 
 
-#: hacks/config/flow.xml.h:2
+#: hacks/config/flow.xml.h:13
 #, fuzzy
 msgid ""
 #, fuzzy
 msgid ""
-"Another series of strange attractors: a flowing series of points, making "
-"strange rotational shapes. Written by Tim Auckland."
+"Strange attractors formed of flows in a 3D differential equation phase "
+"space. Written by Tim Auckland."
 msgstr ""
 "Outra série de atracções estranhas: uma série de fluxos de pontos, que "
 "formam estranhas formas rotativas. Escrito pelo Jeff Butterworth."
 
 msgstr ""
 "Outra série de atracções estranhas: uma série de fluxos de pontos, que "
 "formam estranhas formas rotativas. Escrito pelo Jeff Butterworth."
 
-#: hacks/config/flow.xml.h:5
-msgid "Flow"
-msgstr "Fluxo"
-
-#: hacks/config/flow.xml.h:6
-msgid "Freeze Some Bees"
-msgstr "Congelar Algumas Abelhas"
+#: hacks/config/flow.xml.h:16
+msgid "turn on/off bounding box."
+msgstr ""
 
 
-#: hacks/config/flow.xml.h:10
-msgid "Ride a Trained Bee"
-msgstr "Cavalgar Uma Abelha Treinada"
+#: hacks/config/flow.xml.h:17
+#, fuzzy
+msgid "turn on/off double buffering."
+msgstr "Buffer Duplo"
 
 
-#: hacks/config/flow.xml.h:11
-msgid "Rotate Around Attractor"
-msgstr "Rodar À Volta Atracção"
+#: hacks/config/flow.xml.h:18
+msgid "turn on/off periodic attractors."
+msgstr ""
 
 
-#: hacks/config/flow.xml.h:12
-msgid "Show Bounding Box"
-msgstr "Mostrar Caixa de Limites"
+#: hacks/config/flow.xml.h:19
+msgid "turn on/off ride in the flow."
+msgstr ""
 
 
-#: hacks/config/flow.xml.h:14
-msgid "Slow Bees with Antifreeze"
-msgstr "Tornar Abelhas Mais Lentas com AntiCongelamento"
+#: hacks/config/flow.xml.h:20
+#, fuzzy
+msgid "turn on/off rotating around attractor."
+msgstr "Rodar À Volta Atracção"
 
 
-#: hacks/config/flow.xml.h:19
-msgid "Zoom In and Out"
-msgstr "Aum e Dim Zoom"
+#: hacks/config/flow.xml.h:21
+msgid "turn on/off search for new attractors."
+msgstr ""
 
 #: hacks/config/fluidballs.xml.h:1
 msgid "      Freefall"
 
 #: hacks/config/fluidballs.xml.h:1
 msgid "      Freefall"
@@ -3980,7 +4022,12 @@ msgstr "Movimento Aleat
 msgid "Galaxy"
 msgstr "Galáxia"
 
 msgid "Galaxy"
 msgstr "Galáxia"
 
-#: hacks/config/galaxy.xml.h:9 hacks/config/lisa.xml.h:7
+#: hacks/config/galaxy.xml.h:8
+#, fuzzy
+msgid "Rotate Viewpoint"
+msgstr "Movimento Linear"
+
+#: hacks/config/galaxy.xml.h:10 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/pong.xml.h:3
 #: hacks/config/rotor.xml.h:10 hacks/config/rubik.xml.h:8
 #: hacks/config/lissie.xml.h:8 hacks/config/loop.xml.h:6
 #: hacks/config/penrose.xml.h:10 hacks/config/pong.xml.h:3
 #: hacks/config/rotor.xml.h:10 hacks/config/rubik.xml.h:8
@@ -3989,7 +4036,7 @@ msgstr "Gal
 msgid "Size"
 msgstr "Tamanho"
 
 msgid "Size"
 msgstr "Tamanho"
 
-#: hacks/config/galaxy.xml.h:12
+#: hacks/config/galaxy.xml.h:13
 msgid ""
 "This draws spinning galaxies, which then collide and scatter their stars to "
 "the, uh, four winds or something. Originally an Amiga program by Uli "
 msgid ""
 "This draws spinning galaxies, which then collide and scatter their stars to "
 "the, uh, four winds or something. Originally an Amiga program by Uli "
@@ -4322,9 +4369,9 @@ msgid ""
 "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 "
 "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."
+"of this window: the tab at the top of the *other* window.) 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
 msgstr ""
 
 #: hacks/config/glslideshow.xml.h:17
@@ -4920,6 +4967,27 @@ msgstr "N
 msgid "Wave Size"
 msgstr "Tamanho Onda"
 
 msgid "Wave Size"
 msgstr "Tamanho Onda"
 
+#: hacks/config/intermomentary.xml.h:2
+msgid "Intermomentary"
+msgstr ""
+
+#: hacks/config/intermomentary.xml.h:3
+#, fuzzy
+msgid "Number of Discs"
+msgstr "Número de Círculos"
+
+#: hacks/config/intermomentary.xml.h:6
+msgid ""
+"The Intersection Momentary is a fun visualization defining the relationships "
+"between objects with Casey Reas, William Ngan, and Robert Hodgin. "
+"Commissioned for display at the Whitney Museum of American Art. A surface "
+"filled with 100 medium to small sized circles. Each circle has a different "
+"size and direction, but moves at the same slow rate. Display: A. The "
+"instantaneous intersections of the circles. B. The aggregate intersections "
+"of the circles. Ported to XScreensaver from the art project \"InterMomentary"
+"\" at http://www.complexification.net"
+msgstr ""
+
 #: hacks/config/jigglypuff.xml.h:2
 msgid "Chrome"
 msgstr ""
 #: hacks/config/jigglypuff.xml.h:2
 msgid "Chrome"
 msgstr ""
@@ -5168,10 +5236,6 @@ msgstr ""
 msgid "10"
 msgstr "1"
 
 msgid "10"
 msgstr "1"
 
-#: hacks/config/lavalite.xml.h:3
-msgid "Activity"
-msgstr ""
-
 #: hacks/config/lavalite.xml.h:4
 msgid "Classic Lavalite"
 msgstr ""
 #: hacks/config/lavalite.xml.h:4
 msgid "Classic Lavalite"
 msgstr ""
@@ -5982,6 +6046,44 @@ msgid ""
 "invisibility at intersection points. Written by Geoffrey Irving."
 msgstr ""
 
 "invisibility at intersection points. Written by Geoffrey Irving."
 msgstr ""
 
+#: hacks/config/pinion.xml.h:1
+#, fuzzy
+msgid "100"
+msgstr "100%"
+
+#: hacks/config/pinion.xml.h:2
+msgid "2000"
+msgstr ""
+
+#: hacks/config/pinion.xml.h:4
+#, fuzzy
+msgid ""
+"Draws an interconnected set of gears moving across the screen. Written by "
+"Jamie Zawinski."
+msgstr ""
+"Desenha rectângulos aleatórios coloridos e às riscas. Escrito por Jamie "
+"Zawinski."
+
+#: hacks/config/pinion.xml.h:6
+#, fuzzy
+msgid "Gear Size"
+msgstr "Tamanho Grelha"
+
+#: hacks/config/pinion.xml.h:8
+#, fuzzy
+msgid "Max RPM"
+msgstr "Máx Aneis"
+
+#: hacks/config/pinion.xml.h:9
+#, fuzzy
+msgid "Pinion"
+msgstr "Empacotamento"
+
+#: hacks/config/pinion.xml.h:11
+#, fuzzy
+msgid "Scrolling Speed"
+msgstr "Velocidade Rolamento"
+
 #: hacks/config/pipes.xml.h:1
 msgid "Allow Tight Turns"
 msgstr "Permitir Curvas Apertadas"
 #: hacks/config/pipes.xml.h:1
 msgid "Allow Tight Turns"
 msgstr "Permitir Curvas Apertadas"
@@ -6010,7 +6112,8 @@ msgstr ""
 "Se já alguma vez esteve numa sala com uma máquina Windows NT, provavelmente "
 "viu esta rotina GL. Esta versão é de Marcelo Vianna."
 
 "Se já alguma vez esteve numa sala com uma máquina Windows NT, provavelmente "
 "viu esta rotina GL. Esta versão é de Marcelo Vianna."
 
-#: hacks/config/pipes.xml.h:9 hacks/config/wormhole.xml.h:4
+#: hacks/config/pipes.xml.h:9 hacks/config/substrate.xml.h:7
+#: hacks/config/wormhole.xml.h:4
 msgid "Lots"
 msgstr "Muitos"
 
 msgid "Lots"
 msgstr "Muitos"
 
@@ -7331,22 +7434,26 @@ msgid "Ping subnet/30 (2 hosts)"
 msgstr ""
 
 #: hacks/config/sonar.xml.h:10
 msgstr ""
 
 #: hacks/config/sonar.xml.h:10
+msgid "Resolve Host Names"
+msgstr ""
+
+#: hacks/config/sonar.xml.h:11
 msgid "Simulation Team Members"
 msgstr "Membros Equipas Simulação"
 
 msgid "Simulation Team Members"
 msgstr "Membros Equipas Simulação"
 
-#: hacks/config/sonar.xml.h:11
+#: hacks/config/sonar.xml.h:12
 msgid "Sonar"
 msgstr "Sonar"
 
 msgid "Sonar"
 msgstr "Sonar"
 
-#: hacks/config/sonar.xml.h:12
+#: hacks/config/sonar.xml.h:13
 msgid "Team A Name"
 msgstr "Nome Equipa A"
 
 msgid "Team A Name"
 msgstr "Nome Equipa A"
 
-#: hacks/config/sonar.xml.h:13
+#: hacks/config/sonar.xml.h:14
 msgid "Team B Name"
 msgstr "Nome Equipa B"
 
 msgid "Team B Name"
 msgstr "Nome Equipa B"
 
-#: hacks/config/sonar.xml.h:14
+#: hacks/config/sonar.xml.h:15
 #, fuzzy
 msgid ""
 "This program draws a simulation of a sonar screen. By default, it displays a "
 #, fuzzy
 msgid ""
 "This program draws a simulation of a sonar screen. By default, it displays a "
@@ -7362,7 +7469,7 @@ msgstr ""
 "monitorizar outras fontes de dados, também. (Processos? Ligações de rede "
 "activas? Utilização de CPU por utilizador?) Escrito por Stephen Martin."
 
 "monitorizar outras fontes de dados, também. (Processos? Ligações de rede "
 "activas? Utilização de CPU por utilizador?) Escrito por Stephen Martin."
 
-#: hacks/config/sonar.xml.h:15
+#: hacks/config/sonar.xml.h:16
 msgid "vs."
 msgstr "vs."
 
 msgid "vs."
 msgstr "vs."
 
@@ -7684,6 +7791,33 @@ msgstr ""
 "de pontos que se mexe e torce. O movimento é muito engraçado. Escrito por "
 "Massimino Pascal."
 
 "de pontos que se mexe e torce. O movimento é muito engraçado. Escrito por "
 "Massimino Pascal."
 
+#: hacks/config/substrate.xml.h:4
+#, fuzzy
+msgid "Initial Cracks"
+msgstr "Densidade Partículas"
+
+#: hacks/config/substrate.xml.h:5
+msgid ""
+"Lines like crystals grow on a computational substrate. A simple "
+"perpendicular growth rule creates intricate city-like structures. By J. "
+"Tarbell and Mike Kershaw."
+msgstr ""
+
+#: hacks/config/substrate.xml.h:8
+#, fuzzy
+msgid "Sandgrains"
+msgstr "Standard"
+
+#: hacks/config/substrate.xml.h:12
+#, fuzzy
+msgid "Substrate"
+msgstr "Estados"
+
+#: hacks/config/substrate.xml.h:13
+#, fuzzy
+msgid "Wireframe only"
+msgstr "Delimitação"
+
 #: hacks/config/superquadrics.xml.h:3
 msgid ""
 "Ed Mackey reports that he wrote the first version of this program in BASIC "
 #: hacks/config/superquadrics.xml.h:3
 msgid ""
 "Ed Mackey reports that he wrote the first version of this program in BASIC "
@@ -8940,6 +9074,24 @@ msgstr ""
 "resultado é como olhar através de várias lentes sobrepostas em vez de um "
 "simples zoom. Escrito por James Macnicol."
 
 "resultado é como olhar através de várias lentes sobrepostas em vez de um "
 "simples zoom. Escrito por James Macnicol."
 
+#~ msgid "Allow 2D Attractors"
+#~ msgstr "Permitir Atracções 2D"
+
+#~ msgid "Freeze Some Bees"
+#~ msgstr "Congelar Algumas Abelhas"
+
+#~ msgid "Ride a Trained Bee"
+#~ msgstr "Cavalgar Uma Abelha Treinada"
+
+#~ msgid "Show Bounding Box"
+#~ msgstr "Mostrar Caixa de Limites"
+
+#~ msgid "Slow Bees with Antifreeze"
+#~ msgstr "Tornar Abelhas Mais Lentas com AntiCongelamento"
+
+#~ msgid "Zoom In and Out"
+#~ msgstr "Aum e Dim Zoom"
+
 #~ msgid "Ping Subnet"
 #~ msgstr "Ping Subrede"
 
 #~ msgid "Ping Subnet"
 #~ msgstr "Ping Subrede"
 
index 664289513df1361447843a8aa00d7cc1b66e5656..abf4e2d493361b25aa6a94687f16546a65419195 100644 (file)
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2004-10-04 16:25+0200\n"
+"POT-Creation-Date: 2004-12-22 12:51+0100\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -147,7 +147,7 @@ msgstr ""
 msgid "minutes"
 msgstr ""
 
 msgid "minutes"
 msgstr ""
 
-#: driver/demo-Gtk-widgets.c:482 driver/demo-Gtk.c:2845
+#: driver/demo-Gtk-widgets.c:482 driver/demo-Gtk.c:2852
 #: driver/xscreensaver-demo.glade.h:58
 msgid "Preview"
 msgstr ""
 #: driver/xscreensaver-demo.glade.h:58
 msgid "Preview"
 msgstr ""
@@ -195,12 +195,12 @@ msgstr "Propriedades da proteo de tela"
 msgid "Random Screen Saver"
 msgstr "Propriedades da proteo de tela"
 
 msgid "Random Screen Saver"
 msgstr "Propriedades da proteo de tela"
 
-#: driver/demo-Gtk-widgets.c:571 driver/demo-Gtk.c:2134
+#: driver/demo-Gtk-widgets.c:571 driver/demo-Gtk.c:2141
 #: driver/xscreensaver-demo.glade.h:75
 msgid "Use"
 msgstr ""
 
 #: driver/xscreensaver-demo.glade.h:75
 msgid "Use"
 msgstr ""
 
-#: driver/demo-Gtk-widgets.c:591 driver/demo-Gtk.c:2144
+#: driver/demo-Gtk-widgets.c:591 driver/demo-Gtk.c:2151
 #: driver/xscreensaver-demo.glade.h:63
 #, fuzzy
 msgid "Screen Saver"
 #: driver/xscreensaver-demo.glade.h:63
 #, fuzzy
 msgid "Screen Saver"
@@ -431,7 +431,7 @@ msgid "Visual:"
 msgstr ""
 
 #: driver/demo-Gtk-widgets.c:1550 driver/demo-Gtk-widgets.c:1573
 msgstr ""
 
 #: driver/demo-Gtk-widgets.c:1550 driver/demo-Gtk-widgets.c:1573
-#: driver/demo-Gtk.c:1538 driver/demo-Gtk.c:2864
+#: driver/demo-Gtk.c:1545 driver/demo-Gtk.c:2871
 #: driver/xscreensaver-demo.glade.h:5 driver/xscreensaver-demo.glade2.h:3
 msgid "Any"
 msgstr ""
 #: driver/xscreensaver-demo.glade.h:5 driver/xscreensaver-demo.glade2.h:3
 msgid "Any"
 msgstr ""
@@ -530,7 +530,7 @@ msgstr ""
 msgid "Back to the graphical configuration options."
 msgstr ""
 
 msgid "Back to the graphical configuration options."
 msgstr ""
 
-#: driver/demo-Gtk-widgets.c:1709 driver/demo-Gtk.c:741
+#: driver/demo-Gtk-widgets.c:1709 driver/demo-Gtk.c:748
 #: driver/xscreensaver-demo.glade.h:54
 msgid "OK"
 msgstr ""
 #: driver/xscreensaver-demo.glade.h:54
 msgid "OK"
 msgstr ""
@@ -539,18 +539,18 @@ msgstr ""
 msgid "Cancel"
 msgstr ""
 
 msgid "Cancel"
 msgstr ""
 
-#: driver/demo-Gtk.c:649
+#: driver/demo-Gtk.c:656
 msgid "For updates, check http://www.jwz.org/xscreensaver/"
 msgstr ""
 
 msgid "For updates, check http://www.jwz.org/xscreensaver/"
 msgstr ""
 
-#: driver/demo-Gtk.c:779
+#: driver/demo-Gtk.c:786
 msgid ""
 "Error:\n"
 "\n"
 "No Help URL has been specified.\n"
 msgstr ""
 
 msgid ""
 "Error:\n"
 "\n"
 "No Help URL has been specified.\n"
 msgstr ""
 
-#: driver/demo-Gtk.c:865
+#: driver/demo-Gtk.c:872
 msgid ""
 "Error:\n"
 "\n"
 msgid ""
 "Error:\n"
 "\n"
@@ -558,7 +558,7 @@ msgid ""
 "\n"
 msgstr ""
 
 "\n"
 msgstr ""
 
-#: driver/demo-Gtk.c:877
+#: driver/demo-Gtk.c:884
 msgid ""
 "You are running as root.  This usually means that xscreensaver\n"
 "was unable to contact your X server because access control is\n"
 msgid ""
 "You are running as root.  This usually means that xscreensaver\n"
 "was unable to contact your X server because access control is\n"
@@ -577,18 +577,18 @@ msgid ""
 "normal user, and `su' as necessary."
 msgstr ""
 
 "normal user, and `su' as necessary."
 msgstr ""
 
-#: driver/demo-Gtk.c:893
+#: driver/demo-Gtk.c:900
 msgid "Please check your $PATH and permissions."
 msgstr ""
 
 msgid "Please check your $PATH and permissions."
 msgstr ""
 
-#: driver/demo-Gtk.c:928
+#: driver/demo-Gtk.c:935
 msgid ""
 "Error:\n"
 "\n"
 "Couldn't determine init file name!\n"
 msgstr ""
 
 msgid ""
 "Error:\n"
 "\n"
 "Couldn't determine init file name!\n"
 msgstr ""
 
-#: driver/demo-Gtk.c:933
+#: driver/demo-Gtk.c:940
 #, c-format
 msgid ""
 "Error:\n"
 #, c-format
 msgid ""
 "Error:\n"
@@ -596,14 +596,14 @@ msgid ""
 "Couldn't write %s\n"
 msgstr ""
 
 "Couldn't write %s\n"
 msgstr ""
 
-#: driver/demo-Gtk.c:992
+#: driver/demo-Gtk.c:999
 msgid ""
 "Error:\n"
 "\n"
 "no `manualCommand' resource set."
 msgstr ""
 
 msgid ""
 "Error:\n"
 "\n"
 "no `manualCommand' resource set."
 msgstr ""
 
-#: driver/demo-Gtk.c:1173
+#: driver/demo-Gtk.c:1180
 #, c-format
 msgid ""
 "Error:\n"
 #, c-format
 msgid ""
 "Error:\n"
@@ -611,7 +611,7 @@ msgid ""
 "Unparsable time format: \"%s\"\n"
 msgstr ""
 
 "Unparsable time format: \"%s\"\n"
 msgstr ""
 
-#: driver/demo-Gtk.c:1829
+#: driver/demo-Gtk.c:1836
 #, c-format
 msgid ""
 "Error:\n"
 #, c-format
 msgid ""
 "Error:\n"
@@ -619,29 +619,29 @@ msgid ""
 "Directory does not exist: \"%s\"\n"
 msgstr ""
 
 "Directory does not exist: \"%s\"\n"
 msgstr ""
 
-#: driver/demo-Gtk.c:2546
+#: driver/demo-Gtk.c:2553
 msgid "Descriptions not available: no XML support compiled in."
 msgstr ""
 
 msgid "Descriptions not available: no XML support compiled in."
 msgstr ""
 
-#: driver/demo-Gtk.c:2551
+#: driver/demo-Gtk.c:2558
 msgid "No description available."
 msgstr ""
 
 msgid "No description available."
 msgstr ""
 
-#: driver/demo-Gtk.c:2816
+#: driver/demo-Gtk.c:2823
 msgid "Blank Screen"
 msgstr ""
 
 msgid "Blank Screen"
 msgstr ""
 
-#: driver/demo-Gtk.c:2822
+#: driver/demo-Gtk.c:2829
 #, fuzzy
 msgid "Screen Saver Disabled"
 msgstr "Propriedades da proteo de tela"
 
 #, fuzzy
 msgid "Screen Saver Disabled"
 msgstr "Propriedades da proteo de tela"
 
-#: driver/demo-Gtk.c:2855
+#: driver/demo-Gtk.c:2862
 #, c-format
 msgid "%s: %.100s Settings"
 msgstr ""
 
 #, c-format
 msgid "%s: %.100s Settings"
 msgstr ""
 
-#: driver/demo-Gtk.c:3010
+#: driver/demo-Gtk.c:3017
 #, c-format
 msgid ""
 "Warning:\n"
 #, c-format
 msgid ""
 "Warning:\n"
@@ -649,23 +649,23 @@ msgid ""
 "file \"%s\" has changed, reloading.\n"
 msgstr ""
 
 "file \"%s\" has changed, reloading.\n"
 msgstr ""
 
-#: driver/demo-Gtk.c:3092
+#: driver/demo-Gtk.c:3099
 msgid "No Preview"
 msgstr ""
 
 msgid "No Preview"
 msgstr ""
 
-#: driver/demo-Gtk.c:3092
+#: driver/demo-Gtk.c:3099
 msgid "Available"
 msgstr ""
 
 msgid "Available"
 msgstr ""
 
-#: driver/demo-Gtk.c:3093
+#: driver/demo-Gtk.c:3100
 msgid "Not"
 msgstr ""
 
 msgid "Not"
 msgstr ""
 
-#: driver/demo-Gtk.c:3093
+#: driver/demo-Gtk.c:3100
 msgid "Installed"
 msgstr ""
 
 msgid "Installed"
 msgstr ""
 
-#: driver/demo-Gtk.c:3858
+#: driver/demo-Gtk.c:3865
 #, c-format
 msgid ""
 "Warning:\n"
 #, c-format
 msgid ""
 "Warning:\n"
@@ -674,7 +674,7 @@ msgid ""
 "on display \"%s\".  Launch it now?"
 msgstr ""
 
 "on display \"%s\".  Launch it now?"
 msgstr ""
 
-#: driver/demo-Gtk.c:3868
+#: driver/demo-Gtk.c:3875
 #, c-format
 msgid ""
 "Warning:\n"
 #, c-format
 msgid ""
 "Warning:\n"
@@ -693,7 +693,7 @@ msgid ""
 "Restart the xscreensaver daemon now?\n"
 msgstr ""
 
 "Restart the xscreensaver daemon now?\n"
 msgstr ""
 
-#: driver/demo-Gtk.c:3893
+#: driver/demo-Gtk.c:3900
 #, c-format
 msgid ""
 "Warning:\n"
 #, c-format
 msgid ""
 "Warning:\n"
@@ -709,7 +709,7 @@ msgid ""
 "Restart the daemon on \"%s\" as \"%s\" now?\n"
 msgstr ""
 
 "Restart the daemon on \"%s\" as \"%s\" now?\n"
 msgstr ""
 
-#: driver/demo-Gtk.c:3915
+#: driver/demo-Gtk.c:3922
 #, c-format
 msgid ""
 "Warning:\n"
 #, c-format
 msgid ""
 "Warning:\n"
@@ -721,12 +721,12 @@ msgid ""
 "Restart the xscreensaver daemon now?\n"
 msgstr ""
 
 "Restart the xscreensaver daemon now?\n"
 msgstr ""
 
-#: driver/demo-Gtk.c:4372
+#: driver/demo-Gtk.c:4379
 #, c-format
 msgid "%s: unknown option: %s\n"
 msgstr ""
 
 #, c-format
 msgid "%s: unknown option: %s\n"
 msgstr ""
 
-#: driver/demo-Gtk.c:4436
+#: driver/demo-Gtk.c:4443
 #, fuzzy
 msgid "Screensaver Preferences"
 msgstr "Propriedades da proteo de tela"
 #, fuzzy
 msgid "Screensaver Preferences"
 msgstr "Propriedades da proteo de tela"
@@ -944,22 +944,23 @@ msgstr ""
 #: 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/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:5 hacks/config/flyingtoasters.xml.h:5
-#: hacks/config/fontglide.xml.h:4 hacks/config/forest.xml.h:1
-#: hacks/config/fuzzyflakes.xml.h:7 hacks/config/galaxy.xml.h:3
-#: hacks/config/gears.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:6
-#: 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/fadeplot.xml.h:4 hacks/config/fireworkx.xml.h:3
+#: 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:2 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/fuzzyflakes.xml.h:7
+#: hacks/config/galaxy.xml.h:3 hacks/config/gears.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:6 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/intermomentary.xml.h:1 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/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
@@ -977,23 +978,24 @@ msgstr ""
 #: hacks/config/pacman.xml.h:1 hacks/config/penetrate.xml.h:3
 #: hacks/config/penrose.xml.h:6 hacks/config/petri.xml.h:5
 #: hacks/config/phosphor.xml.h:4 hacks/config/piecewise.xml.h:4
 #: hacks/config/pacman.xml.h:1 hacks/config/penetrate.xml.h:3
 #: hacks/config/penrose.xml.h:6 hacks/config/petri.xml.h:5
 #: hacks/config/phosphor.xml.h:4 hacks/config/piecewise.xml.h:4
-#: hacks/config/pipes.xml.h:5 hacks/config/polyhedra.xml.h:18
-#: hacks/config/polyominoes.xml.h:2 hacks/config/polytopes.xml.h:11
-#: hacks/config/pong.xml.h:1 hacks/config/popsquares.xml.h:3
-#: hacks/config/providence.xml.h:2 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 hacks/config/rocks.xml.h:4
-#: hacks/config/rotor.xml.h:3 hacks/config/rubik.xml.h:3
-#: hacks/config/sballs.xml.h:4 hacks/config/shadebobs.xml.h:3
-#: hacks/config/sierpinski.xml.h:2 hacks/config/sierpinski3d.xml.h:2
-#: hacks/config/slidescreen.xml.h:2 hacks/config/slip.xml.h:2
-#: hacks/config/speedmine.xml.h:3 hacks/config/sphere.xml.h:2
-#: hacks/config/spheremonics.xml.h:5 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:1 hacks/config/superquadrics.xml.h:4
+#: hacks/config/pinion.xml.h:5 hacks/config/pipes.xml.h:5
+#: hacks/config/polyhedra.xml.h:18 hacks/config/polyominoes.xml.h:2
+#: hacks/config/polytopes.xml.h:11 hacks/config/pong.xml.h:1
+#: hacks/config/popsquares.xml.h:3 hacks/config/providence.xml.h:2
+#: 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
+#: hacks/config/rocks.xml.h:4 hacks/config/rotor.xml.h:3
+#: hacks/config/rubik.xml.h:3 hacks/config/sballs.xml.h:4
+#: hacks/config/shadebobs.xml.h:3 hacks/config/sierpinski.xml.h:2
+#: hacks/config/sierpinski3d.xml.h:2 hacks/config/slidescreen.xml.h:2
+#: hacks/config/slip.xml.h:2 hacks/config/speedmine.xml.h:3
+#: hacks/config/sphere.xml.h:2 hacks/config/spheremonics.xml.h:5
+#: 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:1
+#: hacks/config/substrate.xml.h:2 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/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
@@ -1015,8 +1017,9 @@ msgstr ""
 #: hacks/config/fuzzyflakes.xml.h:8 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/fuzzyflakes.xml.h:8 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/wormhole.xml.h:3 hacks/config/xfishtank.xml.h:4
+#: hacks/config/substrate.xml.h:3 hacks/config/thornbird.xml.h:3
+#: hacks/config/whirlwindwarp.xml.h:1 hacks/config/wormhole.xml.h:3
+#: hacks/config/xfishtank.xml.h:4
 msgid "Few"
 msgstr ""
 
 msgid "Few"
 msgstr ""
 
@@ -1032,7 +1035,7 @@ msgstr ""
 #: hacks/config/epicycle.xml.h:8 hacks/config/eruption.xml.h:12
 #: hacks/config/euler2d.xml.h:8 hacks/config/fadeplot.xml.h:6
 #: hacks/config/flag.xml.h:5 hacks/config/flame.xml.h:11
 #: hacks/config/epicycle.xml.h:8 hacks/config/eruption.xml.h:12
 #: hacks/config/euler2d.xml.h:8 hacks/config/fadeplot.xml.h:6
 #: hacks/config/flag.xml.h:5 hacks/config/flame.xml.h:11
-#: hacks/config/flow.xml.h:8 hacks/config/fluidballs.xml.h:13
+#: hacks/config/flow.xml.h:7 hacks/config/fluidballs.xml.h:13
 #: hacks/config/forest.xml.h:3 hacks/config/fuzzyflakes.xml.h:12
 #: 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/forest.xml.h:3 hacks/config/fuzzyflakes.xml.h:12
 #: hacks/config/galaxy.xml.h:6 hacks/config/grav.xml.h:4
 #: hacks/config/halo.xml.h:4 hacks/config/hopalong.xml.h:15
@@ -1070,7 +1073,7 @@ msgstr ""
 #: 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/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/flow.xml.h:8 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/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
@@ -1124,22 +1127,23 @@ msgstr ""
 #: 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/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/flyingtoasters.xml.h:11
-#: hacks/config/fontglide.xml.h:13 hacks/config/forest.xml.h:5
-#: hacks/config/fuzzyflakes.xml.h:15 hacks/config/galaxy.xml.h:10
-#: hacks/config/gears.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:8 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:10 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/fadeplot.xml.h:8 hacks/config/fireworkx.xml.h:9
+#: 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:10 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/fuzzyflakes.xml.h:15
+#: hacks/config/galaxy.xml.h:11 hacks/config/gears.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:8
+#: 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:10
+#: 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/intermomentary.xml.h:4 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/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
@@ -1157,23 +1161,24 @@ msgstr ""
 #: hacks/config/pacman.xml.h:5 hacks/config/penetrate.xml.h:6
 #: hacks/config/penrose.xml.h:11 hacks/config/petri.xml.h:23
 #: hacks/config/phosphor.xml.h:7 hacks/config/piecewise.xml.h:9
 #: hacks/config/pacman.xml.h:5 hacks/config/penetrate.xml.h:6
 #: hacks/config/penrose.xml.h:11 hacks/config/petri.xml.h:23
 #: hacks/config/phosphor.xml.h:7 hacks/config/piecewise.xml.h:9
-#: hacks/config/pipes.xml.h:15 hacks/config/polyhedra.xml.h:119
-#: hacks/config/polyominoes.xml.h:10 hacks/config/polytopes.xml.h:20
-#: hacks/config/pong.xml.h:4 hacks/config/popsquares.xml.h:5
-#: hacks/config/providence.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 hacks/config/rocks.xml.h:9
-#: hacks/config/rotor.xml.h:11 hacks/config/rubik.xml.h:9
-#: hacks/config/sballs.xml.h:13 hacks/config/shadebobs.xml.h:9
-#: hacks/config/sierpinski.xml.h:7 hacks/config/sierpinski3d.xml.h:8
-#: hacks/config/slidescreen.xml.h:6 hacks/config/slip.xml.h:7
-#: hacks/config/speedmine.xml.h:13 hacks/config/sphere.xml.h:5
-#: hacks/config/spheremonics.xml.h:19 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:4 hacks/config/superquadrics.xml.h:8
+#: hacks/config/pinion.xml.h:13 hacks/config/pipes.xml.h:15
+#: hacks/config/polyhedra.xml.h:119 hacks/config/polyominoes.xml.h:10
+#: hacks/config/polytopes.xml.h:20 hacks/config/pong.xml.h:4
+#: hacks/config/popsquares.xml.h:5 hacks/config/providence.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
+#: hacks/config/rocks.xml.h:9 hacks/config/rotor.xml.h:11
+#: hacks/config/rubik.xml.h:9 hacks/config/sballs.xml.h:13
+#: hacks/config/shadebobs.xml.h:9 hacks/config/sierpinski.xml.h:7
+#: hacks/config/sierpinski3d.xml.h:8 hacks/config/slidescreen.xml.h:6
+#: hacks/config/slip.xml.h:7 hacks/config/speedmine.xml.h:13
+#: hacks/config/sphere.xml.h:5 hacks/config/spheremonics.xml.h:19
+#: 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:4
+#: hacks/config/substrate.xml.h:10 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/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
@@ -1206,17 +1211,18 @@ msgstr ""
 #: hacks/config/engine.xml.h:16 hacks/config/epicycle.xml.h:11
 #: 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/engine.xml.h:16 hacks/config/epicycle.xml.h:11
 #: 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/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/fuzzyflakes.xml.h:17
-#: hacks/config/galaxy.xml.h:11 hacks/config/glblur.xml.h:17
-#: hacks/config/glforestfire.xml.h:15 hacks/config/glplanet.xml.h:10
-#: 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:11 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/fireworkx.xml.h:11 hacks/config/flag.xml.h:9
+#: hacks/config/flame.xml.h:15 hacks/config/flipflop.xml.h:7
+#: hacks/config/flipscreen3d.xml.h:7 hacks/config/flow.xml.h:12
+#: hacks/config/fluidballs.xml.h:20 hacks/config/forest.xml.h:6
+#: hacks/config/fuzzyflakes.xml.h:17 hacks/config/galaxy.xml.h:12
+#: hacks/config/glblur.xml.h:17 hacks/config/glforestfire.xml.h:15
+#: hacks/config/glplanet.xml.h:10 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:11
+#: 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/intermomentary.xml.h:5 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/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
@@ -1245,16 +1251,16 @@ msgstr ""
 #: 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/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/xplanet.xml.h:60 hacks/config/xrayswarm.xml.h:4
-#: hacks/config/zoom.xml.h:7
+#: hacks/config/strange.xml.h:5 hacks/config/substrate.xml.h:11
+#: 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/xplanet.xml.h:60
+#: hacks/config/xrayswarm.xml.h:4 hacks/config/zoom.xml.h:7
 msgid "Speed"
 msgstr ""
 
 msgid "Speed"
 msgstr ""
 
@@ -1297,8 +1303,8 @@ msgstr ""
 #: hacks/config/discrete.xml.h:11 hacks/config/drift.xml.h:14
 #: hacks/config/epicycle.xml.h:13 hacks/config/euler2d.xml.h:17
 #: hacks/config/fadeplot.xml.h:12 hacks/config/flag.xml.h:13
 #: hacks/config/discrete.xml.h:11 hacks/config/drift.xml.h:14
 #: hacks/config/epicycle.xml.h:13 hacks/config/euler2d.xml.h:17
 #: hacks/config/fadeplot.xml.h:12 hacks/config/flag.xml.h:13
-#: hacks/config/flame.xml.h:16 hacks/config/flow.xml.h:18
-#: hacks/config/forest.xml.h:8 hacks/config/galaxy.xml.h:13
+#: hacks/config/flame.xml.h:16 hacks/config/flow.xml.h:15
+#: hacks/config/forest.xml.h:8 hacks/config/galaxy.xml.h:14
 #: hacks/config/grav.xml.h:11 hacks/config/halo.xml.h:13
 #: hacks/config/hopalong.xml.h:25 hacks/config/ifs.xml.h:8
 #: hacks/config/imsmap.xml.h:15 hacks/config/interference.xml.h:19
 #: hacks/config/grav.xml.h:11 hacks/config/halo.xml.h:13
 #: hacks/config/hopalong.xml.h:25 hacks/config/ifs.xml.h:8
 #: hacks/config/imsmap.xml.h:15 hacks/config/interference.xml.h:19
@@ -1395,7 +1401,7 @@ msgstr ""
 #: 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/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/flag.xml.h:4 hacks/config/flow.xml.h:4
 #: hacks/config/fluidballs.xml.h:12 hacks/config/fuzzyflakes.xml.h:10
 #: 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/fluidballs.xml.h:12 hacks/config/fuzzyflakes.xml.h:10
 #: hacks/config/gleidescope.xml.h:7 hacks/config/halftone.xml.h:8
 #: hacks/config/hopalong.xml.h:13 hacks/config/interference.xml.h:11
@@ -1427,7 +1433,7 @@ msgstr ""
 #: 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/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/flag.xml.h:8 hacks/config/flow.xml.h:11
 #: hacks/config/fluidballs.xml.h:19 hacks/config/fuzzyflakes.xml.h:16
 #: 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/fluidballs.xml.h:19 hacks/config/fuzzyflakes.xml.h:16
 #: hacks/config/gleidescope.xml.h:12 hacks/config/halftone.xml.h:14
 #: hacks/config/hopalong.xml.h:22 hacks/config/interference.xml.h:18
@@ -1446,7 +1452,7 @@ msgstr ""
 
 #: 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/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/flag.xml.h:12 hacks/config/flow.xml.h:14
 #: hacks/config/lissie.xml.h:12 hacks/config/loop.xml.h:11
 #: hacks/config/rubik.xml.h:12 hacks/config/sierpinski.xml.h:11
 #: hacks/config/slip.xml.h:11
 #: hacks/config/lissie.xml.h:12 hacks/config/loop.xml.h:11
 #: hacks/config/rubik.xml.h:12 hacks/config/sierpinski.xml.h:11
 #: hacks/config/slip.xml.h:11
@@ -1496,13 +1502,14 @@ msgstr ""
 #: hacks/config/menger.xml.h:15 hacks/config/mirrorblob.xml.h:18
 #: hacks/config/moebius.xml.h:6 hacks/config/molecule.xml.h:21
 #: hacks/config/morph3d.xml.h:5 hacks/config/noof.xml.h:4
 #: hacks/config/menger.xml.h:15 hacks/config/mirrorblob.xml.h:18
 #: hacks/config/moebius.xml.h:6 hacks/config/molecule.xml.h:21
 #: hacks/config/morph3d.xml.h:5 hacks/config/noof.xml.h:4
-#: hacks/config/pipes.xml.h:14 hacks/config/polyhedra.xml.h:118
-#: hacks/config/polytopes.xml.h:18 hacks/config/providence.xml.h:4
-#: 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
+#: hacks/config/pinion.xml.h:12 hacks/config/pipes.xml.h:14
+#: hacks/config/polyhedra.xml.h:118 hacks/config/polytopes.xml.h:18
+#: hacks/config/providence.xml.h:4 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 ""
 
 msgid "Show Frames-per-Second"
 msgstr ""
 
@@ -1661,11 +1668,12 @@ msgstr ""
 #: hacks/config/lament.xml.h:9 hacks/config/lavalite.xml.h:32
 #: hacks/config/menger.xml.h:21 hacks/config/mirrorblob.xml.h:24
 #: hacks/config/moebius.xml.h:11 hacks/config/molecule.xml.h:26
 #: hacks/config/lament.xml.h:9 hacks/config/lavalite.xml.h:32
 #: hacks/config/menger.xml.h:21 hacks/config/mirrorblob.xml.h:24
 #: hacks/config/moebius.xml.h:11 hacks/config/molecule.xml.h:26
-#: hacks/config/polyhedra.xml.h:173 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
+#: hacks/config/pinion.xml.h:15 hacks/config/polyhedra.xml.h:173
+#: 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 ""
 
 msgid "Wireframe"
 msgstr ""
 
@@ -1753,14 +1761,15 @@ msgstr ""
 #: 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/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/mismunch.xml.h:3
-#: 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 hacks/config/spheremonics.xml.h:7
+#: hacks/config/flow.xml.h:6 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/mismunch.xml.h:3 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
+#: hacks/config/spheremonics.xml.h:7 hacks/config/substrate.xml.h:6
 #: hacks/config/wander.xml.h:10 hacks/config/whirlwindwarp.xml.h:3
 msgid "Long"
 msgstr ""
 #: hacks/config/wander.xml.h:10 hacks/config/whirlwindwarp.xml.h:3
 msgid "Long"
 msgstr ""
@@ -1807,13 +1816,14 @@ msgstr ""
 #: 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/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/metaballs.xml.h:12 hacks/config/mismunch.xml.h:8
-#: 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/flow.xml.h:9 hacks/config/galaxy.xml.h:9
+#: hacks/config/klein.xml.h:5 hacks/config/laser.xml.h:9
+#: hacks/config/menger.xml.h:14 hacks/config/metaballs.xml.h:12
+#: hacks/config/mismunch.xml.h:8 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/substrate.xml.h:9
 #: hacks/config/wander.xml.h:12 hacks/config/whirlwindwarp.xml.h:6
 msgid "Short"
 msgstr ""
 #: hacks/config/wander.xml.h:12 hacks/config/whirlwindwarp.xml.h:6
 msgid "Short"
 msgstr ""
@@ -2010,10 +2020,10 @@ msgstr ""
 #: 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/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/polyhedra.xml.h:3 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/wormhole.xml.h:1
-#: hacks/config/xfishtank.xml.h:1
+#: hacks/config/pinion.xml.h:3 hacks/config/polyhedra.xml.h:3
+#: 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/wormhole.xml.h:1 hacks/config/xfishtank.xml.h:1
 msgid "Animation Speed"
 msgstr ""
 
 msgid "Animation Speed"
 msgstr ""
 
@@ -2088,8 +2098,9 @@ msgstr ""
 #: 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/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/starfish.xml.h:2 hacks/config/substrate.xml.h:1
+#: hacks/config/vidwhacker.xml.h:3 hacks/config/wander.xml.h:7
+#: hacks/config/xspirograph.xml.h:3
 msgid "Duration"
 msgstr ""
 
 msgid "Duration"
 msgstr ""
 
@@ -2336,7 +2347,7 @@ msgstr ""
 msgid "Rotate"
 msgstr ""
 
 msgid "Rotate"
 msgstr ""
 
-#: hacks/config/circuit.xml.h:8
+#: hacks/config/circuit.xml.h:8 hacks/config/pinion.xml.h:10
 msgid "Rotation Speed"
 msgstr ""
 
 msgid "Rotation Speed"
 msgstr ""
 
@@ -2419,11 +2430,12 @@ msgstr ""
 msgid "Coral"
 msgstr ""
 
 msgid "Coral"
 msgstr ""
 
-#: hacks/config/coral.xml.h:4 hacks/config/gflux.xml.h:3
-#: hacks/config/glblur.xml.h:2 hacks/config/glmatrix.xml.h:3
-#: 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
+#: hacks/config/coral.xml.h:4 hacks/config/fireworkx.xml.h:2
+#: hacks/config/gflux.xml.h:3 hacks/config/glblur.xml.h:2
+#: hacks/config/glmatrix.xml.h:3 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
 msgid "Dense"
 msgstr ""
 
 msgid "Dense"
 msgstr ""
 
@@ -2436,12 +2448,12 @@ msgid ""
 "Simulates coral growth, albeit somewhat slowly. Written by Frederick Roeber."
 msgstr ""
 
 "Simulates coral growth, albeit somewhat slowly. Written by Frederick Roeber."
 msgstr ""
 
-#: hacks/config/coral.xml.h:13 hacks/config/gflux.xml.h:13
-#: hacks/config/glblur.xml.h:16 hacks/config/glmatrix.xml.h:19
-#: hacks/config/imsmap.xml.h:13 hacks/config/lavalite.xml.h:29
-#: hacks/config/pyro.xml.h:14 hacks/config/qix.xml.h:21
-#: hacks/config/squiral.xml.h:15 hacks/config/xearth.xml.h:24
-#: hacks/config/xmatrix.xml.h:17
+#: hacks/config/coral.xml.h:13 hacks/config/fireworkx.xml.h:10
+#: hacks/config/gflux.xml.h:13 hacks/config/glblur.xml.h:16
+#: hacks/config/glmatrix.xml.h:19 hacks/config/imsmap.xml.h:13
+#: hacks/config/lavalite.xml.h:29 hacks/config/pyro.xml.h:14
+#: hacks/config/qix.xml.h:21 hacks/config/squiral.xml.h:15
+#: hacks/config/xearth.xml.h:24 hacks/config/xmatrix.xml.h:17
 msgid "Sparse"
 msgstr ""
 
 msgid "Sparse"
 msgstr ""
 
@@ -2470,7 +2482,7 @@ msgid "Center on Screen"
 msgstr ""
 
 #: hacks/config/crystal.xml.h:2 hacks/config/deluxe.xml.h:1
 msgstr ""
 
 #: hacks/config/crystal.xml.h:2 hacks/config/deluxe.xml.h:1
-#: hacks/config/fadeplot.xml.h:1 hacks/config/flow.xml.h:3
+#: hacks/config/fadeplot.xml.h:1 hacks/config/flow.xml.h:1
 #: hacks/config/galaxy.xml.h:1 hacks/config/glforestfire.xml.h:1
 #: hacks/config/grav.xml.h:1 hacks/config/julia.xml.h:1
 #: hacks/config/laser.xml.h:1 hacks/config/lisa.xml.h:1
 #: hacks/config/galaxy.xml.h:1 hacks/config/glforestfire.xml.h:1
 #: hacks/config/grav.xml.h:1 hacks/config/julia.xml.h:1
 #: hacks/config/laser.xml.h:1 hacks/config/lisa.xml.h:1
@@ -3212,7 +3224,7 @@ msgstr ""
 msgid "Half"
 msgstr ""
 
 msgid "Half"
 msgstr ""
 
-#: hacks/config/fireflies.xml.h:17
+#: hacks/config/fireflies.xml.h:17 hacks/config/pinion.xml.h:7
 msgid "Huge"
 msgstr ""
 
 msgid "Huge"
 msgstr ""
 
@@ -3301,7 +3313,7 @@ msgstr ""
 msgid "Swarm tails glow"
 msgstr ""
 
 msgid "Swarm tails glow"
 msgstr ""
 
-#: hacks/config/fireflies.xml.h:43
+#: hacks/config/fireflies.xml.h:43 hacks/config/pinion.xml.h:14
 msgid "Tiny"
 msgstr ""
 
 msgid "Tiny"
 msgstr ""
 
@@ -3317,6 +3329,30 @@ msgstr ""
 msgid "Wind picks up"
 msgstr ""
 
 msgid "Wind picks up"
 msgstr ""
 
+#: hacks/config/fireworkx.xml.h:1 hacks/config/lavalite.xml.h:3
+msgid "Activity"
+msgstr ""
+
+#: hacks/config/fireworkx.xml.h:4
+msgid "Fast Fade (more realistic)"
+msgstr ""
+
+#: hacks/config/fireworkx.xml.h:5
+msgid "Fireworkx"
+msgstr ""
+
+#: hacks/config/fireworkx.xml.h:6
+msgid "Light effect"
+msgstr ""
+
+#: hacks/config/fireworkx.xml.h:7
+msgid "Pyrotechnics simulation eye-candy. Written by Rony B. Chandran."
+msgstr ""
+
+#: hacks/config/fireworkx.xml.h:8
+msgid "Shoot"
+msgstr ""
+
 #: hacks/config/flag.xml.h:1
 msgid "Bitmap for Flag"
 msgstr ""
 #: hacks/config/flag.xml.h:1
 msgid "Bitmap for Flag"
 msgstr ""
@@ -3390,42 +3426,42 @@ msgid ""
 "around and deforms it in various ways. Written by Ben Buxton."
 msgstr ""
 
 "around and deforms it in various ways. Written by Ben Buxton."
 msgstr ""
 
-#: hacks/config/flow.xml.h:1
-msgid "Allow 2D Attractors"
+#: hacks/config/flow.xml.h:3
+msgid "Flow"
 msgstr ""
 
 msgstr ""
 
-#: hacks/config/flow.xml.h:2
-msgid ""
-"Another series of strange attractors: a flowing series of points, making "
-"strange rotational shapes. Written by Tim Auckland."
+#: hacks/config/flow.xml.h:5
+msgid "Length of trails"
 msgstr ""
 
 msgstr ""
 
-#: hacks/config/flow.xml.h:5
-msgid "Flow"
+#: hacks/config/flow.xml.h:13
+msgid ""
+"Strange attractors formed of flows in a 3D differential equation phase "
+"space. Written by Tim Auckland."
 msgstr ""
 
 msgstr ""
 
-#: hacks/config/flow.xml.h:6
-msgid "Freeze Some Bees"
+#: hacks/config/flow.xml.h:16
+msgid "turn on/off bounding box."
 msgstr ""
 
 msgstr ""
 
-#: hacks/config/flow.xml.h:10
-msgid "Ride a Trained Bee"
+#: hacks/config/flow.xml.h:17
+msgid "turn on/off double buffering."
 msgstr ""
 
 msgstr ""
 
-#: hacks/config/flow.xml.h:11
-msgid "Rotate Around Attractor"
+#: hacks/config/flow.xml.h:18
+msgid "turn on/off periodic attractors."
 msgstr ""
 
 msgstr ""
 
-#: hacks/config/flow.xml.h:12
-msgid "Show Bounding Box"
+#: hacks/config/flow.xml.h:19
+msgid "turn on/off ride in the flow."
 msgstr ""
 
 msgstr ""
 
-#: hacks/config/flow.xml.h:14
-msgid "Slow Bees with Antifreeze"
+#: hacks/config/flow.xml.h:20
+msgid "turn on/off rotating around attractor."
 msgstr ""
 
 msgstr ""
 
-#: hacks/config/flow.xml.h:19
-msgid "Zoom In and Out"
+#: hacks/config/flow.xml.h:21
+msgid "turn on/off search for new attractors."
 msgstr ""
 
 #: hacks/config/fluidballs.xml.h:1
 msgstr ""
 
 #: hacks/config/fluidballs.xml.h:1
@@ -3630,7 +3666,11 @@ msgstr ""
 msgid "Galaxy"
 msgstr ""
 
 msgid "Galaxy"
 msgstr ""
 
-#: hacks/config/galaxy.xml.h:9 hacks/config/lisa.xml.h:7
+#: hacks/config/galaxy.xml.h:8
+msgid "Rotate Viewpoint"
+msgstr ""
+
+#: hacks/config/galaxy.xml.h:10 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/pong.xml.h:3
 #: hacks/config/rotor.xml.h:10 hacks/config/rubik.xml.h:8
 #: hacks/config/lissie.xml.h:8 hacks/config/loop.xml.h:6
 #: hacks/config/penrose.xml.h:10 hacks/config/pong.xml.h:3
 #: hacks/config/rotor.xml.h:10 hacks/config/rubik.xml.h:8
@@ -3639,7 +3679,7 @@ msgstr ""
 msgid "Size"
 msgstr ""
 
 msgid "Size"
 msgstr ""
 
-#: hacks/config/galaxy.xml.h:12
+#: hacks/config/galaxy.xml.h:13
 msgid ""
 "This draws spinning galaxies, which then collide and scatter their stars to "
 "the, uh, four winds or something. Originally an Amiga program by Uli "
 msgid ""
 "This draws spinning galaxies, which then collide and scatter their stars to "
 "the, uh, four winds or something. Originally an Amiga program by Uli "
@@ -3938,9 +3978,9 @@ msgid ""
 "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 "
 "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."
+"of this window: the tab at the top of the *other* window.) 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
 msgstr ""
 
 #: hacks/config/glslideshow.xml.h:17
@@ -4457,6 +4497,26 @@ msgstr ""
 msgid "Wave Size"
 msgstr ""
 
 msgid "Wave Size"
 msgstr ""
 
+#: hacks/config/intermomentary.xml.h:2
+msgid "Intermomentary"
+msgstr ""
+
+#: hacks/config/intermomentary.xml.h:3
+msgid "Number of Discs"
+msgstr ""
+
+#: hacks/config/intermomentary.xml.h:6
+msgid ""
+"The Intersection Momentary is a fun visualization defining the relationships "
+"between objects with Casey Reas, William Ngan, and Robert Hodgin. "
+"Commissioned for display at the Whitney Museum of American Art. A surface "
+"filled with 100 medium to small sized circles. Each circle has a different "
+"size and direction, but moves at the same slow rate. Display: A. The "
+"instantaneous intersections of the circles. B. The aggregate intersections "
+"of the circles. Ported to XScreensaver from the art project \"InterMomentary"
+"\" at http://www.complexification.net"
+msgstr ""
+
 #: hacks/config/jigglypuff.xml.h:2
 msgid "Chrome"
 msgstr ""
 #: hacks/config/jigglypuff.xml.h:2
 msgid "Chrome"
 msgstr ""
@@ -4675,10 +4735,6 @@ msgstr ""
 msgid "10"
 msgstr ""
 
 msgid "10"
 msgstr ""
 
-#: hacks/config/lavalite.xml.h:3
-msgid "Activity"
-msgstr ""
-
 #: hacks/config/lavalite.xml.h:4
 msgid "Classic Lavalite"
 msgstr ""
 #: hacks/config/lavalite.xml.h:4
 msgid "Classic Lavalite"
 msgstr ""
@@ -5391,6 +5447,36 @@ msgid ""
 "invisibility at intersection points. Written by Geoffrey Irving."
 msgstr ""
 
 "invisibility at intersection points. Written by Geoffrey Irving."
 msgstr ""
 
+#: hacks/config/pinion.xml.h:1
+msgid "100"
+msgstr ""
+
+#: hacks/config/pinion.xml.h:2
+msgid "2000"
+msgstr ""
+
+#: hacks/config/pinion.xml.h:4
+msgid ""
+"Draws an interconnected set of gears moving across the screen. Written by "
+"Jamie Zawinski."
+msgstr ""
+
+#: hacks/config/pinion.xml.h:6
+msgid "Gear Size"
+msgstr ""
+
+#: hacks/config/pinion.xml.h:8
+msgid "Max RPM"
+msgstr ""
+
+#: hacks/config/pinion.xml.h:9
+msgid "Pinion"
+msgstr ""
+
+#: hacks/config/pinion.xml.h:11
+msgid "Scrolling Speed"
+msgstr ""
+
 #: hacks/config/pipes.xml.h:1
 msgid "Allow Tight Turns"
 msgstr ""
 #: hacks/config/pipes.xml.h:1
 msgid "Allow Tight Turns"
 msgstr ""
@@ -5417,7 +5503,8 @@ msgid ""
 "probably seen this GL hack. This version is by Marcelo Vianna."
 msgstr ""
 
 "probably seen this GL hack. This version is by Marcelo Vianna."
 msgstr ""
 
-#: hacks/config/pipes.xml.h:9 hacks/config/wormhole.xml.h:4
+#: hacks/config/pipes.xml.h:9 hacks/config/substrate.xml.h:7
+#: hacks/config/wormhole.xml.h:4
 msgid "Lots"
 msgstr ""
 
 msgid "Lots"
 msgstr ""
 
@@ -6621,22 +6708,26 @@ msgid "Ping subnet/30 (2 hosts)"
 msgstr ""
 
 #: hacks/config/sonar.xml.h:10
 msgstr ""
 
 #: hacks/config/sonar.xml.h:10
-msgid "Simulation Team Members"
+msgid "Resolve Host Names"
 msgstr ""
 
 #: hacks/config/sonar.xml.h:11
 msgstr ""
 
 #: hacks/config/sonar.xml.h:11
-msgid "Sonar"
+msgid "Simulation Team Members"
 msgstr ""
 
 #: hacks/config/sonar.xml.h:12
 msgstr ""
 
 #: hacks/config/sonar.xml.h:12
-msgid "Team A Name"
+msgid "Sonar"
 msgstr ""
 
 #: hacks/config/sonar.xml.h:13
 msgstr ""
 
 #: hacks/config/sonar.xml.h:13
-msgid "Team B Name"
+msgid "Team A Name"
 msgstr ""
 
 #: hacks/config/sonar.xml.h:14
 msgstr ""
 
 #: hacks/config/sonar.xml.h:14
+msgid "Team B Name"
+msgstr ""
+
+#: hacks/config/sonar.xml.h:15
 msgid ""
 "This program draws a simulation of a sonar screen. By default, it displays a "
 "random assortment of ``bogies'' on the screen, but if installed as \"setuid "
 msgid ""
 "This program draws a simulation of a sonar screen. By default, it displays a "
 "random assortment of ``bogies'' on the screen, but if installed as \"setuid "
@@ -6645,7 +6736,7 @@ msgid ""
 "Martin and Jamie Zawinski."
 msgstr ""
 
 "Martin and Jamie Zawinski."
 msgstr ""
 
-#: hacks/config/sonar.xml.h:15
+#: hacks/config/sonar.xml.h:16
 msgid "vs."
 msgstr ""
 
 msgid "vs."
 msgstr ""
 
@@ -6918,6 +7009,29 @@ msgid ""
 "Written by Massimino Pascal."
 msgstr ""
 
 "Written by Massimino Pascal."
 msgstr ""
 
+#: hacks/config/substrate.xml.h:4
+msgid "Initial Cracks"
+msgstr ""
+
+#: hacks/config/substrate.xml.h:5
+msgid ""
+"Lines like crystals grow on a computational substrate. A simple "
+"perpendicular growth rule creates intricate city-like structures. By J. "
+"Tarbell and Mike Kershaw."
+msgstr ""
+
+#: hacks/config/substrate.xml.h:8
+msgid "Sandgrains"
+msgstr ""
+
+#: hacks/config/substrate.xml.h:12
+msgid "Substrate"
+msgstr ""
+
+#: hacks/config/substrate.xml.h:13
+msgid "Wireframe only"
+msgstr ""
+
 #: hacks/config/superquadrics.xml.h:3
 msgid ""
 "Ed Mackey reports that he wrote the first version of this program in BASIC "
 #: hacks/config/superquadrics.xml.h:3
 msgid ""
 "Ed Mackey reports that he wrote the first version of this program in BASIC "
index 41b360ce598f50f5458b6675aaa622be04ec7394..7a42537ec2d2865b56865207a50ad1c7c41ef15a 100644 (file)
--- a/po/ru.po
+++ b/po/ru.po
@@ -5,7 +5,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: xscreensaver 4.09\n"
 "Report-Msgid-Bugs-To: \n"
 msgstr ""
 "Project-Id-Version: xscreensaver 4.09\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2004-10-04 16:25+0200\n"
+"POT-Creation-Date: 2004-12-22 12:51+0100\n"
 "PO-Revision-Date: 2003-05-17 16:53+0300\n"
 "Last-Translator: \"Andrew W. Nosenko\" <awn@bcs.zp.ua>\n"
 "Language-Team: Russian\n"
 "PO-Revision-Date: 2003-05-17 16:53+0300\n"
 "Last-Translator: \"Andrew W. Nosenko\" <awn@bcs.zp.ua>\n"
 "Language-Team: Russian\n"
@@ -151,7 +151,7 @@ msgstr ""
 msgid "minutes"
 msgstr "минут(ы)"
 
 msgid "minutes"
 msgstr "минут(ы)"
 
-#: driver/demo-Gtk-widgets.c:482 driver/demo-Gtk.c:2845
+#: driver/demo-Gtk-widgets.c:482 driver/demo-Gtk.c:2852
 #: driver/xscreensaver-demo.glade.h:58
 msgid "Preview"
 msgstr "Предпросмотр"
 #: driver/xscreensaver-demo.glade.h:58
 msgid "Preview"
 msgstr "Предпросмотр"
@@ -198,12 +198,12 @@ msgstr "Один постоянный хранитель экрана"
 msgid "Random Screen Saver"
 msgstr "Случайный хранитель экрана"
 
 msgid "Random Screen Saver"
 msgstr "Случайный хранитель экрана"
 
-#: driver/demo-Gtk-widgets.c:571 driver/demo-Gtk.c:2134
+#: driver/demo-Gtk-widgets.c:571 driver/demo-Gtk.c:2141
 #: driver/xscreensaver-demo.glade.h:75
 msgid "Use"
 msgstr "Использовать"
 
 #: driver/xscreensaver-demo.glade.h:75
 msgid "Use"
 msgstr "Использовать"
 
-#: driver/demo-Gtk-widgets.c:591 driver/demo-Gtk.c:2144
+#: driver/demo-Gtk-widgets.c:591 driver/demo-Gtk.c:2151
 #: driver/xscreensaver-demo.glade.h:63
 msgid "Screen Saver"
 msgstr "Хранитель экрана"
 #: driver/xscreensaver-demo.glade.h:63
 msgid "Screen Saver"
 msgstr "Хранитель экрана"
@@ -455,7 +455,7 @@ msgid "Visual:"
 msgstr "Оптический класс:"
 
 #: driver/demo-Gtk-widgets.c:1550 driver/demo-Gtk-widgets.c:1573
 msgstr "Оптический класс:"
 
 #: driver/demo-Gtk-widgets.c:1550 driver/demo-Gtk-widgets.c:1573
-#: driver/demo-Gtk.c:1538 driver/demo-Gtk.c:2864
+#: driver/demo-Gtk.c:1545 driver/demo-Gtk.c:2871
 #: driver/xscreensaver-demo.glade.h:5 driver/xscreensaver-demo.glade2.h:3
 msgid "Any"
 msgstr "Любой"
 #: driver/xscreensaver-demo.glade.h:5 driver/xscreensaver-demo.glade2.h:3
 msgid "Any"
 msgstr "Любой"
@@ -556,7 +556,7 @@ msgstr "Стандартные <<"
 msgid "Back to the graphical configuration options."
 msgstr "Обратно к управлению параметрами через графический интерфейс."
 
 msgid "Back to the graphical configuration options."
 msgstr "Обратно к управлению параметрами через графический интерфейс."
 
-#: driver/demo-Gtk-widgets.c:1709 driver/demo-Gtk.c:741
+#: driver/demo-Gtk-widgets.c:1709 driver/demo-Gtk.c:748
 #: driver/xscreensaver-demo.glade.h:54
 msgid "OK"
 msgstr "OK"
 #: driver/xscreensaver-demo.glade.h:54
 msgid "OK"
 msgstr "OK"
@@ -565,11 +565,11 @@ msgstr "OK"
 msgid "Cancel"
 msgstr "Отменить"
 
 msgid "Cancel"
 msgstr "Отменить"
 
-#: driver/demo-Gtk.c:649
+#: driver/demo-Gtk.c:656
 msgid "For updates, check http://www.jwz.org/xscreensaver/"
 msgstr "Для обновлений см. http://www.jwz.org/xscreensaver/"
 
 msgid "For updates, check http://www.jwz.org/xscreensaver/"
 msgstr "Для обновлений см. http://www.jwz.org/xscreensaver/"
 
-#: driver/demo-Gtk.c:779
+#: driver/demo-Gtk.c:786
 msgid ""
 "Error:\n"
 "\n"
 msgid ""
 "Error:\n"
 "\n"
@@ -579,7 +579,7 @@ msgstr ""
 "\n"
 "URL для файлов помощи не указан.\n"
 
 "\n"
 "URL для файлов помощи не указан.\n"
 
-#: driver/demo-Gtk.c:865
+#: driver/demo-Gtk.c:872
 msgid ""
 "Error:\n"
 "\n"
 msgid ""
 "Error:\n"
 "\n"
@@ -591,7 +591,7 @@ msgstr ""
 "Демон xscreensaver не запущен или запущен не правильно.\n"
 "\n"
 
 "Демон xscreensaver не запущен или запущен не правильно.\n"
 "\n"
 
-#: driver/demo-Gtk.c:877
+#: driver/demo-Gtk.c:884
 msgid ""
 "You are running as root.  This usually means that xscreensaver\n"
 "was unable to contact your X server because access control is\n"
 msgid ""
 "You are running as root.  This usually means that xscreensaver\n"
 "was unable to contact your X server because access control is\n"
@@ -610,11 +610,11 @@ msgid ""
 "normal user, and `su' as necessary."
 msgstr ""
 
 "normal user, and `su' as necessary."
 msgstr ""
 
-#: driver/demo-Gtk.c:893
+#: driver/demo-Gtk.c:900
 msgid "Please check your $PATH and permissions."
 msgstr "Проверьте значение переменной $PATH и права доступа."
 
 msgid "Please check your $PATH and permissions."
 msgstr "Проверьте значение переменной $PATH и права доступа."
 
-#: driver/demo-Gtk.c:928
+#: driver/demo-Gtk.c:935
 msgid ""
 "Error:\n"
 "\n"
 msgid ""
 "Error:\n"
 "\n"
@@ -624,7 +624,7 @@ msgstr ""
 "\n"
 "Не удалось определить имя инициализационного файла!\n"
 
 "\n"
 "Не удалось определить имя инициализационного файла!\n"
 
-#: driver/demo-Gtk.c:933
+#: driver/demo-Gtk.c:940
 #, c-format
 msgid ""
 "Error:\n"
 #, c-format
 msgid ""
 "Error:\n"
@@ -635,7 +635,7 @@ msgstr ""
 "\n"
 "Не удалось записать %s\n"
 
 "\n"
 "Не удалось записать %s\n"
 
-#: driver/demo-Gtk.c:992
+#: driver/demo-Gtk.c:999
 msgid ""
 "Error:\n"
 "\n"
 msgid ""
 "Error:\n"
 "\n"
@@ -645,7 +645,7 @@ msgstr ""
 "\n"
 "Ресурс `manualCommand' не установлен."
 
 "\n"
 "Ресурс `manualCommand' не установлен."
 
-#: driver/demo-Gtk.c:1173
+#: driver/demo-Gtk.c:1180
 #, c-format
 msgid ""
 "Error:\n"
 #, c-format
 msgid ""
 "Error:\n"
@@ -656,7 +656,7 @@ msgstr ""
 "\n"
 "Невозможно определить формат времени: \"%s\"\n"
 
 "\n"
 "Невозможно определить формат времени: \"%s\"\n"
 
-#: driver/demo-Gtk.c:1829
+#: driver/demo-Gtk.c:1836
 #, c-format
 msgid ""
 "Error:\n"
 #, c-format
 msgid ""
 "Error:\n"
@@ -667,28 +667,28 @@ msgstr ""
 "\n"
 "Каталога не существует: \"%s\"\n"
 
 "\n"
 "Каталога не существует: \"%s\"\n"
 
-#: driver/demo-Gtk.c:2546
+#: driver/demo-Gtk.c:2553
 msgid "Descriptions not available: no XML support compiled in."
 msgstr "Описание недоступно: поддержка XML не была включена при компиляции."
 
 msgid "Descriptions not available: no XML support compiled in."
 msgstr "Описание недоступно: поддержка XML не была включена при компиляции."
 
-#: driver/demo-Gtk.c:2551
+#: driver/demo-Gtk.c:2558
 msgid "No description available."
 msgstr "Описание отсутствует."
 
 msgid "No description available."
 msgstr "Описание отсутствует."
 
-#: driver/demo-Gtk.c:2816
+#: driver/demo-Gtk.c:2823
 msgid "Blank Screen"
 msgstr "Пустой экран"
 
 msgid "Blank Screen"
 msgstr "Пустой экран"
 
-#: driver/demo-Gtk.c:2822
+#: driver/demo-Gtk.c:2829
 msgid "Screen Saver Disabled"
 msgstr "Хранитель экрана запрещен"
 
 msgid "Screen Saver Disabled"
 msgstr "Хранитель экрана запрещен"
 
-#: driver/demo-Gtk.c:2855
+#: driver/demo-Gtk.c:2862
 #, c-format
 msgid "%s: %.100s Settings"
 msgstr ""
 
 #, c-format
 msgid "%s: %.100s Settings"
 msgstr ""
 
-#: driver/demo-Gtk.c:3010
+#: driver/demo-Gtk.c:3017
 #, c-format
 msgid ""
 "Warning:\n"
 #, c-format
 msgid ""
 "Warning:\n"
@@ -699,23 +699,23 @@ msgstr ""
 "\n"
 "Файл \"%s\" изменился и будет перезагружен.\n"
 
 "\n"
 "Файл \"%s\" изменился и будет перезагружен.\n"
 
-#: driver/demo-Gtk.c:3092
+#: driver/demo-Gtk.c:3099
 msgid "No Preview"
 msgstr "Предпросмотр не"
 
 msgid "No Preview"
 msgstr "Предпросмотр не"
 
-#: driver/demo-Gtk.c:3092
+#: driver/demo-Gtk.c:3099
 msgid "Available"
 msgstr "доступен"
 
 msgid "Available"
 msgstr "доступен"
 
-#: driver/demo-Gtk.c:3093
+#: driver/demo-Gtk.c:3100
 msgid "Not"
 msgstr ""
 
 msgid "Not"
 msgstr ""
 
-#: driver/demo-Gtk.c:3093
+#: driver/demo-Gtk.c:3100
 msgid "Installed"
 msgstr ""
 
 msgid "Installed"
 msgstr ""
 
-#: driver/demo-Gtk.c:3858
+#: driver/demo-Gtk.c:3865
 #, c-format
 msgid ""
 "Warning:\n"
 #, c-format
 msgid ""
 "Warning:\n"
@@ -728,7 +728,7 @@ msgstr ""
 "XScreenSaver демон, похоже, не запущен\n"
 "для экрана \"%s\".  Запустить его сейчас?"
 
 "XScreenSaver демон, похоже, не запущен\n"
 "для экрана \"%s\".  Запустить его сейчас?"
 
-#: driver/demo-Gtk.c:3868
+#: driver/demo-Gtk.c:3875
 #, c-format
 msgid ""
 "Warning:\n"
 #, c-format
 msgid ""
 "Warning:\n"
@@ -747,7 +747,7 @@ msgid ""
 "Restart the xscreensaver daemon now?\n"
 msgstr ""
 
 "Restart the xscreensaver daemon now?\n"
 msgstr ""
 
-#: driver/demo-Gtk.c:3893
+#: driver/demo-Gtk.c:3900
 #, c-format
 msgid ""
 "Warning:\n"
 #, c-format
 msgid ""
 "Warning:\n"
@@ -763,7 +763,7 @@ msgid ""
 "Restart the daemon on \"%s\" as \"%s\" now?\n"
 msgstr ""
 
 "Restart the daemon on \"%s\" as \"%s\" now?\n"
 msgstr ""
 
-#: driver/demo-Gtk.c:3915
+#: driver/demo-Gtk.c:3922
 #, c-format
 msgid ""
 "Warning:\n"
 #, c-format
 msgid ""
 "Warning:\n"
@@ -775,12 +775,12 @@ msgid ""
 "Restart the xscreensaver daemon now?\n"
 msgstr ""
 
 "Restart the xscreensaver daemon now?\n"
 msgstr ""
 
-#: driver/demo-Gtk.c:4372
+#: driver/demo-Gtk.c:4379
 #, c-format
 msgid "%s: unknown option: %s\n"
 msgstr "%s: неизвестный параметр: %s\n"
 
 #, c-format
 msgid "%s: unknown option: %s\n"
 msgstr "%s: неизвестный параметр: %s\n"
 
-#: driver/demo-Gtk.c:4436
+#: driver/demo-Gtk.c:4443
 #, fuzzy
 msgid "Screensaver Preferences"
 msgstr "Хранитель экрана"
 #, fuzzy
 msgid "Screensaver Preferences"
 msgstr "Хранитель экрана"
@@ -1006,22 +1006,23 @@ msgstr ""
 #: 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/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:5 hacks/config/flyingtoasters.xml.h:5
-#: hacks/config/fontglide.xml.h:4 hacks/config/forest.xml.h:1
-#: hacks/config/fuzzyflakes.xml.h:7 hacks/config/galaxy.xml.h:3
-#: hacks/config/gears.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:6
-#: 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/fadeplot.xml.h:4 hacks/config/fireworkx.xml.h:3
+#: 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:2 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/fuzzyflakes.xml.h:7
+#: hacks/config/galaxy.xml.h:3 hacks/config/gears.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:6 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/intermomentary.xml.h:1 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/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
@@ -1039,23 +1040,24 @@ msgstr ""
 #: hacks/config/pacman.xml.h:1 hacks/config/penetrate.xml.h:3
 #: hacks/config/penrose.xml.h:6 hacks/config/petri.xml.h:5
 #: hacks/config/phosphor.xml.h:4 hacks/config/piecewise.xml.h:4
 #: hacks/config/pacman.xml.h:1 hacks/config/penetrate.xml.h:3
 #: hacks/config/penrose.xml.h:6 hacks/config/petri.xml.h:5
 #: hacks/config/phosphor.xml.h:4 hacks/config/piecewise.xml.h:4
-#: hacks/config/pipes.xml.h:5 hacks/config/polyhedra.xml.h:18
-#: hacks/config/polyominoes.xml.h:2 hacks/config/polytopes.xml.h:11
-#: hacks/config/pong.xml.h:1 hacks/config/popsquares.xml.h:3
-#: hacks/config/providence.xml.h:2 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 hacks/config/rocks.xml.h:4
-#: hacks/config/rotor.xml.h:3 hacks/config/rubik.xml.h:3
-#: hacks/config/sballs.xml.h:4 hacks/config/shadebobs.xml.h:3
-#: hacks/config/sierpinski.xml.h:2 hacks/config/sierpinski3d.xml.h:2
-#: hacks/config/slidescreen.xml.h:2 hacks/config/slip.xml.h:2
-#: hacks/config/speedmine.xml.h:3 hacks/config/sphere.xml.h:2
-#: hacks/config/spheremonics.xml.h:5 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:1 hacks/config/superquadrics.xml.h:4
+#: hacks/config/pinion.xml.h:5 hacks/config/pipes.xml.h:5
+#: hacks/config/polyhedra.xml.h:18 hacks/config/polyominoes.xml.h:2
+#: hacks/config/polytopes.xml.h:11 hacks/config/pong.xml.h:1
+#: hacks/config/popsquares.xml.h:3 hacks/config/providence.xml.h:2
+#: 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
+#: hacks/config/rocks.xml.h:4 hacks/config/rotor.xml.h:3
+#: hacks/config/rubik.xml.h:3 hacks/config/sballs.xml.h:4
+#: hacks/config/shadebobs.xml.h:3 hacks/config/sierpinski.xml.h:2
+#: hacks/config/sierpinski3d.xml.h:2 hacks/config/slidescreen.xml.h:2
+#: hacks/config/slip.xml.h:2 hacks/config/speedmine.xml.h:3
+#: hacks/config/sphere.xml.h:2 hacks/config/spheremonics.xml.h:5
+#: 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:1
+#: hacks/config/substrate.xml.h:2 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/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
@@ -1077,8 +1079,9 @@ msgstr "Быстро"
 #: hacks/config/fuzzyflakes.xml.h:8 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/fuzzyflakes.xml.h:8 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/wormhole.xml.h:3 hacks/config/xfishtank.xml.h:4
+#: hacks/config/substrate.xml.h:3 hacks/config/thornbird.xml.h:3
+#: hacks/config/whirlwindwarp.xml.h:1 hacks/config/wormhole.xml.h:3
+#: hacks/config/xfishtank.xml.h:4
 msgid "Few"
 msgstr "Мало"
 
 msgid "Few"
 msgstr "Мало"
 
@@ -1094,7 +1097,7 @@ msgstr "Мало"
 #: hacks/config/epicycle.xml.h:8 hacks/config/eruption.xml.h:12
 #: hacks/config/euler2d.xml.h:8 hacks/config/fadeplot.xml.h:6
 #: hacks/config/flag.xml.h:5 hacks/config/flame.xml.h:11
 #: hacks/config/epicycle.xml.h:8 hacks/config/eruption.xml.h:12
 #: hacks/config/euler2d.xml.h:8 hacks/config/fadeplot.xml.h:6
 #: hacks/config/flag.xml.h:5 hacks/config/flame.xml.h:11
-#: hacks/config/flow.xml.h:8 hacks/config/fluidballs.xml.h:13
+#: hacks/config/flow.xml.h:7 hacks/config/fluidballs.xml.h:13
 #: hacks/config/forest.xml.h:3 hacks/config/fuzzyflakes.xml.h:12
 #: 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/forest.xml.h:3 hacks/config/fuzzyflakes.xml.h:12
 #: hacks/config/galaxy.xml.h:6 hacks/config/grav.xml.h:4
 #: hacks/config/halo.xml.h:4 hacks/config/hopalong.xml.h:15
@@ -1132,7 +1135,7 @@ msgstr "Много"
 #: 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/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/flow.xml.h:8 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/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
@@ -1186,22 +1189,23 @@ msgstr ""
 #: 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/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/flyingtoasters.xml.h:11
-#: hacks/config/fontglide.xml.h:13 hacks/config/forest.xml.h:5
-#: hacks/config/fuzzyflakes.xml.h:15 hacks/config/galaxy.xml.h:10
-#: hacks/config/gears.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:8 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:10 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/fadeplot.xml.h:8 hacks/config/fireworkx.xml.h:9
+#: 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:10 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/fuzzyflakes.xml.h:15
+#: hacks/config/galaxy.xml.h:11 hacks/config/gears.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:8
+#: 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:10
+#: 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/intermomentary.xml.h:4 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/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
@@ -1219,23 +1223,24 @@ msgstr ""
 #: hacks/config/pacman.xml.h:5 hacks/config/penetrate.xml.h:6
 #: hacks/config/penrose.xml.h:11 hacks/config/petri.xml.h:23
 #: hacks/config/phosphor.xml.h:7 hacks/config/piecewise.xml.h:9
 #: hacks/config/pacman.xml.h:5 hacks/config/penetrate.xml.h:6
 #: hacks/config/penrose.xml.h:11 hacks/config/petri.xml.h:23
 #: hacks/config/phosphor.xml.h:7 hacks/config/piecewise.xml.h:9
-#: hacks/config/pipes.xml.h:15 hacks/config/polyhedra.xml.h:119
-#: hacks/config/polyominoes.xml.h:10 hacks/config/polytopes.xml.h:20
-#: hacks/config/pong.xml.h:4 hacks/config/popsquares.xml.h:5
-#: hacks/config/providence.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 hacks/config/rocks.xml.h:9
-#: hacks/config/rotor.xml.h:11 hacks/config/rubik.xml.h:9
-#: hacks/config/sballs.xml.h:13 hacks/config/shadebobs.xml.h:9
-#: hacks/config/sierpinski.xml.h:7 hacks/config/sierpinski3d.xml.h:8
-#: hacks/config/slidescreen.xml.h:6 hacks/config/slip.xml.h:7
-#: hacks/config/speedmine.xml.h:13 hacks/config/sphere.xml.h:5
-#: hacks/config/spheremonics.xml.h:19 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:4 hacks/config/superquadrics.xml.h:8
+#: hacks/config/pinion.xml.h:13 hacks/config/pipes.xml.h:15
+#: hacks/config/polyhedra.xml.h:119 hacks/config/polyominoes.xml.h:10
+#: hacks/config/polytopes.xml.h:20 hacks/config/pong.xml.h:4
+#: hacks/config/popsquares.xml.h:5 hacks/config/providence.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
+#: hacks/config/rocks.xml.h:9 hacks/config/rotor.xml.h:11
+#: hacks/config/rubik.xml.h:9 hacks/config/sballs.xml.h:13
+#: hacks/config/shadebobs.xml.h:9 hacks/config/sierpinski.xml.h:7
+#: hacks/config/sierpinski3d.xml.h:8 hacks/config/slidescreen.xml.h:6
+#: hacks/config/slip.xml.h:7 hacks/config/speedmine.xml.h:13
+#: hacks/config/sphere.xml.h:5 hacks/config/spheremonics.xml.h:19
+#: 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:4
+#: hacks/config/substrate.xml.h:10 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/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
@@ -1268,17 +1273,18 @@ msgstr "Медленно"
 #: hacks/config/engine.xml.h:16 hacks/config/epicycle.xml.h:11
 #: 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/engine.xml.h:16 hacks/config/epicycle.xml.h:11
 #: 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/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/fuzzyflakes.xml.h:17
-#: hacks/config/galaxy.xml.h:11 hacks/config/glblur.xml.h:17
-#: hacks/config/glforestfire.xml.h:15 hacks/config/glplanet.xml.h:10
-#: 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:11 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/fireworkx.xml.h:11 hacks/config/flag.xml.h:9
+#: hacks/config/flame.xml.h:15 hacks/config/flipflop.xml.h:7
+#: hacks/config/flipscreen3d.xml.h:7 hacks/config/flow.xml.h:12
+#: hacks/config/fluidballs.xml.h:20 hacks/config/forest.xml.h:6
+#: hacks/config/fuzzyflakes.xml.h:17 hacks/config/galaxy.xml.h:12
+#: hacks/config/glblur.xml.h:17 hacks/config/glforestfire.xml.h:15
+#: hacks/config/glplanet.xml.h:10 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:11
+#: 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/intermomentary.xml.h:5 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/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
@@ -1307,16 +1313,16 @@ msgstr "Медленно"
 #: 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/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/xplanet.xml.h:60 hacks/config/xrayswarm.xml.h:4
-#: hacks/config/zoom.xml.h:7
+#: hacks/config/strange.xml.h:5 hacks/config/substrate.xml.h:11
+#: 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/xplanet.xml.h:60
+#: hacks/config/xrayswarm.xml.h:4 hacks/config/zoom.xml.h:7
 msgid "Speed"
 msgstr "Скорость"
 
 msgid "Speed"
 msgstr "Скорость"
 
@@ -1359,8 +1365,8 @@ msgstr ""
 #: hacks/config/discrete.xml.h:11 hacks/config/drift.xml.h:14
 #: hacks/config/epicycle.xml.h:13 hacks/config/euler2d.xml.h:17
 #: hacks/config/fadeplot.xml.h:12 hacks/config/flag.xml.h:13
 #: hacks/config/discrete.xml.h:11 hacks/config/drift.xml.h:14
 #: hacks/config/epicycle.xml.h:13 hacks/config/euler2d.xml.h:17
 #: hacks/config/fadeplot.xml.h:12 hacks/config/flag.xml.h:13
-#: hacks/config/flame.xml.h:16 hacks/config/flow.xml.h:18
-#: hacks/config/forest.xml.h:8 hacks/config/galaxy.xml.h:13
+#: hacks/config/flame.xml.h:16 hacks/config/flow.xml.h:15
+#: hacks/config/forest.xml.h:8 hacks/config/galaxy.xml.h:14
 #: hacks/config/grav.xml.h:11 hacks/config/halo.xml.h:13
 #: hacks/config/hopalong.xml.h:25 hacks/config/ifs.xml.h:8
 #: hacks/config/imsmap.xml.h:15 hacks/config/interference.xml.h:19
 #: hacks/config/grav.xml.h:11 hacks/config/halo.xml.h:13
 #: hacks/config/hopalong.xml.h:25 hacks/config/ifs.xml.h:8
 #: hacks/config/imsmap.xml.h:15 hacks/config/interference.xml.h:19
@@ -1457,7 +1463,7 @@ msgstr ""
 #: 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/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/flag.xml.h:4 hacks/config/flow.xml.h:4
 #: hacks/config/fluidballs.xml.h:12 hacks/config/fuzzyflakes.xml.h:10
 #: 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/fluidballs.xml.h:12 hacks/config/fuzzyflakes.xml.h:10
 #: hacks/config/gleidescope.xml.h:7 hacks/config/halftone.xml.h:8
 #: hacks/config/hopalong.xml.h:13 hacks/config/interference.xml.h:11
@@ -1489,7 +1495,7 @@ msgstr ""
 #: 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/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/flag.xml.h:8 hacks/config/flow.xml.h:11
 #: hacks/config/fluidballs.xml.h:19 hacks/config/fuzzyflakes.xml.h:16
 #: 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/fluidballs.xml.h:19 hacks/config/fuzzyflakes.xml.h:16
 #: hacks/config/gleidescope.xml.h:12 hacks/config/halftone.xml.h:14
 #: hacks/config/hopalong.xml.h:22 hacks/config/interference.xml.h:18
@@ -1508,7 +1514,7 @@ msgstr ""
 
 #: 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/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/flag.xml.h:12 hacks/config/flow.xml.h:14
 #: hacks/config/lissie.xml.h:12 hacks/config/loop.xml.h:11
 #: hacks/config/rubik.xml.h:12 hacks/config/sierpinski.xml.h:11
 #: hacks/config/slip.xml.h:11
 #: hacks/config/lissie.xml.h:12 hacks/config/loop.xml.h:11
 #: hacks/config/rubik.xml.h:12 hacks/config/sierpinski.xml.h:11
 #: hacks/config/slip.xml.h:11
@@ -1558,13 +1564,14 @@ msgstr ""
 #: hacks/config/menger.xml.h:15 hacks/config/mirrorblob.xml.h:18
 #: hacks/config/moebius.xml.h:6 hacks/config/molecule.xml.h:21
 #: hacks/config/morph3d.xml.h:5 hacks/config/noof.xml.h:4
 #: hacks/config/menger.xml.h:15 hacks/config/mirrorblob.xml.h:18
 #: hacks/config/moebius.xml.h:6 hacks/config/molecule.xml.h:21
 #: hacks/config/morph3d.xml.h:5 hacks/config/noof.xml.h:4
-#: hacks/config/pipes.xml.h:14 hacks/config/polyhedra.xml.h:118
-#: hacks/config/polytopes.xml.h:18 hacks/config/providence.xml.h:4
-#: 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
+#: hacks/config/pinion.xml.h:12 hacks/config/pipes.xml.h:14
+#: hacks/config/polyhedra.xml.h:118 hacks/config/polytopes.xml.h:18
+#: hacks/config/providence.xml.h:4 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 "Показывать количество кадров в секунду"
 
 msgid "Show Frames-per-Second"
 msgstr "Показывать количество кадров в секунду"
 
@@ -1723,11 +1730,12 @@ msgstr "Скорость кита"
 #: hacks/config/lament.xml.h:9 hacks/config/lavalite.xml.h:32
 #: hacks/config/menger.xml.h:21 hacks/config/mirrorblob.xml.h:24
 #: hacks/config/moebius.xml.h:11 hacks/config/molecule.xml.h:26
 #: hacks/config/lament.xml.h:9 hacks/config/lavalite.xml.h:32
 #: hacks/config/menger.xml.h:21 hacks/config/mirrorblob.xml.h:24
 #: hacks/config/moebius.xml.h:11 hacks/config/molecule.xml.h:26
-#: hacks/config/polyhedra.xml.h:173 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
+#: hacks/config/pinion.xml.h:15 hacks/config/polyhedra.xml.h:173
+#: 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 "Каркасное изображение"
 
 msgid "Wireframe"
 msgstr "Каркасное изображение"
 
@@ -1815,14 +1823,15 @@ msgstr "Линии"
 #: 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/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/mismunch.xml.h:3
-#: 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 hacks/config/spheremonics.xml.h:7
+#: hacks/config/flow.xml.h:6 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/mismunch.xml.h:3 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
+#: hacks/config/spheremonics.xml.h:7 hacks/config/substrate.xml.h:6
 #: hacks/config/wander.xml.h:10 hacks/config/whirlwindwarp.xml.h:3
 msgid "Long"
 msgstr "Длинный"
 #: hacks/config/wander.xml.h:10 hacks/config/whirlwindwarp.xml.h:3
 msgid "Long"
 msgstr "Длинный"
@@ -1869,13 +1878,14 @@ msgstr ""
 #: 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/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/metaballs.xml.h:12 hacks/config/mismunch.xml.h:8
-#: 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/flow.xml.h:9 hacks/config/galaxy.xml.h:9
+#: hacks/config/klein.xml.h:5 hacks/config/laser.xml.h:9
+#: hacks/config/menger.xml.h:14 hacks/config/metaballs.xml.h:12
+#: hacks/config/mismunch.xml.h:8 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/substrate.xml.h:9
 #: hacks/config/wander.xml.h:12 hacks/config/whirlwindwarp.xml.h:6
 msgid "Short"
 msgstr "Короткий"
 #: hacks/config/wander.xml.h:12 hacks/config/whirlwindwarp.xml.h:6
 msgid "Short"
 msgstr "Короткий"
@@ -2075,10 +2085,10 @@ msgstr ""
 #: 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/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/polyhedra.xml.h:3 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/wormhole.xml.h:1
-#: hacks/config/xfishtank.xml.h:1
+#: hacks/config/pinion.xml.h:3 hacks/config/polyhedra.xml.h:3
+#: 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/wormhole.xml.h:1 hacks/config/xfishtank.xml.h:1
 msgid "Animation Speed"
 msgstr "Скорость анимации"
 
 msgid "Animation Speed"
 msgstr "Скорость анимации"
 
@@ -2158,8 +2168,9 @@ msgstr ""
 #: 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/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/starfish.xml.h:2 hacks/config/substrate.xml.h:1
+#: hacks/config/vidwhacker.xml.h:3 hacks/config/wander.xml.h:7
+#: hacks/config/xspirograph.xml.h:3
 msgid "Duration"
 msgstr "Продолжительность"
 
 msgid "Duration"
 msgstr "Продолжительность"
 
@@ -2408,7 +2419,7 @@ msgstr ""
 msgid "Rotate"
 msgstr ""
 
 msgid "Rotate"
 msgstr ""
 
-#: hacks/config/circuit.xml.h:8
+#: hacks/config/circuit.xml.h:8 hacks/config/pinion.xml.h:10
 msgid "Rotation Speed"
 msgstr ""
 
 msgid "Rotation Speed"
 msgstr ""
 
@@ -2493,11 +2504,12 @@ msgstr "1 секунда"
 msgid "Coral"
 msgstr ""
 
 msgid "Coral"
 msgstr ""
 
-#: hacks/config/coral.xml.h:4 hacks/config/gflux.xml.h:3
-#: hacks/config/glblur.xml.h:2 hacks/config/glmatrix.xml.h:3
-#: 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
+#: hacks/config/coral.xml.h:4 hacks/config/fireworkx.xml.h:2
+#: hacks/config/gflux.xml.h:3 hacks/config/glblur.xml.h:2
+#: hacks/config/glmatrix.xml.h:3 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
 msgid "Dense"
 msgstr "Плотно"
 
 msgid "Dense"
 msgstr "Плотно"
 
@@ -2510,12 +2522,12 @@ msgid ""
 "Simulates coral growth, albeit somewhat slowly. Written by Frederick Roeber."
 msgstr ""
 
 "Simulates coral growth, albeit somewhat slowly. Written by Frederick Roeber."
 msgstr ""
 
-#: hacks/config/coral.xml.h:13 hacks/config/gflux.xml.h:13
-#: hacks/config/glblur.xml.h:16 hacks/config/glmatrix.xml.h:19
-#: hacks/config/imsmap.xml.h:13 hacks/config/lavalite.xml.h:29
-#: hacks/config/pyro.xml.h:14 hacks/config/qix.xml.h:21
-#: hacks/config/squiral.xml.h:15 hacks/config/xearth.xml.h:24
-#: hacks/config/xmatrix.xml.h:17
+#: hacks/config/coral.xml.h:13 hacks/config/fireworkx.xml.h:10
+#: hacks/config/gflux.xml.h:13 hacks/config/glblur.xml.h:16
+#: hacks/config/glmatrix.xml.h:19 hacks/config/imsmap.xml.h:13
+#: hacks/config/lavalite.xml.h:29 hacks/config/pyro.xml.h:14
+#: hacks/config/qix.xml.h:21 hacks/config/squiral.xml.h:15
+#: hacks/config/xearth.xml.h:24 hacks/config/xmatrix.xml.h:17
 msgid "Sparse"
 msgstr "Редко"
 
 msgid "Sparse"
 msgstr "Редко"
 
@@ -2544,7 +2556,7 @@ msgid "Center on Screen"
 msgstr ""
 
 #: hacks/config/crystal.xml.h:2 hacks/config/deluxe.xml.h:1
 msgstr ""
 
 #: hacks/config/crystal.xml.h:2 hacks/config/deluxe.xml.h:1
-#: hacks/config/fadeplot.xml.h:1 hacks/config/flow.xml.h:3
+#: hacks/config/fadeplot.xml.h:1 hacks/config/flow.xml.h:1
 #: hacks/config/galaxy.xml.h:1 hacks/config/glforestfire.xml.h:1
 #: hacks/config/grav.xml.h:1 hacks/config/julia.xml.h:1
 #: hacks/config/laser.xml.h:1 hacks/config/lisa.xml.h:1
 #: hacks/config/galaxy.xml.h:1 hacks/config/glforestfire.xml.h:1
 #: hacks/config/grav.xml.h:1 hacks/config/julia.xml.h:1
 #: hacks/config/laser.xml.h:1 hacks/config/lisa.xml.h:1
@@ -3295,7 +3307,7 @@ msgstr ""
 msgid "Half"
 msgstr ""
 
 msgid "Half"
 msgstr ""
 
-#: hacks/config/fireflies.xml.h:17
+#: hacks/config/fireflies.xml.h:17 hacks/config/pinion.xml.h:7
 msgid "Huge"
 msgstr ""
 
 msgid "Huge"
 msgstr ""
 
@@ -3384,7 +3396,7 @@ msgstr ""
 msgid "Swarm tails glow"
 msgstr ""
 
 msgid "Swarm tails glow"
 msgstr ""
 
-#: hacks/config/fireflies.xml.h:43
+#: hacks/config/fireflies.xml.h:43 hacks/config/pinion.xml.h:14
 msgid "Tiny"
 msgstr ""
 
 msgid "Tiny"
 msgstr ""
 
@@ -3401,6 +3413,32 @@ msgstr ""
 msgid "Wind picks up"
 msgstr ""
 
 msgid "Wind picks up"
 msgstr ""
 
+#: hacks/config/fireworkx.xml.h:1 hacks/config/lavalite.xml.h:3
+msgid "Activity"
+msgstr "Активность"
+
+#: hacks/config/fireworkx.xml.h:4
+msgid "Fast Fade (more realistic)"
+msgstr ""
+
+#: hacks/config/fireworkx.xml.h:5
+#, fuzzy
+msgid "Fireworkx"
+msgstr "_Файл"
+
+#: hacks/config/fireworkx.xml.h:6
+msgid "Light effect"
+msgstr ""
+
+#: hacks/config/fireworkx.xml.h:7
+msgid "Pyrotechnics simulation eye-candy. Written by Rony B. Chandran."
+msgstr ""
+
+#: hacks/config/fireworkx.xml.h:8
+#, fuzzy
+msgid "Shoot"
+msgstr "Короткий"
+
 #: hacks/config/flag.xml.h:1
 msgid "Bitmap for Flag"
 msgstr ""
 #: hacks/config/flag.xml.h:1
 msgid "Bitmap for Flag"
 msgstr ""
@@ -3475,42 +3513,42 @@ msgid ""
 "around and deforms it in various ways. Written by Ben Buxton."
 msgstr ""
 
 "around and deforms it in various ways. Written by Ben Buxton."
 msgstr ""
 
-#: hacks/config/flow.xml.h:1
-msgid "Allow 2D Attractors"
+#: hacks/config/flow.xml.h:3
+msgid "Flow"
 msgstr ""
 
 msgstr ""
 
-#: hacks/config/flow.xml.h:2
-msgid ""
-"Another series of strange attractors: a flowing series of points, making "
-"strange rotational shapes. Written by Tim Auckland."
+#: hacks/config/flow.xml.h:5
+msgid "Length of trails"
 msgstr ""
 
 msgstr ""
 
-#: hacks/config/flow.xml.h:5
-msgid "Flow"
+#: hacks/config/flow.xml.h:13
+msgid ""
+"Strange attractors formed of flows in a 3D differential equation phase "
+"space. Written by Tim Auckland."
 msgstr ""
 
 msgstr ""
 
-#: hacks/config/flow.xml.h:6
-msgid "Freeze Some Bees"
+#: hacks/config/flow.xml.h:16
+msgid "turn on/off bounding box."
 msgstr ""
 
 msgstr ""
 
-#: hacks/config/flow.xml.h:10
-msgid "Ride a Trained Bee"
+#: hacks/config/flow.xml.h:17
+msgid "turn on/off double buffering."
 msgstr ""
 
 msgstr ""
 
-#: hacks/config/flow.xml.h:11
-msgid "Rotate Around Attractor"
+#: hacks/config/flow.xml.h:18
+msgid "turn on/off periodic attractors."
 msgstr ""
 
 msgstr ""
 
-#: hacks/config/flow.xml.h:12
-msgid "Show Bounding Box"
+#: hacks/config/flow.xml.h:19
+msgid "turn on/off ride in the flow."
 msgstr ""
 
 msgstr ""
 
-#: hacks/config/flow.xml.h:14
-msgid "Slow Bees with Antifreeze"
+#: hacks/config/flow.xml.h:20
+msgid "turn on/off rotating around attractor."
 msgstr ""
 
 msgstr ""
 
-#: hacks/config/flow.xml.h:19
-msgid "Zoom In and Out"
+#: hacks/config/flow.xml.h:21
+msgid "turn on/off search for new attractors."
 msgstr ""
 
 #: hacks/config/fluidballs.xml.h:1
 msgstr ""
 
 #: hacks/config/fluidballs.xml.h:1
@@ -3720,7 +3758,11 @@ msgstr ""
 msgid "Galaxy"
 msgstr ""
 
 msgid "Galaxy"
 msgstr ""
 
-#: hacks/config/galaxy.xml.h:9 hacks/config/lisa.xml.h:7
+#: hacks/config/galaxy.xml.h:8
+msgid "Rotate Viewpoint"
+msgstr ""
+
+#: hacks/config/galaxy.xml.h:10 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/pong.xml.h:3
 #: hacks/config/rotor.xml.h:10 hacks/config/rubik.xml.h:8
 #: hacks/config/lissie.xml.h:8 hacks/config/loop.xml.h:6
 #: hacks/config/penrose.xml.h:10 hacks/config/pong.xml.h:3
 #: hacks/config/rotor.xml.h:10 hacks/config/rubik.xml.h:8
@@ -3729,7 +3771,7 @@ msgstr ""
 msgid "Size"
 msgstr "Размер"
 
 msgid "Size"
 msgstr "Размер"
 
-#: hacks/config/galaxy.xml.h:12
+#: hacks/config/galaxy.xml.h:13
 msgid ""
 "This draws spinning galaxies, which then collide and scatter their stars to "
 "the, uh, four winds or something. Originally an Amiga program by Uli "
 msgid ""
 "This draws spinning galaxies, which then collide and scatter their stars to "
 "the, uh, four winds or something. Originally an Amiga program by Uli "
@@ -4033,9 +4075,9 @@ msgid ""
 "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 "
 "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."
+"of this window: the tab at the top of the *other* window.) 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
 msgstr ""
 
 #: hacks/config/glslideshow.xml.h:17
@@ -4563,6 +4605,27 @@ msgstr ""
 msgid "Wave Size"
 msgstr ""
 
 msgid "Wave Size"
 msgstr ""
 
+#: hacks/config/intermomentary.xml.h:2
+msgid "Intermomentary"
+msgstr ""
+
+#: hacks/config/intermomentary.xml.h:3
+#, fuzzy
+msgid "Number of Discs"
+msgstr "Количество цветов"
+
+#: hacks/config/intermomentary.xml.h:6
+msgid ""
+"The Intersection Momentary is a fun visualization defining the relationships "
+"between objects with Casey Reas, William Ngan, and Robert Hodgin. "
+"Commissioned for display at the Whitney Museum of American Art. A surface "
+"filled with 100 medium to small sized circles. Each circle has a different "
+"size and direction, but moves at the same slow rate. Display: A. The "
+"instantaneous intersections of the circles. B. The aggregate intersections "
+"of the circles. Ported to XScreensaver from the art project \"InterMomentary"
+"\" at http://www.complexification.net"
+msgstr ""
+
 #: hacks/config/jigglypuff.xml.h:2
 msgid "Chrome"
 msgstr ""
 #: hacks/config/jigglypuff.xml.h:2
 msgid "Chrome"
 msgstr ""
@@ -4787,10 +4850,6 @@ msgstr ""
 msgid "10"
 msgstr "100%"
 
 msgid "10"
 msgstr "100%"
 
-#: hacks/config/lavalite.xml.h:3
-msgid "Activity"
-msgstr "Активность"
-
 #: hacks/config/lavalite.xml.h:4
 msgid "Classic Lavalite"
 msgstr ""
 #: hacks/config/lavalite.xml.h:4
 msgid "Classic Lavalite"
 msgstr ""
@@ -5514,6 +5573,40 @@ msgid ""
 "invisibility at intersection points. Written by Geoffrey Irving."
 msgstr ""
 
 "invisibility at intersection points. Written by Geoffrey Irving."
 msgstr ""
 
+#: hacks/config/pinion.xml.h:1
+#, fuzzy
+msgid "100"
+msgstr "100%"
+
+#: hacks/config/pinion.xml.h:2
+msgid "2000"
+msgstr ""
+
+#: hacks/config/pinion.xml.h:4
+msgid ""
+"Draws an interconnected set of gears moving across the screen. Written by "
+"Jamie Zawinski."
+msgstr ""
+
+#: hacks/config/pinion.xml.h:6
+#, fuzzy
+msgid "Gear Size"
+msgstr "Размер сетки"
+
+#: hacks/config/pinion.xml.h:8
+msgid "Max RPM"
+msgstr ""
+
+#: hacks/config/pinion.xml.h:9
+#, fuzzy
+msgid "Pinion"
+msgstr "Длинный"
+
+#: hacks/config/pinion.xml.h:11
+#, fuzzy
+msgid "Scrolling Speed"
+msgstr "Скорость решения"
+
 #: hacks/config/pipes.xml.h:1
 msgid "Allow Tight Turns"
 msgstr ""
 #: hacks/config/pipes.xml.h:1
 msgid "Allow Tight Turns"
 msgstr ""
@@ -5540,7 +5633,8 @@ msgid ""
 "probably seen this GL hack. This version is by Marcelo Vianna."
 msgstr ""
 
 "probably seen this GL hack. This version is by Marcelo Vianna."
 msgstr ""
 
-#: hacks/config/pipes.xml.h:9 hacks/config/wormhole.xml.h:4
+#: hacks/config/pipes.xml.h:9 hacks/config/substrate.xml.h:7
+#: hacks/config/wormhole.xml.h:4
 msgid "Lots"
 msgstr ""
 
 msgid "Lots"
 msgstr ""
 
@@ -6748,22 +6842,26 @@ msgid "Ping subnet/30 (2 hosts)"
 msgstr ""
 
 #: hacks/config/sonar.xml.h:10
 msgstr ""
 
 #: hacks/config/sonar.xml.h:10
-msgid "Simulation Team Members"
+msgid "Resolve Host Names"
 msgstr ""
 
 #: hacks/config/sonar.xml.h:11
 msgstr ""
 
 #: hacks/config/sonar.xml.h:11
-msgid "Sonar"
+msgid "Simulation Team Members"
 msgstr ""
 
 #: hacks/config/sonar.xml.h:12
 msgstr ""
 
 #: hacks/config/sonar.xml.h:12
-msgid "Team A Name"
+msgid "Sonar"
 msgstr ""
 
 #: hacks/config/sonar.xml.h:13
 msgstr ""
 
 #: hacks/config/sonar.xml.h:13
-msgid "Team B Name"
+msgid "Team A Name"
 msgstr ""
 
 #: hacks/config/sonar.xml.h:14
 msgstr ""
 
 #: hacks/config/sonar.xml.h:14
+msgid "Team B Name"
+msgstr ""
+
+#: hacks/config/sonar.xml.h:15
 msgid ""
 "This program draws a simulation of a sonar screen. By default, it displays a "
 "random assortment of ``bogies'' on the screen, but if installed as \"setuid "
 msgid ""
 "This program draws a simulation of a sonar screen. By default, it displays a "
 "random assortment of ``bogies'' on the screen, but if installed as \"setuid "
@@ -6772,7 +6870,7 @@ msgid ""
 "Martin and Jamie Zawinski."
 msgstr ""
 
 "Martin and Jamie Zawinski."
 msgstr ""
 
-#: hacks/config/sonar.xml.h:15
+#: hacks/config/sonar.xml.h:16
 msgid "vs."
 msgstr ""
 
 msgid "vs."
 msgstr ""
 
@@ -7045,6 +7143,32 @@ msgid ""
 "Written by Massimino Pascal."
 msgstr ""
 
 "Written by Massimino Pascal."
 msgstr ""
 
+#: hacks/config/substrate.xml.h:4
+#, fuzzy
+msgid "Initial Cracks"
+msgstr "Плотность"
+
+#: hacks/config/substrate.xml.h:5
+msgid ""
+"Lines like crystals grow on a computational substrate. A simple "
+"perpendicular growth rule creates intricate city-like structures. By J. "
+"Tarbell and Mike Kershaw."
+msgstr ""
+
+#: hacks/config/substrate.xml.h:8
+#, fuzzy
+msgid "Sandgrains"
+msgstr "Стандартные"
+
+#: hacks/config/substrate.xml.h:12
+msgid "Substrate"
+msgstr ""
+
+#: hacks/config/substrate.xml.h:13
+#, fuzzy
+msgid "Wireframe only"
+msgstr "Каркасное изображение"
+
 #: hacks/config/superquadrics.xml.h:3
 msgid ""
 "Ed Mackey reports that he wrote the first version of this program in BASIC "
 #: hacks/config/superquadrics.xml.h:3
 msgid ""
 "Ed Mackey reports that he wrote the first version of this program in BASIC "
index 17a48962ae1722f121aa7c9fc2a140ef5ba98b84..f607b8ec42b03250bc2d9c753aa69b6fe7775b16 100644 (file)
--- a/po/sk.po
+++ b/po/sk.po
@@ -6,7 +6,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: xscreensaver\n"
 "Report-Msgid-Bugs-To: \n"
 msgstr ""
 "Project-Id-Version: xscreensaver\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2004-10-04 16:25+0200\n"
+"POT-Creation-Date: 2004-12-22 12:51+0100\n"
 "PO-Revision-Date: 2002-04-08 08:33+0200\n"
 "Last-Translator: Marcel Telka <marcel@telka.sk>\n"
 "Language-Team: Slovak <sk-i18n@lists.linux.sk>\n"
 "PO-Revision-Date: 2002-04-08 08:33+0200\n"
 "Last-Translator: Marcel Telka <marcel@telka.sk>\n"
 "Language-Team: Slovak <sk-i18n@lists.linux.sk>\n"
@@ -148,7 +148,7 @@ msgstr ""
 msgid "minutes"
 msgstr "minút"
 
 msgid "minutes"
 msgstr "minút"
 
-#: driver/demo-Gtk-widgets.c:482 driver/demo-Gtk.c:2845
+#: driver/demo-Gtk-widgets.c:482 driver/demo-Gtk.c:2852
 #: driver/xscreensaver-demo.glade.h:58
 #, fuzzy
 msgid "Preview"
 #: driver/xscreensaver-demo.glade.h:58
 #, fuzzy
 msgid "Preview"
@@ -196,12 +196,12 @@ msgstr "Len jeden 
 msgid "Random Screen Saver"
 msgstr "Náhodný ¹etriè obrazovky"
 
 msgid "Random Screen Saver"
 msgstr "Náhodný ¹etriè obrazovky"
 
-#: driver/demo-Gtk-widgets.c:571 driver/demo-Gtk.c:2134
+#: driver/demo-Gtk-widgets.c:571 driver/demo-Gtk.c:2141
 #: driver/xscreensaver-demo.glade.h:75
 msgid "Use"
 msgstr "Pou¾i»"
 
 #: driver/xscreensaver-demo.glade.h:75
 msgid "Use"
 msgstr "Pou¾i»"
 
-#: driver/demo-Gtk-widgets.c:591 driver/demo-Gtk.c:2144
+#: driver/demo-Gtk-widgets.c:591 driver/demo-Gtk.c:2151
 #: driver/xscreensaver-demo.glade.h:63
 msgid "Screen Saver"
 msgstr "©etriè obrazovky"
 #: driver/xscreensaver-demo.glade.h:63
 msgid "Screen Saver"
 msgstr "©etriè obrazovky"
@@ -446,7 +446,7 @@ msgid "Visual:"
 msgstr ""
 
 #: driver/demo-Gtk-widgets.c:1550 driver/demo-Gtk-widgets.c:1573
 msgstr ""
 
 #: driver/demo-Gtk-widgets.c:1550 driver/demo-Gtk-widgets.c:1573
-#: driver/demo-Gtk.c:1538 driver/demo-Gtk.c:2864
+#: driver/demo-Gtk.c:1545 driver/demo-Gtk.c:2871
 #: driver/xscreensaver-demo.glade.h:5 driver/xscreensaver-demo.glade2.h:3
 msgid "Any"
 msgstr "¥ubovoµný"
 #: driver/xscreensaver-demo.glade.h:5 driver/xscreensaver-demo.glade2.h:3
 msgid "Any"
 msgstr "¥ubovoµný"
@@ -549,7 +549,7 @@ msgstr "
 msgid "Back to the graphical configuration options."
 msgstr ""
 
 msgid "Back to the graphical configuration options."
 msgstr ""
 
-#: driver/demo-Gtk-widgets.c:1709 driver/demo-Gtk.c:741
+#: driver/demo-Gtk-widgets.c:1709 driver/demo-Gtk.c:748
 #: driver/xscreensaver-demo.glade.h:54
 msgid "OK"
 msgstr ""
 #: driver/xscreensaver-demo.glade.h:54
 msgid "OK"
 msgstr ""
@@ -559,18 +559,18 @@ msgstr ""
 msgid "Cancel"
 msgstr "Zmeny"
 
 msgid "Cancel"
 msgstr "Zmeny"
 
-#: driver/demo-Gtk.c:649
+#: driver/demo-Gtk.c:656
 msgid "For updates, check http://www.jwz.org/xscreensaver/"
 msgstr ""
 
 msgid "For updates, check http://www.jwz.org/xscreensaver/"
 msgstr ""
 
-#: driver/demo-Gtk.c:779
+#: driver/demo-Gtk.c:786
 msgid ""
 "Error:\n"
 "\n"
 "No Help URL has been specified.\n"
 msgstr ""
 
 msgid ""
 "Error:\n"
 "\n"
 "No Help URL has been specified.\n"
 msgstr ""
 
-#: driver/demo-Gtk.c:865
+#: driver/demo-Gtk.c:872
 msgid ""
 "Error:\n"
 "\n"
 msgid ""
 "Error:\n"
 "\n"
@@ -578,7 +578,7 @@ msgid ""
 "\n"
 msgstr ""
 
 "\n"
 msgstr ""
 
-#: driver/demo-Gtk.c:877
+#: driver/demo-Gtk.c:884
 msgid ""
 "You are running as root.  This usually means that xscreensaver\n"
 "was unable to contact your X server because access control is\n"
 msgid ""
 "You are running as root.  This usually means that xscreensaver\n"
 "was unable to contact your X server because access control is\n"
@@ -597,18 +597,18 @@ msgid ""
 "normal user, and `su' as necessary."
 msgstr ""
 
 "normal user, and `su' as necessary."
 msgstr ""
 
-#: driver/demo-Gtk.c:893
+#: driver/demo-Gtk.c:900
 msgid "Please check your $PATH and permissions."
 msgstr ""
 
 msgid "Please check your $PATH and permissions."
 msgstr ""
 
-#: driver/demo-Gtk.c:928
+#: driver/demo-Gtk.c:935
 msgid ""
 "Error:\n"
 "\n"
 "Couldn't determine init file name!\n"
 msgstr ""
 
 msgid ""
 "Error:\n"
 "\n"
 "Couldn't determine init file name!\n"
 msgstr ""
 
-#: driver/demo-Gtk.c:933
+#: driver/demo-Gtk.c:940
 #, c-format
 msgid ""
 "Error:\n"
 #, c-format
 msgid ""
 "Error:\n"
@@ -616,14 +616,14 @@ msgid ""
 "Couldn't write %s\n"
 msgstr ""
 
 "Couldn't write %s\n"
 msgstr ""
 
-#: driver/demo-Gtk.c:992
+#: driver/demo-Gtk.c:999
 msgid ""
 "Error:\n"
 "\n"
 "no `manualCommand' resource set."
 msgstr ""
 
 msgid ""
 "Error:\n"
 "\n"
 "no `manualCommand' resource set."
 msgstr ""
 
-#: driver/demo-Gtk.c:1173
+#: driver/demo-Gtk.c:1180
 #, c-format
 msgid ""
 "Error:\n"
 #, c-format
 msgid ""
 "Error:\n"
@@ -631,7 +631,7 @@ msgid ""
 "Unparsable time format: \"%s\"\n"
 msgstr ""
 
 "Unparsable time format: \"%s\"\n"
 msgstr ""
 
-#: driver/demo-Gtk.c:1829
+#: driver/demo-Gtk.c:1836
 #, c-format
 msgid ""
 "Error:\n"
 #, c-format
 msgid ""
 "Error:\n"
@@ -639,30 +639,30 @@ msgid ""
 "Directory does not exist: \"%s\"\n"
 msgstr ""
 
 "Directory does not exist: \"%s\"\n"
 msgstr ""
 
-#: driver/demo-Gtk.c:2546
+#: driver/demo-Gtk.c:2553
 msgid "Descriptions not available: no XML support compiled in."
 msgstr ""
 
 msgid "Descriptions not available: no XML support compiled in."
 msgstr ""
 
-#: driver/demo-Gtk.c:2551
+#: driver/demo-Gtk.c:2558
 msgid "No description available."
 msgstr ""
 
 msgid "No description available."
 msgstr ""
 
-#: driver/demo-Gtk.c:2816
+#: driver/demo-Gtk.c:2823
 #, fuzzy
 msgid "Blank Screen"
 msgstr "Len prázdna obrazovka"
 
 #, fuzzy
 msgid "Blank Screen"
 msgstr "Len prázdna obrazovka"
 
-#: driver/demo-Gtk.c:2822
+#: driver/demo-Gtk.c:2829
 #, fuzzy
 msgid "Screen Saver Disabled"
 msgstr "©etriè obrazovky"
 
 #, fuzzy
 msgid "Screen Saver Disabled"
 msgstr "©etriè obrazovky"
 
-#: driver/demo-Gtk.c:2855
+#: driver/demo-Gtk.c:2862
 #, c-format
 msgid "%s: %.100s Settings"
 msgstr ""
 
 #, c-format
 msgid "%s: %.100s Settings"
 msgstr ""
 
-#: driver/demo-Gtk.c:3010
+#: driver/demo-Gtk.c:3017
 #, c-format
 msgid ""
 "Warning:\n"
 #, c-format
 msgid ""
 "Warning:\n"
@@ -670,27 +670,27 @@ msgid ""
 "file \"%s\" has changed, reloading.\n"
 msgstr ""
 
 "file \"%s\" has changed, reloading.\n"
 msgstr ""
 
-#: driver/demo-Gtk.c:3092
+#: driver/demo-Gtk.c:3099
 #, fuzzy
 msgid "No Preview"
 msgstr "bez náhµadu"
 
 #, fuzzy
 msgid "No Preview"
 msgstr "bez náhµadu"
 
-#: driver/demo-Gtk.c:3092
+#: driver/demo-Gtk.c:3099
 #, fuzzy
 msgid "Available"
 msgstr ""
 "Náhµad nie je\n"
 "dostupný"
 
 #, fuzzy
 msgid "Available"
 msgstr ""
 "Náhµad nie je\n"
 "dostupný"
 
-#: driver/demo-Gtk.c:3093
+#: driver/demo-Gtk.c:3100
 msgid "Not"
 msgstr ""
 
 msgid "Not"
 msgstr ""
 
-#: driver/demo-Gtk.c:3093
+#: driver/demo-Gtk.c:3100
 msgid "Installed"
 msgstr ""
 
 msgid "Installed"
 msgstr ""
 
-#: driver/demo-Gtk.c:3858
+#: driver/demo-Gtk.c:3865
 #, c-format
 msgid ""
 "Warning:\n"
 #, c-format
 msgid ""
 "Warning:\n"
@@ -699,7 +699,7 @@ msgid ""
 "on display \"%s\".  Launch it now?"
 msgstr ""
 
 "on display \"%s\".  Launch it now?"
 msgstr ""
 
-#: driver/demo-Gtk.c:3868
+#: driver/demo-Gtk.c:3875
 #, c-format
 msgid ""
 "Warning:\n"
 #, c-format
 msgid ""
 "Warning:\n"
@@ -718,7 +718,7 @@ msgid ""
 "Restart the xscreensaver daemon now?\n"
 msgstr ""
 
 "Restart the xscreensaver daemon now?\n"
 msgstr ""
 
-#: driver/demo-Gtk.c:3893
+#: driver/demo-Gtk.c:3900
 #, c-format
 msgid ""
 "Warning:\n"
 #, c-format
 msgid ""
 "Warning:\n"
@@ -734,7 +734,7 @@ msgid ""
 "Restart the daemon on \"%s\" as \"%s\" now?\n"
 msgstr ""
 
 "Restart the daemon on \"%s\" as \"%s\" now?\n"
 msgstr ""
 
-#: driver/demo-Gtk.c:3915
+#: driver/demo-Gtk.c:3922
 #, c-format
 msgid ""
 "Warning:\n"
 #, c-format
 msgid ""
 "Warning:\n"
@@ -746,12 +746,12 @@ msgid ""
 "Restart the xscreensaver daemon now?\n"
 msgstr ""
 
 "Restart the xscreensaver daemon now?\n"
 msgstr ""
 
-#: driver/demo-Gtk.c:4372
+#: driver/demo-Gtk.c:4379
 #, c-format
 msgid "%s: unknown option: %s\n"
 msgstr ""
 
 #, c-format
 msgid "%s: unknown option: %s\n"
 msgstr ""
 
-#: driver/demo-Gtk.c:4436
+#: driver/demo-Gtk.c:4443
 #, fuzzy
 msgid "Screensaver Preferences"
 msgstr "©etriè obrazovky"
 #, fuzzy
 msgid "Screensaver Preferences"
 msgstr "©etriè obrazovky"
@@ -990,22 +990,23 @@ msgstr ""
 #: 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/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:5 hacks/config/flyingtoasters.xml.h:5
-#: hacks/config/fontglide.xml.h:4 hacks/config/forest.xml.h:1
-#: hacks/config/fuzzyflakes.xml.h:7 hacks/config/galaxy.xml.h:3
-#: hacks/config/gears.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:6
-#: 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/fadeplot.xml.h:4 hacks/config/fireworkx.xml.h:3
+#: 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:2 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/fuzzyflakes.xml.h:7
+#: hacks/config/galaxy.xml.h:3 hacks/config/gears.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:6 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/intermomentary.xml.h:1 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/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
@@ -1023,23 +1024,24 @@ msgstr ""
 #: hacks/config/pacman.xml.h:1 hacks/config/penetrate.xml.h:3
 #: hacks/config/penrose.xml.h:6 hacks/config/petri.xml.h:5
 #: hacks/config/phosphor.xml.h:4 hacks/config/piecewise.xml.h:4
 #: hacks/config/pacman.xml.h:1 hacks/config/penetrate.xml.h:3
 #: hacks/config/penrose.xml.h:6 hacks/config/petri.xml.h:5
 #: hacks/config/phosphor.xml.h:4 hacks/config/piecewise.xml.h:4
-#: hacks/config/pipes.xml.h:5 hacks/config/polyhedra.xml.h:18
-#: hacks/config/polyominoes.xml.h:2 hacks/config/polytopes.xml.h:11
-#: hacks/config/pong.xml.h:1 hacks/config/popsquares.xml.h:3
-#: hacks/config/providence.xml.h:2 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 hacks/config/rocks.xml.h:4
-#: hacks/config/rotor.xml.h:3 hacks/config/rubik.xml.h:3
-#: hacks/config/sballs.xml.h:4 hacks/config/shadebobs.xml.h:3
-#: hacks/config/sierpinski.xml.h:2 hacks/config/sierpinski3d.xml.h:2
-#: hacks/config/slidescreen.xml.h:2 hacks/config/slip.xml.h:2
-#: hacks/config/speedmine.xml.h:3 hacks/config/sphere.xml.h:2
-#: hacks/config/spheremonics.xml.h:5 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:1 hacks/config/superquadrics.xml.h:4
+#: hacks/config/pinion.xml.h:5 hacks/config/pipes.xml.h:5
+#: hacks/config/polyhedra.xml.h:18 hacks/config/polyominoes.xml.h:2
+#: hacks/config/polytopes.xml.h:11 hacks/config/pong.xml.h:1
+#: hacks/config/popsquares.xml.h:3 hacks/config/providence.xml.h:2
+#: 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
+#: hacks/config/rocks.xml.h:4 hacks/config/rotor.xml.h:3
+#: hacks/config/rubik.xml.h:3 hacks/config/sballs.xml.h:4
+#: hacks/config/shadebobs.xml.h:3 hacks/config/sierpinski.xml.h:2
+#: hacks/config/sierpinski3d.xml.h:2 hacks/config/slidescreen.xml.h:2
+#: hacks/config/slip.xml.h:2 hacks/config/speedmine.xml.h:3
+#: hacks/config/sphere.xml.h:2 hacks/config/spheremonics.xml.h:5
+#: 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:1
+#: hacks/config/substrate.xml.h:2 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/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
@@ -1061,8 +1063,9 @@ msgstr "R
 #: hacks/config/fuzzyflakes.xml.h:8 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/fuzzyflakes.xml.h:8 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/wormhole.xml.h:3 hacks/config/xfishtank.xml.h:4
+#: hacks/config/substrate.xml.h:3 hacks/config/thornbird.xml.h:3
+#: hacks/config/whirlwindwarp.xml.h:1 hacks/config/wormhole.xml.h:3
+#: hacks/config/xfishtank.xml.h:4
 msgid "Few"
 msgstr "Málo"
 
 msgid "Few"
 msgstr "Málo"
 
@@ -1078,7 +1081,7 @@ msgstr "M
 #: hacks/config/epicycle.xml.h:8 hacks/config/eruption.xml.h:12
 #: hacks/config/euler2d.xml.h:8 hacks/config/fadeplot.xml.h:6
 #: hacks/config/flag.xml.h:5 hacks/config/flame.xml.h:11
 #: hacks/config/epicycle.xml.h:8 hacks/config/eruption.xml.h:12
 #: hacks/config/euler2d.xml.h:8 hacks/config/fadeplot.xml.h:6
 #: hacks/config/flag.xml.h:5 hacks/config/flame.xml.h:11
-#: hacks/config/flow.xml.h:8 hacks/config/fluidballs.xml.h:13
+#: hacks/config/flow.xml.h:7 hacks/config/fluidballs.xml.h:13
 #: hacks/config/forest.xml.h:3 hacks/config/fuzzyflakes.xml.h:12
 #: 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/forest.xml.h:3 hacks/config/fuzzyflakes.xml.h:12
 #: hacks/config/galaxy.xml.h:6 hacks/config/grav.xml.h:4
 #: hacks/config/halo.xml.h:4 hacks/config/hopalong.xml.h:15
@@ -1116,7 +1119,7 @@ msgstr "Ve
 #: 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/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/flow.xml.h:8 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/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
@@ -1170,22 +1173,23 @@ msgstr ""
 #: 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/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/flyingtoasters.xml.h:11
-#: hacks/config/fontglide.xml.h:13 hacks/config/forest.xml.h:5
-#: hacks/config/fuzzyflakes.xml.h:15 hacks/config/galaxy.xml.h:10
-#: hacks/config/gears.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:8 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:10 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/fadeplot.xml.h:8 hacks/config/fireworkx.xml.h:9
+#: 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:10 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/fuzzyflakes.xml.h:15
+#: hacks/config/galaxy.xml.h:11 hacks/config/gears.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:8
+#: 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:10
+#: 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/intermomentary.xml.h:4 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/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
@@ -1203,23 +1207,24 @@ msgstr ""
 #: hacks/config/pacman.xml.h:5 hacks/config/penetrate.xml.h:6
 #: hacks/config/penrose.xml.h:11 hacks/config/petri.xml.h:23
 #: hacks/config/phosphor.xml.h:7 hacks/config/piecewise.xml.h:9
 #: hacks/config/pacman.xml.h:5 hacks/config/penetrate.xml.h:6
 #: hacks/config/penrose.xml.h:11 hacks/config/petri.xml.h:23
 #: hacks/config/phosphor.xml.h:7 hacks/config/piecewise.xml.h:9
-#: hacks/config/pipes.xml.h:15 hacks/config/polyhedra.xml.h:119
-#: hacks/config/polyominoes.xml.h:10 hacks/config/polytopes.xml.h:20
-#: hacks/config/pong.xml.h:4 hacks/config/popsquares.xml.h:5
-#: hacks/config/providence.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 hacks/config/rocks.xml.h:9
-#: hacks/config/rotor.xml.h:11 hacks/config/rubik.xml.h:9
-#: hacks/config/sballs.xml.h:13 hacks/config/shadebobs.xml.h:9
-#: hacks/config/sierpinski.xml.h:7 hacks/config/sierpinski3d.xml.h:8
-#: hacks/config/slidescreen.xml.h:6 hacks/config/slip.xml.h:7
-#: hacks/config/speedmine.xml.h:13 hacks/config/sphere.xml.h:5
-#: hacks/config/spheremonics.xml.h:19 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:4 hacks/config/superquadrics.xml.h:8
+#: hacks/config/pinion.xml.h:13 hacks/config/pipes.xml.h:15
+#: hacks/config/polyhedra.xml.h:119 hacks/config/polyominoes.xml.h:10
+#: hacks/config/polytopes.xml.h:20 hacks/config/pong.xml.h:4
+#: hacks/config/popsquares.xml.h:5 hacks/config/providence.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
+#: hacks/config/rocks.xml.h:9 hacks/config/rotor.xml.h:11
+#: hacks/config/rubik.xml.h:9 hacks/config/sballs.xml.h:13
+#: hacks/config/shadebobs.xml.h:9 hacks/config/sierpinski.xml.h:7
+#: hacks/config/sierpinski3d.xml.h:8 hacks/config/slidescreen.xml.h:6
+#: hacks/config/slip.xml.h:7 hacks/config/speedmine.xml.h:13
+#: hacks/config/sphere.xml.h:5 hacks/config/spheremonics.xml.h:19
+#: 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:4
+#: hacks/config/substrate.xml.h:10 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/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
@@ -1252,17 +1257,18 @@ msgstr "Pomaly"
 #: hacks/config/engine.xml.h:16 hacks/config/epicycle.xml.h:11
 #: 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/engine.xml.h:16 hacks/config/epicycle.xml.h:11
 #: 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/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/fuzzyflakes.xml.h:17
-#: hacks/config/galaxy.xml.h:11 hacks/config/glblur.xml.h:17
-#: hacks/config/glforestfire.xml.h:15 hacks/config/glplanet.xml.h:10
-#: 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:11 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/fireworkx.xml.h:11 hacks/config/flag.xml.h:9
+#: hacks/config/flame.xml.h:15 hacks/config/flipflop.xml.h:7
+#: hacks/config/flipscreen3d.xml.h:7 hacks/config/flow.xml.h:12
+#: hacks/config/fluidballs.xml.h:20 hacks/config/forest.xml.h:6
+#: hacks/config/fuzzyflakes.xml.h:17 hacks/config/galaxy.xml.h:12
+#: hacks/config/glblur.xml.h:17 hacks/config/glforestfire.xml.h:15
+#: hacks/config/glplanet.xml.h:10 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:11
+#: 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/intermomentary.xml.h:5 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/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
@@ -1291,16 +1297,16 @@ msgstr "Pomaly"
 #: 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/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/xplanet.xml.h:60 hacks/config/xrayswarm.xml.h:4
-#: hacks/config/zoom.xml.h:7
+#: hacks/config/strange.xml.h:5 hacks/config/substrate.xml.h:11
+#: 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/xplanet.xml.h:60
+#: hacks/config/xrayswarm.xml.h:4 hacks/config/zoom.xml.h:7
 msgid "Speed"
 msgstr "Rýchlos»"
 
 msgid "Speed"
 msgstr "Rýchlos»"
 
@@ -1343,8 +1349,8 @@ msgstr ""
 #: hacks/config/discrete.xml.h:11 hacks/config/drift.xml.h:14
 #: hacks/config/epicycle.xml.h:13 hacks/config/euler2d.xml.h:17
 #: hacks/config/fadeplot.xml.h:12 hacks/config/flag.xml.h:13
 #: hacks/config/discrete.xml.h:11 hacks/config/drift.xml.h:14
 #: hacks/config/epicycle.xml.h:13 hacks/config/euler2d.xml.h:17
 #: hacks/config/fadeplot.xml.h:12 hacks/config/flag.xml.h:13
-#: hacks/config/flame.xml.h:16 hacks/config/flow.xml.h:18
-#: hacks/config/forest.xml.h:8 hacks/config/galaxy.xml.h:13
+#: hacks/config/flame.xml.h:16 hacks/config/flow.xml.h:15
+#: hacks/config/forest.xml.h:8 hacks/config/galaxy.xml.h:14
 #: hacks/config/grav.xml.h:11 hacks/config/halo.xml.h:13
 #: hacks/config/hopalong.xml.h:25 hacks/config/ifs.xml.h:8
 #: hacks/config/imsmap.xml.h:15 hacks/config/interference.xml.h:19
 #: hacks/config/grav.xml.h:11 hacks/config/halo.xml.h:13
 #: hacks/config/hopalong.xml.h:25 hacks/config/ifs.xml.h:8
 #: hacks/config/imsmap.xml.h:15 hacks/config/interference.xml.h:19
@@ -1443,7 +1449,7 @@ msgstr "
 #: 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/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/flag.xml.h:4 hacks/config/flow.xml.h:4
 #: hacks/config/fluidballs.xml.h:12 hacks/config/fuzzyflakes.xml.h:10
 #: 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/fluidballs.xml.h:12 hacks/config/fuzzyflakes.xml.h:10
 #: hacks/config/gleidescope.xml.h:7 hacks/config/halftone.xml.h:8
 #: hacks/config/hopalong.xml.h:13 hacks/config/interference.xml.h:11
@@ -1475,7 +1481,7 @@ msgstr "
 #: 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/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/flag.xml.h:8 hacks/config/flow.xml.h:11
 #: hacks/config/fluidballs.xml.h:19 hacks/config/fuzzyflakes.xml.h:16
 #: 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/fluidballs.xml.h:19 hacks/config/fuzzyflakes.xml.h:16
 #: hacks/config/gleidescope.xml.h:12 hacks/config/halftone.xml.h:14
 #: hacks/config/hopalong.xml.h:22 hacks/config/interference.xml.h:18
@@ -1494,7 +1500,7 @@ msgstr "Trojuholn
 
 #: 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/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/flag.xml.h:12 hacks/config/flow.xml.h:14
 #: hacks/config/lissie.xml.h:12 hacks/config/loop.xml.h:11
 #: hacks/config/rubik.xml.h:12 hacks/config/sierpinski.xml.h:11
 #: hacks/config/slip.xml.h:11
 #: hacks/config/lissie.xml.h:12 hacks/config/loop.xml.h:11
 #: hacks/config/rubik.xml.h:12 hacks/config/sierpinski.xml.h:11
 #: hacks/config/slip.xml.h:11
@@ -1545,13 +1551,14 @@ msgstr ""
 #: hacks/config/menger.xml.h:15 hacks/config/mirrorblob.xml.h:18
 #: hacks/config/moebius.xml.h:6 hacks/config/molecule.xml.h:21
 #: hacks/config/morph3d.xml.h:5 hacks/config/noof.xml.h:4
 #: hacks/config/menger.xml.h:15 hacks/config/mirrorblob.xml.h:18
 #: hacks/config/moebius.xml.h:6 hacks/config/molecule.xml.h:21
 #: hacks/config/morph3d.xml.h:5 hacks/config/noof.xml.h:4
-#: hacks/config/pipes.xml.h:14 hacks/config/polyhedra.xml.h:118
-#: hacks/config/polytopes.xml.h:18 hacks/config/providence.xml.h:4
-#: 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
+#: hacks/config/pinion.xml.h:12 hacks/config/pipes.xml.h:14
+#: hacks/config/polyhedra.xml.h:118 hacks/config/polytopes.xml.h:18
+#: hacks/config/providence.xml.h:4 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 "Zobrazi» poèet obrázkov za sekundu"
 
 msgid "Show Frames-per-Second"
 msgstr "Zobrazi» poèet obrázkov za sekundu"
 
@@ -1711,11 +1718,12 @@ msgstr "R
 #: hacks/config/lament.xml.h:9 hacks/config/lavalite.xml.h:32
 #: hacks/config/menger.xml.h:21 hacks/config/mirrorblob.xml.h:24
 #: hacks/config/moebius.xml.h:11 hacks/config/molecule.xml.h:26
 #: hacks/config/lament.xml.h:9 hacks/config/lavalite.xml.h:32
 #: hacks/config/menger.xml.h:21 hacks/config/mirrorblob.xml.h:24
 #: hacks/config/moebius.xml.h:11 hacks/config/molecule.xml.h:26
-#: hacks/config/polyhedra.xml.h:173 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
+#: hacks/config/pinion.xml.h:15 hacks/config/polyhedra.xml.h:173
+#: 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 ""
 
 msgid "Wireframe"
 msgstr ""
 
@@ -1803,14 +1811,15 @@ msgstr "
 #: 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/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/mismunch.xml.h:3
-#: 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 hacks/config/spheremonics.xml.h:7
+#: hacks/config/flow.xml.h:6 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/mismunch.xml.h:3 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
+#: hacks/config/spheremonics.xml.h:7 hacks/config/substrate.xml.h:6
 #: hacks/config/wander.xml.h:10 hacks/config/whirlwindwarp.xml.h:3
 msgid "Long"
 msgstr "Dlhý"
 #: hacks/config/wander.xml.h:10 hacks/config/whirlwindwarp.xml.h:3
 msgid "Long"
 msgstr "Dlhý"
@@ -1857,13 +1866,14 @@ msgstr ""
 #: 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/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/metaballs.xml.h:12 hacks/config/mismunch.xml.h:8
-#: 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/flow.xml.h:9 hacks/config/galaxy.xml.h:9
+#: hacks/config/klein.xml.h:5 hacks/config/laser.xml.h:9
+#: hacks/config/menger.xml.h:14 hacks/config/metaballs.xml.h:12
+#: hacks/config/mismunch.xml.h:8 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/substrate.xml.h:9
 #: hacks/config/wander.xml.h:12 hacks/config/whirlwindwarp.xml.h:6
 msgid "Short"
 msgstr "Krátky"
 #: hacks/config/wander.xml.h:12 hacks/config/whirlwindwarp.xml.h:6
 msgid "Short"
 msgstr "Krátky"
@@ -2067,10 +2077,10 @@ msgstr ""
 #: 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/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/polyhedra.xml.h:3 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/wormhole.xml.h:1
-#: hacks/config/xfishtank.xml.h:1
+#: hacks/config/pinion.xml.h:3 hacks/config/polyhedra.xml.h:3
+#: 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/wormhole.xml.h:1 hacks/config/xfishtank.xml.h:1
 msgid "Animation Speed"
 msgstr "Rýchlos» animácie"
 
 msgid "Animation Speed"
 msgstr "Rýchlos» animácie"
 
@@ -2151,8 +2161,9 @@ msgstr ""
 #: 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/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/starfish.xml.h:2 hacks/config/substrate.xml.h:1
+#: hacks/config/vidwhacker.xml.h:3 hacks/config/wander.xml.h:7
+#: hacks/config/xspirograph.xml.h:3
 msgid "Duration"
 msgstr "Trvanie"
 
 msgid "Duration"
 msgstr "Trvanie"
 
@@ -2407,7 +2418,7 @@ msgstr "S
 msgid "Rotate"
 msgstr "Otáèa»"
 
 msgid "Rotate"
 msgstr "Otáèa»"
 
-#: hacks/config/circuit.xml.h:8
+#: hacks/config/circuit.xml.h:8 hacks/config/pinion.xml.h:10
 msgid "Rotation Speed"
 msgstr "Rýchlos» otáèania"
 
 msgid "Rotation Speed"
 msgstr "Rýchlos» otáèania"
 
@@ -2493,11 +2504,12 @@ msgstr "1 sekunda"
 msgid "Coral"
 msgstr "Koral"
 
 msgid "Coral"
 msgstr "Koral"
 
-#: hacks/config/coral.xml.h:4 hacks/config/gflux.xml.h:3
-#: hacks/config/glblur.xml.h:2 hacks/config/glmatrix.xml.h:3
-#: 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
+#: hacks/config/coral.xml.h:4 hacks/config/fireworkx.xml.h:2
+#: hacks/config/gflux.xml.h:3 hacks/config/glblur.xml.h:2
+#: hacks/config/glmatrix.xml.h:3 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
 msgid "Dense"
 msgstr "Husté"
 
 msgid "Dense"
 msgstr "Husté"
 
@@ -2513,12 +2525,12 @@ msgstr ""
 "Simuluje rast koralu, aj keï trocha pomaly. Tento obrázok to nerobí naozaj "
 "pravdivo. Napísal Frederick Roeber."
 
 "Simuluje rast koralu, aj keï trocha pomaly. Tento obrázok to nerobí naozaj "
 "pravdivo. Napísal 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
-#: hacks/config/imsmap.xml.h:13 hacks/config/lavalite.xml.h:29
-#: hacks/config/pyro.xml.h:14 hacks/config/qix.xml.h:21
-#: hacks/config/squiral.xml.h:15 hacks/config/xearth.xml.h:24
-#: hacks/config/xmatrix.xml.h:17
+#: hacks/config/coral.xml.h:13 hacks/config/fireworkx.xml.h:10
+#: hacks/config/gflux.xml.h:13 hacks/config/glblur.xml.h:16
+#: hacks/config/glmatrix.xml.h:19 hacks/config/imsmap.xml.h:13
+#: hacks/config/lavalite.xml.h:29 hacks/config/pyro.xml.h:14
+#: hacks/config/qix.xml.h:21 hacks/config/squiral.xml.h:15
+#: hacks/config/xearth.xml.h:24 hacks/config/xmatrix.xml.h:17
 msgid "Sparse"
 msgstr "Riedky"
 
 msgid "Sparse"
 msgstr "Riedky"
 
@@ -2550,7 +2562,7 @@ msgid "Center on Screen"
 msgstr ""
 
 #: hacks/config/crystal.xml.h:2 hacks/config/deluxe.xml.h:1
 msgstr ""
 
 #: hacks/config/crystal.xml.h:2 hacks/config/deluxe.xml.h:1
-#: hacks/config/fadeplot.xml.h:1 hacks/config/flow.xml.h:3
+#: hacks/config/fadeplot.xml.h:1 hacks/config/flow.xml.h:1
 #: hacks/config/galaxy.xml.h:1 hacks/config/glforestfire.xml.h:1
 #: hacks/config/grav.xml.h:1 hacks/config/julia.xml.h:1
 #: hacks/config/laser.xml.h:1 hacks/config/lisa.xml.h:1
 #: hacks/config/galaxy.xml.h:1 hacks/config/glforestfire.xml.h:1
 #: hacks/config/grav.xml.h:1 hacks/config/julia.xml.h:1
 #: hacks/config/laser.xml.h:1 hacks/config/lisa.xml.h:1
@@ -3313,7 +3325,7 @@ msgstr ""
 msgid "Half"
 msgstr ""
 
 msgid "Half"
 msgstr ""
 
-#: hacks/config/fireflies.xml.h:17
+#: hacks/config/fireflies.xml.h:17 hacks/config/pinion.xml.h:7
 #, fuzzy
 msgid "Huge"
 msgstr "Obrovské písmo"
 #, fuzzy
 msgid "Huge"
 msgstr "Obrovské písmo"
@@ -3409,7 +3421,7 @@ msgstr ""
 msgid "Swarm tails glow"
 msgstr ""
 
 msgid "Swarm tails glow"
 msgstr ""
 
-#: hacks/config/fireflies.xml.h:43
+#: hacks/config/fireflies.xml.h:43 hacks/config/pinion.xml.h:14
 #, fuzzy
 msgid "Tiny"
 msgstr "Tenký"
 #, fuzzy
 msgid "Tiny"
 msgstr "Tenký"
@@ -3428,6 +3440,32 @@ msgstr "Windows"
 msgid "Wind picks up"
 msgstr ""
 
 msgid "Wind picks up"
 msgstr ""
 
+#: hacks/config/fireworkx.xml.h:1 hacks/config/lavalite.xml.h:3
+msgid "Activity"
+msgstr ""
+
+#: hacks/config/fireworkx.xml.h:4
+msgid "Fast Fade (more realistic)"
+msgstr ""
+
+#: hacks/config/fireworkx.xml.h:5
+#, fuzzy
+msgid "Fireworkx"
+msgstr "_Súbor"
+
+#: hacks/config/fireworkx.xml.h:6
+msgid "Light effect"
+msgstr ""
+
+#: hacks/config/fireworkx.xml.h:7
+msgid "Pyrotechnics simulation eye-candy. Written by Rony B. Chandran."
+msgstr ""
+
+#: hacks/config/fireworkx.xml.h:8
+#, fuzzy
+msgid "Shoot"
+msgstr "Krátky"
+
 #: hacks/config/flag.xml.h:1
 msgid "Bitmap for Flag"
 msgstr ""
 #: hacks/config/flag.xml.h:1
 msgid "Bitmap for Flag"
 msgstr ""
@@ -3502,43 +3540,43 @@ msgid ""
 "around and deforms it in various ways. Written by Ben Buxton."
 msgstr ""
 
 "around and deforms it in various ways. Written by Ben Buxton."
 msgstr ""
 
-#: hacks/config/flow.xml.h:1
-msgid "Allow 2D Attractors"
+#: hacks/config/flow.xml.h:3
+msgid "Flow"
+msgstr "Tok"
+
+#: hacks/config/flow.xml.h:5
+msgid "Length of trails"
 msgstr ""
 
 msgstr ""
 
-#: hacks/config/flow.xml.h:2
+#: hacks/config/flow.xml.h:13
 msgid ""
 msgid ""
-"Another series of strange attractors: a flowing series of points, making "
-"strange rotational shapes. Written by Tim Auckland."
+"Strange attractors formed of flows in a 3D differential equation phase "
+"space. Written by Tim Auckland."
 msgstr ""
 
 msgstr ""
 
-#: hacks/config/flow.xml.h:5
-msgid "Flow"
-msgstr "Tok"
-
-#: hacks/config/flow.xml.h:6
-msgid "Freeze Some Bees"
+#: hacks/config/flow.xml.h:16
+msgid "turn on/off bounding box."
 msgstr ""
 
 msgstr ""
 
-#: hacks/config/flow.xml.h:10
-msgid "Ride a Trained Bee"
+#: hacks/config/flow.xml.h:17
+msgid "turn on/off double buffering."
 msgstr ""
 
 msgstr ""
 
-#: hacks/config/flow.xml.h:11
-msgid "Rotate Around Attractor"
+#: hacks/config/flow.xml.h:18
+msgid "turn on/off periodic attractors."
 msgstr ""
 
 msgstr ""
 
-#: hacks/config/flow.xml.h:12
-msgid "Show Bounding Box"
+#: hacks/config/flow.xml.h:19
+msgid "turn on/off ride in the flow."
 msgstr ""
 
 msgstr ""
 
-#: hacks/config/flow.xml.h:14
-msgid "Slow Bees with Antifreeze"
+#: hacks/config/flow.xml.h:20
+msgid "turn on/off rotating around attractor."
 msgstr ""
 
 msgstr ""
 
-#: hacks/config/flow.xml.h:19
-msgid "Zoom In and Out"
-msgstr "Zväè¹ova» a zmen¹ova»"
+#: hacks/config/flow.xml.h:21
+msgid "turn on/off search for new attractors."
+msgstr ""
 
 #: hacks/config/fluidballs.xml.h:1
 msgid "      Freefall"
 
 #: hacks/config/fluidballs.xml.h:1
 msgid "      Freefall"
@@ -3757,7 +3795,12 @@ msgstr "N
 msgid "Galaxy"
 msgstr "Galaxia"
 
 msgid "Galaxy"
 msgstr "Galaxia"
 
-#: hacks/config/galaxy.xml.h:9 hacks/config/lisa.xml.h:7
+#: hacks/config/galaxy.xml.h:8
+#, fuzzy
+msgid "Rotate Viewpoint"
+msgstr "Lineárny pohyb"
+
+#: hacks/config/galaxy.xml.h:10 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/pong.xml.h:3
 #: hacks/config/rotor.xml.h:10 hacks/config/rubik.xml.h:8
 #: hacks/config/lissie.xml.h:8 hacks/config/loop.xml.h:6
 #: hacks/config/penrose.xml.h:10 hacks/config/pong.xml.h:3
 #: hacks/config/rotor.xml.h:10 hacks/config/rubik.xml.h:8
@@ -3766,7 +3809,7 @@ msgstr "Galaxia"
 msgid "Size"
 msgstr "Veµkos»"
 
 msgid "Size"
 msgstr "Veµkos»"
 
-#: hacks/config/galaxy.xml.h:12
+#: hacks/config/galaxy.xml.h:13
 msgid ""
 "This draws spinning galaxies, which then collide and scatter their stars to "
 "the, uh, four winds or something. Originally an Amiga program by Uli "
 msgid ""
 "This draws spinning galaxies, which then collide and scatter their stars to "
 "the, uh, four winds or something. Originally an Amiga program by Uli "
@@ -4077,9 +4120,9 @@ msgid ""
 "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 "
 "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."
+"of this window: the tab at the top of the *other* window.) 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
 msgstr ""
 
 #: hacks/config/glslideshow.xml.h:17
@@ -4618,6 +4661,27 @@ msgstr "Po
 msgid "Wave Size"
 msgstr "Veµkos» vlny"
 
 msgid "Wave Size"
 msgstr "Veµkos» vlny"
 
+#: hacks/config/intermomentary.xml.h:2
+msgid "Intermomentary"
+msgstr ""
+
+#: hacks/config/intermomentary.xml.h:3
+#, fuzzy
+msgid "Number of Discs"
+msgstr "Poèet kru¾níc"
+
+#: hacks/config/intermomentary.xml.h:6
+msgid ""
+"The Intersection Momentary is a fun visualization defining the relationships "
+"between objects with Casey Reas, William Ngan, and Robert Hodgin. "
+"Commissioned for display at the Whitney Museum of American Art. A surface "
+"filled with 100 medium to small sized circles. Each circle has a different "
+"size and direction, but moves at the same slow rate. Display: A. The "
+"instantaneous intersections of the circles. B. The aggregate intersections "
+"of the circles. Ported to XScreensaver from the art project \"InterMomentary"
+"\" at http://www.complexification.net"
+msgstr ""
+
 #: hacks/config/jigglypuff.xml.h:2
 msgid "Chrome"
 msgstr ""
 #: hacks/config/jigglypuff.xml.h:2
 msgid "Chrome"
 msgstr ""
@@ -4840,10 +4904,6 @@ msgstr ""
 msgid "10"
 msgstr "1"
 
 msgid "10"
 msgstr "1"
 
-#: hacks/config/lavalite.xml.h:3
-msgid "Activity"
-msgstr ""
-
 #: hacks/config/lavalite.xml.h:4
 msgid "Classic Lavalite"
 msgstr ""
 #: hacks/config/lavalite.xml.h:4
 msgid "Classic Lavalite"
 msgstr ""
@@ -5572,6 +5632,40 @@ msgid ""
 "invisibility at intersection points. Written by Geoffrey Irving."
 msgstr ""
 
 "invisibility at intersection points. Written by Geoffrey Irving."
 msgstr ""
 
+#: hacks/config/pinion.xml.h:1
+#, fuzzy
+msgid "100"
+msgstr "100 %"
+
+#: hacks/config/pinion.xml.h:2
+msgid "2000"
+msgstr ""
+
+#: hacks/config/pinion.xml.h:4
+msgid ""
+"Draws an interconnected set of gears moving across the screen. Written by "
+"Jamie Zawinski."
+msgstr ""
+
+#: hacks/config/pinion.xml.h:6
+#, fuzzy
+msgid "Gear Size"
+msgstr "Veµkos» vlny"
+
+#: hacks/config/pinion.xml.h:8
+msgid "Max RPM"
+msgstr ""
+
+#: hacks/config/pinion.xml.h:9
+#, fuzzy
+msgid "Pinion"
+msgstr "Dlhý"
+
+#: hacks/config/pinion.xml.h:11
+#, fuzzy
+msgid "Scrolling Speed"
+msgstr "Rýchlos» rie¹enia"
+
 #: hacks/config/pipes.xml.h:1
 msgid "Allow Tight Turns"
 msgstr ""
 #: hacks/config/pipes.xml.h:1
 msgid "Allow Tight Turns"
 msgstr ""
@@ -5598,7 +5692,8 @@ msgid ""
 "probably seen this GL hack. This version is by Marcelo Vianna."
 msgstr ""
 
 "probably seen this GL hack. This version is by Marcelo Vianna."
 msgstr ""
 
-#: hacks/config/pipes.xml.h:9 hacks/config/wormhole.xml.h:4
+#: hacks/config/pipes.xml.h:9 hacks/config/substrate.xml.h:7
+#: hacks/config/wormhole.xml.h:4
 msgid "Lots"
 msgstr ""
 
 msgid "Lots"
 msgstr ""
 
@@ -6809,22 +6904,26 @@ msgid "Ping subnet/30 (2 hosts)"
 msgstr ""
 
 #: hacks/config/sonar.xml.h:10
 msgstr ""
 
 #: hacks/config/sonar.xml.h:10
-msgid "Simulation Team Members"
+msgid "Resolve Host Names"
 msgstr ""
 
 #: hacks/config/sonar.xml.h:11
 msgstr ""
 
 #: hacks/config/sonar.xml.h:11
-msgid "Sonar"
+msgid "Simulation Team Members"
 msgstr ""
 
 #: hacks/config/sonar.xml.h:12
 msgstr ""
 
 #: hacks/config/sonar.xml.h:12
+msgid "Sonar"
+msgstr ""
+
+#: hacks/config/sonar.xml.h:13
 msgid "Team A Name"
 msgstr "Názov tímu A"
 
 msgid "Team A Name"
 msgstr "Názov tímu A"
 
-#: hacks/config/sonar.xml.h:13
+#: hacks/config/sonar.xml.h:14
 msgid "Team B Name"
 msgstr "Názov tímu B"
 
 msgid "Team B Name"
 msgstr "Názov tímu B"
 
-#: hacks/config/sonar.xml.h:14
+#: hacks/config/sonar.xml.h:15
 msgid ""
 "This program draws a simulation of a sonar screen. By default, it displays a "
 "random assortment of ``bogies'' on the screen, but if installed as \"setuid "
 msgid ""
 "This program draws a simulation of a sonar screen. By default, it displays a "
 "random assortment of ``bogies'' on the screen, but if installed as \"setuid "
@@ -6833,7 +6932,7 @@ msgid ""
 "Martin and Jamie Zawinski."
 msgstr ""
 
 "Martin and Jamie Zawinski."
 msgstr ""
 
-#: hacks/config/sonar.xml.h:15
+#: hacks/config/sonar.xml.h:16
 msgid "vs."
 msgstr "vs."
 
 msgid "vs."
 msgstr "vs."
 
@@ -7107,6 +7206,32 @@ msgid ""
 "Written by Massimino Pascal."
 msgstr ""
 
 "Written by Massimino Pascal."
 msgstr ""
 
+#: hacks/config/substrate.xml.h:4
+#, fuzzy
+msgid "Initial Cracks"
+msgstr "Hustota"
+
+#: hacks/config/substrate.xml.h:5
+msgid ""
+"Lines like crystals grow on a computational substrate. A simple "
+"perpendicular growth rule creates intricate city-like structures. By J. "
+"Tarbell and Mike Kershaw."
+msgstr ""
+
+#: hacks/config/substrate.xml.h:8
+#, fuzzy
+msgid "Sandgrains"
+msgstr "©tandardné"
+
+#: hacks/config/substrate.xml.h:12
+#, fuzzy
+msgid "Substrate"
+msgstr "Stavy"
+
+#: hacks/config/substrate.xml.h:13
+msgid "Wireframe only"
+msgstr ""
+
 #: hacks/config/superquadrics.xml.h:3
 msgid ""
 "Ed Mackey reports that he wrote the first version of this program in BASIC "
 #: hacks/config/superquadrics.xml.h:3
 msgid ""
 "Ed Mackey reports that he wrote the first version of this program in BASIC "
@@ -8264,6 +8389,9 @@ msgstr ""
 "akoby pohµad cez viacero prekrývajúcich sa ¹o¹oviek namiesto jednoduchého "
 "zväè¹enia. Napísal James Macnicol."
 
 "akoby pohµad cez viacero prekrývajúcich sa ¹o¹oviek namiesto jednoduchého "
 "zväè¹enia. Napísal James Macnicol."
 
+#~ msgid "Zoom In and Out"
+#~ msgstr "Zväè¹ova» a zmen¹ova»"
+
 #~ msgid "PDB File"
 #~ msgstr "PDB súbor"
 
 #~ msgid "PDB File"
 #~ msgstr "PDB súbor"
 
index 0c07b1ad125ad63d3e170c4d8d300337ae2d92b1..6996033156b1bc320e0678557c2b7f85f1c345ce 100644 (file)
--- a/po/sv.po
+++ b/po/sv.po
@@ -3,13 +3,13 @@
 # Martin Wahlen <mva@sbbs.se>, 1998, 1999.
 # Christian Rose <menthos@menthos.com>, 2000, 2001, 2002.
 #
 # Martin Wahlen <mva@sbbs.se>, 1998, 1999.
 # Christian Rose <menthos@menthos.com>, 2000, 2001, 2002.
 #
-# $Id: sv.po,v 1.10 2004/10/25 15:41:04 jwz Exp $
+# $Id: sv.po,v 1.11 2005/01/11 23:48:16 jwz Exp $
 #
 msgid ""
 msgstr ""
 "Project-Id-Version: xscreensaver\n"
 "Report-Msgid-Bugs-To: \n"
 #
 msgid ""
 msgstr ""
 "Project-Id-Version: xscreensaver\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2004-10-04 16:25+0200\n"
+"POT-Creation-Date: 2004-12-22 12:51+0100\n"
 "PO-Revision-Date: 2002-07-22 00:55+0200\n"
 "Last-Translator: Christian Rose <menthos@menthos.com>\n"
 "Language-Team: Swedish <sv@li.org>\n"
 "PO-Revision-Date: 2002-07-22 00:55+0200\n"
 "Last-Translator: Christian Rose <menthos@menthos.com>\n"
 "Language-Team: Swedish <sv@li.org>\n"
@@ -151,7 +151,7 @@ msgstr "Hur lång tid som ska gå innan bildskärmen blir svart."
 msgid "minutes"
 msgstr "minuter"
 
 msgid "minutes"
 msgstr "minuter"
 
-#: driver/demo-Gtk-widgets.c:482 driver/demo-Gtk.c:2845
+#: driver/demo-Gtk-widgets.c:482 driver/demo-Gtk.c:2852
 #: driver/xscreensaver-demo.glade.h:58
 msgid "Preview"
 msgstr "Förhandsgranska"
 #: driver/xscreensaver-demo.glade.h:58
 msgid "Preview"
 msgstr "Förhandsgranska"
@@ -198,12 +198,12 @@ msgstr "Endast en skärmsläckare"
 msgid "Random Screen Saver"
 msgstr "Slumpmässig skärmsläckare"
 
 msgid "Random Screen Saver"
 msgstr "Slumpmässig skärmsläckare"
 
-#: driver/demo-Gtk-widgets.c:571 driver/demo-Gtk.c:2134
+#: driver/demo-Gtk-widgets.c:571 driver/demo-Gtk.c:2141
 #: driver/xscreensaver-demo.glade.h:75
 msgid "Use"
 msgstr "Använd"
 
 #: driver/xscreensaver-demo.glade.h:75
 msgid "Use"
 msgstr "Använd"
 
-#: driver/demo-Gtk-widgets.c:591 driver/demo-Gtk.c:2144
+#: driver/demo-Gtk-widgets.c:591 driver/demo-Gtk.c:2151
 #: driver/xscreensaver-demo.glade.h:63
 msgid "Screen Saver"
 msgstr "Skärmsläckare"
 #: driver/xscreensaver-demo.glade.h:63
 msgid "Screen Saver"
 msgstr "Skärmsläckare"
@@ -447,7 +447,7 @@ msgid "Visual:"
 msgstr "Grafikläge:"
 
 #: driver/demo-Gtk-widgets.c:1550 driver/demo-Gtk-widgets.c:1573
 msgstr "Grafikläge:"
 
 #: driver/demo-Gtk-widgets.c:1550 driver/demo-Gtk-widgets.c:1573
-#: driver/demo-Gtk.c:1538 driver/demo-Gtk.c:2864
+#: driver/demo-Gtk.c:1545 driver/demo-Gtk.c:2871
 #: driver/xscreensaver-demo.glade.h:5 driver/xscreensaver-demo.glade2.h:3
 msgid "Any"
 msgstr "Vilken som helst"
 #: driver/xscreensaver-demo.glade.h:5 driver/xscreensaver-demo.glade2.h:3
 msgid "Any"
 msgstr "Vilken som helst"
@@ -550,7 +550,7 @@ msgstr "Standardvärde <<"
 msgid "Back to the graphical configuration options."
 msgstr "Tillbaka till de grafiska konfigurationsalternativen."
 
 msgid "Back to the graphical configuration options."
 msgstr "Tillbaka till de grafiska konfigurationsalternativen."
 
-#: driver/demo-Gtk-widgets.c:1709 driver/demo-Gtk.c:741
+#: driver/demo-Gtk-widgets.c:1709 driver/demo-Gtk.c:748
 #: driver/xscreensaver-demo.glade.h:54
 msgid "OK"
 msgstr "OK"
 #: driver/xscreensaver-demo.glade.h:54
 msgid "OK"
 msgstr "OK"
@@ -559,11 +559,11 @@ msgstr "OK"
 msgid "Cancel"
 msgstr "Avbryt"
 
 msgid "Cancel"
 msgstr "Avbryt"
 
-#: driver/demo-Gtk.c:649
+#: driver/demo-Gtk.c:656
 msgid "For updates, check http://www.jwz.org/xscreensaver/"
 msgstr "Uppdateringar kan hittas på http://www.jwz.org/xscreensaver/"
 
 msgid "For updates, check http://www.jwz.org/xscreensaver/"
 msgstr "Uppdateringar kan hittas på http://www.jwz.org/xscreensaver/"
 
-#: driver/demo-Gtk.c:779
+#: driver/demo-Gtk.c:786
 msgid ""
 "Error:\n"
 "\n"
 msgid ""
 "Error:\n"
 "\n"
@@ -573,7 +573,7 @@ msgstr ""
 "\n"
 "Ingen hjälp-URL har angivits.\n"
 
 "\n"
 "Ingen hjälp-URL har angivits.\n"
 
-#: driver/demo-Gtk.c:865
+#: driver/demo-Gtk.c:872
 msgid ""
 "Error:\n"
 "\n"
 msgid ""
 "Error:\n"
 "\n"
@@ -585,7 +585,7 @@ msgstr ""
 "xscreensaver-demonen startade inte korrekt.\n"
 "\n"
 
 "xscreensaver-demonen startade inte korrekt.\n"
 "\n"
 
-#: driver/demo-Gtk.c:877
+#: driver/demo-Gtk.c:884
 msgid ""
 "You are running as root.  This usually means that xscreensaver\n"
 "was unable to contact your X server because access control is\n"
 msgid ""
 "You are running as root.  This usually means that xscreensaver\n"
 "was unable to contact your X server because access control is\n"
@@ -604,11 +604,11 @@ msgid ""
 "normal user, and `su' as necessary."
 msgstr ""
 
 "normal user, and `su' as necessary."
 msgstr ""
 
-#: driver/demo-Gtk.c:893
+#: driver/demo-Gtk.c:900
 msgid "Please check your $PATH and permissions."
 msgstr "Kontrollera din $PATH och rättigheterna."
 
 msgid "Please check your $PATH and permissions."
 msgstr "Kontrollera din $PATH och rättigheterna."
 
-#: driver/demo-Gtk.c:928
+#: driver/demo-Gtk.c:935
 msgid ""
 "Error:\n"
 "\n"
 msgid ""
 "Error:\n"
 "\n"
@@ -618,7 +618,7 @@ msgstr ""
 "\n"
 "Kunde inte avgöra init-filnamn!\n"
 
 "\n"
 "Kunde inte avgöra init-filnamn!\n"
 
-#: driver/demo-Gtk.c:933
+#: driver/demo-Gtk.c:940
 #, c-format
 msgid ""
 "Error:\n"
 #, c-format
 msgid ""
 "Error:\n"
@@ -629,7 +629,7 @@ msgstr ""
 "\n"
 "Kunde inte skriva %s\n"
 
 "\n"
 "Kunde inte skriva %s\n"
 
-#: driver/demo-Gtk.c:992
+#: driver/demo-Gtk.c:999
 msgid ""
 "Error:\n"
 "\n"
 msgid ""
 "Error:\n"
 "\n"
@@ -639,7 +639,7 @@ msgstr ""
 "\n"
 "ingen \"manualCommand\"-resurs har satts."
 
 "\n"
 "ingen \"manualCommand\"-resurs har satts."
 
-#: driver/demo-Gtk.c:1173
+#: driver/demo-Gtk.c:1180
 #, c-format
 msgid ""
 "Error:\n"
 #, c-format
 msgid ""
 "Error:\n"
@@ -650,7 +650,7 @@ msgstr ""
 "\n"
 "Otolkningsbart tidsformat: \"%s\"\n"
 
 "\n"
 "Otolkningsbart tidsformat: \"%s\"\n"
 
-#: driver/demo-Gtk.c:1829
+#: driver/demo-Gtk.c:1836
 #, c-format
 msgid ""
 "Error:\n"
 #, c-format
 msgid ""
 "Error:\n"
@@ -661,28 +661,28 @@ msgstr ""
 "\n"
 "Katalogen finns inte: \"%s\"\n"
 
 "\n"
 "Katalogen finns inte: \"%s\"\n"
 
-#: driver/demo-Gtk.c:2546
+#: driver/demo-Gtk.c:2553
 msgid "Descriptions not available: no XML support compiled in."
 msgstr "Beskrivningar är inte tillgängliga: inget XML-stöd är inkompilerat."
 
 msgid "Descriptions not available: no XML support compiled in."
 msgstr "Beskrivningar är inte tillgängliga: inget XML-stöd är inkompilerat."
 
-#: driver/demo-Gtk.c:2551
+#: driver/demo-Gtk.c:2558
 msgid "No description available."
 msgstr "Ingen beskrivning finns tillgänglig."
 
 msgid "No description available."
 msgstr "Ingen beskrivning finns tillgänglig."
 
-#: driver/demo-Gtk.c:2816
+#: driver/demo-Gtk.c:2823
 msgid "Blank Screen"
 msgstr "Tom skärm"
 
 msgid "Blank Screen"
 msgstr "Tom skärm"
 
-#: driver/demo-Gtk.c:2822
+#: driver/demo-Gtk.c:2829
 msgid "Screen Saver Disabled"
 msgstr "Skärmsläckare inaktiverad"
 
 msgid "Screen Saver Disabled"
 msgstr "Skärmsläckare inaktiverad"
 
-#: driver/demo-Gtk.c:2855
+#: driver/demo-Gtk.c:2862
 #, c-format
 msgid "%s: %.100s Settings"
 msgstr ""
 
 #, c-format
 msgid "%s: %.100s Settings"
 msgstr ""
 
-#: driver/demo-Gtk.c:3010
+#: driver/demo-Gtk.c:3017
 #, c-format
 msgid ""
 "Warning:\n"
 #, c-format
 msgid ""
 "Warning:\n"
@@ -693,23 +693,23 @@ msgstr ""
 "\n"
 "filen \"%s\" har ändrats, läser om.\n"
 
 "\n"
 "filen \"%s\" har ändrats, läser om.\n"
 
-#: driver/demo-Gtk.c:3092
+#: driver/demo-Gtk.c:3099
 msgid "No Preview"
 msgstr "Ingen förhandsvisning"
 
 msgid "No Preview"
 msgstr "Ingen förhandsvisning"
 
-#: driver/demo-Gtk.c:3092
+#: driver/demo-Gtk.c:3099
 msgid "Available"
 msgstr "Tillgängliga"
 
 msgid "Available"
 msgstr "Tillgängliga"
 
-#: driver/demo-Gtk.c:3093
+#: driver/demo-Gtk.c:3100
 msgid "Not"
 msgstr ""
 
 msgid "Not"
 msgstr ""
 
-#: driver/demo-Gtk.c:3093
+#: driver/demo-Gtk.c:3100
 msgid "Installed"
 msgstr ""
 
 msgid "Installed"
 msgstr ""
 
-#: driver/demo-Gtk.c:3858
+#: driver/demo-Gtk.c:3865
 #, c-format
 msgid ""
 "Warning:\n"
 #, c-format
 msgid ""
 "Warning:\n"
@@ -722,7 +722,7 @@ msgstr ""
 "XScreenSaver-demonen verkar inte köras på display\n"
 "\"%s\". Starta den nu?"
 
 "XScreenSaver-demonen verkar inte köras på display\n"
 "\"%s\". Starta den nu?"
 
-#: driver/demo-Gtk.c:3868
+#: driver/demo-Gtk.c:3875
 #, c-format
 msgid ""
 "Warning:\n"
 #, c-format
 msgid ""
 "Warning:\n"
@@ -741,7 +741,7 @@ msgid ""
 "Restart the xscreensaver daemon now?\n"
 msgstr ""
 
 "Restart the xscreensaver daemon now?\n"
 msgstr ""
 
-#: driver/demo-Gtk.c:3893
+#: driver/demo-Gtk.c:3900
 #, c-format
 msgid ""
 "Warning:\n"
 #, c-format
 msgid ""
 "Warning:\n"
@@ -757,7 +757,7 @@ msgid ""
 "Restart the daemon on \"%s\" as \"%s\" now?\n"
 msgstr ""
 
 "Restart the daemon on \"%s\" as \"%s\" now?\n"
 msgstr ""
 
-#: driver/demo-Gtk.c:3915
+#: driver/demo-Gtk.c:3922
 #, c-format
 msgid ""
 "Warning:\n"
 #, c-format
 msgid ""
 "Warning:\n"
@@ -769,12 +769,12 @@ msgid ""
 "Restart the xscreensaver daemon now?\n"
 msgstr ""
 
 "Restart the xscreensaver daemon now?\n"
 msgstr ""
 
-#: driver/demo-Gtk.c:4372
+#: driver/demo-Gtk.c:4379
 #, c-format
 msgid "%s: unknown option: %s\n"
 msgstr "%s: okänd flagga: %s\n"
 
 #, c-format
 msgid "%s: unknown option: %s\n"
 msgstr "%s: okänd flagga: %s\n"
 
-#: driver/demo-Gtk.c:4436
+#: driver/demo-Gtk.c:4443
 #, fuzzy
 msgid "Screensaver Preferences"
 msgstr "Bakgrundsegenskaper"
 #, fuzzy
 msgid "Screensaver Preferences"
 msgstr "Bakgrundsegenskaper"
@@ -999,22 +999,23 @@ msgstr ""
 #: 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/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:5 hacks/config/flyingtoasters.xml.h:5
-#: hacks/config/fontglide.xml.h:4 hacks/config/forest.xml.h:1
-#: hacks/config/fuzzyflakes.xml.h:7 hacks/config/galaxy.xml.h:3
-#: hacks/config/gears.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:6
-#: 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/fadeplot.xml.h:4 hacks/config/fireworkx.xml.h:3
+#: 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:2 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/fuzzyflakes.xml.h:7
+#: hacks/config/galaxy.xml.h:3 hacks/config/gears.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:6 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/intermomentary.xml.h:1 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/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
@@ -1032,23 +1033,24 @@ msgstr ""
 #: hacks/config/pacman.xml.h:1 hacks/config/penetrate.xml.h:3
 #: hacks/config/penrose.xml.h:6 hacks/config/petri.xml.h:5
 #: hacks/config/phosphor.xml.h:4 hacks/config/piecewise.xml.h:4
 #: hacks/config/pacman.xml.h:1 hacks/config/penetrate.xml.h:3
 #: hacks/config/penrose.xml.h:6 hacks/config/petri.xml.h:5
 #: hacks/config/phosphor.xml.h:4 hacks/config/piecewise.xml.h:4
-#: hacks/config/pipes.xml.h:5 hacks/config/polyhedra.xml.h:18
-#: hacks/config/polyominoes.xml.h:2 hacks/config/polytopes.xml.h:11
-#: hacks/config/pong.xml.h:1 hacks/config/popsquares.xml.h:3
-#: hacks/config/providence.xml.h:2 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 hacks/config/rocks.xml.h:4
-#: hacks/config/rotor.xml.h:3 hacks/config/rubik.xml.h:3
-#: hacks/config/sballs.xml.h:4 hacks/config/shadebobs.xml.h:3
-#: hacks/config/sierpinski.xml.h:2 hacks/config/sierpinski3d.xml.h:2
-#: hacks/config/slidescreen.xml.h:2 hacks/config/slip.xml.h:2
-#: hacks/config/speedmine.xml.h:3 hacks/config/sphere.xml.h:2
-#: hacks/config/spheremonics.xml.h:5 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:1 hacks/config/superquadrics.xml.h:4
+#: hacks/config/pinion.xml.h:5 hacks/config/pipes.xml.h:5
+#: hacks/config/polyhedra.xml.h:18 hacks/config/polyominoes.xml.h:2
+#: hacks/config/polytopes.xml.h:11 hacks/config/pong.xml.h:1
+#: hacks/config/popsquares.xml.h:3 hacks/config/providence.xml.h:2
+#: 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
+#: hacks/config/rocks.xml.h:4 hacks/config/rotor.xml.h:3
+#: hacks/config/rubik.xml.h:3 hacks/config/sballs.xml.h:4
+#: hacks/config/shadebobs.xml.h:3 hacks/config/sierpinski.xml.h:2
+#: hacks/config/sierpinski3d.xml.h:2 hacks/config/slidescreen.xml.h:2
+#: hacks/config/slip.xml.h:2 hacks/config/speedmine.xml.h:3
+#: hacks/config/sphere.xml.h:2 hacks/config/spheremonics.xml.h:5
+#: 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:1
+#: hacks/config/substrate.xml.h:2 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/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
@@ -1070,8 +1072,9 @@ msgstr "Snabb"
 #: hacks/config/fuzzyflakes.xml.h:8 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/fuzzyflakes.xml.h:8 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/wormhole.xml.h:3 hacks/config/xfishtank.xml.h:4
+#: hacks/config/substrate.xml.h:3 hacks/config/thornbird.xml.h:3
+#: hacks/config/whirlwindwarp.xml.h:1 hacks/config/wormhole.xml.h:3
+#: hacks/config/xfishtank.xml.h:4
 msgid "Few"
 msgstr "Få"
 
 msgid "Few"
 msgstr "Få"
 
@@ -1087,7 +1090,7 @@ msgstr "Få"
 #: hacks/config/epicycle.xml.h:8 hacks/config/eruption.xml.h:12
 #: hacks/config/euler2d.xml.h:8 hacks/config/fadeplot.xml.h:6
 #: hacks/config/flag.xml.h:5 hacks/config/flame.xml.h:11
 #: hacks/config/epicycle.xml.h:8 hacks/config/eruption.xml.h:12
 #: hacks/config/euler2d.xml.h:8 hacks/config/fadeplot.xml.h:6
 #: hacks/config/flag.xml.h:5 hacks/config/flame.xml.h:11
-#: hacks/config/flow.xml.h:8 hacks/config/fluidballs.xml.h:13
+#: hacks/config/flow.xml.h:7 hacks/config/fluidballs.xml.h:13
 #: hacks/config/forest.xml.h:3 hacks/config/fuzzyflakes.xml.h:12
 #: 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/forest.xml.h:3 hacks/config/fuzzyflakes.xml.h:12
 #: hacks/config/galaxy.xml.h:6 hacks/config/grav.xml.h:4
 #: hacks/config/halo.xml.h:4 hacks/config/hopalong.xml.h:15
@@ -1125,7 +1128,7 @@ msgstr "Många"
 #: 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/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/flow.xml.h:8 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/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
@@ -1179,22 +1182,23 @@ msgstr ""
 #: 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/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/flyingtoasters.xml.h:11
-#: hacks/config/fontglide.xml.h:13 hacks/config/forest.xml.h:5
-#: hacks/config/fuzzyflakes.xml.h:15 hacks/config/galaxy.xml.h:10
-#: hacks/config/gears.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:8 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:10 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/fadeplot.xml.h:8 hacks/config/fireworkx.xml.h:9
+#: 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:10 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/fuzzyflakes.xml.h:15
+#: hacks/config/galaxy.xml.h:11 hacks/config/gears.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:8
+#: 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:10
+#: 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/intermomentary.xml.h:4 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/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
@@ -1212,23 +1216,24 @@ msgstr ""
 #: hacks/config/pacman.xml.h:5 hacks/config/penetrate.xml.h:6
 #: hacks/config/penrose.xml.h:11 hacks/config/petri.xml.h:23
 #: hacks/config/phosphor.xml.h:7 hacks/config/piecewise.xml.h:9
 #: hacks/config/pacman.xml.h:5 hacks/config/penetrate.xml.h:6
 #: hacks/config/penrose.xml.h:11 hacks/config/petri.xml.h:23
 #: hacks/config/phosphor.xml.h:7 hacks/config/piecewise.xml.h:9
-#: hacks/config/pipes.xml.h:15 hacks/config/polyhedra.xml.h:119
-#: hacks/config/polyominoes.xml.h:10 hacks/config/polytopes.xml.h:20
-#: hacks/config/pong.xml.h:4 hacks/config/popsquares.xml.h:5
-#: hacks/config/providence.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 hacks/config/rocks.xml.h:9
-#: hacks/config/rotor.xml.h:11 hacks/config/rubik.xml.h:9
-#: hacks/config/sballs.xml.h:13 hacks/config/shadebobs.xml.h:9
-#: hacks/config/sierpinski.xml.h:7 hacks/config/sierpinski3d.xml.h:8
-#: hacks/config/slidescreen.xml.h:6 hacks/config/slip.xml.h:7
-#: hacks/config/speedmine.xml.h:13 hacks/config/sphere.xml.h:5
-#: hacks/config/spheremonics.xml.h:19 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:4 hacks/config/superquadrics.xml.h:8
+#: hacks/config/pinion.xml.h:13 hacks/config/pipes.xml.h:15
+#: hacks/config/polyhedra.xml.h:119 hacks/config/polyominoes.xml.h:10
+#: hacks/config/polytopes.xml.h:20 hacks/config/pong.xml.h:4
+#: hacks/config/popsquares.xml.h:5 hacks/config/providence.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
+#: hacks/config/rocks.xml.h:9 hacks/config/rotor.xml.h:11
+#: hacks/config/rubik.xml.h:9 hacks/config/sballs.xml.h:13
+#: hacks/config/shadebobs.xml.h:9 hacks/config/sierpinski.xml.h:7
+#: hacks/config/sierpinski3d.xml.h:8 hacks/config/slidescreen.xml.h:6
+#: hacks/config/slip.xml.h:7 hacks/config/speedmine.xml.h:13
+#: hacks/config/sphere.xml.h:5 hacks/config/spheremonics.xml.h:19
+#: 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:4
+#: hacks/config/substrate.xml.h:10 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/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
@@ -1261,17 +1266,18 @@ msgstr "Långsam"
 #: hacks/config/engine.xml.h:16 hacks/config/epicycle.xml.h:11
 #: 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/engine.xml.h:16 hacks/config/epicycle.xml.h:11
 #: 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/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/fuzzyflakes.xml.h:17
-#: hacks/config/galaxy.xml.h:11 hacks/config/glblur.xml.h:17
-#: hacks/config/glforestfire.xml.h:15 hacks/config/glplanet.xml.h:10
-#: 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:11 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/fireworkx.xml.h:11 hacks/config/flag.xml.h:9
+#: hacks/config/flame.xml.h:15 hacks/config/flipflop.xml.h:7
+#: hacks/config/flipscreen3d.xml.h:7 hacks/config/flow.xml.h:12
+#: hacks/config/fluidballs.xml.h:20 hacks/config/forest.xml.h:6
+#: hacks/config/fuzzyflakes.xml.h:17 hacks/config/galaxy.xml.h:12
+#: hacks/config/glblur.xml.h:17 hacks/config/glforestfire.xml.h:15
+#: hacks/config/glplanet.xml.h:10 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:11
+#: 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/intermomentary.xml.h:5 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/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
@@ -1300,16 +1306,16 @@ msgstr "Långsam"
 #: 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/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/xplanet.xml.h:60 hacks/config/xrayswarm.xml.h:4
-#: hacks/config/zoom.xml.h:7
+#: hacks/config/strange.xml.h:5 hacks/config/substrate.xml.h:11
+#: 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/xplanet.xml.h:60
+#: hacks/config/xrayswarm.xml.h:4 hacks/config/zoom.xml.h:7
 msgid "Speed"
 msgstr "Hastighet"
 
 msgid "Speed"
 msgstr "Hastighet"
 
@@ -1353,8 +1359,8 @@ msgstr "Mushastighet:"
 #: hacks/config/discrete.xml.h:11 hacks/config/drift.xml.h:14
 #: hacks/config/epicycle.xml.h:13 hacks/config/euler2d.xml.h:17
 #: hacks/config/fadeplot.xml.h:12 hacks/config/flag.xml.h:13
 #: hacks/config/discrete.xml.h:11 hacks/config/drift.xml.h:14
 #: hacks/config/epicycle.xml.h:13 hacks/config/euler2d.xml.h:17
 #: hacks/config/fadeplot.xml.h:12 hacks/config/flag.xml.h:13
-#: hacks/config/flame.xml.h:16 hacks/config/flow.xml.h:18
-#: hacks/config/forest.xml.h:8 hacks/config/galaxy.xml.h:13
+#: hacks/config/flame.xml.h:16 hacks/config/flow.xml.h:15
+#: hacks/config/forest.xml.h:8 hacks/config/galaxy.xml.h:14
 #: hacks/config/grav.xml.h:11 hacks/config/halo.xml.h:13
 #: hacks/config/hopalong.xml.h:25 hacks/config/ifs.xml.h:8
 #: hacks/config/imsmap.xml.h:15 hacks/config/interference.xml.h:19
 #: hacks/config/grav.xml.h:11 hacks/config/halo.xml.h:13
 #: hacks/config/hopalong.xml.h:25 hacks/config/ifs.xml.h:8
 #: hacks/config/imsmap.xml.h:15 hacks/config/interference.xml.h:19
@@ -1462,7 +1468,7 @@ msgstr "Fyrsidiga celler"
 #: 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/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/flag.xml.h:4 hacks/config/flow.xml.h:4
 #: hacks/config/fluidballs.xml.h:12 hacks/config/fuzzyflakes.xml.h:10
 #: 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/fluidballs.xml.h:12 hacks/config/fuzzyflakes.xml.h:10
 #: hacks/config/gleidescope.xml.h:7 hacks/config/halftone.xml.h:8
 #: hacks/config/hopalong.xml.h:13 hacks/config/interference.xml.h:11
@@ -1496,7 +1502,7 @@ msgstr "Sexsidiga celler"
 #: 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/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/flag.xml.h:8 hacks/config/flow.xml.h:11
 #: hacks/config/fluidballs.xml.h:19 hacks/config/fuzzyflakes.xml.h:16
 #: 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/fluidballs.xml.h:19 hacks/config/fuzzyflakes.xml.h:16
 #: hacks/config/gleidescope.xml.h:12 hacks/config/halftone.xml.h:14
 #: hacks/config/hopalong.xml.h:22 hacks/config/interference.xml.h:18
@@ -1515,7 +1521,7 @@ msgstr "Tresidiga celler"
 
 #: 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/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/flag.xml.h:12 hacks/config/flow.xml.h:14
 #: hacks/config/lissie.xml.h:12 hacks/config/loop.xml.h:11
 #: hacks/config/rubik.xml.h:12 hacks/config/sierpinski.xml.h:11
 #: hacks/config/slip.xml.h:11
 #: hacks/config/lissie.xml.h:12 hacks/config/loop.xml.h:11
 #: hacks/config/rubik.xml.h:12 hacks/config/sierpinski.xml.h:11
 #: hacks/config/slip.xml.h:11
@@ -1566,13 +1572,14 @@ msgstr ""
 #: hacks/config/menger.xml.h:15 hacks/config/mirrorblob.xml.h:18
 #: hacks/config/moebius.xml.h:6 hacks/config/molecule.xml.h:21
 #: hacks/config/morph3d.xml.h:5 hacks/config/noof.xml.h:4
 #: hacks/config/menger.xml.h:15 hacks/config/mirrorblob.xml.h:18
 #: hacks/config/moebius.xml.h:6 hacks/config/molecule.xml.h:21
 #: hacks/config/morph3d.xml.h:5 hacks/config/noof.xml.h:4
-#: hacks/config/pipes.xml.h:14 hacks/config/polyhedra.xml.h:118
-#: hacks/config/polytopes.xml.h:18 hacks/config/providence.xml.h:4
-#: 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
+#: hacks/config/pinion.xml.h:12 hacks/config/pipes.xml.h:14
+#: hacks/config/polyhedra.xml.h:118 hacks/config/polytopes.xml.h:18
+#: hacks/config/providence.xml.h:4 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 ""
 
 msgid "Show Frames-per-Second"
 msgstr ""
 
@@ -1743,11 +1750,12 @@ msgstr "Hastighet"
 #: hacks/config/lament.xml.h:9 hacks/config/lavalite.xml.h:32
 #: hacks/config/menger.xml.h:21 hacks/config/mirrorblob.xml.h:24
 #: hacks/config/moebius.xml.h:11 hacks/config/molecule.xml.h:26
 #: hacks/config/lament.xml.h:9 hacks/config/lavalite.xml.h:32
 #: hacks/config/menger.xml.h:21 hacks/config/mirrorblob.xml.h:24
 #: hacks/config/moebius.xml.h:11 hacks/config/molecule.xml.h:26
-#: hacks/config/polyhedra.xml.h:173 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
+#: hacks/config/pinion.xml.h:15 hacks/config/polyhedra.xml.h:173
+#: 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 ""
 
 msgid "Wireframe"
 msgstr ""
 
@@ -1839,14 +1847,15 @@ msgstr "Linjer"
 #: 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/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/mismunch.xml.h:3
-#: 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 hacks/config/spheremonics.xml.h:7
+#: hacks/config/flow.xml.h:6 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/mismunch.xml.h:3 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
+#: hacks/config/spheremonics.xml.h:7 hacks/config/substrate.xml.h:6
 #: hacks/config/wander.xml.h:10 hacks/config/whirlwindwarp.xml.h:3
 msgid "Long"
 msgstr "Lång"
 #: hacks/config/wander.xml.h:10 hacks/config/whirlwindwarp.xml.h:3
 msgid "Long"
 msgstr "Lång"
@@ -1894,13 +1903,14 @@ msgstr "_Tröskel:"
 #: 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/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/metaballs.xml.h:12 hacks/config/mismunch.xml.h:8
-#: 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/flow.xml.h:9 hacks/config/galaxy.xml.h:9
+#: hacks/config/klein.xml.h:5 hacks/config/laser.xml.h:9
+#: hacks/config/menger.xml.h:14 hacks/config/metaballs.xml.h:12
+#: hacks/config/mismunch.xml.h:8 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/substrate.xml.h:9
 #: hacks/config/wander.xml.h:12 hacks/config/whirlwindwarp.xml.h:6
 msgid "Short"
 msgstr "Kort"
 #: hacks/config/wander.xml.h:12 hacks/config/whirlwindwarp.xml.h:6
 msgid "Short"
 msgstr "Kort"
@@ -2119,10 +2129,10 @@ msgstr ""
 #: 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/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/polyhedra.xml.h:3 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/wormhole.xml.h:1
-#: hacks/config/xfishtank.xml.h:1
+#: hacks/config/pinion.xml.h:3 hacks/config/polyhedra.xml.h:3
+#: 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/wormhole.xml.h:1 hacks/config/xfishtank.xml.h:1
 msgid "Animation Speed"
 msgstr ""
 
 msgid "Animation Speed"
 msgstr ""
 
@@ -2203,8 +2213,9 @@ msgstr ""
 #: 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/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/starfish.xml.h:2 hacks/config/substrate.xml.h:1
+#: hacks/config/vidwhacker.xml.h:3 hacks/config/wander.xml.h:7
+#: hacks/config/xspirograph.xml.h:3
 #, fuzzy
 msgid "Duration"
 msgstr "Längd (ms)"
 #, fuzzy
 msgid "Duration"
 msgstr "Längd (ms)"
@@ -2483,7 +2494,7 @@ msgstr "Kugghjul"
 msgid "Rotate"
 msgstr ""
 
 msgid "Rotate"
 msgstr ""
 
-#: hacks/config/circuit.xml.h:8
+#: hacks/config/circuit.xml.h:8 hacks/config/pinion.xml.h:10
 msgid "Rotation Speed"
 msgstr ""
 
 msgid "Rotation Speed"
 msgstr ""
 
@@ -2576,11 +2587,12 @@ msgstr "Sekunder"
 msgid "Coral"
 msgstr "Korall"
 
 msgid "Coral"
 msgstr "Korall"
 
-#: hacks/config/coral.xml.h:4 hacks/config/gflux.xml.h:3
-#: hacks/config/glblur.xml.h:2 hacks/config/glmatrix.xml.h:3
-#: 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
+#: hacks/config/coral.xml.h:4 hacks/config/fireworkx.xml.h:2
+#: hacks/config/gflux.xml.h:3 hacks/config/glblur.xml.h:2
+#: hacks/config/glmatrix.xml.h:3 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 "Tätare"
 #, fuzzy
 msgid "Dense"
 msgstr "Tätare"
@@ -2597,12 +2609,12 @@ msgstr ""
 "Simulerar tillväxt av koraller, även om det är långsamt. Denna bild gör det "
 "egentligen ingen rättvisa. Skriven av Frederick Roeber."
 
 "Simulerar tillväxt av koraller, även om det är långsamt. Denna bild gör det "
 "egentligen ingen rättvisa. Skriven av 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
-#: hacks/config/imsmap.xml.h:13 hacks/config/lavalite.xml.h:29
-#: hacks/config/pyro.xml.h:14 hacks/config/qix.xml.h:21
-#: hacks/config/squiral.xml.h:15 hacks/config/xearth.xml.h:24
-#: hacks/config/xmatrix.xml.h:17
+#: hacks/config/coral.xml.h:13 hacks/config/fireworkx.xml.h:10
+#: hacks/config/gflux.xml.h:13 hacks/config/glblur.xml.h:16
+#: hacks/config/glmatrix.xml.h:19 hacks/config/imsmap.xml.h:13
+#: hacks/config/lavalite.xml.h:29 hacks/config/pyro.xml.h:14
+#: hacks/config/qix.xml.h:21 hacks/config/squiral.xml.h:15
+#: hacks/config/xearth.xml.h:24 hacks/config/xmatrix.xml.h:17
 #, fuzzy
 msgid "Sparse"
 msgstr "Sfär"
 #, fuzzy
 msgid "Sparse"
 msgstr "Sfär"
@@ -2639,7 +2651,7 @@ msgid "Center on Screen"
 msgstr "Partiklar på skärmen"
 
 #: hacks/config/crystal.xml.h:2 hacks/config/deluxe.xml.h:1
 msgstr "Partiklar på skärmen"
 
 #: hacks/config/crystal.xml.h:2 hacks/config/deluxe.xml.h:1
-#: hacks/config/fadeplot.xml.h:1 hacks/config/flow.xml.h:3
+#: hacks/config/fadeplot.xml.h:1 hacks/config/flow.xml.h:1
 #: hacks/config/galaxy.xml.h:1 hacks/config/glforestfire.xml.h:1
 #: hacks/config/grav.xml.h:1 hacks/config/julia.xml.h:1
 #: hacks/config/laser.xml.h:1 hacks/config/lisa.xml.h:1
 #: hacks/config/galaxy.xml.h:1 hacks/config/glforestfire.xml.h:1
 #: hacks/config/grav.xml.h:1 hacks/config/julia.xml.h:1
 #: hacks/config/laser.xml.h:1 hacks/config/lisa.xml.h:1
@@ -3474,7 +3486,7 @@ msgstr "Redigera filkategori"
 msgid "Half"
 msgstr "Gloria"
 
 msgid "Half"
 msgstr "Gloria"
 
-#: hacks/config/fireflies.xml.h:17
+#: hacks/config/fireflies.xml.h:17 hacks/config/pinion.xml.h:7
 #, fuzzy
 msgid "Huge"
 msgstr "Typsnitt"
 #, fuzzy
 msgid "Huge"
 msgstr "Typsnitt"
@@ -3570,7 +3582,7 @@ msgstr ""
 msgid "Swarm tails glow"
 msgstr ""
 
 msgid "Swarm tails glow"
 msgstr ""
 
-#: hacks/config/fireflies.xml.h:43
+#: hacks/config/fireflies.xml.h:43 hacks/config/pinion.xml.h:14
 #, fuzzy
 msgid "Tiny"
 msgstr "Tunn"
 #, fuzzy
 msgid "Tiny"
 msgstr "Tunn"
@@ -3589,6 +3601,33 @@ msgstr "Windows"
 msgid "Wind picks up"
 msgstr ""
 
 msgid "Wind picks up"
 msgstr ""
 
+#: hacks/config/fireworkx.xml.h:1 hacks/config/lavalite.xml.h:3
+msgid "Activity"
+msgstr ""
+
+#: hacks/config/fireworkx.xml.h:4
+msgid "Fast Fade (more realistic)"
+msgstr ""
+
+#: hacks/config/fireworkx.xml.h:5
+#, fuzzy
+msgid "Fireworkx"
+msgstr "_Arkiv"
+
+#: hacks/config/fireworkx.xml.h:6
+#, fuzzy
+msgid "Light effect"
+msgstr "Blixt"
+
+#: hacks/config/fireworkx.xml.h:7
+msgid "Pyrotechnics simulation eye-candy. Written by Rony B. Chandran."
+msgstr ""
+
+#: hacks/config/fireworkx.xml.h:8
+#, fuzzy
+msgid "Shoot"
+msgstr "Kort"
+
 #: hacks/config/flag.xml.h:1
 msgid "Bitmap for Flag"
 msgstr "Flaggbild"
 #: hacks/config/flag.xml.h:1
 msgid "Bitmap for Flag"
 msgstr "Flaggbild"
@@ -3670,45 +3709,47 @@ msgid ""
 "around and deforms it in various ways. Written by Ben Buxton."
 msgstr ""
 
 "around and deforms it in various ways. Written by Ben Buxton."
 msgstr ""
 
-#: hacks/config/flow.xml.h:1
-msgid "Allow 2D Attractors"
-msgstr ""
+#: hacks/config/flow.xml.h:3
+msgid "Flow"
+msgstr "Flöde"
+
+#: hacks/config/flow.xml.h:5
+#, fuzzy
+msgid "Length of trails"
+msgstr "Spårlängd"
 
 
-#: hacks/config/flow.xml.h:2
+#: hacks/config/flow.xml.h:13
 #, fuzzy
 msgid ""
 #, fuzzy
 msgid ""
-"Another series of strange attractors: a flowing series of points, making "
-"strange rotational shapes. Written by Tim Auckland."
+"Strange attractors formed of flows in a 3D differential equation phase "
+"space. Written by Tim Auckland."
 msgstr ""
 "Ytterligare en serie med konstiga blickfång: en flödande serie med punkter, "
 "som bildar konstiga roterande former. Skriven av Jeff Bufferworth."
 
 msgstr ""
 "Ytterligare en serie med konstiga blickfång: en flödande serie med punkter, "
 "som bildar konstiga roterande former. Skriven av Jeff Bufferworth."
 
-#: hacks/config/flow.xml.h:5
-msgid "Flow"
-msgstr "Flöde"
-
-#: hacks/config/flow.xml.h:6
-msgid "Freeze Some Bees"
+#: hacks/config/flow.xml.h:16
+msgid "turn on/off bounding box."
 msgstr ""
 
 msgstr ""
 
-#: hacks/config/flow.xml.h:10
-msgid "Ride a Trained Bee"
-msgstr ""
+#: hacks/config/flow.xml.h:17
+#, fuzzy
+msgid "turn on/off double buffering."
+msgstr "Använd inte dubbelbuffring"
 
 
-#: hacks/config/flow.xml.h:11
-msgid "Rotate Around Attractor"
+#: hacks/config/flow.xml.h:18
+msgid "turn on/off periodic attractors."
 msgstr ""
 
 msgstr ""
 
-#: hacks/config/flow.xml.h:12
-msgid "Show Bounding Box"
+#: hacks/config/flow.xml.h:19
+msgid "turn on/off ride in the flow."
 msgstr ""
 
 msgstr ""
 
-#: hacks/config/flow.xml.h:14
-msgid "Slow Bees with Antifreeze"
+#: hacks/config/flow.xml.h:20
+msgid "turn on/off rotating around attractor."
 msgstr ""
 
 msgstr ""
 
-#: hacks/config/flow.xml.h:19
-msgid "Zoom In and Out"
+#: hacks/config/flow.xml.h:21
+msgid "turn on/off search for new attractors."
 msgstr ""
 
 #: hacks/config/fluidballs.xml.h:1
 msgstr ""
 
 #: hacks/config/fluidballs.xml.h:1
@@ -3936,7 +3977,12 @@ msgstr "Rörelsehastighet"
 msgid "Galaxy"
 msgstr "Galax"
 
 msgid "Galaxy"
 msgstr "Galax"
 
-#: hacks/config/galaxy.xml.h:9 hacks/config/lisa.xml.h:7
+#: hacks/config/galaxy.xml.h:8
+#, fuzzy
+msgid "Rotate Viewpoint"
+msgstr "_Rörelse"
+
+#: hacks/config/galaxy.xml.h:10 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/pong.xml.h:3
 #: hacks/config/rotor.xml.h:10 hacks/config/rubik.xml.h:8
 #: hacks/config/lissie.xml.h:8 hacks/config/loop.xml.h:6
 #: hacks/config/penrose.xml.h:10 hacks/config/pong.xml.h:3
 #: hacks/config/rotor.xml.h:10 hacks/config/rubik.xml.h:8
@@ -3946,7 +3992,7 @@ msgstr "Galax"
 msgid "Size"
 msgstr "Storlek:"
 
 msgid "Size"
 msgstr "Storlek:"
 
-#: hacks/config/galaxy.xml.h:12
+#: hacks/config/galaxy.xml.h:13
 msgid ""
 "This draws spinning galaxies, which then collide and scatter their stars to "
 "the, uh, four winds or something. Originally an Amiga program by Uli "
 msgid ""
 "This draws spinning galaxies, which then collide and scatter their stars to "
 "the, uh, four winds or something. Originally an Amiga program by Uli "
@@ -4279,9 +4325,9 @@ msgid ""
 "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 "
 "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."
+"of this window: the tab at the top of the *other* window.) 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
 msgstr ""
 
 #: hacks/config/glslideshow.xml.h:17
@@ -4847,6 +4893,27 @@ msgstr "Antal frön"
 msgid "Wave Size"
 msgstr "Spara fil"
 
 msgid "Wave Size"
 msgstr "Spara fil"
 
+#: hacks/config/intermomentary.xml.h:2
+msgid "Intermomentary"
+msgstr ""
+
+#: hacks/config/intermomentary.xml.h:3
+#, fuzzy
+msgid "Number of Discs"
+msgstr "Antal cykler"
+
+#: hacks/config/intermomentary.xml.h:6
+msgid ""
+"The Intersection Momentary is a fun visualization defining the relationships "
+"between objects with Casey Reas, William Ngan, and Robert Hodgin. "
+"Commissioned for display at the Whitney Museum of American Art. A surface "
+"filled with 100 medium to small sized circles. Each circle has a different "
+"size and direction, but moves at the same slow rate. Display: A. The "
+"instantaneous intersections of the circles. B. The aggregate intersections "
+"of the circles. Ported to XScreensaver from the art project \"InterMomentary"
+"\" at http://www.complexification.net"
+msgstr ""
+
 #: hacks/config/jigglypuff.xml.h:2
 #, fuzzy
 msgid "Chrome"
 #: hacks/config/jigglypuff.xml.h:2
 #, fuzzy
 msgid "Chrome"
@@ -5077,10 +5144,6 @@ msgstr ""
 msgid "10"
 msgstr ""
 
 msgid "10"
 msgstr ""
 
-#: hacks/config/lavalite.xml.h:3
-msgid "Activity"
-msgstr ""
-
 #: hacks/config/lavalite.xml.h:4
 msgid "Classic Lavalite"
 msgstr ""
 #: hacks/config/lavalite.xml.h:4
 msgid "Classic Lavalite"
 msgstr ""
@@ -5861,6 +5924,43 @@ msgid ""
 "invisibility at intersection points. Written by Geoffrey Irving."
 msgstr ""
 
 "invisibility at intersection points. Written by Geoffrey Irving."
 msgstr ""
 
+#: hacks/config/pinion.xml.h:1
+msgid "100"
+msgstr ""
+
+#: hacks/config/pinion.xml.h:2
+msgid "2000"
+msgstr ""
+
+#: hacks/config/pinion.xml.h:4
+#, fuzzy
+msgid ""
+"Draws an interconnected set of gears moving across the screen. Written by "
+"Jamie Zawinski."
+msgstr ""
+"Detta genererar upprepade spiraliserande strängkonstlade mönster. Skriven av "
+"Jamie Zawinski."
+
+#: hacks/config/pinion.xml.h:6
+#, fuzzy
+msgid "Gear Size"
+msgstr "Labyrint"
+
+#: hacks/config/pinion.xml.h:8
+#, fuzzy
+msgid "Max RPM"
+msgstr "Huvudinställningar"
+
+#: hacks/config/pinion.xml.h:9
+#, fuzzy
+msgid "Pinion"
+msgstr "Paket"
+
+#: hacks/config/pinion.xml.h:11
+#, fuzzy
+msgid "Scrolling Speed"
+msgstr "Hastighet"
+
 #: hacks/config/pipes.xml.h:1
 msgid "Allow Tight Turns"
 msgstr ""
 #: hacks/config/pipes.xml.h:1
 msgid "Allow Tight Turns"
 msgstr ""
@@ -5891,7 +5991,8 @@ msgstr ""
 "Om du har varit i samma rum som en Windows NT-maskin har du troligtvis sett "
 "detta GL-hack. Denna version är gjord av Marcelo Vianna."
 
 "Om du har varit i samma rum som en Windows NT-maskin har du troligtvis sett "
 "detta GL-hack. Denna version är gjord av Marcelo Vianna."
 
-#: hacks/config/pipes.xml.h:9 hacks/config/wormhole.xml.h:4
+#: hacks/config/pipes.xml.h:9 hacks/config/substrate.xml.h:7
+#: hacks/config/wormhole.xml.h:4
 #, fuzzy
 msgid "Lots"
 msgstr "Layout"
 #, fuzzy
 msgid "Lots"
 msgstr "Layout"
@@ -7137,22 +7238,26 @@ msgid "Ping subnet/30 (2 hosts)"
 msgstr ""
 
 #: hacks/config/sonar.xml.h:10
 msgstr ""
 
 #: hacks/config/sonar.xml.h:10
-msgid "Simulation Team Members"
+msgid "Resolve Host Names"
 msgstr ""
 
 #: hacks/config/sonar.xml.h:11
 msgstr ""
 
 #: hacks/config/sonar.xml.h:11
+msgid "Simulation Team Members"
+msgstr ""
+
+#: hacks/config/sonar.xml.h:12
 msgid "Sonar"
 msgstr "Ekolod"
 
 msgid "Sonar"
 msgstr "Ekolod"
 
-#: hacks/config/sonar.xml.h:12
+#: hacks/config/sonar.xml.h:13
 msgid "Team A Name"
 msgstr ""
 
 msgid "Team A Name"
 msgstr ""
 
-#: hacks/config/sonar.xml.h:13
+#: hacks/config/sonar.xml.h:14
 msgid "Team B Name"
 msgstr ""
 
 msgid "Team B Name"
 msgstr ""
 
-#: hacks/config/sonar.xml.h:14
+#: hacks/config/sonar.xml.h:15
 msgid ""
 "This program draws a simulation of a sonar screen. By default, it displays a "
 "random assortment of ``bogies'' on the screen, but if installed as \"setuid "
 msgid ""
 "This program draws a simulation of a sonar screen. By default, it displays a "
 "random assortment of ``bogies'' on the screen, but if installed as \"setuid "
@@ -7161,7 +7266,7 @@ msgid ""
 "Martin and Jamie Zawinski."
 msgstr ""
 
 "Martin and Jamie Zawinski."
 msgstr ""
 
-#: hacks/config/sonar.xml.h:15
+#: hacks/config/sonar.xml.h:16
 msgid "vs."
 msgstr ""
 
 msgid "vs."
 msgstr ""
 
@@ -7449,6 +7554,32 @@ msgid ""
 "Written by Massimino Pascal."
 msgstr ""
 
 "Written by Massimino Pascal."
 msgstr ""
 
+#: hacks/config/substrate.xml.h:4
+#, fuzzy
+msgid "Initial Cracks"
+msgstr "Partiklar på skärmen"
+
+#: hacks/config/substrate.xml.h:5
+msgid ""
+"Lines like crystals grow on a computational substrate. A simple "
+"perpendicular growth rule creates intricate city-like structures. By J. "
+"Tarbell and Mike Kershaw."
+msgstr ""
+
+#: hacks/config/substrate.xml.h:8
+#, fuzzy
+msgid "Sandgrains"
+msgstr "Standardvärde"
+
+#: hacks/config/substrate.xml.h:12
+#, fuzzy
+msgid "Substrate"
+msgstr "Triangel"
+
+#: hacks/config/substrate.xml.h:13
+msgid "Wireframe only"
+msgstr ""
+
 #: hacks/config/superquadrics.xml.h:3
 msgid ""
 "Ed Mackey reports that he wrote the first version of this program in BASIC "
 #: hacks/config/superquadrics.xml.h:3
 msgid ""
 "Ed Mackey reports that he wrote the first version of this program in BASIC "
@@ -9987,9 +10118,6 @@ msgstr ""
 #~ msgid "number of Ants"
 #~ msgstr "antal myror"
 
 #~ msgid "number of Ants"
 #~ msgstr "antal myror"
 
-#~ msgid "Length of Trail"
-#~ msgstr "Spårlängd"
-
 #~ msgid "Threshold of repulsion"
 #~ msgstr "Repulsionströskelvärde"
 
 #~ msgid "Threshold of repulsion"
 #~ msgstr "Repulsionströskelvärde"
 
@@ -10008,9 +10136,6 @@ msgstr ""
 #~ msgid "Speed of Motion."
 #~ msgstr "Rörelsehastighet."
 
 #~ msgid "Speed of Motion."
 #~ msgstr "Rörelsehastighet."
 
-#~ msgid "Don't use double bufferinge"
-#~ msgstr "Använd inte dubbelbuffring"
-
 #~ msgid "Have at maximum size"
 #~ msgstr "Behåll vid maxstorlek"
 
 #~ msgid "Have at maximum size"
 #~ msgstr "Behåll vid maxstorlek"
 
index 55985ba387adb0c994604bd5d919493e26701dc8..d6a705d4431815dff4f1bd3e3e52b1dbce2a0f81 100644 (file)
--- a/po/vi.po
+++ b/po/vi.po
@@ -6,7 +6,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: for Gnome 2.x\n"
 "Report-Msgid-Bugs-To: \n"
 msgstr ""
 "Project-Id-Version: for Gnome 2.x\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2004-10-04 16:25+0200\n"
+"POT-Creation-Date: 2004-12-22 12:51+0100\n"
 "PO-Revision-Date: 2002-09-19 18:16+0700\n"
 "Last-Translator: Trinh Minh Thanh <tmthanh@linuxmail.org>\n"
 "Language-Team: Gnome-Vi Team <Gnomevi-list@lists.sourceforge.net>\n"
 "PO-Revision-Date: 2002-09-19 18:16+0700\n"
 "Last-Translator: Trinh Minh Thanh <tmthanh@linuxmail.org>\n"
 "Language-Team: Gnome-Vi Team <Gnomevi-list@lists.sourceforge.net>\n"
@@ -147,7 +147,7 @@ msgstr "Bao lâu trước khi màn hình tối hẳn."
 msgid "minutes"
 msgstr "phút"
 
 msgid "minutes"
 msgstr "phút"
 
-#: driver/demo-Gtk-widgets.c:482 driver/demo-Gtk.c:2845
+#: driver/demo-Gtk-widgets.c:482 driver/demo-Gtk.c:2852
 #: driver/xscreensaver-demo.glade.h:58
 msgid "Preview"
 msgstr "Xem trước"
 #: driver/xscreensaver-demo.glade.h:58
 msgid "Preview"
 msgstr "Xem trước"
@@ -194,12 +194,12 @@ msgstr "Chỉ có một trình bảo vệ màn hình"
 msgid "Random Screen Saver"
 msgstr "Trình bảo vệ màn hình ngẫu nhiên"
 
 msgid "Random Screen Saver"
 msgstr "Trình bảo vệ màn hình ngẫu nhiên"
 
-#: driver/demo-Gtk-widgets.c:571 driver/demo-Gtk.c:2134
+#: driver/demo-Gtk-widgets.c:571 driver/demo-Gtk.c:2141
 #: driver/xscreensaver-demo.glade.h:75
 msgid "Use"
 msgstr "Dùng"
 
 #: driver/xscreensaver-demo.glade.h:75
 msgid "Use"
 msgstr "Dùng"
 
-#: driver/demo-Gtk-widgets.c:591 driver/demo-Gtk.c:2144
+#: driver/demo-Gtk-widgets.c:591 driver/demo-Gtk.c:2151
 #: driver/xscreensaver-demo.glade.h:63
 msgid "Screen Saver"
 msgstr "Trình bảo vệ màn hình"
 #: driver/xscreensaver-demo.glade.h:63
 msgid "Screen Saver"
 msgstr "Trình bảo vệ màn hình"
@@ -446,7 +446,7 @@ msgid "Visual:"
 msgstr "Hiển thị:"
 
 #: driver/demo-Gtk-widgets.c:1550 driver/demo-Gtk-widgets.c:1573
 msgstr "Hiển thị:"
 
 #: driver/demo-Gtk-widgets.c:1550 driver/demo-Gtk-widgets.c:1573
-#: driver/demo-Gtk.c:1538 driver/demo-Gtk.c:2864
+#: driver/demo-Gtk.c:1545 driver/demo-Gtk.c:2871
 #: driver/xscreensaver-demo.glade.h:5 driver/xscreensaver-demo.glade2.h:3
 msgid "Any"
 msgstr "bất kỳ"
 #: driver/xscreensaver-demo.glade.h:5 driver/xscreensaver-demo.glade2.h:3
 msgid "Any"
 msgstr "bất kỳ"
@@ -545,7 +545,7 @@ msgstr "Chuẩn <<"
 msgid "Back to the graphical configuration options."
 msgstr "Trở lại tùy chọn cấu hình đồ họa."
 
 msgid "Back to the graphical configuration options."
 msgstr "Trở lại tùy chọn cấu hình đồ họa."
 
-#: driver/demo-Gtk-widgets.c:1709 driver/demo-Gtk.c:741
+#: driver/demo-Gtk-widgets.c:1709 driver/demo-Gtk.c:748
 #: driver/xscreensaver-demo.glade.h:54
 msgid "OK"
 msgstr "OK"
 #: driver/xscreensaver-demo.glade.h:54
 msgid "OK"
 msgstr "OK"
@@ -554,11 +554,11 @@ msgstr "OK"
 msgid "Cancel"
 msgstr "Bỏ qua"
 
 msgid "Cancel"
 msgstr "Bỏ qua"
 
-#: driver/demo-Gtk.c:649
+#: driver/demo-Gtk.c:656
 msgid "For updates, check http://www.jwz.org/xscreensaver/"
 msgstr "Để cập nhật, xem tại:  http://www.jwz.org/xscreensaver/"
 
 msgid "For updates, check http://www.jwz.org/xscreensaver/"
 msgstr "Để cập nhật, xem tại:  http://www.jwz.org/xscreensaver/"
 
-#: driver/demo-Gtk.c:779
+#: driver/demo-Gtk.c:786
 msgid ""
 "Error:\n"
 "\n"
 msgid ""
 "Error:\n"
 "\n"
@@ -568,7 +568,7 @@ msgstr ""
 "\n"
 "Không có địa chỉ trợ giúp nào được chỉ định.\n"
 
 "\n"
 "Không có địa chỉ trợ giúp nào được chỉ định.\n"
 
-#: driver/demo-Gtk.c:865
+#: driver/demo-Gtk.c:872
 msgid ""
 "Error:\n"
 "\n"
 msgid ""
 "Error:\n"
 "\n"
@@ -580,7 +580,7 @@ msgstr ""
 "Xscreensaver daemon đã không khởi chạy đúng.\n"
 "\n"
 
 "Xscreensaver daemon đã không khởi chạy đúng.\n"
 "\n"
 
-#: driver/demo-Gtk.c:877
+#: driver/demo-Gtk.c:884
 msgid ""
 "You are running as root.  This usually means that xscreensaver\n"
 "was unable to contact your X server because access control is\n"
 msgid ""
 "You are running as root.  This usually means that xscreensaver\n"
 "was unable to contact your X server because access control is\n"
@@ -614,11 +614,11 @@ msgstr ""
 "Không nên chạy X với người dùng root, bạn nên đăng nhập là\n"
 "người dùng thông thường và `su' khi cần."
 
 "Không nên chạy X với người dùng root, bạn nên đăng nhập là\n"
 "người dùng thông thường và `su' khi cần."
 
-#: driver/demo-Gtk.c:893
+#: driver/demo-Gtk.c:900
 msgid "Please check your $PATH and permissions."
 msgstr "Hãy kiểm tra $PATH và quyền hạn."
 
 msgid "Please check your $PATH and permissions."
 msgstr "Hãy kiểm tra $PATH và quyền hạn."
 
-#: driver/demo-Gtk.c:928
+#: driver/demo-Gtk.c:935
 msgid ""
 "Error:\n"
 "\n"
 msgid ""
 "Error:\n"
 "\n"
@@ -628,7 +628,7 @@ msgstr ""
 "\n"
 "Không định được tên tập tin init!\n"
 
 "\n"
 "Không định được tên tập tin init!\n"
 
-#: driver/demo-Gtk.c:933
+#: driver/demo-Gtk.c:940
 #, c-format
 msgid ""
 "Error:\n"
 #, c-format
 msgid ""
 "Error:\n"
@@ -639,7 +639,7 @@ msgstr ""
 "\n"
 "Không thể ghi %s\n"
 
 "\n"
 "Không thể ghi %s\n"
 
-#: driver/demo-Gtk.c:992
+#: driver/demo-Gtk.c:999
 msgid ""
 "Error:\n"
 "\n"
 msgid ""
 "Error:\n"
 "\n"
@@ -649,7 +649,7 @@ msgstr ""
 "\n"
 "Không có thiết lập cho `manualCommand'."
 
 "\n"
 "Không có thiết lập cho `manualCommand'."
 
-#: driver/demo-Gtk.c:1173
+#: driver/demo-Gtk.c:1180
 #, c-format
 msgid ""
 "Error:\n"
 #, c-format
 msgid ""
 "Error:\n"
@@ -660,7 +660,7 @@ msgstr ""
 "\n"
 "Không phân tích được Định dạng Thời gian: \"%s\"\n"
 
 "\n"
 "Không phân tích được Định dạng Thời gian: \"%s\"\n"
 
-#: driver/demo-Gtk.c:1829
+#: driver/demo-Gtk.c:1836
 #, c-format
 msgid ""
 "Error:\n"
 #, c-format
 msgid ""
 "Error:\n"
@@ -671,28 +671,28 @@ msgstr ""
 "\n"
 "Thư mục không tồn tại: \"%s\"\n"
 
 "\n"
 "Thư mục không tồn tại: \"%s\"\n"
 
-#: driver/demo-Gtk.c:2546
+#: driver/demo-Gtk.c:2553
 msgid "Descriptions not available: no XML support compiled in."
 msgstr "Mô tả không có sẵn: chưa biên dịch hỗ trợ cho XML ở trong."
 
 msgid "Descriptions not available: no XML support compiled in."
 msgstr "Mô tả không có sẵn: chưa biên dịch hỗ trợ cho XML ở trong."
 
-#: driver/demo-Gtk.c:2551
+#: driver/demo-Gtk.c:2558
 msgid "No description available."
 msgstr "Không có sẵn Mô tả."
 
 msgid "No description available."
 msgstr "Không có sẵn Mô tả."
 
-#: driver/demo-Gtk.c:2816
+#: driver/demo-Gtk.c:2823
 msgid "Blank Screen"
 msgstr "Màn hình Trống"
 
 msgid "Blank Screen"
 msgstr "Màn hình Trống"
 
-#: driver/demo-Gtk.c:2822
+#: driver/demo-Gtk.c:2829
 msgid "Screen Saver Disabled"
 msgstr "Tắt trình Bảo vệ Màn hình"
 
 msgid "Screen Saver Disabled"
 msgstr "Tắt trình Bảo vệ Màn hình"
 
-#: driver/demo-Gtk.c:2855
+#: driver/demo-Gtk.c:2862
 #, c-format
 msgid "%s: %.100s Settings"
 msgstr ""
 
 #, c-format
 msgid "%s: %.100s Settings"
 msgstr ""
 
-#: driver/demo-Gtk.c:3010
+#: driver/demo-Gtk.c:3017
 #, c-format
 msgid ""
 "Warning:\n"
 #, c-format
 msgid ""
 "Warning:\n"
@@ -703,23 +703,23 @@ msgstr ""
 "\n"
 "Tập tin \"%s\" đã thay đổi, nạp lại.\n"
 
 "\n"
 "Tập tin \"%s\" đã thay đổi, nạp lại.\n"
 
-#: driver/demo-Gtk.c:3092
+#: driver/demo-Gtk.c:3099
 msgid "No Preview"
 msgstr "Không có Xem trước"
 
 msgid "No Preview"
 msgstr "Không có Xem trước"
 
-#: driver/demo-Gtk.c:3092
+#: driver/demo-Gtk.c:3099
 msgid "Available"
 msgstr "Sẵn có"
 
 msgid "Available"
 msgstr "Sẵn có"
 
-#: driver/demo-Gtk.c:3093
+#: driver/demo-Gtk.c:3100
 msgid "Not"
 msgstr ""
 
 msgid "Not"
 msgstr ""
 
-#: driver/demo-Gtk.c:3093
+#: driver/demo-Gtk.c:3100
 msgid "Installed"
 msgstr ""
 
 msgid "Installed"
 msgstr ""
 
-#: driver/demo-Gtk.c:3858
+#: driver/demo-Gtk.c:3865
 #, c-format
 msgid ""
 "Warning:\n"
 #, c-format
 msgid ""
 "Warning:\n"
@@ -732,7 +732,7 @@ msgstr ""
 "Daemon của XScreenSaver có vẻ như đang không chạy\n"
 "trên màn hình \"%s\".  Chạy nó bây giờ?"
 
 "Daemon của XScreenSaver có vẻ như đang không chạy\n"
 "trên màn hình \"%s\".  Chạy nó bây giờ?"
 
-#: driver/demo-Gtk.c:3868
+#: driver/demo-Gtk.c:3875
 #, c-format
 msgid ""
 "Warning:\n"
 #, c-format
 msgid ""
 "Warning:\n"
@@ -763,7 +763,7 @@ msgstr ""
 "Bạn nên hoặc là chạy lại %s bằng \"%s\" hay chạy lại trình\n"
 "bảo vệ màn hình X bằng \"%s\".\n"
 
 "Bạn nên hoặc là chạy lại %s bằng \"%s\" hay chạy lại trình\n"
 "bảo vệ màn hình X bằng \"%s\".\n"
 
-#: driver/demo-Gtk.c:3893
+#: driver/demo-Gtk.c:3900
 #, c-format
 msgid ""
 "Warning:\n"
 #, c-format
 msgid ""
 "Warning:\n"
@@ -790,7 +790,7 @@ msgstr ""
 "\n"
 "Chạy lại daemon trên \"%s\" bằng \"%s\" bây giờ không?\n"
 
 "\n"
 "Chạy lại daemon trên \"%s\" bằng \"%s\" bây giờ không?\n"
 
-#: driver/demo-Gtk.c:3915
+#: driver/demo-Gtk.c:3922
 #, c-format
 msgid ""
 "Warning:\n"
 #, c-format
 msgid ""
 "Warning:\n"
@@ -809,12 +809,12 @@ msgstr ""
 "\n"
 "Khởi chạy lại daemon của trình bảo vệ màn hình bây giờ ?\n"
 
 "\n"
 "Khởi chạy lại daemon của trình bảo vệ màn hình bây giờ ?\n"
 
-#: driver/demo-Gtk.c:4372
+#: driver/demo-Gtk.c:4379
 #, c-format
 msgid "%s: unknown option: %s\n"
 msgstr "%s: tùy chọn không xác định: %s\n"
 
 #, c-format
 msgid "%s: unknown option: %s\n"
 msgstr "%s: tùy chọn không xác định: %s\n"
 
-#: driver/demo-Gtk.c:4436
+#: driver/demo-Gtk.c:4443
 #, fuzzy
 msgid "Screensaver Preferences"
 msgstr "Trình bảo vệ màn hình"
 #, fuzzy
 msgid "Screensaver Preferences"
 msgstr "Trình bảo vệ màn hình"
@@ -1037,22 +1037,23 @@ msgstr "Tay"
 #: 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/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:5 hacks/config/flyingtoasters.xml.h:5
-#: hacks/config/fontglide.xml.h:4 hacks/config/forest.xml.h:1
-#: hacks/config/fuzzyflakes.xml.h:7 hacks/config/galaxy.xml.h:3
-#: hacks/config/gears.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:6
-#: 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/fadeplot.xml.h:4 hacks/config/fireworkx.xml.h:3
+#: 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:2 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/fuzzyflakes.xml.h:7
+#: hacks/config/galaxy.xml.h:3 hacks/config/gears.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:6 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/intermomentary.xml.h:1 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/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
@@ -1070,23 +1071,24 @@ msgstr "Tay"
 #: hacks/config/pacman.xml.h:1 hacks/config/penetrate.xml.h:3
 #: hacks/config/penrose.xml.h:6 hacks/config/petri.xml.h:5
 #: hacks/config/phosphor.xml.h:4 hacks/config/piecewise.xml.h:4
 #: hacks/config/pacman.xml.h:1 hacks/config/penetrate.xml.h:3
 #: hacks/config/penrose.xml.h:6 hacks/config/petri.xml.h:5
 #: hacks/config/phosphor.xml.h:4 hacks/config/piecewise.xml.h:4
-#: hacks/config/pipes.xml.h:5 hacks/config/polyhedra.xml.h:18
-#: hacks/config/polyominoes.xml.h:2 hacks/config/polytopes.xml.h:11
-#: hacks/config/pong.xml.h:1 hacks/config/popsquares.xml.h:3
-#: hacks/config/providence.xml.h:2 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 hacks/config/rocks.xml.h:4
-#: hacks/config/rotor.xml.h:3 hacks/config/rubik.xml.h:3
-#: hacks/config/sballs.xml.h:4 hacks/config/shadebobs.xml.h:3
-#: hacks/config/sierpinski.xml.h:2 hacks/config/sierpinski3d.xml.h:2
-#: hacks/config/slidescreen.xml.h:2 hacks/config/slip.xml.h:2
-#: hacks/config/speedmine.xml.h:3 hacks/config/sphere.xml.h:2
-#: hacks/config/spheremonics.xml.h:5 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:1 hacks/config/superquadrics.xml.h:4
+#: hacks/config/pinion.xml.h:5 hacks/config/pipes.xml.h:5
+#: hacks/config/polyhedra.xml.h:18 hacks/config/polyominoes.xml.h:2
+#: hacks/config/polytopes.xml.h:11 hacks/config/pong.xml.h:1
+#: hacks/config/popsquares.xml.h:3 hacks/config/providence.xml.h:2
+#: 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
+#: hacks/config/rocks.xml.h:4 hacks/config/rotor.xml.h:3
+#: hacks/config/rubik.xml.h:3 hacks/config/sballs.xml.h:4
+#: hacks/config/shadebobs.xml.h:3 hacks/config/sierpinski.xml.h:2
+#: hacks/config/sierpinski3d.xml.h:2 hacks/config/slidescreen.xml.h:2
+#: hacks/config/slip.xml.h:2 hacks/config/speedmine.xml.h:3
+#: hacks/config/sphere.xml.h:2 hacks/config/spheremonics.xml.h:5
+#: 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:1
+#: hacks/config/substrate.xml.h:2 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/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
@@ -1108,8 +1110,9 @@ msgstr "Nhanh"
 #: hacks/config/fuzzyflakes.xml.h:8 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/fuzzyflakes.xml.h:8 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/wormhole.xml.h:3 hacks/config/xfishtank.xml.h:4
+#: hacks/config/substrate.xml.h:3 hacks/config/thornbird.xml.h:3
+#: hacks/config/whirlwindwarp.xml.h:1 hacks/config/wormhole.xml.h:3
+#: hacks/config/xfishtank.xml.h:4
 msgid "Few"
 msgstr "Ít"
 
 msgid "Few"
 msgstr "Ít"
 
@@ -1125,7 +1128,7 @@ msgstr "Ít"
 #: hacks/config/epicycle.xml.h:8 hacks/config/eruption.xml.h:12
 #: hacks/config/euler2d.xml.h:8 hacks/config/fadeplot.xml.h:6
 #: hacks/config/flag.xml.h:5 hacks/config/flame.xml.h:11
 #: hacks/config/epicycle.xml.h:8 hacks/config/eruption.xml.h:12
 #: hacks/config/euler2d.xml.h:8 hacks/config/fadeplot.xml.h:6
 #: hacks/config/flag.xml.h:5 hacks/config/flame.xml.h:11
-#: hacks/config/flow.xml.h:8 hacks/config/fluidballs.xml.h:13
+#: hacks/config/flow.xml.h:7 hacks/config/fluidballs.xml.h:13
 #: hacks/config/forest.xml.h:3 hacks/config/fuzzyflakes.xml.h:12
 #: 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/forest.xml.h:3 hacks/config/fuzzyflakes.xml.h:12
 #: hacks/config/galaxy.xml.h:6 hacks/config/grav.xml.h:4
 #: hacks/config/halo.xml.h:4 hacks/config/hopalong.xml.h:15
@@ -1163,7 +1166,7 @@ msgstr "Nhiều"
 #: 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/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/flow.xml.h:8 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/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
@@ -1217,22 +1220,23 @@ msgstr ""
 #: 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/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/flyingtoasters.xml.h:11
-#: hacks/config/fontglide.xml.h:13 hacks/config/forest.xml.h:5
-#: hacks/config/fuzzyflakes.xml.h:15 hacks/config/galaxy.xml.h:10
-#: hacks/config/gears.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:8 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:10 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/fadeplot.xml.h:8 hacks/config/fireworkx.xml.h:9
+#: 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:10 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/fuzzyflakes.xml.h:15
+#: hacks/config/galaxy.xml.h:11 hacks/config/gears.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:8
+#: 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:10
+#: 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/intermomentary.xml.h:4 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/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
@@ -1250,23 +1254,24 @@ msgstr ""
 #: hacks/config/pacman.xml.h:5 hacks/config/penetrate.xml.h:6
 #: hacks/config/penrose.xml.h:11 hacks/config/petri.xml.h:23
 #: hacks/config/phosphor.xml.h:7 hacks/config/piecewise.xml.h:9
 #: hacks/config/pacman.xml.h:5 hacks/config/penetrate.xml.h:6
 #: hacks/config/penrose.xml.h:11 hacks/config/petri.xml.h:23
 #: hacks/config/phosphor.xml.h:7 hacks/config/piecewise.xml.h:9
-#: hacks/config/pipes.xml.h:15 hacks/config/polyhedra.xml.h:119
-#: hacks/config/polyominoes.xml.h:10 hacks/config/polytopes.xml.h:20
-#: hacks/config/pong.xml.h:4 hacks/config/popsquares.xml.h:5
-#: hacks/config/providence.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 hacks/config/rocks.xml.h:9
-#: hacks/config/rotor.xml.h:11 hacks/config/rubik.xml.h:9
-#: hacks/config/sballs.xml.h:13 hacks/config/shadebobs.xml.h:9
-#: hacks/config/sierpinski.xml.h:7 hacks/config/sierpinski3d.xml.h:8
-#: hacks/config/slidescreen.xml.h:6 hacks/config/slip.xml.h:7
-#: hacks/config/speedmine.xml.h:13 hacks/config/sphere.xml.h:5
-#: hacks/config/spheremonics.xml.h:19 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:4 hacks/config/superquadrics.xml.h:8
+#: hacks/config/pinion.xml.h:13 hacks/config/pipes.xml.h:15
+#: hacks/config/polyhedra.xml.h:119 hacks/config/polyominoes.xml.h:10
+#: hacks/config/polytopes.xml.h:20 hacks/config/pong.xml.h:4
+#: hacks/config/popsquares.xml.h:5 hacks/config/providence.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
+#: hacks/config/rocks.xml.h:9 hacks/config/rotor.xml.h:11
+#: hacks/config/rubik.xml.h:9 hacks/config/sballs.xml.h:13
+#: hacks/config/shadebobs.xml.h:9 hacks/config/sierpinski.xml.h:7
+#: hacks/config/sierpinski3d.xml.h:8 hacks/config/slidescreen.xml.h:6
+#: hacks/config/slip.xml.h:7 hacks/config/speedmine.xml.h:13
+#: hacks/config/sphere.xml.h:5 hacks/config/spheremonics.xml.h:19
+#: 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:4
+#: hacks/config/substrate.xml.h:10 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/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
@@ -1299,17 +1304,18 @@ msgstr "Chậm"
 #: hacks/config/engine.xml.h:16 hacks/config/epicycle.xml.h:11
 #: 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/engine.xml.h:16 hacks/config/epicycle.xml.h:11
 #: 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/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/fuzzyflakes.xml.h:17
-#: hacks/config/galaxy.xml.h:11 hacks/config/glblur.xml.h:17
-#: hacks/config/glforestfire.xml.h:15 hacks/config/glplanet.xml.h:10
-#: 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:11 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/fireworkx.xml.h:11 hacks/config/flag.xml.h:9
+#: hacks/config/flame.xml.h:15 hacks/config/flipflop.xml.h:7
+#: hacks/config/flipscreen3d.xml.h:7 hacks/config/flow.xml.h:12
+#: hacks/config/fluidballs.xml.h:20 hacks/config/forest.xml.h:6
+#: hacks/config/fuzzyflakes.xml.h:17 hacks/config/galaxy.xml.h:12
+#: hacks/config/glblur.xml.h:17 hacks/config/glforestfire.xml.h:15
+#: hacks/config/glplanet.xml.h:10 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:11
+#: 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/intermomentary.xml.h:5 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/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
@@ -1338,16 +1344,16 @@ msgstr "Chậm"
 #: 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/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/xplanet.xml.h:60 hacks/config/xrayswarm.xml.h:4
-#: hacks/config/zoom.xml.h:7
+#: hacks/config/strange.xml.h:5 hacks/config/substrate.xml.h:11
+#: 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/xplanet.xml.h:60
+#: hacks/config/xrayswarm.xml.h:4 hacks/config/zoom.xml.h:7
 msgid "Speed"
 msgstr "Tốc độ"
 
 msgid "Speed"
 msgstr "Tốc độ"
 
@@ -1390,8 +1396,8 @@ msgstr ""
 #: hacks/config/discrete.xml.h:11 hacks/config/drift.xml.h:14
 #: hacks/config/epicycle.xml.h:13 hacks/config/euler2d.xml.h:17
 #: hacks/config/fadeplot.xml.h:12 hacks/config/flag.xml.h:13
 #: hacks/config/discrete.xml.h:11 hacks/config/drift.xml.h:14
 #: hacks/config/epicycle.xml.h:13 hacks/config/euler2d.xml.h:17
 #: hacks/config/fadeplot.xml.h:12 hacks/config/flag.xml.h:13
-#: hacks/config/flame.xml.h:16 hacks/config/flow.xml.h:18
-#: hacks/config/forest.xml.h:8 hacks/config/galaxy.xml.h:13
+#: hacks/config/flame.xml.h:16 hacks/config/flow.xml.h:15
+#: hacks/config/forest.xml.h:8 hacks/config/galaxy.xml.h:14
 #: hacks/config/grav.xml.h:11 hacks/config/halo.xml.h:13
 #: hacks/config/hopalong.xml.h:25 hacks/config/ifs.xml.h:8
 #: hacks/config/imsmap.xml.h:15 hacks/config/interference.xml.h:19
 #: hacks/config/grav.xml.h:11 hacks/config/halo.xml.h:13
 #: hacks/config/hopalong.xml.h:25 hacks/config/ifs.xml.h:8
 #: hacks/config/imsmap.xml.h:15 hacks/config/interference.xml.h:19
@@ -1492,7 +1498,7 @@ msgstr "Cell 4 mặt"
 #: 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/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/flag.xml.h:4 hacks/config/flow.xml.h:4
 #: hacks/config/fluidballs.xml.h:12 hacks/config/fuzzyflakes.xml.h:10
 #: 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/fluidballs.xml.h:12 hacks/config/fuzzyflakes.xml.h:10
 #: hacks/config/gleidescope.xml.h:7 hacks/config/halftone.xml.h:8
 #: hacks/config/hopalong.xml.h:13 hacks/config/interference.xml.h:11
@@ -1524,7 +1530,7 @@ msgstr "Cell 6 mặt"
 #: 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/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/flag.xml.h:8 hacks/config/flow.xml.h:11
 #: hacks/config/fluidballs.xml.h:19 hacks/config/fuzzyflakes.xml.h:16
 #: 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/fluidballs.xml.h:19 hacks/config/fuzzyflakes.xml.h:16
 #: hacks/config/gleidescope.xml.h:12 hacks/config/halftone.xml.h:14
 #: hacks/config/hopalong.xml.h:22 hacks/config/interference.xml.h:18
@@ -1543,7 +1549,7 @@ msgstr "Cell 3 mặt"
 
 #: 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/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/flag.xml.h:12 hacks/config/flow.xml.h:14
 #: hacks/config/lissie.xml.h:12 hacks/config/loop.xml.h:11
 #: hacks/config/rubik.xml.h:12 hacks/config/sierpinski.xml.h:11
 #: hacks/config/slip.xml.h:11
 #: hacks/config/lissie.xml.h:12 hacks/config/loop.xml.h:11
 #: hacks/config/rubik.xml.h:12 hacks/config/sierpinski.xml.h:11
 #: hacks/config/slip.xml.h:11
@@ -1594,13 +1600,14 @@ msgstr ""
 #: hacks/config/menger.xml.h:15 hacks/config/mirrorblob.xml.h:18
 #: hacks/config/moebius.xml.h:6 hacks/config/molecule.xml.h:21
 #: hacks/config/morph3d.xml.h:5 hacks/config/noof.xml.h:4
 #: hacks/config/menger.xml.h:15 hacks/config/mirrorblob.xml.h:18
 #: hacks/config/moebius.xml.h:6 hacks/config/molecule.xml.h:21
 #: hacks/config/morph3d.xml.h:5 hacks/config/noof.xml.h:4
-#: hacks/config/pipes.xml.h:14 hacks/config/polyhedra.xml.h:118
-#: hacks/config/polytopes.xml.h:18 hacks/config/providence.xml.h:4
-#: 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
+#: hacks/config/pinion.xml.h:12 hacks/config/pipes.xml.h:14
+#: hacks/config/polyhedra.xml.h:118 hacks/config/polytopes.xml.h:18
+#: hacks/config/providence.xml.h:4 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 "Hiển thị khung hình trong một giây"
 
 msgid "Show Frames-per-Second"
 msgstr "Hiển thị khung hình trong một giây"
 
@@ -1761,11 +1768,12 @@ msgstr "Tốc độ các voi"
 #: hacks/config/lament.xml.h:9 hacks/config/lavalite.xml.h:32
 #: hacks/config/menger.xml.h:21 hacks/config/mirrorblob.xml.h:24
 #: hacks/config/moebius.xml.h:11 hacks/config/molecule.xml.h:26
 #: hacks/config/lament.xml.h:9 hacks/config/lavalite.xml.h:32
 #: hacks/config/menger.xml.h:21 hacks/config/mirrorblob.xml.h:24
 #: hacks/config/moebius.xml.h:11 hacks/config/molecule.xml.h:26
-#: hacks/config/polyhedra.xml.h:173 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
+#: hacks/config/pinion.xml.h:15 hacks/config/polyhedra.xml.h:173
+#: 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 ""
 
 msgid "Wireframe"
 msgstr ""
 
@@ -1853,14 +1861,15 @@ msgstr "Đường kẻ"
 #: 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/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/mismunch.xml.h:3
-#: 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 hacks/config/spheremonics.xml.h:7
+#: hacks/config/flow.xml.h:6 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/mismunch.xml.h:3 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
+#: hacks/config/spheremonics.xml.h:7 hacks/config/substrate.xml.h:6
 #: hacks/config/wander.xml.h:10 hacks/config/whirlwindwarp.xml.h:3
 msgid "Long"
 msgstr "Dài"
 #: hacks/config/wander.xml.h:10 hacks/config/whirlwindwarp.xml.h:3
 msgid "Long"
 msgstr "Dài"
@@ -1907,13 +1916,14 @@ msgstr "Lực đẩy ban đầu"
 #: 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/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/metaballs.xml.h:12 hacks/config/mismunch.xml.h:8
-#: 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/flow.xml.h:9 hacks/config/galaxy.xml.h:9
+#: hacks/config/klein.xml.h:5 hacks/config/laser.xml.h:9
+#: hacks/config/menger.xml.h:14 hacks/config/metaballs.xml.h:12
+#: hacks/config/mismunch.xml.h:8 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/substrate.xml.h:9
 #: hacks/config/wander.xml.h:12 hacks/config/whirlwindwarp.xml.h:6
 msgid "Short"
 msgstr "Ngắn"
 #: hacks/config/wander.xml.h:12 hacks/config/whirlwindwarp.xml.h:6
 msgid "Short"
 msgstr "Ngắn"
@@ -2115,10 +2125,10 @@ msgstr ""
 #: 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/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/polyhedra.xml.h:3 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/wormhole.xml.h:1
-#: hacks/config/xfishtank.xml.h:1
+#: hacks/config/pinion.xml.h:3 hacks/config/polyhedra.xml.h:3
+#: 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/wormhole.xml.h:1 hacks/config/xfishtank.xml.h:1
 msgid "Animation Speed"
 msgstr "Tốc độ Hoạt ảnh"
 
 msgid "Animation Speed"
 msgstr "Tốc độ Hoạt ảnh"
 
@@ -2198,8 +2208,9 @@ msgstr ""
 #: 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/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/starfish.xml.h:2 hacks/config/substrate.xml.h:1
+#: hacks/config/vidwhacker.xml.h:3 hacks/config/wander.xml.h:7
+#: hacks/config/xspirograph.xml.h:3
 msgid "Duration"
 msgstr "Khoảng thời gian"
 
 msgid "Duration"
 msgstr "Khoảng thời gian"
 
@@ -2448,7 +2459,7 @@ msgstr ""
 msgid "Rotate"
 msgstr "Xoay"
 
 msgid "Rotate"
 msgstr "Xoay"
 
-#: hacks/config/circuit.xml.h:8
+#: hacks/config/circuit.xml.h:8 hacks/config/pinion.xml.h:10
 msgid "Rotation Speed"
 msgstr "Tốc độ xoay"
 
 msgid "Rotation Speed"
 msgstr "Tốc độ xoay"
 
@@ -2534,11 +2545,12 @@ msgstr "1 giây"
 msgid "Coral"
 msgstr "San hô"
 
 msgid "Coral"
 msgstr "San hô"
 
-#: hacks/config/coral.xml.h:4 hacks/config/gflux.xml.h:3
-#: hacks/config/glblur.xml.h:2 hacks/config/glmatrix.xml.h:3
-#: 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
+#: hacks/config/coral.xml.h:4 hacks/config/fireworkx.xml.h:2
+#: hacks/config/gflux.xml.h:3 hacks/config/glblur.xml.h:2
+#: hacks/config/glmatrix.xml.h:3 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
 msgid "Dense"
 msgstr "Dày đặc"
 
 msgid "Dense"
 msgstr "Dày đặc"
 
@@ -2551,12 +2563,12 @@ msgid ""
 "Simulates coral growth, albeit somewhat slowly. Written by Frederick Roeber."
 msgstr ""
 
 "Simulates coral growth, albeit somewhat slowly. Written by Frederick Roeber."
 msgstr ""
 
-#: hacks/config/coral.xml.h:13 hacks/config/gflux.xml.h:13
-#: hacks/config/glblur.xml.h:16 hacks/config/glmatrix.xml.h:19
-#: hacks/config/imsmap.xml.h:13 hacks/config/lavalite.xml.h:29
-#: hacks/config/pyro.xml.h:14 hacks/config/qix.xml.h:21
-#: hacks/config/squiral.xml.h:15 hacks/config/xearth.xml.h:24
-#: hacks/config/xmatrix.xml.h:17
+#: hacks/config/coral.xml.h:13 hacks/config/fireworkx.xml.h:10
+#: hacks/config/gflux.xml.h:13 hacks/config/glblur.xml.h:16
+#: hacks/config/glmatrix.xml.h:19 hacks/config/imsmap.xml.h:13
+#: hacks/config/lavalite.xml.h:29 hacks/config/pyro.xml.h:14
+#: hacks/config/qix.xml.h:21 hacks/config/squiral.xml.h:15
+#: hacks/config/xearth.xml.h:24 hacks/config/xmatrix.xml.h:17
 msgid "Sparse"
 msgstr "Thưa thớt"
 
 msgid "Sparse"
 msgstr "Thưa thớt"
 
@@ -2585,7 +2597,7 @@ msgid "Center on Screen"
 msgstr "Trung tâm trên màn hình"
 
 #: hacks/config/crystal.xml.h:2 hacks/config/deluxe.xml.h:1
 msgstr "Trung tâm trên màn hình"
 
 #: hacks/config/crystal.xml.h:2 hacks/config/deluxe.xml.h:1
-#: hacks/config/fadeplot.xml.h:1 hacks/config/flow.xml.h:3
+#: hacks/config/fadeplot.xml.h:1 hacks/config/flow.xml.h:1
 #: hacks/config/galaxy.xml.h:1 hacks/config/glforestfire.xml.h:1
 #: hacks/config/grav.xml.h:1 hacks/config/julia.xml.h:1
 #: hacks/config/laser.xml.h:1 hacks/config/lisa.xml.h:1
 #: hacks/config/galaxy.xml.h:1 hacks/config/glforestfire.xml.h:1
 #: hacks/config/grav.xml.h:1 hacks/config/julia.xml.h:1
 #: hacks/config/laser.xml.h:1 hacks/config/lisa.xml.h:1
@@ -3345,7 +3357,7 @@ msgstr ""
 msgid "Half"
 msgstr "Halo"
 
 msgid "Half"
 msgstr "Halo"
 
-#: hacks/config/fireflies.xml.h:17
+#: hacks/config/fireflies.xml.h:17 hacks/config/pinion.xml.h:7
 #, fuzzy
 msgid "Huge"
 msgstr "Ngọn lửa lớn"
 #, fuzzy
 msgid "Huge"
 msgstr "Ngọn lửa lớn"
@@ -3437,7 +3449,7 @@ msgstr ""
 msgid "Swarm tails glow"
 msgstr ""
 
 msgid "Swarm tails glow"
 msgstr ""
 
-#: hacks/config/fireflies.xml.h:43
+#: hacks/config/fireflies.xml.h:43 hacks/config/pinion.xml.h:14
 #, fuzzy
 msgid "Tiny"
 msgstr "Mỏng"
 #, fuzzy
 msgid "Tiny"
 msgstr "Mỏng"
@@ -3455,6 +3467,33 @@ msgstr "Gió"
 msgid "Wind picks up"
 msgstr ""
 
 msgid "Wind picks up"
 msgstr ""
 
+#: hacks/config/fireworkx.xml.h:1 hacks/config/lavalite.xml.h:3
+msgid "Activity"
+msgstr "Hoạt động"
+
+#: hacks/config/fireworkx.xml.h:4
+msgid "Fast Fade (more realistic)"
+msgstr ""
+
+#: hacks/config/fireworkx.xml.h:5
+#, fuzzy
+msgid "Fireworkx"
+msgstr "_Tệp"
+
+#: hacks/config/fireworkx.xml.h:6
+#, fuzzy
+msgid "Light effect"
+msgstr "Tác dụng chiếu sáng"
+
+#: hacks/config/fireworkx.xml.h:7
+msgid "Pyrotechnics simulation eye-candy. Written by Rony B. Chandran."
+msgstr ""
+
+#: hacks/config/fireworkx.xml.h:8
+#, fuzzy
+msgid "Shoot"
+msgstr "Ngắn"
+
 #: hacks/config/flag.xml.h:1
 msgid "Bitmap for Flag"
 msgstr "Bitmap cho cờ"
 #: hacks/config/flag.xml.h:1
 msgid "Bitmap for Flag"
 msgstr "Bitmap cho cờ"
@@ -3529,43 +3568,45 @@ msgid ""
 "around and deforms it in various ways. Written by Ben Buxton."
 msgstr ""
 
 "around and deforms it in various ways. Written by Ben Buxton."
 msgstr ""
 
-#: hacks/config/flow.xml.h:1
-msgid "Allow 2D Attractors"
-msgstr ""
+#: hacks/config/flow.xml.h:3
+msgid "Flow"
+msgstr "Dòng"
 
 
-#: hacks/config/flow.xml.h:2
+#: hacks/config/flow.xml.h:5
+#, fuzzy
+msgid "Length of trails"
+msgstr "Để lại vệt"
+
+#: hacks/config/flow.xml.h:13
 msgid ""
 msgid ""
-"Another series of strange attractors: a flowing series of points, making "
-"strange rotational shapes. Written by Tim Auckland."
+"Strange attractors formed of flows in a 3D differential equation phase "
+"space. Written by Tim Auckland."
 msgstr ""
 
 msgstr ""
 
-#: hacks/config/flow.xml.h:5
-msgid "Flow"
-msgstr "Dòng"
-
-#: hacks/config/flow.xml.h:6
-msgid "Freeze Some Bees"
-msgstr "Tê liệt vài con ong"
+#: hacks/config/flow.xml.h:16
+msgid "turn on/off bounding box."
+msgstr ""
 
 
-#: hacks/config/flow.xml.h:10
-msgid "Ride a Trained Bee"
-msgstr "Cưỡi ong được luyện"
+#: hacks/config/flow.xml.h:17
+#, fuzzy
+msgid "turn on/off double buffering."
+msgstr "Bộ đệm kép"
 
 
-#: hacks/config/flow.xml.h:11
-msgid "Rotate Around Attractor"
+#: hacks/config/flow.xml.h:18
+msgid "turn on/off periodic attractors."
 msgstr ""
 
 msgstr ""
 
-#: hacks/config/flow.xml.h:12
-msgid "Show Bounding Box"
+#: hacks/config/flow.xml.h:19
+msgid "turn on/off ride in the flow."
 msgstr ""
 
 msgstr ""
 
-#: hacks/config/flow.xml.h:14
-msgid "Slow Bees with Antifreeze"
+#: hacks/config/flow.xml.h:20
+msgid "turn on/off rotating around attractor."
 msgstr ""
 
 msgstr ""
 
-#: hacks/config/flow.xml.h:19
-msgid "Zoom In and Out"
-msgstr "Phóng to Thu nhỏ"
+#: hacks/config/flow.xml.h:21
+msgid "turn on/off search for new attractors."
+msgstr ""
 
 #: hacks/config/fluidballs.xml.h:1
 #, fuzzy
 
 #: hacks/config/fluidballs.xml.h:1
 #, fuzzy
@@ -3786,7 +3827,12 @@ msgstr "Chế độ ngẫu nhiên"
 msgid "Galaxy"
 msgstr "Thiên hà"
 
 msgid "Galaxy"
 msgstr "Thiên hà"
 
-#: hacks/config/galaxy.xml.h:9 hacks/config/lisa.xml.h:7
+#: hacks/config/galaxy.xml.h:8
+#, fuzzy
+msgid "Rotate Viewpoint"
+msgstr "Sao Mộc"
+
+#: hacks/config/galaxy.xml.h:10 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/pong.xml.h:3
 #: hacks/config/rotor.xml.h:10 hacks/config/rubik.xml.h:8
 #: hacks/config/lissie.xml.h:8 hacks/config/loop.xml.h:6
 #: hacks/config/penrose.xml.h:10 hacks/config/pong.xml.h:3
 #: hacks/config/rotor.xml.h:10 hacks/config/rubik.xml.h:8
@@ -3795,7 +3841,7 @@ msgstr "Thiên hà"
 msgid "Size"
 msgstr "Kích thước"
 
 msgid "Size"
 msgstr "Kích thước"
 
-#: hacks/config/galaxy.xml.h:12
+#: hacks/config/galaxy.xml.h:13
 msgid ""
 "This draws spinning galaxies, which then collide and scatter their stars to "
 "the, uh, four winds or something. Originally an Amiga program by Uli "
 msgid ""
 "This draws spinning galaxies, which then collide and scatter their stars to "
 "the, uh, four winds or something. Originally an Amiga program by Uli "
@@ -4106,9 +4152,9 @@ msgid ""
 "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 "
 "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."
+"of this window: the tab at the top of the *other* window.) 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
 msgstr ""
 
 #: hacks/config/glslideshow.xml.h:17
@@ -4646,6 +4692,27 @@ msgstr "Số lượng Sóng"
 msgid "Wave Size"
 msgstr "Kích cỡ Sóng"
 
 msgid "Wave Size"
 msgstr "Kích cỡ Sóng"
 
+#: hacks/config/intermomentary.xml.h:2
+msgid "Intermomentary"
+msgstr ""
+
+#: hacks/config/intermomentary.xml.h:3
+#, fuzzy
+msgid "Number of Discs"
+msgstr "Số đường tròn"
+
+#: hacks/config/intermomentary.xml.h:6
+msgid ""
+"The Intersection Momentary is a fun visualization defining the relationships "
+"between objects with Casey Reas, William Ngan, and Robert Hodgin. "
+"Commissioned for display at the Whitney Museum of American Art. A surface "
+"filled with 100 medium to small sized circles. Each circle has a different "
+"size and direction, but moves at the same slow rate. Display: A. The "
+"instantaneous intersections of the circles. B. The aggregate intersections "
+"of the circles. Ported to XScreensaver from the art project \"InterMomentary"
+"\" at http://www.complexification.net"
+msgstr ""
+
 #: hacks/config/jigglypuff.xml.h:2
 msgid "Chrome"
 msgstr ""
 #: hacks/config/jigglypuff.xml.h:2
 msgid "Chrome"
 msgstr ""
@@ -4871,10 +4938,6 @@ msgstr ""
 msgid "10"
 msgstr "10"
 
 msgid "10"
 msgstr "10"
 
-#: hacks/config/lavalite.xml.h:3
-msgid "Activity"
-msgstr "Hoạt động"
-
 #: hacks/config/lavalite.xml.h:4
 msgid "Classic Lavalite"
 msgstr ""
 #: hacks/config/lavalite.xml.h:4
 msgid "Classic Lavalite"
 msgstr ""
@@ -5606,6 +5669,41 @@ msgid ""
 "invisibility at intersection points. Written by Geoffrey Irving."
 msgstr ""
 
 "invisibility at intersection points. Written by Geoffrey Irving."
 msgstr ""
 
+#: hacks/config/pinion.xml.h:1
+#, fuzzy
+msgid "100"
+msgstr "100%"
+
+#: hacks/config/pinion.xml.h:2
+msgid "2000"
+msgstr ""
+
+#: hacks/config/pinion.xml.h:4
+msgid ""
+"Draws an interconnected set of gears moving across the screen. Written by "
+"Jamie Zawinski."
+msgstr ""
+
+#: hacks/config/pinion.xml.h:6
+#, fuzzy
+msgid "Gear Size"
+msgstr "Kích cỡ đường kẻ ô"
+
+#: hacks/config/pinion.xml.h:8
+#, fuzzy
+msgid "Max RPM"
+msgstr "Vòng tối đa"
+
+#: hacks/config/pinion.xml.h:9
+#, fuzzy
+msgid "Pinion"
+msgstr "Đóng gói"
+
+#: hacks/config/pinion.xml.h:11
+#, fuzzy
+msgid "Scrolling Speed"
+msgstr "Tốc độ cuộn"
+
 #: hacks/config/pipes.xml.h:1
 msgid "Allow Tight Turns"
 msgstr ""
 #: hacks/config/pipes.xml.h:1
 msgid "Allow Tight Turns"
 msgstr ""
@@ -5632,7 +5730,8 @@ msgid ""
 "probably seen this GL hack. This version is by Marcelo Vianna."
 msgstr ""
 
 "probably seen this GL hack. This version is by Marcelo Vianna."
 msgstr ""
 
-#: hacks/config/pipes.xml.h:9 hacks/config/wormhole.xml.h:4
+#: hacks/config/pipes.xml.h:9 hacks/config/substrate.xml.h:7
+#: hacks/config/wormhole.xml.h:4
 msgid "Lots"
 msgstr ""
 
 msgid "Lots"
 msgstr ""
 
@@ -6870,22 +6969,26 @@ msgid "Ping subnet/30 (2 hosts)"
 msgstr ""
 
 #: hacks/config/sonar.xml.h:10
 msgstr ""
 
 #: hacks/config/sonar.xml.h:10
-msgid "Simulation Team Members"
+msgid "Resolve Host Names"
 msgstr ""
 
 #: hacks/config/sonar.xml.h:11
 msgstr ""
 
 #: hacks/config/sonar.xml.h:11
-msgid "Sonar"
+msgid "Simulation Team Members"
 msgstr ""
 
 #: hacks/config/sonar.xml.h:12
 msgstr ""
 
 #: hacks/config/sonar.xml.h:12
+msgid "Sonar"
+msgstr ""
+
+#: hacks/config/sonar.xml.h:13
 msgid "Team A Name"
 msgstr "Tên đội A"
 
 msgid "Team A Name"
 msgstr "Tên đội A"
 
-#: hacks/config/sonar.xml.h:13
+#: hacks/config/sonar.xml.h:14
 msgid "Team B Name"
 msgstr "Tên đội B"
 
 msgid "Team B Name"
 msgstr "Tên đội B"
 
-#: hacks/config/sonar.xml.h:14
+#: hacks/config/sonar.xml.h:15
 msgid ""
 "This program draws a simulation of a sonar screen. By default, it displays a "
 "random assortment of ``bogies'' on the screen, but if installed as \"setuid "
 msgid ""
 "This program draws a simulation of a sonar screen. By default, it displays a "
 "random assortment of ``bogies'' on the screen, but if installed as \"setuid "
@@ -6894,7 +6997,7 @@ msgid ""
 "Martin and Jamie Zawinski."
 msgstr ""
 
 "Martin and Jamie Zawinski."
 msgstr ""
 
-#: hacks/config/sonar.xml.h:15
+#: hacks/config/sonar.xml.h:16
 msgid "vs."
 msgstr "vs."
 
 msgid "vs."
 msgstr "vs."
 
@@ -7167,6 +7270,33 @@ msgid ""
 "Written by Massimino Pascal."
 msgstr ""
 
 "Written by Massimino Pascal."
 msgstr ""
 
+#: hacks/config/substrate.xml.h:4
+#, fuzzy
+msgid "Initial Cracks"
+msgstr "Mật độ"
+
+#: hacks/config/substrate.xml.h:5
+msgid ""
+"Lines like crystals grow on a computational substrate. A simple "
+"perpendicular growth rule creates intricate city-like structures. By J. "
+"Tarbell and Mike Kershaw."
+msgstr ""
+
+#: hacks/config/substrate.xml.h:8
+#, fuzzy
+msgid "Sandgrains"
+msgstr "Chuẩn"
+
+#: hacks/config/substrate.xml.h:12
+#, fuzzy
+msgid "Substrate"
+msgstr "Trạng thái"
+
+#: hacks/config/substrate.xml.h:13
+#, fuzzy
+msgid "Wireframe only"
+msgstr "Hiển thị Wireframe"
+
 #: hacks/config/superquadrics.xml.h:3
 msgid ""
 "Ed Mackey reports that he wrote the first version of this program in BASIC "
 #: hacks/config/superquadrics.xml.h:3
 msgid ""
 "Ed Mackey reports that he wrote the first version of this program in BASIC "
@@ -8327,6 +8457,15 @@ msgstr ""
 "kết quả thấy được như là nhìn qua nhiều lớp thấu kính chứ không phải qua một "
 "thấu kính đơn thuần. Do James Macnicol viết."
 
 "kết quả thấy được như là nhìn qua nhiều lớp thấu kính chứ không phải qua một "
 "thấu kính đơn thuần. Do James Macnicol viết."
 
+#~ msgid "Freeze Some Bees"
+#~ msgstr "Tê liệt vài con ong"
+
+#~ msgid "Ride a Trained Bee"
+#~ msgstr "Cưỡi ong được luyện"
+
+#~ msgid "Zoom In and Out"
+#~ msgstr "Phóng to Thu nhỏ"
+
 #~ msgid "Configure the settings of the screensaver."
 #~ msgstr "Cấu hình thiết lập trình Bảo vệ Màn hình."
 
 #~ msgid "Configure the settings of the screensaver."
 #~ msgstr "Cấu hình thiết lập trình Bảo vệ Màn hình."
 
index 8f671650e2d97442d306e35ec654b7f14a337823..74c5eeccc25365ee3829ddf77a651f215bca6cca 100644 (file)
--- a/po/wa.po
+++ b/po/wa.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: xscreensaver VERSION\n"
 "Report-Msgid-Bugs-To: \n"
 msgstr ""
 "Project-Id-Version: xscreensaver VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2004-10-04 16:25+0200\n"
+"POT-Creation-Date: 2004-12-22 12:51+0100\n"
 "PO-Revision-Date: 2002-04-29 16:40MET\n"
 "Last-Translator: Pablo Saratxaga <pablo@mandrakesoft.com>\n"
 "Language-Team: Walon <linux-wa@chanae.alphanet.ch>\n"
 "PO-Revision-Date: 2002-04-29 16:40MET\n"
 "Last-Translator: Pablo Saratxaga <pablo@mandrakesoft.com>\n"
 "Language-Team: Walon <linux-wa@chanae.alphanet.ch>\n"
@@ -154,7 +154,7 @@ msgstr ""
 msgid "minutes"
 msgstr "munutes"
 
 msgid "minutes"
 msgstr "munutes"
 
-#: driver/demo-Gtk-widgets.c:482 driver/demo-Gtk.c:2845
+#: driver/demo-Gtk-widgets.c:482 driver/demo-Gtk.c:2852
 #: driver/xscreensaver-demo.glade.h:58
 msgid "Preview"
 msgstr "Sayî"
 #: driver/xscreensaver-demo.glade.h:58
 msgid "Preview"
 msgstr "Sayî"
@@ -199,12 +199,12 @@ msgstr "Rén k' on spårgneu di waitroûle"
 msgid "Random Screen Saver"
 msgstr "Sipårgneus di waitroûle a l' astcheyance"
 
 msgid "Random Screen Saver"
 msgstr "Sipårgneus di waitroûle a l' astcheyance"
 
-#: driver/demo-Gtk-widgets.c:571 driver/demo-Gtk.c:2134
+#: driver/demo-Gtk-widgets.c:571 driver/demo-Gtk.c:2141
 #: driver/xscreensaver-demo.glade.h:75
 msgid "Use"
 msgstr "Eployî"
 
 #: driver/xscreensaver-demo.glade.h:75
 msgid "Use"
 msgstr "Eployî"
 
-#: driver/demo-Gtk-widgets.c:591 driver/demo-Gtk.c:2144
+#: driver/demo-Gtk-widgets.c:591 driver/demo-Gtk.c:2151
 #: driver/xscreensaver-demo.glade.h:63
 msgid "Screen Saver"
 msgstr "Sipårgneu di waitroûle"
 #: driver/xscreensaver-demo.glade.h:63
 msgid "Screen Saver"
 msgstr "Sipårgneu di waitroûle"
@@ -438,7 +438,7 @@ msgid "Visual:"
 msgstr ""
 
 #: driver/demo-Gtk-widgets.c:1550 driver/demo-Gtk-widgets.c:1573
 msgstr ""
 
 #: driver/demo-Gtk-widgets.c:1550 driver/demo-Gtk-widgets.c:1573
-#: driver/demo-Gtk.c:1538 driver/demo-Gtk.c:2864
+#: driver/demo-Gtk.c:1545 driver/demo-Gtk.c:2871
 #: driver/xscreensaver-demo.glade.h:5 driver/xscreensaver-demo.glade2.h:3
 msgid "Any"
 msgstr "Tot l' minme li kék"
 #: driver/xscreensaver-demo.glade.h:5 driver/xscreensaver-demo.glade2.h:3
 msgid "Any"
 msgstr "Tot l' minme li kék"
@@ -539,7 +539,7 @@ msgstr "Sitandård <<"
 msgid "Back to the graphical configuration options."
 msgstr ""
 
 msgid "Back to the graphical configuration options."
 msgstr ""
 
-#: driver/demo-Gtk-widgets.c:1709 driver/demo-Gtk.c:741
+#: driver/demo-Gtk-widgets.c:1709 driver/demo-Gtk.c:748
 #: driver/xscreensaver-demo.glade.h:54
 msgid "OK"
 msgstr "'l est bon"
 #: driver/xscreensaver-demo.glade.h:54
 msgid "OK"
 msgstr "'l est bon"
@@ -548,18 +548,18 @@ msgstr "'l est bon"
 msgid "Cancel"
 msgstr "Rinoncî"
 
 msgid "Cancel"
 msgstr "Rinoncî"
 
-#: driver/demo-Gtk.c:649
+#: driver/demo-Gtk.c:656
 msgid "For updates, check http://www.jwz.org/xscreensaver/"
 msgstr "Po les metaedjes a djoû, loukîz http://www.jwz.org/xscreensaver/"
 
 msgid "For updates, check http://www.jwz.org/xscreensaver/"
 msgstr "Po les metaedjes a djoû, loukîz http://www.jwz.org/xscreensaver/"
 
-#: driver/demo-Gtk.c:779
+#: driver/demo-Gtk.c:786
 msgid ""
 "Error:\n"
 "\n"
 "No Help URL has been specified.\n"
 msgstr ""
 
 msgid ""
 "Error:\n"
 "\n"
 "No Help URL has been specified.\n"
 msgstr ""
 
-#: driver/demo-Gtk.c:865
+#: driver/demo-Gtk.c:872
 msgid ""
 "Error:\n"
 "\n"
 msgid ""
 "Error:\n"
 "\n"
@@ -567,7 +567,7 @@ msgid ""
 "\n"
 msgstr ""
 
 "\n"
 msgstr ""
 
-#: driver/demo-Gtk.c:877
+#: driver/demo-Gtk.c:884
 msgid ""
 "You are running as root.  This usually means that xscreensaver\n"
 "was unable to contact your X server because access control is\n"
 msgid ""
 "You are running as root.  This usually means that xscreensaver\n"
 "was unable to contact your X server because access control is\n"
@@ -586,18 +586,18 @@ msgid ""
 "normal user, and `su' as necessary."
 msgstr ""
 
 "normal user, and `su' as necessary."
 msgstr ""
 
-#: driver/demo-Gtk.c:893
+#: driver/demo-Gtk.c:900
 msgid "Please check your $PATH and permissions."
 msgstr ""
 
 msgid "Please check your $PATH and permissions."
 msgstr ""
 
-#: driver/demo-Gtk.c:928
+#: driver/demo-Gtk.c:935
 msgid ""
 "Error:\n"
 "\n"
 "Couldn't determine init file name!\n"
 msgstr ""
 
 msgid ""
 "Error:\n"
 "\n"
 "Couldn't determine init file name!\n"
 msgstr ""
 
-#: driver/demo-Gtk.c:933
+#: driver/demo-Gtk.c:940
 #, c-format
 msgid ""
 "Error:\n"
 #, c-format
 msgid ""
 "Error:\n"
@@ -605,14 +605,14 @@ msgid ""
 "Couldn't write %s\n"
 msgstr ""
 
 "Couldn't write %s\n"
 msgstr ""
 
-#: driver/demo-Gtk.c:992
+#: driver/demo-Gtk.c:999
 msgid ""
 "Error:\n"
 "\n"
 "no `manualCommand' resource set."
 msgstr ""
 
 msgid ""
 "Error:\n"
 "\n"
 "no `manualCommand' resource set."
 msgstr ""
 
-#: driver/demo-Gtk.c:1173
+#: driver/demo-Gtk.c:1180
 #, c-format
 msgid ""
 "Error:\n"
 #, c-format
 msgid ""
 "Error:\n"
@@ -620,7 +620,7 @@ msgid ""
 "Unparsable time format: \"%s\"\n"
 msgstr ""
 
 "Unparsable time format: \"%s\"\n"
 msgstr ""
 
-#: driver/demo-Gtk.c:1829
+#: driver/demo-Gtk.c:1836
 #, c-format
 msgid ""
 "Error:\n"
 #, c-format
 msgid ""
 "Error:\n"
@@ -628,28 +628,28 @@ msgid ""
 "Directory does not exist: \"%s\"\n"
 msgstr ""
 
 "Directory does not exist: \"%s\"\n"
 msgstr ""
 
-#: driver/demo-Gtk.c:2546
+#: driver/demo-Gtk.c:2553
 msgid "Descriptions not available: no XML support compiled in."
 msgstr ""
 
 msgid "Descriptions not available: no XML support compiled in."
 msgstr ""
 
-#: driver/demo-Gtk.c:2551
+#: driver/demo-Gtk.c:2558
 msgid "No description available."
 msgstr "I gn a pont d' discrijhaedje."
 
 msgid "No description available."
 msgstr "I gn a pont d' discrijhaedje."
 
-#: driver/demo-Gtk.c:2816
+#: driver/demo-Gtk.c:2823
 msgid "Blank Screen"
 msgstr "Noere waitroûle"
 
 msgid "Blank Screen"
 msgstr "Noere waitroûle"
 
-#: driver/demo-Gtk.c:2822
+#: driver/demo-Gtk.c:2829
 msgid "Screen Saver Disabled"
 msgstr "Sipårgneu di waitroûle essocté"
 
 msgid "Screen Saver Disabled"
 msgstr "Sipårgneu di waitroûle essocté"
 
-#: driver/demo-Gtk.c:2855
+#: driver/demo-Gtk.c:2862
 #, c-format
 msgid "%s: %.100s Settings"
 msgstr ""
 
 #, c-format
 msgid "%s: %.100s Settings"
 msgstr ""
 
-#: driver/demo-Gtk.c:3010
+#: driver/demo-Gtk.c:3017
 #, c-format
 msgid ""
 "Warning:\n"
 #, c-format
 msgid ""
 "Warning:\n"
@@ -657,23 +657,23 @@ msgid ""
 "file \"%s\" has changed, reloading.\n"
 msgstr ""
 
 "file \"%s\" has changed, reloading.\n"
 msgstr ""
 
-#: driver/demo-Gtk.c:3092
+#: driver/demo-Gtk.c:3099
 msgid "No Preview"
 msgstr ""
 
 msgid "No Preview"
 msgstr ""
 
-#: driver/demo-Gtk.c:3092
+#: driver/demo-Gtk.c:3099
 msgid "Available"
 msgstr ""
 
 msgid "Available"
 msgstr ""
 
-#: driver/demo-Gtk.c:3093
+#: driver/demo-Gtk.c:3100
 msgid "Not"
 msgstr ""
 
 msgid "Not"
 msgstr ""
 
-#: driver/demo-Gtk.c:3093
+#: driver/demo-Gtk.c:3100
 msgid "Installed"
 msgstr ""
 
 msgid "Installed"
 msgstr ""
 
-#: driver/demo-Gtk.c:3858
+#: driver/demo-Gtk.c:3865
 #, c-format
 msgid ""
 "Warning:\n"
 #, c-format
 msgid ""
 "Warning:\n"
@@ -682,7 +682,7 @@ msgid ""
 "on display \"%s\".  Launch it now?"
 msgstr ""
 
 "on display \"%s\".  Launch it now?"
 msgstr ""
 
-#: driver/demo-Gtk.c:3868
+#: driver/demo-Gtk.c:3875
 #, c-format
 msgid ""
 "Warning:\n"
 #, c-format
 msgid ""
 "Warning:\n"
@@ -701,7 +701,7 @@ msgid ""
 "Restart the xscreensaver daemon now?\n"
 msgstr ""
 
 "Restart the xscreensaver daemon now?\n"
 msgstr ""
 
-#: driver/demo-Gtk.c:3893
+#: driver/demo-Gtk.c:3900
 #, c-format
 msgid ""
 "Warning:\n"
 #, c-format
 msgid ""
 "Warning:\n"
@@ -717,7 +717,7 @@ msgid ""
 "Restart the daemon on \"%s\" as \"%s\" now?\n"
 msgstr ""
 
 "Restart the daemon on \"%s\" as \"%s\" now?\n"
 msgstr ""
 
-#: driver/demo-Gtk.c:3915
+#: driver/demo-Gtk.c:3922
 #, c-format
 msgid ""
 "Warning:\n"
 #, c-format
 msgid ""
 "Warning:\n"
@@ -729,12 +729,12 @@ msgid ""
 "Restart the xscreensaver daemon now?\n"
 msgstr ""
 
 "Restart the xscreensaver daemon now?\n"
 msgstr ""
 
-#: driver/demo-Gtk.c:4372
+#: driver/demo-Gtk.c:4379
 #, c-format
 msgid "%s: unknown option: %s\n"
 msgstr ""
 
 #, c-format
 msgid "%s: unknown option: %s\n"
 msgstr ""
 
-#: driver/demo-Gtk.c:4436
+#: driver/demo-Gtk.c:4443
 #, fuzzy
 msgid "Screensaver Preferences"
 msgstr "Spårgneu di waitroûle"
 #, fuzzy
 msgid "Screensaver Preferences"
 msgstr "Spårgneu di waitroûle"
@@ -951,22 +951,23 @@ msgstr ""
 #: 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/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:5 hacks/config/flyingtoasters.xml.h:5
-#: hacks/config/fontglide.xml.h:4 hacks/config/forest.xml.h:1
-#: hacks/config/fuzzyflakes.xml.h:7 hacks/config/galaxy.xml.h:3
-#: hacks/config/gears.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:6
-#: 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/fadeplot.xml.h:4 hacks/config/fireworkx.xml.h:3
+#: 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:2 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/fuzzyflakes.xml.h:7
+#: hacks/config/galaxy.xml.h:3 hacks/config/gears.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:6 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/intermomentary.xml.h:1 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/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
@@ -984,23 +985,24 @@ msgstr ""
 #: hacks/config/pacman.xml.h:1 hacks/config/penetrate.xml.h:3
 #: hacks/config/penrose.xml.h:6 hacks/config/petri.xml.h:5
 #: hacks/config/phosphor.xml.h:4 hacks/config/piecewise.xml.h:4
 #: hacks/config/pacman.xml.h:1 hacks/config/penetrate.xml.h:3
 #: hacks/config/penrose.xml.h:6 hacks/config/petri.xml.h:5
 #: hacks/config/phosphor.xml.h:4 hacks/config/piecewise.xml.h:4
-#: hacks/config/pipes.xml.h:5 hacks/config/polyhedra.xml.h:18
-#: hacks/config/polyominoes.xml.h:2 hacks/config/polytopes.xml.h:11
-#: hacks/config/pong.xml.h:1 hacks/config/popsquares.xml.h:3
-#: hacks/config/providence.xml.h:2 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 hacks/config/rocks.xml.h:4
-#: hacks/config/rotor.xml.h:3 hacks/config/rubik.xml.h:3
-#: hacks/config/sballs.xml.h:4 hacks/config/shadebobs.xml.h:3
-#: hacks/config/sierpinski.xml.h:2 hacks/config/sierpinski3d.xml.h:2
-#: hacks/config/slidescreen.xml.h:2 hacks/config/slip.xml.h:2
-#: hacks/config/speedmine.xml.h:3 hacks/config/sphere.xml.h:2
-#: hacks/config/spheremonics.xml.h:5 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:1 hacks/config/superquadrics.xml.h:4
+#: hacks/config/pinion.xml.h:5 hacks/config/pipes.xml.h:5
+#: hacks/config/polyhedra.xml.h:18 hacks/config/polyominoes.xml.h:2
+#: hacks/config/polytopes.xml.h:11 hacks/config/pong.xml.h:1
+#: hacks/config/popsquares.xml.h:3 hacks/config/providence.xml.h:2
+#: 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
+#: hacks/config/rocks.xml.h:4 hacks/config/rotor.xml.h:3
+#: hacks/config/rubik.xml.h:3 hacks/config/sballs.xml.h:4
+#: hacks/config/shadebobs.xml.h:3 hacks/config/sierpinski.xml.h:2
+#: hacks/config/sierpinski3d.xml.h:2 hacks/config/slidescreen.xml.h:2
+#: hacks/config/slip.xml.h:2 hacks/config/speedmine.xml.h:3
+#: hacks/config/sphere.xml.h:2 hacks/config/spheremonics.xml.h:5
+#: 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:1
+#: hacks/config/substrate.xml.h:2 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/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
@@ -1022,8 +1024,9 @@ msgstr "Roed"
 #: hacks/config/fuzzyflakes.xml.h:8 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/fuzzyflakes.xml.h:8 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/wormhole.xml.h:3 hacks/config/xfishtank.xml.h:4
+#: hacks/config/substrate.xml.h:3 hacks/config/thornbird.xml.h:3
+#: hacks/config/whirlwindwarp.xml.h:1 hacks/config/wormhole.xml.h:3
+#: hacks/config/xfishtank.xml.h:4
 msgid "Few"
 msgstr "Waire"
 
 msgid "Few"
 msgstr "Waire"
 
@@ -1039,7 +1042,7 @@ msgstr "Waire"
 #: hacks/config/epicycle.xml.h:8 hacks/config/eruption.xml.h:12
 #: hacks/config/euler2d.xml.h:8 hacks/config/fadeplot.xml.h:6
 #: hacks/config/flag.xml.h:5 hacks/config/flame.xml.h:11
 #: hacks/config/epicycle.xml.h:8 hacks/config/eruption.xml.h:12
 #: hacks/config/euler2d.xml.h:8 hacks/config/fadeplot.xml.h:6
 #: hacks/config/flag.xml.h:5 hacks/config/flame.xml.h:11
-#: hacks/config/flow.xml.h:8 hacks/config/fluidballs.xml.h:13
+#: hacks/config/flow.xml.h:7 hacks/config/fluidballs.xml.h:13
 #: hacks/config/forest.xml.h:3 hacks/config/fuzzyflakes.xml.h:12
 #: 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/forest.xml.h:3 hacks/config/fuzzyflakes.xml.h:12
 #: hacks/config/galaxy.xml.h:6 hacks/config/grav.xml.h:4
 #: hacks/config/halo.xml.h:4 hacks/config/hopalong.xml.h:15
@@ -1077,7 +1080,7 @@ msgstr "Bråmint"
 #: 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/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/flow.xml.h:8 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/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
@@ -1131,22 +1134,23 @@ msgstr ""
 #: 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/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/flyingtoasters.xml.h:11
-#: hacks/config/fontglide.xml.h:13 hacks/config/forest.xml.h:5
-#: hacks/config/fuzzyflakes.xml.h:15 hacks/config/galaxy.xml.h:10
-#: hacks/config/gears.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:8 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:10 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/fadeplot.xml.h:8 hacks/config/fireworkx.xml.h:9
+#: 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:10 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/fuzzyflakes.xml.h:15
+#: hacks/config/galaxy.xml.h:11 hacks/config/gears.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:8
+#: 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:10
+#: 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/intermomentary.xml.h:4 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/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
@@ -1164,23 +1168,24 @@ msgstr ""
 #: hacks/config/pacman.xml.h:5 hacks/config/penetrate.xml.h:6
 #: hacks/config/penrose.xml.h:11 hacks/config/petri.xml.h:23
 #: hacks/config/phosphor.xml.h:7 hacks/config/piecewise.xml.h:9
 #: hacks/config/pacman.xml.h:5 hacks/config/penetrate.xml.h:6
 #: hacks/config/penrose.xml.h:11 hacks/config/petri.xml.h:23
 #: hacks/config/phosphor.xml.h:7 hacks/config/piecewise.xml.h:9
-#: hacks/config/pipes.xml.h:15 hacks/config/polyhedra.xml.h:119
-#: hacks/config/polyominoes.xml.h:10 hacks/config/polytopes.xml.h:20
-#: hacks/config/pong.xml.h:4 hacks/config/popsquares.xml.h:5
-#: hacks/config/providence.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 hacks/config/rocks.xml.h:9
-#: hacks/config/rotor.xml.h:11 hacks/config/rubik.xml.h:9
-#: hacks/config/sballs.xml.h:13 hacks/config/shadebobs.xml.h:9
-#: hacks/config/sierpinski.xml.h:7 hacks/config/sierpinski3d.xml.h:8
-#: hacks/config/slidescreen.xml.h:6 hacks/config/slip.xml.h:7
-#: hacks/config/speedmine.xml.h:13 hacks/config/sphere.xml.h:5
-#: hacks/config/spheremonics.xml.h:19 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:4 hacks/config/superquadrics.xml.h:8
+#: hacks/config/pinion.xml.h:13 hacks/config/pipes.xml.h:15
+#: hacks/config/polyhedra.xml.h:119 hacks/config/polyominoes.xml.h:10
+#: hacks/config/polytopes.xml.h:20 hacks/config/pong.xml.h:4
+#: hacks/config/popsquares.xml.h:5 hacks/config/providence.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
+#: hacks/config/rocks.xml.h:9 hacks/config/rotor.xml.h:11
+#: hacks/config/rubik.xml.h:9 hacks/config/sballs.xml.h:13
+#: hacks/config/shadebobs.xml.h:9 hacks/config/sierpinski.xml.h:7
+#: hacks/config/sierpinski3d.xml.h:8 hacks/config/slidescreen.xml.h:6
+#: hacks/config/slip.xml.h:7 hacks/config/speedmine.xml.h:13
+#: hacks/config/sphere.xml.h:5 hacks/config/spheremonics.xml.h:19
+#: 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:4
+#: hacks/config/substrate.xml.h:10 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/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
@@ -1213,17 +1218,18 @@ msgstr "Londjin"
 #: hacks/config/engine.xml.h:16 hacks/config/epicycle.xml.h:11
 #: 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/engine.xml.h:16 hacks/config/epicycle.xml.h:11
 #: 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/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/fuzzyflakes.xml.h:17
-#: hacks/config/galaxy.xml.h:11 hacks/config/glblur.xml.h:17
-#: hacks/config/glforestfire.xml.h:15 hacks/config/glplanet.xml.h:10
-#: 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:11 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/fireworkx.xml.h:11 hacks/config/flag.xml.h:9
+#: hacks/config/flame.xml.h:15 hacks/config/flipflop.xml.h:7
+#: hacks/config/flipscreen3d.xml.h:7 hacks/config/flow.xml.h:12
+#: hacks/config/fluidballs.xml.h:20 hacks/config/forest.xml.h:6
+#: hacks/config/fuzzyflakes.xml.h:17 hacks/config/galaxy.xml.h:12
+#: hacks/config/glblur.xml.h:17 hacks/config/glforestfire.xml.h:15
+#: hacks/config/glplanet.xml.h:10 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:11
+#: 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/intermomentary.xml.h:5 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/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
@@ -1252,16 +1258,16 @@ msgstr "Londjin"
 #: 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/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/xplanet.xml.h:60 hacks/config/xrayswarm.xml.h:4
-#: hacks/config/zoom.xml.h:7
+#: hacks/config/strange.xml.h:5 hacks/config/substrate.xml.h:11
+#: 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/xplanet.xml.h:60
+#: hacks/config/xrayswarm.xml.h:4 hacks/config/zoom.xml.h:7
 msgid "Speed"
 msgstr "Roedeu"
 
 msgid "Speed"
 msgstr "Roedeu"
 
@@ -1304,8 +1310,8 @@ msgstr ""
 #: hacks/config/discrete.xml.h:11 hacks/config/drift.xml.h:14
 #: hacks/config/epicycle.xml.h:13 hacks/config/euler2d.xml.h:17
 #: hacks/config/fadeplot.xml.h:12 hacks/config/flag.xml.h:13
 #: hacks/config/discrete.xml.h:11 hacks/config/drift.xml.h:14
 #: hacks/config/epicycle.xml.h:13 hacks/config/euler2d.xml.h:17
 #: hacks/config/fadeplot.xml.h:12 hacks/config/flag.xml.h:13
-#: hacks/config/flame.xml.h:16 hacks/config/flow.xml.h:18
-#: hacks/config/forest.xml.h:8 hacks/config/galaxy.xml.h:13
+#: hacks/config/flame.xml.h:16 hacks/config/flow.xml.h:15
+#: hacks/config/forest.xml.h:8 hacks/config/galaxy.xml.h:14
 #: hacks/config/grav.xml.h:11 hacks/config/halo.xml.h:13
 #: hacks/config/hopalong.xml.h:25 hacks/config/ifs.xml.h:8
 #: hacks/config/imsmap.xml.h:15 hacks/config/interference.xml.h:19
 #: hacks/config/grav.xml.h:11 hacks/config/halo.xml.h:13
 #: hacks/config/hopalong.xml.h:25 hacks/config/ifs.xml.h:8
 #: hacks/config/imsmap.xml.h:15 hacks/config/interference.xml.h:19
@@ -1403,7 +1409,7 @@ msgstr ""
 #: 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/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/flag.xml.h:4 hacks/config/flow.xml.h:4
 #: hacks/config/fluidballs.xml.h:12 hacks/config/fuzzyflakes.xml.h:10
 #: 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/fluidballs.xml.h:12 hacks/config/fuzzyflakes.xml.h:10
 #: hacks/config/gleidescope.xml.h:7 hacks/config/halftone.xml.h:8
 #: hacks/config/hopalong.xml.h:13 hacks/config/interference.xml.h:11
@@ -1435,7 +1441,7 @@ msgstr ""
 #: 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/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/flag.xml.h:8 hacks/config/flow.xml.h:11
 #: hacks/config/fluidballs.xml.h:19 hacks/config/fuzzyflakes.xml.h:16
 #: 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/fluidballs.xml.h:19 hacks/config/fuzzyflakes.xml.h:16
 #: hacks/config/gleidescope.xml.h:12 hacks/config/halftone.xml.h:14
 #: hacks/config/hopalong.xml.h:22 hacks/config/interference.xml.h:18
@@ -1454,7 +1460,7 @@ msgstr ""
 
 #: 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/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/flag.xml.h:12 hacks/config/flow.xml.h:14
 #: hacks/config/lissie.xml.h:12 hacks/config/loop.xml.h:11
 #: hacks/config/rubik.xml.h:12 hacks/config/sierpinski.xml.h:11
 #: hacks/config/slip.xml.h:11
 #: hacks/config/lissie.xml.h:12 hacks/config/loop.xml.h:11
 #: hacks/config/rubik.xml.h:12 hacks/config/sierpinski.xml.h:11
 #: hacks/config/slip.xml.h:11
@@ -1505,13 +1511,14 @@ msgstr ""
 #: hacks/config/menger.xml.h:15 hacks/config/mirrorblob.xml.h:18
 #: hacks/config/moebius.xml.h:6 hacks/config/molecule.xml.h:21
 #: hacks/config/morph3d.xml.h:5 hacks/config/noof.xml.h:4
 #: hacks/config/menger.xml.h:15 hacks/config/mirrorblob.xml.h:18
 #: hacks/config/moebius.xml.h:6 hacks/config/molecule.xml.h:21
 #: hacks/config/morph3d.xml.h:5 hacks/config/noof.xml.h:4
-#: hacks/config/pipes.xml.h:14 hacks/config/polyhedra.xml.h:118
-#: hacks/config/polytopes.xml.h:18 hacks/config/providence.xml.h:4
-#: 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
+#: hacks/config/pinion.xml.h:12 hacks/config/pipes.xml.h:14
+#: hacks/config/polyhedra.xml.h:118 hacks/config/polytopes.xml.h:18
+#: hacks/config/providence.xml.h:4 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 ""
 
 msgid "Show Frames-per-Second"
 msgstr ""
 
@@ -1672,11 +1679,12 @@ msgstr "Roedeu des balinnes"
 #: hacks/config/lament.xml.h:9 hacks/config/lavalite.xml.h:32
 #: hacks/config/menger.xml.h:21 hacks/config/mirrorblob.xml.h:24
 #: hacks/config/moebius.xml.h:11 hacks/config/molecule.xml.h:26
 #: hacks/config/lament.xml.h:9 hacks/config/lavalite.xml.h:32
 #: hacks/config/menger.xml.h:21 hacks/config/mirrorblob.xml.h:24
 #: hacks/config/moebius.xml.h:11 hacks/config/molecule.xml.h:26
-#: hacks/config/polyhedra.xml.h:173 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
+#: hacks/config/pinion.xml.h:15 hacks/config/polyhedra.xml.h:173
+#: 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 ""
 
 msgid "Wireframe"
 msgstr ""
 
@@ -1764,14 +1772,15 @@ msgstr "Royes"
 #: 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/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/mismunch.xml.h:3
-#: 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 hacks/config/spheremonics.xml.h:7
+#: hacks/config/flow.xml.h:6 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/mismunch.xml.h:3 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
+#: hacks/config/spheremonics.xml.h:7 hacks/config/substrate.xml.h:6
 #: hacks/config/wander.xml.h:10 hacks/config/whirlwindwarp.xml.h:3
 msgid "Long"
 msgstr "Long"
 #: hacks/config/wander.xml.h:10 hacks/config/whirlwindwarp.xml.h:3
 msgid "Long"
 msgstr "Long"
@@ -1818,13 +1827,14 @@ msgstr ""
 #: 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/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/metaballs.xml.h:12 hacks/config/mismunch.xml.h:8
-#: 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/flow.xml.h:9 hacks/config/galaxy.xml.h:9
+#: hacks/config/klein.xml.h:5 hacks/config/laser.xml.h:9
+#: hacks/config/menger.xml.h:14 hacks/config/metaballs.xml.h:12
+#: hacks/config/mismunch.xml.h:8 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/substrate.xml.h:9
 #: hacks/config/wander.xml.h:12 hacks/config/whirlwindwarp.xml.h:6
 msgid "Short"
 msgstr "Court"
 #: hacks/config/wander.xml.h:12 hacks/config/whirlwindwarp.xml.h:6
 msgid "Short"
 msgstr "Court"
@@ -2024,10 +2034,10 @@ msgstr ""
 #: 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/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/polyhedra.xml.h:3 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/wormhole.xml.h:1
-#: hacks/config/xfishtank.xml.h:1
+#: hacks/config/pinion.xml.h:3 hacks/config/polyhedra.xml.h:3
+#: 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/wormhole.xml.h:1 hacks/config/xfishtank.xml.h:1
 msgid "Animation Speed"
 msgstr "Roedeu di l' animåcion"
 
 msgid "Animation Speed"
 msgstr "Roedeu di l' animåcion"
 
@@ -2106,8 +2116,9 @@ msgstr ""
 #: 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/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/starfish.xml.h:2 hacks/config/substrate.xml.h:1
+#: hacks/config/vidwhacker.xml.h:3 hacks/config/wander.xml.h:7
+#: hacks/config/xspirograph.xml.h:3
 msgid "Duration"
 msgstr ""
 
 msgid "Duration"
 msgstr ""
 
@@ -2361,7 +2372,7 @@ msgstr "Pårteyes"
 msgid "Rotate"
 msgstr "Fé tourner"
 
 msgid "Rotate"
 msgstr "Fé tourner"
 
-#: hacks/config/circuit.xml.h:8
+#: hacks/config/circuit.xml.h:8 hacks/config/pinion.xml.h:10
 msgid "Rotation Speed"
 msgstr ""
 
 msgid "Rotation Speed"
 msgstr ""
 
@@ -2447,11 +2458,12 @@ msgstr "1 segonde"
 msgid "Coral"
 msgstr "Corå"
 
 msgid "Coral"
 msgstr "Corå"
 
-#: hacks/config/coral.xml.h:4 hacks/config/gflux.xml.h:3
-#: hacks/config/glblur.xml.h:2 hacks/config/glmatrix.xml.h:3
-#: 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
+#: hacks/config/coral.xml.h:4 hacks/config/fireworkx.xml.h:2
+#: hacks/config/gflux.xml.h:3 hacks/config/glblur.xml.h:2
+#: hacks/config/glmatrix.xml.h:3 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
 msgid "Dense"
 msgstr "Dinse"
 
 msgid "Dense"
 msgstr "Dinse"
 
@@ -2464,12 +2476,12 @@ msgid ""
 "Simulates coral growth, albeit somewhat slowly. Written by Frederick Roeber."
 msgstr ""
 
 "Simulates coral growth, albeit somewhat slowly. Written by Frederick Roeber."
 msgstr ""
 
-#: hacks/config/coral.xml.h:13 hacks/config/gflux.xml.h:13
-#: hacks/config/glblur.xml.h:16 hacks/config/glmatrix.xml.h:19
-#: hacks/config/imsmap.xml.h:13 hacks/config/lavalite.xml.h:29
-#: hacks/config/pyro.xml.h:14 hacks/config/qix.xml.h:21
-#: hacks/config/squiral.xml.h:15 hacks/config/xearth.xml.h:24
-#: hacks/config/xmatrix.xml.h:17
+#: hacks/config/coral.xml.h:13 hacks/config/fireworkx.xml.h:10
+#: hacks/config/gflux.xml.h:13 hacks/config/glblur.xml.h:16
+#: hacks/config/glmatrix.xml.h:19 hacks/config/imsmap.xml.h:13
+#: hacks/config/lavalite.xml.h:29 hacks/config/pyro.xml.h:14
+#: hacks/config/qix.xml.h:21 hacks/config/squiral.xml.h:15
+#: hacks/config/xearth.xml.h:24 hacks/config/xmatrix.xml.h:17
 msgid "Sparse"
 msgstr ""
 
 msgid "Sparse"
 msgstr ""
 
@@ -2498,7 +2510,7 @@ msgid "Center on Screen"
 msgstr "Mitan del waitroûle"
 
 #: hacks/config/crystal.xml.h:2 hacks/config/deluxe.xml.h:1
 msgstr "Mitan del waitroûle"
 
 #: hacks/config/crystal.xml.h:2 hacks/config/deluxe.xml.h:1
-#: hacks/config/fadeplot.xml.h:1 hacks/config/flow.xml.h:3
+#: hacks/config/fadeplot.xml.h:1 hacks/config/flow.xml.h:1
 #: hacks/config/galaxy.xml.h:1 hacks/config/glforestfire.xml.h:1
 #: hacks/config/grav.xml.h:1 hacks/config/julia.xml.h:1
 #: hacks/config/laser.xml.h:1 hacks/config/lisa.xml.h:1
 #: hacks/config/galaxy.xml.h:1 hacks/config/glforestfire.xml.h:1
 #: hacks/config/grav.xml.h:1 hacks/config/julia.xml.h:1
 #: hacks/config/laser.xml.h:1 hacks/config/lisa.xml.h:1
@@ -3253,7 +3265,7 @@ msgstr ""
 msgid "Half"
 msgstr ""
 
 msgid "Half"
 msgstr ""
 
-#: hacks/config/fireflies.xml.h:17
+#: hacks/config/fireflies.xml.h:17 hacks/config/pinion.xml.h:7
 #, fuzzy
 msgid "Huge"
 msgstr "Foirt grande fonte"
 #, fuzzy
 msgid "Huge"
 msgstr "Foirt grande fonte"
@@ -3344,7 +3356,7 @@ msgstr ""
 msgid "Swarm tails glow"
 msgstr ""
 
 msgid "Swarm tails glow"
 msgstr ""
 
-#: hacks/config/fireflies.xml.h:43
+#: hacks/config/fireflies.xml.h:43 hacks/config/pinion.xml.h:14
 #, fuzzy
 msgid "Tiny"
 msgstr "Tene"
 #, fuzzy
 msgid "Tiny"
 msgstr "Tene"
@@ -3362,6 +3374,32 @@ msgstr "Vint"
 msgid "Wind picks up"
 msgstr ""
 
 msgid "Wind picks up"
 msgstr ""
 
+#: hacks/config/fireworkx.xml.h:1 hacks/config/lavalite.xml.h:3
+msgid "Activity"
+msgstr ""
+
+#: hacks/config/fireworkx.xml.h:4
+msgid "Fast Fade (more realistic)"
+msgstr ""
+
+#: hacks/config/fireworkx.xml.h:5
+#, fuzzy
+msgid "Fireworkx"
+msgstr "_Fitchî"
+
+#: hacks/config/fireworkx.xml.h:6
+msgid "Light effect"
+msgstr ""
+
+#: hacks/config/fireworkx.xml.h:7
+msgid "Pyrotechnics simulation eye-candy. Written by Rony B. Chandran."
+msgstr ""
+
+#: hacks/config/fireworkx.xml.h:8
+#, fuzzy
+msgid "Shoot"
+msgstr "Court"
+
 #: hacks/config/flag.xml.h:1
 msgid "Bitmap for Flag"
 msgstr "Imådje pol drapea"
 #: hacks/config/flag.xml.h:1
 msgid "Bitmap for Flag"
 msgstr "Imådje pol drapea"
@@ -3436,42 +3474,43 @@ msgid ""
 "around and deforms it in various ways. Written by Ben Buxton."
 msgstr ""
 
 "around and deforms it in various ways. Written by Ben Buxton."
 msgstr ""
 
-#: hacks/config/flow.xml.h:1
-msgid "Allow 2D Attractors"
-msgstr ""
-
-#: hacks/config/flow.xml.h:2
-msgid ""
-"Another series of strange attractors: a flowing series of points, making "
-"strange rotational shapes. Written by Tim Auckland."
+#: hacks/config/flow.xml.h:3
+msgid "Flow"
 msgstr ""
 
 #: hacks/config/flow.xml.h:5
 msgstr ""
 
 #: hacks/config/flow.xml.h:5
-msgid "Flow"
+msgid "Length of trails"
 msgstr ""
 
 msgstr ""
 
-#: hacks/config/flow.xml.h:6
-msgid "Freeze Some Bees"
+#: hacks/config/flow.xml.h:13
+msgid ""
+"Strange attractors formed of flows in a 3D differential equation phase "
+"space. Written by Tim Auckland."
 msgstr ""
 
 msgstr ""
 
-#: hacks/config/flow.xml.h:10
-msgid "Ride a Trained Bee"
+#: hacks/config/flow.xml.h:16
+msgid "turn on/off bounding box."
 msgstr ""
 
 msgstr ""
 
-#: hacks/config/flow.xml.h:11
-msgid "Rotate Around Attractor"
+#: hacks/config/flow.xml.h:17
+#, fuzzy
+msgid "turn on/off double buffering."
+msgstr "Dobe tampon"
+
+#: hacks/config/flow.xml.h:18
+msgid "turn on/off periodic attractors."
 msgstr ""
 
 msgstr ""
 
-#: hacks/config/flow.xml.h:12
-msgid "Show Bounding Box"
+#: hacks/config/flow.xml.h:19
+msgid "turn on/off ride in the flow."
 msgstr ""
 
 msgstr ""
 
-#: hacks/config/flow.xml.h:14
-msgid "Slow Bees with Antifreeze"
+#: hacks/config/flow.xml.h:20
+msgid "turn on/off rotating around attractor."
 msgstr ""
 
 msgstr ""
 
-#: hacks/config/flow.xml.h:19
-msgid "Zoom In and Out"
+#: hacks/config/flow.xml.h:21
+msgid "turn on/off search for new attractors."
 msgstr ""
 
 #: hacks/config/fluidballs.xml.h:1
 msgstr ""
 
 #: hacks/config/fluidballs.xml.h:1
@@ -3691,7 +3730,12 @@ msgstr "Movmint a l' astcheyance"
 msgid "Galaxy"
 msgstr "Galacseye"
 
 msgid "Galaxy"
 msgstr "Galacseye"
 
-#: hacks/config/galaxy.xml.h:9 hacks/config/lisa.xml.h:7
+#: hacks/config/galaxy.xml.h:8
+#, fuzzy
+msgid "Rotate Viewpoint"
+msgstr "Djupiter"
+
+#: hacks/config/galaxy.xml.h:10 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/pong.xml.h:3
 #: hacks/config/rotor.xml.h:10 hacks/config/rubik.xml.h:8
 #: hacks/config/lissie.xml.h:8 hacks/config/loop.xml.h:6
 #: hacks/config/penrose.xml.h:10 hacks/config/pong.xml.h:3
 #: hacks/config/rotor.xml.h:10 hacks/config/rubik.xml.h:8
@@ -3700,7 +3744,7 @@ msgstr "Galacseye"
 msgid "Size"
 msgstr "Grandeu"
 
 msgid "Size"
 msgstr "Grandeu"
 
-#: hacks/config/galaxy.xml.h:12
+#: hacks/config/galaxy.xml.h:13
 msgid ""
 "This draws spinning galaxies, which then collide and scatter their stars to "
 "the, uh, four winds or something. Originally an Amiga program by Uli "
 msgid ""
 "This draws spinning galaxies, which then collide and scatter their stars to "
 "the, uh, four winds or something. Originally an Amiga program by Uli "
@@ -4010,9 +4054,9 @@ msgid ""
 "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 "
 "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."
+"of this window: the tab at the top of the *other* window.) 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
 msgstr ""
 
 #: hacks/config/glslideshow.xml.h:17
@@ -4550,6 +4594,27 @@ msgstr "Nombe di waches"
 msgid "Wave Size"
 msgstr "Grandeu des waches"
 
 msgid "Wave Size"
 msgstr "Grandeu des waches"
 
+#: hacks/config/intermomentary.xml.h:2
+msgid "Intermomentary"
+msgstr ""
+
+#: hacks/config/intermomentary.xml.h:3
+#, fuzzy
+msgid "Number of Discs"
+msgstr "Nombe di taetches"
+
+#: hacks/config/intermomentary.xml.h:6
+msgid ""
+"The Intersection Momentary is a fun visualization defining the relationships "
+"between objects with Casey Reas, William Ngan, and Robert Hodgin. "
+"Commissioned for display at the Whitney Museum of American Art. A surface "
+"filled with 100 medium to small sized circles. Each circle has a different "
+"size and direction, but moves at the same slow rate. Display: A. The "
+"instantaneous intersections of the circles. B. The aggregate intersections "
+"of the circles. Ported to XScreensaver from the art project \"InterMomentary"
+"\" at http://www.complexification.net"
+msgstr ""
+
 #: hacks/config/jigglypuff.xml.h:2
 msgid "Chrome"
 msgstr ""
 #: hacks/config/jigglypuff.xml.h:2
 msgid "Chrome"
 msgstr ""
@@ -4772,10 +4837,6 @@ msgstr ""
 msgid "10"
 msgstr "10"
 
 msgid "10"
 msgstr "10"
 
-#: hacks/config/lavalite.xml.h:3
-msgid "Activity"
-msgstr ""
-
 #: hacks/config/lavalite.xml.h:4
 msgid "Classic Lavalite"
 msgstr ""
 #: hacks/config/lavalite.xml.h:4
 msgid "Classic Lavalite"
 msgstr ""
@@ -5499,6 +5560,40 @@ msgid ""
 "invisibility at intersection points. Written by Geoffrey Irving."
 msgstr ""
 
 "invisibility at intersection points. Written by Geoffrey Irving."
 msgstr ""
 
+#: hacks/config/pinion.xml.h:1
+#, fuzzy
+msgid "100"
+msgstr "100%"
+
+#: hacks/config/pinion.xml.h:2
+msgid "2000"
+msgstr ""
+
+#: hacks/config/pinion.xml.h:4
+msgid ""
+"Draws an interconnected set of gears moving across the screen. Written by "
+"Jamie Zawinski."
+msgstr ""
+
+#: hacks/config/pinion.xml.h:6
+#, fuzzy
+msgid "Gear Size"
+msgstr "Grandeu del grile"
+
+#: hacks/config/pinion.xml.h:8
+msgid "Max RPM"
+msgstr ""
+
+#: hacks/config/pinion.xml.h:9
+#, fuzzy
+msgid "Pinion"
+msgstr "Espåçmint"
+
+#: hacks/config/pinion.xml.h:11
+#, fuzzy
+msgid "Scrolling Speed"
+msgstr "Roedeu di l' animåcion"
+
 #: hacks/config/pipes.xml.h:1
 msgid "Allow Tight Turns"
 msgstr ""
 #: hacks/config/pipes.xml.h:1
 msgid "Allow Tight Turns"
 msgstr ""
@@ -5525,7 +5620,8 @@ msgid ""
 "probably seen this GL hack. This version is by Marcelo Vianna."
 msgstr ""
 
 "probably seen this GL hack. This version is by Marcelo Vianna."
 msgstr ""
 
-#: hacks/config/pipes.xml.h:9 hacks/config/wormhole.xml.h:4
+#: hacks/config/pipes.xml.h:9 hacks/config/substrate.xml.h:7
+#: hacks/config/wormhole.xml.h:4
 msgid "Lots"
 msgstr "Tot plin"
 
 msgid "Lots"
 msgstr "Tot plin"
 
@@ -6737,22 +6833,26 @@ msgid "Ping subnet/30 (2 hosts)"
 msgstr ""
 
 #: hacks/config/sonar.xml.h:10
 msgstr ""
 
 #: hacks/config/sonar.xml.h:10
-msgid "Simulation Team Members"
+msgid "Resolve Host Names"
 msgstr ""
 
 #: hacks/config/sonar.xml.h:11
 msgstr ""
 
 #: hacks/config/sonar.xml.h:11
-msgid "Sonar"
+msgid "Simulation Team Members"
 msgstr ""
 
 #: hacks/config/sonar.xml.h:12
 msgstr ""
 
 #: hacks/config/sonar.xml.h:12
-msgid "Team A Name"
+msgid "Sonar"
 msgstr ""
 
 #: hacks/config/sonar.xml.h:13
 msgstr ""
 
 #: hacks/config/sonar.xml.h:13
-msgid "Team B Name"
+msgid "Team A Name"
 msgstr ""
 
 #: hacks/config/sonar.xml.h:14
 msgstr ""
 
 #: hacks/config/sonar.xml.h:14
+msgid "Team B Name"
+msgstr ""
+
+#: hacks/config/sonar.xml.h:15
 msgid ""
 "This program draws a simulation of a sonar screen. By default, it displays a "
 "random assortment of ``bogies'' on the screen, but if installed as \"setuid "
 msgid ""
 "This program draws a simulation of a sonar screen. By default, it displays a "
 "random assortment of ``bogies'' on the screen, but if installed as \"setuid "
@@ -6761,7 +6861,7 @@ msgid ""
 "Martin and Jamie Zawinski."
 msgstr ""
 
 "Martin and Jamie Zawinski."
 msgstr ""
 
-#: hacks/config/sonar.xml.h:15
+#: hacks/config/sonar.xml.h:16
 msgid "vs."
 msgstr ""
 
 msgid "vs."
 msgstr ""
 
@@ -7035,6 +7135,31 @@ msgid ""
 "Written by Massimino Pascal."
 msgstr ""
 
 "Written by Massimino Pascal."
 msgstr ""
 
+#: hacks/config/substrate.xml.h:4
+#, fuzzy
+msgid "Initial Cracks"
+msgstr "Dinsité"
+
+#: hacks/config/substrate.xml.h:5
+msgid ""
+"Lines like crystals grow on a computational substrate. A simple "
+"perpendicular growth rule creates intricate city-like structures. By J. "
+"Tarbell and Mike Kershaw."
+msgstr ""
+
+#: hacks/config/substrate.xml.h:8
+#, fuzzy
+msgid "Sandgrains"
+msgstr "Sitandård"
+
+#: hacks/config/substrate.xml.h:12
+msgid "Substrate"
+msgstr ""
+
+#: hacks/config/substrate.xml.h:13
+msgid "Wireframe only"
+msgstr ""
+
 #: hacks/config/superquadrics.xml.h:3
 msgid ""
 "Ed Mackey reports that he wrote the first version of this program in BASIC "
 #: hacks/config/superquadrics.xml.h:3
 msgid ""
 "Ed Mackey reports that he wrote the first version of this program in BASIC "
index 202af3f20ef535a9e5bebd601671380c07fe3921..09fff6c1dd7bd1593ff864f3b49952d269fb8ce1 100644 (file)
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: xscreensaver\n"
 "Report-Msgid-Bugs-To: \n"
 msgstr ""
 "Project-Id-Version: xscreensaver\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2004-10-04 16:25+0200\n"
+"POT-Creation-Date: 2004-12-22 12:51+0100\n"
 "PO-Revision-Date: 2002-05-17 01:17+0800\n"
 "Last-Translator: He Qiangqiang <carton@linux.net.cn>\n"
 "Language-Team: zh_CN <i18n-translation@lists.linux.net.cn>\n"
 "PO-Revision-Date: 2002-05-17 01:17+0800\n"
 "Last-Translator: He Qiangqiang <carton@linux.net.cn>\n"
 "Language-Team: zh_CN <i18n-translation@lists.linux.net.cn>\n"
@@ -149,7 +149,7 @@ msgstr "多久后监视器完全黑屏。"
 msgid "minutes"
 msgstr "分钟"
 
 msgid "minutes"
 msgstr "分钟"
 
-#: driver/demo-Gtk-widgets.c:482 driver/demo-Gtk.c:2845
+#: driver/demo-Gtk-widgets.c:482 driver/demo-Gtk.c:2852
 #: driver/xscreensaver-demo.glade.h:58
 #, fuzzy
 msgid "Preview"
 #: driver/xscreensaver-demo.glade.h:58
 #, fuzzy
 msgid "Preview"
@@ -197,12 +197,12 @@ msgstr "只使用一个屏幕保护程序"
 msgid "Random Screen Saver"
 msgstr "随机选取屏幕保护程序"
 
 msgid "Random Screen Saver"
 msgstr "随机选取屏幕保护程序"
 
-#: driver/demo-Gtk-widgets.c:571 driver/demo-Gtk.c:2134
+#: driver/demo-Gtk-widgets.c:571 driver/demo-Gtk.c:2141
 #: driver/xscreensaver-demo.glade.h:75
 msgid "Use"
 msgstr "使用"
 
 #: driver/xscreensaver-demo.glade.h:75
 msgid "Use"
 msgstr "使用"
 
-#: driver/demo-Gtk-widgets.c:591 driver/demo-Gtk.c:2144
+#: driver/demo-Gtk-widgets.c:591 driver/demo-Gtk.c:2151
 #: driver/xscreensaver-demo.glade.h:63
 msgid "Screen Saver"
 msgstr "屏幕保护程序"
 #: driver/xscreensaver-demo.glade.h:63
 msgid "Screen Saver"
 msgstr "屏幕保护程序"
@@ -454,7 +454,7 @@ msgid "Visual:"
 msgstr ""
 
 #: driver/demo-Gtk-widgets.c:1550 driver/demo-Gtk-widgets.c:1573
 msgstr ""
 
 #: driver/demo-Gtk-widgets.c:1550 driver/demo-Gtk-widgets.c:1573
-#: driver/demo-Gtk.c:1538 driver/demo-Gtk.c:2864
+#: driver/demo-Gtk.c:1545 driver/demo-Gtk.c:2871
 #: driver/xscreensaver-demo.glade.h:5 driver/xscreensaver-demo.glade2.h:3
 msgid "Any"
 msgstr "任意"
 #: driver/xscreensaver-demo.glade.h:5 driver/xscreensaver-demo.glade2.h:3
 msgid "Any"
 msgstr "任意"
@@ -559,7 +559,7 @@ msgstr "标准"
 msgid "Back to the graphical configuration options."
 msgstr ""
 
 msgid "Back to the graphical configuration options."
 msgstr ""
 
-#: driver/demo-Gtk-widgets.c:1709 driver/demo-Gtk.c:741
+#: driver/demo-Gtk-widgets.c:1709 driver/demo-Gtk.c:748
 #: driver/xscreensaver-demo.glade.h:54
 msgid "OK"
 msgstr ""
 #: driver/xscreensaver-demo.glade.h:54
 msgid "OK"
 msgstr ""
@@ -569,18 +569,18 @@ msgstr ""
 msgid "Cancel"
 msgstr "修改"
 
 msgid "Cancel"
 msgstr "修改"
 
-#: driver/demo-Gtk.c:649
+#: driver/demo-Gtk.c:656
 msgid "For updates, check http://www.jwz.org/xscreensaver/"
 msgstr ""
 
 msgid "For updates, check http://www.jwz.org/xscreensaver/"
 msgstr ""
 
-#: driver/demo-Gtk.c:779
+#: driver/demo-Gtk.c:786
 msgid ""
 "Error:\n"
 "\n"
 "No Help URL has been specified.\n"
 msgstr ""
 
 msgid ""
 "Error:\n"
 "\n"
 "No Help URL has been specified.\n"
 msgstr ""
 
-#: driver/demo-Gtk.c:865
+#: driver/demo-Gtk.c:872
 msgid ""
 "Error:\n"
 "\n"
 msgid ""
 "Error:\n"
 "\n"
@@ -588,7 +588,7 @@ msgid ""
 "\n"
 msgstr ""
 
 "\n"
 msgstr ""
 
-#: driver/demo-Gtk.c:877
+#: driver/demo-Gtk.c:884
 msgid ""
 "You are running as root.  This usually means that xscreensaver\n"
 "was unable to contact your X server because access control is\n"
 msgid ""
 "You are running as root.  This usually means that xscreensaver\n"
 "was unable to contact your X server because access control is\n"
@@ -607,18 +607,18 @@ msgid ""
 "normal user, and `su' as necessary."
 msgstr ""
 
 "normal user, and `su' as necessary."
 msgstr ""
 
-#: driver/demo-Gtk.c:893
+#: driver/demo-Gtk.c:900
 msgid "Please check your $PATH and permissions."
 msgstr ""
 
 msgid "Please check your $PATH and permissions."
 msgstr ""
 
-#: driver/demo-Gtk.c:928
+#: driver/demo-Gtk.c:935
 msgid ""
 "Error:\n"
 "\n"
 "Couldn't determine init file name!\n"
 msgstr ""
 
 msgid ""
 "Error:\n"
 "\n"
 "Couldn't determine init file name!\n"
 msgstr ""
 
-#: driver/demo-Gtk.c:933
+#: driver/demo-Gtk.c:940
 #, c-format
 msgid ""
 "Error:\n"
 #, c-format
 msgid ""
 "Error:\n"
@@ -626,14 +626,14 @@ msgid ""
 "Couldn't write %s\n"
 msgstr ""
 
 "Couldn't write %s\n"
 msgstr ""
 
-#: driver/demo-Gtk.c:992
+#: driver/demo-Gtk.c:999
 msgid ""
 "Error:\n"
 "\n"
 "no `manualCommand' resource set."
 msgstr ""
 
 msgid ""
 "Error:\n"
 "\n"
 "no `manualCommand' resource set."
 msgstr ""
 
-#: driver/demo-Gtk.c:1173
+#: driver/demo-Gtk.c:1180
 #, c-format
 msgid ""
 "Error:\n"
 #, c-format
 msgid ""
 "Error:\n"
@@ -641,7 +641,7 @@ msgid ""
 "Unparsable time format: \"%s\"\n"
 msgstr ""
 
 "Unparsable time format: \"%s\"\n"
 msgstr ""
 
-#: driver/demo-Gtk.c:1829
+#: driver/demo-Gtk.c:1836
 #, c-format
 msgid ""
 "Error:\n"
 #, c-format
 msgid ""
 "Error:\n"
@@ -649,30 +649,30 @@ msgid ""
 "Directory does not exist: \"%s\"\n"
 msgstr ""
 
 "Directory does not exist: \"%s\"\n"
 msgstr ""
 
-#: driver/demo-Gtk.c:2546
+#: driver/demo-Gtk.c:2553
 msgid "Descriptions not available: no XML support compiled in."
 msgstr ""
 
 msgid "Descriptions not available: no XML support compiled in."
 msgstr ""
 
-#: driver/demo-Gtk.c:2551
+#: driver/demo-Gtk.c:2558
 msgid "No description available."
 msgstr ""
 
 msgid "No description available."
 msgstr ""
 
-#: driver/demo-Gtk.c:2816
+#: driver/demo-Gtk.c:2823
 #, fuzzy
 msgid "Blank Screen"
 msgstr "只显示黑屏"
 
 #, fuzzy
 msgid "Blank Screen"
 msgstr "只显示黑屏"
 
-#: driver/demo-Gtk.c:2822
+#: driver/demo-Gtk.c:2829
 #, fuzzy
 msgid "Screen Saver Disabled"
 msgstr "屏幕保护程序"
 
 #, fuzzy
 msgid "Screen Saver Disabled"
 msgstr "屏幕保护程序"
 
-#: driver/demo-Gtk.c:2855
+#: driver/demo-Gtk.c:2862
 #, c-format
 msgid "%s: %.100s Settings"
 msgstr ""
 
 #, c-format
 msgid "%s: %.100s Settings"
 msgstr ""
 
-#: driver/demo-Gtk.c:3010
+#: driver/demo-Gtk.c:3017
 #, c-format
 msgid ""
 "Warning:\n"
 #, c-format
 msgid ""
 "Warning:\n"
@@ -680,27 +680,27 @@ msgid ""
 "file \"%s\" has changed, reloading.\n"
 msgstr ""
 
 "file \"%s\" has changed, reloading.\n"
 msgstr ""
 
-#: driver/demo-Gtk.c:3092
+#: driver/demo-Gtk.c:3099
 #, fuzzy
 msgid "No Preview"
 msgstr "没有预览"
 
 #, fuzzy
 msgid "No Preview"
 msgstr "没有预览"
 
-#: driver/demo-Gtk.c:3092
+#: driver/demo-Gtk.c:3099
 #, fuzzy
 msgid "Available"
 msgstr ""
 "无可用\n"
 "预览"
 
 #, fuzzy
 msgid "Available"
 msgstr ""
 "无可用\n"
 "预览"
 
-#: driver/demo-Gtk.c:3093
+#: driver/demo-Gtk.c:3100
 msgid "Not"
 msgstr ""
 
 msgid "Not"
 msgstr ""
 
-#: driver/demo-Gtk.c:3093
+#: driver/demo-Gtk.c:3100
 msgid "Installed"
 msgstr ""
 
 msgid "Installed"
 msgstr ""
 
-#: driver/demo-Gtk.c:3858
+#: driver/demo-Gtk.c:3865
 #, c-format
 msgid ""
 "Warning:\n"
 #, c-format
 msgid ""
 "Warning:\n"
@@ -709,7 +709,7 @@ msgid ""
 "on display \"%s\".  Launch it now?"
 msgstr ""
 
 "on display \"%s\".  Launch it now?"
 msgstr ""
 
-#: driver/demo-Gtk.c:3868
+#: driver/demo-Gtk.c:3875
 #, c-format
 msgid ""
 "Warning:\n"
 #, c-format
 msgid ""
 "Warning:\n"
@@ -728,7 +728,7 @@ msgid ""
 "Restart the xscreensaver daemon now?\n"
 msgstr ""
 
 "Restart the xscreensaver daemon now?\n"
 msgstr ""
 
-#: driver/demo-Gtk.c:3893
+#: driver/demo-Gtk.c:3900
 #, c-format
 msgid ""
 "Warning:\n"
 #, c-format
 msgid ""
 "Warning:\n"
@@ -744,7 +744,7 @@ msgid ""
 "Restart the daemon on \"%s\" as \"%s\" now?\n"
 msgstr ""
 
 "Restart the daemon on \"%s\" as \"%s\" now?\n"
 msgstr ""
 
-#: driver/demo-Gtk.c:3915
+#: driver/demo-Gtk.c:3922
 #, c-format
 msgid ""
 "Warning:\n"
 #, c-format
 msgid ""
 "Warning:\n"
@@ -756,12 +756,12 @@ msgid ""
 "Restart the xscreensaver daemon now?\n"
 msgstr ""
 
 "Restart the xscreensaver daemon now?\n"
 msgstr ""
 
-#: driver/demo-Gtk.c:4372
+#: driver/demo-Gtk.c:4379
 #, c-format
 msgid "%s: unknown option: %s\n"
 msgstr ""
 
 #, c-format
 msgid "%s: unknown option: %s\n"
 msgstr ""
 
-#: driver/demo-Gtk.c:4436
+#: driver/demo-Gtk.c:4443
 #, fuzzy
 msgid "Screensaver Preferences"
 msgstr "屏幕保护程序"
 #, fuzzy
 msgid "Screensaver Preferences"
 msgstr "屏幕保护程序"
@@ -1006,22 +1006,23 @@ msgstr ""
 #: 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/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:5 hacks/config/flyingtoasters.xml.h:5
-#: hacks/config/fontglide.xml.h:4 hacks/config/forest.xml.h:1
-#: hacks/config/fuzzyflakes.xml.h:7 hacks/config/galaxy.xml.h:3
-#: hacks/config/gears.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:6
-#: 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/fadeplot.xml.h:4 hacks/config/fireworkx.xml.h:3
+#: 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:2 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/fuzzyflakes.xml.h:7
+#: hacks/config/galaxy.xml.h:3 hacks/config/gears.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:6 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/intermomentary.xml.h:1 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/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
@@ -1039,23 +1040,24 @@ msgstr ""
 #: hacks/config/pacman.xml.h:1 hacks/config/penetrate.xml.h:3
 #: hacks/config/penrose.xml.h:6 hacks/config/petri.xml.h:5
 #: hacks/config/phosphor.xml.h:4 hacks/config/piecewise.xml.h:4
 #: hacks/config/pacman.xml.h:1 hacks/config/penetrate.xml.h:3
 #: hacks/config/penrose.xml.h:6 hacks/config/petri.xml.h:5
 #: hacks/config/phosphor.xml.h:4 hacks/config/piecewise.xml.h:4
-#: hacks/config/pipes.xml.h:5 hacks/config/polyhedra.xml.h:18
-#: hacks/config/polyominoes.xml.h:2 hacks/config/polytopes.xml.h:11
-#: hacks/config/pong.xml.h:1 hacks/config/popsquares.xml.h:3
-#: hacks/config/providence.xml.h:2 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 hacks/config/rocks.xml.h:4
-#: hacks/config/rotor.xml.h:3 hacks/config/rubik.xml.h:3
-#: hacks/config/sballs.xml.h:4 hacks/config/shadebobs.xml.h:3
-#: hacks/config/sierpinski.xml.h:2 hacks/config/sierpinski3d.xml.h:2
-#: hacks/config/slidescreen.xml.h:2 hacks/config/slip.xml.h:2
-#: hacks/config/speedmine.xml.h:3 hacks/config/sphere.xml.h:2
-#: hacks/config/spheremonics.xml.h:5 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:1 hacks/config/superquadrics.xml.h:4
+#: hacks/config/pinion.xml.h:5 hacks/config/pipes.xml.h:5
+#: hacks/config/polyhedra.xml.h:18 hacks/config/polyominoes.xml.h:2
+#: hacks/config/polytopes.xml.h:11 hacks/config/pong.xml.h:1
+#: hacks/config/popsquares.xml.h:3 hacks/config/providence.xml.h:2
+#: 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
+#: hacks/config/rocks.xml.h:4 hacks/config/rotor.xml.h:3
+#: hacks/config/rubik.xml.h:3 hacks/config/sballs.xml.h:4
+#: hacks/config/shadebobs.xml.h:3 hacks/config/sierpinski.xml.h:2
+#: hacks/config/sierpinski3d.xml.h:2 hacks/config/slidescreen.xml.h:2
+#: hacks/config/slip.xml.h:2 hacks/config/speedmine.xml.h:3
+#: hacks/config/sphere.xml.h:2 hacks/config/spheremonics.xml.h:5
+#: 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:1
+#: hacks/config/substrate.xml.h:2 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/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
@@ -1077,8 +1079,9 @@ msgstr "快"
 #: hacks/config/fuzzyflakes.xml.h:8 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/fuzzyflakes.xml.h:8 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/wormhole.xml.h:3 hacks/config/xfishtank.xml.h:4
+#: hacks/config/substrate.xml.h:3 hacks/config/thornbird.xml.h:3
+#: hacks/config/whirlwindwarp.xml.h:1 hacks/config/wormhole.xml.h:3
+#: hacks/config/xfishtank.xml.h:4
 msgid "Few"
 msgstr "少"
 
 msgid "Few"
 msgstr "少"
 
@@ -1094,7 +1097,7 @@ msgstr "少"
 #: hacks/config/epicycle.xml.h:8 hacks/config/eruption.xml.h:12
 #: hacks/config/euler2d.xml.h:8 hacks/config/fadeplot.xml.h:6
 #: hacks/config/flag.xml.h:5 hacks/config/flame.xml.h:11
 #: hacks/config/epicycle.xml.h:8 hacks/config/eruption.xml.h:12
 #: hacks/config/euler2d.xml.h:8 hacks/config/fadeplot.xml.h:6
 #: hacks/config/flag.xml.h:5 hacks/config/flame.xml.h:11
-#: hacks/config/flow.xml.h:8 hacks/config/fluidballs.xml.h:13
+#: hacks/config/flow.xml.h:7 hacks/config/fluidballs.xml.h:13
 #: hacks/config/forest.xml.h:3 hacks/config/fuzzyflakes.xml.h:12
 #: 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/forest.xml.h:3 hacks/config/fuzzyflakes.xml.h:12
 #: hacks/config/galaxy.xml.h:6 hacks/config/grav.xml.h:4
 #: hacks/config/halo.xml.h:4 hacks/config/hopalong.xml.h:15
@@ -1132,7 +1135,7 @@ msgstr "多"
 #: 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/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/flow.xml.h:8 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/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
@@ -1186,22 +1189,23 @@ msgstr ""
 #: 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/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/flyingtoasters.xml.h:11
-#: hacks/config/fontglide.xml.h:13 hacks/config/forest.xml.h:5
-#: hacks/config/fuzzyflakes.xml.h:15 hacks/config/galaxy.xml.h:10
-#: hacks/config/gears.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:8 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:10 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/fadeplot.xml.h:8 hacks/config/fireworkx.xml.h:9
+#: 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:10 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/fuzzyflakes.xml.h:15
+#: hacks/config/galaxy.xml.h:11 hacks/config/gears.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:8
+#: 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:10
+#: 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/intermomentary.xml.h:4 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/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
@@ -1219,23 +1223,24 @@ msgstr ""
 #: hacks/config/pacman.xml.h:5 hacks/config/penetrate.xml.h:6
 #: hacks/config/penrose.xml.h:11 hacks/config/petri.xml.h:23
 #: hacks/config/phosphor.xml.h:7 hacks/config/piecewise.xml.h:9
 #: hacks/config/pacman.xml.h:5 hacks/config/penetrate.xml.h:6
 #: hacks/config/penrose.xml.h:11 hacks/config/petri.xml.h:23
 #: hacks/config/phosphor.xml.h:7 hacks/config/piecewise.xml.h:9
-#: hacks/config/pipes.xml.h:15 hacks/config/polyhedra.xml.h:119
-#: hacks/config/polyominoes.xml.h:10 hacks/config/polytopes.xml.h:20
-#: hacks/config/pong.xml.h:4 hacks/config/popsquares.xml.h:5
-#: hacks/config/providence.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 hacks/config/rocks.xml.h:9
-#: hacks/config/rotor.xml.h:11 hacks/config/rubik.xml.h:9
-#: hacks/config/sballs.xml.h:13 hacks/config/shadebobs.xml.h:9
-#: hacks/config/sierpinski.xml.h:7 hacks/config/sierpinski3d.xml.h:8
-#: hacks/config/slidescreen.xml.h:6 hacks/config/slip.xml.h:7
-#: hacks/config/speedmine.xml.h:13 hacks/config/sphere.xml.h:5
-#: hacks/config/spheremonics.xml.h:19 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:4 hacks/config/superquadrics.xml.h:8
+#: hacks/config/pinion.xml.h:13 hacks/config/pipes.xml.h:15
+#: hacks/config/polyhedra.xml.h:119 hacks/config/polyominoes.xml.h:10
+#: hacks/config/polytopes.xml.h:20 hacks/config/pong.xml.h:4
+#: hacks/config/popsquares.xml.h:5 hacks/config/providence.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
+#: hacks/config/rocks.xml.h:9 hacks/config/rotor.xml.h:11
+#: hacks/config/rubik.xml.h:9 hacks/config/sballs.xml.h:13
+#: hacks/config/shadebobs.xml.h:9 hacks/config/sierpinski.xml.h:7
+#: hacks/config/sierpinski3d.xml.h:8 hacks/config/slidescreen.xml.h:6
+#: hacks/config/slip.xml.h:7 hacks/config/speedmine.xml.h:13
+#: hacks/config/sphere.xml.h:5 hacks/config/spheremonics.xml.h:19
+#: 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:4
+#: hacks/config/substrate.xml.h:10 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/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
@@ -1268,17 +1273,18 @@ msgstr "慢"
 #: hacks/config/engine.xml.h:16 hacks/config/epicycle.xml.h:11
 #: 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/engine.xml.h:16 hacks/config/epicycle.xml.h:11
 #: 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/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/fuzzyflakes.xml.h:17
-#: hacks/config/galaxy.xml.h:11 hacks/config/glblur.xml.h:17
-#: hacks/config/glforestfire.xml.h:15 hacks/config/glplanet.xml.h:10
-#: 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:11 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/fireworkx.xml.h:11 hacks/config/flag.xml.h:9
+#: hacks/config/flame.xml.h:15 hacks/config/flipflop.xml.h:7
+#: hacks/config/flipscreen3d.xml.h:7 hacks/config/flow.xml.h:12
+#: hacks/config/fluidballs.xml.h:20 hacks/config/forest.xml.h:6
+#: hacks/config/fuzzyflakes.xml.h:17 hacks/config/galaxy.xml.h:12
+#: hacks/config/glblur.xml.h:17 hacks/config/glforestfire.xml.h:15
+#: hacks/config/glplanet.xml.h:10 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:11
+#: 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/intermomentary.xml.h:5 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/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
@@ -1307,16 +1313,16 @@ msgstr "慢"
 #: 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/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/xplanet.xml.h:60 hacks/config/xrayswarm.xml.h:4
-#: hacks/config/zoom.xml.h:7
+#: hacks/config/strange.xml.h:5 hacks/config/substrate.xml.h:11
+#: 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/xplanet.xml.h:60
+#: hacks/config/xrayswarm.xml.h:4 hacks/config/zoom.xml.h:7
 msgid "Speed"
 msgstr "速度"
 
 msgid "Speed"
 msgstr "速度"
 
@@ -1361,8 +1367,8 @@ msgstr ""
 #: hacks/config/discrete.xml.h:11 hacks/config/drift.xml.h:14
 #: hacks/config/epicycle.xml.h:13 hacks/config/euler2d.xml.h:17
 #: hacks/config/fadeplot.xml.h:12 hacks/config/flag.xml.h:13
 #: hacks/config/discrete.xml.h:11 hacks/config/drift.xml.h:14
 #: hacks/config/epicycle.xml.h:13 hacks/config/euler2d.xml.h:17
 #: hacks/config/fadeplot.xml.h:12 hacks/config/flag.xml.h:13
-#: hacks/config/flame.xml.h:16 hacks/config/flow.xml.h:18
-#: hacks/config/forest.xml.h:8 hacks/config/galaxy.xml.h:13
+#: hacks/config/flame.xml.h:16 hacks/config/flow.xml.h:15
+#: hacks/config/forest.xml.h:8 hacks/config/galaxy.xml.h:14
 #: hacks/config/grav.xml.h:11 hacks/config/halo.xml.h:13
 #: hacks/config/hopalong.xml.h:25 hacks/config/ifs.xml.h:8
 #: hacks/config/imsmap.xml.h:15 hacks/config/interference.xml.h:19
 #: hacks/config/grav.xml.h:11 hacks/config/halo.xml.h:13
 #: hacks/config/hopalong.xml.h:25 hacks/config/ifs.xml.h:8
 #: hacks/config/imsmap.xml.h:15 hacks/config/interference.xml.h:19
@@ -1466,7 +1472,7 @@ msgstr "四边形格"
 #: 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/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/flag.xml.h:4 hacks/config/flow.xml.h:4
 #: hacks/config/fluidballs.xml.h:12 hacks/config/fuzzyflakes.xml.h:10
 #: 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/fluidballs.xml.h:12 hacks/config/fuzzyflakes.xml.h:10
 #: hacks/config/gleidescope.xml.h:7 hacks/config/halftone.xml.h:8
 #: hacks/config/hopalong.xml.h:13 hacks/config/interference.xml.h:11
@@ -1499,7 +1505,7 @@ msgstr "六边形格"
 #: 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/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/flag.xml.h:8 hacks/config/flow.xml.h:11
 #: hacks/config/fluidballs.xml.h:19 hacks/config/fuzzyflakes.xml.h:16
 #: 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/fluidballs.xml.h:19 hacks/config/fuzzyflakes.xml.h:16
 #: hacks/config/gleidescope.xml.h:12 hacks/config/halftone.xml.h:14
 #: hacks/config/hopalong.xml.h:22 hacks/config/interference.xml.h:18
@@ -1518,7 +1524,7 @@ msgstr "三角形格"
 
 #: 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/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/flag.xml.h:12 hacks/config/flow.xml.h:14
 #: hacks/config/lissie.xml.h:12 hacks/config/loop.xml.h:11
 #: hacks/config/rubik.xml.h:12 hacks/config/sierpinski.xml.h:11
 #: hacks/config/slip.xml.h:11
 #: hacks/config/lissie.xml.h:12 hacks/config/loop.xml.h:11
 #: hacks/config/rubik.xml.h:12 hacks/config/sierpinski.xml.h:11
 #: hacks/config/slip.xml.h:11
@@ -1569,13 +1575,14 @@ msgstr ""
 #: hacks/config/menger.xml.h:15 hacks/config/mirrorblob.xml.h:18
 #: hacks/config/moebius.xml.h:6 hacks/config/molecule.xml.h:21
 #: hacks/config/morph3d.xml.h:5 hacks/config/noof.xml.h:4
 #: hacks/config/menger.xml.h:15 hacks/config/mirrorblob.xml.h:18
 #: hacks/config/moebius.xml.h:6 hacks/config/molecule.xml.h:21
 #: hacks/config/morph3d.xml.h:5 hacks/config/noof.xml.h:4
-#: hacks/config/pipes.xml.h:14 hacks/config/polyhedra.xml.h:118
-#: hacks/config/polytopes.xml.h:18 hacks/config/providence.xml.h:4
-#: 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
+#: hacks/config/pinion.xml.h:12 hacks/config/pipes.xml.h:14
+#: hacks/config/polyhedra.xml.h:118 hacks/config/polytopes.xml.h:18
+#: hacks/config/providence.xml.h:4 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 "显示每秒帧数"
 
 msgid "Show Frames-per-Second"
 msgstr "显示每秒帧数"
 
@@ -1739,11 +1746,12 @@ msgstr "鲸鱼的速度"
 #: hacks/config/lament.xml.h:9 hacks/config/lavalite.xml.h:32
 #: hacks/config/menger.xml.h:21 hacks/config/mirrorblob.xml.h:24
 #: hacks/config/moebius.xml.h:11 hacks/config/molecule.xml.h:26
 #: hacks/config/lament.xml.h:9 hacks/config/lavalite.xml.h:32
 #: hacks/config/menger.xml.h:21 hacks/config/mirrorblob.xml.h:24
 #: hacks/config/moebius.xml.h:11 hacks/config/molecule.xml.h:26
-#: hacks/config/polyhedra.xml.h:173 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
+#: hacks/config/pinion.xml.h:15 hacks/config/polyhedra.xml.h:173
+#: 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 "线框"
 
 msgid "Wireframe"
 msgstr "线框"
 
@@ -1831,14 +1839,15 @@ msgstr "线"
 #: 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/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/mismunch.xml.h:3
-#: 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 hacks/config/spheremonics.xml.h:7
+#: hacks/config/flow.xml.h:6 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/mismunch.xml.h:3 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
+#: hacks/config/spheremonics.xml.h:7 hacks/config/substrate.xml.h:6
 #: hacks/config/wander.xml.h:10 hacks/config/whirlwindwarp.xml.h:3
 msgid "Long"
 msgstr "长"
 #: hacks/config/wander.xml.h:10 hacks/config/whirlwindwarp.xml.h:3
 msgid "Long"
 msgstr "长"
@@ -1885,13 +1894,14 @@ msgstr "排斥距离临界值"
 #: 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/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/metaballs.xml.h:12 hacks/config/mismunch.xml.h:8
-#: 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/flow.xml.h:9 hacks/config/galaxy.xml.h:9
+#: hacks/config/klein.xml.h:5 hacks/config/laser.xml.h:9
+#: hacks/config/menger.xml.h:14 hacks/config/metaballs.xml.h:12
+#: hacks/config/mismunch.xml.h:8 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/substrate.xml.h:9
 #: hacks/config/wander.xml.h:12 hacks/config/whirlwindwarp.xml.h:6
 msgid "Short"
 msgstr "短"
 #: hacks/config/wander.xml.h:12 hacks/config/whirlwindwarp.xml.h:6
 msgid "Short"
 msgstr "短"
@@ -2098,10 +2108,10 @@ msgstr ""
 #: 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/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/polyhedra.xml.h:3 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/wormhole.xml.h:1
-#: hacks/config/xfishtank.xml.h:1
+#: hacks/config/pinion.xml.h:3 hacks/config/polyhedra.xml.h:3
+#: 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/wormhole.xml.h:1 hacks/config/xfishtank.xml.h:1
 msgid "Animation Speed"
 msgstr "动画速度"
 
 msgid "Animation Speed"
 msgstr "动画速度"
 
@@ -2183,8 +2193,9 @@ msgstr "绘制随机的颜色旋转变化而且交织在一起的同心圆。由
 #: 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/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/starfish.xml.h:2 hacks/config/substrate.xml.h:1
+#: hacks/config/vidwhacker.xml.h:3 hacks/config/wander.xml.h:7
+#: hacks/config/xspirograph.xml.h:3
 msgid "Duration"
 msgstr "持续时间"
 
 msgid "Duration"
 msgstr "持续时间"
 
@@ -2445,7 +2456,7 @@ msgstr ""
 msgid "Rotate"
 msgstr "旋转"
 
 msgid "Rotate"
 msgstr "旋转"
 
-#: hacks/config/circuit.xml.h:8
+#: hacks/config/circuit.xml.h:8 hacks/config/pinion.xml.h:10
 msgid "Rotation Speed"
 msgstr "旋转速度"
 
 msgid "Rotation Speed"
 msgstr "旋转速度"
 
@@ -2534,11 +2545,12 @@ msgstr "1 秒"
 msgid "Coral"
 msgstr "珊瑚"
 
 msgid "Coral"
 msgstr "珊瑚"
 
-#: hacks/config/coral.xml.h:4 hacks/config/gflux.xml.h:3
-#: hacks/config/glblur.xml.h:2 hacks/config/glmatrix.xml.h:3
-#: 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
+#: hacks/config/coral.xml.h:4 hacks/config/fireworkx.xml.h:2
+#: hacks/config/gflux.xml.h:3 hacks/config/glblur.xml.h:2
+#: hacks/config/glmatrix.xml.h:3 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
 msgid "Dense"
 msgstr "较浓密"
 
 msgid "Dense"
 msgstr "较浓密"
 
@@ -2555,12 +2567,12 @@ msgstr ""
 "模拟珊瑚生长,虽然有点慢。这个图像并不能完全反映真实情况。由 Frederick "
 "Roeber 编写。"
 
 "模拟珊瑚生长,虽然有点慢。这个图像并不能完全反映真实情况。由 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
-#: hacks/config/imsmap.xml.h:13 hacks/config/lavalite.xml.h:29
-#: hacks/config/pyro.xml.h:14 hacks/config/qix.xml.h:21
-#: hacks/config/squiral.xml.h:15 hacks/config/xearth.xml.h:24
-#: hacks/config/xmatrix.xml.h:17
+#: hacks/config/coral.xml.h:13 hacks/config/fireworkx.xml.h:10
+#: hacks/config/gflux.xml.h:13 hacks/config/glblur.xml.h:16
+#: hacks/config/glmatrix.xml.h:19 hacks/config/imsmap.xml.h:13
+#: hacks/config/lavalite.xml.h:29 hacks/config/pyro.xml.h:14
+#: hacks/config/qix.xml.h:21 hacks/config/squiral.xml.h:15
+#: hacks/config/xearth.xml.h:24 hacks/config/xmatrix.xml.h:17
 msgid "Sparse"
 msgstr "较稀疏"
 
 msgid "Sparse"
 msgstr "较稀疏"
 
@@ -2595,7 +2607,7 @@ msgid "Center on Screen"
 msgstr "居于屏幕中央"
 
 #: hacks/config/crystal.xml.h:2 hacks/config/deluxe.xml.h:1
 msgstr "居于屏幕中央"
 
 #: hacks/config/crystal.xml.h:2 hacks/config/deluxe.xml.h:1
-#: hacks/config/fadeplot.xml.h:1 hacks/config/flow.xml.h:3
+#: hacks/config/fadeplot.xml.h:1 hacks/config/flow.xml.h:1
 #: hacks/config/galaxy.xml.h:1 hacks/config/glforestfire.xml.h:1
 #: hacks/config/grav.xml.h:1 hacks/config/julia.xml.h:1
 #: hacks/config/laser.xml.h:1 hacks/config/lisa.xml.h:1
 #: hacks/config/galaxy.xml.h:1 hacks/config/glforestfire.xml.h:1
 #: hacks/config/grav.xml.h:1 hacks/config/julia.xml.h:1
 #: hacks/config/laser.xml.h:1 hacks/config/lisa.xml.h:1
@@ -3381,7 +3393,7 @@ msgstr "允许二维吸引子"
 msgid "Half"
 msgstr "晕轮"
 
 msgid "Half"
 msgstr "晕轮"
 
-#: hacks/config/fireflies.xml.h:17
+#: hacks/config/fireflies.xml.h:17 hacks/config/pinion.xml.h:7
 #, fuzzy
 msgid "Huge"
 msgstr "大火"
 #, fuzzy
 msgid "Huge"
 msgstr "大火"
@@ -3477,7 +3489,7 @@ msgstr ""
 msgid "Swarm tails glow"
 msgstr ""
 
 msgid "Swarm tails glow"
 msgstr ""
 
-#: hacks/config/fireflies.xml.h:43
+#: hacks/config/fireflies.xml.h:43 hacks/config/pinion.xml.h:14
 #, fuzzy
 msgid "Tiny"
 msgstr "薄"
 #, fuzzy
 msgid "Tiny"
 msgstr "薄"
@@ -3496,6 +3508,33 @@ msgstr "Windows"
 msgid "Wind picks up"
 msgstr ""
 
 msgid "Wind picks up"
 msgstr ""
 
+#: hacks/config/fireworkx.xml.h:1 hacks/config/lavalite.xml.h:3
+msgid "Activity"
+msgstr ""
+
+#: hacks/config/fireworkx.xml.h:4
+msgid "Fast Fade (more realistic)"
+msgstr ""
+
+#: hacks/config/fireworkx.xml.h:5
+#, fuzzy
+msgid "Fireworkx"
+msgstr "文件(_F)"
+
+#: hacks/config/fireworkx.xml.h:6
+#, fuzzy
+msgid "Light effect"
+msgstr "闪电效果"
+
+#: hacks/config/fireworkx.xml.h:7
+msgid "Pyrotechnics simulation eye-candy. Written by Rony B. Chandran."
+msgstr ""
+
+#: hacks/config/fireworkx.xml.h:8
+#, fuzzy
+msgid "Shoot"
+msgstr "短"
+
 #: hacks/config/flag.xml.h:1
 msgid "Bitmap for Flag"
 msgstr "旗帜的位图"
 #: hacks/config/flag.xml.h:1
 msgid "Bitmap for Flag"
 msgstr "旗帜的位图"
@@ -3574,44 +3613,45 @@ msgid ""
 "around and deforms it in various ways. Written by Ben Buxton."
 msgstr ""
 
 "around and deforms it in various ways. Written by Ben Buxton."
 msgstr ""
 
-#: hacks/config/flow.xml.h:1
+#: hacks/config/flow.xml.h:3
+msgid "Flow"
+msgstr "流动"
+
+#: hacks/config/flow.xml.h:5
 #, fuzzy
 #, fuzzy
-msgid "Allow 2D Attractors"
-msgstr "允许二维吸引子"
+msgid "Length of trails"
+msgstr "留下轨迹"
 
 
-#: hacks/config/flow.xml.h:2
+#: hacks/config/flow.xml.h:13
 msgid ""
 msgid ""
-"Another series of strange attractors: a flowing series of points, making "
-"strange rotational shapes. Written by Tim Auckland."
+"Strange attractors formed of flows in a 3D differential equation phase "
+"space. Written by Tim Auckland."
 msgstr ""
 
 msgstr ""
 
-#: hacks/config/flow.xml.h:5
-msgid "Flow"
-msgstr "流动"
-
-#: hacks/config/flow.xml.h:6
-msgid "Freeze Some Bees"
+#: hacks/config/flow.xml.h:16
+msgid "turn on/off bounding box."
 msgstr ""
 
 msgstr ""
 
-#: hacks/config/flow.xml.h:10
-msgid "Ride a Trained Bee"
-msgstr ""
+#: hacks/config/flow.xml.h:17
+#, fuzzy
+msgid "turn on/off double buffering."
+msgstr "使用双重缓冲区"
 
 
-#: hacks/config/flow.xml.h:11
-msgid "Rotate Around Attractor"
+#: hacks/config/flow.xml.h:18
+msgid "turn on/off periodic attractors."
 msgstr ""
 
 msgstr ""
 
-#: hacks/config/flow.xml.h:12
-msgid "Show Bounding Box"
+#: hacks/config/flow.xml.h:19
+msgid "turn on/off ride in the flow."
 msgstr ""
 
 msgstr ""
 
-#: hacks/config/flow.xml.h:14
-msgid "Slow Bees with Antifreeze"
+#: hacks/config/flow.xml.h:20
+msgid "turn on/off rotating around attractor."
 msgstr ""
 
 msgstr ""
 
-#: hacks/config/flow.xml.h:19
-msgid "Zoom In and Out"
-msgstr "放大和缩小"
+#: hacks/config/flow.xml.h:21
+msgid "turn on/off search for new attractors."
+msgstr ""
 
 #: hacks/config/fluidballs.xml.h:1
 msgid "      Freefall"
 
 #: hacks/config/fluidballs.xml.h:1
 msgid "      Freefall"
@@ -3832,7 +3872,12 @@ msgstr "随机运动"
 msgid "Galaxy"
 msgstr "星系"
 
 msgid "Galaxy"
 msgstr "星系"
 
-#: hacks/config/galaxy.xml.h:9 hacks/config/lisa.xml.h:7
+#: hacks/config/galaxy.xml.h:8
+#, fuzzy
+msgid "Rotate Viewpoint"
+msgstr "线性运动"
+
+#: hacks/config/galaxy.xml.h:10 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/pong.xml.h:3
 #: hacks/config/rotor.xml.h:10 hacks/config/rubik.xml.h:8
 #: hacks/config/lissie.xml.h:8 hacks/config/loop.xml.h:6
 #: hacks/config/penrose.xml.h:10 hacks/config/pong.xml.h:3
 #: hacks/config/rotor.xml.h:10 hacks/config/rubik.xml.h:8
@@ -3841,7 +3886,7 @@ msgstr "星系"
 msgid "Size"
 msgstr "大小"
 
 msgid "Size"
 msgstr "大小"
 
-#: hacks/config/galaxy.xml.h:12
+#: hacks/config/galaxy.xml.h:13
 msgid ""
 "This draws spinning galaxies, which then collide and scatter their stars to "
 "the, uh, four winds or something. Originally an Amiga program by Uli "
 msgid ""
 "This draws spinning galaxies, which then collide and scatter their stars to "
 "the, uh, four winds or something. Originally an Amiga program by Uli "
@@ -4158,9 +4203,9 @@ msgid ""
 "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 "
 "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."
+"of this window: the tab at the top of the *other* window.) 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
 msgstr ""
 
 #: hacks/config/glslideshow.xml.h:17
@@ -4718,6 +4763,27 @@ msgstr "波形数目"
 msgid "Wave Size"
 msgstr "波形大小"
 
 msgid "Wave Size"
 msgstr "波形大小"
 
+#: hacks/config/intermomentary.xml.h:2
+msgid "Intermomentary"
+msgstr ""
+
+#: hacks/config/intermomentary.xml.h:3
+#, fuzzy
+msgid "Number of Discs"
+msgstr "光环的数目"
+
+#: hacks/config/intermomentary.xml.h:6
+msgid ""
+"The Intersection Momentary is a fun visualization defining the relationships "
+"between objects with Casey Reas, William Ngan, and Robert Hodgin. "
+"Commissioned for display at the Whitney Museum of American Art. A surface "
+"filled with 100 medium to small sized circles. Each circle has a different "
+"size and direction, but moves at the same slow rate. Display: A. The "
+"instantaneous intersections of the circles. B. The aggregate intersections "
+"of the circles. Ported to XScreensaver from the art project \"InterMomentary"
+"\" at http://www.complexification.net"
+msgstr ""
+
 #: hacks/config/jigglypuff.xml.h:2
 msgid "Chrome"
 msgstr ""
 #: hacks/config/jigglypuff.xml.h:2
 msgid "Chrome"
 msgstr ""
@@ -4946,10 +5012,6 @@ msgstr "不断移动的散射状线条,有点类似扫描用的激光光束。
 msgid "10"
 msgstr "1"
 
 msgid "10"
 msgstr "1"
 
-#: hacks/config/lavalite.xml.h:3
-msgid "Activity"
-msgstr ""
-
 #: hacks/config/lavalite.xml.h:4
 msgid "Classic Lavalite"
 msgstr ""
 #: hacks/config/lavalite.xml.h:4
 msgid "Classic Lavalite"
 msgstr ""
@@ -5708,6 +5770,42 @@ msgid ""
 "invisibility at intersection points. Written by Geoffrey Irving."
 msgstr ""
 
 "invisibility at intersection points. Written by Geoffrey Irving."
 msgstr ""
 
+#: hacks/config/pinion.xml.h:1
+#, fuzzy
+msgid "100"
+msgstr "100%"
+
+#: hacks/config/pinion.xml.h:2
+msgid "2000"
+msgstr ""
+
+#: hacks/config/pinion.xml.h:4
+#, fuzzy
+msgid ""
+"Draws an interconnected set of gears moving across the screen. Written by "
+"Jamie Zawinski."
+msgstr "随机绘制彩色点绘矩形。由 Jamie Zawinski 编写。"
+
+#: hacks/config/pinion.xml.h:6
+#, fuzzy
+msgid "Gear Size"
+msgstr "网格大小"
+
+#: hacks/config/pinion.xml.h:8
+#, fuzzy
+msgid "Max RPM"
+msgstr "最大的圆环"
+
+#: hacks/config/pinion.xml.h:9
+#, fuzzy
+msgid "Pinion"
+msgstr "长"
+
+#: hacks/config/pinion.xml.h:11
+#, fuzzy
+msgid "Scrolling Speed"
+msgstr "滚动速度"
+
 #: hacks/config/pipes.xml.h:1
 msgid "Allow Tight Turns"
 msgstr ""
 #: hacks/config/pipes.xml.h:1
 msgid "Allow Tight Turns"
 msgstr ""
@@ -5737,7 +5835,8 @@ msgstr ""
 "如果您曾经和一台 Windows NT 计算机呆在一个房间中,你很可能见过这个 GL 程序。"
 "这一版本由 Marcelo Vianna 编写。"
 
 "如果您曾经和一台 Windows NT 计算机呆在一个房间中,你很可能见过这个 GL 程序。"
 "这一版本由 Marcelo Vianna 编写。"
 
-#: hacks/config/pipes.xml.h:9 hacks/config/wormhole.xml.h:4
+#: hacks/config/pipes.xml.h:9 hacks/config/substrate.xml.h:7
+#: hacks/config/wormhole.xml.h:4
 msgid "Lots"
 msgstr ""
 
 msgid "Lots"
 msgstr ""
 
@@ -7009,22 +7108,26 @@ msgid "Ping subnet/30 (2 hosts)"
 msgstr ""
 
 #: hacks/config/sonar.xml.h:10
 msgstr ""
 
 #: hacks/config/sonar.xml.h:10
-msgid "Simulation Team Members"
+msgid "Resolve Host Names"
 msgstr ""
 
 #: hacks/config/sonar.xml.h:11
 msgstr ""
 
 #: hacks/config/sonar.xml.h:11
+msgid "Simulation Team Members"
+msgstr ""
+
+#: hacks/config/sonar.xml.h:12
 msgid "Sonar"
 msgstr "声纳"
 
 msgid "Sonar"
 msgstr "声纳"
 
-#: hacks/config/sonar.xml.h:12
+#: hacks/config/sonar.xml.h:13
 msgid "Team A Name"
 msgstr "小组 A 名称"
 
 msgid "Team A Name"
 msgstr "小组 A 名称"
 
-#: hacks/config/sonar.xml.h:13
+#: hacks/config/sonar.xml.h:14
 msgid "Team B Name"
 msgstr "小组 B 名称"
 
 msgid "Team B Name"
 msgstr "小组 B 名称"
 
-#: hacks/config/sonar.xml.h:14
+#: hacks/config/sonar.xml.h:15
 msgid ""
 "This program draws a simulation of a sonar screen. By default, it displays a "
 "random assortment of ``bogies'' on the screen, but if installed as \"setuid "
 msgid ""
 "This program draws a simulation of a sonar screen. By default, it displays a "
 "random assortment of ``bogies'' on the screen, but if installed as \"setuid "
@@ -7033,7 +7136,7 @@ msgid ""
 "Martin and Jamie Zawinski."
 msgstr ""
 
 "Martin and Jamie Zawinski."
 msgstr ""
 
-#: hacks/config/sonar.xml.h:15
+#: hacks/config/sonar.xml.h:16
 msgid "vs."
 msgstr "对"
 
 msgid "vs."
 msgstr "对"
 
@@ -7316,6 +7419,33 @@ msgid ""
 "Written by Massimino Pascal."
 msgstr ""
 
 "Written by Massimino Pascal."
 msgstr ""
 
+#: hacks/config/substrate.xml.h:4
+#, fuzzy
+msgid "Initial Cracks"
+msgstr "烟花密度"
+
+#: hacks/config/substrate.xml.h:5
+msgid ""
+"Lines like crystals grow on a computational substrate. A simple "
+"perpendicular growth rule creates intricate city-like structures. By J. "
+"Tarbell and Mike Kershaw."
+msgstr ""
+
+#: hacks/config/substrate.xml.h:8
+#, fuzzy
+msgid "Sandgrains"
+msgstr "标准"
+
+#: hacks/config/substrate.xml.h:12
+#, fuzzy
+msgid "Substrate"
+msgstr "状态"
+
+#: hacks/config/substrate.xml.h:13
+#, fuzzy
+msgid "Wireframe only"
+msgstr "线框"
+
 #: hacks/config/superquadrics.xml.h:3
 msgid ""
 "Ed Mackey reports that he wrote the first version of this program in BASIC "
 #: hacks/config/superquadrics.xml.h:3
 msgid ""
 "Ed Mackey reports that he wrote the first version of this program in BASIC "
@@ -8478,6 +8608,13 @@ msgid ""
 "than just a simple zoom. Written by James Macnicol."
 msgstr ""
 
 "than just a simple zoom. Written by James Macnicol."
 msgstr ""
 
+#, fuzzy
+#~ msgid "Allow 2D Attractors"
+#~ msgstr "允许二维吸引子"
+
+#~ msgid "Zoom In and Out"
+#~ msgstr "放大和缩小"
+
 #~ msgid "Ping Subnet"
 #~ msgstr "Ping 子网"
 
 #~ msgid "Ping Subnet"
 #~ msgstr "Ping 子网"
 
index 24e0584b6eb1fc57ee8ad4d4682c904969a6937f..1004f4c040621eb26ab4851750bc6af01d259e70 100644 (file)
@@ -6,7 +6,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: xscreensaver 4.04\n"
 "Report-Msgid-Bugs-To: \n"
 msgstr ""
 "Project-Id-Version: xscreensaver 4.04\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2004-10-04 16:25+0200\n"
+"POT-Creation-Date: 2004-12-22 12:51+0100\n"
 "PO-Revision-Date: 2002-06-11 23:41+0800\n"
 "Last-Translator: Abel Cheung <maddog@linux.org.hk>\n"
 "Language-Team: traditional Chinese <zh-l10n@linux.org.tw>\n"
 "PO-Revision-Date: 2002-06-11 23:41+0800\n"
 "Last-Translator: Abel Cheung <maddog@linux.org.hk>\n"
 "Language-Team: traditional Chinese <zh-l10n@linux.org.tw>\n"
@@ -150,7 +150,7 @@ msgstr "畫面完全變黑前的時間。"
 msgid "minutes"
 msgstr "分鐘"
 
 msgid "minutes"
 msgstr "分鐘"
 
-#: driver/demo-Gtk-widgets.c:482 driver/demo-Gtk.c:2845
+#: driver/demo-Gtk-widgets.c:482 driver/demo-Gtk.c:2852
 #: driver/xscreensaver-demo.glade.h:58
 #, fuzzy
 msgid "Preview"
 #: driver/xscreensaver-demo.glade.h:58
 #, fuzzy
 msgid "Preview"
@@ -198,12 +198,12 @@ msgstr "只使用一款螢幕保護程式"
 msgid "Random Screen Saver"
 msgstr "隨機選取螢幕保護程式"
 
 msgid "Random Screen Saver"
 msgstr "隨機選取螢幕保護程式"
 
-#: driver/demo-Gtk-widgets.c:571 driver/demo-Gtk.c:2134
+#: driver/demo-Gtk-widgets.c:571 driver/demo-Gtk.c:2141
 #: driver/xscreensaver-demo.glade.h:75
 msgid "Use"
 msgstr "使用"
 
 #: driver/xscreensaver-demo.glade.h:75
 msgid "Use"
 msgstr "使用"
 
-#: driver/demo-Gtk-widgets.c:591 driver/demo-Gtk.c:2144
+#: driver/demo-Gtk-widgets.c:591 driver/demo-Gtk.c:2151
 #: driver/xscreensaver-demo.glade.h:63
 msgid "Screen Saver"
 msgstr "螢幕保護程式"
 #: driver/xscreensaver-demo.glade.h:63
 msgid "Screen Saver"
 msgstr "螢幕保護程式"
@@ -448,7 +448,7 @@ msgid "Visual:"
 msgstr ""
 
 #: driver/demo-Gtk-widgets.c:1550 driver/demo-Gtk-widgets.c:1573
 msgstr ""
 
 #: driver/demo-Gtk-widgets.c:1550 driver/demo-Gtk-widgets.c:1573
-#: driver/demo-Gtk.c:1538 driver/demo-Gtk.c:2864
+#: driver/demo-Gtk.c:1545 driver/demo-Gtk.c:2871
 #: driver/xscreensaver-demo.glade.h:5 driver/xscreensaver-demo.glade2.h:3
 msgid "Any"
 msgstr "任選"
 #: driver/xscreensaver-demo.glade.h:5 driver/xscreensaver-demo.glade2.h:3
 msgid "Any"
 msgstr "任選"
@@ -550,7 +550,7 @@ msgstr "標準"
 msgid "Back to the graphical configuration options."
 msgstr ""
 
 msgid "Back to the graphical configuration options."
 msgstr ""
 
-#: driver/demo-Gtk-widgets.c:1709 driver/demo-Gtk.c:741
+#: driver/demo-Gtk-widgets.c:1709 driver/demo-Gtk.c:748
 #: driver/xscreensaver-demo.glade.h:54
 msgid "OK"
 msgstr ""
 #: driver/xscreensaver-demo.glade.h:54
 msgid "OK"
 msgstr ""
@@ -560,18 +560,18 @@ msgstr ""
 msgid "Cancel"
 msgstr "平靜"
 
 msgid "Cancel"
 msgstr "平靜"
 
-#: driver/demo-Gtk.c:649
+#: driver/demo-Gtk.c:656
 msgid "For updates, check http://www.jwz.org/xscreensaver/"
 msgstr ""
 
 msgid "For updates, check http://www.jwz.org/xscreensaver/"
 msgstr ""
 
-#: driver/demo-Gtk.c:779
+#: driver/demo-Gtk.c:786
 msgid ""
 "Error:\n"
 "\n"
 "No Help URL has been specified.\n"
 msgstr ""
 
 msgid ""
 "Error:\n"
 "\n"
 "No Help URL has been specified.\n"
 msgstr ""
 
-#: driver/demo-Gtk.c:865
+#: driver/demo-Gtk.c:872
 msgid ""
 "Error:\n"
 "\n"
 msgid ""
 "Error:\n"
 "\n"
@@ -579,7 +579,7 @@ msgid ""
 "\n"
 msgstr ""
 
 "\n"
 msgstr ""
 
-#: driver/demo-Gtk.c:877
+#: driver/demo-Gtk.c:884
 msgid ""
 "You are running as root.  This usually means that xscreensaver\n"
 "was unable to contact your X server because access control is\n"
 msgid ""
 "You are running as root.  This usually means that xscreensaver\n"
 "was unable to contact your X server because access control is\n"
@@ -598,18 +598,18 @@ msgid ""
 "normal user, and `su' as necessary."
 msgstr ""
 
 "normal user, and `su' as necessary."
 msgstr ""
 
-#: driver/demo-Gtk.c:893
+#: driver/demo-Gtk.c:900
 msgid "Please check your $PATH and permissions."
 msgstr ""
 
 msgid "Please check your $PATH and permissions."
 msgstr ""
 
-#: driver/demo-Gtk.c:928
+#: driver/demo-Gtk.c:935
 msgid ""
 "Error:\n"
 "\n"
 "Couldn't determine init file name!\n"
 msgstr ""
 
 msgid ""
 "Error:\n"
 "\n"
 "Couldn't determine init file name!\n"
 msgstr ""
 
-#: driver/demo-Gtk.c:933
+#: driver/demo-Gtk.c:940
 #, c-format
 msgid ""
 "Error:\n"
 #, c-format
 msgid ""
 "Error:\n"
@@ -617,14 +617,14 @@ msgid ""
 "Couldn't write %s\n"
 msgstr ""
 
 "Couldn't write %s\n"
 msgstr ""
 
-#: driver/demo-Gtk.c:992
+#: driver/demo-Gtk.c:999
 msgid ""
 "Error:\n"
 "\n"
 "no `manualCommand' resource set."
 msgstr ""
 
 msgid ""
 "Error:\n"
 "\n"
 "no `manualCommand' resource set."
 msgstr ""
 
-#: driver/demo-Gtk.c:1173
+#: driver/demo-Gtk.c:1180
 #, c-format
 msgid ""
 "Error:\n"
 #, c-format
 msgid ""
 "Error:\n"
@@ -632,7 +632,7 @@ msgid ""
 "Unparsable time format: \"%s\"\n"
 msgstr ""
 
 "Unparsable time format: \"%s\"\n"
 msgstr ""
 
-#: driver/demo-Gtk.c:1829
+#: driver/demo-Gtk.c:1836
 #, c-format
 msgid ""
 "Error:\n"
 #, c-format
 msgid ""
 "Error:\n"
@@ -640,30 +640,30 @@ msgid ""
 "Directory does not exist: \"%s\"\n"
 msgstr ""
 
 "Directory does not exist: \"%s\"\n"
 msgstr ""
 
-#: driver/demo-Gtk.c:2546
+#: driver/demo-Gtk.c:2553
 msgid "Descriptions not available: no XML support compiled in."
 msgstr ""
 
 msgid "Descriptions not available: no XML support compiled in."
 msgstr ""
 
-#: driver/demo-Gtk.c:2551
+#: driver/demo-Gtk.c:2558
 msgid "No description available."
 msgstr ""
 
 msgid "No description available."
 msgstr ""
 
-#: driver/demo-Gtk.c:2816
+#: driver/demo-Gtk.c:2823
 #, fuzzy
 msgid "Blank Screen"
 msgstr "畫面變黑"
 
 #, fuzzy
 msgid "Blank Screen"
 msgstr "畫面變黑"
 
-#: driver/demo-Gtk.c:2822
+#: driver/demo-Gtk.c:2829
 #, fuzzy
 msgid "Screen Saver Disabled"
 msgstr "螢幕保護程式"
 
 #, fuzzy
 msgid "Screen Saver Disabled"
 msgstr "螢幕保護程式"
 
-#: driver/demo-Gtk.c:2855
+#: driver/demo-Gtk.c:2862
 #, c-format
 msgid "%s: %.100s Settings"
 msgstr ""
 
 #, c-format
 msgid "%s: %.100s Settings"
 msgstr ""
 
-#: driver/demo-Gtk.c:3010
+#: driver/demo-Gtk.c:3017
 #, c-format
 msgid ""
 "Warning:\n"
 #, c-format
 msgid ""
 "Warning:\n"
@@ -671,24 +671,24 @@ msgid ""
 "file \"%s\" has changed, reloading.\n"
 msgstr ""
 
 "file \"%s\" has changed, reloading.\n"
 msgstr ""
 
-#: driver/demo-Gtk.c:3092
+#: driver/demo-Gtk.c:3099
 #, fuzzy
 msgid "No Preview"
 msgstr "預覽(_P)"
 
 #, fuzzy
 msgid "No Preview"
 msgstr "預覽(_P)"
 
-#: driver/demo-Gtk.c:3092
+#: driver/demo-Gtk.c:3099
 msgid "Available"
 msgstr ""
 
 msgid "Available"
 msgstr ""
 
-#: driver/demo-Gtk.c:3093
+#: driver/demo-Gtk.c:3100
 msgid "Not"
 msgstr ""
 
 msgid "Not"
 msgstr ""
 
-#: driver/demo-Gtk.c:3093
+#: driver/demo-Gtk.c:3100
 msgid "Installed"
 msgstr ""
 
 msgid "Installed"
 msgstr ""
 
-#: driver/demo-Gtk.c:3858
+#: driver/demo-Gtk.c:3865
 #, c-format
 msgid ""
 "Warning:\n"
 #, c-format
 msgid ""
 "Warning:\n"
@@ -697,7 +697,7 @@ msgid ""
 "on display \"%s\".  Launch it now?"
 msgstr ""
 
 "on display \"%s\".  Launch it now?"
 msgstr ""
 
-#: driver/demo-Gtk.c:3868
+#: driver/demo-Gtk.c:3875
 #, c-format
 msgid ""
 "Warning:\n"
 #, c-format
 msgid ""
 "Warning:\n"
@@ -716,7 +716,7 @@ msgid ""
 "Restart the xscreensaver daemon now?\n"
 msgstr ""
 
 "Restart the xscreensaver daemon now?\n"
 msgstr ""
 
-#: driver/demo-Gtk.c:3893
+#: driver/demo-Gtk.c:3900
 #, c-format
 msgid ""
 "Warning:\n"
 #, c-format
 msgid ""
 "Warning:\n"
@@ -732,7 +732,7 @@ msgid ""
 "Restart the daemon on \"%s\" as \"%s\" now?\n"
 msgstr ""
 
 "Restart the daemon on \"%s\" as \"%s\" now?\n"
 msgstr ""
 
-#: driver/demo-Gtk.c:3915
+#: driver/demo-Gtk.c:3922
 #, c-format
 msgid ""
 "Warning:\n"
 #, c-format
 msgid ""
 "Warning:\n"
@@ -744,12 +744,12 @@ msgid ""
 "Restart the xscreensaver daemon now?\n"
 msgstr ""
 
 "Restart the xscreensaver daemon now?\n"
 msgstr ""
 
-#: driver/demo-Gtk.c:4372
+#: driver/demo-Gtk.c:4379
 #, c-format
 msgid "%s: unknown option: %s\n"
 msgstr ""
 
 #, c-format
 msgid "%s: unknown option: %s\n"
 msgstr ""
 
-#: driver/demo-Gtk.c:4436
+#: driver/demo-Gtk.c:4443
 #, fuzzy
 msgid "Screensaver Preferences"
 msgstr "螢幕保護程式"
 #, fuzzy
 msgid "Screensaver Preferences"
 msgstr "螢幕保護程式"
@@ -994,22 +994,23 @@ msgstr ""
 #: 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/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:5 hacks/config/flyingtoasters.xml.h:5
-#: hacks/config/fontglide.xml.h:4 hacks/config/forest.xml.h:1
-#: hacks/config/fuzzyflakes.xml.h:7 hacks/config/galaxy.xml.h:3
-#: hacks/config/gears.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:6
-#: 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/fadeplot.xml.h:4 hacks/config/fireworkx.xml.h:3
+#: 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:2 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/fuzzyflakes.xml.h:7
+#: hacks/config/galaxy.xml.h:3 hacks/config/gears.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:6 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/intermomentary.xml.h:1 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/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
@@ -1027,23 +1028,24 @@ msgstr ""
 #: hacks/config/pacman.xml.h:1 hacks/config/penetrate.xml.h:3
 #: hacks/config/penrose.xml.h:6 hacks/config/petri.xml.h:5
 #: hacks/config/phosphor.xml.h:4 hacks/config/piecewise.xml.h:4
 #: hacks/config/pacman.xml.h:1 hacks/config/penetrate.xml.h:3
 #: hacks/config/penrose.xml.h:6 hacks/config/petri.xml.h:5
 #: hacks/config/phosphor.xml.h:4 hacks/config/piecewise.xml.h:4
-#: hacks/config/pipes.xml.h:5 hacks/config/polyhedra.xml.h:18
-#: hacks/config/polyominoes.xml.h:2 hacks/config/polytopes.xml.h:11
-#: hacks/config/pong.xml.h:1 hacks/config/popsquares.xml.h:3
-#: hacks/config/providence.xml.h:2 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 hacks/config/rocks.xml.h:4
-#: hacks/config/rotor.xml.h:3 hacks/config/rubik.xml.h:3
-#: hacks/config/sballs.xml.h:4 hacks/config/shadebobs.xml.h:3
-#: hacks/config/sierpinski.xml.h:2 hacks/config/sierpinski3d.xml.h:2
-#: hacks/config/slidescreen.xml.h:2 hacks/config/slip.xml.h:2
-#: hacks/config/speedmine.xml.h:3 hacks/config/sphere.xml.h:2
-#: hacks/config/spheremonics.xml.h:5 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:1 hacks/config/superquadrics.xml.h:4
+#: hacks/config/pinion.xml.h:5 hacks/config/pipes.xml.h:5
+#: hacks/config/polyhedra.xml.h:18 hacks/config/polyominoes.xml.h:2
+#: hacks/config/polytopes.xml.h:11 hacks/config/pong.xml.h:1
+#: hacks/config/popsquares.xml.h:3 hacks/config/providence.xml.h:2
+#: 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
+#: hacks/config/rocks.xml.h:4 hacks/config/rotor.xml.h:3
+#: hacks/config/rubik.xml.h:3 hacks/config/sballs.xml.h:4
+#: hacks/config/shadebobs.xml.h:3 hacks/config/sierpinski.xml.h:2
+#: hacks/config/sierpinski3d.xml.h:2 hacks/config/slidescreen.xml.h:2
+#: hacks/config/slip.xml.h:2 hacks/config/speedmine.xml.h:3
+#: hacks/config/sphere.xml.h:2 hacks/config/spheremonics.xml.h:5
+#: 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:1
+#: hacks/config/substrate.xml.h:2 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/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
@@ -1065,8 +1067,9 @@ msgstr "快"
 #: hacks/config/fuzzyflakes.xml.h:8 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/fuzzyflakes.xml.h:8 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/wormhole.xml.h:3 hacks/config/xfishtank.xml.h:4
+#: hacks/config/substrate.xml.h:3 hacks/config/thornbird.xml.h:3
+#: hacks/config/whirlwindwarp.xml.h:1 hacks/config/wormhole.xml.h:3
+#: hacks/config/xfishtank.xml.h:4
 msgid "Few"
 msgstr "少"
 
 msgid "Few"
 msgstr "少"
 
@@ -1082,7 +1085,7 @@ msgstr "少"
 #: hacks/config/epicycle.xml.h:8 hacks/config/eruption.xml.h:12
 #: hacks/config/euler2d.xml.h:8 hacks/config/fadeplot.xml.h:6
 #: hacks/config/flag.xml.h:5 hacks/config/flame.xml.h:11
 #: hacks/config/epicycle.xml.h:8 hacks/config/eruption.xml.h:12
 #: hacks/config/euler2d.xml.h:8 hacks/config/fadeplot.xml.h:6
 #: hacks/config/flag.xml.h:5 hacks/config/flame.xml.h:11
-#: hacks/config/flow.xml.h:8 hacks/config/fluidballs.xml.h:13
+#: hacks/config/flow.xml.h:7 hacks/config/fluidballs.xml.h:13
 #: hacks/config/forest.xml.h:3 hacks/config/fuzzyflakes.xml.h:12
 #: 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/forest.xml.h:3 hacks/config/fuzzyflakes.xml.h:12
 #: hacks/config/galaxy.xml.h:6 hacks/config/grav.xml.h:4
 #: hacks/config/halo.xml.h:4 hacks/config/hopalong.xml.h:15
@@ -1120,7 +1123,7 @@ msgstr "多"
 #: 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/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/flow.xml.h:8 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/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
@@ -1174,22 +1177,23 @@ msgstr ""
 #: 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/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/flyingtoasters.xml.h:11
-#: hacks/config/fontglide.xml.h:13 hacks/config/forest.xml.h:5
-#: hacks/config/fuzzyflakes.xml.h:15 hacks/config/galaxy.xml.h:10
-#: hacks/config/gears.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:8 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:10 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/fadeplot.xml.h:8 hacks/config/fireworkx.xml.h:9
+#: 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:10 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/fuzzyflakes.xml.h:15
+#: hacks/config/galaxy.xml.h:11 hacks/config/gears.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:8
+#: 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:10
+#: 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/intermomentary.xml.h:4 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/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
@@ -1207,23 +1211,24 @@ msgstr ""
 #: hacks/config/pacman.xml.h:5 hacks/config/penetrate.xml.h:6
 #: hacks/config/penrose.xml.h:11 hacks/config/petri.xml.h:23
 #: hacks/config/phosphor.xml.h:7 hacks/config/piecewise.xml.h:9
 #: hacks/config/pacman.xml.h:5 hacks/config/penetrate.xml.h:6
 #: hacks/config/penrose.xml.h:11 hacks/config/petri.xml.h:23
 #: hacks/config/phosphor.xml.h:7 hacks/config/piecewise.xml.h:9
-#: hacks/config/pipes.xml.h:15 hacks/config/polyhedra.xml.h:119
-#: hacks/config/polyominoes.xml.h:10 hacks/config/polytopes.xml.h:20
-#: hacks/config/pong.xml.h:4 hacks/config/popsquares.xml.h:5
-#: hacks/config/providence.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 hacks/config/rocks.xml.h:9
-#: hacks/config/rotor.xml.h:11 hacks/config/rubik.xml.h:9
-#: hacks/config/sballs.xml.h:13 hacks/config/shadebobs.xml.h:9
-#: hacks/config/sierpinski.xml.h:7 hacks/config/sierpinski3d.xml.h:8
-#: hacks/config/slidescreen.xml.h:6 hacks/config/slip.xml.h:7
-#: hacks/config/speedmine.xml.h:13 hacks/config/sphere.xml.h:5
-#: hacks/config/spheremonics.xml.h:19 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:4 hacks/config/superquadrics.xml.h:8
+#: hacks/config/pinion.xml.h:13 hacks/config/pipes.xml.h:15
+#: hacks/config/polyhedra.xml.h:119 hacks/config/polyominoes.xml.h:10
+#: hacks/config/polytopes.xml.h:20 hacks/config/pong.xml.h:4
+#: hacks/config/popsquares.xml.h:5 hacks/config/providence.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
+#: hacks/config/rocks.xml.h:9 hacks/config/rotor.xml.h:11
+#: hacks/config/rubik.xml.h:9 hacks/config/sballs.xml.h:13
+#: hacks/config/shadebobs.xml.h:9 hacks/config/sierpinski.xml.h:7
+#: hacks/config/sierpinski3d.xml.h:8 hacks/config/slidescreen.xml.h:6
+#: hacks/config/slip.xml.h:7 hacks/config/speedmine.xml.h:13
+#: hacks/config/sphere.xml.h:5 hacks/config/spheremonics.xml.h:19
+#: 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:4
+#: hacks/config/substrate.xml.h:10 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/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
@@ -1256,17 +1261,18 @@ msgstr "慢"
 #: hacks/config/engine.xml.h:16 hacks/config/epicycle.xml.h:11
 #: 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/engine.xml.h:16 hacks/config/epicycle.xml.h:11
 #: 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/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/fuzzyflakes.xml.h:17
-#: hacks/config/galaxy.xml.h:11 hacks/config/glblur.xml.h:17
-#: hacks/config/glforestfire.xml.h:15 hacks/config/glplanet.xml.h:10
-#: 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:11 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/fireworkx.xml.h:11 hacks/config/flag.xml.h:9
+#: hacks/config/flame.xml.h:15 hacks/config/flipflop.xml.h:7
+#: hacks/config/flipscreen3d.xml.h:7 hacks/config/flow.xml.h:12
+#: hacks/config/fluidballs.xml.h:20 hacks/config/forest.xml.h:6
+#: hacks/config/fuzzyflakes.xml.h:17 hacks/config/galaxy.xml.h:12
+#: hacks/config/glblur.xml.h:17 hacks/config/glforestfire.xml.h:15
+#: hacks/config/glplanet.xml.h:10 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:11
+#: 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/intermomentary.xml.h:5 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/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
@@ -1295,16 +1301,16 @@ msgstr "慢"
 #: 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/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/xplanet.xml.h:60 hacks/config/xrayswarm.xml.h:4
-#: hacks/config/zoom.xml.h:7
+#: hacks/config/strange.xml.h:5 hacks/config/substrate.xml.h:11
+#: 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/xplanet.xml.h:60
+#: hacks/config/xrayswarm.xml.h:4 hacks/config/zoom.xml.h:7
 msgid "Speed"
 msgstr "速度"
 
 msgid "Speed"
 msgstr "速度"
 
@@ -1347,8 +1353,8 @@ msgstr ""
 #: hacks/config/discrete.xml.h:11 hacks/config/drift.xml.h:14
 #: hacks/config/epicycle.xml.h:13 hacks/config/euler2d.xml.h:17
 #: hacks/config/fadeplot.xml.h:12 hacks/config/flag.xml.h:13
 #: hacks/config/discrete.xml.h:11 hacks/config/drift.xml.h:14
 #: hacks/config/epicycle.xml.h:13 hacks/config/euler2d.xml.h:17
 #: hacks/config/fadeplot.xml.h:12 hacks/config/flag.xml.h:13
-#: hacks/config/flame.xml.h:16 hacks/config/flow.xml.h:18
-#: hacks/config/forest.xml.h:8 hacks/config/galaxy.xml.h:13
+#: hacks/config/flame.xml.h:16 hacks/config/flow.xml.h:15
+#: hacks/config/forest.xml.h:8 hacks/config/galaxy.xml.h:14
 #: hacks/config/grav.xml.h:11 hacks/config/halo.xml.h:13
 #: hacks/config/hopalong.xml.h:25 hacks/config/ifs.xml.h:8
 #: hacks/config/imsmap.xml.h:15 hacks/config/interference.xml.h:19
 #: hacks/config/grav.xml.h:11 hacks/config/halo.xml.h:13
 #: hacks/config/hopalong.xml.h:25 hacks/config/ifs.xml.h:8
 #: hacks/config/imsmap.xml.h:15 hacks/config/interference.xml.h:19
@@ -1453,7 +1459,7 @@ msgstr "四邊格子"
 #: 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/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/flag.xml.h:4 hacks/config/flow.xml.h:4
 #: hacks/config/fluidballs.xml.h:12 hacks/config/fuzzyflakes.xml.h:10
 #: 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/fluidballs.xml.h:12 hacks/config/fuzzyflakes.xml.h:10
 #: hacks/config/gleidescope.xml.h:7 hacks/config/halftone.xml.h:8
 #: hacks/config/hopalong.xml.h:13 hacks/config/interference.xml.h:11
@@ -1487,7 +1493,7 @@ msgstr "六邊格子"
 #: 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/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/flag.xml.h:8 hacks/config/flow.xml.h:11
 #: hacks/config/fluidballs.xml.h:19 hacks/config/fuzzyflakes.xml.h:16
 #: 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/fluidballs.xml.h:19 hacks/config/fuzzyflakes.xml.h:16
 #: hacks/config/gleidescope.xml.h:12 hacks/config/halftone.xml.h:14
 #: hacks/config/hopalong.xml.h:22 hacks/config/interference.xml.h:18
@@ -1507,7 +1513,7 @@ msgstr "三邊格子"
 
 #: 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/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/flag.xml.h:12 hacks/config/flow.xml.h:14
 #: hacks/config/lissie.xml.h:12 hacks/config/loop.xml.h:11
 #: hacks/config/rubik.xml.h:12 hacks/config/sierpinski.xml.h:11
 #: hacks/config/slip.xml.h:11
 #: hacks/config/lissie.xml.h:12 hacks/config/loop.xml.h:11
 #: hacks/config/rubik.xml.h:12 hacks/config/sierpinski.xml.h:11
 #: hacks/config/slip.xml.h:11
@@ -1559,13 +1565,14 @@ msgstr ""
 #: hacks/config/menger.xml.h:15 hacks/config/mirrorblob.xml.h:18
 #: hacks/config/moebius.xml.h:6 hacks/config/molecule.xml.h:21
 #: hacks/config/morph3d.xml.h:5 hacks/config/noof.xml.h:4
 #: hacks/config/menger.xml.h:15 hacks/config/mirrorblob.xml.h:18
 #: hacks/config/moebius.xml.h:6 hacks/config/molecule.xml.h:21
 #: hacks/config/morph3d.xml.h:5 hacks/config/noof.xml.h:4
-#: hacks/config/pipes.xml.h:14 hacks/config/polyhedra.xml.h:118
-#: hacks/config/polytopes.xml.h:18 hacks/config/providence.xml.h:4
-#: 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
+#: hacks/config/pinion.xml.h:12 hacks/config/pipes.xml.h:14
+#: hacks/config/polyhedra.xml.h:118 hacks/config/polytopes.xml.h:18
+#: hacks/config/providence.xml.h:4 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 "印出每秒顯示的畫格數目"
 
 msgid "Show Frames-per-Second"
 msgstr "印出每秒顯示的畫格數目"
 
@@ -1730,11 +1737,12 @@ msgstr "鯨魚的速度"
 #: hacks/config/lament.xml.h:9 hacks/config/lavalite.xml.h:32
 #: hacks/config/menger.xml.h:21 hacks/config/mirrorblob.xml.h:24
 #: hacks/config/moebius.xml.h:11 hacks/config/molecule.xml.h:26
 #: hacks/config/lament.xml.h:9 hacks/config/lavalite.xml.h:32
 #: hacks/config/menger.xml.h:21 hacks/config/mirrorblob.xml.h:24
 #: hacks/config/moebius.xml.h:11 hacks/config/molecule.xml.h:26
-#: hacks/config/polyhedra.xml.h:173 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
+#: hacks/config/pinion.xml.h:15 hacks/config/polyhedra.xml.h:173
+#: 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 ""
 
 msgid "Wireframe"
 msgstr ""
 
@@ -1822,14 +1830,15 @@ msgstr "線"
 #: 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/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/mismunch.xml.h:3
-#: 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 hacks/config/spheremonics.xml.h:7
+#: hacks/config/flow.xml.h:6 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/mismunch.xml.h:3 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
+#: hacks/config/spheremonics.xml.h:7 hacks/config/substrate.xml.h:6
 #: hacks/config/wander.xml.h:10 hacks/config/whirlwindwarp.xml.h:3
 msgid "Long"
 msgstr "長"
 #: hacks/config/wander.xml.h:10 hacks/config/whirlwindwarp.xml.h:3
 msgid "Long"
 msgstr "長"
@@ -1876,13 +1885,14 @@ msgstr "排斥距離臨界值"
 #: 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/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/metaballs.xml.h:12 hacks/config/mismunch.xml.h:8
-#: 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/flow.xml.h:9 hacks/config/galaxy.xml.h:9
+#: hacks/config/klein.xml.h:5 hacks/config/laser.xml.h:9
+#: hacks/config/menger.xml.h:14 hacks/config/metaballs.xml.h:12
+#: hacks/config/mismunch.xml.h:8 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/substrate.xml.h:9
 #: hacks/config/wander.xml.h:12 hacks/config/whirlwindwarp.xml.h:6
 msgid "Short"
 msgstr "短"
 #: hacks/config/wander.xml.h:12 hacks/config/whirlwindwarp.xml.h:6
 msgid "Short"
 msgstr "短"
@@ -2085,10 +2095,10 @@ msgstr ""
 #: 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/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/polyhedra.xml.h:3 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/wormhole.xml.h:1
-#: hacks/config/xfishtank.xml.h:1
+#: hacks/config/pinion.xml.h:3 hacks/config/polyhedra.xml.h:3
+#: 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/wormhole.xml.h:1 hacks/config/xfishtank.xml.h:1
 msgid "Animation Speed"
 msgstr "動畫速度"
 
 msgid "Animation Speed"
 msgstr "動畫速度"
 
@@ -2167,8 +2177,9 @@ msgstr "繪畫顏色不斷隨機變換而且交織在一起的同心圓。由 Jo
 #: 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/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/starfish.xml.h:2 hacks/config/substrate.xml.h:1
+#: hacks/config/vidwhacker.xml.h:3 hacks/config/wander.xml.h:7
+#: hacks/config/xspirograph.xml.h:3
 msgid "Duration"
 msgstr "持續時間"
 
 msgid "Duration"
 msgstr "持續時間"
 
@@ -2425,7 +2436,7 @@ msgstr ""
 msgid "Rotate"
 msgstr "旋轉"
 
 msgid "Rotate"
 msgstr "旋轉"
 
-#: hacks/config/circuit.xml.h:8
+#: hacks/config/circuit.xml.h:8 hacks/config/pinion.xml.h:10
 msgid "Rotation Speed"
 msgstr "旋轉速度"
 
 msgid "Rotation Speed"
 msgstr "旋轉速度"
 
@@ -2510,11 +2521,12 @@ msgstr "1 秒"
 msgid "Coral"
 msgstr "珊瑚"
 
 msgid "Coral"
 msgstr "珊瑚"
 
-#: hacks/config/coral.xml.h:4 hacks/config/gflux.xml.h:3
-#: hacks/config/glblur.xml.h:2 hacks/config/glmatrix.xml.h:3
-#: 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
+#: hacks/config/coral.xml.h:4 hacks/config/fireworkx.xml.h:2
+#: hacks/config/gflux.xml.h:3 hacks/config/glblur.xml.h:2
+#: hacks/config/glmatrix.xml.h:3 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
 msgid "Dense"
 msgstr "較濃密"
 
 msgid "Dense"
 msgstr "較濃密"
 
@@ -2527,12 +2539,12 @@ msgid ""
 "Simulates coral growth, albeit somewhat slowly. Written by Frederick Roeber."
 msgstr ""
 
 "Simulates coral growth, albeit somewhat slowly. Written by Frederick Roeber."
 msgstr ""
 
-#: hacks/config/coral.xml.h:13 hacks/config/gflux.xml.h:13
-#: hacks/config/glblur.xml.h:16 hacks/config/glmatrix.xml.h:19
-#: hacks/config/imsmap.xml.h:13 hacks/config/lavalite.xml.h:29
-#: hacks/config/pyro.xml.h:14 hacks/config/qix.xml.h:21
-#: hacks/config/squiral.xml.h:15 hacks/config/xearth.xml.h:24
-#: hacks/config/xmatrix.xml.h:17
+#: hacks/config/coral.xml.h:13 hacks/config/fireworkx.xml.h:10
+#: hacks/config/gflux.xml.h:13 hacks/config/glblur.xml.h:16
+#: hacks/config/glmatrix.xml.h:19 hacks/config/imsmap.xml.h:13
+#: hacks/config/lavalite.xml.h:29 hacks/config/pyro.xml.h:14
+#: hacks/config/qix.xml.h:21 hacks/config/squiral.xml.h:15
+#: hacks/config/xearth.xml.h:24 hacks/config/xmatrix.xml.h:17
 msgid "Sparse"
 msgstr "較稀疏"
 
 msgid "Sparse"
 msgstr "較稀疏"
 
@@ -2562,7 +2574,7 @@ msgid "Center on Screen"
 msgstr "畫面中央"
 
 #: hacks/config/crystal.xml.h:2 hacks/config/deluxe.xml.h:1
 msgstr "畫面中央"
 
 #: hacks/config/crystal.xml.h:2 hacks/config/deluxe.xml.h:1
-#: hacks/config/fadeplot.xml.h:1 hacks/config/flow.xml.h:3
+#: hacks/config/fadeplot.xml.h:1 hacks/config/flow.xml.h:1
 #: hacks/config/galaxy.xml.h:1 hacks/config/glforestfire.xml.h:1
 #: hacks/config/grav.xml.h:1 hacks/config/julia.xml.h:1
 #: hacks/config/laser.xml.h:1 hacks/config/lisa.xml.h:1
 #: hacks/config/galaxy.xml.h:1 hacks/config/glforestfire.xml.h:1
 #: hacks/config/grav.xml.h:1 hacks/config/julia.xml.h:1
 #: hacks/config/laser.xml.h:1 hacks/config/lisa.xml.h:1
@@ -3332,7 +3344,7 @@ msgstr ""
 msgid "Half"
 msgstr "暈輪"
 
 msgid "Half"
 msgstr "暈輪"
 
-#: hacks/config/fireflies.xml.h:17
+#: hacks/config/fireflies.xml.h:17 hacks/config/pinion.xml.h:7
 #, fuzzy
 msgid "Huge"
 msgstr "大火"
 #, fuzzy
 msgid "Huge"
 msgstr "大火"
@@ -3428,7 +3440,7 @@ msgstr ""
 msgid "Swarm tails glow"
 msgstr ""
 
 msgid "Swarm tails glow"
 msgstr ""
 
-#: hacks/config/fireflies.xml.h:43
+#: hacks/config/fireflies.xml.h:43 hacks/config/pinion.xml.h:14
 msgid "Tiny"
 msgstr ""
 
 msgid "Tiny"
 msgstr ""
 
@@ -3446,6 +3458,32 @@ msgstr "Windows"
 msgid "Wind picks up"
 msgstr ""
 
 msgid "Wind picks up"
 msgstr ""
 
+#: hacks/config/fireworkx.xml.h:1 hacks/config/lavalite.xml.h:3
+msgid "Activity"
+msgstr ""
+
+#: hacks/config/fireworkx.xml.h:4
+msgid "Fast Fade (more realistic)"
+msgstr ""
+
+#: hacks/config/fireworkx.xml.h:5
+#, fuzzy
+msgid "Fireworkx"
+msgstr "檔案(_F)"
+
+#: hacks/config/fireworkx.xml.h:6
+msgid "Light effect"
+msgstr ""
+
+#: hacks/config/fireworkx.xml.h:7
+msgid "Pyrotechnics simulation eye-candy. Written by Rony B. Chandran."
+msgstr ""
+
+#: hacks/config/fireworkx.xml.h:8
+#, fuzzy
+msgid "Shoot"
+msgstr "短"
+
 #: hacks/config/flag.xml.h:1
 msgid "Bitmap for Flag"
 msgstr "旗幟的點陣圖"
 #: hacks/config/flag.xml.h:1
 msgid "Bitmap for Flag"
 msgstr "旗幟的點陣圖"
@@ -3520,43 +3558,45 @@ msgid ""
 "around and deforms it in various ways. Written by Ben Buxton."
 msgstr ""
 
 "around and deforms it in various ways. Written by Ben Buxton."
 msgstr ""
 
-#: hacks/config/flow.xml.h:1
-msgid "Allow 2D Attractors"
-msgstr ""
-
-#: hacks/config/flow.xml.h:2
-msgid ""
-"Another series of strange attractors: a flowing series of points, making "
-"strange rotational shapes. Written by Tim Auckland."
-msgstr ""
-
-#: hacks/config/flow.xml.h:5
+#: hacks/config/flow.xml.h:3
 msgid "Flow"
 msgstr "流動"
 
 msgid "Flow"
 msgstr "流動"
 
-#: hacks/config/flow.xml.h:6
-msgid "Freeze Some Bees"
+#: hacks/config/flow.xml.h:5
+#, fuzzy
+msgid "Length of trails"
+msgstr "留下軌跡"
+
+#: hacks/config/flow.xml.h:13
+msgid ""
+"Strange attractors formed of flows in a 3D differential equation phase "
+"space. Written by Tim Auckland."
 msgstr ""
 
 msgstr ""
 
-#: hacks/config/flow.xml.h:10
-msgid "Ride a Trained Bee"
+#: hacks/config/flow.xml.h:16
+msgid "turn on/off bounding box."
 msgstr ""
 
 msgstr ""
 
-#: hacks/config/flow.xml.h:11
-msgid "Rotate Around Attractor"
+#: hacks/config/flow.xml.h:17
+#, fuzzy
+msgid "turn on/off double buffering."
+msgstr "使用雙重緩衝區"
+
+#: hacks/config/flow.xml.h:18
+msgid "turn on/off periodic attractors."
 msgstr ""
 
 msgstr ""
 
-#: hacks/config/flow.xml.h:12
-msgid "Show Bounding Box"
+#: hacks/config/flow.xml.h:19
+msgid "turn on/off ride in the flow."
 msgstr ""
 
 msgstr ""
 
-#: hacks/config/flow.xml.h:14
-msgid "Slow Bees with Antifreeze"
+#: hacks/config/flow.xml.h:20
+msgid "turn on/off rotating around attractor."
 msgstr ""
 
 msgstr ""
 
-#: hacks/config/flow.xml.h:19
-msgid "Zoom In and Out"
-msgstr "拉近及拉遠"
+#: hacks/config/flow.xml.h:21
+msgid "turn on/off search for new attractors."
+msgstr ""
 
 #: hacks/config/fluidballs.xml.h:1
 msgid "      Freefall"
 
 #: hacks/config/fluidballs.xml.h:1
 msgid "      Freefall"
@@ -3778,7 +3818,12 @@ msgstr "隨機運動"
 msgid "Galaxy"
 msgstr "宇宙"
 
 msgid "Galaxy"
 msgstr "宇宙"
 
-#: hacks/config/galaxy.xml.h:9 hacks/config/lisa.xml.h:7
+#: hacks/config/galaxy.xml.h:8
+#, fuzzy
+msgid "Rotate Viewpoint"
+msgstr "線性運動"
+
+#: hacks/config/galaxy.xml.h:10 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/pong.xml.h:3
 #: hacks/config/rotor.xml.h:10 hacks/config/rubik.xml.h:8
 #: hacks/config/lissie.xml.h:8 hacks/config/loop.xml.h:6
 #: hacks/config/penrose.xml.h:10 hacks/config/pong.xml.h:3
 #: hacks/config/rotor.xml.h:10 hacks/config/rubik.xml.h:8
@@ -3787,7 +3832,7 @@ msgstr "宇宙"
 msgid "Size"
 msgstr "大小"
 
 msgid "Size"
 msgstr "大小"
 
-#: hacks/config/galaxy.xml.h:12
+#: hacks/config/galaxy.xml.h:13
 msgid ""
 "This draws spinning galaxies, which then collide and scatter their stars to "
 "the, uh, four winds or something. Originally an Amiga program by Uli "
 msgid ""
 "This draws spinning galaxies, which then collide and scatter their stars to "
 "the, uh, four winds or something. Originally an Amiga program by Uli "
@@ -4103,9 +4148,9 @@ msgid ""
 "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 "
 "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."
+"of this window: the tab at the top of the *other* window.) 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
 msgstr ""
 
 #: hacks/config/glslideshow.xml.h:17
@@ -4653,6 +4698,27 @@ msgstr ""
 msgid "Wave Size"
 msgstr ""
 
 msgid "Wave Size"
 msgstr ""
 
+#: hacks/config/intermomentary.xml.h:2
+msgid "Intermomentary"
+msgstr ""
+
+#: hacks/config/intermomentary.xml.h:3
+#, fuzzy
+msgid "Number of Discs"
+msgstr "光環的數目"
+
+#: hacks/config/intermomentary.xml.h:6
+msgid ""
+"The Intersection Momentary is a fun visualization defining the relationships "
+"between objects with Casey Reas, William Ngan, and Robert Hodgin. "
+"Commissioned for display at the Whitney Museum of American Art. A surface "
+"filled with 100 medium to small sized circles. Each circle has a different "
+"size and direction, but moves at the same slow rate. Display: A. The "
+"instantaneous intersections of the circles. B. The aggregate intersections "
+"of the circles. Ported to XScreensaver from the art project \"InterMomentary"
+"\" at http://www.complexification.net"
+msgstr ""
+
 #: hacks/config/jigglypuff.xml.h:2
 msgid "Chrome"
 msgstr ""
 #: hacks/config/jigglypuff.xml.h:2
 msgid "Chrome"
 msgstr ""
@@ -4877,10 +4943,6 @@ msgstr "不斷移動的散射狀線條,有點類似掃描用的雷射光束。
 msgid "10"
 msgstr "0"
 
 msgid "10"
 msgstr "0"
 
-#: hacks/config/lavalite.xml.h:3
-msgid "Activity"
-msgstr ""
-
 #: hacks/config/lavalite.xml.h:4
 msgid "Classic Lavalite"
 msgstr ""
 #: hacks/config/lavalite.xml.h:4
 msgid "Classic Lavalite"
 msgstr ""
@@ -5619,6 +5681,41 @@ msgid ""
 "invisibility at intersection points. Written by Geoffrey Irving."
 msgstr ""
 
 "invisibility at intersection points. Written by Geoffrey Irving."
 msgstr ""
 
+#: hacks/config/pinion.xml.h:1
+#, fuzzy
+msgid "100"
+msgstr "100%"
+
+#: hacks/config/pinion.xml.h:2
+msgid "2000"
+msgstr ""
+
+#: hacks/config/pinion.xml.h:4
+#, fuzzy
+msgid ""
+"Draws an interconnected set of gears moving across the screen. Written by "
+"Jamie Zawinski."
+msgstr "它繪畫隨機顏色的條狀矩形。由 Jamie Zawinski 編寫。"
+
+#: hacks/config/pinion.xml.h:6
+#, fuzzy
+msgid "Gear Size"
+msgstr "格子大小"
+
+#: hacks/config/pinion.xml.h:8
+msgid "Max RPM"
+msgstr ""
+
+#: hacks/config/pinion.xml.h:9
+#, fuzzy
+msgid "Pinion"
+msgstr "長"
+
+#: hacks/config/pinion.xml.h:11
+#, fuzzy
+msgid "Scrolling Speed"
+msgstr "捲動速度"
+
 #: hacks/config/pipes.xml.h:1
 msgid "Allow Tight Turns"
 msgstr ""
 #: hacks/config/pipes.xml.h:1
 msgid "Allow Tight Turns"
 msgstr ""
@@ -5647,7 +5744,8 @@ msgstr ""
 "如果你曾身處於有 Windows NT 電腦的房間中,你應該見過這個 GL 程式。此版本是由 "
 "Marcelo Vianna 編寫。"
 
 "如果你曾身處於有 Windows NT 電腦的房間中,你應該見過這個 GL 程式。此版本是由 "
 "Marcelo Vianna 編寫。"
 
-#: hacks/config/pipes.xml.h:9 hacks/config/wormhole.xml.h:4
+#: hacks/config/pipes.xml.h:9 hacks/config/substrate.xml.h:7
+#: hacks/config/wormhole.xml.h:4
 msgid "Lots"
 msgstr ""
 
 msgid "Lots"
 msgstr ""
 
@@ -6911,22 +7009,26 @@ msgid "Ping subnet/30 (2 hosts)"
 msgstr ""
 
 #: hacks/config/sonar.xml.h:10
 msgstr ""
 
 #: hacks/config/sonar.xml.h:10
-msgid "Simulation Team Members"
+msgid "Resolve Host Names"
 msgstr ""
 
 #: hacks/config/sonar.xml.h:11
 msgstr ""
 
 #: hacks/config/sonar.xml.h:11
+msgid "Simulation Team Members"
+msgstr ""
+
+#: hacks/config/sonar.xml.h:12
 msgid "Sonar"
 msgstr "聲納"
 
 msgid "Sonar"
 msgstr "聲納"
 
-#: hacks/config/sonar.xml.h:12
+#: hacks/config/sonar.xml.h:13
 msgid "Team A Name"
 msgstr ""
 
 msgid "Team A Name"
 msgstr ""
 
-#: hacks/config/sonar.xml.h:13
+#: hacks/config/sonar.xml.h:14
 msgid "Team B Name"
 msgstr ""
 
 msgid "Team B Name"
 msgstr ""
 
-#: hacks/config/sonar.xml.h:14
+#: hacks/config/sonar.xml.h:15
 msgid ""
 "This program draws a simulation of a sonar screen. By default, it displays a "
 "random assortment of ``bogies'' on the screen, but if installed as \"setuid "
 msgid ""
 "This program draws a simulation of a sonar screen. By default, it displays a "
 "random assortment of ``bogies'' on the screen, but if installed as \"setuid "
@@ -6935,7 +7037,7 @@ msgid ""
 "Martin and Jamie Zawinski."
 msgstr ""
 
 "Martin and Jamie Zawinski."
 msgstr ""
 
-#: hacks/config/sonar.xml.h:15
+#: hacks/config/sonar.xml.h:16
 msgid "vs."
 msgstr "對"
 
 msgid "vs."
 msgstr "對"
 
@@ -7211,6 +7313,32 @@ msgid ""
 "Written by Massimino Pascal."
 msgstr ""
 
 "Written by Massimino Pascal."
 msgstr ""
 
+#: hacks/config/substrate.xml.h:4
+#, fuzzy
+msgid "Initial Cracks"
+msgstr "煙花密度"
+
+#: hacks/config/substrate.xml.h:5
+msgid ""
+"Lines like crystals grow on a computational substrate. A simple "
+"perpendicular growth rule creates intricate city-like structures. By J. "
+"Tarbell and Mike Kershaw."
+msgstr ""
+
+#: hacks/config/substrate.xml.h:8
+#, fuzzy
+msgid "Sandgrains"
+msgstr "標準"
+
+#: hacks/config/substrate.xml.h:12
+#, fuzzy
+msgid "Substrate"
+msgstr "狀態"
+
+#: hacks/config/substrate.xml.h:13
+msgid "Wireframe only"
+msgstr ""
+
 #: hacks/config/superquadrics.xml.h:3
 msgid ""
 "Ed Mackey reports that he wrote the first version of this program in BASIC "
 #: hacks/config/superquadrics.xml.h:3
 msgid ""
 "Ed Mackey reports that he wrote the first version of this program in BASIC "
@@ -8368,6 +8496,9 @@ msgid ""
 "than just a simple zoom. Written by James Macnicol."
 msgstr ""
 
 "than just a simple zoom. Written by James Macnicol."
 msgstr ""
 
+#~ msgid "Zoom In and Out"
+#~ msgstr "拉近及拉遠"
+
 #~ msgid "PDB File"
 #~ msgstr "PDB 檔案"
 
 #~ msgid "PDB File"
 #~ msgstr "PDB 檔案"
 
index 649c8253f9446795f6e3e4afd985aa75fcb73f77..fc0e55e315c959755ad007e6a5de7cc2f21c950b 100644 (file)
--- a/setup.com
+++ b/setup.com
@@ -13,6 +13,7 @@ $ barcode     :== $'mydir'barcode
 $ blaster      :== $'mydir'blaster
 $ blitspin     :== $'mydir'blitspin
 $ bouboule     :== $'mydir'bouboule
 $ blaster      :== $'mydir'blaster
 $ blitspin     :== $'mydir'blitspin
 $ bouboule     :== $'mydir'bouboule
+$ boxfit       :== $'mydir'boxfit
 $ braid                :== $'mydir'braid
 $ bsod         :== $'mydir'bsod
 $ bubbles      :== $'mydir'bubbles
 $ braid                :== $'mydir'braid
 $ bsod         :== $'mydir'bsod
 $ bubbles      :== $'mydir'bubbles
@@ -35,6 +36,7 @@ $ epicycle    :== $'mydir'epicycle
 $ eruption     :== $'mydir'eruption
 $ euler2d      :== $'mydir'euler2d
 $ fadeplot     :== $'mydir'fadeplot
 $ eruption     :== $'mydir'eruption
 $ euler2d      :== $'mydir'euler2d
 $ fadeplot     :== $'mydir'fadeplot
+$ fiberlamp    :== $'mydir'fiberlamp
 $ fireworkx    :== $'mydir'fireworkx
 $ flag         :== $'mydir'flag
 $ flame                :== $'mydir'flame
 $ fireworkx    :== $'mydir'fireworkx
 $ flag         :== $'mydir'flag
 $ flame                :== $'mydir'flame
index 768e1b254040fbd7d5548e5c44fe49d87204b1ef..1f1afcf334b181100e77629a29e3abd0dadc7cc1 100644 (file)
@@ -1,4 +1,4 @@
-# utils/Makefile.in --- xscreensaver, Copyright (c) 1997-2004 Jamie Zawinski.
+# utils/Makefile.in --- xscreensaver, Copyright (c) 1997-2005 Jamie Zawinski.
 # the `../configure' script generates `utils/Makefile' from this file.
 
 
 # the `../configure' script generates `utils/Makefile' from this file.
 
 
index 628617348b733c2f43bd326fc85abf35a6bc521a..dbf0aec7858e7eff5d3254cf239208e48c99d513 100644 (file)
@@ -1,5 +1,4 @@
-/* xscreensaver, Copyright (c) 1992, 1993, 1994, 1997, 1998, 2001, 2003, 2004
- *  Jamie Zawinski <jwz@jwz.org>
+/* xscreensaver, Copyright (c) 1992-2005 Jamie Zawinski <jwz@jwz.org>
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
  * documentation for any purpose is hereby granted without fee, provided that
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
  * documentation for any purpose is hereby granted without fee, provided that
@@ -188,6 +187,41 @@ get_name (Display *dpy, Window window)
     return 0;
 }
 
     return 0;
 }
 
+static Bool
+get_geometry (Display *dpy, Window window, XRectangle *ret)
+{
+  Atom type;
+  int format;
+  unsigned long nitems, bytesafter;
+  unsigned char *name = 0;
+  Atom atom = XInternAtom (dpy, XA_XSCREENSAVER_IMAGE_GEOMETRY, False);
+  int x, y;
+  unsigned int w, h;
+  if (XGetWindowProperty (dpy, window, atom,
+                          0, 1024, False, XA_STRING,
+                          &type, &format, &nitems, &bytesafter,
+                          &name)
+      == Success
+      && type != None)
+    {
+      int flags = XParseGeometry ((char *) name, &x, &y, &w, &h);
+      /* Require all four, and don't allow negative positions. */
+      if (flags == (XValue|YValue|WidthValue|HeightValue))
+        {
+          ret->x = x;
+          ret->y = y;
+          ret->width  = w;
+          ret->height = h;
+          return True;
+        }
+      else
+        return False;
+    }
+  else
+    return False;
+}
+
+
 
 static void
 hack_subproc_environment (Display *dpy)
 
 static void
 hack_subproc_environment (Display *dpy)
@@ -261,7 +295,7 @@ fork_exec_wait (const char *command)
 
 typedef struct {
   void (*callback) (Screen *, Window, Drawable,
 
 typedef struct {
   void (*callback) (Screen *, Window, Drawable,
-                    const char *name, void *closure);
+                    const char *name, XRectangle *geom, void *closure);
   Screen *screen;
   Window window;
   Drawable drawable;
   Screen *screen;
   Window window;
   Drawable drawable;
@@ -278,7 +312,8 @@ static void
 fork_exec_cb (const char *command,
               Screen *screen, Window window, Drawable drawable,
               void (*callback) (Screen *, Window, Drawable,
 fork_exec_cb (const char *command,
               Screen *screen, Window window, Drawable drawable,
               void (*callback) (Screen *, Window, Drawable,
-                                const char *name, void *closure),
+                                const char *name, XRectangle *geom,
+                                void *closure),
               void *closure)
 {
   grabclient_data *data;
               void *closure)
 {
   grabclient_data *data;
@@ -356,14 +391,18 @@ static void
 finalize_cb (XtPointer closure, int *fd, XtIntervalId *id)
 {
   grabclient_data *data = (grabclient_data *) closure;
 finalize_cb (XtPointer closure, int *fd, XtIntervalId *id)
 {
   grabclient_data *data = (grabclient_data *) closure;
+  Display *dpy = DisplayOfScreen (data->screen);
   char *name;
   char *name;
+  XRectangle geom = { 0, 0, 0, 0 };
 
   XtRemoveInput (*id);
 
 
   XtRemoveInput (*id);
 
-  name = get_name (DisplayOfScreen (data->screen), data->window);
+  name = get_name (dpy, data->window);
+  get_geometry (dpy, data->window, &geom);
+
   data->callback (data->screen, data->window, data->drawable,
   data->callback (data->screen, data->window, data->drawable,
-                  name, data->closure);
-  free (name);
+                  name, &geom, data->closure);
+  if (name) free (name);
 
   fclose (data->read_pipe);
   memset (data, 0, sizeof (*data));
 
   fclose (data->read_pipe);
   memset (data, 0, sizeof (*data));
@@ -377,9 +416,11 @@ finalize_cb (XtPointer closure, int *fd, XtIntervalId *id)
 static void
 load_random_image_1 (Screen *screen, Window window, Drawable drawable,
                      void (*callback) (Screen *, Window, Drawable,
 static void
 load_random_image_1 (Screen *screen, Window window, Drawable drawable,
                      void (*callback) (Screen *, Window, Drawable,
-                                       const char *name, void *closure),
+                                       const char *name, XRectangle *geom,
+                                       void *closure),
                      void *closure,
                      void *closure,
-                     char **name_ret)
+                     char **name_ret,
+                     XRectangle *geom_ret)
 {
   Display *dpy = DisplayOfScreen (screen);
   char *grabber = get_string_resource ("desktopGrabber", "DesktopGrabber");
 {
   Display *dpy = DisplayOfScreen (screen);
   char *grabber = get_string_resource ("desktopGrabber", "DesktopGrabber");
@@ -430,6 +471,8 @@ load_random_image_1 (Screen *screen, Window window, Drawable drawable,
       fork_exec_wait (cmd);
       if (name_ret)
         *name_ret = get_name (dpy, window);
       fork_exec_wait (cmd);
       if (name_ret)
         *name_ret = get_name (dpy, window);
+      if (geom_ret)
+        get_geometry (dpy, window, geom_ret);
     }
 
   free (cmd);
     }
 
   free (cmd);
@@ -444,10 +487,11 @@ load_random_image_1 (Screen *screen, Window window, Drawable drawable,
 void
 fork_load_random_image (Screen *screen, Window window, Drawable drawable,
                         void (*callback) (Screen *, Window, Drawable,
 void
 fork_load_random_image (Screen *screen, Window window, Drawable drawable,
                         void (*callback) (Screen *, Window, Drawable,
-                                          const char *name, void *closure),
+                                          const char *name, XRectangle *geom,
+                                          void *closure),
                         void *closure)
 {
                         void *closure)
 {
-  load_random_image_1 (screen, window, drawable, callback, closure, 0);
+  load_random_image_1 (screen, window, drawable, callback, closure, 0, 0);
 }
 
 
 }
 
 
@@ -458,9 +502,9 @@ fork_load_random_image (Screen *screen, Window window, Drawable drawable,
  */
 void
 load_random_image (Screen *screen, Window window, Drawable drawable,
  */
 void
 load_random_image (Screen *screen, Window window, Drawable drawable,
-                   char **name_ret)
+                   char **name_ret, XRectangle *geom_ret)
 {
 {
-  load_random_image_1 (screen, window, drawable, 0, 0, name_ret);
+  load_random_image_1 (screen, window, drawable, 0, 0, name_ret, geom_ret);
 }
 
 #else  /* DEBUG */
 }
 
 #else  /* DEBUG */
index 19d01e2aa2e165df4add8aeb37cf9426d1e98875..5193eea643efce4effd2b39164bb7fc5d28fb151 100644 (file)
@@ -1,4 +1,4 @@
-/* xscreensaver, Copyright (c) 1992, 1993, 1994, 1997, 2001, 2003, 2004
+/* xscreensaver, Copyright (c) 1992, 1993, 1994, 1997, 2001, 2003, 2004, 2005
  *  Jamie Zawinski <jwz@jwz.org>
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
  *  Jamie Zawinski <jwz@jwz.org>
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
 
    If it is from a file, then it will be returned in `filename_return'.
    filename_return may be NULL; also, NULL may be returned (e.g., if
 
    If it is from a file, then it will be returned in `filename_return'.
    filename_return may be NULL; also, NULL may be returned (e.g., if
-   it's a screenshot or video capture.)
+   it's a screenshot or video capture.)  You are responsible for
+   freeing this string.
+
+   The size and position of the image is returned in `geometry_return'.
+   The image will generally have been scaled up to fit the window, but
+   if a loaded file had a different aspect ratio than the window, it
+   will have been centered, and the returned coords will describe that.
 
    Many colors may be allocated from the window's colormap.
  */
 extern void load_random_image (Screen *screen,
                                Window top_level_window,
                                Drawable target_window_or_pixmap, 
 
    Many colors may be allocated from the window's colormap.
  */
 extern void load_random_image (Screen *screen,
                                Window top_level_window,
                                Drawable target_window_or_pixmap, 
-                               char **filename_return);
+                               char **filename_return,
+                               XRectangle *geometry_return);
 
 /* Like the above, but loads the image in the background and runs the
 
 /* Like the above, but loads the image in the background and runs the
-   given callback once it has been loaded.
+   given callback once it has been loaded.  Copy `name' if you want
+   to keep it.
  */
 extern void fork_load_random_image (Screen *screen, Window window,
                                     Drawable drawable,
                                     void (*callback) (Screen *, Window,
                                                       Drawable,
                                                       const char *name,
  */
 extern void fork_load_random_image (Screen *screen, Window window,
                                     Drawable drawable,
                                     void (*callback) (Screen *, Window,
                                                       Drawable,
                                                       const char *name,
+                                                      XRectangle *geometry,
                                                       void *closure),
                                     void *closure);
 
                                                       void *closure),
                                     void *closure);
 
@@ -65,8 +74,9 @@ extern Bool top_level_window_p(Screen *screen, Window window);
 /* Don't call this: this is for the "xscreensaver-getimage" program only. */
 extern void grab_screen_image_internal (Screen *, Window);
 
 /* Don't call this: this is for the "xscreensaver-getimage" program only. */
 extern void grab_screen_image_internal (Screen *, Window);
 
-/* Don't use this: this is how "xscreensaver-getimage" and "grabclient.c"
+/* Don't use these: this is how "xscreensaver-getimage" and "grabclient.c"
    pass the file name around. */
 #define XA_XSCREENSAVER_IMAGE_FILENAME "_SCREENSAVER_IMAGE_FILENAME"
    pass the file name around. */
 #define XA_XSCREENSAVER_IMAGE_FILENAME "_SCREENSAVER_IMAGE_FILENAME"
+#define XA_XSCREENSAVER_IMAGE_GEOMETRY "_SCREENSAVER_IMAGE_GEOMETRY"
 
 #endif /* __GRABSCREEN_H__ */
 
 #endif /* __GRABSCREEN_H__ */
index e963c3667056e54912d36f62924146be79e1d520..2c694edbc0e0d9bc18f55490631703f34de0cb6e 100644 (file)
@@ -1,2 +1,2 @@
 static const char screensaver_id[] =
 static const char screensaver_id[] =
-       "@(#)xscreensaver 4.19 (16-Dec-2004), by Jamie Zawinski (jwz@jwz.org)";
+       "@(#)xscreensaver 4.20 (23-Feb-2005), by Jamie Zawinski (jwz@jwz.org)";
index dd4a7291a910d15cc56e2f4a480d41718b50b222..65097b839e75095a5b91c90fc62dfd2af54374fd 100644 (file)
  * Jamie Zawinski <jwz@jwz.org>, 3-Sep-2003
  * - if the environment variable "XSCREENSAVER_WINDOW" is set, use that
  *   as the root window instead of searching for __SWM_VROOT.
  * Jamie Zawinski <jwz@jwz.org>, 3-Sep-2003
  * - if the environment variable "XSCREENSAVER_WINDOW" is set, use that
  *   as the root window instead of searching for __SWM_VROOT.
+ *
+ * Jamie Zawinski <jwz@jwz.org>, 14-Aug-2004
+ * - changes to get gcc to stop whining about "type punning".
+ *
+ * Jamie Zawinski <jwz@jwz.org>, 16-Dec-2004
+ * - fixed that last fix.
  */
 
 #ifndef _VROOT_H_
  */
 
 #ifndef _VROOT_H_
@@ -68,7 +74,7 @@
 
 #if !defined(lint) && !defined(SABER)
 static const char vroot_rcsid[] =
 
 #if !defined(lint) && !defined(SABER)
 static const char vroot_rcsid[] =
- "#Id: vroot.h,v 1.5 2003/09/04 01:04:38 jwz Exp #" "\n"
+ "#Id: vroot.h,v 1.8 2004/12/16 05:33:54 jwz Exp #" "\n"
  "#Id: vroot.h,v 1.4 1991/09/30 19:23:16 stolcke Exp stolcke #";
 #endif
 
  "#Id: vroot.h,v 1.4 1991/09/30 19:23:16 stolcke Exp stolcke #";
 #endif
 
@@ -124,7 +130,7 @@ VirtualRootWindowOfScreen(screen) Screen *screen;
                                        &nitems, &bytesafter,
                                        &newRoot) == Success
                                    && newRoot) {
                                        &nitems, &bytesafter,
                                        &newRoot) == Success
                                    && newRoot) {
-                                   root = (Window) *newRoot;
+                                   root = *((Window *) newRoot);
                                    break;
                                }
                        }
                                    break;
                                }
                        }
index f3f32e05844bbd6d3661dbd9975115eb01fd92b9..a05601503663f9473927d9a20b791f52ecf00846 100644 (file)
@@ -21,9 +21,7 @@
    needed, anyway.)
 
    If you don't have man pages for this extension, see
    needed, anyway.)
 
    If you don't have man pages for this extension, see
-   http://www.physik.uni-regensburg.de/~scs22156/sofie-0.2/mit-shm.html
-   or in the R6 sources as "xc/doc/specs/Xext/mit-shm.ms", for example,
-   ftp://ftp.x.org/pub/R6.4/xc/doc/specs/Xext/mit-shm.ms
+   http://www.x.org/X11R6.8.1/docs/Xext/
 
    (This document seems not to ever remain available on the web in one place
    for very long; you can search for it by the title, "MIT-SHM -- The MIT
 
    (This document seems not to ever remain available on the web in one place
    for very long; you can search for it by the title, "MIT-SHM -- The MIT
diff --git a/xscreensaver.lsm b/xscreensaver.lsm
deleted file mode 100644 (file)
index 09bbb2a..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-Begin3
-Title:          xscreensaver
-Version:        4.19
-Entered-date:   16DEC04
-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.
-                More than 180 display modes are included in this package.
-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/
-                 xscreensaver-4.19.tar.gz
-                70K   xscreensaver.README
-                1K    xscreensaver.lsm
-Alternate-site: sunsite.unc.edu /pub/Linux/X11/screensavers/
-                 xscreensaver-4.19.tar.gz
-                70K   xscreensaver.README
-                1K    xscreensaver.lsm
-Alternate-site: ftp.x.org /contrib/applications/
-                 xscreensaver-4.19.tar.gz
-                70K   xscreensaver.README
-                1K    xscreensaver.lsm
-Platforms:      Linux, Irix, SunOS, Solaris, HPUX, AIX, FreeBSD, NetBSD,
-                BSDI, SCO, OSF1, Ultrix, VMS.
-                Requires X11 and ANSI C.
-                Works with GTK+, GNOME, and/or Motif.
-                Shadow passwords, Kerberos, and OpenGL optionally supported.
-                Multi-headed machines supported.
-Copying-policy: BSD
-End
diff --git a/xscreensaver.lsm.sh b/xscreensaver.lsm.sh
deleted file mode 100755 (executable)
index 6c42bda..0000000
+++ /dev/null
@@ -1,55 +0,0 @@
-#!/bin/sh
-#
-# generate an lsm file (http://sunsite.unc.edu/pub/Linux/Incoming/LSM-TEMPLATE)
-# that is more-or-less correct for the current version of xscreensaver.
-# jwz, 18-Jan-98
-
-size() {
-    ls -l $* |
-    tail -1 |
-    sed 's/.* \([0-9][0-9][0-9][0-9][0-9]*\) .*/\1/' |
-    sed 's/[0-9][0-9][0-9]$/K/'
-}
-
-VERSION=`sed -n 's/.*\([0-9][0-9]*\.[0-9]*\).*/\1/p' < utils/version.h`
-DATE=`date '+%d%b%y' | tr a-z A-Z`
-
-ADIR=archive/
-TAR_SIZE=`size ${ADIR}xscreensaver-$VERSION.tar.gz`
-README_SIZE=`size README`
-#LSM_SIZE=`size xscreensaver.lsm`
-LSM_SIZE="1K"
-
-echo "Begin3
-Title:          xscreensaver
-Version:        $VERSION
-Entered-date:   $DATE
-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.
-                More than 180 display modes are included in this package.
-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/
-                $TAR_SIZE xscreensaver-$VERSION.tar.gz
-                $README_SIZE   xscreensaver.README
-                $LSM_SIZE    xscreensaver.lsm
-Alternate-site: sunsite.unc.edu /pub/Linux/X11/screensavers/
-                $TAR_SIZE xscreensaver-$VERSION.tar.gz
-                $README_SIZE   xscreensaver.README
-                $LSM_SIZE    xscreensaver.lsm
-Alternate-site: ftp.x.org /contrib/applications/
-                $TAR_SIZE xscreensaver-$VERSION.tar.gz
-                $README_SIZE   xscreensaver.README
-                $LSM_SIZE    xscreensaver.lsm
-Platforms:      Linux, Irix, SunOS, Solaris, HPUX, AIX, FreeBSD, NetBSD,
-                BSDI, SCO, OSF1, Ultrix, VMS.
-                Requires X11 and ANSI C.
-                Works with GTK+, GNOME, and/or Motif.
-                Shadow passwords, Kerberos, and OpenGL optionally supported.
-                Multi-headed machines supported.
-Copying-policy: BSD
-End"
-
-exit 0
index 1ab75e64645a5f34ed05df0d75a2b9bbcbf9acb8..2f95d91f431d3d2a2be64badf4538d5b813da954 100644 (file)
@@ -1,10 +1,9 @@
 %define        name            xscreensaver
 %define        name            xscreensaver
-%define        version         4.19
+%define        version         4.20
 %define        release         1
 %define        epoch           1
 %define        x11_prefix      /usr/X11R6
 %define        gnome_prefix    /usr
 %define        release         1
 %define        epoch           1
 %define        x11_prefix      /usr/X11R6
 %define        gnome_prefix    /usr
-%define        kde_prefix      /usr
 %define gnome_datadir  %{gnome_prefix}/share
 
 # By default, builds the basic, non-GL package.
 %define gnome_datadir  %{gnome_prefix}/share
 
 # By default, builds the basic, non-GL package.
@@ -34,7 +33,7 @@ Buildroot:    %{_tmppath}/%{name}-%{version}-root
 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.
 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.
-More than 180 display modes are included in this package.
+More than 190 display modes are included in this package.
 %{?USE_GL:See also the xscreensaver-gl package, which}
 %{?USE_GL:includes optional OpenGL display modes.}
 
 %{?USE_GL:See also the xscreensaver-gl package, which}
 %{?USE_GL:includes optional OpenGL display modes.}
 
@@ -42,7 +41,7 @@ More than 180 display modes are included in this package.
 Un économiseur d'écran et verrouillage modulaire pour X-Window.
 Hautement configurable: permet l'utilisation de n'importe quel programme
 qui peut dessiner dans la fenêtre root.
 Un économiseur d'écran et verrouillage modulaire pour X-Window.
 Hautement configurable: permet l'utilisation de n'importe quel programme
 qui peut dessiner dans la fenêtre root.
-Plus de 180 modes d'affichage sont inclus dans ce paquet.
+Plus de 190 modes d'affichage sont inclus dans ce paquet.
 %{?USE_GL:Voir aussi le paquet xscreensaver-gl, qui inclut}
 %{?USE_GL:des modules optionnels OpenGL.}
 
 %{?USE_GL:Voir aussi le paquet xscreensaver-gl, qui inclut}
 %{?USE_GL:des modules optionnels OpenGL.}
 
@@ -101,8 +100,6 @@ archdir=`./config.guess`
 # We have to make sure these directories exist,
 # or nothing will be installed into them.
 #
 # We have to make sure these directories exist,
 # or nothing will be installed into them.
 #
-export KDEDIR=%{kde_prefix}
-mkdir -p $RPM_BUILD_ROOT$KDEDIR/bin
 mkdir -p $RPM_BUILD_ROOT%{gnome_datadir}
 mkdir -p $RPM_BUILD_ROOT/etc/pam.d
 
 mkdir -p $RPM_BUILD_ROOT%{gnome_datadir}
 mkdir -p $RPM_BUILD_ROOT/etc/pam.d
 
@@ -127,13 +124,12 @@ list_files() {
 }
 
 # Collect the names of the non-GL executables and scripts...
 }
 
 # Collect the names of the non-GL executables and scripts...
-# (Including the names of all of the Gnome, KDE, and L10N-related files,
+# (Including the names of all of the Gnome and L10N-related files,
 # whereever they might have gotten installed...)
 # For the translation catalogs, prepend an appropriate %lang(..) tag.
 #
 (  cd    hacks ; list_files install ; \
 # whereever they might have gotten installed...)
 # For the translation catalogs, prepend an appropriate %lang(..) tag.
 #
 (  cd    hacks ; list_files install ; \
-   cd ../driver; list_files install-program install-scripts \
-                            install-gnome install-kde ; \
+   cd ../driver; list_files install-program install-scripts install-gnome ; \
  ( cd ../po;     list_files install | grep '\.' \
     | sed 's@^\(.*/\([^/]*\)/LC.*\)$@%lang(\2) \1@' ) \
 ) > $RPM_BUILD_DIR/xscreensaver-%{version}/exes-non-gl
  ( cd ../po;     list_files install | grep '\.' \
     | sed 's@^\(.*/\([^/]*\)/LC.*\)$@%lang(\2) \1@' ) \
 ) > $RPM_BUILD_DIR/xscreensaver-%{version}/exes-non-gl