static XImage *getWindowImage(Display * display, Window window, int32_t x, int32_t y, int32_t w, int32_t h) { XImage *image; int32_t transparentOverlays; int32_t numVisuals; XVisualInfo *pVisuals; int32_t numOverlayVisuals; OverlayInfo *pOverlayVisuals; int32_t numImageVisuals; XVisualInfo **pImageVisuals; list_ptr vis_regions; /* list of regions to read from */ list_ptr vis_image_regions ; int32_t allImage = 0 ; int32_t format = ZPixmap; /* prevent user from moving stuff around during the capture */ XGrabServer(display); /* * The following two functions live in multiVis.c-- they are pretty * much verbatim taken from the source to the xwd utility from the * X11 source. This version of the xwd source was somewhat better written * for reuse compared to Sun's version. * * ftp.x.org/pub/R6.3/xc/programs/xwd * * We use these functions since they do the very tough job of capturing * the screen correctly when it contains multiple visuals. They take into * account the depth/colormap of each visual and produce a capture as a * 24-bit RGB image so we don't have to fool around with colormaps etc. */ GetMultiVisualRegions( display, window, x, y, w, h, &transparentOverlays, &numVisuals, &pVisuals, &numOverlayVisuals, &pOverlayVisuals, &numImageVisuals, &pImageVisuals, &vis_regions, &vis_image_regions, &allImage ); image = ReadAreaToImage( display, window, x, y, w, h, numVisuals, pVisuals, numOverlayVisuals, pOverlayVisuals, numImageVisuals, pImageVisuals, vis_regions, vis_image_regions, format, allImage ); /* allow user to do stuff again */ XUngrabServer(display); /* make sure the grab/ungrab is flushed */ XSync(display, False); return image; }
XImage * CaptRoot(Display * dpy, int screen) { unsigned long swaptest = 1; XColor *colors; unsigned buffer_size; int win_name_size; int header_size; int ncolors, i; char *win_name; Bool got_win_name; XWindowAttributes win_info; XImage *image; int absx, absy, x, y; unsigned width, height; int dwidth, dheight; int bw; Window dummywin; #if 0 int transparentOverlays , multiVis; int numVisuals; XVisualInfo *pVisuals; int numOverlayVisuals; OverlayInfo *pOverlayVisuals; int numImageVisuals; XVisualInfo **pImageVisuals; list_ptr vis_regions; /* list of regions to read from */ list_ptr vis_image_regions ; Visual vis_h,*vis ; #endif int allImage = 0 ; Window window=RootWindow (dpy, screen); if (!XGetWindowAttributes(dpy, window, &win_info)) { fprintf(stderr,"Can't get target window attributes."); exit(1); } absx=0; absy=0; win_info.x = 0; win_info.y = 0; width = win_info.width; height = win_info.height; bw = 0; dwidth = DisplayWidth (dpy, screen); dheight = DisplayHeight (dpy, screen); XFetchName(dpy, window, &win_name); if (!win_name || !win_name[0]) { win_name = "xwdump"; got_win_name = False; } else { got_win_name = True; } /* sizeof(char) is included for the null string terminator. */ win_name_size = strlen(win_name) + sizeof(char); /* * Snarf the pixmap with XGetImage. */ x = absx - win_info.x; y = absy - win_info.y; #if 0 multiVis = GetMultiVisualRegions(dpy,RootWindow(dpy, screen),absx,absy, width,height,&transparentOverlays,&numVisuals,&pVisuals, &numOverlayVisuals,&pOverlayVisuals,&numImageVisuals, &pImageVisuals,&vis_regions,&vis_image_regions,&allImage) ; if (on_root || multiVis) { if (!multiVis) image = XGetImage (dpy, RootWindow(dpy, screen), absx, absy, width, height, AllPlanes, format); else image = ReadAreaToImage(dpy, RootWindow(dpy, screen), absx, absy, width, height, numVisuals,pVisuals,numOverlayVisuals,pOverlayVisuals, numImageVisuals, pImageVisuals,vis_regions, vis_image_regions,format,allImage); } else #endif image = XGetImage (dpy, window, x, y, width, height, AllPlanes, format); if (!image) { fprintf (stderr, "unable to get image at %dx%d+%d+%d\n", width, height, x, y); exit (1); } //if (add_pixel_value != 0) XAddPixel (image, add_pixel_value); return image; }