http://packetstormsecurity.org/UNIX/admin/xscreensaver-4.14.tar.gz
[xscreensaver] / hacks / slidescreen.c
index 9415ac22049aaccd5842e29d0b1784558e8aee97..78a30843fbb3485525402a6435811a02bbd0d427 100644 (file)
@@ -1,4 +1,4 @@
-/* xscreensaver, Copyright (c) 1992, 1993, 1994, 1996, 1997 
+/* xscreensaver, Copyright (c) 1992, 1993, 1994, 1996, 1997, 1998, 2001, 2003 
  * Jamie Zawinski <jwz@jwz.org>
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
@@ -36,9 +36,7 @@ init_slide (Display *dpy, Window window)
   Visual *visual;
 
   XGetWindowAttributes (dpy, window, &xgwa);
-  grab_screen_image (xgwa.screen, window);
-
-  XGetWindowAttributes (dpy, window, &xgwa);  /* re-retrieve colormap */
+  load_random_image (xgwa.screen, window, window, NULL);
   cmap = xgwa.colormap;
   visual = xgwa.visual;
   max_width = xgwa.width;
@@ -50,6 +48,12 @@ init_slide (Display *dpy, Window window)
   pix_inc = get_integer_resource ("pixelIncrement", "Integer");
   border = get_integer_resource ("internalBorderWidth", "InternalBorderWidth");
 
+  /* Don't let the grid be smaller than 3x3 */
+  if (grid_size > xgwa.width / 3)
+    grid_size = xgwa.width / 3;
+  if (grid_size > xgwa.height / 3)
+    grid_size = xgwa.height / 3;
+
   {
     XColor fgc, bgc;
     char *fgs = get_string_resource("background", "Background");
@@ -94,7 +98,7 @@ init_slide (Display *dpy, Window window)
        for(i = 0; i < max; i++)
          {
            long rd, gd, bd;
-           unsigned long d;
+           unsigned long dd;
            if (!fg_ok)
              {
                rd = (all[i].red   >> 8) - (fgc.red   >> 8);
@@ -103,12 +107,12 @@ init_slide (Display *dpy, Window window)
                if (rd < 0) rd = -rd;
                if (gd < 0) gd = -gd;
                if (bd < 0) bd = -bd;
-               d = (rd << 1) + (gd << 2) + bd;
-               if (d < fgd)
+               dd = (rd << 1) + (gd << 2) + bd;
+               if (dd < fgd)
                  {
-                   fgd = d;
+                   fgd = dd;
                    fg = all[i].pixel;
-                   if (d == 0)
+                   if (dd == 0)
                      fg_ok = True;
                  }
              }
@@ -121,12 +125,12 @@ init_slide (Display *dpy, Window window)
                if (rd < 0) rd = -rd;
                if (gd < 0) gd = -gd;
                if (bd < 0) bd = -bd;
-               d = (rd << 1) + (gd << 2) + bd;
-               if (d < bgd)
+               dd = (rd << 1) + (gd << 2) + bd;
+               if (dd < bgd)
                  {
-                   bgd = d;
+                   bgd = dd;
                    bg = all[i].pixel;
-                   if (d == 0)
+                   if (dd == 0)
                      bg_ok = True;
                  }
              }
@@ -197,7 +201,7 @@ init_slide (Display *dpy, Window window)
       XFillRectangle (dpy, d, gc, 0, bitmap_h - yoff, bitmap_w, yoff);
     }
 
-  XSync (dpy, True);
+  XSync (dpy, False);
   if (delay2) usleep (delay2 * 2);
  for (i = 0; i < grid_size; i += pix_inc)
    {
@@ -228,7 +232,7 @@ init_slide (Display *dpy, Window window)
      points[2].y = points[1].y;
      XFillPolygon (dpy, window, gc, points, 3, Convex, CoordModeOrigin);
 
-     XSync (dpy, True);
+     XSync (dpy, False);
      if (delay) usleep (delay);
    }
 
@@ -309,7 +313,7 @@ slide1 (Display *dpy, Window window)
         break;
        }
 
-     XSync (dpy, True);
+     XSync (dpy, False);
      if (delay) usleep (delay);
    }
  switch (dir)
@@ -357,6 +361,7 @@ screenhack (Display *dpy, Window window)
   while (1)
     {
       slide1 (dpy, window);
+      screenhack_handle_events (dpy);
       if (delay2) usleep (delay2);
     }
 }