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