+ XWindowAttributes xgwa;
+ XImage *ximage;
+ Pixmap pixmap, p2 = 0;
+ int iw, ih, npixels;
+ unsigned long *pixels = 0;
+ unsigned char *mask = 0;
+ XGCValues gcv;
+ GC gc;
+
+ if (filename)
+ {
+ fprintf(stderr,
+ "%s: no files: not compiled with XPM or Pixbuf support.\n",
+ progname);
+ exit (1);
+ }
+
+ if (! xpm_data) abort();
+
+ XGetWindowAttributes (dpy, window, &xgwa);
+ ximage = minixpm_to_ximage (dpy, xgwa.visual, xgwa.colormap, xgwa.depth,
+ BlackPixelOfScreen (xgwa.screen),
+ (const char * const *)
+ xpm_data, &iw, &ih, &pixels, &npixels,
+ (mask_ret ? &mask : 0));
+ if (pixels) free (pixels);
+
+ pixmap = XCreatePixmap (dpy, window, iw, ih, xgwa.depth);
+ gc = XCreateGC (dpy, pixmap, 0, &gcv);
+ XPutImage (dpy, pixmap, gc, ximage, 0, 0, 0, 0, iw, ih);
+ XFreeGC (dpy, gc);
+ XDestroyImage (ximage);
+
+ if (mask)
+ {
+ p2 = XCreatePixmap (dpy, window, iw, ih, 1);
+ gcv.foreground = 1;
+ gcv.background = 0;
+ gc = XCreateGC (dpy, p2, GCForeground|GCBackground, &gcv);
+ ximage = XCreateImage (dpy, xgwa.visual, 1, XYBitmap, 0, (char *) mask,
+ iw, ih, 8, 0);
+ ximage->byte_order = ximage->bitmap_bit_order = LSBFirst;
+ if (!ximage) abort();
+ XPutImage (dpy, p2, gc, ximage, 0, 0, 0, 0, iw, ih);
+ XFreeGC (dpy, gc);
+ XDestroyImage (ximage);
+ }
+
+ if (width_ret) *width_ret = iw;
+ if (height_ret) *height_ret = ih;
+ if (mask_ret) *mask_ret = p2;
+ return pixmap;