1 /*
2  * Copyright (c) 1998 by The XFree86 Project, Inc.
3  *
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:
10  *
11  * The above copyright notice and this permission notice shall be included in
12  * all copies or substantial portions of the Software.
13  *
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
20  * SOFTWARE.
21  *
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
25  * XFree86 Project.
26  */
27 
28 #ifdef HAVE_CONFIG_H
29 #include <config.h>
30 #endif
31 #include <stdio.h>
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>
37 #include "Private.h"
38 
39 #ifndef OLDXAW
40 
41 /*
42  * Definitions
43  */
44 #define done(type, value)			\
45 {						\
46   if (toVal->addr != NULL)			\
47     {						\
48       if (toVal->size < sizeof(type))		\
49 	{					\
50 	  toVal->size = sizeof(type);		\
51 	  return (False);			\
52 	}					\
53       *(type *)(toVal->addr) = (value);		\
54     }						\
55   else						\
56     {						\
57       static type static_val;			\
58 						\
59       static_val = (value);			\
60       toVal->addr = (XPointer)&static_val;	\
61     }						\
62   toVal->size = sizeof(type);			\
63   return (True);				\
64 }
65 
66 #define string_done(value)			\
67 {						\
68   if (toVal->addr != NULL)			\
69     {						\
70       if (toVal->size < size)			\
71 	{					\
72 	  toVal->size = size;			\
73 	  return (False);			\
74 	}					\
75       strcpy((char *)toVal->addr, (value));	\
76     }						\
77   else						\
78     toVal->addr = (XPointer)(value);		\
79   toVal->size = size;				\
80   return (True);				\
81 }
82 
83 /*
84  * Prototypes
85  */
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);
119 
120 /*
121  * Initialization
122  */
123 static XtConvertArgRec PixelArgs[] = {
124   {XtWidgetBaseOffset, (XtPointer)XtOffsetOf(WidgetRec, core.colormap),
125    sizeof(Colormap)},
126 };
127 
128 static XtConvertArgRec DLArgs[] = {
129   {XtWidgetBaseOffset, (XtPointer)XtOffsetOf(WidgetRec, core.screen),
130    sizeof(Screen *)},
131   {XtWidgetBaseOffset, (XtPointer)XtOffsetOf(WidgetRec, core.colormap),
132    sizeof(Colormap)},
133   {XtWidgetBaseOffset, (XtPointer)XtOffsetOf(WidgetRec, core.depth),
134    sizeof(int)},
135 };
136 #endif /* OLDXAW */
137 
138 static String XtCToolkitError = "ToolkitError";
139 static String XtNconversionError = "conversionError";
140 
141 #ifndef OLDXAW
142 static String XtNwrongParameters = "wrongParameters";
143 
144 /*
145  * Implementation
146  */
147 void
XawInitializeDefaultConverters(void)148 XawInitializeDefaultConverters(void)
149 {
150   static Boolean first_time = True;
151 
152   if (first_time == False)
153     return;
154 
155   first_time = False;
156 
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);
178 
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);
209 }
210 #endif /* OLDXAW */
211 
212 void
XawTypeToStringWarning(Display * dpy,String type)213 XawTypeToStringWarning(Display *dpy, String type)
214 {
215   char fname[64];
216   String params[1];
217   Cardinal num_params;
218 
219   snprintf(fname, sizeof(fname), "cvt%sToString", type);
220 
221   params[0] = type;
222   num_params = 1;
223   XtAppWarningMsg(XtDisplayToApplicationContext(dpy),
224 		  XtNconversionError, fname, XtCToolkitError,
225 		  "Cannot convert %s to String",
226 		  params, &num_params);
227 }
228 
229 #ifndef OLDXAW
230 static void
TypeToStringNoArgsWarning(Display * dpy,String type)231 TypeToStringNoArgsWarning(Display *dpy, String type)
232 {
233   char fname[64];
234   String params[1];
235   Cardinal num_params;
236 
237   snprintf(fname, sizeof(fname), "cvt%sToString", type);
238 
239   params[0] = type;
240   num_params = 1;
241   XtAppWarningMsg(XtDisplayToApplicationContext(dpy),
242 		  XtNconversionError, fname,
243 		  XtCToolkitError,
244 		  "%s to String conversion needs no extra arguments",
245 		  params, &num_params);
246 }
247 
248 /*ARGSUSED*/
249 static Boolean
_XawCvtBooleanToString(Display * dpy,XrmValue * args _X_UNUSED,Cardinal * num_args,XrmValue * fromVal,XrmValue * toVal,XtPointer * converter_data _X_UNUSED)250 _XawCvtBooleanToString(Display *dpy, XrmValue *args _X_UNUSED, Cardinal *num_args,
251 		       XrmValue *fromVal, XrmValue *toVal,
252 		       XtPointer *converter_data _X_UNUSED)
253 {
254   static char buffer[6];
255   Cardinal size;
256 
257   if (*num_args != 0)
258     TypeToStringNoArgsWarning(dpy, XtRBoolean);
259 
260   snprintf(buffer, sizeof(buffer), "%s",
261 	   *(Boolean *)fromVal->addr ? XtEtrue : XtEfalse);
262   size = (Cardinal)(strlen(buffer) + 1);
263 
264   string_done(buffer);
265 }
266 
267 /*ARGSUSED*/
268 static Boolean
_XawCvtBoolToString(Display * dpy,XrmValue * args _X_UNUSED,Cardinal * num_args,XrmValue * fromVal,XrmValue * toVal,XtPointer * converter_data _X_UNUSED)269 _XawCvtBoolToString(Display *dpy, XrmValue *args _X_UNUSED, Cardinal *num_args,
270 		    XrmValue *fromVal, XrmValue *toVal,
271 		    XtPointer *converter_data _X_UNUSED)
272 {
273   static char buffer[6];
274   Cardinal size;
275 
276   if (*num_args != 0)
277     TypeToStringNoArgsWarning(dpy, XtRBool);
278 
279   snprintf(buffer, sizeof(buffer), "%s",
280 	   *(Bool *)fromVal->addr ? XtEtrue : XtEfalse);
281   size = (Cardinal)(strlen(buffer) + 1);
282 
283   string_done(buffer);
284 }
285 
286 /*ARGSUSED*/
287 static Boolean
_XawCvtPositionToString(Display * dpy,XrmValue * args _X_UNUSED,Cardinal * num_args,XrmValue * fromVal,XrmValue * toVal,XtPointer * converter_data _X_UNUSED)288 _XawCvtPositionToString(Display *dpy, XrmValue *args _X_UNUSED, Cardinal *num_args,
289 			XrmValue *fromVal, XrmValue *toVal,
290 			XtPointer *converter_data _X_UNUSED)
291 {
292   static char buffer[7];
293   Cardinal size;
294 
295   if (*num_args != 0)
296     TypeToStringNoArgsWarning(dpy, XtRPosition);
297 
298   snprintf(buffer, sizeof(buffer), "%d", *(Position *)fromVal->addr);
299   size = (Cardinal)(strlen(buffer) + 1);
300 
301   string_done(buffer);
302 }
303 
304 /*ARGSUSED*/
305 static Boolean
_XawCvtShortToString(Display * dpy,XrmValue * args _X_UNUSED,Cardinal * num_args,XrmValue * fromVal,XrmValue * toVal,XtPointer * converter_data _X_UNUSED)306 _XawCvtShortToString(Display *dpy, XrmValue *args _X_UNUSED, Cardinal *num_args,
307 		     XrmValue *fromVal, XrmValue *toVal,
308 		     XtPointer *converter_data _X_UNUSED)
309 {
310   static char buffer[7];
311   Cardinal size;
312 
313   if (*num_args != 0)
314     TypeToStringNoArgsWarning(dpy, XtRShort);
315 
316   snprintf(buffer, sizeof(buffer), "%d", *(short *)fromVal->addr);
317   size = (Cardinal)(strlen(buffer) + 1);
318 
319   string_done(buffer);
320 }
321 
322 /*ARGSUSED*/
323 static Boolean
_XawCvtDimensionToString(Display * dpy,XrmValue * args _X_UNUSED,Cardinal * num_args,XrmValue * fromVal,XrmValue * toVal,XtPointer * converter_data _X_UNUSED)324 _XawCvtDimensionToString(Display *dpy, XrmValue *args _X_UNUSED, Cardinal *num_args,
325 			 XrmValue *fromVal, XrmValue *toVal,
326 			 XtPointer *converter_data _X_UNUSED)
327 {
328   static char buffer[6];
329   Cardinal size;
330 
331   if (*num_args != 0)
332     TypeToStringNoArgsWarning(dpy, XtRDimension);
333 
334   snprintf(buffer, sizeof(buffer), "%u", *(Dimension *)fromVal->addr);
335   size = (Cardinal)(strlen(buffer) + 1);
336 
337   string_done(buffer);
338 }
339 
340 /*ARGSUSED*/
341 static Boolean
_XawCvtCARD32ToString(Display * dpy,XrmValue * args _X_UNUSED,Cardinal * num_args,XrmValue * fromVal,XrmValue * toVal,XtPointer * converter_data _X_UNUSED)342 _XawCvtCARD32ToString(Display *dpy, XrmValue *args _X_UNUSED, Cardinal *num_args,
343 		      XrmValue *fromVal, XrmValue *toVal,
344 		      XtPointer *converter_data _X_UNUSED)
345 {
346   static char buffer[11];
347   Cardinal size;
348 
349   if (*num_args != 0)
350     TypeToStringNoArgsWarning(dpy, "CARD32");
351 
352   snprintf(buffer, sizeof(buffer), "0x%08hx", *(int *)fromVal->addr);
353   size = (Cardinal)(strlen(buffer) + 1);
354 
355   string_done(buffer);
356 }
357 
358 /*ARGSUSED*/
359 static Boolean
_XawCvtIntToString(Display * dpy,XrmValue * args _X_UNUSED,Cardinal * num_args,XrmValue * fromVal,XrmValue * toVal,XtPointer * converter_data _X_UNUSED)360 _XawCvtIntToString(Display *dpy, XrmValue *args _X_UNUSED, Cardinal *num_args,
361 		   XrmValue *fromVal, XrmValue *toVal,
362 		   XtPointer *converter_data _X_UNUSED)
363 {
364   static char buffer[12];
365   Cardinal size;
366 
367   if (*num_args != 0)
368     TypeToStringNoArgsWarning(dpy, XtRInt);
369 
370   snprintf(buffer, sizeof(buffer), "%d", *(int *)fromVal->addr);
371   size = (Cardinal)(strlen(buffer) + 1);
372 
373   string_done(buffer);
374 }
375 
376 /*ARGSUSED*/
377 static Boolean
_XawCvtCardinalToString(Display * dpy,XrmValue * args _X_UNUSED,Cardinal * num_args,XrmValue * fromVal,XrmValue * toVal,XtPointer * converter_data _X_UNUSED)378 _XawCvtCardinalToString(Display *dpy, XrmValue *args _X_UNUSED, Cardinal *num_args,
379 			XrmValue *fromVal, XrmValue *toVal,
380 			XtPointer *converter_data _X_UNUSED)
381 {
382   static char buffer[11];
383   Cardinal size;
384 
385   if (*num_args != 0)
386     TypeToStringNoArgsWarning(dpy, XtRCardinal);
387 
388   snprintf(buffer, sizeof(buffer), "%u", *(Cardinal *)fromVal->addr);
389   size = (Cardinal)(strlen(buffer) + 1);
390 
391   string_done(buffer);
392 }
393 
394 /*ARGSUSED*/
395 static Boolean
_XawCvtAtomToString(Display * dpy,XrmValue * args _X_UNUSED,Cardinal * num_args,XrmValue * fromVal,XrmValue * toVal,XtPointer * converter_data _X_UNUSED)396 _XawCvtAtomToString(Display *dpy, XrmValue *args _X_UNUSED, Cardinal *num_args,
397 		    XrmValue *fromVal, XrmValue *toVal,
398 		    XtPointer *converter_data _X_UNUSED)
399 {
400   static char *buffer = NULL;
401   static char *nullatom = (char *)"NULL";
402   Cardinal size;
403   Atom atom;
404 
405   if (*num_args != 0)
406     TypeToStringNoArgsWarning(dpy, XtRAtom);
407 
408   if (buffer && buffer != nullatom)
409     XFree(buffer);
410 
411   atom = *(Atom *)fromVal[0].addr;
412   if (atom == 0)
413     buffer = nullatom;
414   else if ((buffer = XGetAtomName(dpy, *(Atom *)fromVal[0].addr)) == NULL)
415     {
416       XawTypeToStringWarning(dpy, XtRAtom);
417       toVal->addr = NULL;
418       toVal->size = sizeof(String);
419       return (False);
420     }
421 
422   size = (Cardinal)(strlen(buffer) + 1);
423 
424   string_done(buffer);
425 }
426 
427 /*ARGSUSED*/
428 static Boolean
_XawCvtPixelToString(Display * dpy,XrmValue * args,Cardinal * num_args,XrmValue * fromVal,XrmValue * toVal,XtPointer * converter_data _X_UNUSED)429 _XawCvtPixelToString(Display *dpy, XrmValue *args, Cardinal *num_args,
430 		     XrmValue *fromVal, XrmValue *toVal,
431 		     XtPointer *converter_data _X_UNUSED)
432 {
433   static char buffer[19];
434   Cardinal size;
435   Colormap colormap;
436   XColor color;
437 
438   if (*num_args != 1)
439     {
440       XtAppWarningMsg(XtDisplayToApplicationContext(dpy),
441 		      XtNwrongParameters, "cvtPixelToString",
442 		      XtCToolkitError,
443 		      "Pixel to String conversion needs colormap argument",
444 		      NULL, NULL);
445       return (False);
446     }
447 
448   colormap = *(Colormap *)args[0].addr;
449   color.pixel = *(Pixel *)fromVal->addr;
450 
451   /* Note:
452    * If we know the visual type, we can calculate the xcolor
453    * without asking Xlib.
454    */
455   XQueryColor(dpy, colormap, &color);
456   snprintf(buffer, sizeof(buffer), "rgb:%04hx/%04hx/%04hx",
457 	   color.red, color.green, color.blue);
458   size = (Cardinal)(strlen(buffer) + 1);
459 
460   string_done(buffer);
461 }
462 
463 /*ARGSUSED*/
464 static Boolean
_XawCvtFontStructToString(Display * dpy,XrmValue * args _X_UNUSED,Cardinal * num_args,XrmValue * fromVal,XrmValue * toVal,XtPointer * converter_data _X_UNUSED)465 _XawCvtFontStructToString(Display *dpy, XrmValue *args _X_UNUSED, Cardinal *num_args,
466 			  XrmValue *fromVal, XrmValue *toVal,
467 			  XtPointer *converter_data _X_UNUSED)
468 {
469   static char buffer[128];
470   Cardinal size;
471   Atom atom;
472   unsigned long value;
473 
474   if (*num_args != 0)
475     TypeToStringNoArgsWarning(dpy, XtRFontStruct);
476 
477   if ((atom = XInternAtom(dpy, "FONT", True)) == None)
478     return (False);
479 
480   size = 0;
481 
482   if (XGetFontProperty(*(XFontStruct **)fromVal->addr, atom, &value))
483     {
484       char *tmp = XGetAtomName(dpy, value);
485 
486       if (tmp)
487 	{
488 	  snprintf(buffer, sizeof(buffer), "%s", tmp);
489 	  size = (Cardinal)strlen(tmp);
490 	  XFree(tmp);
491 	}
492     }
493 
494   if (size)
495     {
496       ++size;
497     string_done(buffer);
498     }
499 
500   XawTypeToStringWarning(dpy, XtRFontStruct);
501 
502   return (False);
503 }
504 
505 /*ARGSUSED*/
506 static Boolean
_XawCvtUnsignedCharToString(Display * dpy,XrmValue * args _X_UNUSED,Cardinal * num_args,XrmValue * fromVal,XrmValue * toVal,XtPointer * converter_data _X_UNUSED)507 _XawCvtUnsignedCharToString(Display *dpy, XrmValue *args _X_UNUSED, Cardinal *num_args,
508 			    XrmValue *fromVal, XrmValue *toVal,
509 			    XtPointer *converter_data _X_UNUSED)
510 {
511   static char buffer[4];
512   Cardinal size;
513 
514   if (*num_args != 0)
515     TypeToStringNoArgsWarning(dpy, XtRUnsignedChar);
516 
517   snprintf(buffer, sizeof(buffer), "%u",
518 	   *(unsigned char *)fromVal->addr);
519   size = (Cardinal)(strlen(buffer) + 1);
520 
521   string_done(buffer);
522 }
523 
524 /*ARGSUSED*/
525 static Boolean
_XawCvtStringToDisplayList(Display * dpy,XrmValue * args,Cardinal * num_args,XrmValue * fromVal,XrmValue * toVal,XtPointer * converter_data _X_UNUSED)526 _XawCvtStringToDisplayList(Display *dpy, XrmValue *args, Cardinal *num_args,
527 			   XrmValue *fromVal, XrmValue *toVal,
528 			   XtPointer *converter_data _X_UNUSED)
529 {
530   XawDisplayList *dlist;
531   Screen *screen;
532   Colormap colormap;
533   int depth;
534   String commands;
535 
536   if (*num_args != 3)
537     {
538       XtAppWarningMsg(XtDisplayToApplicationContext(dpy),
539 		      XtNwrongParameters, "cvtStringToDisplayList",
540 		      XtCToolkitError,
541 		      "String to DisplayList conversion needs screen, "
542 		      "colormap, and depth arguments",
543 		      NULL, NULL);
544       return (False);
545     }
546 
547   screen     = *(Screen **)args[0].addr;
548   colormap   = *(Colormap *)args[1].addr;
549   depth      = *(int *)args[2].addr;
550 
551   commands = (String)(fromVal[0].addr);
552 
553   dlist = XawCreateDisplayList(commands, screen, colormap, depth);
554 
555   if (!dlist)
556     {
557       XtDisplayStringConversionWarning(dpy, (String)fromVal->addr,
558 				       XawRDisplayList);
559       toVal->addr = NULL;
560       toVal->size = sizeof(XawDisplayList*);
561       return (False);
562     }
563 
564   done(XawDisplayList*, dlist);
565 }
566 
567 /*ARGSUSED*/
568 static Boolean
_XawCvtDisplayListToString(Display * dpy,XrmValue * args _X_UNUSED,Cardinal * num_args,XrmValue * fromVal,XrmValue * toVal,XtPointer * converter_data _X_UNUSED)569 _XawCvtDisplayListToString(Display *dpy, XrmValue *args _X_UNUSED, Cardinal *num_args,
570 			   XrmValue *fromVal, XrmValue *toVal,
571 			   XtPointer *converter_data _X_UNUSED)
572 {
573   String buffer;
574   Cardinal size;
575 
576   if (*num_args != 0)
577     TypeToStringNoArgsWarning(dpy, XawRDisplayList);
578 
579   buffer = XawDisplayListString(*(XawDisplayList **)(fromVal[0].addr));
580   size = (Cardinal)(strlen(buffer) + 1);
581 
582   string_done(buffer);
583 }
584 
585 /*ARGSUSED*/
586 static Boolean
_XawCvtStringToPixmap(Display * dpy,XrmValue * args,Cardinal * num_args,XrmValue * fromVal,XrmValue * toVal,XtPointer * converter_data _X_UNUSED)587 _XawCvtStringToPixmap(Display *dpy, XrmValue *args, Cardinal *num_args,
588 		      XrmValue *fromVal, XrmValue *toVal,
589 		      XtPointer *converter_data _X_UNUSED)
590 {
591   XawPixmap *xaw_pixmap;
592   Pixmap pixmap;
593   Screen *screen;
594   Colormap colormap;
595   int depth;
596   String name;
597 
598   if (*num_args != 3)
599     {
600       XtAppWarningMsg(XtDisplayToApplicationContext(dpy),
601 		      XtNwrongParameters, "cvtStringToPixmap",
602 		      XtCToolkitError,
603 		      "String to Pixmap conversion needs screen, "
604 		      "colormap, and depth arguments",
605 		      NULL, NULL);
606       return (False);
607     }
608 
609   screen     = *(Screen **)args[0].addr;
610   colormap   = *(Colormap *)args[1].addr;
611   depth      = *(int *)args[2].addr;
612 
613   name = (String)(fromVal[0].addr);
614 
615   if (XmuCompareISOLatin1(name, "None") == 0)
616     pixmap = None;
617   else if (XmuCompareISOLatin1(name, "ParentRelative") == 0)
618     pixmap = ParentRelative;
619   else if (XmuCompareISOLatin1(name, "XtUnspecifiedPixmap") == 0)
620     pixmap = XtUnspecifiedPixmap;
621   else
622     {
623       xaw_pixmap = XawLoadPixmap(name, screen, colormap, depth);
624       if (!xaw_pixmap)
625 	{
626 	  XtDisplayStringConversionWarning(dpy, (String)fromVal->addr,
627 					   XtRPixmap);
628 	  toVal->addr = (XtPointer)XtUnspecifiedPixmap;
629 	  toVal->size = sizeof(Pixmap);
630 	  return (False);
631 	}
632       else
633 	pixmap = xaw_pixmap->pixmap;
634     }
635 
636   done(Pixmap, pixmap);
637 }
638 
639 /*ARGSUSED*/
640 static Boolean
_XawCvtPixmapToString(Display * dpy,XrmValue * args,Cardinal * num_args,XrmValue * fromVal,XrmValue * toVal,XtPointer * converter_data)641 _XawCvtPixmapToString(Display *dpy, XrmValue *args, Cardinal *num_args,
642 		      XrmValue *fromVal, XrmValue *toVal,
643 		      XtPointer *converter_data)
644 {
645   XawPixmap *xaw_pixmap;
646   Pixmap pixmap;
647   Screen *screen;
648   Colormap colormap;
649   int depth;
650   String buffer = NULL;
651   Cardinal size;
652 
653   if (*num_args != 3)
654     {
655       XtAppWarningMsg(XtDisplayToApplicationContext(dpy),
656 		      XtNwrongParameters, "cvtPixmapToString",
657 		      XtCToolkitError,
658 		      "Pixmap to String conversion needs screen, "
659 		      "colormap, and depth arguments",
660 		      NULL, NULL);
661       return (False);
662     }
663 
664   screen     = *(Screen **)args[0].addr;
665   colormap   = *(Colormap *)args[1].addr;
666   depth      = *(int *)args[2].addr;
667 
668   pixmap = *(Pixmap *)(fromVal[0].addr);
669 
670   switch (pixmap)
671     {
672     case None:
673       buffer = "None";
674       break;
675     case ParentRelative:
676       buffer = "ParentRelative";
677       break;
678     case XtUnspecifiedPixmap:
679       buffer = "XtUnspecifiedPixmap";
680       break;
681     default:
682       xaw_pixmap = XawPixmapFromXPixmap(pixmap, screen, colormap, depth);
683       if (xaw_pixmap)
684 	buffer = xaw_pixmap->name;
685       break;
686     }
687 
688   if (!buffer)
689     /* Bad Pixmap or Pixmap was not loaded by XawLoadPixmap() */
690     return (_XawCvtCARD32ToString(dpy, args, num_args, fromVal, toVal,
691 				  converter_data));
692 
693   size = (Cardinal)(strlen(buffer) + 1);
694 
695   string_done(buffer);
696 }
697 
698 #endif /* OLDXAW */
699