#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#include <stdio.h>
#include <X11/IntrinsicP.h>
#include <X11/StringDefs.h>
#include <X11/Xmu/CharSet.h>
#include <X11/Xmu/SysUtil.h>
#include <X11/Xaw/Simple.h>
#include <X11/Xaw/XawInit.h>
#include "Private.h"
#ifndef OLDXAW
#define done(type, value) \
{ \
if (toVal->addr != NULL) \
{ \
if (toVal->size < sizeof(type)) \
{ \
toVal->size = sizeof(type); \
return (False); \
} \
*(type *)(toVal->addr) = (value); \
} \
else \
{ \
static type static_val; \
\
static_val = (value); \
toVal->addr = (XPointer)&static_val; \
} \
toVal->size = sizeof(type); \
return (True); \
}
#define string_done(value) \
{ \
if (toVal->addr != NULL) \
{ \
if (toVal->size < size) \
{ \
toVal->size = size; \
return (False); \
} \
strcpy((char *)toVal->addr, (value)); \
} \
else \
toVal->addr = (XPointer)(value); \
toVal->size = size; \
return (True); \
}
static Boolean _XawCvtAtomToString(Display*, XrmValue*, Cardinal*,
XrmValue*, XrmValue*, XtPointer*);
static Boolean _XawCvtBooleanToString(Display*, XrmValue*, Cardinal*,
XrmValue*, XrmValue*, XtPointer*);
static Boolean _XawCvtBoolToString(Display*, XrmValue*, Cardinal*,
XrmValue*, XrmValue*, XtPointer*);
static Boolean _XawCvtCARD32ToString(Display*, XrmValue*, Cardinal*,
XrmValue*, XrmValue*, XtPointer*);
static Boolean _XawCvtCardinalToString(Display*, XrmValue*, Cardinal*,
XrmValue*, XrmValue*, XtPointer*);
static Boolean _XawCvtDimensionToString(Display*, XrmValue*, Cardinal*,
XrmValue*, XrmValue*, XtPointer*);
static Boolean _XawCvtDisplayListToString(Display*, XrmValue*, Cardinal*,
XrmValue*, XrmValue*, XtPointer*);
static Boolean _XawCvtFontStructToString(Display*, XrmValue*, Cardinal*,
XrmValue*, XrmValue*, XtPointer*);
static Boolean _XawCvtIntToString(Display*, XrmValue*, Cardinal*,
XrmValue*, XrmValue*, XtPointer*);
static Boolean _XawCvtPixelToString(Display*, XrmValue*, Cardinal*,
XrmValue*, XrmValue*, XtPointer*);
static Boolean _XawCvtPixmapToString(Display*, XrmValue*, Cardinal*,
XrmValue*, XrmValue*, XtPointer*);
static Boolean _XawCvtShortToString(Display*, XrmValue*, Cardinal*,
XrmValue*, XrmValue*, XtPointer*);
static Boolean _XawCvtPositionToString(Display*, XrmValue*, Cardinal*,
XrmValue*, XrmValue*, XtPointer*);
static Boolean _XawCvtStringToDisplayList(Display*, XrmValue*, Cardinal*,
XrmValue*, XrmValue*, XtPointer*);
static Boolean _XawCvtStringToPixmap(Display*, XrmValue*, Cardinal*,
XrmValue*, XrmValue*, XtPointer*);
static Boolean _XawCvtUnsignedCharToString(Display*, XrmValue*, Cardinal*,
XrmValue*, XrmValue*, XtPointer*);
static void TypeToStringNoArgsWarning(Display*, String);
static XtConvertArgRec PixelArgs[] = {
{XtWidgetBaseOffset, (XtPointer)XtOffsetOf(WidgetRec, core.colormap),
sizeof(Colormap)},
};
static XtConvertArgRec DLArgs[] = {
{XtWidgetBaseOffset, (XtPointer)XtOffsetOf(WidgetRec, core.screen),
sizeof(Screen *)},
{XtWidgetBaseOffset, (XtPointer)XtOffsetOf(WidgetRec, core.colormap),
sizeof(Colormap)},
{XtWidgetBaseOffset, (XtPointer)XtOffsetOf(WidgetRec, core.depth),
sizeof(int)},
};
#endif
static String XtCToolkitError = "ToolkitError";
static String XtNconversionError = "conversionError";
#ifndef OLDXAW
static String XtNwrongParameters = "wrongParameters";
void
XawInitializeDefaultConverters(void)
{
static Boolean first_time = True;
if (first_time == False)
return;
first_time = False;
XtSetTypeConverter(XtRCallback, XtRString, _XawCvtCARD32ToString,
NULL, 0, XtCacheNone, NULL);
XtSetTypeConverter(XtRColormap, XtRString, _XawCvtCARD32ToString,
NULL, 0, XtCacheNone, NULL);
XtSetTypeConverter(XtRFunction, XtRString, _XawCvtCARD32ToString,
NULL, 0, XtCacheNone, NULL);
XtSetTypeConverter(XtRPointer, XtRString, _XawCvtCARD32ToString,
NULL, 0, XtCacheNone, NULL);
XtSetTypeConverter(XtRScreen, XtRString, _XawCvtCARD32ToString,
NULL, 0, XtCacheNone, NULL);
XtSetTypeConverter(XtRStringArray, XtRString, _XawCvtCARD32ToString,
NULL, 0, XtCacheNone, NULL);
XtSetTypeConverter(XtRVisual, XtRString, _XawCvtCARD32ToString,
NULL, 0, XtCacheNone, NULL);
XtSetTypeConverter(XtRWidget, XtRString, _XawCvtCARD32ToString,
NULL, 0, XtCacheNone, NULL);
XtSetTypeConverter(XtRWidgetList, XtRString, _XawCvtCARD32ToString,
NULL, 0, XtCacheNone, NULL);
XtSetTypeConverter(XtRWindow, XtRString, _XawCvtCARD32ToString,
NULL, 0, XtCacheNone, NULL);
XtSetTypeConverter(XtRAtom, XtRString, _XawCvtAtomToString,
NULL, 0, XtCacheNone, NULL);
XtSetTypeConverter(XtRBool, XtRString, _XawCvtBoolToString,
NULL, 0, XtCacheNone, NULL);
XtSetTypeConverter(XtRBoolean, XtRString, _XawCvtBooleanToString,
NULL, 0, XtCacheNone, NULL);
XtSetTypeConverter(XtRCardinal, XtRString, _XawCvtCardinalToString,
NULL, 0, XtCacheNone, NULL);
XtSetTypeConverter(XtRDimension, XtRString, _XawCvtDimensionToString,
NULL, 0, XtCacheNone, NULL);
XtSetTypeConverter(XawRDisplayList, XtRString, _XawCvtDisplayListToString,
NULL, 0, XtCacheNone, NULL);
XtSetTypeConverter(XtRFontStruct, XtRString, _XawCvtFontStructToString,
NULL, 0, XtCacheNone, NULL);
XtSetTypeConverter(XtRInt, XtRString, _XawCvtIntToString,
NULL, 0, XtCacheNone, NULL);
XtSetTypeConverter(XtRPixel, XtRString, _XawCvtPixelToString,
&PixelArgs[0], XtNumber(PixelArgs), XtCacheNone, NULL);
XtSetTypeConverter(XtRPixmap, XtRString, _XawCvtPixmapToString,
&DLArgs[0], XtNumber(DLArgs), XtCacheNone, NULL);
XtSetTypeConverter(XtRPosition, XtRString, _XawCvtPositionToString,
NULL, 0, XtCacheNone, NULL);
XtSetTypeConverter(XtRShort, XtRString, _XawCvtShortToString,
NULL, 0, XtCacheNone, NULL);
XtSetTypeConverter(XtRString, XawRDisplayList, _XawCvtStringToDisplayList,
&DLArgs[0], XtNumber(DLArgs), XtCacheAll, NULL);
XtSetTypeConverter(XtRString, XtRPixmap, _XawCvtStringToPixmap,
&DLArgs[0], XtNumber(DLArgs), XtCacheAll, NULL);
XtSetTypeConverter(XtRUnsignedChar, XtRString, _XawCvtUnsignedCharToString,
NULL, 0, XtCacheNone, NULL);
}
#endif
void
XawTypeToStringWarning(Display *dpy, String type)
{
char fname[64];
String params[1];
Cardinal num_params;
XmuSnprintf(fname, sizeof(fname), "cvt%sToString", type);
params[0] = type;
num_params = 1;
XtAppWarningMsg(XtDisplayToApplicationContext(dpy),
XtNconversionError, fname, XtCToolkitError,
"Cannot convert %s to String",
params, &num_params);
}
#ifndef OLDXAW
static void
TypeToStringNoArgsWarning(Display *dpy, String type)
{
char fname[64];
String params[1];
Cardinal num_params;
XmuSnprintf(fname, sizeof(fname), "cvt%sToString", type);
params[0] = type;
num_params = 1;
XtAppWarningMsg(XtDisplayToApplicationContext(dpy),
XtNconversionError, fname,
XtCToolkitError,
"%s to String conversion needs no extra arguments",
params, &num_params);
}
static Boolean
_XawCvtBooleanToString(Display *dpy, XrmValue *args, Cardinal *num_args,
XrmValue *fromVal, XrmValue *toVal,
XtPointer *converter_data)
{
static char buffer[6];
Cardinal size;
if (*num_args != 0)
TypeToStringNoArgsWarning(dpy, XtRBoolean);
XmuSnprintf(buffer, sizeof(buffer), "%s",
*(Boolean *)fromVal->addr ? XtEtrue : XtEfalse);
size = strlen(buffer) + 1;
string_done(buffer);
}
static Boolean
_XawCvtBoolToString(Display *dpy, XrmValue *args, Cardinal *num_args,
XrmValue *fromVal, XrmValue *toVal,
XtPointer *converter_data)
{
static char buffer[6];
Cardinal size;
if (*num_args != 0)
TypeToStringNoArgsWarning(dpy, XtRBool);
XmuSnprintf(buffer, sizeof(buffer), "%s",
*(Bool *)fromVal->addr ? XtEtrue : XtEfalse);
size = strlen(buffer) + 1;
string_done(buffer);
}
static Boolean
_XawCvtPositionToString(Display *dpy, XrmValue *args, Cardinal *num_args,
XrmValue *fromVal, XrmValue *toVal,
XtPointer *converter_data)
{
static char buffer[7];
Cardinal size;
if (*num_args != 0)
TypeToStringNoArgsWarning(dpy, XtRPosition);
XmuSnprintf(buffer, sizeof(buffer), "%d", *(Position *)fromVal->addr);
size = strlen(buffer) + 1;
string_done(buffer);
}
static Boolean
_XawCvtShortToString(Display *dpy, XrmValue *args, Cardinal *num_args,
XrmValue *fromVal, XrmValue *toVal,
XtPointer *converter_data)
{
static char buffer[7];
Cardinal size;
if (*num_args != 0)
TypeToStringNoArgsWarning(dpy, XtRShort);
XmuSnprintf(buffer, sizeof(buffer), "%d", *(short *)fromVal->addr);
size = strlen(buffer) + 1;
string_done(buffer);
}
static Boolean
_XawCvtDimensionToString(Display *dpy, XrmValue *args, Cardinal *num_args,
XrmValue *fromVal, XrmValue *toVal,
XtPointer *converter_data)
{
static char buffer[6];
Cardinal size;
if (*num_args != 0)
TypeToStringNoArgsWarning(dpy, XtRDimension);
XmuSnprintf(buffer, sizeof(buffer), "%u", *(Dimension *)fromVal->addr);
size = strlen(buffer) + 1;
string_done(buffer);
}
static Boolean
_XawCvtCARD32ToString(Display *dpy, XrmValue *args, Cardinal *num_args,
XrmValue *fromVal, XrmValue *toVal,
XtPointer *converter_data)
{
static char buffer[11];
Cardinal size;
if (*num_args != 0)
TypeToStringNoArgsWarning(dpy, "CARD32");
XmuSnprintf(buffer, sizeof(buffer), "0x%08hx", *(int *)fromVal->addr);
size = strlen(buffer) + 1;
string_done(buffer);
}
static Boolean
_XawCvtIntToString(Display *dpy, XrmValue *args, Cardinal *num_args,
XrmValue *fromVal, XrmValue *toVal,
XtPointer *converter_data)
{
static char buffer[12];
Cardinal size;
if (*num_args != 0)
TypeToStringNoArgsWarning(dpy, XtRInt);
XmuSnprintf(buffer, sizeof(buffer), "%d", *(int *)fromVal->addr);
size = strlen(buffer) + 1;
string_done(buffer);
}
static Boolean
_XawCvtCardinalToString(Display *dpy, XrmValue *args, Cardinal *num_args,
XrmValue *fromVal, XrmValue *toVal,
XtPointer *converter_data)
{
static char buffer[11];
Cardinal size;
if (*num_args != 0)
TypeToStringNoArgsWarning(dpy, XtRCardinal);
XmuSnprintf(buffer, sizeof(buffer), "%u", *(Cardinal *)fromVal->addr);
size = strlen(buffer) + 1;
string_done(buffer);
}
static Boolean
_XawCvtAtomToString(Display *dpy, XrmValue *args, Cardinal *num_args,
XrmValue *fromVal, XrmValue *toVal,
XtPointer *converter_data)
{
static char *buffer = NULL;
static char *nullatom = "NULL";
Cardinal size;
Atom atom;
if (*num_args != 0)
TypeToStringNoArgsWarning(dpy, XtRAtom);
if (buffer && buffer != nullatom)
XFree(buffer);
atom = *(Atom *)fromVal[0].addr;
if (atom == 0)
buffer = nullatom;
else if ((buffer = XGetAtomName(dpy, *(Atom *)fromVal[0].addr)) == NULL)
{
XawTypeToStringWarning(dpy, XtRAtom);
toVal->addr = NULL;
toVal->size = sizeof(String);
return (False);
}
size = strlen(buffer) + 1;
string_done(buffer);
}
static Boolean
_XawCvtPixelToString(Display *dpy, XrmValue *args, Cardinal *num_args,
XrmValue *fromVal, XrmValue *toVal,
XtPointer *converter_data)
{
static char buffer[19];
Cardinal size;
Colormap colormap;
XColor color;
if (*num_args != 1)
{
XtAppWarningMsg(XtDisplayToApplicationContext(dpy),
XtNwrongParameters, "cvtPixelToString",
XtCToolkitError,
"Pixel to String conversion needs colormap argument",
NULL, NULL);
return (False);
}
colormap = *(Colormap *)args[0].addr;
color.pixel = *(Pixel *)fromVal->addr;
XQueryColor(dpy, colormap, &color);
XmuSnprintf(buffer, sizeof(buffer), "rgb:%04hx/%04hx/%04hx",
color.red, color.green, color.blue);
size = strlen(buffer) + 1;
string_done(buffer);
}
static Boolean
_XawCvtFontStructToString(Display *dpy, XrmValue *args, Cardinal *num_args,
XrmValue *fromVal, XrmValue *toVal,
XtPointer *converter_data)
{
static char buffer[128];
Cardinal size;
Atom atom;
unsigned long value;
if (*num_args != 0)
TypeToStringNoArgsWarning(dpy, XtRFontStruct);
if ((atom = XInternAtom(dpy, "FONT", True)) == None)
return (False);
size = 0;
if (XGetFontProperty(*(XFontStruct **)fromVal->addr, atom, &value))
{
char *tmp = XGetAtomName(dpy, value);
if (tmp)
{
XmuSnprintf(buffer, sizeof(buffer), "%s", tmp);
size = strlen(tmp);
XFree(tmp);
}
}
if (size)
{
++size;
string_done(buffer);
}
XawTypeToStringWarning(dpy, XtRFontStruct);
return (False);
}
static Boolean
_XawCvtUnsignedCharToString(Display *dpy, XrmValue *args, Cardinal *num_args,
XrmValue *fromVal, XrmValue *toVal,
XtPointer *converter_data)
{
static char buffer[4];
Cardinal size;
if (*num_args != 0)
TypeToStringNoArgsWarning(dpy, XtRUnsignedChar);
XmuSnprintf(buffer, sizeof(buffer), "%u",
*(unsigned char *)fromVal->addr);
size = strlen(buffer) + 1;
string_done(buffer);
}
static Boolean
_XawCvtStringToDisplayList(Display *dpy, XrmValue *args, Cardinal *num_args,
XrmValue *fromVal, XrmValue *toVal,
XtPointer *converter_data)
{
XawDisplayList *dlist;
Screen *screen;
Colormap colormap;
int depth;
String commands;
if (*num_args != 3)
{
XtAppWarningMsg(XtDisplayToApplicationContext(dpy),
XtNwrongParameters, "cvtStringToDisplayList",
XtCToolkitError,
"String to DisplayList conversion needs screen, "
"colormap, and depth arguments",
NULL, NULL);
return (False);
}
screen = *(Screen **)args[0].addr;
colormap = *(Colormap *)args[1].addr;
depth = *(int *)args[2].addr;
commands = (String)(fromVal[0].addr);
dlist = XawCreateDisplayList(commands, screen, colormap, depth);
if (!dlist)
{
XtDisplayStringConversionWarning(dpy, (String)fromVal->addr,
XawRDisplayList);
toVal->addr = NULL;
toVal->size = sizeof(XawDisplayList*);
return (False);
}
done(XawDisplayList*, dlist);
}
static Boolean
_XawCvtDisplayListToString(Display *dpy, XrmValue *args, Cardinal *num_args,
XrmValue *fromVal, XrmValue *toVal,
XtPointer *converter_data)
{
String buffer;
Cardinal size;
if (*num_args != 0)
TypeToStringNoArgsWarning(dpy, XawRDisplayList);
buffer = XawDisplayListString(*(XawDisplayList **)(fromVal[0].addr));
size = strlen(buffer) + 1;
string_done(buffer);
}
static Boolean
_XawCvtStringToPixmap(Display *dpy, XrmValue *args, Cardinal *num_args,
XrmValue *fromVal, XrmValue *toVal,
XtPointer *converter_data)
{
XawPixmap *xaw_pixmap;
Pixmap pixmap;
Screen *screen;
Colormap colormap;
int depth;
String name;
if (*num_args != 3)
{
XtAppWarningMsg(XtDisplayToApplicationContext(dpy),
XtNwrongParameters, "cvtStringToPixmap",
XtCToolkitError,
"String to Pixmap conversion needs screen, "
"colormap, and depth arguments",
NULL, NULL);
return (False);
}
screen = *(Screen **)args[0].addr;
colormap = *(Colormap *)args[1].addr;
depth = *(int *)args[2].addr;
name = (String)(fromVal[0].addr);
if (XmuCompareISOLatin1(name, "None") == 0)
pixmap = None;
else if (XmuCompareISOLatin1(name, "ParentRelative") == 0)
pixmap = ParentRelative;
else if (XmuCompareISOLatin1(name, "XtUnspecifiedPixmap") == 0)
pixmap = XtUnspecifiedPixmap;
else
{
xaw_pixmap = XawLoadPixmap(name, screen, colormap, depth);
if (!xaw_pixmap)
{
XtDisplayStringConversionWarning(dpy, (String)fromVal->addr,
XtRPixmap);
toVal->addr = (XtPointer)XtUnspecifiedPixmap;
toVal->size = sizeof(Pixmap);
return (False);
}
else
pixmap = xaw_pixmap->pixmap;
}
done(Pixmap, pixmap);
}
static Boolean
_XawCvtPixmapToString(Display *dpy, XrmValue *args, Cardinal *num_args,
XrmValue *fromVal, XrmValue *toVal,
XtPointer *converter_data)
{
XawPixmap *xaw_pixmap;
Pixmap pixmap;
Screen *screen;
Colormap colormap;
int depth;
String buffer = NULL;
Cardinal size;
if (*num_args != 3)
{
XtAppWarningMsg(XtDisplayToApplicationContext(dpy),
XtNwrongParameters, "cvtPixmapToString",
XtCToolkitError,
"Pixmap to String conversion needs screen, "
"colormap, and depth arguments",
NULL, NULL);
return (False);
}
screen = *(Screen **)args[0].addr;
colormap = *(Colormap *)args[1].addr;
depth = *(int *)args[2].addr;
pixmap = *(Pixmap *)(fromVal[0].addr);
switch (pixmap)
{
case None:
buffer = "None";
break;
case ParentRelative:
buffer = "ParentRelative";
break;
case XtUnspecifiedPixmap:
buffer = "XtUnspecifiedPixmap";
break;
default:
xaw_pixmap = XawPixmapFromXPixmap(pixmap, screen, colormap, depth);
if (xaw_pixmap)
buffer = xaw_pixmap->name;
break;
}
if (!buffer)
return (_XawCvtCARD32ToString(dpy, args, num_args, fromVal, toVal,
converter_data));
size = strlen(buffer) + 1;
string_done(buffer);
}
#endif