+#ifdef HAVE_XPM
+ Window window = MI_WINDOW(mi);
+ XWindowAttributes xgwa;
+ XpmAttributes xpmattrs;
+ int result;
+ Pixmap bitmap = 0;
+ int width = 0, height = 0;
+ xpmattrs.valuemask = 0;
+
+ XGetWindowAttributes (dpy, window, &xgwa);
+
+# ifdef XpmCloseness
+ xpmattrs.valuemask |= XpmCloseness;
+ xpmattrs.closeness = 40000;
+# endif
+# ifdef XpmVisual
+ xpmattrs.valuemask |= XpmVisual;
+ xpmattrs.visual = xgwa.visual;
+# endif
+# ifdef XpmDepth
+ xpmattrs.valuemask |= XpmDepth;
+ xpmattrs.depth = xgwa.depth;
+# endif
+# ifdef XpmColormap
+ xpmattrs.valuemask |= XpmColormap;
+ xpmattrs.colormap = xgwa.colormap;
+# endif
+
+ /* Uh, we don't need these now. We use the colors from the xpm.
+ It kinda sucks that we already allocated them. */
+ XFreeColors(dpy, xgwa.colormap, mi->pixels, mi->npixels, 0L);
+
+ result = XpmReadFileToPixmap (dpy, window, bitmap_name, &bitmap, 0,
+ &xpmattrs);
+ switch (result)
+ {
+ case XpmColorError:
+ fprintf (stderr, "%s: warning: xpm color substitution performed\n",
+ progname);
+ /* fall through */
+ case XpmSuccess:
+ width = xpmattrs.width;
+ height = xpmattrs.height;
+ break;
+ case XpmFileInvalid:
+ case XpmOpenFailed:
+ bitmap = 0;
+ break;
+ case XpmColorFailed:
+ fprintf (stderr, "%s: xpm: color allocation failed\n", progname);
+ exit (-1);
+ case XpmNoMemory:
+ fprintf (stderr, "%s: xpm: out of memory\n", progname);
+ exit (-1);
+ default:
+ fprintf (stderr, "%s: xpm: unknown error code %d\n", progname,
+ result);
+ exit (-1);
+ }
+
+ if (bitmap)
+ {
+ fp->image = XGetImage(dpy, bitmap, 0, 0, width, height, ~0L,
+ ZPixmap);
+ XFreePixmap(dpy, bitmap);
+ }
+ else
+#endif /* HAVE_XPM */
+