http://www.mirrorservice.org/sites/master.us.finkmirrors.net/distfiles/md5/fa43fdd68d...
[xscreensaver] / utils / grabscreen.c
index 5ef32e1e9c899005abfb0805ba572f1bdde30ecb..9bcb4264ac90d86d283b0865347be6d1570cdec0 100644 (file)
@@ -1,4 +1,4 @@
-/* xscreensaver, Copyright (c) 1992, 1993, 1994, 1997, 1998
+/* xscreensaver, Copyright (c) 1992, 1993, 1994, 1997, 1998, 2003
  *  Jamie Zawinski <jwz@jwz.org>
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
@@ -184,10 +184,12 @@ top_level_window_p (Screen *screen, Window window)
 
 
 
+static Bool error_handler_hit_p = False;
 static XErrorHandler old_ehandler = 0;
 static int
 BadWindow_ehandler (Display *dpy, XErrorEvent *error)
 {
+  error_handler_hit_p = True;
   if (error->error_code == BadWindow || error->error_code == BadDrawable)
     return 0;
   else if (!old_ehandler)
@@ -235,6 +237,7 @@ install_screen_colormaps (Screen *screen)
 
   XSync (dpy, False);
   old_ehandler = XSetErrorHandler (BadWindow_ehandler);
+  error_handler_hit_p = False;
 
   vroot = VirtualRootWindowOfScreen (screen);
   if (XQueryTree (dpy, vroot, &real_root, &parent, &kids, &nkids))
@@ -267,12 +270,19 @@ grab_screen_image (Screen *screen, Window window)
 {
   Display *dpy = DisplayOfScreen (screen);
   XWindowAttributes xgwa;
-  Window real_root = XRootWindowOfScreen (screen);  /* not vroot */
-  Bool root_p = (window == real_root);
-  Bool saver_p = xscreensaver_window_p (dpy, window);
+  Window real_root;
+  Bool root_p;
+  Bool saver_p;
   Bool grab_mouse_p = False;
   int unmap_time = 0;
 
+  real_root = XRootWindowOfScreen (screen);  /* not vroot */
+  root_p = (window == real_root);
+  saver_p = xscreensaver_window_p (dpy, window);
+
+  XGetWindowAttributes (dpy, window, &xgwa);
+  screen = xgwa.screen;
+
   if (saver_p)
     /* I think this is redundant, but just to be safe... */
     root_p = False;
@@ -300,15 +310,13 @@ grab_screen_image (Screen *screen, Window window)
 
   if (grab_verbose_p)
     {
-      XWindowAttributes xgwa2;
       fprintf(stderr,
               "\n%s: window 0x%08lX root: %d saver: %d grab: %d wait: %.1f\n",
               progname, (unsigned long) window,
               root_p, saver_p, grab_mouse_p, ((double)unmap_time)/1000000.0);
 
-      XGetWindowAttributes (dpy, window, &xgwa2);
       fprintf(stderr, "%s: ", progname);
-      describe_visual(stderr, screen, xgwa2.visual, False);
+      describe_visual(stderr, screen, xgwa.visual, False);
       fprintf (stderr, "\n");
     }
 
@@ -344,8 +352,6 @@ grab_screen_image (Screen *screen, Window window)
       usleep(unmap_time); /* wait for everyone to swap in and handle exposes */
     }
 
-  XGetWindowAttributes (dpy, window, &xgwa);
-
   if (!root_p)
     {
 #ifdef HAVE_READ_DISPLAY_EXTENSION
@@ -371,15 +377,13 @@ grab_screen_image (Screen *screen, Window window)
   else  /* root_p */
     {
       Pixmap pixmap;
-      XWindowAttributes xgwa;
-      XGetWindowAttributes(dpy, window, &xgwa);
       pixmap = XCreatePixmap(dpy, window, xgwa.width, xgwa.height, xgwa.depth);
 
 #ifdef HAVE_READ_DISPLAY_EXTENSION
       if (! read_display(screen, window, pixmap, True))
 #endif
        {
-         Window real_root = XRootWindowOfScreen (xgwa.screen); /* not vroot */
+         Window real_root = XRootWindowOfScreen (screen); /* not vroot */
          XGCValues gcv;
          GC gc;