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