fixed problem with patches
authortanya <tanyshk@gmail.com>
Mon, 9 Aug 2010 12:35:05 +0000 (15:35 +0300)
committertanya <tanyshk@gmail.com>
Mon, 9 Aug 2010 12:35:05 +0000 (15:35 +0300)
14 files changed:
xscreensaver/debian/patches/10_jwz-xscreensaver-randr-patch-3.patch [deleted file]
xscreensaver/debian/patches/20_hacks_Makefile.patch [deleted file]
xscreensaver/debian/patches/21_driver_xscreensaver-getimage-video [deleted file]
xscreensaver/debian/patches/22_hacks_barcode.patch [deleted file]
xscreensaver/debian/patches/23_hacks_glx_glsnake.patch [deleted file]
xscreensaver/debian/patches/30_hacks_xanalogtv.patch [deleted file]
xscreensaver/debian/patches/31_utils_images_logo-50-bad-xpm.patch [deleted file]
xscreensaver/debian/patches/50_driver_screensaver-properties-desktop.patch [deleted file]
xscreensaver/debian/patches/52_driver_XScreenSaver.ad.in [deleted file]
xscreensaver/debian/patches/53_XScreenSaver.ad.in.patch [deleted file]
xscreensaver/debian/patches/60_add-ant-hack.patch [deleted file]
xscreensaver/debian/patches/70_fix_local_screenlock_bypass.patch [deleted file]
xscreensaver/debian/patches/series [deleted file]
xscreensaver/debian/rules

diff --git a/xscreensaver/debian/patches/10_jwz-xscreensaver-randr-patch-3.patch b/xscreensaver/debian/patches/10_jwz-xscreensaver-randr-patch-3.patch
deleted file mode 100644 (file)
index d2a7010..0000000
+++ /dev/null
@@ -1,4353 +0,0 @@
-# Upstream patch, downloaded from
-# http://www.jwz.org/xscreensaver/xscreensaver-randr-patch-3.txt
-# + fixed typo "screen < real_nscreens" in driver/lock:1527
-# Will probably go upstream with 5.06
-# Fixes a bunch of xrandr/xinerama issues
-
-Please see http://jwz.livejournal.com/908354.html
-
-Apply this patch with:
-
-    cd xscreensaver-5.05
-    patch -p1 < ../xscreensaver-randr-patch-3.txt
-
-Thanks!
-
-Index: xscreensaver/config.h.in
-===================================================================
---- xscreensaver.orig/config.h.in      2008-07-16 23:47:00.000000000 +0200
-+++ xscreensaver/config.h.in   2008-07-17 00:07:00.000000000 +0200
-@@ -234,6 +234,9 @@
-    available if the file /usr/include/X11/extensions/Xrandr.h exists.) */
- #undef HAVE_RANDR
-+/* Define this if the RANDR library is version 1.2 or newer. */
-+#undef HAVE_RANDR_12
-+
- /* Define this if you have the XReadDisplay extension (I think this is an
-    SGI-only thing; it's in <X11/extensions/readdisplay.h>.) A few of the
-    screenhacks will take advantage of this if it's available. */
-Index: xscreensaver/configure
-===================================================================
---- xscreensaver.orig/configure        2008-07-16 23:47:00.000000000 +0200
-+++ xscreensaver/configure     2008-07-17 00:07:00.000000000 +0200
-@@ -2060,6 +2060,9 @@
-+
-+
-+
- # After checking to see that --srcdir is correct (which AC_INIT does)
- # check for some random other files that come later in the tar file,
- # to make sure everything is here.
-@@ -2096,6 +2099,10 @@
-+# Need to disable Objective C extensions in ANSI C on MacOS X to work
-+# around an Apple-specific gcc bug.
-+#
-+
- ###############################################################################
- #
-@@ -2124,18 +2131,6 @@
- ###############################################################################
- #
--#       Function to figure out how to turn off Objective C on MacOS X.
--#       (We have to do this to work around an Apple-specific gcc bug.)
--#
--###############################################################################
--
--
--
--
--
--
--###############################################################################
--#
- #       Function to figure out how to create directory trees.
- #
- ###############################################################################
-@@ -3455,6 +3450,7 @@
-        ac_cv_gcc_accepts_no_overlength=no
-      else
-        ac_cv_gcc_accepts_no_overlength=yes
-+       CC="$CC -Wno-overlength-strings"
-      fi
- fi
- { echo "$as_me:$LINENO: result: $ac_cv_gcc_accepts_no_overlength" >&5
-@@ -3475,6 +3471,7 @@
-        ac_cv_gcc_accepts_no_decl_after=no
-      else
-        ac_cv_gcc_accepts_no_decl_after=yes
-+       CC="$CC -Wdeclaration-after-statement"
-      fi
- fi
- { echo "$as_me:$LINENO: result: $ac_cv_gcc_accepts_no_decl_after" >&5
-@@ -3483,7 +3480,6 @@
-   fi
- if test -n "$GCC"; then
--   if test -n "$GCC"; then
-    { echo "$as_me:$LINENO: checking whether gcc accepts -no-cpp-precomp" >&5
- echo $ECHO_N "checking whether gcc accepts -no-cpp-precomp... $ECHO_C" >&6; }
- if test "${ac_cv_gcc_accepts_no_cpp_precomp+set}" = set; then
-@@ -3496,6 +3492,7 @@
-        ac_cv_gcc_accepts_no_cpp_precomp=no
-      else
-        ac_cv_gcc_accepts_no_cpp_precomp=yes
-+       CC="$CC -no-cpp-precomp"
-      fi
- fi
- { echo "$as_me:$LINENO: result: $ac_cv_gcc_accepts_no_cpp_precomp" >&5
-@@ -3503,13 +3500,6 @@
-    ac_gcc_accepts_no_cpp_precomp="$ac_cv_gcc_accepts_no_cpp_precomp"
-   fi
--   if test "$ac_gcc_accepts_no_cpp_precomp" = yes ; then
--     { echo "$as_me:$LINENO: result: Disabling Objective C extensions in ANSI C code." >&5
--echo "${ECHO_T}Disabling Objective C extensions in ANSI C code." >&6; }
--     CC="$CC -no-cpp-precomp"
--   fi
--  fi
--
- if test -n "$GCC"; then
-    if test -n "$GCC"; then
-    { echo "$as_me:$LINENO: checking whether gcc accepts -std=c89" >&5
-@@ -3524,6 +3514,7 @@
-        ac_cv_gcc_accepts_std=no
-      else
-        ac_cv_gcc_accepts_std=yes
-+       CC="$CC -std=c89"
-      fi
- fi
- { echo "$as_me:$LINENO: result: $ac_cv_gcc_accepts_std" >&5
-@@ -3552,7 +3543,8 @@
-      # before they were in the ANSI C 99 spec...  (gcc 2.96 permits //
-      # with -std=gnu89 but not with -std=c89.)
-      #
--     CC="$CC -std=c89 -U__STRICT_ANSI__"
-+     # $CC already contains "-std=c89" via AC_GCC_ACCEPTS_STD
-+     CC="$CC -U__STRICT_ANSI__"
-    else
-      # The old way:
-      CC="$CC -Wp,-lang-c89"
-@@ -12140,7 +12132,7 @@
- if test "$with_randr" = yes; then
--  # first check for Randr.h
-+  # first check for Xrandr.h
-   ac_save_CPPFLAGS="$CPPFLAGS"
-   if test \! -z "$includedir" ; then
-@@ -12489,7 +12481,103 @@
- #define HAVE_RANDR 1
- _ACEOF
-+
-+    # Now check for version 1.2 in the same libs.
-+
-+  ac_save_CPPFLAGS="$CPPFLAGS"
-+  ac_save_LDFLAGS="$LDFLAGS"
-+#  ac_save_LIBS="$LIBS"
-+
-+  if test \! -z "$includedir" ; then
-+    CPPFLAGS="$CPPFLAGS -I$includedir"
-+  fi
-+  # note: $X_CFLAGS includes $x_includes
-+  CPPFLAGS="$CPPFLAGS $X_CFLAGS"
-+
-+  if test \! -z "$libdir" ; then
-+    LDFLAGS="$LDFLAGS -L$libdir"
-   fi
-+  # note: $X_LIBS includes $x_libraries
-+  LDFLAGS="$LDFLAGS $X_LIBS $X_EXTRA_LIBS"
-+
-+  CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS`
-+  LDFLAGS=`eval eval eval eval eval eval eval eval eval echo $LDFLAGS`
-+  { echo "$as_me:$LINENO: checking for XRRGetOutputInfo in -lc" >&5
-+echo $ECHO_N "checking for XRRGetOutputInfo in -lc... $ECHO_C" >&6; }
-+if test "${ac_cv_lib_c_XRRGetOutputInfo+set}" = set; then
-+  echo $ECHO_N "(cached) $ECHO_C" >&6
-+else
-+  ac_check_lib_save_LIBS=$LIBS
-+LIBS="-lc $SAVER_LIBS $LIBS"
-+cat >conftest.$ac_ext <<_ACEOF
-+/* confdefs.h.  */
-+_ACEOF
-+cat confdefs.h >>conftest.$ac_ext
-+cat >>conftest.$ac_ext <<_ACEOF
-+/* end confdefs.h.  */
-+
-+/* Override any GCC internal prototype to avoid an error.
-+   Use char because int might match the return type of a GCC
-+   builtin and then its argument prototype would still apply.  */
-+#ifdef __cplusplus
-+extern "C"
-+#endif
-+char XRRGetOutputInfo ();
-+int
-+main ()
-+{
-+return XRRGetOutputInfo ();
-+  ;
-+  return 0;
-+}
-+_ACEOF
-+rm -rf conftest.$ac_objext conftest$ac_exeext
-+if { (ac_try="$ac_link"
-+case "(($ac_try" in
-+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-+  *) ac_try_echo=$ac_try;;
-+esac
-+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
-+  (eval "$ac_link") 2>conftest.er1
-+  ac_status=$?
-+  grep -v '^ *+' conftest.er1 >conftest.err
-+  rm -rf conftest.er1
-+  cat conftest.err >&5
-+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-+  (exit $ac_status); } && {
-+       test -z "$ac_c_werror_flag" ||
-+       test ! -s conftest.err
-+       } && test -s conftest$ac_exeext &&
-+       $as_test_x conftest$ac_exeext; then
-+  ac_cv_lib_c_XRRGetOutputInfo=yes
-+else
-+  echo "$as_me: failed program was:" >&5
-+sed 's/^/| /' conftest.$ac_ext >&5
-+
-+      ac_cv_lib_c_XRRGetOutputInfo=no
-+fi
-+
-+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
-+      conftest$ac_exeext conftest.$ac_ext
-+LIBS=$ac_check_lib_save_LIBS
-+fi
-+{ echo "$as_me:$LINENO: result: $ac_cv_lib_c_XRRGetOutputInfo" >&5
-+echo "${ECHO_T}$ac_cv_lib_c_XRRGetOutputInfo" >&6; }
-+if test $ac_cv_lib_c_XRRGetOutputInfo = yes; then
-+  cat >>confdefs.h <<\_ACEOF
-+#define HAVE_RANDR_12 1
-+_ACEOF
-+
-+else
-+  true
-+fi
-+
-+  CPPFLAGS="$ac_save_CPPFLAGS"
-+  LDFLAGS="$ac_save_LDFLAGS"
-+#  LIBS="$ac_save_LIBS"
-+
-+  fi
-+
- elif test "$with_randr" != no; then
-   echo "error: must be yes or no: --with-randr-ext=$with_randr"
-@@ -16673,7 +16761,7 @@
-   echo $ECHO_N "(cached) $ECHO_C" >&6
- else
-   cat > conftest.$ac_ext <<EOF
--#line 16680 "configure"
-+#line 16768 "configure"
- #include "confdefs.h"
- #include <GL/gl.h>
- #ifndef MESA_MAJOR_VERSION
-@@ -19890,9 +19978,11 @@
-     #### Could use some more defaults here...
-     for f in \
--      "/usr/X11R6/lib/X11/doc/README"         \
--      "/usr/share/doc/xserver-common/copyright"       \
--      "/usr/X11R6/README"                     \
-+      "/usr/X11R6/lib/X11/doc/README"            \
-+      "/usr/share/doc/xserver-common/copyright"          \
-+      "/usr/share/doc/xserver-xorg-core/copyright" \
-+      "/usr/X11R6/README"                        \
-+      "/usr/share/doc/debian/debian-manifesto"     \
-     ; do
-       if test -z "$with_textfile"; then
-         { echo "$as_me:$LINENO: checking for text file $f" >&5
-@@ -21883,8 +21973,9 @@
-   pgl="$preferred_mesagl"
-   if test "$ac_mesagl_version" = unknown; then
--    warnL "Unable to determine the MesaGL version number!"
--    warn2 "Make sure you are using version $preferred_mesagl or newer."
-+    true
-+    # warnL "Unable to determine the MesaGL version number!"
-+    # warn2 "Make sure you are using version $preferred_mesagl or newer."
-   elif test \! "$ac_mesagl_version" -gt 2006; then
-     warnL "MesaGL version number is $mgv --"
-@@ -22035,7 +22126,7 @@
-   if test \! -z "$rpmv" ; then
-     rpmbdir=`rpm -ql $rpmnames | sed -n 's@^\(.*\)/xscreensaver-demo$@\1@p'`
--    rpmhdir=`rpm -ql $rpmnames | sed -n 's@^\(.*\)/attraction$@\1@p'`
-+    rpmhdir=`rpm -ql $rpmnames | sed -n 's@^\(.*\)/popsquares$@\1@p'`
-     warning=no
-     warnL "There is already an installed RPM of xscreensaver $rpmv"
-@@ -22058,6 +22149,31 @@
-   fi
- fi
-+# Also warn if there's a Debian package installed.
-+#
-+debnames="xscreensaver xscreensaver-data xscreensaver-data-extra"
-+debv=''
-+for dpkg in $debnames ; do
-+  if test -z "$debv"; then
-+    debv=`dpkg -s $dpkg 2>/dev/null | sed -n 's/^Version: \(.*\)$/\1/p'`
-+  fi
-+done
-+
-+if test \! -z "$debv" ; then
-+  debbdir=`dpkg -L $debnames 2>/dev/null | \
-+            sed -n 's@^\(.*/bin\)/xscreensaver$@\1@p'`
-+  debhdir=`dpkg -L $debnames 2>/dev/null | \
-+            sed -n 's@^\(.*\)/popsquares$@\1@p'`
-+
-+  warning=no
-+  warnL "There is already an installed dpkg of xscreensaver"
-+  warn2 "version \"$debv\" on this system."
-+  echo ""
-+  warn2 "The dpkg was installed in $debbdir/,"
-+  warn2 "with demos in $debhdir/."
-+fi
-+
-+
- if test "${bindir}" = "${HACKDIR}" ; then
-   do_dir_warning=yes
- fi
-Index: xscreensaver/configure.in
-===================================================================
---- xscreensaver.orig/configure.in     2008-07-16 23:47:00.000000000 +0200
-+++ xscreensaver/configure.in  2008-07-17 00:07:00.000000000 +0200
-@@ -106,6 +106,9 @@
-           possibly elsewhere.  (It's available if the file
-           /usr/include/X11/extensions/Xrandr.h exists.)])
-+AH_TEMPLATE([HAVE_RANDR_12],
-+          [Define this if the RANDR library is version 1.2 or newer.])
-+
- AH_TEMPLATE([HAVE_PROC_INTERRUPTS],
-           [Define this if you have a Linux-like /proc/interrupts file which
-           can be examined to determine when keyboard activity has
-@@ -389,6 +392,7 @@
-        ac_cv_gcc_accepts_[$1]=no
-      else
-        ac_cv_gcc_accepts_[$1]=yes
-+       CC="$CC [$2]"
-      fi])
-    ac_gcc_accepts_[$1]="$ac_cv_gcc_accepts_[$1]"
-   fi
-@@ -400,6 +404,11 @@
- AC_DEFUN(AC_NO_MISPLACED_DECLARATIONS,
-          [AC_CHECK_GCC_ARG(no_decl_after, -Wdeclaration-after-statement)])
-+# Need to disable Objective C extensions in ANSI C on MacOS X to work
-+# around an Apple-specific gcc bug.
-+#
-+AC_DEFUN(AC_NO_OBJECTIVE_C,
-+         [AC_CHECK_GCC_ARG(no_cpp_precomp, -no-cpp-precomp)])
- ###############################################################################
- #
-@@ -447,7 +456,8 @@
-      # before they were in the ANSI C 99 spec...  (gcc 2.96 permits //
-      # with -std=gnu89 but not with -std=c89.)
-      #
--     CC="$CC -std=c89 -U__STRICT_ANSI__"
-+     # $CC already contains "-std=c89" via AC_GCC_ACCEPTS_STD
-+     CC="$CC -U__STRICT_ANSI__"
-    else
-      # The old way:
-      CC="$CC -Wp,-lang-c89"
-@@ -458,27 +468,6 @@
- ###############################################################################
- #
--#       Function to figure out how to turn off Objective C on MacOS X.
--#       (We have to do this to work around an Apple-specific gcc bug.)
--#
--###############################################################################
--
--AC_DEFUN(AC_GCC_ACCEPTS_NO_CPP_PRECOMP,
--         [AC_CHECK_GCC_ARG(no_cpp_precomp, -no-cpp-precomp)])
--
--AC_DEFUN(AC_NO_OBJECTIVE_C,
-- [if test -n "$GCC"; then
--   AC_GCC_ACCEPTS_NO_CPP_PRECOMP
--   if test "$ac_gcc_accepts_no_cpp_precomp" = yes ; then
--     AC_MSG_RESULT(Disabling Objective C extensions in ANSI C code.)
--     CC="$CC -no-cpp-precomp"
--   fi
--  fi
--])
--
--
--###############################################################################
--#
- #       Function to figure out how to create directory trees.
- #
- ###############################################################################
-@@ -1667,7 +1656,7 @@
- if test "$with_randr" = yes; then
--  # first check for Randr.h
-+  # first check for Xrandr.h
-   AC_CHECK_X_HEADER(X11/extensions/Xrandr.h, [have_randr=yes],,
-                     [#include <X11/Xlib.h>])
-@@ -1696,8 +1685,13 @@
-   # if that succeeded, then we've really got it.
-   if test "$have_randr" = yes; then
-     AC_DEFINE(HAVE_RANDR)
-+
-+    # Now check for version 1.2 in the same libs.
-+    AC_CHECK_X_LIB(c, XRRGetOutputInfo, [AC_DEFINE(HAVE_RANDR_12)],
-+                   [true], $SAVER_LIBS)
-   fi
-+
- elif test "$with_randr" != no; then
-   echo "error: must be yes or no: --with-randr-ext=$with_randr"
-   exit 1
-@@ -3414,9 +3408,11 @@
-     #### Could use some more defaults here...
-     for f in \
--      "/usr/X11R6/lib/X11/doc/README"         \
--      "/usr/share/doc/xserver-common/copyright"       \
--      "/usr/X11R6/README"                     \
-+      "/usr/X11R6/lib/X11/doc/README"            \
-+      "/usr/share/doc/xserver-common/copyright"          \
-+      "/usr/share/doc/xserver-xorg-core/copyright" \
-+      "/usr/X11R6/README"                        \
-+      "/usr/share/doc/debian/debian-manifesto"     \
-     ; do
-       if test -z "$with_textfile"; then
-         AC_MSG_CHECKING([for text file $f])
-@@ -4035,8 +4031,9 @@
-   pgl="$preferred_mesagl"
-   if test "$ac_mesagl_version" = unknown; then
--    warnL "Unable to determine the MesaGL version number!"
--    warn2 "Make sure you are using version $preferred_mesagl or newer."
-+    true
-+    # warnL "Unable to determine the MesaGL version number!"
-+    # warn2 "Make sure you are using version $preferred_mesagl or newer."
-   elif test \! "$ac_mesagl_version" -gt 2006; then
-     warnL "MesaGL version number is $mgv --"
-@@ -4182,7 +4179,7 @@
-   if test \! -z "$rpmv" ; then
-     rpmbdir=`rpm -ql $rpmnames | sed -n 's@^\(.*\)/xscreensaver-demo$@\1@p'`
--    rpmhdir=`rpm -ql $rpmnames | sed -n 's@^\(.*\)/attraction$@\1@p'`
-+    rpmhdir=`rpm -ql $rpmnames | sed -n 's@^\(.*\)/popsquares$@\1@p'`
-     warning=no
-     warnL "There is already an installed RPM of xscreensaver $rpmv"
-@@ -4205,6 +4202,31 @@
-   fi
- fi
-+# Also warn if there's a Debian package installed.
-+#
-+debnames="xscreensaver xscreensaver-data xscreensaver-data-extra"
-+debv=''
-+for dpkg in $debnames ; do
-+  if test -z "$debv"; then
-+    debv=`dpkg -s $dpkg 2>/dev/null | sed -n 's/^Version: \(.*\)$/\1/p'`
-+  fi
-+done
-+
-+if test \! -z "$debv" ; then
-+  debbdir=`dpkg -L $debnames 2>/dev/null | \
-+            sed -n 's@^\(.*/bin\)/xscreensaver$@\1@p'`
-+  debhdir=`dpkg -L $debnames 2>/dev/null | \
-+            sed -n 's@^\(.*\)/popsquares$@\1@p'`
-+
-+  warning=no
-+  warnL "There is already an installed dpkg of xscreensaver"
-+  warn2 "version \"$debv\" on this system."
-+  echo ""
-+  warn2 "The dpkg was installed in $debbdir/,"
-+  warn2 "with demos in $debhdir/."
-+fi
-+
-+
- if test "${bindir}" = "${HACKDIR}" ; then
-   do_dir_warning=yes
- fi
-Index: xscreensaver/driver/Makefile.in
-===================================================================
---- xscreensaver.orig/driver/Makefile.in       2008-07-16 23:47:00.000000000 +0200
-+++ xscreensaver/driver/Makefile.in    2008-07-17 00:07:00.000000000 +0200
-@@ -116,10 +116,10 @@
- TEST_SRCS     = test-passwd.c test-uid.c  test-xdpms.c    test-grab.c \
-                 test-apm.c    test-fade.c test-xinerama.c test-vp.c   \
--                test-randr.c  xdpyinfo.c  test-mlstring.c
-+                test-randr.c  xdpyinfo.c  test-mlstring.c test-screens.c
- TEST_EXES     = test-passwd   test-uid    test-xdpms      test-grab   \
-                 test-apm      test-fade   test-xinerama   test-vp     \
--                test-randr    xdpyinfo    test-mlstring
-+                test-randr    xdpyinfo    test-mlstring   test-screens
- MOTIF_LIBS    = @MOTIF_LIBS@ @XPM_LIBS@ $(XMU_LIBS)
- GTK_LIBS      = @GTK_LIBS@ $(XMU_LIBS)
-@@ -147,9 +147,9 @@
- GTK_ICONS     = $(ICON_SRC)/screensaver-*.png
- DEMO_UTIL_SRCS        = $(UTILS_SRC)/resources.c $(UTILS_SRC)/usleep.c \
--                $(UTILS_SRC)/visual.c
-+                $(UTILS_SRC)/visual.c $(XMU_SRCS)
- DEMO_UTIL_OBJS        = $(UTILS_BIN)/resources.o $(UTILS_BIN)/usleep.o \
--                $(UTILS_BIN)/visual.o
-+                $(UTILS_BIN)/visual.o $(XMU_OBJS)
- SAVER_UTIL_SRCS       = $(UTILS_SRC)/fade.c $(UTILS_SRC)/overlay.c \
-                 $(UTILS_SRC)/logo.c $(UTILS_SRC)/yarandom.c \
-@@ -179,24 +179,24 @@
-                 $(UTILS_BIN)/logo.o $(UTILS_BIN)/minixpm.o prefs.o \
-                 $(XMU_OBJS)
--SAVER_SRCS_1  = xscreensaver.c windows.c timers.c subprocs.c exec.c \
--                xset.c splash.c setuid.c stderr.c mlstring.c
--SAVER_OBJS_1  = xscreensaver.o windows.o timers.o subprocs.o exec.o \
--                xset.o splash.o setuid.o stderr.o mlstring.o
-+SAVER_SRCS_1  = xscreensaver.c windows.c screens.c timers.c subprocs.c \
-+                exec.c xset.c splash.c setuid.c stderr.c mlstring.c
-+SAVER_OBJS_1  = xscreensaver.o windows.o screens.o timers.o subprocs.o \
-+                exec.o xset.o splash.o setuid.o stderr.o mlstring.o
- SAVER_SRCS    = $(SAVER_SRCS_1) prefs.c dpms.c $(LOCK_SRCS) \
--                $(SAVER_UTIL_SRCS) $(GL_SRCS) $(XMU_SRCS)
-+                $(SAVER_UTIL_SRCS) $(GL_SRCS)
- SAVER_OBJS    = $(SAVER_OBJS_1) prefs.o dpms.o $(LOCK_OBJS) \
--                $(SAVER_UTIL_OBJS) $(GL_OBJS) $(XMU_OBJS)
-+                $(SAVER_UTIL_OBJS) $(GL_OBJS)
- CMD_SRCS      = remote.c xscreensaver-command.c
- CMD_OBJS      = remote.o xscreensaver-command.o
--DEMO_SRCS_1   = prefs.c dpms.c $(XMU_SRCS)
--DEMO_OBJS_1   = prefs.o dpms.o $(XMU_OBJS)
-+DEMO_SRCS_1   = prefs.c dpms.c
-+DEMO_OBJS_1   = prefs.o dpms.o
--DEMO_SRCS     = prefs.c dpms.c remote.c exec.c $(DEMO_UTIL_SRCS)
--DEMO_OBJS     = prefs.o dpms.o remote.o exec.o $(DEMO_UTIL_OBJS)
-+DEMO_SRCS     = $(DEMO_SRCS_1) remote.c exec.c $(DEMO_UTIL_SRCS)
-+DEMO_OBJS     = $(DEMO_OBJS_1) remote.o exec.o $(DEMO_UTIL_OBJS)
- PDF2JPEG_SRCS = pdf2jpeg.m
- PDF2JPEG_OBJS = pdf2jpeg.o
-@@ -453,7 +453,7 @@
-  $$e "  ####################################################################";\
-  $$e ""                                                                            ;\
-         fi ;                                                          \
--      elif [ -f $$conf ]; then                                        \
-+      elif [ -f $$conf -a "x$$dest" != "x" ]; then                    \
-         if ( grep $$dest $$conf >/dev/null ); then                    \
-          echo "$$conf unchanged: already has an entry for $$dest" ;   \
-         else                                                          \
-@@ -498,7 +498,7 @@
-            echo $(INSTALL_DIRS) "$(install_prefix)$(GTK_APPDIR)"           ;\
-                 $(INSTALL_DIRS) "$(install_prefix)$(GTK_APPDIR)"           ;\
-          fi                                                                ;\
--         name2=gnome-screensaver-properties.desktop                        ;\
-+         name2=xscreensaver-properties.desktop                             ;\
-          echo $(INSTALL_DATA) screensaver-properties.desktop                \
-                 $(install_prefix)$(GTK_APPDIR)/$$name2                     ;\
-               $(INSTALL_DATA) screensaver-properties.desktop                \
-@@ -571,7 +571,7 @@
- # into /usr/share/applications/
- uninstall-gnome::
-       @if [ "$(GTK_DATADIR)" != "" ]; then                                  \
--          f=gnome-screensaver-properties.desktop                             ;\
-+          f=xscreensaver-properties.desktop                                  ;\
-           echo rm -f $(install_prefix)$(GTK_APPDIR)/$$f                      ;\
-                rm -f $(install_prefix)$(GTK_APPDIR)/$$f                      ;\
-         fi
-@@ -846,6 +846,11 @@
- test-fade: test-fade.o $(UTILS_BIN)/fade.o
-       $(CC) $(LDFLAGS) -o $@ $(TEST_FADE_OBJS) $(SAVER_LIBS)
-+TEST_SCREENS_OBJS = test-screens.o $(DEMO_UTIL_OBJS)
-+test-screens.o: screens.c
-+test-screens: test-screens.o
-+      $(CC) $(LDFLAGS) -o $@ $(TEST_SCREENS_OBJS) $(SAVER_LIBS)
-+
- xdpyinfo.o: xdpyinfo.c
-       $(CC) -c $(INCLUDES) -DHAVE_GLX $(CFLAGS) $(X_CFLAGS) \
-@@ -913,6 +918,11 @@
- prefs.o: $(UTILS_SRC)/resources.h
- remote.o: ../config.h
- remote.o: $(srcdir)/remote.h
-+screens.o: ../config.h
-+screens.o: $(srcdir)/prefs.h
-+screens.o: $(srcdir)/types.h
-+screens.o: $(UTILS_SRC)/visual.h
-+screens.o: $(srcdir)/xscreensaver.h
- setuid.o: ../config.h
- setuid.o: $(srcdir)/prefs.h
- setuid.o: $(srcdir)/types.h
-@@ -954,6 +964,12 @@
- test-passwd.o: $(UTILS_SRC)/visual.h
- test-passwd.o: $(srcdir)/xscreensaver.h
- test-randr.o: ../config.h
-+test-screens.o: ../config.h
-+test-screens.o: $(srcdir)/prefs.h
-+test-screens.o: $(srcdir)/screens.c
-+test-screens.o: $(srcdir)/types.h
-+test-screens.o: $(UTILS_SRC)/visual.h
-+test-screens.o: $(srcdir)/xscreensaver.h
- test-uid.o: ../config.h
- test-vp.o: ../config.h
- test-xdpms.o: ../config.h
-Index: xscreensaver/driver/XScreenSaver.ad.in
-===================================================================
---- xscreensaver.orig/driver/XScreenSaver.ad.in        2008-07-16 23:47:00.000000000 +0200
-+++ xscreensaver/driver/XScreenSaver.ad.in     2008-07-17 00:07:00.000000000 +0200
-@@ -4,8 +4,8 @@
- !            a screen saver and locker for the X window system
- !                            by Jamie Zawinski
- !
--!                              version 5.05
--!                              01-Mar-2008
-+!                              version 5.06
-+!                              05-Jul-2008
- !
- ! See "man xscreensaver" for more info.  The latest version is always
- ! available at http://www.jwz.org/xscreensaver/
-@@ -125,7 +125,8 @@
- ! This command is executed by the "New Login" button on the lock dialog.
--! (That button does not appear if this program does not exist.)
-+! (That button does not appear on the dialog if this program does not exist.)
-+! For Gnome: probably "gdmflexiserver -ls".  KDE, probably "kdmctl reserve".
- !
- @NEW_LOGIN_COMMAND_P@*newLoginCommand:        @NEW_LOGIN_COMMAND@
-Index: xscreensaver/driver/demo-Gtk.c
-===================================================================
---- xscreensaver.orig/driver/demo-Gtk.c        2008-07-16 23:47:00.000000000 +0200
-+++ xscreensaver/driver/demo-Gtk.c     2008-07-17 00:07:00.000000000 +0200
-@@ -272,6 +272,9 @@
- void settings_cancel_cb (GtkButton *, gpointer user_data);
- void settings_ok_cb (GtkButton *, gpointer user_data);
-+static void kill_gnome_screensaver (void);
-+static void kill_kde_screensaver (void);
-+
\f
- /* Some random utility functions
-  */
-@@ -482,9 +485,23 @@
-   warning_dialog_dismiss_cb (widget, user_data);
- }
-+static void warning_dialog_killg_cb (GtkWidget *widget, gpointer user_data)
-+{
-+  kill_gnome_screensaver ();
-+  warning_dialog_dismiss_cb (widget, user_data);
-+}
-+
-+static void warning_dialog_killk_cb (GtkWidget *widget, gpointer user_data)
-+{
-+  kill_kde_screensaver ();
-+  warning_dialog_dismiss_cb (widget, user_data);
-+}
-+
-+typedef enum { D_NONE, D_LAUNCH, D_GNOME, D_KDE } dialog_button;
-+
- static void
- warning_dialog (GtkWidget *parent, const char *message,
--                Boolean restart_button_p, int center)
-+                dialog_button button_type, int center)
- {
-   char *msg = strdup (message);
-   char *head;
-@@ -557,7 +574,7 @@
-                       label, TRUE, TRUE, 0);
- #ifdef HAVE_GTK2
--  if (restart_button_p)
-+  if (button_type != D_NONE)
-     {
-       cancel = gtk_button_new_from_stock (GTK_STOCK_CANCEL);
-       gtk_container_add (GTK_CONTAINER (label), cancel);
-@@ -571,7 +588,7 @@
-   ok = gtk_button_new_with_label ("OK");
-   gtk_container_add (GTK_CONTAINER (label), ok);
--  if (restart_button_p)
-+  if (button_type != D_NONE)
-     {
-       cancel = gtk_button_new_with_label ("Cancel");
-       gtk_container_add (GTK_CONTAINER (label), cancel);
-@@ -582,22 +599,28 @@
-   gtk_window_set_position (GTK_WINDOW (dialog), GTK_WIN_POS_CENTER);
-   gtk_container_set_border_width (GTK_CONTAINER (dialog), 10);
-   gtk_window_set_title (GTK_WINDOW (dialog), progclass);
--  STFU GTK_WIDGET_SET_FLAGS (ok, GTK_CAN_DEFAULT);
-+  GTK_WIDGET_SET_FLAGS (ok, GTK_CAN_DEFAULT);
-   gtk_widget_show (ok);
-   gtk_widget_grab_focus (ok);
-   if (cancel)
-     {
--      STFU GTK_WIDGET_SET_FLAGS (cancel, GTK_CAN_DEFAULT); 
-+      GTK_WIDGET_SET_FLAGS (cancel, GTK_CAN_DEFAULT); 
-       gtk_widget_show (cancel);
-     }
-   gtk_widget_show (label);
-   gtk_widget_show (dialog);
--  if (restart_button_p)
-+  if (button_type != D_NONE)
-     {
--      gtk_signal_connect_object (GTK_OBJECT (ok), "clicked",
--                                 GTK_SIGNAL_FUNC (warning_dialog_restart_cb),
-+      GtkSignalFunc fn;
-+      switch (button_type) {
-+      case D_LAUNCH: fn = GTK_SIGNAL_FUNC (warning_dialog_restart_cb); break;
-+      case D_GNOME:  fn = GTK_SIGNAL_FUNC (warning_dialog_killg_cb);   break;
-+      case D_KDE:    fn = GTK_SIGNAL_FUNC (warning_dialog_killk_cb);   break;
-+      default: abort(); break;
-+      }
-+      gtk_signal_connect_object (GTK_OBJECT (ok), "clicked", fn, 
-                                  (gpointer) dialog);
-       gtk_signal_connect_object (GTK_OBJECT (cancel), "clicked",
-                                  GTK_SIGNAL_FUNC (warning_dialog_dismiss_cb),
-@@ -644,7 +667,7 @@
-         sprintf (buf, "Error:\n\n%s", err);
-       else
-         strcpy (buf, "Unknown error!");
--      warning_dialog (s->toplevel_widget, buf, False, 100);
-+      warning_dialog (s->toplevel_widget, buf, D_NONE, 100);
-     }
-   if (err) free (err);
-@@ -685,7 +708,7 @@
-                 sprintf (buf, "Error:\n\n%s", err);
-               else
-                 strcpy (buf, "Unknown error!");
--              warning_dialog (s->toplevel_widget, buf, False, 100);
-+              warning_dialog (s->toplevel_widget, buf, D_NONE, 100);
-             }
-         }
-       else
-@@ -700,7 +723,7 @@
-                      "The XScreenSaver daemon doesn't seem to be running\n"
-                      "on display \"%s\".  Launch it now?"),
-                    d);
--          warning_dialog (s->toplevel_widget, msg, True, 1);
-+          warning_dialog (s->toplevel_widget, msg, D_LAUNCH, 1);
-         }
-     }
-@@ -875,7 +898,7 @@
-     {
-       warning_dialog (s->toplevel_widget,
-                       _("Error:\n\n"
--                      "No Help URL has been specified.\n"), False, 100);
-+                      "No Help URL has been specified.\n"), D_NONE, 100);
-       return;
-     }
-@@ -1001,7 +1024,7 @@
-       else
-         strcat (buf, _("Please check your $PATH and permissions."));
--      warning_dialog (s->toplevel_widget, buf, False, 1);
-+      warning_dialog (s->toplevel_widget, buf, D_NONE, 1);
-     }
-   force_dialog_repaint (s);
-@@ -1038,12 +1061,12 @@
-       if (!f || !*f)
-         warning_dialog (s->toplevel_widget,
-                         _("Error:\n\nCouldn't determine init file name!\n"),
--                        False, 100);
-+                        D_NONE, 100);
-       else
-         {
-           char *b = (char *) malloc (strlen(f) + 1024);
-           sprintf (b, _("Error:\n\nCouldn't write %s\n"), f);
--          warning_dialog (s->toplevel_widget, b, False, 100);
-+          warning_dialog (s->toplevel_widget, b, D_NONE, 100);
-           free (b);
-         }
-       return -1;
-@@ -1106,7 +1129,7 @@
-     {
-       warning_dialog (GTK_WIDGET (button),
-                       _("Error:\n\nno `manualCommand' resource set."),
--                      False, 100);
-+                      D_NONE, 100);
-     }
-   free (oname);
-@@ -1291,7 +1314,7 @@
-                  _("Error:\n\n"
-                    "Unparsable time format: \"%s\"\n"),
-                  line);
--        warning_dialog (s->toplevel_widget, b, False, 100);
-+        warning_dialog (s->toplevel_widget, b, D_NONE, 100);
-       }
-       else
-       *store = value;
-@@ -1537,7 +1560,7 @@
-       char b[255];
-       sprintf (b, "Error:\n\n" "Directory does not exist: \"%s\"\n",
-                p2->image_directory);
--      warning_dialog (s->toplevel_widget, b, False, 100);
-+      warning_dialog (s->toplevel_widget, b, D_NONE, 100);
-     }
-@@ -1808,7 +1831,7 @@
-   char *str;
-   int list_elt;
--  STFU g_return_if_fail (!gdk_pointer_is_grabbed ());
-+  g_return_if_fail (!gdk_pointer_is_grabbed ());
-   str = gtk_tree_path_to_string (path);
-   list_elt = strtol (str, NULL, 10);
-@@ -1996,7 +2019,7 @@
-     {
-       char b[255];
-       sprintf (b, _("Error:\n\n" "Directory does not exist: \"%s\"\n"), path);
--      warning_dialog (GTK_WIDGET (top), b, False, 100);
-+      warning_dialog (GTK_WIDGET (top), b, D_NONE, 100);
-       return;
-     }
-@@ -2026,7 +2049,7 @@
-     {
-       char b[255];
-       sprintf (b, _("Error:\n\n" "File does not exist: \"%s\"\n"), path);
--      warning_dialog (GTK_WIDGET (top), b, False, 100);
-+      warning_dialog (GTK_WIDGET (top), b, D_NONE, 100);
-       return;
-     }
-@@ -2057,7 +2080,7 @@
-     {
-       char b[255];
-       sprintf (b, _("Error:\n\n" "File does not exist: \"%s\"\n"), path);
--      warning_dialog (GTK_WIDGET (top), b, False, 100);
-+      warning_dialog (GTK_WIDGET (top), b, D_NONE, 100);
-       return;
-     }
- # endif
-@@ -3414,7 +3437,7 @@
-                _("Warning:\n\n"
-                "file \"%s\" has changed, reloading.\n"),
-                f);
--      warning_dialog (s->toplevel_widget, b, False, 100);
-+      warning_dialog (s->toplevel_widget, b, D_NONE, 100);
-       free (b);
-       load_init_file (dpy, p);
-@@ -4247,6 +4270,77 @@
- #endif
-+static Window
-+gnome_screensaver_window (Screen *screen)
-+{
-+  Display *dpy = DisplayOfScreen (screen);
-+  Window root = RootWindowOfScreen (screen);
-+  Window parent, *kids;
-+  unsigned int nkids;
-+  Window gnome_window = 0;
-+  int i;
-+
-+  if (! XQueryTree (dpy, root, &root, &parent, &kids, &nkids))
-+    abort ();
-+  for (i = 0; i < nkids; i++)
-+    {
-+      Atom type;
-+      int format;
-+      unsigned long nitems, bytesafter;
-+      unsigned char *name;
-+      if (XGetWindowProperty (dpy, kids[i], XA_WM_COMMAND, 0, 128,
-+                              False, XA_STRING, &type, &format, &nitems,
-+                              &bytesafter, &name)
-+          == Success
-+          && type != None
-+          && !strcmp ((char *) name, "gnome-screensaver"))
-+      {
-+        gnome_window = kids[i];
-+          break;
-+      }
-+    }
-+
-+  if (kids) XFree ((char *) kids);
-+  return gnome_window;
-+}
-+
-+static Bool
-+gnome_screensaver_active_p (void)
-+{
-+  Display *dpy = GDK_DISPLAY();
-+  Window w = gnome_screensaver_window (DefaultScreenOfDisplay (dpy));
-+  return (w ? True : False);
-+}
-+
-+static void
-+kill_gnome_screensaver (void)
-+{
-+  Display *dpy = GDK_DISPLAY();
-+  Window w = gnome_screensaver_window (DefaultScreenOfDisplay (dpy));
-+  if (w) XKillClient (dpy, (XID) w);
-+}
-+
-+static Bool
-+kde_screensaver_active_p (void)
-+{
-+  FILE *p = popen ("dcop kdesktop KScreensaverIface isEnabled 2>/dev/null",
-+                   "r");
-+  char buf[255];
-+  fgets (buf, sizeof(buf)-1, p);
-+  pclose (p);
-+  if (!strcmp (buf, "true\n"))
-+    return True;
-+  else
-+    return False;
-+}
-+
-+static void
-+kill_kde_screensaver (void)
-+{
-+  system ("dcop kdesktop KScreensaverIface enable false");
-+}
-+
-+
- static void
- the_network_is_not_the_computer (state *s)
- {
-@@ -4360,12 +4454,36 @@
-   if (*msg)
--    warning_dialog (s->toplevel_widget, msg, True, 1);
-+    warning_dialog (s->toplevel_widget, msg, D_LAUNCH, 1);
-   if (rversion) free (rversion);
-   if (ruser) free (ruser);
-   if (rhost) free (rhost);
-   free (msg);
-+  msg = 0;
-+
-+  /* Note: since these dialogs are not modal, they will stack up.
-+     So we do this check *after* popping up the "xscreensaver is not
-+     running" dialog so that these are on top.  Good enough.
-+   */
-+
-+  if (gnome_screensaver_active_p ())
-+    warning_dialog (s->toplevel_widget,
-+                    _("Warning:\n\n"
-+                      "The GNOME screensaver daemon appears to be running.\n"
-+                      "It must be stopped for XScreenSaver to work properly.\n"
-+                      "\n"
-+                      "Stop the GNOME screen saver daemon now?\n"),
-+                    D_GNOME, 1);
-+
-+  if (kde_screensaver_active_p ())
-+    warning_dialog (s->toplevel_widget,
-+                    _("Warning:\n\n"
-+                      "The KDE screen saver daemon appears to be running.\n"
-+                      "It must be stopped for XScreenSaver to work properly.\n"
-+                      "\n"
-+                      "Stop the KDE screen saver daemon now?\n"),
-+                    D_KDE, 1);
- }
-Index: xscreensaver/driver/exec.c
-===================================================================
---- xscreensaver.orig/driver/exec.c    2008-07-16 23:47:00.000000000 +0200
-+++ xscreensaver/driver/exec.c 2008-07-17 00:07:00.000000000 +0200
-@@ -1,5 +1,5 @@
- /* exec.c --- executes a program in *this* pid, without an intervening process.
-- * xscreensaver, Copyright (c) 1991-2006 Jamie Zawinski <jwz@jwz.org>
-+ * xscreensaver, Copyright (c) 1991-2008 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
-@@ -181,8 +181,7 @@
-   int hairy_p;
- #ifndef VMS
--  if (nice != 0)
--    nice_process (nice_level);
-+  nice_process (nice_level);
-   hairy_p = !!strpbrk (command, "*?$&!<>[];`'\\\"=");
-   /* note: = is in the above because of the sh syntax "FOO=bar cmd". */
-Index: xscreensaver/driver/lock.c
-===================================================================
---- xscreensaver.orig/driver/lock.c    2008-07-16 23:47:00.000000000 +0200
-+++ xscreensaver/driver/lock.c 2008-07-17 00:08:10.000000000 +0200
-@@ -1,5 +1,5 @@
- /* lock.c --- handling the password dialog for locking-mode.
-- * xscreensaver, Copyright (c) 1993-2007 Jamie Zawinski <jwz@jwz.org>
-+ * xscreensaver, Copyright (c) 1993-2008 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
-@@ -179,7 +179,7 @@
- extern void xss_authenticate(saver_info *si, Bool verbose_p);
--static void
-+static int
- new_passwd_window (saver_info *si)
- {
-   passwd_dialog_data *pw;
-@@ -190,7 +190,7 @@
-   pw = (passwd_dialog_data *) calloc (1, sizeof(*pw));
-   if (!pw)
--    return;
-+    return -1;
-   /* Display the button only if the "newLoginCommand" pref is non-null.
-    */
-@@ -406,13 +406,14 @@
-   }
-   si->pw_data = pw;
-+  return 0;
- }
- /**
-  * info_msg and prompt may be NULL.
-  */
--static void
-+static int
- make_passwd_window (saver_info *si,
-                   const char *info_msg,
-                   const char *prompt,
-@@ -428,11 +429,15 @@
-   cleanup_passwd_window (si);
-+  if (! ssi)   /* WTF?  Trying to prompt while no screens connected? */
-+    return -1;
-+
-   if (!si->pw_data)
--    new_passwd_window (si);
-+    if (new_passwd_window (si) < 0)
-+      return -1;
-   if (!(pw = si->pw_data))
--    return;
-+    return -1;
-   pw->ratio = 1.0;
-@@ -614,10 +619,11 @@
-      actually be visible; this takes into account virtual viewports as
-      well as Xinerama. */
-   {
--    int x, y, w, h;
--    get_screen_viewport (pw->prompt_screen, &x, &y, &w, &h,
--                         pw->previous_mouse_x, pw->previous_mouse_y,
--                         si->prefs.verbose_p);
-+    saver_screen_info *ssi = &si->screens [mouse_screen (si)];
-+    int x = ssi->x;
-+    int y = ssi->y;
-+    int w = ssi->width;
-+    int h = ssi->height;
-     if (si->prefs.debug_p) w /= 2;
-     pw->x = x + ((w + pw->width) / 2) - pw->width;
-     pw->y = y + ((h + pw->height) / 2) - pw->height;
-@@ -678,6 +684,8 @@
-   if (cmap)
-     XInstallColormap (si->dpy, cmap);
-   draw_passwd_window (si);
-+
-+  return 0;
- }
-@@ -1463,6 +1471,7 @@
-   static Bool any_mode_locked_p = False;
-   saver_preferences *p = &si->prefs;
-   int screen;
-+  int real_nscreens = ScreenCount (si->dpy);
-   int event, error;
-   Bool status;
-   XErrorHandler old_handler;
-@@ -1472,7 +1481,7 @@
-   if (!XF86VidModeQueryExtension (si->dpy, &event, &error))
-     return;
--  for (screen = 0; screen < (si->xinerama_p ? 1 : si->nscreens); screen++)
-+  for (screen = 0; screen < real_nscreens; screen++)
-     {
-       XSync (si->dpy, False);
-       old_handler = XSetErrorHandler (ignore_all_errors_ehandler);
-@@ -1509,12 +1518,13 @@
- #ifdef HAVE_XF86VMODE
-   saver_preferences *p = &si->prefs;
-   int screen;
-+  int real_nscreens = ScreenCount (si->dpy);
-   int event, error;
-   if (!XF86VidModeQueryExtension (si->dpy, &event, &error))
-     return;
--  for (screen = 0; screen < si->nscreens; screen++)
-+  for (screen = 0; screen < real_nscreens; screen++)
-     {
-       saver_screen_info *ssi = &si->screens[screen];
-       int x, y;
-@@ -1932,9 +1942,11 @@
-       info_msg_trimmed = remove_trailing_whitespace(info_msg);
-       prompt_trimmed = remove_trailing_whitespace(prompt);
--      make_passwd_window(si, info_msg_trimmed, prompt_trimmed,
--                         auth_msgs[i].type == AUTH_MSGTYPE_PROMPT_ECHO
--                         ? True : False);
-+      if (make_passwd_window(si, info_msg_trimmed, prompt_trimmed,
-+                               auth_msgs[i].type == AUTH_MSGTYPE_PROMPT_ECHO
-+                               ? True : False)
-+            < 0)
-+          goto fail;
-       if (info_msg_trimmed)
-         free(info_msg_trimmed);
-Index: xscreensaver/driver/passwd-kerberos.c
-===================================================================
---- xscreensaver.orig/driver/passwd-kerberos.c 2008-07-16 23:47:00.000000000 +0200
-+++ xscreensaver/driver/passwd-kerberos.c      2008-07-17 00:07:00.000000000 +0200
-@@ -78,6 +78,10 @@
-  static const char *tk_file;
- #endif /* !HAVE_DARWIN */
-+/* warning suppression: duplicated in passwd.c */
-+extern Bool kerberos_lock_init (int argc, char **argv, Bool verbose_p);
-+extern Bool kerberos_passwd_valid_p (const char *typed_passwd, Bool verbose_p);
-+
- /* Called at startup to grab user, instance, and realm information
-    from the user's ticketfile (remember, name.inst@realm). Since we're
-Index: xscreensaver/driver/passwd-pam.c
-===================================================================
---- xscreensaver.orig/driver/passwd-pam.c      2008-07-16 23:47:00.000000000 +0200
-+++ xscreensaver/driver/passwd-pam.c   2008-07-17 00:07:00.000000000 +0200
-@@ -452,6 +452,14 @@
-   ret = si->unlock_cb(nmsgs, messages, &authresp, si);
-+  /* #### If the user times out, or hits ESC or Cancel, we return PAM_CONV_ERR,
-+          and PAM logs this as an authentication failure.  It would be nice if
-+          there was some way to indicate that this was a "cancel" rather than
-+          a "fail", so that it wouldn't show up in syslog, but I think the
-+          only options are PAM_SUCCESS and PAM_CONV_ERR.  (I think that
-+          PAM_ABORT means "internal error", not "cancel".)  Bleh.
-+   */
-+
-   if (ret == 0)
-     {
-       for (i = 0; i < nmsgs; ++i)
-Index: xscreensaver/driver/pdf2jpeg.m
-===================================================================
---- xscreensaver.orig/driver/pdf2jpeg.m        2008-07-16 23:47:00.000000000 +0200
-+++ xscreensaver/driver/pdf2jpeg.m     2008-07-17 00:07:00.000000000 +0200
-@@ -1,6 +1,6 @@
- /* pdf2jpeg -- converts a PDF file to a JPEG file, using Cocoa
-  *
-- * Copyright (c) 2003 by Jamie Zawinski <jwz@jwz.org>
-+ * Copyright (c) 2003, 2008 by Jamie Zawinski <jwz@jwz.org>
-  *
-  * Permission to use, copy, modify, distribute, and sell this software and its
-  * documentation for any purpose is hereby granted without fee, provided that
-@@ -23,6 +23,7 @@
-   const char *progname = argv[0];
-   const char *infile = 0, *outfile = 0;
-   double compression = 0.85;
-+  double scale = 1.0;
-   int verbose = 0;
-   int i;
-@@ -45,6 +46,18 @@
-             }
-           compression = q / 100.0;
-         }
-+      else if (!strcmp (argv[i], "-scale"))
-+        {
-+          float s;
-+          if (1 != sscanf (argv[++i], " %f %c", &s, &c) ||
-+              s <= 0 || s > 50)
-+            {
-+              fprintf (stderr, "%s: scale must be 0.0 - 50.0 (%f)\n",
-+                       progname, s);
-+              goto USAGE;
-+            }
-+          scale = s;
-+        }
-       else if (!strcmp (argv[i], "-verbose"))
-         verbose++;
-       else if (!strcmp (argv[i], "-v") ||
-@@ -64,7 +77,7 @@
-         {
-         USAGE:
-           fprintf (stderr,
--                   "usage: %s [-verbose] [-quality NN] "
-+                   "usage: %s [-verbose] [-scale N] [-quality NN] "
-                    "infile.pdf outfile.jpg\n",
-                    progname);
-           exit (1);
-@@ -93,11 +106,16 @@
-   NSPDFImageRep *pdf_rep = [NSPDFImageRep imageRepWithData:pdf_data];
-   // Create an NSImage instance
--  NSImage *image = [[NSImage alloc] initWithSize:[pdf_rep size]];
-+  NSRect rect;
-+  rect.size = [pdf_rep size];
-+  rect.size.width  *= scale;
-+  rect.size.height *= scale;
-+  rect.origin.x = rect.origin.y = 0;
-+  NSImage *image = [[NSImage alloc] initWithSize:rect.size];
-   // Draw the PDFImageRep in the NSImage
-   [image lockFocus];
--  [pdf_rep drawAtPoint:NSMakePoint(0.0,0.0)];
-+  [pdf_rep drawInRect:rect];
-   [image unlockFocus];
-   // Load the NSImage's contents into an NSBitmapImageRep:
-Index: xscreensaver/driver/prefs.c
-===================================================================
---- xscreensaver.orig/driver/prefs.c   2008-07-16 23:47:00.000000000 +0200
-+++ xscreensaver/driver/prefs.c        2008-07-17 00:07:00.000000000 +0200
-@@ -1,5 +1,5 @@
- /* dotfile.c --- management of the ~/.xscreensaver file.
-- * xscreensaver, Copyright (c) 1998-2006 Jamie Zawinski <jwz@jwz.org>
-+ * xscreensaver, Copyright (c) 1998-2008 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
-@@ -272,6 +272,7 @@
-   "fadeTicks",
-   "captureStderr",
-   "captureStdout",            /* not saved -- obsolete */
-+  "logFile",                  /* not saved */
-   "ignoreUninstalledPrograms",
-   "font",
-   "dpmsEnabled",
-@@ -808,6 +809,7 @@
-       CHECK("fadeTicks")      type = pref_int,  i = p->fade_ticks;
-       CHECK("captureStderr")  type = pref_bool, b = p->capture_stderr_p;
-       CHECK("captureStdout")  continue;  /* don't save */
-+      CHECK("logFile")                continue;  /* don't save */
-       CHECK("ignoreUninstalledPrograms")
-                                 type = pref_bool, b = p->ignore_uninstalled_p;
-Index: xscreensaver/driver/screens.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ xscreensaver/driver/screens.c      2008-07-17 00:07:00.000000000 +0200
-@@ -0,0 +1,894 @@
-+/* screens.c --- dealing with RANDR, Xinerama, and VidMode Viewports.
-+ * xscreensaver, Copyright (c) 1991-2008 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.
-+ */
-+
-+/*   There are a bunch of different mechanisms for multiple monitors
-+ *   available in X.  XScreenSaver needs to care about this for two
-+ *   reasons: first, to ensure that all visible areas go black; and
-+ *   second, so that the windows of screen savers exactly fill the
-+ *   glass of each monitor (instead of one saver spanning multiple
-+ *   monitors, or a monitor displaying only a sub-rectangle of the
-+ *   screen saver.)
-+ *
-+ *   1) Multi-screen:
-+ *
-+ *      This is the original way.  Each monitor gets its own display
-+ *      number.  :0.0 is the first one, :0.1 is the next, etc.  The
-+ *      value of $DISPLAY determines which screen windows open on by
-+ *      default.  A single app can open windows on multiple screens
-+ *      with the same display connection, but windows cannot be moved
-+ *      from one screen to another.  The mouse can be moved from one
-+ *      screen to another, though.  Screens may be different depths
-+ *      (e.g., one can be TrueColor and one can be PseudoColor.)
-+ *      Screens cannot be resized or moved without restarting X.
-+ *
-+ *      Everyone hates this way of doing things because of the
-+ *      inability to move a window from one screen to another without
-+ *      restarting the application.
-+ *
-+ *   2) Xinerama:
-+ *
-+ *      There is a single giant root window that spans all the
-+ *      monitors.  All monitors are the same depth, and windows can be
-+ *      moved around.  Applications can learn which rectangles are
-+ *      actually visible on monitors by querying the Xinerama server
-+ *      extension.  (If you don't do that, you end up with dialog
-+ *      boxes that try to appear in the middle of the screen actually
-+ *      spanning the gap between two monitors.)
-+ *
-+ *      Xinerama doesn't work with DRI, which means that if you use
-+ *      it, you lose hardware acceleration on OpenGL programs.  Also,
-+ *      screens can't be resized or moved without restarting X.
-+ *
-+ *   3) Vidmode Viewports:
-+ *
-+ *      With this extension, the root window can be bigger than the
-+ *      monitor.  Moving the mouse near the edges of the screen
-+ *      scrolls around, like a pan-and-scan movie.  There can also be
-+ *      a hot key for changing the monitor's resolution (zooming
-+ *      in/out).
-+ *
-+ *      Trying to combine this with Xinerama crashes the server, so
-+ *      you can only use this if you have only a single screen, or are
-+ *      in old-multi-screen mode.
-+ *
-+ *      Also, half the time it doesn't work at all: it tends to lie
-+ *      about the size of the rectangle in use.
-+ *
-+ *   4) RANDR 1.0:
-+ *
-+ *      The first version of the "Resize and Rotate" extension let you
-+ *      change the resolution of a screen on the fly.  The root window
-+ *      would actually resize.  However, it was also incompatible with
-+ *      Xinerama (did it crash, or just do nothing? I can't remember)
-+ *      so you needed to be in single-screen or old multi-screen mode.
-+ *      I believe RANDR could co-exist with Vidmode Viewports, but I'm
-+ *      not sure.
-+ *
-+ *   5) RANDR 1.2:
-+ *
-+ *      Finally, RANDR added the functionality of Xinerama, plus some.
-+ *      Each X screen (in the sense of #1, "multi-screen") can have a
-+ *      number of sub-rectangles that are displayed on monitors, and
-+ *      each of those sub-rectangles can be displayed on more than one
-+ *      monitor.  So it's possible (I think) to have a hybrid of
-+ *      multi-screen and Xinerama (e.g., to have two monitors running
-+ *      in one depth, and three monitors running in another?)
-+ *      Typically though, there will be a single X screen, with
-+ *      Xinerama-like division of that large root window onto multiple
-+ *      monitors.  Also everything's dynamic: monitors can be added,
-+ *      removed, and resized at runtime.
-+ *
-+ *      I believe that as of RANDR 1.2, the Xinerama extension still
-+ *      exists but only as a compatiblity layer: it's actually
-+ *      returning data from the RANDR extension.
-+ *
-+ *      Though RANDR 1.2 allows the same image to be cloned onto more
-+ *      than one monitor, and also allows one monitor to show a
-+ *      subsection of something on another monitor (e.g., the
-+ *      rectangles can be enclosed or overlap).  Since there's no way
-+ *      to put seperate savers on those duplicated-or-overlapping
-+ *      monitors, xscreensaver just ignores them (which allows them to
-+ *      display duplicates or overlaps).
-+ */
-+
-+#ifdef HAVE_CONFIG_H
-+# include "config.h"
-+#endif
-+
-+#include <X11/Xlib.h>
-+
-+#ifdef HAVE_RANDR
-+# include <X11/extensions/Xrandr.h>
-+#endif /* HAVE_RANDR */
-+
-+#ifdef HAVE_XINERAMA
-+# include <X11/extensions/Xinerama.h>
-+#endif /* HAVE_XINERAMA */
-+
-+#ifdef HAVE_XF86VMODE
-+# include <X11/extensions/xf86vmode.h>
-+#endif /* HAVE_XF86VMODE */
-+
-+/* This file doesn't need the Xt headers, so stub these types out... */
-+#undef XtPointer
-+#define XtAppContext void*
-+#define XrmDatabase  void*
-+#define XtIntervalId void*
-+#define XtPointer    void*
-+#define Widget       void*
-+
-+#include "xscreensaver.h"
-+#include "visual.h"
-+
-+
-+typedef enum { S_SANE, S_ENCLOSED, S_DUPLICATE, S_OVERLAP, 
-+               S_OFFSCREEN, S_DISABLED } monitor_sanity;
-+
-+/* 'typedef monitor' is in types.h */
-+struct _monitor {
-+  int id;
-+  char *desc;
-+  Screen *screen;
-+  int x, y, width, height;
-+  monitor_sanity sanity;      /* I'm not crazy you're the one who's crazy */
-+  int enemy;                  /* which monitor it overlaps or duplicates */
-+};
-+
-+static void
-+free_monitors (monitor **monitors)
-+{
-+  monitor **m2 = monitors;
-+  if (! monitors) return;
-+  while (*m2) 
-+    {
-+      if ((*m2)->desc) free ((*m2)->desc);
-+      free (*m2);
-+      m2++;
-+    }
-+  free (monitors);
-+}
-+
-+
-+#ifdef HAVE_XINERAMA
-+
-+static monitor **
-+xinerama_scan_monitors (Display *dpy)
-+{
-+  Screen *screen = DefaultScreenOfDisplay (dpy);
-+  int event, error, nscreens, i;
-+  XineramaScreenInfo *xsi;
-+  monitor **monitors;
-+
-+  if (! XineramaQueryExtension (dpy, &event, &error))
-+    return 0;
-+
-+  if (! XineramaIsActive (dpy)) 
-+    return 0;
-+
-+  xsi = XineramaQueryScreens (dpy, &nscreens);
-+  if (!xsi) return 0;
-+
-+  monitors = (monitor **) calloc (nscreens + 1, sizeof(*monitors));
-+  if (!monitors) return 0;
-+
-+  for (i = 0; i < nscreens; i++)
-+    {
-+      monitor *m = (monitor *) calloc (1, sizeof (monitor));
-+      monitors[i] = m;
-+      m->id       = i;
-+      m->screen   = screen;
-+      m->x        = xsi[i].x_org;
-+      m->y        = xsi[i].y_org;
-+      m->width    = xsi[i].width;
-+      m->height   = xsi[i].height;
-+    }
-+  return monitors;
-+}
-+
-+#endif /* HAVE_XINERAMA */
-+
-+
-+#ifdef HAVE_XF86VMODE
-+
-+static monitor **
-+vidmode_scan_monitors (Display *dpy)
-+{
-+  int event, error, nscreens, i;
-+  monitor **monitors;
-+
-+  /* Note that XF86VidModeGetViewPort() tends to be full of lies on laptops
-+     that have a docking station or external monitor that runs in a different
-+     resolution than the laptop's screen:
-+
-+         http://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=81593
-+         http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=208417
-+         http://bugs.xfree86.org/show_bug.cgi?id=421
-+
-+     Presumably this is fixed by using RANDR instead of VidMode.
-+   */
-+
-+# ifdef HAVE_XINERAMA
-+  /* Attempts to use the VidMode extension when the Xinerama extension is
-+     active can result in a server crash! Yay! */
-+  if (XQueryExtension (dpy, "XINERAMA", &error, &event, &error))
-+    return 0;
-+#  endif /* !HAVE_XINERAMA */
-+
-+  if (! XF86VidModeQueryExtension (dpy, &event, &error))
-+    return 0;
-+
-+  nscreens = ScreenCount (dpy);
-+  monitors = (monitor **) calloc (nscreens + 1, sizeof(*monitors));
-+  if (!monitors) return 0;
-+
-+  for (i = 0; i < nscreens; i++)
-+    {
-+      monitor *m = (monitor *) calloc (1, sizeof (monitor));
-+      XF86VidModeModeLine ml;
-+      int dot;
-+      Screen *screen = ScreenOfDisplay (dpy, i);
-+
-+      monitors[i] = m;
-+      m->id       = i;
-+      m->screen   = screen;
-+
-+      if (! safe_XF86VidModeGetViewPort (dpy, i, &m->x, &m->y))
-+        m->x = m->y = -1;
-+
-+      if (XF86VidModeGetModeLine (dpy, i, &dot, &ml))
-+        {
-+          m->width  = ml.hdisplay;
-+          m->height = ml.vdisplay;
-+        }
-+
-+      /* Apparently, though the server stores the X position in increments of
-+         1 pixel, it will only make changes to the *display* in some other
-+         increment.  With XF86_SVGA on a Thinkpad, the display only updates
-+         in multiples of 8 pixels when in 8-bit mode, and in multiples of 4
-+         pixels in 16-bit mode.  I don't know what it does in 24- and 32-bit
-+         mode, because I don't have enough video memory to find out.
-+
-+         I consider it a bug that XF86VidModeGetViewPort() is telling me the
-+         server's *target* scroll position rather than the server's *actual*
-+         scroll position.  David Dawes agrees, and says they may fix this in
-+         XFree86 4.0, but it's notrivial.
-+
-+         He also confirms that this behavior is server-dependent, so the
-+         actual scroll position cannot be reliably determined by the client.
-+         So... that means the only solution is to provide a ``sandbox''
-+         around the blackout window -- we make the window be up to N pixels
-+         larger than the viewport on both the left and right sides.  That
-+         means some part of the outer edges of each hack might not be
-+         visible, but screw it.
-+
-+         I'm going to guess that 16 pixels is enough, and that the Y dimension
-+         doesn't have this problem.
-+
-+         The drawback of doing this, of course, is that some of the screenhacks
-+         will still look pretty stupid -- for example, "slidescreen" will cut
-+         off the left and right edges of the grid, etc.
-+      */
-+#  define FUDGE 16
-+      if (m->x > 0 && m->x < m->width - ml.hdisplay)
-+        {
-+          /* Not at left edge or right edge:
-+             Round X position down to next lower multiple of FUDGE.
-+             Increase width by 2*FUDGE in case some server rounds up.
-+           */
-+          m->x = ((m->x - 1) / FUDGE) * FUDGE;
-+          m->width += (FUDGE * 2);
-+        }
-+#  undef FUDGE
-+    }
-+
-+  return monitors;
-+}
-+
-+#endif /* HAVE_XF86VMODE */
-+
-+
-+#ifdef HAVE_RANDR
-+
-+static monitor **
-+randr_scan_monitors (Display *dpy)
-+{
-+  int event, error, major, minor, nscreens, i, j;
-+  monitor **monitors;
-+  Bool new_randr_p = False;
-+
-+  if (! XRRQueryExtension (dpy, &event, &error))
-+    return 0;
-+
-+  if (! XRRQueryVersion (dpy, &major, &minor))
-+    return 0;
-+
-+  if (major <= 0)    /* Protocol was still in flux back then -- fuck it. */
-+    return 0;
-+
-+# ifdef HAVE_RANDR_12
-+  new_randr_p = (major > 1 || (major == 1 && minor >= 2));
-+# endif
-+
-+  if (! new_randr_p)
-+    /* RANDR 1.0 -- no Xinerama-like virtual screens. */
-+    nscreens = ScreenCount (dpy);
-+  else  /* RANDR 1.2 or newer -- built-in Xinerama */
-+    {
-+# ifdef HAVE_RANDR_12
-+      int xsc = ScreenCount (dpy);
-+      nscreens = 0;
-+      /* Add up the virtual screens on each X screen. */
-+      for (i = 0; i < xsc; i++)
-+        {
-+          XRRScreenResources *res = 
-+            XRRGetScreenResources (dpy, RootWindow (dpy, i));
-+          nscreens += res->noutput;
-+          XRRFreeScreenResources (res);
-+        }
-+# endif /* HAVE_RANDR_12 */
-+    }
-+
-+  monitors = (monitor **) calloc (nscreens + 1, sizeof(*monitors));
-+  if (!monitors) return 0;
-+
-+  for (i = 0, j = 0; i < ScreenCount (dpy); i++)
-+    {
-+      Screen *screen = ScreenOfDisplay (dpy, j);
-+
-+      if (! new_randr_p)  /* RANDR 1.0 */
-+        {
-+          XRRScreenConfiguration *rrc;
-+          monitor *m = (monitor *) calloc (1, sizeof (monitor));
-+          monitors[i] = m;
-+          m->screen   = screen;
-+          m->id       = i;
-+
-+          rrc = XRRGetScreenInfo (dpy, RootWindowOfScreen (screen));
-+          if (rrc)
-+            {
-+              SizeID size = -1;
-+              Rotation rot = ~0;
-+              XRRScreenSize *rrsizes;
-+              int nsizes;
-+
-+              size = XRRConfigCurrentConfiguration (rrc, &rot);
-+              rrsizes = XRRConfigSizes (rrc, &nsizes);
-+
-+              if (rot & (RR_Rotate_90|RR_Rotate_270))
-+                {
-+                  m->width  = rrsizes[size].height;
-+                  m->height = rrsizes[size].width;
-+                }
-+              else
-+                {
-+                  m->width  = rrsizes[size].width;
-+                  m->height = rrsizes[size].height;
-+                }
-+
-+              /* don't free 'rrsizes' */
-+              XRRFreeScreenConfigInfo (rrc);
-+            }
-+        }
-+      else   /* RANDR 1.2 or newer */
-+        {
-+# ifdef HAVE_RANDR_12
-+          int k;
-+          XRRScreenResources *res = 
-+            XRRGetScreenResources (dpy, RootWindowOfScreen (screen));
-+          for (k = 0; k < res->noutput; k++)
-+            {
-+              monitor *m = (monitor *) calloc (1, sizeof (monitor));
-+              XRROutputInfo *rroi = XRRGetOutputInfo (dpy, res, 
-+                                                      res->outputs[k]);
-+              RRCrtc crtc = (rroi->crtc ? rroi->crtc : rroi->crtcs[0]);
-+              XRRCrtcInfo *crtci = XRRGetCrtcInfo (dpy, res, crtc);
-+
-+              monitors[j] = m;
-+              m->screen   = screen;
-+              m->id       = (i * 1000) + j;
-+              m->desc     = (rroi->name ? strdup (rroi->name) : 0);
-+              m->x        = crtci->x;
-+              m->y        = crtci->y;
-+
-+              if (crtci->rotation & (RR_Rotate_90|RR_Rotate_270))
-+                {
-+                  m->width  = crtci->height;
-+                  m->height = crtci->width;
-+                }
-+              else
-+                {
-+                  m->width  = crtci->width;
-+                  m->height = crtci->height;
-+                }
-+
-+              j++;
-+
-+              if (rroi->connection == RR_Disconnected)
-+                m->sanity = S_DISABLED;
-+              /* #### do the same for RR_UnknownConnection? */
-+
-+              XRRFreeCrtcInfo (crtci);
-+              XRRFreeOutputInfo (rroi);
-+            }
-+          XRRFreeScreenResources (res);
-+# endif /* HAVE_RANDR_12 */
-+        }
-+    }
-+
-+  return monitors;
-+}
-+
-+#endif /* HAVE_RANDR */
-+
-+
-+static monitor **
-+basic_scan_monitors (Display *dpy)
-+{
-+  int nscreens = ScreenCount (dpy);
-+  int i;
-+  monitor **monitors = (monitor **) calloc (nscreens + 1, sizeof(*monitors));
-+  if (!monitors) return 0;
-+
-+  for (i = 0; i < nscreens; i++)
-+    {
-+      Screen *screen = ScreenOfDisplay (dpy, i);
-+      monitor *m = (monitor *) calloc (1, sizeof (monitor));
-+      monitors[i] = m;
-+      m->id       = i;
-+      m->screen   = screen;
-+      m->x        = 0;
-+      m->y        = 0;
-+      m->width    = WidthOfScreen (screen);
-+      m->height   = HeightOfScreen (screen);
-+    }
-+  return monitors;
-+}
-+
-+
-+#ifdef DEBUG_MULTISCREEN
-+
-+/* If DEBUG_MULTISCREEN is defined, then in "-debug" mode, xscreensaver
-+   will pretend that it is changing the number of connected monitors
-+   every few seconds, using the geometries in the following list,
-+   for stress-testing purposes.
-+ */
-+static monitor **
-+debug_scan_monitors (Display *dpy)
-+{
-+  static const char * const geoms[] = {
-+    "1600x1028+0+22",
-+    "1024x768+0+22",
-+    "800x600+0+22",
-+    "800x600+0+22,800x600+800+22",
-+    "800x600+0+22,800x600+800+22,800x600+300+622",
-+    "800x600+0+22,800x600+800+22,800x600+0+622,800x600+800+622",
-+    "640x480+0+22,640x480+640+22,640x480+0+502,640x480+640+502",
-+    "640x480+240+22,640x480+0+502,640x480+640+502",
-+    "640x480+0+200,640x480+640+200",
-+    "800x600+400+22",
-+    "320x200+0+22,320x200+320+22,320x200+640+22,320x200+960+22,320x200+0+222,320x200+320+222,320x200+640+222,320x200+960+222,320x200+0+422,320x200+320+422,320x200+640+422,320x200+960+422,320x200+0+622,320x200+320+622,320x200+640+622,320x200+960+622,320x200+0+822,320x200+320+822,320x200+640+822,320x200+960+822"
-+  };
-+  static int index = 0;
-+  monitor **monitors = (monitor **) calloc (100, sizeof(*monitors));
-+  int nscreens = 0;
-+  Screen *screen = DefaultScreenOfDisplay (dpy);
-+
-+  char *s = strdup (geoms[index]);
-+  char *token = strtok (s, ",");
-+  while (token)
-+    {
-+      monitor *m = calloc (1, sizeof (monitor));
-+      char c;
-+      m->id = nscreens;
-+      m->screen = screen;
-+      if (4 != sscanf (token, "%dx%d+%d+%d%c", 
-+                       &m->width, &m->height, &m->x, &m->y, &c))
-+        abort();
-+      m->width -= 2;
-+      m->height -= 2;
-+      monitors[nscreens++] = m;
-+      token = strtok (0, ",");
-+    }
-+  free (s);
-+  
-+  index = (index+1) % countof(geoms);
-+  return monitors;
-+}
-+
-+#endif /* DEBUG_MULTISCREEN */
-+
-+
-+#ifdef QUAD_MODE
-+static monitor **
-+quadruple (monitor **monitors, Bool debug_p)
-+{
-+  int i, j, count = 0;
-+  monitor **monitors2;
-+  while (monitors[count])
-+    count++;
-+  monitors2 = (monitor **) calloc (count * 4 + 1, sizeof(*monitors));
-+  if (!monitors2) abort();
-+
-+  for (i = 0, j = 0; i < count; i++)
-+    {
-+      int k;
-+      for (k = 0; k < 4; k++)
-+        {
-+          monitors2[j+k] = (monitor *) calloc (1, sizeof (monitor));
-+          *monitors2[j+k] = *monitors[i];
-+          monitors2[j+k]->width  /= (debug_p ? 4 : 2);
-+          monitors2[j+k]->height /= 2;
-+          monitors2[j+k]->id = (monitors[i]->id * 4) + k;
-+          monitors2[j+k]->name = (monitors[i]->name
-+                                  ? strdup (monitors[i]->name) : 0);
-+        }
-+      monitors2[j+1]->x += monitors2[j]->width;
-+      monitors2[j+2]->y += monitors2[j]->height;
-+      monitors2[j+3]->x += monitors2[j]->width;
-+      monitors2[j+3]->y += monitors2[j]->height;
-+      j += 4;
-+    }
-+
-+  free_monitors (monitors);
-+  return monitors2;
-+}
-+#endif /* QUAD_MODE */
-+
-+
-+static monitor **
-+scan_monitors (saver_info *si)
-+{
-+  saver_preferences *p = &si->prefs;
-+  monitor **monitors = 0;
-+
-+# ifdef DEBUG_MULTISCREEN
-+    if (! monitors) monitors = debug_scan_monitors (si->dpy);
-+# endif
-+
-+# ifdef HAVE_RANDR
-+  if (! p->getviewport_full_of_lies_p)
-+    if (! monitors) monitors = randr_scan_monitors (si->dpy);
-+# endif
-+
-+# ifdef HAVE_XF86VMODE
-+  if (! monitors) monitors = vidmode_scan_monitors (si->dpy);
-+# endif
-+
-+# ifdef HAVE_XF86VMODE
-+  if (! monitors) monitors = xinerama_scan_monitors (si->dpy);
-+# endif
-+
-+  if (! monitors) monitors = basic_scan_monitors (si->dpy);
-+
-+# ifdef QUAD_MODE
-+  if (p->quad_p)
-+    monitors = quadruple (monitors, p->debug_p);
-+# endif
-+
-+  return monitors;
-+}
-+
-+
-+static Bool
-+monitors_overlap_p (monitor *a, monitor *b)
-+{
-+  /* 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, b->x);
-+  int maxtop   = MAX(a->y, b->y);
-+  int minright = MIN(a->x + a->width  - 1, b->x + b->width);
-+  int minbot   = MIN(a->y + a->height - 1, b->y + b->height);
-+  return (maxtop < minbot && maxleft < minright);
-+}
-+
-+
-+/* Mark the ones that overlap, etc.
-+ */
-+static void
-+check_monitor_sanity (monitor **monitors)
-+{
-+  int i, j, count = 0;
-+
-+  while (monitors[count])
-+    count++;
-+
-+#  define X1 monitors[i]->x
-+#  define X2 monitors[j]->x
-+#  define Y1 monitors[i]->y
-+#  define Y2 monitors[j]->y
-+#  define W1 monitors[i]->width
-+#  define W2 monitors[j]->width
-+#  define H1 monitors[i]->height
-+#  define H2 monitors[j]->height
-+
-+  /* If a monitor is enclosed by any other monitor, that's insane.
-+   */
-+  for (i = 0; i < count; i++)
-+    for (j = 0; j < count; j++)
-+      if (i != j &&
-+          monitors[i]->sanity == S_SANE &&
-+          monitors[j]->sanity == S_SANE &&
-+          X2 >= X1 &&
-+          Y2 >= Y1 &&
-+          (X2+W2) <= (X1+W1) &&
-+          (Y2+H2) <= (Y1+H1))
-+        {
-+          if (X1 == X2 &&
-+              Y1 == Y2 &&
-+              W1 == W2 &&
-+              H1 == H2)
-+            monitors[j]->sanity = S_DUPLICATE;
-+          else 
-+            monitors[j]->sanity = S_ENCLOSED;
-+          monitors[j]->enemy = i;
-+        }
-+
-+  /* After checking for enclosure, check for other lossage against earlier
-+     monitors.  We do enclosure first so that we make sure to pick the
-+     larger one.
-+   */
-+  for (i = 0; i < count; i++)
-+    for (j = 0; j < i; j++)
-+      {
-+        if (monitors[i]->sanity != S_SANE) continue; /* already marked */
-+        if (monitors[j]->sanity != S_SANE) continue;
-+
-+        if (monitors_overlap_p (monitors[i], monitors[j]))
-+          {
-+            monitors[i]->sanity = S_OVERLAP;
-+            monitors[i]->enemy = j;
-+          }
-+      }
-+
-+  /* Finally, make sure all monitors are enclosed by their X screen.
-+     Xinerama sometimes reports 1024x768 VPs at -1936862040, -1953705044.
-+   */
-+  for (i = 0; i < count; i++)
-+    {
-+      int sw = WidthOfScreen (monitors[i]->screen)  * 2;
-+      int sh = HeightOfScreen (monitors[i]->screen) * 2;
-+      if (monitors[i]->sanity != S_SANE) continue; /* already marked */
-+      if (X1    <  0 || Y1    <  0 || 
-+          W1    <= 0 || H1    <= 0 || 
-+          X1+W1 > sw || Y1+H1 > sh)
-+        {
-+          monitors[i]->sanity = S_OFFSCREEN;
-+          monitors[i]->enemy = 0;
-+        }
-+    }
-+
-+#  undef X1
-+#  undef X2
-+#  undef Y1
-+#  undef Y2
-+#  undef W1
-+#  undef W2
-+#  undef H1
-+#  undef H2
-+}
-+
-+
-+static Bool
-+layouts_differ_p (monitor **a, monitor **b)
-+{
-+  if (!a || !b) return True;
-+  while (1)
-+    {
-+      if (!*a) break;
-+      if (!*b) break;
-+      if ((*a)->screen != (*b)->screen ||
-+          (*a)->x      != (*b)->x      ||
-+          (*a)->y      != (*b)->y      ||
-+          (*a)->width  != (*b)->width  ||
-+          (*a)->height != (*b)->height)
-+        return True;
-+      a++;
-+      b++;
-+    }
-+  if (*a) return True;
-+  if (*b) return True;
-+
-+  return False;
-+}
-+
-+
-+void
-+describe_monitor_layout (saver_info *si)
-+{
-+  monitor **monitors = si->monitor_layout;
-+  int count = 0;
-+  int good_count = 0;
-+  int bad_count = 0;
-+  while (monitors[count])
-+    {
-+      if (monitors[count]->sanity == S_SANE)
-+        good_count++;
-+      else
-+        bad_count++;
-+      count++;
-+    }
-+
-+  if (count == 0)
-+    fprintf (stderr, "%s: no screens!\n", blurb());
-+  else
-+    {
-+      int i;
-+      fprintf (stderr, "%s: screens in use: %d\n", blurb(), good_count);
-+      for (i = 0; i < count; i++)
-+        {
-+          monitor *m = monitors[i];
-+          if (m->sanity != S_SANE) continue;
-+          fprintf (stderr, "%s:  %3d/%d: %dx%d+%d+%d",
-+                   blurb(), m->id, screen_number (m->screen),
-+                   m->width, m->height, m->x, m->y);
-+          if (m->desc && *m->desc) fprintf (stderr, " (%s)", m->desc);
-+          fprintf (stderr, "\n");
-+        }
-+      if (bad_count > 0)
-+        {
-+          fprintf (stderr, "%s: rejected screens: %d\n", blurb(), bad_count);
-+          for (i = 0; i < count; i++)
-+            {
-+              monitor *m = monitors[i];
-+              monitor *e = monitors[m->enemy];
-+              if (m->sanity == S_SANE) continue;
-+              fprintf (stderr, "%s:  %3d/%d: %dx%d+%d+%d",
-+                       blurb(), m->id, screen_number (m->screen),
-+                       m->width, m->height, m->x, m->y);
-+              if (m->desc && *m->desc) fprintf (stderr, " (%s)", m->desc);
-+              fprintf (stderr, " -- ");
-+              switch (m->sanity)
-+                {
-+                case S_SANE: abort(); break;
-+                case S_ENCLOSED:
-+                  fprintf (stderr, "enclosed by %d (%dx%d+%d+%d)\n",
-+                           e->id, e->width, e->height, e->x, e->y);
-+                  break;
-+                case S_DUPLICATE:
-+                  fprintf (stderr, "duplicate of %d\n", e->id);
-+                  break;
-+                case S_OVERLAP:
-+                  fprintf (stderr, "overlaps %d (%dx%d+%d+%d)\n",
-+                           e->id, e->width, e->height, e->x, e->y);
-+                  break;
-+                case S_OFFSCREEN:
-+                  fprintf (stderr, "off screen (%dx%d)\n",
-+                           WidthOfScreen (e->screen), 
-+                           HeightOfScreen (e->screen));
-+                  break;
-+                case S_DISABLED:
-+                  fprintf (stderr, "output disabled\n");
-+                  break;
-+                }
-+            }
-+        }
-+    }
-+}
-+
-+
-+/* Synchronize the contents of si->ssi to the current state of the monitors.
-+   Doesn't change anything if nothing has changed; otherwise, alters and
-+   reuses existing saver_screen_info structs as much as possible.
-+   Returns True if anything changed.
-+ */
-+Bool
-+update_screen_layout (saver_info *si)
-+{
-+  monitor **monitors = scan_monitors (si);
-+  int count = 0;
-+  int good_count = 0;
-+  int i, j;
-+  int seen_screens[100] = { 0, };
-+
-+  if (! layouts_differ_p (monitors, si->monitor_layout))
-+    {
-+      free_monitors (monitors);
-+      return False;
-+    }
-+
-+  free_monitors (si->monitor_layout);
-+  si->monitor_layout = monitors;
-+  check_monitor_sanity (si->monitor_layout);
-+
-+  while (monitors[count])
-+    {
-+      if (monitors[count]->sanity == S_SANE)
-+        good_count++;
-+      count++;
-+    }
-+
-+  if (si->ssi_count == 0)
-+    {
-+      si->ssi_count = 10;
-+      si->screens = (saver_screen_info *)
-+        calloc (sizeof(*si->screens), si->ssi_count);
-+    }
-+
-+  if (si->ssi_count <= good_count)
-+    {
-+      si->ssi_count = good_count + 10;
-+      si->screens = (saver_screen_info *)
-+        realloc (si->screens, sizeof(*si->screens) * si->ssi_count);
-+      memset (si->screens + si->nscreens, 0, 
-+              sizeof(*si->screens) * (si->ssi_count - si->nscreens));
-+    }
-+
-+  if (! si->screens) abort();
-+
-+  si->nscreens = good_count;
-+
-+  /* Regenerate the list of GL visuals as needed. */
-+  if (si->best_gl_visuals)
-+    free (si->best_gl_visuals);
-+  si->best_gl_visuals = 0;
-+
-+  for (i = 0, j = 0; i < count; i++)
-+    {
-+      monitor *m = monitors[i];
-+      saver_screen_info *ssi = &si->screens[j];
-+      Screen *old_screen = ssi->screen;
-+      int sn;
-+      if (monitors[i]->sanity != S_SANE) continue;
-+
-+      ssi->global = si;
-+      ssi->number = j;
-+
-+      sn = screen_number (m->screen);
-+      ssi->screen = m->screen;
-+      ssi->real_screen_number = sn;
-+      ssi->real_screen_p = (seen_screens[sn] == 0);
-+      seen_screens[sn]++;
-+
-+      ssi->default_visual =
-+      get_visual_resource (ssi->screen, "visualID", "VisualID", False);
-+      ssi->current_visual = ssi->default_visual;
-+      ssi->current_depth = visual_depth (ssi->screen, ssi->current_visual);
-+
-+      /* If the screen changed (or if this is the first time) we need
-+         a new toplevel shell for this screen's depth.
-+       */
-+      if (ssi->screen != old_screen)
-+        initialize_screen_root_widget (ssi);
-+
-+      ssi->poll_mouse_last_root_x = -1;
-+      ssi->poll_mouse_last_root_y = -1;
-+
-+      ssi->x      = m->x;
-+      ssi->y      = m->y;
-+      ssi->width  = m->width;
-+      ssi->height = m->height;
-+
-+# ifndef DEBUG_MULTISCREEN
-+      {
-+        saver_preferences *p = &si->prefs;
-+        if (p->debug_p
-+#  ifdef QUAD_MODE
-+            && !p->quad_p
-+#  endif
-+            )
-+          ssi->width /= 2;
-+      }
-+# endif
-+
-+      j++;
-+    }
-+
-+  si->default_screen = &si->screens[0];
-+  return True;
-+}
-Index: xscreensaver/driver/splash.c
-===================================================================
---- xscreensaver.orig/driver/splash.c  2008-07-16 23:47:00.000000000 +0200
-+++ xscreensaver/driver/splash.c       2008-07-17 00:07:00.000000000 +0200
-@@ -1,4 +1,4 @@
--/* xscreensaver, Copyright (c) 1991-2006 Jamie Zawinski <jwz@netscape.com>
-+/* xscreensaver, Copyright (c) 1991-2008 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
-@@ -170,6 +170,10 @@
-     return;
-   ssi = &si->screens[mouse_screen (si)];
-+
-+  if (!ssi || !ssi->screen)
-+    return;    /* WTF?  Trying to splash while no screens connected? */
-+
-   cmap = DefaultColormapOfScreen (ssi->screen);
-   sp = (splash_dialog_data *) calloc (1, sizeof(*sp));
-@@ -376,7 +380,7 @@
-   attrs.event_mask = (ExposureMask | ButtonPressMask | ButtonReleaseMask);
-   {
--    int sx, sy, w, h;
-+    int sx = 0, sy = 0, w, h;
-     int mouse_x = 0, mouse_y = 0;
-     {
-@@ -393,7 +397,10 @@
-         }
-     }
--    get_screen_viewport (ssi, &sx, &sy, &w, &h, mouse_x, mouse_y, False);
-+    x = ssi->x;
-+    y = ssi->y;
-+    w = ssi->width;
-+    h = ssi->height;
-     if (si->prefs.debug_p) w /= 2;
-     x = sx + (((w + sp->width)  / 2) - sp->width);
-     y = sy + (((h + sp->height) / 2) - sp->height);
-Index: xscreensaver/driver/stderr.c
-===================================================================
---- xscreensaver.orig/driver/stderr.c  2008-07-16 23:47:00.000000000 +0200
-+++ xscreensaver/driver/stderr.c       2008-07-17 00:07:00.000000000 +0200
-@@ -1,5 +1,5 @@
- /* stderr.c --- capturing stdout/stderr output onto the screensaver window.
-- * xscreensaver, Copyright (c) 1991-2006 Jamie Zawinski <jwz@jwz.org>
-+ * xscreensaver, Copyright (c) 1991-2008 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
-@@ -472,6 +472,47 @@
- }
-+/* If the "-log file" command-line option has been specified,
-+   open the file for append, and redirect stdout/stderr there.
-+   This is called very early, before initialize_stderr().
-+ */
-+void
-+stderr_log_file (saver_info *si)
-+{
-+  int stdout_fd = 1;
-+  int stderr_fd = 2;
-+  const char *filename = get_string_resource (si->dpy, "logFile", "LogFile");
-+  int fd;
-+
-+  if (!filename || !*filename) return;
-+
-+  fd = open (filename, O_WRONLY | O_APPEND | O_CREAT, 0666);
-+
-+  if (fd < 0)
-+    {
-+      char buf[255];
-+    FAIL:
-+      sprintf (buf, "%.100s: %.100s", blurb(), filename);
-+      perror (buf);
-+      fflush (stderr);
-+      fflush (stdout);
-+      exit (1);
-+    }
-+
-+  fprintf (stderr, "%s: logging to file %s\n", blurb(), filename);
-+
-+  if (dup2 (fd, stdout_fd) < 0) goto FAIL;
-+  if (dup2 (fd, stderr_fd) < 0) goto FAIL;
-+
-+  fprintf (stderr, "\n\n"
-+ "##########################################################################\n"
-+           "%s: logging to \"%s\" at %s\n"
-+ "##########################################################################\n"
-+           "\n",
-+           blurb(), filename, timestring());
-+}
-+
-+
- /* If there is anything in the stderr buffer, flush it to the real stderr.
-    This does no X operations.  Call this when exiting to make sure any
-    last words actually show up.
-@@ -487,8 +528,7 @@
-   stderr_callback ((XtPointer) si, &stderr_stdout_read_fd, 0);
--  if (stderr_buffer &&
--      stderr_tail &&
-+  if (stderr_tail &&
-       stderr_buffer < stderr_tail)
-     {
-       *stderr_tail = 0;
-Index: xscreensaver/driver/subprocs.c
-===================================================================
---- xscreensaver.orig/driver/subprocs.c        2008-07-16 23:47:00.000000000 +0200
-+++ xscreensaver/driver/subprocs.c     2008-07-17 00:07:00.000000000 +0200
-@@ -851,7 +851,7 @@
-     case 0:
-       close (ConnectionNumber (si->dpy));     /* close display fd */
-       limit_subproc_memory (p->inferior_memory_limit, p->verbose_p);
--      hack_subproc_environment (ssi);         /* set $DISPLAY */
-+      hack_subproc_environment (ssi->screen, ssi->screensaver_window);
-       if (p->verbose_p)
-         fprintf (stderr, "%s: %d: spawning \"%s\" in pid %lu.\n",
-@@ -878,14 +878,22 @@
- }
--static void
--spawn_screenhack_1 (saver_screen_info *ssi, Bool first_time_p)
-+void
-+spawn_screenhack (saver_screen_info *ssi)
- {
-   saver_info *si = ssi->global;
-   saver_preferences *p = &si->prefs;
--  raise_window (si, first_time_p, True, False);
-   XFlush (si->dpy);
-+  if (!monitor_powered_on_p (si))
-+    {
-+      if (si->prefs.verbose_p)
-+        fprintf (stderr,
-+                 "%s: %d: X says monitor has powered down; "
-+                 "not launching a hack.\n", blurb(), ssi->number);
-+      return;
-+    }
-+
-   if (p->screenhacks_count)
-     {
-       screenhack *hack;
-@@ -1017,55 +1025,28 @@
-         break;
-       }
-     }
--}
--
--
--void
--spawn_screenhack (saver_info *si, Bool first_time_p)
--{
--  if (monitor_powered_on_p (si))
--    {
--      int i;
--      for (i = 0; i < si->nscreens; i++)
--        {
--          saver_screen_info *ssi = &si->screens[i];
--          spawn_screenhack_1 (ssi, first_time_p);
--        }
--    }
--  else if (si->prefs.verbose_p)
--    fprintf (stderr,
--             "%s: X says monitor has powered down; "
--             "not launching a hack.\n", blurb());
--  store_saver_status (si);  /* store current hack numbers */
-+  store_saver_status (si);  /* store current hack number */
- }
- void
--kill_screenhack (saver_info *si)
-+kill_screenhack (saver_screen_info *ssi)
- {
--  int i;
--  for (i = 0; i < si->nscreens; i++)
--    {
--      saver_screen_info *ssi = &si->screens[i];
--      if (ssi->pid)
--      kill_job (si, ssi->pid, SIGTERM);
--      ssi->pid = 0;
--    }
-+  saver_info *si = ssi->global;
-+  if (ssi->pid)
-+    kill_job (si, ssi->pid, SIGTERM);
-+  ssi->pid = 0;
- }
- void
--suspend_screenhack (saver_info *si, Bool suspend_p)
-+suspend_screenhack (saver_screen_info *ssi, Bool suspend_p)
- {
- #ifdef SIGSTOP        /* older VMS doesn't have it... */
--  int i;
--  for (i = 0; i < si->nscreens; i++)
--    {
--      saver_screen_info *ssi = &si->screens[i];
--      if (ssi->pid)
--      kill_job (si, ssi->pid, (suspend_p ? SIGSTOP : SIGCONT));
--    }
-+  saver_info *si = ssi->global;
-+  if (ssi->pid)
-+    kill_job (si, ssi->pid, (suspend_p ? SIGSTOP : SIGCONT));
- #endif /* SIGSTOP */
- }
-@@ -1137,7 +1118,7 @@
- void
--hack_subproc_environment (saver_screen_info *ssi)
-+hack_subproc_environment (Screen *screen, Window saver_window)
- {
-   /* Store $DISPLAY into the environment, so that the $DISPLAY variable that
-      the spawned processes inherit is correct.  First, it must be on the same
-@@ -1152,8 +1133,8 @@
-      us to (eventually) run multiple hacks in Xinerama mode, where each hack
-      has the same $DISPLAY but a different piece of glass.
-    */
--  saver_info *si = ssi->global;
--  const char *odpy = DisplayString (si->dpy);
-+  Display *dpy = DisplayOfScreen (screen);
-+  const char *odpy = DisplayString (dpy);
-   char *ndpy = (char *) malloc (strlen(odpy) + 20);
-   char *nssw = (char *) malloc (40);
-   char *s, *c;
-@@ -1170,10 +1151,9 @@
-   while (isdigit(*s)) s++;                    /* skip over dpy number */
-   while (*s == '.') s++;                      /* skip over dot */
-   if (s[-1] != '.') *s++ = '.';                       /* put on a dot */
--  sprintf(s, "%d", ssi->real_screen_number);  /* put on screen number */
-+  sprintf(s, "%d", screen_number (screen));   /* put on screen number */
--  sprintf (nssw, "XSCREENSAVER_WINDOW=0x%lX",
--           (unsigned long) ssi->screensaver_window);
-+  sprintf (nssw, "XSCREENSAVER_WINDOW=0x%lX", (unsigned long) saver_window);
-   /* Allegedly, BSD 4.3 didn't have putenv(), but nobody runs such systems
-      any more, right?  It's not Posix, but everyone seems to have it. */
-@@ -1194,9 +1174,8 @@
- /* GL crap */
- Visual *
--get_best_gl_visual (saver_screen_info *ssi)
-+get_best_gl_visual (saver_info *si, Screen *screen)
- {
--  saver_info *si = ssi->global;
-   pid_t forked;
-   int fds [2];
-   int in, out;
-@@ -1217,6 +1196,11 @@
-   in = fds [0];
-   out = fds [1];
-+  block_sigchld();   /* This blocks it in the parent and child, to avoid
-+                        racing.  It is never unblocked in the child before
-+                        the child exits, but that doesn't matter.
-+                      */
-+
-   switch ((int) (forked = fork ()))
-     {
-     case -1:
-@@ -1237,7 +1221,7 @@
-             perror ("could not dup() a new stdout:");
-             return 0;
-           }
--        hack_subproc_environment (ssi);               /* set $DISPLAY */
-+        hack_subproc_environment (screen, 0); /* set $DISPLAY */
-         execvp (av[0], av);                   /* shouldn't return. */
-@@ -1270,6 +1254,8 @@
-         /* Wait for the child to die. */
-         waitpid (-1, &wait_status, 0);
-+        unblock_sigchld();   /* child is dead and waited, unblock now. */
-+
-         if (1 == sscanf (buf, "0x%lx %c", &v, &c))
-           result = (int) v;
-@@ -1291,12 +1277,13 @@
-           }
-         else
-           {
--            Visual *v = id_to_visual (ssi->screen, result);
-+            Visual *v = id_to_visual (screen, result);
-             if (si->prefs.verbose_p)
-               fprintf (stderr, "%s: %d: %s: GL visual is 0x%X%s.\n",
--                       blurb(), ssi->number,
-+                       blurb(), screen_number (screen),
-                        av[0], result,
--                       (v == ssi->default_visual ? " (default)" : ""));
-+                       (v == DefaultVisualOfScreen (screen)
-+                        ? " (default)" : ""));
-             return v;
-           }
-       }
-Index: xscreensaver/driver/test-passwd.c
-===================================================================
---- xscreensaver.orig/driver/test-passwd.c     2008-07-16 23:47:00.000000000 +0200
-+++ xscreensaver/driver/test-passwd.c  2008-07-17 00:07:00.000000000 +0200
-@@ -1,4 +1,4 @@
--/* xscreensaver, Copyright (c) 1998-2007 Jamie Zawinski <jwz@jwz.org>
-+/* xscreensaver, Copyright (c) 1998-2008 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
-@@ -65,21 +65,6 @@
- Atom XA_SCREENSAVER, XA_DEMO, XA_PREFS;
- void
--get_screen_viewport (saver_screen_info *ssi,
--                     int *x_ret, int *y_ret,
--                     int *w_ret, int *h_ret,
--                     int tx, int ty,
--                     Bool verbose_p)
--{
--  *x_ret = 0;
--  *y_ret = 0;
--  *w_ret = WidthOfScreen (ssi->screen);
--  *h_ret = HeightOfScreen (ssi->screen);
--
--  if (*w_ret > *h_ret * 2) *w_ret /= 2;  /* xinerama kludge */
--}
--
--void
- idle_timer (XtPointer closure, XtIntervalId *id)
- {
-   saver_info *si = (saver_info *) closure;
-@@ -230,8 +215,6 @@
-         visual_depth(si->default_screen->screen,
-                      si->default_screen->current_visual);
--      /* I could call get_screen_viewport(), but it is not worthwhile.
--       * These are used by the save_under pixmap. */
-       ssip.width = WidthOfScreen(ssip.screen);
-       ssip.height = HeightOfScreen(ssip.screen);
-@@ -246,6 +229,9 @@
-   pw = getpwuid (getuid ());
-   si->user = strdup (pw->pw_name);
-+/*  si->nscreens = 0;
-+  si->screens = si->default_screen = 0; */
-+
-   while (1)
-     {
- #ifndef NO_LOCKING
-Index: xscreensaver/driver/test-randr.c
-===================================================================
---- xscreensaver.orig/driver/test-randr.c      2008-07-16 23:47:00.000000000 +0200
-+++ xscreensaver/driver/test-randr.c   2008-07-17 00:07:00.000000000 +0200
-@@ -1,5 +1,5 @@
- /* test-randr.c --- playing with the Resize And Rotate extension.
-- * xscreensaver, Copyright (c) 2004, 2005 Jamie Zawinski <jwz@jwz.org>
-+ * xscreensaver, Copyright (c) 2004-2008 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
-@@ -233,6 +233,43 @@
-           fprintf(stderr, "%s:   XRRGetScreenInfo(dpy, %d) ==> NULL\n",
-                   blurb(), i);
-         }
-+
-+
-+# ifdef HAVE_RANDR_12
-+      if (major > 1 || (major == 1 && minor >= 2))
-+        {
-+          int j;
-+          XRRScreenResources *res = 
-+            XRRGetScreenResources (dpy, RootWindow (dpy, i));
-+          fprintf (stderr, "\n");
-+          for (j = 0; j < res->noutput; j++)
-+            {
-+              int k;
-+              XRROutputInfo *rroi = 
-+                XRRGetOutputInfo (dpy, res, res->outputs[j]);
-+              fprintf (stderr, "%s:   Output %d: %s: %s (%d)\n", blurb(), j,
-+                       rroi->name,
-+                       (rroi->connection == RR_Disconnected ? "disconnected" :
-+                        rroi->connection == RR_UnknownConnection ? "unknown" :
-+                        "connected"),
-+                       (int) rroi->crtc);
-+              for (k = 0; k < rroi->ncrtc; k++)
-+                {
-+                  XRRCrtcInfo *crtci = XRRGetCrtcInfo (dpy, res, 
-+                                                       rroi->crtcs[k]);
-+                  fprintf(stderr, "%s:   %c CRTC %d (%d): %dx%d+%d+%d\n", 
-+                          blurb(),
-+                          (rroi->crtc == rroi->crtcs[k] ? '+' : ' '),
-+                          k, (int) rroi->crtcs[k],
-+                          crtci->width, crtci->height, crtci->x, crtci->y);
-+                  XRRFreeCrtcInfo (crtci);
-+                }
-+              XRRFreeOutputInfo (rroi);
-+              fprintf (stderr, "\n");
-+            }
-+          XRRFreeScreenResources (res);
-+        }
-+# endif /* HAVE_RANDR_12 */
-     }
-   if (major > 0)
-Index: xscreensaver/driver/test-screens.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ xscreensaver/driver/test-screens.c 2008-07-17 00:07:00.000000000 +0200
-@@ -0,0 +1,196 @@
-+/* test-screens.c --- some test cases for the "monitor sanity" checks.
-+ * xscreensaver, Copyright (c) 2008 Jamie Zawinski <jwz@jwz.org>
-+ *
-+ * Permission to use, copy, modify, distribute, and sell this software and its
-+ * documentation for any purpose is hereby granted without fee, provided that
-+ * the above copyright notice appear in all copies and that both that
-+ * copyright notice and this permission notice appear in supporting
-+ * documentation.  No representations are made about the suitability of this
-+ * software for any purpose.  It is provided "as is" without express or 
-+ * implied warranty.
-+ */
-+
-+#ifdef HAVE_CONFIG_H
-+# include "config.h"
-+#endif
-+
-+#include <X11/Xlib.h>
-+
-+/* This file doesn't need the Xt headers, so stub these types out... */
-+#undef XtPointer
-+#define XtAppContext void*
-+#define XrmDatabase  void*
-+#define XtIntervalId void*
-+#define XtPointer    void*
-+#define Widget       void*
-+
-+#include "xscreensaver.h"
-+#include "visual.h"
-+
-+#undef WidthOfScreen
-+#undef HeightOfScreen
-+#define WidthOfScreen(s) 10240
-+#define HeightOfScreen(s) 10240
-+
-+#undef screen_number
-+#define screen_number(s) (0)
-+
-+#include "screens.c"   /* to get at static void check_monitor_sanity() */
-+
-+char *progname = 0;
-+char *progclass = "XScreenSaver";
-+
-+const char *blurb(void) { return progname; }
-+
-+Bool safe_XF86VidModeGetViewPort(Display *d, int i, int *x, int *y) { abort(); }
-+void initialize_screen_root_widget(saver_screen_info *ssi) { abort(); }
-+Visual *get_best_gl_visual (saver_info *si, Screen *sc) { abort(); }
-+
-+
-+static const char *
-+failstr (monitor_sanity san)
-+{
-+  switch (san) {
-+  case S_SANE:      return "OK";
-+  case S_ENCLOSED:  return "ENC";
-+  case S_DUPLICATE: return "DUP";
-+  case S_OVERLAP:   return "OVR";
-+  case S_OFFSCREEN: return "OFF";
-+  case S_DISABLED:  return "DIS";
-+  }
-+}
-+
-+
-+static void
-+test (int testnum, const char *screens, const char *desired)
-+{
-+  monitor *monitors[100];
-+  char result[2048];
-+  char *out = result;
-+  int i, nscreens = 0;
-+  char *token = strtok (strdup(screens), ",");
-+  while (token)
-+    {
-+      monitor *m = calloc (1, sizeof (monitor));
-+      char c;
-+      m->id = (testnum * 1000) + nscreens;
-+      if (4 != sscanf (token, "%dx%d+%d+%d%c", 
-+                      &m->width, &m->height, &m->x, &m->y, &c))
-+        {
-+          fprintf (stderr, "%s: unparsable geometry: %s\n", blurb(), token);
-+          exit (1);
-+        }
-+      monitors[nscreens] = m;
-+      nscreens++;
-+      token = strtok (0, ",");
-+    }
-+  monitors[nscreens] = 0;
-+
-+  check_monitor_sanity (monitors);
-+
-+  *out = 0;
-+  for (i = 0; i < nscreens; i++)
-+    {
-+      monitor *m = monitors[i];
-+      if (out != result) *out++ = ',';
-+      if (m->sanity == S_SANE)
-+        sprintf (out, "%dx%d+%d+%d", m->width, m->height, m->x, m->y);
-+      else
-+        strcpy (out, failstr (m->sanity));
-+      out += strlen(out);
-+    }
-+  *out = 0;
-+
-+  if (!strcmp (result, desired))
-+    fprintf (stderr, "%s: test %2d OK\n", blurb(), testnum);
-+  else
-+    fprintf (stderr, "%s: test %2d FAILED:\n"
-+             "%s:   given: %s\n"
-+             "%s:  wanted: %s\n"
-+             "%s:     got: %s\n",
-+             blurb(), testnum,
-+             blurb(), screens, 
-+             blurb(), desired, 
-+             blurb(), result);
-+
-+# if 0
-+  {
-+    saver_info SI;
-+    SI.monitor_layout = monitors;
-+    describe_monitor_layout (&SI);
-+  }
-+# endif
-+
-+}
-+
-+static void
-+run_tests(void)
-+{
-+  int i = 1;
-+# define A(a)   test (i++, a, a);
-+# define B(a,b) test (i++, a, b)
-+
-+  A("");
-+  A("1024x768+0+0");
-+  A("1024x768+0+0,1024x768+1024+0");
-+  A("1024x768+0+0,1024x768+0+768");
-+  A("1024x768+0+0,1024x768+0+768,1024x768+1024+0");
-+
-+  B("1024x768+999999+0",
-+    "OFF");
-+  B("1024x768+-999999+-999999",
-+    "OFF");
-+  B("1024x768+0+0,1024x768+0+0",
-+    "1024x768+0+0,DUP");
-+  B("1024x768+0+0,1024x768+0+0,1024x768+0+0",
-+    "1024x768+0+0,DUP,DUP");
-+  B("1024x768+0+0,1024x768+1024+0,1024x768+0+0",
-+    "1024x768+0+0,1024x768+1024+0,DUP");
-+  B("1280x1024+0+0,1024x768+0+64,800x600+0+0,640x480+0+0,720x400+0+0",
-+    "1280x1024+0+0,ENC,ENC,ENC,ENC");
-+  B("1024x768+0+64,1280x1024+0+0,800x600+0+0,640x480+0+0,800x600+0+0,720x400+0+0",
-+    "ENC,1280x1024+0+0,ENC,ENC,ENC,ENC");
-+  B("1024x768+0+64,1280x1024+0+0,800x600+0+0,640x480+0+0,1280x1024+0+0,720x400+0+0",
-+    "ENC,1280x1024+0+0,ENC,ENC,DUP,ENC");
-+  B("720x400+0+0,640x480+0+0,800x600+0+0,1024x768+0+64,1280x1024+0+0",
-+    "ENC,ENC,ENC,ENC,1280x1024+0+0");
-+  B("1280x1024+0+0,800x600+1280+0,800x600+1300+0",
-+    "1280x1024+0+0,800x600+1280+0,OVR");
-+  B("1280x1024+0+0,800x600+1280+0,800x600+1300+0,1280x1024+0+0,800x600+1280+0",
-+    "1280x1024+0+0,800x600+1280+0,OVR,DUP,DUP");
-+
-+  /*  +-------------+----+  +------+---+   1: 1440x900,  widescreen display
-+      |             :    |  | 3+4  :   |   2: 1280x1024, conventional display
-+      |     1+2     : 1  |  +......+   |   3: 1024x768,  laptop
-+      |             :    |  |  3       |   4: 800x600,   external projector
-+      +.............+----+  +----------+
-+      |      2      |
-+      |             |
-+      +-------------+
-+   */
-+  B("1440x900+0+0,1280x1024+0+0,1024x768+1440+0,800x600+1440+0",
-+    "1440x900+0+0,OVR,1024x768+1440+0,ENC");
-+  B("800x600+0+0,800x600+0+0,800x600+800+0",
-+    "800x600+0+0,DUP,800x600+800+0");
-+  B("1600x1200+0+0,1360x768+0+0",
-+    "1600x1200+0+0,ENC");
-+}
-+
-+
-+int
-+main (int argc, char **argv)
-+{
-+  char *s;
-+  progname = argv[0];
-+  s = strrchr(progname, '/');
-+  if (s) progname = s+1;
-+  if (argc != 1)
-+    {
-+      fprintf (stderr, "usage: %s\n", argv[0]);
-+      exit (1);
-+    }
-+
-+  run_tests();
-+
-+  exit (0);
-+}
-Index: xscreensaver/driver/timers.c
-===================================================================
---- xscreensaver.orig/driver/timers.c  2008-07-16 23:47:00.000000000 +0200
-+++ xscreensaver/driver/timers.c       2008-07-17 00:07:00.000000000 +0200
-@@ -264,14 +264,18 @@
-     }
-   else
-     {
-+      int i;
-       maybe_reload_init_file (si);
--      kill_screenhack (si);
-+      for (i = 0; i < si->nscreens; i++)
-+        kill_screenhack (&si->screens[i]);
-+
-+      raise_window (si, True, True, False);
-       if (!si->throttled_p)
--        spawn_screenhack (si, False);
-+        for (i = 0; i < si->nscreens; i++)
-+          spawn_screenhack (&si->screens[i]);
-       else
-         {
--          raise_window (si, True, True, False);
-           if (p->verbose_p)
-             fprintf (stderr, "%s: not launching new hack (throttled.)\n",
-                      blurb());
-@@ -1010,28 +1014,17 @@
-         if (event.type == (si->randr_event_number + RRScreenChangeNotify))
-           {
-             /* The Resize and Rotate extension sends an event when the
--               size, rotation, or refresh rate of the screen has changed. */
--
-+               size, rotation, or refresh rate of any screen has changed.
-+             */
-             XRRScreenChangeNotifyEvent *xrr_event =
-               (XRRScreenChangeNotifyEvent *) &event;
--            /* XRRRootToScreen is in Xrandr.h 1.4, 2001/06/07 */
--            int screen = XRRRootToScreen (si->dpy, xrr_event->window);
-             if (p->verbose_p)
-               {
--                if (si->screens[screen].width  == xrr_event->width &&
--                    si->screens[screen].height == xrr_event->height)
--                  fprintf (stderr,
--                          "%s: %d: no-op screen size change event (%dx%d)\n",
--                           blurb(), screen,
--                           xrr_event->width, xrr_event->height);
--                else
--                  fprintf (stderr,
--                       "%s: %d: screen size changed from %dx%d to %dx%d\n",
--                           blurb(), screen,
--                           si->screens[screen].width,
--                           si->screens[screen].height,
--                           xrr_event->width, xrr_event->height);
-+                /* XRRRootToScreen is in Xrandr.h 1.4, 2001/06/07 */
-+                int screen = XRRRootToScreen (si->dpy, xrr_event->window);
-+                fprintf (stderr, "%s: %d: screen change event received\n",
-+                         blurb(), screen);
-               }
- # ifdef RRScreenChangeNotifyMask
-@@ -1040,7 +1033,15 @@
- # endif /* RRScreenChangeNotifyMask */
-             /* Resize the existing xscreensaver windows and cached ssi data. */
--            resize_screensaver_window (si);
-+            if (update_screen_layout (si))
-+              {
-+                if (p->verbose_p)
-+                  {
-+                    fprintf (stderr, "%s: new layout:\n", blurb());
-+                    describe_monitor_layout (si);
-+                  }
-+                resize_screensaver_window (si);
-+              }
-           }
-         else
- #endif /* HAVE_RANDR */
-@@ -1401,11 +1402,13 @@
-       if (screenhack_running_p (si) &&
-           !monitor_powered_on_p (si))
-       {
-+          int i;
-         if (si->prefs.verbose_p)
-           fprintf (stderr,
-                    "%s: X says monitor has powered down; "
-                    "killing running hacks.\n", blurb());
--        kill_screenhack (si);
-+          for (i = 0; i < si->nscreens; i++)
-+            kill_screenhack (&si->screens[i]);
-       }
-       /* Re-schedule this timer.  The watchdog timer defaults to a bit less
-Index: xscreensaver/driver/types.h
-===================================================================
---- xscreensaver.orig/driver/types.h   2008-07-16 23:47:00.000000000 +0200
-+++ xscreensaver/driver/types.h        2008-07-17 00:07:00.000000000 +0200
-@@ -1,7 +1,4 @@
--/* types.h
-- *
-- * This file is part of XScreenSaver,
-- * Copyright (c) 1993-2004 Jamie Zawinski <jwz@jwz.org>
-+/* xscreensaver, Copyright (c) 1993-2008 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
-@@ -12,20 +9,19 @@
-  * implied warranty.
-  */
--#ifndef TYPES_H
--#define TYPES_H
-+#ifndef __XSCREENSAVER_TYPES_H__
-+#define __XSCREENSAVER_TYPES_H__
- typedef struct saver_info saver_info;
--/* Unlock states. Old pw_* equivalents in square brackets:
-- * ul_read - reading input (or ready to do so) [pw_read]
-- * ul_success - auth success, unlock the screen [pw_ok]
-- * ul_fail - authentication failed [pw_fail]
-- * ul_cancel - user cancelled auth [pw_cancel or pw_null]
-- * ul_time - timed out, user took too long [pw_time]
-- * ul_finished - user pressed enter on the current prompt, process input
-- */
--enum unlock_state { ul_read, ul_success, ul_fail, ul_cancel, ul_time, ul_finished };
-+typedef enum {
-+  ul_read,            /* reading input or ready to do so */
-+  ul_success,         /* auth success, unlock */
-+  ul_fail,            /* auth fail */
-+  ul_cancel,          /* user cancelled auth (pw_cancel or pw_null) */
-+  ul_time,            /* timed out */
-+  ul_finished         /* user pressed enter */
-+} unlock_state;
- typedef struct screenhack screenhack;
- struct screenhack {
-@@ -56,6 +52,7 @@
- typedef struct saver_screen_info saver_screen_info;
- typedef struct passwd_dialog_data passwd_dialog_data;
- typedef struct splash_dialog_data splash_dialog_data;
-+typedef struct _monitor monitor;
- /* This structure holds all the user-specified parameters, read from the
-@@ -158,9 +155,11 @@
-   saver_preferences prefs;
-   int nscreens;
-+  int ssi_count;
-   saver_screen_info *screens;
-   saver_screen_info *default_screen;  /* ...on which dialogs will appear. */
--
-+  monitor **monitor_layout;           /* private to screens.c */
-+  Visual **best_gl_visuals;           /* visuals for GL hacks on screen N */
-   /* =======================================================================
-      global connection info
-@@ -173,7 +172,6 @@
-      server extension info
-      ======================================================================= */
--  Bool xinerama_p;               /* Whether Xinerama is in use.            */
-   Bool using_xidle_extension;    /* which extension is being used.         */
-   Bool using_mit_saver_extension;  /* Note that `p->use_*' is the *request*, */
-   Bool using_sgi_saver_extension;  /* and `si->using_*' is the *reality*.    */
-@@ -247,7 +245,7 @@
-   char *user;                 /* The user whose session is locked. */
-   char *cached_passwd;                /* Cached password, used to avoid multiple
-                                  prompts for password-only auth mechanisms.*/
--  enum unlock_state unlock_state;
-+  unlock_state unlock_state;
-   auth_conv_cb_t unlock_cb;   /* The function used to prompt for creds. */
-   void (*auth_finished_cb) (saver_info *si);
-@@ -349,7 +347,6 @@
-   int current_depth;          /* How deep the visual (and the window) are. */
-   Visual *default_visual;     /* visual to use when none other specified */
--  Visual *best_gl_visual;     /* visual to use for GL hacks */
-   Window real_vroot;          /* The original virtual-root window. */
-   Window real_vroot_value;    /* What was in the __SWM_VROOT property. */
-@@ -407,4 +404,4 @@
- };
--#endif
-+#endif /* __XSCREENSAVER_TYPES_H__ */
-Index: xscreensaver/driver/windows.c
-===================================================================
---- xscreensaver.orig/driver/windows.c 2008-07-16 23:47:00.000000000 +0200
-+++ xscreensaver/driver/windows.c      2008-07-17 00:07:00.000000000 +0200
-@@ -226,6 +226,14 @@
- }
-+static void
-+ungrab_keyboard_and_mouse (saver_info *si)
-+{
-+  ungrab_mouse (si);
-+  ungrab_kbd (si);
-+}
-+
-+
- static Bool
- grab_keyboard_and_mouse (saver_info *si, Window window, Cursor cursor,
-                          int screen_no)
-@@ -291,18 +299,15 @@
-    */
-   if (kstatus != GrabSuccess) /* Do not blank without a kbd grab.   */
--    return False;
-+    {
-+      /* If we didn't get both grabs, release the one we did get. */
-+      ungrab_keyboard_and_mouse (si);
-+      return False;
-+    }
-   return True;                        /* Grab is good, go ahead and blank.  */
- }
--static void
--ungrab_keyboard_and_mouse (saver_info *si)
--{
--  ungrab_mouse (si);
--  ungrab_kbd (si);
--}
--
- int
- move_mouse_grab (saver_info *si, Window to, Cursor cursor, int to_screen_no)
-@@ -393,6 +398,21 @@
-                    (char *) id);
-         status = True;
-       }
-+
-+      else if (XGetWindowProperty (dpy, kids[i], XA_WM_COMMAND, 0, 128,
-+                                   False, XA_STRING, &type, &format, &nitems,
-+                                   &bytesafter, &version)
-+               == Success
-+               && type != None
-+               && !strcmp ((char *) version, "gnome-screensaver"))
-+      {
-+        fprintf (stderr,
-+                 "%s: \"%s\" is already running on display %s (window 0x%x)\n",
-+                 blurb(), (char *) version,
-+                   DisplayString (dpy), (int) kids [i]);
-+        status = True;
-+          break;
-+      }
-     }
-   if (kids) XFree ((char *) kids);
-@@ -445,11 +465,6 @@
- static Bool safe_XKillClient (Display *dpy, XID id);
--#ifdef HAVE_XF86VMODE
--static Bool safe_XF86VidModeGetViewPort (Display *, int, int *, int *);
--#endif /* HAVE_XF86VMODE */
--
--
- static void
- kill_xsetroot_data_1 (Display *dpy, Window window,
-                       Atom prop, const char *atom_name,
-@@ -607,7 +622,8 @@
-     fprintf (stderr,
-            "%s: restoring __SWM_VROOT property on the real vroot (0x%lx).\n",
-            blurb(), (unsigned long) ssi->real_vroot);
--  remove_vroot_property (si->dpy, ssi->screensaver_window);
-+  if (ssi->screensaver_window)
-+    remove_vroot_property (si->dpy, ssi->screensaver_window);
-   if (ssi->real_vroot)
-     {
-       store_vroot_property (si->dpy, ssi->real_vroot, ssi->real_vroot_value);
-@@ -812,8 +828,10 @@
-   if (si->screen_blanked_p)
-     {
-+      int i;
-+      for (i = 0; i < si->nscreens; i++)
-+        kill_screenhack (&si->screens[i]);
-       unblank_screen (si);
--      kill_screenhack (si);
-       XSync (si->dpy, False);
-     }
-@@ -999,232 +1017,6 @@
- }
--
--/* Returns the area of the screen which the xscreensaver window should cover.
--   Normally this is the whole screen, but if the X server's root window is
--   actually larger than the monitor's displayable area, then we want to
--   operate in the currently-visible portion of the desktop instead.
-- */
--void
--get_screen_viewport (saver_screen_info *ssi,
--                     int *x_ret, int *y_ret,
--                     int *w_ret, int *h_ret,
--                     int target_x, int target_y,
--                     Bool verbose_p)
--{
--  int w = WidthOfScreen (ssi->screen);
--  int h = HeightOfScreen (ssi->screen);
--
--# ifdef HAVE_XF86VMODE
--  saver_info *si = ssi->global;
--  saver_preferences *p = &si->prefs;
--  int event, error;
--  int dot;
--  XF86VidModeModeLine ml;
--  int x, y;
--  Bool xinerama_p = si->xinerama_p;
--
--#  ifndef HAVE_XINERAMA
--  /* Even if we don't have the client-side Xinerama lib, check to see if
--     the server supports Xinerama, so that we know to ignore the VidMode
--     extension -- otherwise a server crash could result.  Yay. */
--  xinerama_p = XQueryExtension (si->dpy, "XINERAMA", &error, &event, &error);
--#  endif /* !HAVE_XINERAMA */
--
--#  ifdef HAVE_XINERAMA
--  if (xinerama_p)
--    {
--      int mouse_p = (target_x != -1 && target_y != -1);
--      int which = -1;
--      int i;
--
--      /* If a mouse position wasn't passed in, assume we're talking about
--         this screen. */
--      if (!mouse_p)
--        {
--          target_x = ssi->x;
--          target_y = ssi->y;
--          which = ssi->number;
--        }
--
--      /* Find the Xinerama rectangle that contains the mouse position. */
--      for (i = 0; i < si->nscreens; i++)
--        {
--          if (which == -1 &&
--              target_x >= si->screens[i].x &&
--              target_y >= si->screens[i].y &&
--              target_x <  si->screens[i].x + si->screens[i].width &&
--              target_y <  si->screens[i].y + si->screens[i].height)
--            which = i;
--        }
--      if (which == -1) which = 0;  /* didn't find it?  Use the first. */
--      *x_ret = si->screens[which].x;
--      *y_ret = si->screens[which].y;
--      *w_ret = si->screens[which].width;
--      *h_ret = si->screens[which].height;
--
--      if (verbose_p)
--        {
--          fprintf (stderr, "%s: %d: xinerama vp: %dx%d+%d+%d",
--                   blurb(), which,
--                   si->screens[which].width, si->screens[which].height,
--                   si->screens[which].x, si->screens[which].y);
--          if (mouse_p)
--            fprintf (stderr, "; mouse at %d,%d", target_x, target_y);
--          fprintf (stderr, ".\n");
--        }
--
--      return;
--    }
--#  endif /* HAVE_XINERAMA */
--
--  if (!xinerama_p &&  /* Xinerama + VidMode = broken. */
--      XF86VidModeQueryExtension (si->dpy, &event, &error) &&
--      safe_XF86VidModeGetViewPort (si->dpy, ssi->number, &x, &y) &&
--      XF86VidModeGetModeLine (si->dpy, ssi->number, &dot, &ml))
--    {
--      char msg[512];
--      *x_ret = x;
--      *y_ret = y;
--      *w_ret = ml.hdisplay;
--      *h_ret = ml.vdisplay;
--
--      if (*x_ret == 0 && *y_ret == 0 && *w_ret == w && *h_ret == h)
--        /* There is no viewport -- the screen does not scroll. */
--        return;
--
--
--      /* Apparently some versions of XFree86 return nonsense here!
--         I've had reports of 1024x768 viewports at -1936862040, -1953705044.
--         So, sanity-check the values and give up if they are out of range.
--       */
--      if (*x_ret <  0 || *x_ret >= w ||
--          *y_ret <  0 || *y_ret >= h ||
--          *w_ret <= 0 || *w_ret >  w ||
--          *h_ret <= 0 || *h_ret >  h)
--        {
--          static int warned_once = 0;
--          if (!warned_once)
--            {
--              fprintf (stderr, "\n"
--                  "%s: X SERVER BUG: %dx%d viewport at %d,%d is impossible.\n"
--                  "%s: The XVidMode server extension is returning nonsense.\n"
--                  "%s: Please report this bug to your X server vendor.\n\n",
--                       blurb(), *w_ret, *h_ret, *x_ret, *y_ret,
--                       blurb(), blurb());
--              warned_once = 1;
--            }
--          *x_ret = 0;
--          *y_ret = 0;
--          *w_ret = w;
--          *h_ret = h;
--          return;
--        }
--
--      sprintf (msg, "%s: %d: vp is %dx%d+%d+%d",
--               blurb(), ssi->number,
--               *w_ret, *h_ret, *x_ret, *y_ret);
--
--
--      if (p->getviewport_full_of_lies_p)
--        {
--          /* XF86VidModeGetViewPort() tends to be full of lies on laptops
--             that have a docking station or external monitor that runs in
--             a different resolution than the laptop's screen:
--
--                 http://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=81593
--                 http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=208417
--                 http://bugs.xfree86.org/show_bug.cgi?id=421
--
--             The XFree86 developers have closed the bug. As far as I can
--             tell, their reason for this was, "this is an X server bug,
--             but it's pretty hard to fix. Therefore, we are closing it."
--
--             So, now there's a preference item for those unfortunate users to
--             tell us not to trust a word that XF86VidModeGetViewPort() says.
--           */
--          static int warned_once = 0;
--          if (!warned_once && verbose_p)
--            {
--              warned_once = 1;
--              fprintf (stderr,
--                  "%s: %d: XF86VidModeGetViewPort() says vp is %dx%d+%d+%d;\n"
--                  "%s: %d:     assuming that is a pack of lies;\n"
--                  "%s: %d:     using %dx%d+0+0 instead.\n",
--                       blurb(), ssi->number,
--                       *w_ret, *h_ret, *x_ret, *y_ret,
--                       blurb(), ssi->number,
--                       blurb(), ssi->number, w, h);
--            }
--
--          *x_ret = 0;
--          *y_ret = 0;
--          *w_ret = w;
--          *h_ret = h;
--          return;
--        }
--
--
--      /* Apparently, though the server stores the X position in increments of
--         1 pixel, it will only make changes to the *display* in some other
--         increment.  With XF86_SVGA on a Thinkpad, the display only updates
--         in multiples of 8 pixels when in 8-bit mode, and in multiples of 4
--         pixels in 16-bit mode.  I don't know what it does in 24- and 32-bit
--         mode, because I don't have enough video memory to find out.
--
--         I consider it a bug that XF86VidModeGetViewPort() is telling me the
--         server's *target* scroll position rather than the server's *actual*
--         scroll position.  David Dawes agrees, and says they may fix this in
--         XFree86 4.0, but it's notrivial.
--
--         He also confirms that this behavior is server-dependent, so the
--         actual scroll position cannot be reliably determined by the client.
--         So... that means the only solution is to provide a ``sandbox''
--         around the blackout window -- we make the window be up to N pixels
--         larger than the viewport on both the left and right sides.  That
--         means some part of the outer edges of each hack might not be
--         visible, but screw it.
--
--         I'm going to guess that 16 pixels is enough, and that the Y dimension
--         doesn't have this problem.
--
--         The drawback of doing this, of course, is that some of the screenhacks
--         will still look pretty stupid -- for example, "slidescreen" will cut
--         off the left and right edges of the grid, etc.
--      */
--#  define FUDGE 16
--      if (x > 0 && x < w - ml.hdisplay)  /* not at left edge or right edge */
--        {
--          /* Round X position down to next lower multiple of FUDGE.
--             Increase width by 2*FUDGE in case some server rounds up.
--           */
--          *x_ret = ((x - 1) / FUDGE) * FUDGE;
--          *w_ret += (FUDGE * 2);
--        }
--#  undef FUDGE
--
--      if (*x_ret != x ||
--          *y_ret != y ||
--          *w_ret != ml.hdisplay ||
--          *h_ret != ml.vdisplay)
--        sprintf (msg + strlen(msg), "; fudged to %dx%d+%d+%d",
--                 *w_ret, *h_ret, *x_ret, *y_ret);
--
--      if (verbose_p)
--        fprintf (stderr, "%s.\n", msg);
--
--      return;
--    }
--
--# endif /* HAVE_XF86VMODE */
--
--  *x_ret = 0;
--  *y_ret = 0;
--  *w_ret = w;
--  *h_ret = h;
--}
--
--
- static Bool error_handler_hit_p = False;
- static int
-@@ -1318,7 +1110,7 @@
- #ifdef HAVE_XF86VMODE
--static Bool
-+Bool
- safe_XF86VidModeGetViewPort (Display *dpy, int screen, int *xP, int *yP)
- {
-   Bool result;
-@@ -1362,13 +1154,9 @@
-   XColor black;
-   XSetWindowAttributes attrs;
-   unsigned long attrmask;
--  int x, y, width, height;
-   static Bool printed_visual_info = False;  /* only print the message once. */
-   Window horked_window = 0;
--  get_screen_viewport (ssi, &x, &y, &width, &height, -1, -1,
--                       (p->verbose_p && !si->screen_blanked_p));
--
-   black.red = black.green = black.blue = 0;
-   if (ssi->cmap == DefaultColormapOfScreen (ssi->screen))
-@@ -1421,13 +1209,6 @@
-   attrs.backing_pixel = ssi->black_pixel;
-   attrs.border_pixel = ssi->black_pixel;
--  if (p->debug_p
--# ifdef QUAD_MODE
--      && !p->quad_p
--# endif
--      )
--    width = width / 2;
--
-   if (!p->verbose_p || printed_visual_info)
-     ;
-   else if (ssi->current_visual == DefaultVisualOfScreen (ssi->screen))
-@@ -1503,10 +1284,10 @@
-     {
-       XWindowChanges changes;
-       unsigned int changesmask = CWX|CWY|CWWidth|CWHeight|CWBorderWidth;
--      changes.x = x;
--      changes.y = y;
--      changes.width = width;
--      changes.height = height;
-+      changes.x = ssi->x;
-+      changes.y = ssi->y;
-+      changes.width = ssi->width;
-+      changes.height = ssi->height;
-       changes.border_width = 0;
-       if (! (safe_XConfigureWindow (si->dpy, ssi->screensaver_window,
-@@ -1523,10 +1304,9 @@
-     {
-       ssi->screensaver_window =
-       XCreateWindow (si->dpy, RootWindowOfScreen (ssi->screen),
--                       x, y, width, height,
-+                       ssi->x, ssi->y, ssi->width, ssi->height,
-                        0, ssi->current_depth, InputOutput,
-                      ssi->current_visual, attrmask, &attrs);
--
-       reset_stderr (ssi);
-       if (horked_window)
-@@ -1578,10 +1358,10 @@
- }
--/* Called when the RANDR (Resize and Rotate) extension tells us that the
--   size of the screen has changed while the screen was blanked.  If we
--   don't do this, then the screen saver will no longer fully fill the
--   screen, and some of the underlying desktop may be visible.
-+/* Called when the RANDR (Resize and Rotate) extension tells us that
-+   the size of the screen has changed while the screen was blanked.
-+   Call update_screen_layout() first, then call this to synchronize
-+   the size of the saver windows to the new sizes of the screens.
-  */
- void
- resize_screensaver_window (saver_info *si)
-@@ -1589,132 +1369,97 @@
-   saver_preferences *p = &si->prefs;
-   int i;
--  /* First update the size info in the saver_screen_info structs.
--   */
--
--# ifdef HAVE_XINERAMA
--  if (si->xinerama_p)
-+  for (i = 0; i < si->nscreens; i++)
-     {
--      /* As of XFree86 4.3.0, the RANDR and XINERAMA extensions cannot coexist.
--         However, maybe they will someday, so I'm guessing that the right thing
--         to do in that case will be to re-query the Xinerama rectangles after
--         a RANDR size change is received: presumably, if the resolution of one
--         or more of the monitors has changed, then the Xinerama rectangle
--         corresponding to that monitor will also have been updated.
--       */
--      int nscreens;
--      XineramaScreenInfo *xsi = XineramaQueryScreens (si->dpy, &nscreens);
--
--      if (nscreens != si->nscreens) {
--        /* Apparently some Xinerama implementations let you use a hot-key
--           to change the number of screens in use!  This is, of course,
--           documented nowhere.  Let's try to do something marginally less
--           bad than crashing.
--         */
--        fprintf (stderr, "%s: bad craziness: xinerama screen count changed "
--                 "from %d to %d!\n", blurb(), si->nscreens, nscreens);
--        if (nscreens > si->nscreens)
--          nscreens = si->nscreens;
--      }
-+      saver_screen_info *ssi = &si->screens[i];
-+      XWindowAttributes xgwa;
--      if (!xsi) abort();
--      for (i = 0; i < nscreens; i++)
-+      /* Make sure a window exists -- it might not if a monitor was just
-+         added for the first time.
-+       */
-+      if (! ssi->screensaver_window)
-         {
--          saver_screen_info *ssi = &si->screens[i];
--          if (p->verbose_p &&
--              (ssi->x      != xsi[i].x_org ||
--               ssi->y      != xsi[i].y_org ||
--               ssi->width  != xsi[i].width ||
--               ssi->height != xsi[i].height))
-+          initialize_screensaver_window_1 (ssi);
-+          if (p->verbose_p)
-             fprintf (stderr,
--                   "%s: %d: resize xinerama from %dx%d+%d+%d to %dx%d+%d+%d\n",
--                     blurb(), i,
--                     ssi->width,   ssi->height,   ssi->x,       ssi->y,
--                     xsi[i].width, xsi[i].height, xsi[i].x_org, xsi[i].y_org);
--
--          ssi->x      = xsi[i].x_org;
--          ssi->y      = xsi[i].y_org;
--          ssi->width  = xsi[i].width;
--          ssi->height = xsi[i].height;
-+                     "%s: %d: newly added window 0x%lx %dx%d+%d+%d\n",
-+                     blurb(), i, (unsigned long) ssi->screensaver_window,
-+                     ssi->width, ssi->height, ssi->x, ssi->y);
-         }
--      XFree (xsi);
--    }
--  else
--# endif /* HAVE_XINERAMA */
--    {
--      /* Not Xinerama -- get the real sizes of the root windows. */
--      for (i = 0; i < si->nscreens; i++)
-+
-+      /* Make sure the window is the right size -- it might not be if
-+         the monitor changed resolution, or if a badly-behaved hack
-+         screwed with it.
-+       */
-+      XGetWindowAttributes (si->dpy, ssi->screensaver_window, &xgwa);
-+      if (xgwa.x      != ssi->x ||
-+          xgwa.y      != ssi->y ||
-+          xgwa.width  != ssi->width ||
-+          xgwa.height != ssi->height)
-         {
--          saver_screen_info *ssi = &si->screens[i];
--          XWindowAttributes xgwa;
--          XGetWindowAttributes (si->dpy, RootWindowOfScreen (ssi->screen),
--                                &xgwa);
--
--          if (p->verbose_p &&
--              (ssi->x      != xgwa.x ||
--               ssi->y      != xgwa.y ||
--               ssi->width  != xgwa.width ||
--               ssi->height != xgwa.height))
-+          XWindowChanges changes;
-+          unsigned int changesmask = CWX|CWY|CWWidth|CWHeight|CWBorderWidth;
-+          changes.x      = ssi->x;
-+          changes.y      = ssi->y;
-+          changes.width  = ssi->width;
-+          changes.height = ssi->height;
-+          changes.border_width = 0;
-+
-+          if (p->verbose_p)
-             fprintf (stderr,
--                     "%s: %d: resize screen from %dx%d+%d+%d to %dx%d+%d+%d\n",
--                     blurb(), i,
--                     ssi->width, ssi->height, ssi->x, ssi->y,
--                     xgwa.width, xgwa.height, xgwa.x, xgwa.y);
--
--          ssi->x      = xgwa.x;
--          ssi->y      = xgwa.y;
--          ssi->width  = xgwa.width;
--          ssi->height = xgwa.height;
-+                     "%s: %d: resize 0x%lx from %dx%d+%d+%d to %dx%d+%d+%d\n",
-+                     blurb(), i, (unsigned long) ssi->screensaver_window,
-+                     xgwa.width, xgwa.height, xgwa.x, xgwa.y,
-+                     ssi->width, ssi->height, ssi->x, ssi->y);
-+
-+          if (! safe_XConfigureWindow (si->dpy, ssi->screensaver_window,
-+                                       changesmask, &changes))
-+            fprintf (stderr, "%s: %d: someone horked our saver window"
-+                     " (0x%lx)!  Unable to resize it!\n",
-+                     blurb(), i, (unsigned long) ssi->screensaver_window);
-+        }
-+
-+      /* Now (if blanked) make sure that it's mapped and running a hack --
-+         it might not be if we just added it.  (We also might be re-using
-+         an old window that existed for a previous monitor that was
-+         removed and re-added.)
-+
-+         Note that spawn_screenhack() calls select_visual() which may destroy
-+         and re-create the window via initialize_screensaver_window_1().
-+       */
-+      if (si->screen_blanked_p)
-+        {
-+          if (ssi->cmap)
-+            XInstallColormap (si->dpy, ssi->cmap);
-+          XMapRaised (si->dpy, ssi->screensaver_window);
-+          if (! ssi->pid)
-+            spawn_screenhack (ssi);
-+
-+          /* Make sure the act of adding a screen doesn't present as 
-+             pointer motion (and thus cause an unblank). */
-+          {
-+            Window root, child;
-+            int x, y;
-+            unsigned int mask;
-+            XQueryPointer (si->dpy, ssi->screensaver_window, &root, &child,
-+                           &ssi->poll_mouse_last_root_x,
-+                           &ssi->poll_mouse_last_root_y,
-+                           &x, &y, &mask);
-+          }
-         }
-     }
--  /* Next, ensure that the screensaver windows are the right size, taking
--     into account both the new size of the screen in question's root window,
--     and any viewport within that.
-+  /* Kill off any savers running on no-longer-extant monitors.
-    */
--
--  for (i = 0; i < si->nscreens; i++)
-+  for (; i < si->ssi_count; i++)
-     {
-       saver_screen_info *ssi = &si->screens[i];
--      XWindowAttributes xgwa;
--      XWindowChanges changes;
--      int x, y, width, height;
--      unsigned int changesmask = CWX|CWY|CWWidth|CWHeight|CWBorderWidth;
--
--      XGetWindowAttributes (si->dpy, ssi->screensaver_window, &xgwa);
--      get_screen_viewport (ssi, &x, &y, &width, &height, -1, -1,
--                           (p->verbose_p && !si->screen_blanked_p));
--      if (xgwa.x == x &&
--          xgwa.y == y &&
--          xgwa.width  == width &&
--          xgwa.height == height)
--        continue;  /* no change! */
--
--      changes.x = x;
--      changes.y = y;
--      changes.width  = width;
--      changes.height = height;
--      changes.border_width = 0;
--
--      if (p->debug_p
--# ifdef QUAD_MODE
--          && !p->quad_p
--# endif
--          ) 
--        changes.width = changes.width / 2;
--
--      if (p->verbose_p)
--        fprintf (stderr,
--                 "%s: %d: resize 0x%lx from %dx%d+%d+%d to %dx%d+%d+%d\n",
--                 blurb(), i, (unsigned long) ssi->screensaver_window,
--                 xgwa.width, xgwa.height, xgwa.x, xgwa.y,
--                 width, height, x, y);
--      if (! safe_XConfigureWindow (si->dpy, ssi->screensaver_window,
--                                   changesmask, &changes))
-+      if (ssi->pid)
-+        kill_screenhack (ssi);
-+      if (ssi->screensaver_window)
-         {
--          fprintf (stderr,
--    "%s: %d: someone horked our saver window (0x%lx)!  Unable to resize it!\n",
--                   blurb(), i, (unsigned long) ssi->screensaver_window);
-+          XUnmapWindow (si->dpy, ssi->screensaver_window);
-+          restore_real_vroot_1 (ssi);
-         }
-     }
- }
-@@ -2094,10 +1839,30 @@
- }
-+static Visual *
-+get_screen_gl_visual (saver_info *si, int real_screen_number)
-+{
-+  int i;
-+  int nscreens = ScreenCount (si->dpy);
-+
-+  if (! si->best_gl_visuals)
-+    si->best_gl_visuals = (Visual **) 
-+      calloc (nscreens + 1, sizeof (*si->best_gl_visuals));
-+
-+  for (i = 0; i < nscreens; i++)
-+    if (! si->best_gl_visuals[i])
-+      si->best_gl_visuals[i] = 
-+        get_best_gl_visual (si, ScreenOfDisplay (si->dpy, i));
-+
-+  if (real_screen_number < 0 || real_screen_number >= nscreens) abort();
-+  return si->best_gl_visuals[real_screen_number];
-+}
-+
- Bool
- select_visual (saver_screen_info *ssi, const char *visual_name)
- {
-+  XWindowAttributes xgwa;
-   saver_info *si = ssi->global;
-   saver_preferences *p = &si->prefs;
-   Bool install_cmap_p = p->install_cmap_p;
-@@ -2112,6 +1877,17 @@
-    */
-   Bool always_recreate_window_p = True;
-+  get_screen_gl_visual (si, 0);   /* let's probe all the GL visuals early */
-+
-+  /* We make sure the existing window is actually on ssi->screen before
-+     trying to use it, in case things moved around radically when monitors
-+     were added or deleted.  If we don't do this we could get a BadMatch
-+     even though the depths match.  I think.
-+   */
-+  memset (&xgwa, 0, sizeof(xgwa));
-+  if (ssi->screensaver_window)
-+    XGetWindowAttributes (si->dpy, ssi->screensaver_window, &xgwa);
-+
-   if (visual_name && *visual_name)
-     {
-       if (!strcmp(visual_name, "default-i") ||
-@@ -2133,7 +1909,7 @@
-                !strcmp(visual_name, "Gl") ||
-                !strcmp(visual_name, "GL"))
-         {
--          new_v = ssi->best_gl_visual;
-+          new_v = get_screen_gl_visual (si, ssi->real_screen_number);
-           if (!new_v && p->verbose_p)
-             fprintf (stderr, "%s: no GL visuals.\n", progname);
-         }
-@@ -2154,13 +1930,16 @@
-   ssi->install_cmap_p = install_cmap_p;
--  if (new_v &&
--      (always_recreate_window_p ||
--       (ssi->current_visual != new_v) ||
--       (install_cmap_p != was_installed_p)))
-+  if ((ssi->screen != xgwa.screen) ||
-+      (new_v &&
-+       (always_recreate_window_p ||
-+        (ssi->current_visual != new_v) ||
-+        (install_cmap_p != was_installed_p))))
-     {
-       Colormap old_c = ssi->cmap;
-       Window old_w = ssi->screensaver_window;
-+      if (! new_v) 
-+        new_v = ssi->current_visual;
-       if (p->verbose_p)
-       {
-Index: xscreensaver/driver/xscreensaver-command.c
-===================================================================
---- xscreensaver.orig/driver/xscreensaver-command.c    2008-07-16 23:47:00.000000000 +0200
-+++ xscreensaver/driver/xscreensaver-command.c 2008-07-17 00:07:00.000000000 +0200
-@@ -108,9 +108,9 @@
-                 (Note that one must *never* kill xscreensaver with -9!)\n\
- \n\
-   -restart      Causes the screensaver process to exit and then restart with\n\
--                the same command line arguments as last time.  Do this after\n\
--                you've changed your X resource settings, to cause\n\
--                xscreensaver to notice the changes.\n\
-+                the same command line arguments as last time.  You shouldn't\n\
-+                really need to do this, since xscreensaver notices when the\n\
-+                .xscreensaver file has changed and re-reads it as needed.\n\
- \n\
-   -lock         Tells the running xscreensaver process to lock the screen\n\
-                 immediately.  This is like -activate, but forces locking as\n\
-Index: xscreensaver/driver/xscreensaver.c
-===================================================================
---- xscreensaver.orig/driver/xscreensaver.c    2008-07-16 23:47:00.000000000 +0200
-+++ xscreensaver/driver/xscreensaver.c 2008-07-17 00:07:00.000000000 +0200
-@@ -46,6 +46,8 @@
-  *   via the $XSCREENSAVER_WINDOW environment variable -- this trick requires
-  *   a recent (Aug 2003) revision of vroot.h.
-  *
-+ *   (See comments in screens.c for more details about Xinerama/RANDR stuff.)
-+ *
-  *   While we are waiting for user activity, we also set up timers so that,
-  *   after a certain amount of time has passed, we can start a different
-  *   screenhack.  We do this by killing the running child process with
-@@ -205,6 +207,7 @@
-   /* useful for debugging */
-   { "-no-capture-stderr",  ".captureStderr",  XrmoptionNoArg, "off" },
-+  { "-log",              ".logFile",          XrmoptionSepArg, 0 },
- };
- #ifdef __GNUC__
-@@ -263,7 +266,7 @@
-   return str;
- }
--static Bool blurb_timestamp_p = False;   /* kludge */
-+static Bool blurb_timestamp_p = True;   /* kludge */
- const char *
- blurb (void)
-@@ -334,27 +337,30 @@
-       }
-       else
-       {
-+#ifdef __GNUC__
-+  __extension__   /* don't warn about "string length is greater than the
-+                     length ISO C89 compilers are required to support". */
-+#endif
-           fprintf (real_stderr,
--                   "#######################################"
--                   "#######################################\n\n");
--          fprintf (real_stderr,
-+   "#######################################################################\n"
-+   "\n"
-    "    If at all possible, please re-run xscreensaver with the command\n"
--   "    line arguments `-sync -verbose -no-capture', and reproduce this\n"
-+   "    line arguments `-sync -verbose -log log.txt', and reproduce this\n"
-    "    bug.  That will cause xscreensaver to dump a `core' file to the\n"
-    "    current directory.  Please include the stack trace from that core\n"
--   "    file in your bug report.  *DO NOT* mail the core file itself!\n"
--   "    That won't work.\n");
--          fprintf (real_stderr,
-+   "    file in your bug report.  *DO NOT* mail the core file itself!  That\n"
-+   "    won't work.  A \"log.txt\" file will also be written.  Please *do*\n"
-+   "    include the complete \"log.txt\" file with your bug report.\n"
-    "\n"
-    "    http://www.jwz.org/xscreensaver/bugs.html explains how to create\n"
-    "    the most useful bug reports, and how to examine core files.\n"
-    "\n"
-    "    The more information you can provide, the better.  But please\n"
-    "    report this bug, regardless!\n"
-+   "\n"
-+   "#######################################################################\n"
-+   "\n"
-    "\n");
--          fprintf (real_stderr,
--                   "#######################################"
--                   "#######################################\n\n");
-         saver_exit (si, -1, 0);
-       }
-@@ -658,13 +664,6 @@
-     with `xscreensaver-demo' or `xscreensaver-command'.\n\
- .   See the man pages for details, or check the web page:\n\
-     http://www.jwz.org/xscreensaver/\n\n");
--
--            /* Since version 1.21 renamed the "-lock" option to "-lock-mode",
--               suggest that explicitly. */
--            if (!strcmp (s, "-lock"))
--              fprintf (stderr, "\
--    Or perhaps you meant either the \"-lock-mode\" or the\n\
--    \"-lock-timeout <minutes>\" options to xscreensaver?\n\n");
-           }
-         exit (1);
-@@ -755,110 +754,24 @@
- }
--#ifdef HAVE_XINERAMA
--
--static Bool
--screens_overlap_p (XineramaScreenInfo *a, XineramaScreenInfo *b)
--{
--  /* 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_org, b->x_org);
--  int maxtop   = MAX(a->y_org, b->y_org);
--  int minright = MIN(a->x_org + a->width  - 1, b->x_org + b->width);
--  int minbot   = MIN(a->y_org + a->height - 1, b->y_org + b->height);
--  return (maxtop < minbot && maxleft < minright);
--}
--
--
--/* Go through the list of Xinerama screen descriptions, and mark the
--   ones that appear to be insane, so that we don't use them.
-- */
--static void
--check_xinerama_sanity (int count, Bool verbose_p, XineramaScreenInfo *xsi)
-+/* called from screens.c so that all the Xt crud is here. */
-+void
-+initialize_screen_root_widget (saver_screen_info *ssi)
- {
--  static Bool printed_p = False;
--  int i, j;
--  char err[1024];
--  *err = 0;
--
--# define X1 xsi[i].x_org
--# define X2 xsi[j].x_org
--# define Y1 xsi[i].y_org
--# define Y2 xsi[j].y_org
--# define W1 xsi[i].width
--# define W2 xsi[j].width
--# define H1 xsi[i].height
--# define H2 xsi[j].height
--
--# define WHINE() do {                                                        \
--    if (verbose_p) {                                                         \
--      if (! printed_p) {                                                     \
--        fprintf (stderr, "%s: compensating for Xinerama braindamage:\n",     \
--                 blurb());                                                   \
--        printed_p = True;                                                    \
--      }                                                                      \
--      fprintf (stderr, "%s:   %d: %s\n", blurb(), xsi[i].screen_number,err); \
--    }                                                                        \
--    xsi[i].screen_number = -1;                                               \
--  } while(0)
--
--  /* If a screen is enclosed by any other screen, that's insane.
--   */
--  for (i = 0; i < count; i++)
--    for (j = 0; j < count; j++)
--      if (i != j &&
--          xsi[i].screen_number >= 0 &&
--          xsi[j].screen_number >= 0 &&
--          X1 >= X2 && Y1 >= Y2 && (X1+W1) <= (X2+W2) && (X1+H1) <= (X2+H2))
--        {
--          sprintf (err, "%dx%d+%d+%d enclosed by %dx%d+%d+%d",
--                   W1, H1, X1, Y1,
--                   W2, H2, X2, Y2);
--          WHINE();
--          continue;
--        }
--
--  /* After checking for enclosure, check for other lossage against earlier
--     screens.  We do enclosure first so that we make sure to pick the
--     larger one.
--   */
--  for (i = 0; i < count; i++)
--    for (j = 0; j < i; j++)
--      {
--        if (xsi[i].screen_number < 0) continue; /* already marked */
--
--        *err = 0;
--        if (X1 == X2 && Y1 == Y2 && W1 == W2 && H1 == H2)
--          sprintf (err, "%dx%d+%d+%d duplicated", W1, H1, X1, Y1);
--
--        else if (screens_overlap_p (&xsi[i], &xsi[j]))
--          sprintf (err, "%dx%d+%d+%d overlaps %dx%d+%d+%d",
--                   W1, H1, X1, Y1,
--                   W2, H2, X2, Y2);
--
--        if (*err) WHINE();
--      }
--
--# undef X1
--# undef X2
--# undef Y1
--# undef Y2
--# undef W1
--# undef W2
--# undef H1
--# undef H2
-+  saver_info *si = ssi->global;
-+  if (ssi->toplevel_shell)
-+    XtDestroyWidget (ssi->toplevel_shell);
-+  ssi->toplevel_shell =
-+    XtVaAppCreateShell (progname, progclass, 
-+                        applicationShellWidgetClass,
-+                        si->dpy,
-+                        XtNscreen, ssi->screen,
-+                        XtNvisual, ssi->current_visual,
-+                        XtNdepth,  visual_depth (ssi->screen,
-+                                                 ssi->current_visual),
-+                        NULL);
- }
--#endif /* HAVE_XINERAMA */
--
--
- /* Examine all of the display's screens, and populate the `saver_screen_info'
-    structures.  Make sure this is called after hack_environment() sets $PATH.
-@@ -866,182 +779,28 @@
- static void
- initialize_per_screen_info (saver_info *si, Widget toplevel_shell)
- {
--  Bool found_any_writable_cells = False;
-   int i;
--# ifdef HAVE_XINERAMA
--  {
--    int event, error;
--    si->xinerama_p = (XineramaQueryExtension (si->dpy, &event, &error) &&
--                      XineramaIsActive (si->dpy));
--  }
--
--  if (si->xinerama_p && ScreenCount (si->dpy) != 1)
--    {
--      si->xinerama_p = False;
--      if (si->prefs.verbose_p)
--      fprintf (stderr,
--                 "%s: Xinerama AND %d screens?  Disabling Xinerama support!\n",
--                 blurb(), ScreenCount(si->dpy));
--    }
--
--  if (si->xinerama_p)
--    {
--      int nscreens = 0;
--      XineramaScreenInfo *xsi = XineramaQueryScreens (si->dpy, &nscreens);
--      if (!xsi)
--        si->xinerama_p = False;
--      else
--        {
--          int j = 0;
--          si->screens = (saver_screen_info *)
--            calloc(sizeof(saver_screen_info), nscreens);
--          check_xinerama_sanity (nscreens, si->prefs.verbose_p, xsi);
--          for (i = 0; i < nscreens; i++)
--            {
--              if (xsi[i].screen_number < 0)  /* deemed insane */
--                continue;
--              si->screens[j].x      = xsi[i].x_org;
--              si->screens[j].y      = xsi[i].y_org;
--              si->screens[j].width  = xsi[i].width;
--              si->screens[j].height = xsi[i].height;
--              j++;
--            }
--          si->nscreens = j;
--          XFree (xsi);
--        }
--      si->default_screen = &si->screens[0];
--      si->default_screen->real_screen_p = True;
--    }
--# endif /* !HAVE_XINERAMA */
--
--  if (!si->xinerama_p)
--    {
--      si->nscreens = ScreenCount(si->dpy);
--      si->screens = (saver_screen_info *)
--        calloc(sizeof(saver_screen_info), si->nscreens);
--      si->default_screen = &si->screens[DefaultScreen(si->dpy)];
--
--      for (i = 0; i < si->nscreens; i++)
--        {
--          saver_screen_info *ssi = &si->screens[i];
--          ssi->width  = DisplayWidth  (si->dpy, i);
--          ssi->height = DisplayHeight (si->dpy, i);
--          ssi->real_screen_p = True;
--          ssi->real_screen_number = i;
--        }
--    }
--
--
--# ifdef QUAD_MODE
--  /* In "quad mode", we use the Xinerama code to pretend that there are 4
--     screens for every physical screen, and run four times as many hacks...
--   */
--  if (si->prefs.quad_p)
--    {
--      int ns2 = si->nscreens * 4;
--      saver_screen_info *ssi2 = (saver_screen_info *)
--        calloc(sizeof(saver_screen_info), ns2);
--
--      for (i = 0; i < si->nscreens; i++)
--        {
--          saver_screen_info *old = &si->screens[i];
-+  update_screen_layout (si);
--          if (si->prefs.debug_p) old->width = old->width / 2;
--
--          ssi2[i*4  ] = *old;
--          ssi2[i*4+1] = *old;
--          ssi2[i*4+2] = *old;
--          ssi2[i*4+3] = *old;
--
--          ssi2[i*4  ].width  /= 2;
--          ssi2[i*4  ].height /= 2;
--
--          ssi2[i*4+1].x      += ssi2[i*4  ].width;
--          ssi2[i*4+1].width  -= ssi2[i*4  ].width;
--          ssi2[i*4+1].height /= 2;
--
--          ssi2[i*4+2].y      += ssi2[i*4  ].height;
--          ssi2[i*4+2].width  /= 2;
--          ssi2[i*4+2].height -= ssi2[i*4  ].height;
--
--          ssi2[i*4+3].x      += ssi2[i*4+2].width;
--          ssi2[i*4+3].y      += ssi2[i*4+2].height;
--          ssi2[i*4+3].width  -= ssi2[i*4+2].width;
--          ssi2[i*4+3].height -= ssi2[i*4+2].height;
--
--          ssi2[i*4+1].real_screen_p = False;
--          ssi2[i*4+2].real_screen_p = False;
--          ssi2[i*4+3].real_screen_p = False;
--        }
--
--      si->nscreens = ns2;
--      free (si->screens);
--      si->screens = ssi2;
--      si->default_screen = &si->screens[DefaultScreen(si->dpy) * 4];
--      si->xinerama_p = True;
--    }
--# endif /* QUAD_MODE */
--
--  /* finish initializing the screens.
-+  /* Check to see whether fading is ever possible -- if any of the
-+     screens on the display has a PseudoColor visual, then fading can
-+     work (on at least some screens.)  If no screen has a PseudoColor
-+     visual, then don't bother ever trying to fade, because it will
-+     just cause a delay without causing any visible effect.
-    */
-   for (i = 0; i < si->nscreens; i++)
-     {
-       saver_screen_info *ssi = &si->screens[i];
--      ssi->global = si;
--
--      ssi->number = i;
--      ssi->screen = ScreenOfDisplay (si->dpy, ssi->real_screen_number);
--      ssi->poll_mouse_last_root_x = -1;
--      ssi->poll_mouse_last_root_y = -1;
--
--      if (!si->xinerama_p)
-+      if (has_writable_cells (ssi->screen, ssi->current_visual) ||
-+          get_visual (ssi->screen, "PseudoColor", True, False) ||
-+          get_visual (ssi->screen, "GrayScale", True, False))
-         {
--          ssi->width  = WidthOfScreen  (ssi->screen);
--          ssi->height = HeightOfScreen (ssi->screen);
-+          si->fading_possible_p = True;
-+          break;
-         }
--
--      /* Note: we can't use the resource ".visual" because Xt is SO FUCKED. */
--      ssi->default_visual =
--      get_visual_resource (ssi->screen, "visualID", "VisualID", False);
--
--      ssi->current_visual = ssi->default_visual;
--      ssi->current_depth = visual_depth (ssi->screen, ssi->current_visual);
--
--      /* Execute a subprocess to find the GL visual. */
--      ssi->best_gl_visual = get_best_gl_visual (ssi);
--
--      if (ssi == si->default_screen)
--      /* Since this is the default screen, use the one already created. */
--      ssi->toplevel_shell = toplevel_shell;
--      else
--      /* Otherwise, each screen must have its own unmapped root widget. */
--      ssi->toplevel_shell =
--        XtVaAppCreateShell (progname, progclass, applicationShellWidgetClass,
--                            si->dpy,
--                            XtNscreen, ssi->screen,
--                            XtNvisual, ssi->current_visual,
--                            XtNdepth,  visual_depth (ssi->screen,
--                                                     ssi->current_visual),
--                            NULL);
--
--      if (! found_any_writable_cells)
--      {
--        /* Check to see whether fading is ever possible -- if any of the
--           screens on the display has a PseudoColor visual, then fading can
--           work (on at least some screens.)  If no screen has a PseudoColor
--           visual, then don't bother ever trying to fade, because it will
--           just cause a delay without causing any visible effect.
--        */
--        if (has_writable_cells (ssi->screen, ssi->current_visual) ||
--            get_visual (ssi->screen, "PseudoColor", True, False) ||
--            get_visual (ssi->screen, "GrayScale", True, False))
--          found_any_writable_cells = True;
--      }
-     }
--  si->fading_possible_p = found_any_writable_cells;
--
- #ifdef HAVE_XF86VMODE_GAMMA
-   si->fading_possible_p = True;  /* if we can gamma fade, go for it */
- #endif
-@@ -1115,15 +874,6 @@
-                blurb());
-     }
--  /* These are incompatible (or at least, our support for them is...) */
--  if (si->xinerama_p && si->using_mit_saver_extension)
--    {
--      si->using_mit_saver_extension = False;
--      if (p->verbose_p)
--        fprintf (stderr, "%s: Xinerama in use: disabling MIT-SCREEN-SAVER.\n",
--                 blurb());
--    }
--
- #ifdef HAVE_RANDR
-   query_randr_extension (si);
- #endif
-@@ -1149,6 +899,26 @@
- }
-+#ifdef DEBUG_MULTISCREEN
-+static void
-+debug_multiscreen_timer (XtPointer closure, XtIntervalId *id)
-+{
-+  saver_info *si = (saver_info *) closure;
-+  saver_preferences *p = &si->prefs;
-+  if (update_screen_layout (si))
-+    {
-+      if (p->verbose_p)
-+        {
-+          fprintf (stderr, "%s: new layout:\n", blurb());
-+          describe_monitor_layout (si);
-+        }
-+      resize_screensaver_window (si);
-+    }
-+  XtAppAddTimeOut (si->app, 1000*4, debug_multiscreen_timer, (XtPointer) si);
-+}
-+#endif /* DEBUG_MULTISCREEN */
-+
-+
- /* For the case where we aren't using an server extensions, select user events
-    on all the existing windows, and launch timers to select events on
-    newly-created windows as well.
-@@ -1201,6 +971,10 @@
-   if (p->verbose_p)
-     fprintf (stderr, " done.\n");
-+
-+# ifdef DEBUG_MULTISCREEN
-+  if (p->debug_p) debug_multiscreen_timer ((XtPointer) si, 0);
-+# endif
- }
-@@ -1247,6 +1021,7 @@
- {
-   saver_preferences *p = &si->prefs;
-   Bool ok_to_unblank;
-+  int i;
-   while (1)
-     {
-@@ -1342,12 +1117,15 @@
-             }
-         }
--      kill_screenhack (si);
-+      for (i = 0; i < si->nscreens; i++)
-+        kill_screenhack (&si->screens[i]);
--      if (!si->throttled_p)
--        spawn_screenhack (si, True);
--      else if (p->verbose_p)
-+      raise_window (si, True, True, False);
-+      if (si->throttled_p)
-         fprintf (stderr, "%s: not launching hack (throttled.)\n", blurb());
-+      else
-+        for (i = 0; i < si->nscreens; i++)
-+          spawn_screenhack (&si->screens[i]);
-       /* Don't start the cycle timer in demo mode. */
-       if (!si->demoing_p && p->cycle)
-@@ -1418,14 +1196,16 @@
-             was_locked = True;
-           si->dbox_up_p = True;
--          suspend_screenhack (si, True);
-+            for (i = 0; i < si->nscreens; i++)
-+              suspend_screenhack (&si->screens[i], True);       /* suspend */
-           XUndefineCursor (si->dpy, ssi->screensaver_window);
-           ok_to_unblank = unlock_p (si);
-           si->dbox_up_p = False;
-           XDefineCursor (si->dpy, ssi->screensaver_window, ssi->cursor);
--          suspend_screenhack (si, False);     /* resume */
-+            for (i = 0; i < si->nscreens; i++)
-+              suspend_screenhack (&si->screens[i], False);       /* resume */
-             if (!ok_to_unblank &&
-                 !screenhack_running_p (si))
-@@ -1451,7 +1231,8 @@
-                blurb(), timestring ());
-       /* Kill before unblanking, to stop drawing as soon as possible. */
--      kill_screenhack (si);
-+      for (i = 0; i < si->nscreens; i++)
-+        kill_screenhack (&si->screens[i]);
-       unblank_screen (si);
-       set_locked_p (si, False);
-@@ -1530,6 +1311,7 @@
-   shell = connect_to_server (si, &argc, argv);
-   process_command_line (si, &argc, argv);
-+  stderr_log_file (si);
-   print_banner (si);
-   load_init_file(si->dpy, p); /* must be before initialize_per_screen_info() */
-@@ -1951,8 +1733,10 @@
-                                 "exiting.");
-         if (! until_idle_p)
-           {
-+              int i;
-+              for (i = 0; i < si->nscreens; i++)
-+                kill_screenhack (&si->screens[i]);
-             unblank_screen (si);
--            kill_screenhack (si);
-             XSync (si->dpy, False);
-           }
-         saver_exit (si, 0, 0);
-@@ -1974,8 +1758,10 @@
-                                 "restarting.");
-         if (! until_idle_p)
-           {
-+              int i;
-+              for (i = 0; i < si->nscreens; i++)
-+                kill_screenhack (&si->screens[i]);
-             unblank_screen (si);
--            kill_screenhack (si);
-             XSync (si->dpy, False);
-           }
-@@ -2254,17 +2040,15 @@
- #     else
-         False
- #     endif
-+   }, { "DRI",                                        "DRI",
-+        True
-    }, { "Apple-DRI",                            "Apple-DRI (XDarwin)",
-         True
-    },
-   };
--  fprintf (stderr, "%s: running on display \"%s\" (%d %sscreen%s).\n",
--           blurb(),
--         DisplayString(si->dpy),
--           si->nscreens,
--           (si->xinerama_p ? "Xinerama " : ""),
--           (si->nscreens == 1 ? "" : "s"));
-+  fprintf (stderr, "%s: running on display \"%s\"\n", blurb(), 
-+           DisplayString(si->dpy));
-   fprintf (stderr, "%s: vendor is %s, %d.\n", blurb(),
-          ServerVendor(si->dpy), VendorRelease(si->dpy));
-@@ -2324,21 +2108,10 @@
-       }
-     }
--  if (si->xinerama_p)
--    {
--      fprintf (stderr, "%s: Xinerama layout:\n", blurb());
--      for (i = 0; i < si->nscreens; i++)
--        {
--          saver_screen_info *ssi = &si->screens[i];
--          fprintf (stderr, "%s:   %c %d/%d: %dx%d+%d+%d\n",
--                   blurb(),
--                   (ssi->real_screen_p ? '+' : ' '),
--                   ssi->number, ssi->real_screen_number,
--                   ssi->width, ssi->height, ssi->x, ssi->y);
--        }
--    }
-+  describe_monitor_layout (si);
- }
-+
- Bool
- display_is_on_console_p (saver_info *si)
- {
-Index: xscreensaver/driver/xscreensaver.h
-===================================================================
---- xscreensaver.orig/driver/xscreensaver.h    2008-07-16 23:47:00.000000000 +0200
-+++ xscreensaver/driver/xscreensaver.h 2008-07-17 00:07:00.000000000 +0200
-@@ -1,4 +1,4 @@
--/* xscreensaver, Copyright (c) 1993-2006 Jamie Zawinski <jwz@jwz.org>
-+/* xscreensaver, Copyright (c) 1993-2008 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
-@@ -67,7 +67,10 @@
-    blanking
-    ======================================================================= */
-+extern Bool update_screen_layout (saver_info *si);
- extern void initialize_screensaver_window (saver_info *si);
-+extern void initialize_screen_root_widget (saver_screen_info *ssi);
-+
- extern void raise_window (saver_info *si,
-                           Bool inhibit_fade, Bool between_hacks_p,
-                           Bool dont_clear);
-@@ -156,12 +159,12 @@
- #endif /* !HAVE_SIGACTION */
- extern void unblock_sigchld (void);
- extern void hack_environment (saver_info *si);
--extern void hack_subproc_environment (saver_screen_info *ssi);
-+extern void hack_subproc_environment (Screen *, Window saver_window);
- extern void init_sigchld (void);
--extern void spawn_screenhack (saver_info *si, Bool first_time_p);
-+extern void spawn_screenhack (saver_screen_info *ssi);
- extern pid_t fork_and_exec (saver_screen_info *ssi, const char *command);
--extern void kill_screenhack (saver_info *si);
--extern void suspend_screenhack (saver_info *si, Bool suspend_p);
-+extern void kill_screenhack (saver_screen_info *ssi);
-+extern void suspend_screenhack (saver_screen_info *ssi, Bool suspend_p);
- extern Bool screenhack_running_p (saver_info *si);
- extern void emergency_kill_subproc (saver_info *si);
- extern Bool select_visual (saver_screen_info *ssi, const char *visual_name);
-@@ -174,6 +177,7 @@
- extern FILE *real_stderr;
- extern FILE *real_stdout;
-+extern void stderr_log_file (saver_info *si);
- extern void initialize_stderr (saver_info *si);
- extern void reset_stderr (saver_screen_info *ssi);
- extern void clear_stderr (saver_screen_info *ssi);
-@@ -194,8 +198,13 @@
- extern Bool window_exists_p (Display *dpy, Window window);
- extern char *timestring (void);
- extern Bool display_is_on_console_p (saver_info *si);
--extern Visual *get_best_gl_visual (saver_screen_info *ssi);
-+extern Visual *get_best_gl_visual (saver_info *si, Screen *screen);
- extern void check_for_leaks (const char *where);
-+extern void describe_monitor_layout (saver_info *si);
-+
-+#ifdef HAVE_XF86VMODE
-+Bool safe_XF86VidModeGetViewPort (Display *, int, int *, int *);
-+#endif /* HAVE_XF86VMODE */
- extern Atom XA_VROOT, XA_XSETROOT_ID, XA_ESETROOT_PMAP_ID, XA_XROOTPMAP_ID;
- extern Atom XA_SCREENSAVER, XA_SCREENSAVER_VERSION, XA_SCREENSAVER_ID;
-Index: xscreensaver/hacks/screenhack.c
-===================================================================
---- xscreensaver.orig/hacks/screenhack.c       2008-07-16 23:47:00.000000000 +0200
-+++ xscreensaver/hacks/screenhack.c    2008-07-17 00:07:00.000000000 +0200
-@@ -882,6 +882,8 @@
-       window = VirtualRootWindowOfScreen (XtScreen (toplevel));
-       XtDestroyWidget (toplevel);
-       XGetWindowAttributes (dpy, window, &xgwa);
-+      /* With RANDR, the root window can resize! */
-+      XSelectInput (dpy, window, xgwa.your_event_mask | StructureNotifyMask);
-       visual_warning (xgwa.screen, window, xgwa.visual, xgwa.colormap, False);
-     }
-   else
diff --git a/xscreensaver/debian/patches/20_hacks_Makefile.patch b/xscreensaver/debian/patches/20_hacks_Makefile.patch
deleted file mode 100644 (file)
index 8bd235d..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-Index: xscreensaver-5.04/hacks/Makefile.in
-===================================================================
---- xscreensaver-5.04.orig/hacks/Makefile.in   2007-11-13 09:39:36.000000000 +0100
-+++ xscreensaver-5.04/hacks/Makefile.in        2007-12-08 17:46:35.000000000 +0100
-@@ -617,7 +617,7 @@
-       $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(HACK_LIBS)
- maze:         maze.o          $(HACK_OBJS) $(ERASE) $(LOGO)
--      $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(ERASE) $(LOGO) $(HACK_LIBS)
-+      $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(ERASE) $(LOGO) $(HACK_LIBS) $(XPM_LIBS)
- moire:                moire.o         $(HACK_OBJS) $(COL) $(SHM)
-       $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(COL) $(SHM) $(HACK_LIBS)
diff --git a/xscreensaver/debian/patches/21_driver_xscreensaver-getimage-video b/xscreensaver/debian/patches/21_driver_xscreensaver-getimage-video
deleted file mode 100644 (file)
index fd49b98..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-Index: xscreensaver-5.04/driver/xscreensaver-getimage-video
-===================================================================
---- xscreensaver-5.04.orig/driver/xscreensaver-getimage-video  2007-06-06 23:46:24.000000000 +0200
-+++ xscreensaver-5.04/driver/xscreensaver-getimage-video       2007-12-08 19:03:34.000000000 +0100
-@@ -33,6 +33,8 @@
- my $tmpdir   = $ENV{TMPDIR} || "/tmp";
- my $tmpfile  = sprintf("%s/xssv.%08x.ppm", $tmpdir, rand(0xFFFFFFFF));
-+my $tmpfile1 = sprintf ("%s/xssgv01.ppm", $tmpdir, rand(0xFFFFFFFF));
-+my $tmpfile3 = sprintf ("%s/xssgv03.ppm", $tmpdir, rand(0xFFFFFFFF));
- my $verbose           = 0;
- my $use_stdout_p      = 0;
-@@ -47,7 +49,7 @@
- # If you add other programs to this list, please let me know!
- #
- my @programs = (
--
-+  "streamer -a -t3 -r1 -o $tmpfile1; mv $tmpfile3 $tmpfile",          # XawTV after 2 sec
-   "bttvgrab -d q -Q -l 1 -o ppm -f $tmpfile", # BTTV
-   "qcam > $tmpfile",                          # Connectix Qcam
-   "gqcam -t PPM -d $tmpfile",                 # GTK+ Qcam clone
diff --git a/xscreensaver/debian/patches/22_hacks_barcode.patch b/xscreensaver/debian/patches/22_hacks_barcode.patch
deleted file mode 100644 (file)
index 4c83d46..0000000
+++ /dev/null
@@ -1,57 +0,0 @@
-Index: xscreensaver-5.04/hacks/barcode.c
-===================================================================
---- xscreensaver-5.04.orig/hacks/barcode.c     2006-04-06 08:40:32.000000000 +0200
-+++ xscreensaver-5.04/hacks/barcode.c  2007-12-08 17:46:48.000000000 +0100
-@@ -117,8 +117,6 @@
-   "belly",
-   "bliss",
-   "bogosity",
--  "boobies",
--  "boobs",
-   "booty",
-   "bread",
-   "bubba",
-@@ -131,7 +129,6 @@
-   "children",
-   "chocolate",
-   "CLONE",
--  "cock",
-   "constriction",
-   "contrition",
-   "cop",
-@@ -171,7 +168,6 @@
-   "fear",
-   "fever",
-   "filth",
--  "flatulence",
-   "fluff",
-   "fnord",
-   "freedom",
-@@ -188,10 +184,7 @@
-   "happiness",
-   "hate",
-   "helplessness",
--  "hemorrhoid",
-   "hermaphrodite",
--  "heroin",
--  "heroine",
-   "hope",
-   "hysteria",
-   "icepick",
-@@ -265,7 +258,6 @@
-   "punishment",
-   "punk rock",
-   "punk",
--  "pussy",
-   "quagmire",
-   "quarantine",
-   "quartz",
-@@ -333,8 +325,6 @@
-   "vegetarian",
-   "venom",
-   "verifiability",
--  "viagra",
--  "vibrator",
-   "victim",
-   "vignette",
-   "villainy",
diff --git a/xscreensaver/debian/patches/23_hacks_glx_glsnake.patch b/xscreensaver/debian/patches/23_hacks_glx_glsnake.patch
deleted file mode 100644 (file)
index 05259db..0000000
+++ /dev/null
@@ -1,49 +0,0 @@
-Index: xscreensaver-5.04/hacks/glx/glsnake.c
-===================================================================
---- xscreensaver-5.04.orig/hacks/glx/glsnake.c 2006-05-03 21:39:21.000000000 +0200
-+++ xscreensaver-5.04/hacks/glx/glsnake.c      2007-12-08 17:46:53.000000000 +0100
-@@ -535,7 +535,7 @@
-       PIN, ZERO, RIGHT, RIGHT, ZERO, PIN, PIN, ZERO, PIN, PIN, ZERO,
-       RIGHT, ZERO }
-     },
--    { "k's turd",
-+    { "caterpillar",
-       { RIGHT, RIGHT, PIN, RIGHT, LEFT, RIGHT, PIN, RIGHT, LEFT,
-       RIGHT, PIN, RIGHT, LEFT, RIGHT, PIN, RIGHT, LEFT, RIGHT, PIN,
-       RIGHT, LEFT, RIGHT, PIN, ZERO }
-@@ -560,22 +560,22 @@
-       ZERO, PIN, ZERO, ZERO, ZERO, ZERO, PIN, ZERO, ZERO, ZERO, ZERO,
-       ZERO, ZERO, ZERO }
-     },
--    { "kissy box",
-+    { "ribbon",
-       { PIN, ZERO, ZERO, ZERO, PIN, ZERO, ZERO, ZERO, ZERO, ZERO,
-       ZERO, PIN, ZERO, ZERO, ZERO, ZERO, PIN, ZERO, ZERO, ZERO, ZERO,
-       ZERO, PIN, ZERO }
-     },
--    { "erect penis",     /* thanks benno */
-+    { "shuffle board",     /* thanks benno */
-       { PIN, ZERO, PIN, PIN, ZERO, ZERO, PIN, ZERO, ZERO, ZERO, PIN,
-       PIN, ZERO, ZERO, ZERO, RIGHT, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO,
-       ZERO, ZERO }
-     },
--    { "flaccid penis",
-+    { "anchor",
-       { PIN, ZERO, PIN, PIN, ZERO, ZERO, PIN, ZERO, ZERO, ZERO, PIN,
-       PIN, ZERO, ZERO, ZERO, RIGHT, PIN, ZERO, ZERO, ZERO, ZERO, ZERO,
-       ZERO, ZERO }
-     },
--    { "vagina",
-+    { "engagement ring",
-       { RIGHT, ZERO, ZERO, ZERO, RIGHT, ZERO, ZERO, PIN, ZERO, ZERO,
-       LEFT, ZERO, ZERO, ZERO, LEFT, ZERO, LEFT, PIN, LEFT, PIN, RIGHT,
-       PIN, RIGHT, ZERO }
-@@ -995,7 +995,7 @@
-     { "Parrot",
-         { ZERO, ZERO, ZERO, ZERO, RIGHT, RIGHT, ZERO, LEFT, PIN, RIGHT, ZERO, RIGHT, ZERO, RIGHT, ZERO, RIGHT, PIN, LEFT, ZERO, RIGHT, LEFT, ZERO, PIN, ZERO }
-     },
--    { "Penis",
-+    { "Shuttle",
-         { PIN, PIN, RIGHT, ZERO, PIN, PIN, ZERO, PIN, ZERO, ZERO, RIGHT, PIN, LEFT, ZERO, ZERO, PIN, ZERO, PIN, PIN, ZERO, LEFT, PIN, PIN, ZERO }
-     },
-     { "PictureComingSoon",
diff --git a/xscreensaver/debian/patches/30_hacks_xanalogtv.patch b/xscreensaver/debian/patches/30_hacks_xanalogtv.patch
deleted file mode 100644 (file)
index e572a24..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-Index: xscreensaver-5.04/hacks/xanalogtv.c
-===================================================================
---- xscreensaver-5.04.orig/hacks/xanalogtv.c   2006-03-31 09:21:41.000000000 +0200
-+++ xscreensaver-5.04/hacks/xanalogtv.c        2007-12-08 17:47:00.000000000 +0100
-@@ -42,7 +42,7 @@
- #include "xpm-pixmap.h"
- #include "analogtv.h"
--#include "images/logo-50.xpm"
-+#include "images/logo-50-bad.xpm"
- /* #define DEBUG 1 */
- /* #define USE_TEST_PATTERNS */
-@@ -170,7 +170,7 @@
-   ypos += st->ugly_font.char_h*5/2;
-   analogtv_draw_xpm(st->tv, input,
--                    logo_50_xpm, xpos - 100, ypos);
-+                    logo_50_bad_xpm, xpos - 100, ypos);
-   ypos += 58;
diff --git a/xscreensaver/debian/patches/31_utils_images_logo-50-bad-xpm.patch b/xscreensaver/debian/patches/31_utils_images_logo-50-bad-xpm.patch
deleted file mode 100644 (file)
index e216c67..0000000
+++ /dev/null
@@ -1,123 +0,0 @@
-Index: xscreensaver-5.04/utils/images/logo-50-bad.xpm
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ xscreensaver-5.04/utils/images/logo-50-bad.xpm     2007-12-08 17:47:04.000000000 +0100
-@@ -0,0 +1,118 @@
-+/* XPM */
-+static char * logo_50_bad_xpm[] = {
-+"50 50 65 1",
-+"     c None",
-+".    c #070800",
-+"+    c #440000",
-+"@    c #5A0200",
-+"#    c #3B1C01",
-+"$    c #551113",
-+"%    c #303019",
-+"&    c #353402",
-+"*    c #323433",
-+"=    c #D10400",
-+"-    c #DC0003",
-+";    c #474624",
-+">    c #E60000",
-+",    c #464745",
-+"'    c #4F5000",
-+")    c #EF0000",
-+"!    c #C71516",
-+"~    c #FF0000",
-+"{    c #535452",
-+"]    c #C62C02",
-+"^    c #B52E26",
-+"/    c #8C4444",
-+"(    c #6A6601",
-+"_    c #60615F",
-+":    c #FF2500",
-+"<    c #855D5B",
-+"[    c #C84D00",
-+"}    c #A56000",
-+"|    c #C64344",
-+"1    c #E83534",
-+"2    c #965959",
-+"3    c #6D6D6E",
-+"4    c #F43E01",
-+"5    c #868500",
-+"6    c #EC5803",
-+"7    c #7A7C79",
-+"8    c #A66E6E",
-+"9    c #81848A",
-+"0    c #EE7200",
-+"a    c #8D8E8B",
-+"b    c #A99C00",
-+"c    c #D48D00",
-+"d    c #93929F",
-+"e    c #99979B",
-+"f    c #F08B00",
-+"g    c #EC7B79",
-+"h    c #A2A0B2",
-+"i    c #BB9B9B",
-+"j    c #A7A9A6",
-+"k    c #F7A400",
-+"l    c #C6B52F",
-+"m    c #ACABBD",
-+"n    c #ECB800",
-+"o    c #D5C800",
-+"p    c #C8B2C2",
-+"q    c #EAC700",
-+"r    c #BFC1BE",
-+"s    c #FBA8AB",
-+"t    c #BFC0D0",
-+"u    c #C6CADA",
-+"v    c #CED1CD",
-+"w    c #D3D3DE",
-+"x    c #DEDFE9",
-+"y    c #E1E3DF",
-+"z    c #F5F6F3",
-+"                                                  ",
-+"                         ~k5                      ",
-+"                         ~4q.                     ",
-+"                         ~~fb.                    ",
-+"                          ~:q&.                   ",
-+"                          ~~f5.                   ",
-+"                         ~~~0o.                   ",
-+"                        ~:~~0o.                   ",
-+"                       ~~~~~k(.                   ",
-+"                      ~~~~~6q..~:n(.              ",
-+"                      )~:~:n(+~:fb.               ",
-+"                     ~~:~~k5@~~0o..               ",
-+"                    ~~~~~0q+:~:n&.                ",
-+"                   ~)~~~6q#~~~0q.                 ",
-+"                  ~~:~~:n'>~~:k(.                 ",
-+"     _____________^~)~~0o$~~~0o._____________     ",
-+"   __9mmmmmmmmhmhi~~~~:n'|~~~fb{hdddddddddd93_    ",
-+"   _hxxxyyyyxwxvxg)~:~6q*1)~~k(duuwuuuuttttth9_   ",
-+"  {3wxuttttttpgld1~~~~4q,>~~)k(jxwxxwxxxxxxxth_   ",
-+"  _dxwpmd9dad|1n%1~~)::n&)>:>f53dedddedeeemxwm3_  ",
-+"  _axwtd,3337-4n;^~~~):k())~)0o*737337373{_wwm3_  ",
-+"  _9wutd,zzzz::k's)))~)0l>)))-n;zzzzzzzzze_xwm3_  ",
-+"  _9xupd{zzzs~)f5i)):))4q-)):)0bezzzzzzzze_xwm3_  ",
-+"  39xutd,zxzg):6n3>)):)>f=~>>>4n;zxzzzzzze_xwm3_  ",
-+"  _9xutd,yxy1))4n;g)))~>66>)>>>f5jxxxxxxyd_xum3_  ",
-+"  _9xwtd{yyx1))>f5i)))>)-6>)-)=4n;yyyyyyyd_xwm3_  ",
-+"  _9xutd{xvx>)))4n;1>)>>>4-)>->-05avvvvvve{xwm3_  ",
-+"  39xwtd{vvv-)>>-6l2>>)>>>-)>>--=n;wvwvwva3xwm3_  ",
-+"  _9xwpd{trv1)>)>>6b!>>>->-->>>--0b_rtrrt7_xwm3_  ",
-+"  _9xute{rpr->)>->-40>>>>>>>---=-=c'jrrje3_xwm3_  ",
-+"  _dxutd{jjr1--)>>--->---->-------[l*,****_xwm3_  ",
-+"  _9xwtd_jmj|>)->->-->->->--------=n%*****_xwm3_  ",
-+"  _9xttd_jej8>>-)->-->----------===c'*****_xum3_  ",
-+"  _exutd{eeee>->--------------===-=c(*****3xwm3_  ",
-+"  _9xutd_aaaa^>-------=---=========c'*****3xum3_  ",
-+"  _9xutd{99998-----=---==--=-=====]l.,,,**3xwm3_  ",
-+"  _9xwpd_33_3_^>----=========-===]}5*,,,,*_xwm3_  ",
-+"  39xuud_*,,,,,!-====-=-==-=====-[n.{{,,,*3xwm3_  ",
-+"  _9xttd_;,,,{{{!====-==========[b%,{{{,,*<xum3_  ",
-+"  _9xwtd_*,,,{{{_/=-==!=======]}(*{{<{{,,,3xwm3_  ",
-+"  _dxupd_,,,{{___33<^]!=]=]]!}(%_33_{{{,,*3xwm3_  ",
-+"  _9xwth{,,,{{{___733777933__939333{3{{{{,3xwm3_  ",
-+"  _9xutd_,,{{{_33_377999ae9aa993333_3{{{,,3xwm3_  ",
-+"  _9xuphd99999999999997a99a9979999999d9999exwm3_  ",
-+"  3axuttppptptttwutwwuwtwwwwwwwwxwwwwwwpwwxxwm3_  ",
-+"  _9xwttttututwtutwtuwuwwwwwwwwwxwwxwxxwxwxxwm3_  ",
-+"  _3xwtttttttttwuwwtwwwwuwwwwwwwwwxxwxwuuwxxuh3   ",
-+"   3mxxxwxxxxxwwwwwwxuwwwwwuwwwwwwwpwuuwwuutm9_   ",
-+"   _3dptttttttttmttmmmmmtmmpmmphhhhmhphhhhhd9{_   ",
-+"    {_______{____{___________{___3___{____{{_     "};
diff --git a/xscreensaver/debian/patches/50_driver_screensaver-properties-desktop.patch b/xscreensaver/debian/patches/50_driver_screensaver-properties-desktop.patch
deleted file mode 100644 (file)
index 0ff43de..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-Index: xscreensaver-5.04/driver/screensaver-properties.desktop.in
-===================================================================
---- xscreensaver-5.04.orig/driver/screensaver-properties.desktop.in    2003-12-15 12:16:12.000000000 +0100
-+++ xscreensaver-5.04/driver/screensaver-properties.desktop.in 2007-12-08 17:48:44.000000000 +0100
-@@ -1,6 +1,6 @@
- [Desktop Entry]
- Exec=xscreensaver-demo
--Icon=xscreensaver
-+Icon=xscreensaver.svg
- Terminal=false
- _Name=Screensaver
- _Comment=Change screensaver properties
diff --git a/xscreensaver/debian/patches/52_driver_XScreenSaver.ad.in b/xscreensaver/debian/patches/52_driver_XScreenSaver.ad.in
deleted file mode 100644 (file)
index 2dc60c9..0000000
+++ /dev/null
@@ -1,406 +0,0 @@
---- xscreensaver-5.02/driver/XScreenSaver.ad.in        2007-04-20 23:33:17.000000000 -0400
-+++ xscreensaver-5.02diffed/driver/XScreenSaver.ad.in  2007-06-26 05:02:00.000000000 -0400
-@@ -4,8 +4,8 @@
- !            a screen saver and locker for the X window system
- !                            by Jamie Zawinski
- !
--!                              version 5.02
--!                              20-Apr-2007
-+!                              version 4.24
-+!                              08-Feb-2006
- !
- ! See "man xscreensaver" for more info.  The latest version is always
- ! available at http://www.jwz.org/xscreensaver/
-@@ -31,19 +31,20 @@
- *mode:                        random
- *timeout:             0:10:00
- *cycle:                       0:10:00
--*lockTimeout:         0:00:00
-+*lockTimeout:         0:20:00
- *passwdTimeout:               0:00:30
--*dpmsEnabled:         False
--*dpmsStandby:         2:00:00
--*dpmsSuspend:         2:00:00
--*dpmsOff:             4:00:00
--*grabDesktopImages:   True
-+*dpmsEnabled:         True
-+*dpmsStandby:         1:00:00
-+*dpmsSuspend:         1:00:00
-+*dpmsOff:             2:00:00
-+*grabDesktopImages:   False
- *grabVideoFrames:     False
- *chooseRandomImages:  @DEFAULT_IMAGES_P@
- *imageDirectory:      @DEFAULT_IMAGE_DIRECTORY@
- *nice:                        10
- *memoryLimit:         0
--*lock:                        False
-+*lock:                        True
-+*lockVTs:             True
- *verbose:             False
- *timestamp:           True
- *fade:                        True
-@@ -53,14 +54,14 @@
- *splash:              True
- *splashDuration:      0:00:05
- *visualID:            default
--*captureStderr:       True
-+*captureStderr:       False
- *ignoreUninstalledPrograms: False
--*textMode:            file
-+*textMode:            url
- *textLiteral:         XScreenSaver
--*textFile:            @DEFAULT_TEXT_FILE@
-+*textFile:            /usr/share/doc/xserver-common/copyright
- *textProgram:         fortune
--*textURL:             http://www.livejournal.com/stats/latest-rss.bml
-+*textURL:             http://planet.debian.org/rss20.xml
- *overlayTextForeground:       #FFFF00
- *overlayTextBackground:       #000000
-@@ -90,34 +91,41 @@
- ! manualCommand -- how the "Documentation" buttons display man pages.
- !
- ! And there are so very many options to choose from!
-+
-+*loadURL: x-www-browser '%s'
-+*manualCommand: x-terminal-emulator -title '%s manual' \
-+              -e '/bin/sh -c "man %s; read foo"'
-+
- !
- !   Gnome 2.4, 2.6: (yelp can't display man pages, as of 2.6.3)
- !
--@GNOME24@*loadURL: @WITH_BROWSER@ '%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'
-+#@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
- ! (see the strftime(3) manual page for details.)
--*dateFormat:          %d-%b-%y (%a); %I:%M %p
-+*dateFormat:  %Y-%m-%d %H:%M:%S
-+! Original upstream date format:
-+! *dateFormat:                %d-%b-%y (%a); %I:%M %p
- ! To show the time only:
- ! *dateFormat:                %I:%M %p
- ! For 24 hour time:
-@@ -127,7 +135,7 @@
- ! This command is executed by the "New Login" button on the lock dialog.
- ! (That button does not appear if this program does not exist.)
- !
--@NEW_LOGIN_COMMAND_P@*newLoginCommand:        @NEW_LOGIN_COMMAND@
-+*newLoginCommand:     gdmflexiserver -l -a -c FLEXI_XSERVER
- ! Turning on "installColormap" on 8-bit systems interacts erratically with
-@@ -153,30 +161,34 @@
-          "Qix (transparent)"  qix -root -count 4 -solid -transparent      \n\
-               "Qix (linear)"  qix -root -count 5 -solid -transparent        \
-                                 -linear -segments 250 -size 100           \n\
-+-                "Qix (xor)"  qix -root -linear -count 5 -size 200          \
-+                                -spread 30 -segments 75 -solid -xor       \n\
-                                                                             \
-         "Attraction (balls)"  attraction -root -mode balls                \n\
-         "Attraction (lines)"  attraction -root -mode lines -points 3        \
-                                 -segments 200                             \n\
---     "Attraction (splines)"  attraction -root -mode splines -segments      \
-+-        "Attraction (poly)"  attraction -root -mode polygons             \n\
-+      "Attraction (splines)"  attraction -root -mode splines -segments      \
-                                 300                                       \n\
---     "Attraction (orbital)"  attraction -root -mode lines -radius 300      \
-+      "Attraction (orbital)"  attraction -root -mode lines -radius 300      \
-                                 -orbit -vmult 0.5                         \n\
-                                                                             \
-                               pyro -root                                  \n\
-                               rocks -root                                 \n\
-                               helix -root                                 \n\
-                               pedal -root                                 \n\
--                              rorschach -root                             \n\
-+                              rorschach -root -offset 7                   \n\
-                               hopalong -root                              \n\
-                               greynetic -root                             \n\
-                               imsmap -root                                \n\
-                               slidescreen -root                           \n\
-                               decayscreen -root                           \n\
-                               jigsaw -root                                \n\
--                              blitspin -root                              \n\
-+                              blitspin -root -grab                        \n\
-                               slip -root                                  \n\
-                               distort -root                               \n\
-                               spotlight -root                             \n\
-+            "Ripples (oily)"  ripples -root -oily -light 2                \n\
-             "Ripples (stir)"  ripples -root -oily -light 2 -stir          \n\
-          "Ripples (desktop)"  ripples -root -water -light 6               \n\
-                               hypercube -root                             \n\
-@@ -193,7 +205,8 @@
-                               strange -root                               \n\
- -                             spiral -root                                \n\
-                               laser -root                                 \n\
--                              grav -root                                  \n\
-+                              grav -root                                  \n\
-+             "Grav (trails)"  grav -root -trail -decay                    \n\
-                               drift -root                                 \n\
-                               ifs -root                                   \n\
-                               julia -root                                 \n\
-@@ -208,14 +221,16 @@
-                               forest -root                                \n\
- -                             lisa -root                                  \n\
- -                             lissie -root                                \n\
--                              goop -root                                  \n\
-+                              goop -root -max-velocity 0.5 -elasticity      \
-+                                0.9                                       \n\
-                               starfish -root                              \n\
-+           "Starfish (blob)"  starfish -root -blob                        \n\
-                               munch -root                                 \n\
-                               mismunch -root                              \n\
-                               fadeplot -root                              \n\
--                              coral -root                                 \n\
-+                              coral -root -delay 0                        \n\
-                               mountain -root                              \n\
--                              triangle -root                              \n\
-+                              triangle -root -delay 1                     \n\
- -                             worm -root                                  \n\
- -                             rotor -root                                 \n\
- -                             demon -root                                 \n\
-@@ -223,12 +238,12 @@
- -                             vines -root                                 \n\
-                               kaleidescope -root                          \n\
-                               xjack -root                                 \n\
--                              xlyap -root                                 \n\
-+                              xlyap -root -randomize                      \n\
-                               cynosure -root                              \n\
-                               flow -root                                  \n\
-                               epicycle -root                              \n\
-                               interference -root                          \n\
--                              truchet -root                               \n\
-+                              truchet -root -randomize                    \n\
-                               bsod -root                                  \n\
-                               crystal -root                               \n\
-                               discrete -root                              \n\
-@@ -248,7 +263,7 @@
- -                             critical -root                              \n\
-                               phosphor -root                              \n\
-                               xmatrix -root                               \n\
--                              petri -root                                 \n\
-+                              petri -root -size 2 -count 20               \n\
-                    "Petri 2"  petri -root -minlifespeed 0.02                \
-                                 -maxlifespeed 0.03 -minlifespan 1           \
-                                 -maxlifespan 1 -instantdeathchan 0          \
-@@ -257,16 +272,22 @@
-                               ccurve -root                                \n\
-                               blaster -root                               \n\
-                               bumps -root                                 \n\
-+                              xteevee -root                               \n\
-                               xanalogtv -root                             \n\
-                               xspirograph -root                           \n\
-                               nerverot -root                              \n\
-+-         "NerveRot (dense)"  nerverot -root -count 1000                  \n\
-+-         "NerveRot (thick)"  nerverot -root -count 100 -line-width 4       \
-+                              -max-nerve-radius 0.8 -nervousness 0.5 -db  \n\
-                               xrayswarm -root                             \n\
- -            "Zoom (Fatbits)" zoom -root                                  \n\
-              "Zoom (Lenses)"  zoom -root -lenses                          \n\
-                               rotzoomer -root                             \n\
-+-        "RotZoomer (mobile)" rotzoomer -root -move                       \n\
-+-        "RotZoomer (sweep)"  rotzoomer -root -sweep                      \n\
-                               whirlwindwarp -root                         \n\
--                              whirlygig -root                             \n\
--                              speedmine -root                             \n\
-+                  "WhirlyGig" whirlygig -root                             \n\
-+                  "SpeedMine" speedmine -root                             \n\
-                   "SpeedWorm" speedmine -root -worm                       \n\
-                               vermiculate -root                           \n\
-                               twang -root                                 \n\
-@@ -286,7 +307,8 @@
-                               barcode -root                               \n\
-                               piecewise -root                             \n\
-                               cloudlife -root                             \n\
--                              fontglide -root                             \n\
-+                 "FontGlide"  fontglide -root -page                       \n\
-+      "FontGlide (scroller)"  fontglide -root -scroll                     \n\
-                               apple2 -root                                \n\
-                                 bubbles -root                             \n\
-                               pong -root                                  \n\
-@@ -296,6 +318,7 @@
-                               anemotaxis -root                            \n\
-                               memscroller -root                           \n\
-                               substrate -root                             \n\
-+       "Substrate (circles)"  substrate -root -circle-percent 33          \n\
-                               intermomentary -root                        \n\
-                               interaggregate -root                        \n\
-                               fireworkx -root                             \n\
-@@ -309,6 +332,7 @@
- - default-n:                  vidwhacker -root                            \n\
-                                                                             \
- @GL_KLUDGE@ GL:                       gears -root                                 \n\
-+@GL_KLUDGE@ GL:       "Gears (planetary)" gears -root -planetary                  \n\
- @GL_KLUDGE@ GL:                       superquadrics -root                         \n\
- @GL_KLUDGE@ GL:                       morph3d -root                               \n\
- @GL_KLUDGE@ GL:                       cage -root                                  \n\
-@@ -317,11 +341,11 @@
- @GL_KLUDGE@ GL:                       pipes -root                                 \n\
- @GL_KLUDGE@ GL:                       sproingies -root                            \n\
- @GL_KLUDGE@ GL:                       rubik -root                                 \n\
--@GL_KLUDGE@ GL:                       atlantis -root                              \n\
-+@GL_KLUDGE@ GL:                       atlantis -root -gradient                    \n\
- @GL_KLUDGE@ GL:                       lament -root                                \n\
- @GL_KLUDGE@ GL:                       bubble3d -root                              \n\
- @GL_KLUDGE@ GL:                       glplanet -root                              \n\
--@GL_KLUDGE@ GL:                       flurry -root                                \n\
-+@GL_KLUDGE@ GL:                       flurry -root -preset random                 \n\
- @GL_KLUDGE@ GL:                       pulsar -root                                \n\
- -        GL:     "Pulsar (textures)"                                        \
-                                 pulsar -root -texture -mipmap               \
-@@ -329,20 +353,20 @@
- @GLE_KLUDGE@GL:                       extrusion -root                             \n\
- @GL_KLUDGE@ GL:                       sierpinski3d -root                          \n\
- @GL_KLUDGE@ GL:                       menger -root                                \n\
--@GL_KLUDGE@ GL:                       gflux -root                                 \n\
-+@GL_KLUDGE@ GL:        "GFlux"        gflux -root                                 \n\
- @GL_KLUDGE@ GL:        "GFlux (grab)" gflux -root -mode grab                      \n\
- @GL_KLUDGE@ GL:                       stonerview -root                            \n\
- @GL_KLUDGE@ GL:                       starwars -root                              \n\
- @GL_KLUDGE@ GL:                       gltext -root                                \n\
- @GL_KLUDGE@ GL:       "GLText (clock)" gltext -text "%A%n%d %b %Y%n%r" -root      \n\
--@GL_KLUDGE@ GL:                       molecule -root                              \n\
-+@GL_KLUDGE@ GL:                       molecule -root -shells                      \n\
- @GL_KLUDGE@ GL:                       dangerball -root                            \n\
- @GL_KLUDGE@ GL:                       circuit -root                               \n\
- @GL_KLUDGE@ GL:                       engine -root                                \n\
- @GL_KLUDGE@ GL:                       flipscreen3d -root                          \n\
- @GL_KLUDGE@ GL:                       glsnake -root                               \n\
- @GL_KLUDGE@ GL:                       boxed -root                                 \n\
---        GL:                  glforestfire -root                          \n\
-+-        GL:  "GLForestFire"          glforestfire -root                  \n\
- -        GL:  "GLForestFire (rain)"   glforestfire -root -count 0         \n\
- -        GL:                  sballs -root                                \n\
- @GL_KLUDGE@ GL:                       cubenetic -root                             \n\
-@@ -354,9 +378,10 @@
- @GL_KLUDGE@ GL:                       atunnel -root                               \n\
- @GL_KLUDGE@ GL:                       flyingtoasters -root                        \n\
- @GL_KLUDGE@ GL:                       bouncingcow -root                           \n\
--@GL_KLUDGE@ GL:                       jigglypuff -root                            \n\
--@GL_KLUDGE@ GL:                       klein -root                                 \n\
--@GL_KLUDGE@ GL:                       hypertorus -root                            \n\
-+@GL_KLUDGE@ GL:                       jigglypuff -root -random                    \n\
-+@GL_KLUDGE@ GL:                       klein -root -random                         \n\
-+@GL_KLUDGE@ GL:       "HyperTorus (striped)" hypertorus -root                     \n\
-+@GL_KLUDGE@ GL:       "HyperTorus (solid)"   hypertorus -root -solid -transparent \n\
- @GL_KLUDGE@ GL:                       glmatrix -root                              \n\
- @GL_KLUDGE@ GL:                       cubestorm -root                             \n\
- @GL_KLUDGE@ GL:                       glknots -root                               \n\
-@@ -381,15 +406,17 @@
- @GL_KLUDGE@ GL:                       fliptext -root                              \n\
- -        GL:                  antmaze -root                               \n\
- @GL_KLUDGE@ GL:                       tangram -root                               \n\
--@GL_KLUDGE@ GL:                       crackberg -root                             \n\
-+@GL_KLUDGE@ GL:                       crackberg -root -flat -lit -crack             \
-+                               -color random                              \n\
- @GL_KLUDGE@ GL:                       glhanoi -root                               \n\
--@GL_KLUDGE@ GL:                       cube21 -root                                \n\
-+@GL_KLUDGE@ GL:                       cube21 -root -colormode six                 \n\
- @GL_KLUDGE@ GL:                       timetunnel -root                            \n\
- @GL_KLUDGE@ GL:                       juggler3d -root                             \n\
--@GL_KLUDGE@ GL:                       topblock -root                              \n\
--@GL_KLUDGE@ GL:                       glschool -root                              \n\
-                                                                             \
---                             xdaliclock -root -font BUILTIN3             \n\
-+-                             xdaliclock -root -builtin3 -cycle           \n\
-+- default-n:                  xearth -nofork -nostars -ncolors 50           \
-+                                -night 3 -wait 0 -timewarp 400.0 -pos       \
-+                                sunrel/38/-30                             \n\
- -                             xplanet -vroot -wait 1 -timewarp 90000        \
-                                   -label -origin moon                     \n\
- -                             xmountains -b -M -Z 0 -r 1                  \n\
-@@ -397,7 +424,8 @@
- -                               xaos -root -autopilot -nogui -delay 10000     \
-                                   -maxframerate 30                            \
-                                   -incoloring -1 -outcoloring -1            \n\
---                             xsnow -root                                 \n\
-+-                             xfishtank -d -s                             \n\
-+-                             xsnow                                       \n\
- -                             goban -root                                 \n\
- -                             electricsheep                               \n\
- -                             cosmos -root                                \n\
-@@ -426,7 +454,6 @@
- *Dialog.headingFont:          *-helvetica-bold-r-*-*-*-180-*-*-*-iso8859-1
- *Dialog.bodyFont:             *-helvetica-bold-r-*-*-*-140-*-*-*-iso8859-1
- *Dialog.labelFont:            *-helvetica-bold-r-*-*-*-140-*-*-*-iso8859-1
--*Dialog.unameFont:            *-helvetica-bold-r-*-*-*-120-*-*-*-iso8859-1
- *Dialog.buttonFont:           *-helvetica-bold-r-*-*-*-140-*-*-*-iso8859-1
- *Dialog.dateFont:             *-helvetica-medium-r-*-*-*-80-*-*-*-iso8859-1
- ! Helvetica asterisks look terrible.
-@@ -452,16 +479,15 @@
- *Dialog.shadowThickness:      2
- *passwd.heading.label:                XScreenSaver %s
--*passwd.body.label:           This screen is locked.
--*passwd.unlock.label:         OK
-+*passwd.body.label:           Please enter your password.
- *passwd.login.label:          New Login
- *passwd.user.label:           Username:
-+*passwd.passwd.label:         Password:
- *passwd.thermometer.width:    8
- *passwd.asterisks:              True
--*passwd.uname:                  True
- *splash.heading.label:                XScreenSaver %s
--*splash.body.label:           Copyright © 1991-2006 by
-+*splash.body.label:           Copyright © 1991-2005 by
- *splash.body2.label:          Jamie Zawinski <jwz@jwz.org>
- *splash.demo.label:           Settings
- *splash.help.label:           Help
-@@ -485,6 +511,7 @@
- *hacks.t3d.name:            T3D
- *hacks.shadebobs.name:      ShadeBobs
- *hacks.ccurve.name:         C Curve
-+*hacks.xteevee.name:        XTeeVee
- *hacks.xanalogtv.name:      XAnalogTV
- *hacks.xspirograph.name:    XSpiroGraph
- *hacks.nerverot.name:       NerveRot
-@@ -528,8 +555,6 @@
- *hacks.boxfit.name:         BoxFit
- *hacks.fliptext.name:       FlipText
- *hacks.glhanoi.name:        GLHanoi
--*hacks.topblock.name:       TopBlock
--*hacks.glschool.name:       GLSchool
- ! obsolete, but still used by xscreensaver-demo-Xm.
- *hacks.documentation.isInstalled: True
diff --git a/xscreensaver/debian/patches/53_XScreenSaver.ad.in.patch b/xscreensaver/debian/patches/53_XScreenSaver.ad.in.patch
deleted file mode 100644 (file)
index 37391a6..0000000
+++ /dev/null
@@ -1,72 +0,0 @@
-Index: xscreensaver/driver/XScreenSaver.ad.in
-===================================================================
---- xscreensaver.orig/driver/XScreenSaver.ad.in        2008-07-16 23:39:50.000000000 +0200
-+++ xscreensaver/driver/XScreenSaver.ad.in     2008-07-16 23:39:50.000000000 +0200
-@@ -60,7 +60,7 @@
- *textLiteral:         XScreenSaver
- *textFile:            @DEFAULT_TEXT_FILE@
- *textProgram:         fortune
--*textURL:             http://www.livejournal.com/stats/latest-rss.bml
-+*textURL:             http://planet.debian.org/rss20.xml
- *overlayTextForeground:       #FFFF00
- *overlayTextBackground:       #000000
-@@ -91,16 +91,20 @@
- !
- ! And there are so very many options to choose from!
- !
-+*loadURL: x-www-browser '%s'
-+*manualCommand: x-terminal-emulator -title '%s manual' \
-+              -e '/bin/sh -c "man %s; read foo"'
-+!
- !   Gnome 2.4, 2.6: (yelp can't display man pages, as of 2.6.3)
- !
--@GNOME24@*loadURL: @WITH_BROWSER@ '%s'
--@GNOME24@*manualCommand: gnome-terminal --title '%s manual' \
-+@GNOME24@*loadURL: x-www-browser '%s'
-+@GNOME24@*manualCommand: x-terminal-emulator -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@*loadURL: x-www-browser '%s'
-+@GNOME22@*manualCommand: x-terminal-emulator -title '%s manual' \
- @GNOME22@             --command '/bin/sh -c "man %s; read foo"'
- !
- !   Gnome 1.4:
-@@ -110,8 +114,8 @@
- !
- !   non-Gnome systems:
- !
--@NOGNOME@*loadURL: firefox '%s' || mozilla '%s' || netscape '%s'
--@NOGNOME@*manualCommand: xterm -sb -fg black -bg gray75 -T '%s manual' \
-+@NOGNOME@*loadURL: x-www-browser '%s'
-+@NOGNOME@*manualCommand: x-terminal-emulator -title '%s manual' \
- @NOGNOME@                 -e /bin/sh -c 'man "%s" ; read foo'
-@@ -128,7 +132,8 @@
- ! (That button does not appear on the dialog if this program does not exist.)
- ! For Gnome: probably "gdmflexiserver -ls".  KDE, probably "kdmctl reserve".
- !
--@NEW_LOGIN_COMMAND_P@*newLoginCommand:        @NEW_LOGIN_COMMAND@
-+! @NEW_LOGIN_COMMAND_P@*newLoginCommand:      @NEW_LOGIN_COMMAND@
-+*newLoginCommand:     gdmflexiserver -l -a -c FLEXI_XSERVER
- ! Turning on "installColormap" on 8-bit systems interacts erratically with
-@@ -465,10 +470,11 @@
- *Dialog.shadowThickness:      2
- *passwd.heading.label:                XScreenSaver %s
--*passwd.body.label:           This screen is locked.
-+*passwd.body.label:           Please enter your password.
- *passwd.unlock.label:         OK
- *passwd.login.label:          New Login
- *passwd.user.label:           Username:
-+*passwd.passwd.label:         Password:
- *passwd.thermometer.width:    8
- *passwd.asterisks:              True
- *passwd.uname:                  True
diff --git a/xscreensaver/debian/patches/60_add-ant-hack.patch b/xscreensaver/debian/patches/60_add-ant-hack.patch
deleted file mode 100644 (file)
index 7a29669..0000000
+++ /dev/null
@@ -1,27 +0,0 @@
-Index: xscreensaver-5.04/hacks/Makefile.in
-===================================================================
---- xscreensaver-5.04.orig/hacks/Makefile.in   2007-12-18 00:25:41.000000000 +0100
-+++ xscreensaver-5.04/hacks/Makefile.in        2007-12-18 00:25:51.000000000 +0100
-@@ -153,7 +153,7 @@
-                 interaggregate.o celtic.o cwaves.o webcollage-cocoa.o \
-                 webcollage-helper-cocoa.o m6502.0 asm6502.o abstractile.o \
-                 lcdscrub.c
--NEXES         = attraction blitspin bouboule braid bubbles decayscreen deco \
-+NEXES         = attraction ant blitspin bouboule braid bubbles decayscreen deco \
-                 drift flag flame forest vines galaxy grav greynetic halo \
-                 helix hopalong hypercube ifs imsmap julia kaleidescope \
-                 laser lightning lisa lmorph maze moire noseguy pedal \
-Index: xscreensaver-5.04/driver/XScreenSaver.ad.in
-===================================================================
---- xscreensaver-5.04.orig/driver/XScreenSaver.ad.in   2007-12-18 00:26:05.000000000 +0100
-+++ xscreensaver-5.04/driver/XScreenSaver.ad.in        2007-12-18 00:26:50.000000000 +0100
-@@ -305,6 +305,7 @@
-                               cwaves -root                                \n\
-                               m6502 -root                                 \n\
-                               abstractile -root                           \n\
-+                              ant -root                                   \n\
- -                             lcdscrub -root                              \n\
- - default-n:                  webcollage -root                            \n\
- - default-n:  "WebCollage (whacked)"                                        \
-                               webcollage -root -filter                      \
diff --git a/xscreensaver/debian/patches/70_fix_local_screenlock_bypass.patch b/xscreensaver/debian/patches/70_fix_local_screenlock_bypass.patch
deleted file mode 100644 (file)
index 967efb2..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
---- xscreensaver-5.07-orig/driver/mlstring.c   2009-08-17 00:57:51.000000000 -0400
-+++ xscreensaver-5.07-mod/driver/mlstring.c    2009-08-17 00:56:56.000000000 -0400
-@@ -153,6 +153,8 @@ mlstring_wrap(mlstring *mstring, XFontSt
-         
-         if (wrap_at == -1) /* No space found, hard wrap */
-           wrap_at = line_length;
-+        else
-+            wrap_at++; /* Leave space at the end of the line */
-         newml = calloc(1, sizeof(*newml));
-         if (!newml) /* OOM, don't bother trying to wrap */
diff --git a/xscreensaver/debian/patches/series b/xscreensaver/debian/patches/series
deleted file mode 100644 (file)
index 8f90c4a..0000000
+++ /dev/null
@@ -1,25 +0,0 @@
-10_jwz-xscreensaver-randr-patch-3.patch
-20_hacks_Makefile.patch
-21_driver_xscreensaver-getimage-video
-22_hacks_barcode.patch
-23_hacks_glx_glsnake.patch
-
-# These two go together
-30_hacks_xanalogtv.patch
-31_utils_images_logo-50-bad-xpm.patch
-
-# Cosmetic, more modern style
-#40_utils_images_logo-50-xpm.patch
-#41_utils_images_logo-180-xpm.patch
-
-50_driver_screensaver-properties-desktop.patch
-
-# Needs clean-up before it will apply
-#52_driver_XScreenSaver.ad.in
-53_XScreenSaver.ad.in.patch
-
-# overrule upstream 4.23 removal
-#60_add-ant-hack.patch
-
-# security fixes
-70_fix_local_screenlock_bypass.patch
index 3452f75..41f4b96 100644 (file)
@@ -22,7 +22,7 @@ include /usr/share/quilt/quilt.make
 export DEB_HOST_GNU_TYPE  ?= $(shell dpkg-architecture -qDEB_HOST_GNU_TYPE)
 export DEB_BUILD_GNU_TYPE ?= $(shell dpkg-architecture -qDEB_BUILD_GNU_TYPE)
 
-build: patch build-stamp
+build: build-stamp
 build-stamp:
        dh_testdir