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