-/* 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
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;
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;
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 ||
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);