X-Git-Url: http://git.hungrycats.org/cgi-bin/gitweb.cgi?p=xscreensaver;a=blobdiff_plain;f=utils%2Fgrabscreen.c;h=cc5b57522de05d06d31e8cee2811fc4eae033797;hp=5ef32e1e9c899005abfb0805ba572f1bdde30ecb;hb=ffd8c0873576a9e3065696a624dce6b766b77062;hpb=8eb2873d7054e705c4e83f22d18c40946a9e2529 diff --git a/utils/grabscreen.c b/utils/grabscreen.c index 5ef32e1e..cc5b5752 100644 --- a/utils/grabscreen.c +++ b/utils/grabscreen.c @@ -1,4 +1,4 @@ -/* xscreensaver, Copyright (c) 1992, 1993, 1994, 1997, 1998 +/* xscreensaver, Copyright (c) 1992, 1993, 1994, 1997, 1998, 2003, 2004 * Jamie Zawinski * * Permission to use, copy, modify, distribute, and sell this software and its @@ -117,12 +117,12 @@ xscreensaver_window_p (Display *dpy, Window window) Atom type; int format; unsigned long nitems, bytesafter; - char *version; + unsigned char *version; if (XGetWindowProperty (dpy, window, XInternAtom (dpy, "_SCREENSAVER_VERSION", False), 0, 1, False, XA_STRING, &type, &format, &nitems, &bytesafter, - (unsigned char **) &version) + &version) == Success && type != None) return True; @@ -133,7 +133,6 @@ xscreensaver_window_p (Display *dpy, Window window) /* Whether the given window is: - the real root window; - - the virtual root window; - a direct child of the root window; - a direct child of the window manager's decorations. */ @@ -142,20 +141,16 @@ top_level_window_p (Screen *screen, Window window) { Display *dpy = DisplayOfScreen (screen); Window root, parent, *kids; - Window vroot = VirtualRootWindowOfScreen(screen); unsigned int nkids; - if (window == vroot) - return True; - if (!XQueryTree (dpy, window, &root, &parent, &kids, &nkids)) return False; if (window == root) return True; - /* If our direct parent is the root (or *a* root), then yes. */ - if (parent == root || parent == vroot) + /* If our direct parent is the real root window, then yes. */ + if (parent == root) return True; else { @@ -183,11 +178,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) @@ -227,17 +223,18 @@ use_subwindow_mode_p(Screen *screen, Window window) static void install_screen_colormaps (Screen *screen) { - int i; + unsigned int i; Display *dpy = DisplayOfScreen (screen); - Window vroot, real_root; + Window real_root; Window parent, *kids = 0; unsigned int nkids = 0; 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)) + real_root = XRootWindowOfScreen (screen); /* not vroot */ + if (XQueryTree (dpy, real_root, &real_root, &parent, &kids, &nkids)) for (i = 0; i < nkids; i++) { XWindowAttributes xgwa; @@ -263,16 +260,23 @@ install_screen_colormaps (Screen *screen) void -grab_screen_image (Screen *screen, Window window) +grab_screen_image_internal (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 +304,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 +346,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 +371,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;