#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#include <stdio.h>
#include <math.h>
#include <X11/Xlib.h>
#include <X11/Xatom.h>
#include <X11/Xutil.h>
#include <X11/Xmu/StdCmap.h>
Status
XmuVisualStandardColormaps(Display *dpy, int screen, VisualID visualid,
unsigned int depth, Bool replace, Bool retain)
{
Status status;
int n;
long vinfo_mask;
XVisualInfo vinfo_template, *vinfo;
status = 0;
vinfo_template.screen = screen;
vinfo_template.visualid = visualid;
vinfo_template.depth = depth;
vinfo_mask = VisualScreenMask | VisualIDMask | VisualDepthMask;
if ((vinfo = XGetVisualInfo(dpy, vinfo_mask, &vinfo_template, &n)) == NULL)
return 0;
if (vinfo->colormap_size <= 2) {
XFree((char *) vinfo);
return 1;
}
switch (vinfo->class)
{
case PseudoColor:
case DirectColor:
status = XmuLookupStandardColormap(dpy, screen, visualid, depth,
XA_RGB_DEFAULT_MAP, replace,retain);
if (!status) break;
status = XmuLookupStandardColormap(dpy, screen, visualid, depth,
XA_RGB_GRAY_MAP, replace, retain);
if (!status) {
XmuDeleteStandardColormap(dpy, screen, XA_RGB_DEFAULT_MAP);
break;
}
status = XmuLookupStandardColormap(dpy, screen, visualid, depth,
XA_RGB_RED_MAP, replace, retain);
if (!status) {
XmuDeleteStandardColormap(dpy, screen, XA_RGB_DEFAULT_MAP);
XmuDeleteStandardColormap(dpy, screen, XA_RGB_GRAY_MAP);
break;
}
status = XmuLookupStandardColormap(dpy, screen, visualid, depth,
XA_RGB_GREEN_MAP, replace, retain);
if (!status) {
XmuDeleteStandardColormap(dpy, screen, XA_RGB_DEFAULT_MAP);
XmuDeleteStandardColormap(dpy, screen, XA_RGB_GRAY_MAP);
XmuDeleteStandardColormap(dpy, screen, XA_RGB_RED_MAP);
break;
}
status = XmuLookupStandardColormap(dpy, screen, visualid, depth,
XA_RGB_BLUE_MAP, replace, retain);
if (!status) {
XmuDeleteStandardColormap(dpy, screen, XA_RGB_DEFAULT_MAP);
XmuDeleteStandardColormap(dpy, screen, XA_RGB_GRAY_MAP);
XmuDeleteStandardColormap(dpy, screen, XA_RGB_RED_MAP);
XmuDeleteStandardColormap(dpy, screen, XA_RGB_GREEN_MAP);
break;
}
case StaticColor:
case TrueColor:
status = XmuLookupStandardColormap(dpy, screen, visualid, depth,
XA_RGB_BEST_MAP, replace, retain);
if (!status && (vinfo->class == PseudoColor ||
vinfo->class == DirectColor)) {
XmuDeleteStandardColormap(dpy, screen, XA_RGB_DEFAULT_MAP);
XmuDeleteStandardColormap(dpy, screen, XA_RGB_GRAY_MAP);
XmuDeleteStandardColormap(dpy, screen, XA_RGB_RED_MAP);
XmuDeleteStandardColormap(dpy, screen, XA_RGB_GREEN_MAP);
XmuDeleteStandardColormap(dpy, screen, XA_RGB_BLUE_MAP);
}
break;
case GrayScale:
status = XmuLookupStandardColormap(dpy, screen, visualid, depth,
XA_RGB_DEFAULT_MAP, replace,
retain);
if (! status) break;
case StaticGray:
status = XmuLookupStandardColormap(dpy, screen, visualid, depth,
XA_RGB_GRAY_MAP, replace, retain);
if (! status && vinfo->class == GrayScale) {
XmuDeleteStandardColormap(dpy, screen, XA_RGB_DEFAULT_MAP);
break;
}
}
XFree((char *) vinfo);
return status;
}