diff options
author | Kaleb Keithley <kaleb@freedesktop.org> | 2003-11-14 15:54:55 +0000 |
---|---|---|
committer | Kaleb Keithley <kaleb@freedesktop.org> | 2003-11-14 15:54:55 +0000 |
commit | 4ef09824a6edd2981de3aec61a9472232fd9e4b7 (patch) | |
tree | 4016a64cdb9b1d2854a13503f6e5cf14cf076ebf /xstdcmap.c |
R6.6 is the Xorg base-lineXORG-MAINXORG-STABLE
Diffstat (limited to 'xstdcmap.c')
-rw-r--r-- | xstdcmap.c | 369 |
1 files changed, 369 insertions, 0 deletions
diff --git a/xstdcmap.c b/xstdcmap.c new file mode 100644 index 0000000..726b610 --- /dev/null +++ b/xstdcmap.c @@ -0,0 +1,369 @@ +/* + * $Xorg: xstdcmap.c,v 1.5 2001/02/09 02:06:01 xorgcvs Exp $ + * + * +Copyright 1989, 1998 The Open Group + +Permission to use, copy, modify, distribute, and sell this software and its +documentation for any purpose is hereby granted without fee, provided that +the above copyright notice appear in all copies and that both that +copyright notice and this permission notice appear in supporting +documentation. + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of The Open Group shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from The Open Group. + * * + * Author: Donna Converse, MIT X Consortium + */ + +#include <stdio.h> +#include <X11/Xos.h> +#include <X11/Xlib.h> +#include <X11/Xutil.h> +#include <X11/Xresource.h> +#include <X11/Xatom.h> +#include <X11/Xmu/StdCmap.h> + +extern void exit(); + +#define REPLACE 1 +#define DO_NOT_REPLACE 0 +#define RETAIN 1 +#define DO_NOT_RETAIN 0 + +static char *display_name = NULL; +static char *program_name = NULL; +static Bool all = 0; +static Bool help = 0; +static Bool verbose = 0; +static Display *dpy = NULL; + +typedef struct +{ + Bool create; + Bool delete; + Atom property; + char *name; + char *nickname; +} colormap_property; + +static colormap_property propertyTable[]= +{ +{0, 0, XA_RGB_DEFAULT_MAP, "RGB_DEFAULT_MAP", "default"}, +{0, 0, XA_RGB_BEST_MAP, "RGB_BEST_MAP", "best"}, +{0, 0, XA_RGB_GRAY_MAP, "RGB_GRAY_MAP", "gray"}, +{0, 0, XA_RGB_RED_MAP, "RGB_RED_MAP", "red"}, +{0, 0, XA_RGB_GREEN_MAP, "RGB_GREEN_MAP", "green"}, +{0, 0, XA_RGB_BLUE_MAP, "RGB_BLUE_MAP", "blue"}, +}; +#define NPROPERTIES (sizeof propertyTable / sizeof propertyTable[0]) + +#define DEFAULT 0 +#define BEST 1 +#define GRAY 2 +#define RED 3 +#define GREEN 4 +#define BLUE 5 + +static char *usage_message[]= +{ +" -all make all standard colormaps for the display", +" -best make the RGB_BEST_MAP", +" -blue make the RGB_BLUE_MAP", +" -default make the RGB_DEFAULT_MAP", +" -delete name remove a standard colormap", +" -display dpy X server to use", +" -gray make the RGB_GRAY_MAP", +" -green make the RGB_GREEN_MAP", +" -red make the RGB_RED_MAP", +" -verbose turn on logging", +"", +NULL }; + +static XrmOptionDescRec optionTable[]= +{ +{"-all", ".all", XrmoptionNoArg, (caddr_t) "on"}, +{"-best", ".best", XrmoptionNoArg, (caddr_t) "on"}, +{"-blue", ".blue", XrmoptionNoArg, (caddr_t) "on"}, +{"-default", ".default", XrmoptionNoArg, (caddr_t) "on"}, +{"-delete", ".delete", XrmoptionSepArg, (caddr_t) NULL}, +{"-display", ".display", XrmoptionSepArg, (caddr_t) NULL}, +{"-gray", ".gray", XrmoptionNoArg, (caddr_t) "on"}, +{"-green", ".green", XrmoptionNoArg, (caddr_t) "on"}, +{"-help", ".help", XrmoptionNoArg, (caddr_t) "on"}, +{"-red", ".red", XrmoptionNoArg, (caddr_t) "on"}, +{"-verbose", ".verbose", XrmoptionNoArg, (caddr_t) "on"}, +}; +#define NOPTIONS (sizeof optionTable / sizeof optionTable[0]) + +static void parse(argc, argv) + int argc; + char **argv; +{ + XrmDatabase database = NULL; + char *type; + XrmValue value; + char option[512]; + + if (argc == 1) + usage(0); + + XrmInitialize(); + XrmParseCommand(&database, optionTable, NOPTIONS, program_name, &argc, + argv); + if (--argc) + usage(1); + + (void) sprintf(option, "%s%s", program_name, ".all"); + if (XrmGetResource(database, option, (char *) NULL, &type, &value)) + all++; + + (void) sprintf(option, "%s%s", program_name, ".best"); + if (XrmGetResource(database, option, (char *) NULL, &type, &value)) + propertyTable[BEST].create++; + + (void) sprintf(option, "%s%s", program_name, ".blue"); + if (XrmGetResource(database, option, (char *) NULL, &type, &value)) + propertyTable[BLUE].create++; + + (void) sprintf(option, "%s%s", program_name, ".default"); + if (XrmGetResource(database, option, (char *) NULL, &type, &value)) + propertyTable[DEFAULT].create++; + + (void) sprintf(option, "%s%s", program_name, ".delete"); + if (XrmGetResource(database, option, (char *) NULL, &type, &value)) { + register int i; + for (i=0; i < NPROPERTIES; i++) { + if (strcmp((char *) value.addr, propertyTable[i].nickname) == 0) { + propertyTable[i].delete++; + break; + } + if (strcmp((char *) value.addr, "all") == 0) + propertyTable[i].delete++; + } + } + + (void) sprintf(option, "%s%s", program_name, ".display"); + if (XrmGetResource(database, option, (char *) NULL, &type, &value)) + display_name = value.addr; + + (void) sprintf(option, "%s%s", program_name, ".gray"); + if (XrmGetResource(database, option, (char *) NULL, &type, &value)) + propertyTable[GRAY].create++; + + (void) sprintf(option, "%s%s", program_name, ".green"); + if (XrmGetResource(database, option, (char *) NULL, &type, &value)) + propertyTable[GREEN].create++; + + (void) sprintf(option, "%s%s", program_name, ".help"); + if (XrmGetResource(database, option, (char *) NULL, &type, &value)) + help++; + + (void) sprintf(option, "%s%s", program_name, ".red"); + if (XrmGetResource(database, option, (char *) NULL, &type, &value)) + propertyTable[RED].create++; + + (void) sprintf(option, "%s%s", program_name, ".verbose"); + if (XrmGetResource(database, option, (char *) NULL, &type, &value)) + verbose++; +} + +Exit(status) + Status status; +{ + if (dpy) + XCloseDisplay(dpy); + exit(status); +} + +usage(status) + Status status; +{ + register char **i; + (void) fprintf(stderr, "usage: %s [-options]\n\n", program_name); + (void) fprintf(stderr, "where options include:\n"); + for (i = usage_message; *i != NULL; i++) + (void) fprintf(stderr, "%s\n", *i); + Exit(status); +} + +/* Determine the visual of greatest depth in a given visual class. + * If no such visual exists, return NULL. + */ +static XVisualInfo *getDeepestVisual(visual_class, vinfo, nvisuals) + int visual_class; /* specifies the desired visual class */ + XVisualInfo *vinfo; /* specifies all visuals for a screen */ + int nvisuals; /* specifies number of visuals in the list */ +{ + register int i; + unsigned int maxdepth = 0; + XVisualInfo *v = NULL; + + for (i=0; i < nvisuals; i++, vinfo++) + if (vinfo->class == visual_class && vinfo->depth > maxdepth) + { + maxdepth = vinfo->depth; + v = vinfo; + } + return(v); +} + +/* Determine the ``best'' visual of the screen for a standard colormap + * property. Return NULL if no visual is appropriate. + */ +static XVisualInfo *getBestVisual(property, vinfo, nvisuals) + Atom property; /* specifies the standard colormap */ + XVisualInfo *vinfo; /* specifies all visuals of the screen */ + int nvisuals; /* specifies number of visuals of screen */ +{ + XVisualInfo *v1 = NULL, *v2 = NULL; + + if (vinfo == NULL) /* unexpected: a screen with no visuals */ + return v1; + v1 = getDeepestVisual(DirectColor, vinfo, nvisuals); + v2 = getDeepestVisual(PseudoColor, vinfo, nvisuals); + if (v2 && (!v1 || (v2->colormap_size >= + ((v1->red_mask | v1->green_mask | v1->blue_mask) + 1)))) + return v2; + else if (v1) + return v1; + if (property == XA_RGB_BEST_MAP) + if (((v1 = getDeepestVisual(TrueColor, vinfo, nvisuals)) != NULL) || + ((v1 = getDeepestVisual(StaticColor, vinfo, nvisuals)) != NULL)) + return v1; + if (property == XA_RGB_GRAY_MAP) + if (((v1 = getDeepestVisual(GrayScale, vinfo, nvisuals)) != NULL) || + ((v1 = getDeepestVisual(StaticGray, vinfo, nvisuals)) != NULL)) + return v1; + if (property == XA_RGB_DEFAULT_MAP) + for (v1 = vinfo; v1->visual != DefaultVisual(dpy, v1->screen); v1++) + ; + return v1; + +} + +static char *visualStringFromClass(class) + int class; +{ + switch (class) { + case PseudoColor: return "PseudoColor"; + case DirectColor: return "DirectColor"; + case GrayScale: return "GrayScale"; + case StaticColor: return "StaticColor"; + case TrueColor: return "TrueColor"; + case StaticGray: return "StaticGray"; + } + return "unknown visual class"; +} + +static int doIndividualColormaps() +{ + int i, screen, nvisuals; + Status status; + XVisualInfo *vinfo = NULL, *v = NULL, template; + + screen = DefaultScreen(dpy); + template.screen = screen; + vinfo = XGetVisualInfo(dpy, VisualScreenMask, &template, &nvisuals); + + /* check for individual standard colormap requests */ + for (i=0; i < NPROPERTIES; i++) { + + if (propertyTable[i].delete) { + XmuDeleteStandardColormap(dpy, screen, propertyTable[i].property); + if (verbose) + fprintf(stderr, "%s: %s was deleted or did not exist.\n", + program_name, propertyTable[i].name); + } + + if (! propertyTable[i].create) + continue; + + /* which visual is best for this property? */ + v = getBestVisual(propertyTable[i].property, vinfo, nvisuals); + if (v == NULL) { + if (verbose) + (void) fprintf(stderr, + "%s: no visual appropriate for %s on screen %d.\n", + program_name, propertyTable[i].name, screen); + continue; + } + + + if (verbose) + (void) fprintf(stderr, + "%s: making %s on a %s visual of depth %u.\n", + program_name, propertyTable[i].name, + visualStringFromClass(v->class), v->depth); + + status = XmuLookupStandardColormap(dpy, screen, v->visualid, + v->depth, + propertyTable[i].property, + DO_NOT_REPLACE, RETAIN); + if (verbose) + (void) fprintf(stderr, + "%s: %s standard colormap %s.\n", program_name, + propertyTable[i].name, (status) + ? "was created or already exists" + : "cannot be defined"); + if (!status) + break; + } + XFree((char *) vinfo); + return status; +} + +/* Bare bones standard colormap generation utility */ +main(argc, argv) + int argc; + char **argv; +{ + Status status = 0; + + if ((program_name = strrchr(*argv, '/'))) + program_name++; + else + program_name = *argv; + + parse(argc, argv); + + if ((dpy = XOpenDisplay(display_name)) == NULL) { + (void) fprintf(stderr, "%s: cannot open display \"%s\".\n", + program_name, XDisplayName(display_name)); + exit(1); + } + + if (help) { + usage(0); + Exit(0); + } + + if (all) { + if (verbose) + (void) fprintf(stderr, + "%s: making all appropriate standard colormaps...", + program_name); + status = XmuAllStandardColormaps(dpy); + if (verbose) + (void) fprintf(stderr, + "\n%s!\n", (status) ? "success" : "failure"); + } + else { + status = doIndividualColormaps(); + if (!status && verbose) + (void) fprintf(stderr, + "Not all new colormap definitions will be retained.\n"); + } + Exit((status == 0) ? 1 : 0); +} |