2 * Copyright (c) 1998 by The XFree86 Project, Inc.
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * Software is furnished to do so, subject to the following conditions:
11 * The above copyright notice and this permission notice shall be included in
12 * all copies or substantial portions of the Software.
14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
17 * THE XFREE86 PROJECT BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
18 * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
19 * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22 * Except as contained in this notice, the name of the XFree86 Project shall
23 * not be used in advertising or otherwise to promote the sale, use or other
24 * dealings in this Software without prior written authorization from the
32 #include <X11/IntrinsicP.h>
33 #include <X11/StringDefs.h>
34 #include <X11/Xmu/CharSet.h>
35 #include <X11/Xaw/Simple.h>
36 #include <X11/Xaw/XawInit.h>
44 #define done(type, value) \
46 if (toVal->addr != NULL) \
48 if (toVal->size < sizeof(type)) \
50 toVal->size = sizeof(type); \
53 *(type *)(toVal->addr) = (value); \
57 static type static_val; \
59 static_val = (value); \
60 toVal->addr = (XPointer)&static_val; \
62 toVal->size = sizeof(type); \
66 #define string_done(value) \
68 if (toVal->addr != NULL) \
70 if (toVal->size < size) \
75 strcpy((char *)toVal->addr, (value)); \
78 toVal->addr = (XPointer)(value); \
86 static Boolean _XawCvtAtomToString(Display*, XrmValue*, Cardinal*,
87 XrmValue*, XrmValue*, XtPointer*);
88 static Boolean _XawCvtBooleanToString(Display*, XrmValue*, Cardinal*,
89 XrmValue*, XrmValue*, XtPointer*);
90 static Boolean _XawCvtBoolToString(Display*, XrmValue*, Cardinal*,
91 XrmValue*, XrmValue*, XtPointer*);
92 static Boolean _XawCvtCARD32ToString(Display*, XrmValue*, Cardinal*,
93 XrmValue*, XrmValue*, XtPointer*);
94 static Boolean _XawCvtCardinalToString(Display*, XrmValue*, Cardinal*,
95 XrmValue*, XrmValue*, XtPointer*);
96 static Boolean _XawCvtDimensionToString(Display*, XrmValue*, Cardinal*,
97 XrmValue*, XrmValue*, XtPointer*);
98 static Boolean _XawCvtDisplayListToString(Display*, XrmValue*, Cardinal*,
99 XrmValue*, XrmValue*, XtPointer*);
100 static Boolean _XawCvtFontStructToString(Display*, XrmValue*, Cardinal*,
101 XrmValue*, XrmValue*, XtPointer*);
102 static Boolean _XawCvtIntToString(Display*, XrmValue*, Cardinal*,
103 XrmValue*, XrmValue*, XtPointer*);
104 static Boolean _XawCvtPixelToString(Display*, XrmValue*, Cardinal*,
105 XrmValue*, XrmValue*, XtPointer*);
106 static Boolean _XawCvtPixmapToString(Display*, XrmValue*, Cardinal*,
107 XrmValue*, XrmValue*, XtPointer*);
108 static Boolean _XawCvtShortToString(Display*, XrmValue*, Cardinal*,
109 XrmValue*, XrmValue*, XtPointer*);
110 static Boolean _XawCvtPositionToString(Display*, XrmValue*, Cardinal*,
111 XrmValue*, XrmValue*, XtPointer*);
112 static Boolean _XawCvtStringToDisplayList(Display*, XrmValue*, Cardinal*,
113 XrmValue*, XrmValue*, XtPointer*);
114 static Boolean _XawCvtStringToPixmap(Display*, XrmValue*, Cardinal*,
115 XrmValue*, XrmValue*, XtPointer*);
116 static Boolean _XawCvtUnsignedCharToString(Display*, XrmValue*, Cardinal*,
117 XrmValue*, XrmValue*, XtPointer*);
118 static void TypeToStringNoArgsWarning(Display*, String);
123 static XtConvertArgRec PixelArgs[] = {
124 {XtWidgetBaseOffset, (XtPointer)XtOffsetOf(WidgetRec, core.colormap),
128 static XtConvertArgRec DLArgs[] = {
129 {XtWidgetBaseOffset, (XtPointer)XtOffsetOf(WidgetRec, core.screen),
131 {XtWidgetBaseOffset, (XtPointer)XtOffsetOf(WidgetRec, core.colormap),
133 {XtWidgetBaseOffset, (XtPointer)XtOffsetOf(WidgetRec, core.depth),
138 static String XtCToolkitError = "ToolkitError";
139 static String XtNconversionError = "conversionError";
142 static String XtNwrongParameters = "wrongParameters";
148 XawInitializeDefaultConverters(void)
150 static Boolean first_time = True;
152 if (first_time == False)
157 /* Replace with more apropriate converters */
158 XtSetTypeConverter(XtRCallback, XtRString, _XawCvtCARD32ToString,
159 NULL, 0, XtCacheNone, NULL);
160 XtSetTypeConverter(XtRColormap, XtRString, _XawCvtCARD32ToString,
161 NULL, 0, XtCacheNone, NULL);
162 XtSetTypeConverter(XtRFunction, XtRString, _XawCvtCARD32ToString,
163 NULL, 0, XtCacheNone, NULL);
164 XtSetTypeConverter(XtRPointer, XtRString, _XawCvtCARD32ToString,
165 NULL, 0, XtCacheNone, NULL);
166 XtSetTypeConverter(XtRScreen, XtRString, _XawCvtCARD32ToString,
167 NULL, 0, XtCacheNone, NULL);
168 XtSetTypeConverter(XtRStringArray, XtRString, _XawCvtCARD32ToString,
169 NULL, 0, XtCacheNone, NULL);
170 XtSetTypeConverter(XtRVisual, XtRString, _XawCvtCARD32ToString,
171 NULL, 0, XtCacheNone, NULL);
172 XtSetTypeConverter(XtRWidget, XtRString, _XawCvtCARD32ToString,
173 NULL, 0, XtCacheNone, NULL);
174 XtSetTypeConverter(XtRWidgetList, XtRString, _XawCvtCARD32ToString,
175 NULL, 0, XtCacheNone, NULL);
176 XtSetTypeConverter(XtRWindow, XtRString, _XawCvtCARD32ToString,
177 NULL, 0, XtCacheNone, NULL);
179 XtSetTypeConverter(XtRAtom, XtRString, _XawCvtAtomToString,
180 NULL, 0, XtCacheNone, NULL);
181 XtSetTypeConverter(XtRBool, XtRString, _XawCvtBoolToString,
182 NULL, 0, XtCacheNone, NULL);
183 XtSetTypeConverter(XtRBoolean, XtRString, _XawCvtBooleanToString,
184 NULL, 0, XtCacheNone, NULL);
185 XtSetTypeConverter(XtRCardinal, XtRString, _XawCvtCardinalToString,
186 NULL, 0, XtCacheNone, NULL);
187 XtSetTypeConverter(XtRDimension, XtRString, _XawCvtDimensionToString,
188 NULL, 0, XtCacheNone, NULL);
189 XtSetTypeConverter(XawRDisplayList, XtRString, _XawCvtDisplayListToString,
190 NULL, 0, XtCacheNone, NULL);
191 XtSetTypeConverter(XtRFontStruct, XtRString, _XawCvtFontStructToString,
192 NULL, 0, XtCacheNone, NULL);
193 XtSetTypeConverter(XtRInt, XtRString, _XawCvtIntToString,
194 NULL, 0, XtCacheNone, NULL);
195 XtSetTypeConverter(XtRPixel, XtRString, _XawCvtPixelToString,
196 &PixelArgs[0], XtNumber(PixelArgs), XtCacheNone, NULL);
197 XtSetTypeConverter(XtRPixmap, XtRString, _XawCvtPixmapToString,
198 &DLArgs[0], XtNumber(DLArgs), XtCacheNone, NULL);
199 XtSetTypeConverter(XtRPosition, XtRString, _XawCvtPositionToString,
200 NULL, 0, XtCacheNone, NULL);
201 XtSetTypeConverter(XtRShort, XtRString, _XawCvtShortToString,
202 NULL, 0, XtCacheNone, NULL);
203 XtSetTypeConverter(XtRString, XawRDisplayList, _XawCvtStringToDisplayList,
204 &DLArgs[0], XtNumber(DLArgs), XtCacheAll, NULL);
205 XtSetTypeConverter(XtRString, XtRPixmap, _XawCvtStringToPixmap,
206 &DLArgs[0], XtNumber(DLArgs), XtCacheAll, NULL);
207 XtSetTypeConverter(XtRUnsignedChar, XtRString, _XawCvtUnsignedCharToString,
208 NULL, 0, XtCacheNone, NULL);
213 XawTypeToStringWarning(Display *dpy, String type)
219 snprintf(fname, sizeof(fname), "cvt%sToString", type);
223 XtAppWarningMsg(XtDisplayToApplicationContext(dpy),
224 XtNconversionError, fname, XtCToolkitError,
225 "Cannot convert %s to String",
226 params, &num_params);
231 TypeToStringNoArgsWarning(Display *dpy, String type)
237 snprintf(fname, sizeof(fname), "cvt%sToString", type);
241 XtAppWarningMsg(XtDisplayToApplicationContext(dpy),
242 XtNconversionError, fname,
244 "%s to String conversion needs no extra arguments",
245 params, &num_params);
250 _XawCvtBooleanToString(Display *dpy, XrmValue *args, Cardinal *num_args,
251 XrmValue *fromVal, XrmValue *toVal,
252 XtPointer *converter_data)
254 static char buffer[6];
258 TypeToStringNoArgsWarning(dpy, XtRBoolean);
260 snprintf(buffer, sizeof(buffer), "%s",
261 *(Boolean *)fromVal->addr ? XtEtrue : XtEfalse);
262 size = strlen(buffer) + 1;
269 _XawCvtBoolToString(Display *dpy, XrmValue *args, Cardinal *num_args,
270 XrmValue *fromVal, XrmValue *toVal,
271 XtPointer *converter_data)
273 static char buffer[6];
277 TypeToStringNoArgsWarning(dpy, XtRBool);
279 snprintf(buffer, sizeof(buffer), "%s",
280 *(Bool *)fromVal->addr ? XtEtrue : XtEfalse);
281 size = strlen(buffer) + 1;
288 _XawCvtPositionToString(Display *dpy, XrmValue *args, Cardinal *num_args,
289 XrmValue *fromVal, XrmValue *toVal,
290 XtPointer *converter_data)
292 static char buffer[7];
296 TypeToStringNoArgsWarning(dpy, XtRPosition);
298 snprintf(buffer, sizeof(buffer), "%d", *(Position *)fromVal->addr);
299 size = strlen(buffer) + 1;
306 _XawCvtShortToString(Display *dpy, XrmValue *args, Cardinal *num_args,
307 XrmValue *fromVal, XrmValue *toVal,
308 XtPointer *converter_data)
310 static char buffer[7];
314 TypeToStringNoArgsWarning(dpy, XtRShort);
316 snprintf(buffer, sizeof(buffer), "%d", *(short *)fromVal->addr);
317 size = strlen(buffer) + 1;
324 _XawCvtDimensionToString(Display *dpy, XrmValue *args, Cardinal *num_args,
325 XrmValue *fromVal, XrmValue *toVal,
326 XtPointer *converter_data)
328 static char buffer[6];
332 TypeToStringNoArgsWarning(dpy, XtRDimension);
334 snprintf(buffer, sizeof(buffer), "%u", *(Dimension *)fromVal->addr);
335 size = strlen(buffer) + 1;
342 _XawCvtCARD32ToString(Display *dpy, XrmValue *args, Cardinal *num_args,
343 XrmValue *fromVal, XrmValue *toVal,
344 XtPointer *converter_data)
346 static char buffer[11];
350 TypeToStringNoArgsWarning(dpy, "CARD32");
352 snprintf(buffer, sizeof(buffer), "0x%08hx", *(int *)fromVal->addr);
353 size = strlen(buffer) + 1;
360 _XawCvtIntToString(Display *dpy, XrmValue *args, Cardinal *num_args,
361 XrmValue *fromVal, XrmValue *toVal,
362 XtPointer *converter_data)
364 static char buffer[12];
368 TypeToStringNoArgsWarning(dpy, XtRInt);
370 snprintf(buffer, sizeof(buffer), "%d", *(int *)fromVal->addr);
371 size = strlen(buffer) + 1;
378 _XawCvtCardinalToString(Display *dpy, XrmValue *args, Cardinal *num_args,
379 XrmValue *fromVal, XrmValue *toVal,
380 XtPointer *converter_data)
382 static char buffer[11];
386 TypeToStringNoArgsWarning(dpy, XtRCardinal);
388 snprintf(buffer, sizeof(buffer), "%u", *(Cardinal *)fromVal->addr);
389 size = strlen(buffer) + 1;
396 _XawCvtAtomToString(Display *dpy, XrmValue *args, Cardinal *num_args,
397 XrmValue *fromVal, XrmValue *toVal,
398 XtPointer *converter_data)
400 static char *buffer = NULL;
401 static char *nullatom = "NULL";
406 TypeToStringNoArgsWarning(dpy, XtRAtom);
408 if (buffer && buffer != nullatom)
411 atom = *(Atom *)fromVal[0].addr;
414 else if ((buffer = XGetAtomName(dpy, *(Atom *)fromVal[0].addr)) == NULL)
416 XawTypeToStringWarning(dpy, XtRAtom);
418 toVal->size = sizeof(String);
422 size = strlen(buffer) + 1;
429 _XawCvtPixelToString(Display *dpy, XrmValue *args, Cardinal *num_args,
430 XrmValue *fromVal, XrmValue *toVal,
431 XtPointer *converter_data)
433 static char buffer[19];
440 XtAppWarningMsg(XtDisplayToApplicationContext(dpy),
441 XtNwrongParameters, "cvtPixelToString",
443 "Pixel to String conversion needs colormap argument",
448 colormap = *(Colormap *)args[0].addr;
449 color.pixel = *(Pixel *)fromVal->addr;
452 * If we know the visual type, we can calculate the xcolor
453 * without asking Xlib.
455 XQueryColor(dpy, colormap, &color);
456 snprintf(buffer, sizeof(buffer), "rgb:%04hx/%04hx/%04hx",
457 color.red, color.green, color.blue);
458 size = strlen(buffer) + 1;
465 _XawCvtFontStructToString(Display *dpy, XrmValue *args, Cardinal *num_args,
466 XrmValue *fromVal, XrmValue *toVal,
467 XtPointer *converter_data)
469 static char buffer[128];
475 TypeToStringNoArgsWarning(dpy, XtRFontStruct);
477 if ((atom = XInternAtom(dpy, "FONT", True)) == None)
482 if (XGetFontProperty(*(XFontStruct **)fromVal->addr, atom, &value))
484 char *tmp = XGetAtomName(dpy, value);
488 snprintf(buffer, sizeof(buffer), "%s", tmp);
500 XawTypeToStringWarning(dpy, XtRFontStruct);
507 _XawCvtUnsignedCharToString(Display *dpy, XrmValue *args, Cardinal *num_args,
508 XrmValue *fromVal, XrmValue *toVal,
509 XtPointer *converter_data)
511 static char buffer[4];
515 TypeToStringNoArgsWarning(dpy, XtRUnsignedChar);
517 snprintf(buffer, sizeof(buffer), "%u",
518 *(unsigned char *)fromVal->addr);
519 size = strlen(buffer) + 1;
526 _XawCvtStringToDisplayList(Display *dpy, XrmValue *args, Cardinal *num_args,
527 XrmValue *fromVal, XrmValue *toVal,
528 XtPointer *converter_data)
530 XawDisplayList *dlist;
538 XtAppWarningMsg(XtDisplayToApplicationContext(dpy),
539 XtNwrongParameters, "cvtStringToDisplayList",
541 "String to DisplayList conversion needs screen, "
542 "colormap, and depth arguments",
547 screen = *(Screen **)args[0].addr;
548 colormap = *(Colormap *)args[1].addr;
549 depth = *(int *)args[2].addr;
551 commands = (String)(fromVal[0].addr);
553 dlist = XawCreateDisplayList(commands, screen, colormap, depth);
557 XtDisplayStringConversionWarning(dpy, (String)fromVal->addr,
560 toVal->size = sizeof(XawDisplayList*);
564 done(XawDisplayList*, dlist);
569 _XawCvtDisplayListToString(Display *dpy, XrmValue *args, Cardinal *num_args,
570 XrmValue *fromVal, XrmValue *toVal,
571 XtPointer *converter_data)
577 TypeToStringNoArgsWarning(dpy, XawRDisplayList);
579 buffer = XawDisplayListString(*(XawDisplayList **)(fromVal[0].addr));
580 size = strlen(buffer) + 1;
587 _XawCvtStringToPixmap(Display *dpy, XrmValue *args, Cardinal *num_args,
588 XrmValue *fromVal, XrmValue *toVal,
589 XtPointer *converter_data)
591 XawPixmap *xaw_pixmap;
600 XtAppWarningMsg(XtDisplayToApplicationContext(dpy),
601 XtNwrongParameters, "cvtStringToPixmap",
603 "String to Pixmap conversion needs screen, "
604 "colormap, and depth arguments",
609 screen = *(Screen **)args[0].addr;
610 colormap = *(Colormap *)args[1].addr;
611 depth = *(int *)args[2].addr;
613 name = (String)(fromVal[0].addr);
615 if (XmuCompareISOLatin1(name, "None") == 0)
617 else if (XmuCompareISOLatin1(name, "ParentRelative") == 0)
618 pixmap = ParentRelative;
619 else if (XmuCompareISOLatin1(name, "XtUnspecifiedPixmap") == 0)
620 pixmap = XtUnspecifiedPixmap;
623 xaw_pixmap = XawLoadPixmap(name, screen, colormap, depth);
626 XtDisplayStringConversionWarning(dpy, (String)fromVal->addr,
628 toVal->addr = (XtPointer)XtUnspecifiedPixmap;
629 toVal->size = sizeof(Pixmap);
633 pixmap = xaw_pixmap->pixmap;
636 done(Pixmap, pixmap);
641 _XawCvtPixmapToString(Display *dpy, XrmValue *args, Cardinal *num_args,
642 XrmValue *fromVal, XrmValue *toVal,
643 XtPointer *converter_data)
645 XawPixmap *xaw_pixmap;
650 String buffer = NULL;
655 XtAppWarningMsg(XtDisplayToApplicationContext(dpy),
656 XtNwrongParameters, "cvtPixmapToString",
658 "Pixmap to String conversion needs screen, "
659 "colormap, and depth arguments",
664 screen = *(Screen **)args[0].addr;
665 colormap = *(Colormap *)args[1].addr;
666 depth = *(int *)args[2].addr;
668 pixmap = *(Pixmap *)(fromVal[0].addr);
676 buffer = "ParentRelative";
678 case XtUnspecifiedPixmap:
679 buffer = "XtUnspecifiedPixmap";
682 xaw_pixmap = XawPixmapFromXPixmap(pixmap, screen, colormap, depth);
684 buffer = xaw_pixmap->name;
689 /* Bad Pixmap or Pixmap was not loaded by XawLoadPixmap() */
690 return (_XawCvtCARD32ToString(dpy, args, num_args, fromVal, toVal,
693 size = strlen(buffer) + 1;