http://se.aminet.net/pub/X11/ftp.x.org/contrib/vms/xscreensaver-124.zip
[xscreensaver] / hacks / slidescreen.c
old mode 100644 (file)
new mode 100755 (executable)
index 37ca4d1..52f0d97
@@ -1,4 +1,4 @@
-/* xscreensaver, Copyright (c) 1992, 1993 Jamie Zawinski <jwz@lucid.com>
+/* xscreensaver, Copyright (c) 1992, 1993, 1994 Jamie Zawinski <jwz@mcom.com>
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
  * documentation for any purpose is hereby granted without fee, provided that
@@ -20,63 +20,36 @@ static int grid_w, grid_h;
 static int delay, delay2;
 static GC gc;
 
-static Bool
-MapNotify_event_p (dpy, event, window)
-     Display *dpy;
-     XEvent *event;
-     XPointer window;
-{
-  return (event->xany.type == MapNotify &&
-         event->xvisibility.window == (Window) window);
-}
-
-
-static Bool
-screensaver_window_p (dpy, window)
-     Display *dpy;
-     Window window;
-{
-  Atom type;
-  int format;
-  unsigned long nitems, bytesafter;
-  char *version;
-  Pixmap pixmap;
-  if (XGetWindowProperty (dpy, window,
-                         XInternAtom (dpy, "_SCREENSAVER_VERSION", False),
-                         0, 1, False, XA_STRING,
-                         &type, &format, &nitems, &bytesafter,
-                         (unsigned char **) &version)
-      == Success
-      && type != None)
-    return True;
-  return False;
-}
-
 static void
 init_slide (dpy, window)
      Display *dpy;
      Window window;
 {
   int i;
-  XEvent event;
   XGCValues gcv;
   XWindowAttributes xgwa;
   int border;
   int root_p;
   unsigned long fg;
-  Pixmap pixmap = 0;
+  Pixmap pixmap;
   Drawable d;
   Colormap cmap;
+  Visual *visual;
 
   XGetWindowAttributes (dpy, window, &xgwa);
   cmap = xgwa.colormap;
+  visual = xgwa.visual;
+
+  copy_default_colormap_contents (dpy, cmap, visual);
 
   delay = get_integer_resource ("delay", "Integer");
   delay2 = get_integer_resource ("delay2", "Integer");
   grid_size = get_integer_resource ("gridSize", "Integer");
   pix_inc = get_integer_resource ("pixelIncrement", "Integer");
   border = get_integer_resource ("internalBorderWidth", "InternalBorderWidth");
-  fg = get_pixel_resource ("background", "Background", dpy, cmap);
+  fg = get_pixel_resource ("background", "Background", dpy,
+                          /* Pixels always come out of default map. */
+                          XDefaultColormapOfScreen (xgwa.screen));
   root_p = get_boolean_resource ("root", "Boolean");
 
   if (delay < 0) delay = 0;
@@ -90,47 +63,7 @@ init_slide (dpy, window)
   gc = XCreateGC (dpy, window, GCForeground |GCFunction | GCSubwindowMode,
                  &gcv);
 
-  if (screensaver_window_p (dpy, window))
-    {
-      /* note: this assumes vroot.h didn't encapsulate the XRootWindowOfScreen
-        function, only the RootWindowOfScreen macro... */
-      Window real_root = XRootWindowOfScreen (DefaultScreenOfDisplay (dpy));
-
-      XSetWindowBackgroundPixmap (dpy, window, None);
-
-      /* prevent random viewer of the screen saver (locker) from messing
-        with windows.   We don't check whether it succeeded, because what
-        are our options, really... */
-      XGrabPointer (dpy, real_root, True, ButtonPressMask|ButtonReleaseMask,
-                   GrabModeAsync, GrabModeAsync, None, None, CurrentTime);
-      XGrabKeyboard (dpy, real_root, True, GrabModeSync, GrabModeAsync,
-                    CurrentTime);
-
-      XUnmapWindow (dpy, window);
-      XSync (dpy, True);
-      sleep (5);     /* wait for everyone to swap in and handle exposes... */
-      XMapWindow (dpy, window);
-
-      XUngrabPointer (dpy, CurrentTime);
-      XUngrabKeyboard (dpy, CurrentTime);
-
-      XSync (dpy, True);
-    }
-  else if (root_p)
-    {
-      pixmap = XCreatePixmap(dpy, window, xgwa.width, xgwa.height, xgwa.depth);
-      XCopyArea (dpy, RootWindowOfScreen (xgwa.screen), pixmap, gc,
-                xgwa.x, xgwa.y, xgwa.width, xgwa.height, 0, 0);
-      XSetWindowBackgroundPixmap (dpy, window, pixmap);
-    }
-  else
-    {
-      XSetWindowBackgroundPixmap (dpy, window, None);
-      XMapWindow (dpy, window);
-      XFlush (dpy);
-      XIfEvent (dpy, &event, MapNotify_event_p, (XPointer) window);
-      XSync (dpy, True);
-    }
+  pixmap = grab_screen_image (dpy, window, root_p);
 
   XGetWindowAttributes (dpy, window, &xgwa);
   bitmap_w = xgwa.width;
@@ -223,6 +156,7 @@ slide1 (dpy, window)
      case 1: dx = -1, dy = 0;  break;
      case 2: dx = 0,  dy = -1; break;
      case 3: dx = 1,  dy = 0;  break;
+     default: abort ();
      }
  } while (dir == last ||
          hole_x + dx < 0 || hole_x + dx >= grid_w ||
@@ -236,6 +170,7 @@ slide1 (dpy, window)
    case 1: size = 1 + (random()%hole_x);               w = size; h = 1; break;
    case 2: size = 1 + (random()%hole_y);               h = size; w = 1; break;
    case 3: size = 1 + (random()%(grid_w - hole_x - 1)); w = size; h = 1; break;
+   default: abort ();
    }
 
  if (dx == -1) hole_x -= (size - 1);