/* +-------------------------------------------------------------------+ */
/* | Copyright 1993, David Koblas (koblas@netcom.com)                  | */
/* |                                                                   | */
/* | Permission to use, copy, modify, and to distribute 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.  There is no           | */
/* | representations about the suitability of this software for        | */
/* | any purpose.  this software is provided "as is" without express   | */
/* | or implied warranty.                                              | */
/* |                                                                   | */
/* +-------------------------------------------------------------------+ */

#include <X11/IntrinsicP.h>
#include <X11/CoreP.h>
#include <X11/StringDefs.h>
#include "palette.h"

static Boolean	newCvtStringToPixel(Display *dpy, XrmValuePtr args,
			Cardinal *nargs, XrmValuePtr from, XrmValuePtr to,
			XtPointer junk)
{
	Screen		*screen;
	Colormap	cmap;
	Palette		*map;
	String		name = (String)(from->addr);
	Boolean		isReverse = False;
	XColor		scol, ecol;
	static Pixel	op;

	if (*nargs != 2) 
		return False;

	screen = *((Screen **)args[0].addr);
	cmap   = *((Colormap *)args[1].addr);

	if (strcmp(name, XtDefaultBackground) == 0)
		name = isReverse ? "black" : "white";
	else if (strcmp(name, XtDefaultForeground) == 0)
		name = isReverse ? "white" : "black";

	if ((map = PaletteFindDpy(dpy, cmap)) == NULL) {

		/*
		**  Not a "mapped" window, use standard X
		*/
		if (XAllocNamedColor(dpy, cmap, name, &scol, &ecol) == 0) {
			if (XParseColor(dpy, cmap, name, &scol) == 0)
				return False;
			if (XAllocColor(dpy, cmap, &scol) == 0)
				return False;
		}

#if 0
printf("name = %s   match = %d %d %d  screen = %d %d %d\n", 
					name, ecol.red / 256, ecol.green / 256, ecol.blue / 256,
					     scol.red / 256, scol.green / 256, scol.blue / 256);
#endif

		op = scol.pixel;
	} else {
		if (XLookupColor(dpy, map->cmap, name, &scol, &ecol) == 0 &&
		    XParseColor(dpy, map->cmap, name, &scol) == 0)
			return False;
#if 0
printf("name = %s   match = %d %d %d  screen = %d %d %d\n", 
					name, ecol.red / 256, ecol.green / 256, ecol.blue / 256,
					     scol.red / 256, scol.green / 256, scol.blue / 256);
#endif
		op = PaletteAlloc(map, &scol);
	}

	if (to->addr == NULL) {
		to->addr = (XtPointer)&op;
	} else {
		if (to->size < sizeof(Pixel))
			return False;
		memcpy(to->addr, &op, sizeof(Pixel));
	}

	to->size = sizeof(Pixel);

	return True;
}

void InitTypeConverters()
{
	static XtConvertArgRec	colorArgs[] = {
			{ XtWidgetBaseOffset, 
			  (XtPointer)XtOffsetOf(WidgetRec, core.screen),
			  sizeof(Screen *) },
			{ XtWidgetBaseOffset, 
			  (XtPointer)XtOffsetOf(WidgetRec, core.colormap),
			  sizeof(Colormap) },
		};

	/*
	** XXX XtCacheNone should be XtCacheRefCount 
	**     but that has a tendency to core dump Xt...
	**     under release 4
	*/

#if XlibSpecificationRelease > 4
#define CACHE	XtCacheRefCount
#else
#define CACHE	XtCacheNone
#endif

	XtSetTypeConverter(XtRString, XtRPixel, 
				(XtTypeConverter)newCvtStringToPixel,
				colorArgs, XtNumber(colorArgs),
				CACHE, NULL);
}
