|
|
1.1 ! root 1: #ifndef lint ! 2: static char *sccsid = "@(#)Conversion.c 1.11 3/19/87"; ! 3: #endif lint ! 4: ! 5: /* ! 6: * Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts. ! 7: * ! 8: * All Rights Reserved ! 9: * ! 10: * Permission to use, copy, modify, and distribute this software and its ! 11: * documentation for any purpose and without fee is hereby granted, ! 12: * provided that the above copyright notice appear in all copies and that ! 13: * both that copyright notice and this permission notice appear in ! 14: * supporting documentation, and that the name of Digital Equipment ! 15: * Corporation not be used in advertising or publicity pertaining to ! 16: * distribution of the software without specific, written prior permission. ! 17: * ! 18: * ! 19: * DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ! 20: * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL ! 21: * DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ! 22: * ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, ! 23: * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ! 24: * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS ! 25: * SOFTWARE. ! 26: */ ! 27: ! 28: ! 29: /* Conversion.c - implementations of resource type conversion procs */ ! 30: ! 31: #include "Xlib.h" ! 32: #include "Xutil.h" ! 33: #include "Xresource.h" ! 34: #include "XrmConvert.h" ! 35: #include "Conversion.h" ! 36: #include "Quarks.h" ! 37: #include "cursorfont.h" ! 38: #include <sys/file.h> ! 39: #include <stdio.h> ! 40: ! 41: #define done(address, type) \ ! 42: { (*toVal).size = sizeof(type); (*toVal).addr = (caddr_t) address; } ! 43: ! 44: static void CvtXColorToPixel(); ! 45: ! 46: static void CvtGeometryToDims(); ! 47: ! 48: static void CvtIntToBoolean(); ! 49: static void CvtIntToFont(); ! 50: static void CvtIntOrPixelToXColor(); ! 51: static void CvtIntToPixel(); ! 52: ! 53: static void CvtStringToBoolean(); ! 54: static void CvtStringToXColor(); ! 55: static void CvtStringToCursor(); ! 56: static void CvtStringToDisplay(); ! 57: extern void CvtStringToEventBindings(); ! 58: static void CvtStringToFile(); ! 59: static void CvtStringToFont(); ! 60: static void CvtStringToFontStruct(); ! 61: static void CvtStringToGeometry(); ! 62: static void CvtStringToInt(); ! 63: static void CvtStringToPixel(); ! 64: static void CvtStringToPixmap(); ! 65: ! 66: void _XLowerCase(source, dest) ! 67: register char *source, *dest; ! 68: { ! 69: register char ch; ! 70: ! 71: for (; (ch = *source) != 0; source++, dest++) { ! 72: if ('A' <= ch && ch <= 'Z') ! 73: *dest = ch - 'A' + 'a'; ! 74: else ! 75: *dest = ch; ! 76: } ! 77: *dest = 0; ! 78: } ! 79: ! 80: ! 81: /*ARGSUSED*/ ! 82: static void CvtIntToBoolean(dpy, fromVal, toVal) ! 83: Display *dpy; ! 84: XrmValue fromVal; ! 85: XrmValue *toVal; ! 86: { ! 87: static int b; ! 88: ! 89: b = (int) (*(int *)fromVal.addr != 0); ! 90: done(&b, int); ! 91: }; ! 92: ! 93: ! 94: /*ARGSUSED*/ ! 95: static void CvtStringToBoolean(dpy, fromVal, toVal) ! 96: Display *dpy; ! 97: XrmValue fromVal; ! 98: XrmValue *toVal; ! 99: { ! 100: static int b; ! 101: XrmQuark q; ! 102: char lowerName[1000]; ! 103: ! 104: _XLowerCase((char *) fromVal.addr, lowerName); ! 105: q = XrmAtomToQuark(lowerName); ! 106: ! 107: if (q == XrmQEtrue) { b = 1; done(&b, int); return; } ! 108: if (q == XrmQEon) { b = 1; done(&b, int); return; } ! 109: if (q == XrmQEyes) { b = 1; done(&b, int); return; } ! 110: ! 111: if (q == XrmQEfalse) { b = 0; done(&b, int); return; } ! 112: if (q == XrmQEoff) { b = 0; done(&b, int); return; } ! 113: if (q == XrmQEno) { b = 0; done(&b, int); return; } ! 114: }; ! 115: ! 116: ! 117: /*ARGSUSED*/ ! 118: static void CvtIntOrPixelToXColor(dpy, fromVal, toVal) ! 119: Display *dpy; ! 120: XrmValue fromVal; ! 121: XrmValue *toVal; ! 122: { ! 123: static XColor c; ! 124: ! 125: /* ! 126: if (DefaultVisual(dpy, DefaultScreen(dpy))->class == StaticGray) ! 127: return; ! 128: */ ! 129: ! 130: c.pixel = *(int *)fromVal.addr; ! 131: XQueryColor(dpy, DefaultColormap(dpy, DefaultScreen(dpy)), &c); ! 132: /* !!! Need some error checking ... ||| */ ! 133: done(&c, XColor); ! 134: }; ! 135: ! 136: ! 137: /*ARGSUSED*/ ! 138: static void CvtStringToXColor(dpy, fromVal, toVal) ! 139: Display *dpy; ! 140: XrmValue fromVal; ! 141: XrmValue *toVal; ! 142: { ! 143: static XColor c; ! 144: Status s; ! 145: ! 146: /* ! 147: if (DefaultVisual(dpy, DefaultScreen(dpy))->class == StaticGray) ! 148: return; ! 149: */ ! 150: ! 151: s = XParseColor(dpy, DefaultColormap(dpy, DefaultScreen(dpy)), ! 152: (char *)fromVal.addr, &c); ! 153: if (s == 0) return; ! 154: s = XAllocColor(dpy, DefaultColormap(dpy, DefaultScreen(dpy)), &c); ! 155: if (s == 0) return; ! 156: done(&c, XColor); ! 157: }; ! 158: ! 159: ! 160: /*ARGSUSED*/ ! 161: static void CvtStringToCursor(dpy, fromVal, toVal) ! 162: Display *dpy; ! 163: XrmValue fromVal; ! 164: XrmValue *toVal; ! 165: { ! 166: #define count(array) (sizeof(array)/sizeof(array[0])) ! 167: ! 168: static struct _CursorName { ! 169: char *name; ! 170: unsigned int shape; ! 171: } cursor_names[] = { ! 172: {"X_cursor", XC_X_cursor}, ! 173: {"arrow", XC_arrow}, ! 174: {"based_arrow_down", XC_based_arrow_down}, ! 175: {"based_arrow_up", XC_based_arrow_up}, ! 176: {"boat", XC_boat}, ! 177: {"bogosity", XC_bogosity}, ! 178: {"bottom_left_corner", XC_bottom_left_corner}, ! 179: {"bottom_right_corner", XC_bottom_right_corner}, ! 180: {"bottom_side", XC_bottom_side}, ! 181: {"bottom_tee", XC_bottom_tee}, ! 182: {"box_spiral", XC_box_spiral}, ! 183: {"center_ptr", XC_center_ptr}, ! 184: {"circle", XC_circle}, ! 185: {"clock", XC_clock}, ! 186: {"coffee_mug", XC_coffee_mug}, ! 187: {"cross", XC_cross}, ! 188: {"cross_reverse", XC_cross_reverse}, ! 189: {"crosshair", XC_crosshair}, ! 190: {"diamond_cross", XC_diamond_cross}, ! 191: {"dot", XC_dot}, ! 192: {"dotbox", XC_dotbox}, ! 193: {"double_arrow", XC_double_arrow}, ! 194: {"draft_large", XC_draft_large}, ! 195: {"draft_small", XC_draft_small}, ! 196: {"draped_box", XC_draped_box}, ! 197: {"exchange", XC_exchange}, ! 198: {"fleur", XC_fleur}, ! 199: {"gobbler", XC_gobbler}, ! 200: {"gumby", XC_gumby}, ! 201: {"hand1", XC_hand1}, ! 202: {"hand2", XC_hand2}, ! 203: {"heart", XC_heart}, ! 204: {"icon", XC_icon}, ! 205: {"iron_cross", XC_iron_cross}, ! 206: {"left_ptr", XC_left_ptr}, ! 207: {"left_side", XC_left_side}, ! 208: {"left_tee", XC_left_tee}, ! 209: {"leftbutton", XC_leftbutton}, ! 210: {"ll_angle", XC_ll_angle}, ! 211: {"lr_angle", XC_lr_angle}, ! 212: {"man", XC_man}, ! 213: {"middlebutton", XC_middlebutton}, ! 214: {"mouse", XC_mouse}, ! 215: {"pencil", XC_pencil}, ! 216: {"pirate", XC_pirate}, ! 217: {"plus", XC_plus}, ! 218: {"question_arrow", XC_question_arrow}, ! 219: {"right_ptr", XC_right_ptr}, ! 220: {"right_side", XC_right_side}, ! 221: {"right_tee", XC_right_tee}, ! 222: {"rightbutton", XC_rightbutton}, ! 223: {"rtl_logo", XC_rtl_logo}, ! 224: {"sailboat", XC_sailboat}, ! 225: {"sb_down_arrow", XC_sb_down_arrow}, ! 226: {"sb_h_double_arrow", XC_sb_h_double_arrow}, ! 227: {"sb_left_arrow", XC_sb_left_arrow}, ! 228: {"sb_right_arrow", XC_sb_right_arrow}, ! 229: {"sb_up_arrow", XC_sb_up_arrow}, ! 230: {"sb_v_double_arrow", XC_sb_v_double_arrow}, ! 231: {"shuttle", XC_shuttle}, ! 232: {"sizing", XC_sizing}, ! 233: {"spider", XC_spider}, ! 234: {"spraycan", XC_spraycan}, ! 235: {"star", XC_star}, ! 236: {"target", XC_target}, ! 237: {"tcross", XC_tcross}, ! 238: {"top_left_arrow", XC_top_left_arrow}, ! 239: {"top_left_corner", XC_top_left_corner}, ! 240: {"top_right_corner", XC_top_right_corner}, ! 241: {"top_side", XC_top_side}, ! 242: {"top_tee", XC_top_tee}, ! 243: {"trek", XC_trek}, ! 244: {"ul_angle", XC_ul_angle}, ! 245: {"umbrella", XC_umbrella}, ! 246: {"ur_angle", XC_ur_angle}, ! 247: {"watch", XC_watch}, ! 248: {"xterm", XC_xterm}, ! 249: }; ! 250: struct _CursorName *cache; ! 251: Cursor cursor; ! 252: char *name = (char *)fromVal.addr; ! 253: int i, found = False; ! 254: ! 255: /* linear search, for now; can improve on this later */ ! 256: for( i=0,cache=cursor_names; i < count(cursor_names); i++,cache++ ) { ! 257: if (strcmp(name, cache->name) == 0) { ! 258: found = True; ! 259: break; ! 260: } ! 261: } ! 262: ! 263: if (found) { ! 264: /* cacheing is actually done by higher layers of Xrm */ ! 265: cursor = XCreateFontCursor( dpy, cache->shape ); ! 266: done(&cursor, Cursor); ! 267: } ! 268: }; ! 269: ! 270: ! 271: /*ARGSUSED*/ ! 272: static void CvtGeometryToDims(dpy, fromVal, toVal) ! 273: Display *dpy; ! 274: XrmValue fromVal; ! 275: XrmValue *toVal; ! 276: { ! 277: done(&((Geometry *)fromVal.addr)->dims, Dims); ! 278: }; ! 279: ! 280: ! 281: /*ARGSUSED*/ ! 282: static void CvtStringToDisplay(dpy, fromVal, toVal) ! 283: Display *dpy; ! 284: XrmValue fromVal; ! 285: XrmValue *toVal; ! 286: { ! 287: static Display *d; ! 288: ! 289: d = XOpenDisplay((char *)fromVal.addr); ! 290: if (d != NULL) { done(d, Display); } ! 291: }; ! 292: ! 293: ! 294: /*ARGSUSED*/ ! 295: static void CvtStringToFile(dpy, fromVal, toVal) ! 296: Display *dpy; ! 297: XrmValue fromVal; ! 298: XrmValue *toVal; ! 299: { ! 300: static FILE *f; ! 301: ! 302: f = fopen((char *)fromVal.addr, "r"); ! 303: if (f != NULL) { done(f, FILE); } ! 304: }; ! 305: ! 306: ! 307: /*ARGSUSED*/ ! 308: static void CvtStringToFont(dpy, fromVal, toVal) ! 309: Display *dpy; ! 310: XrmValue fromVal; ! 311: XrmValue *toVal; ! 312: { ! 313: static Font f; ! 314: ! 315: f = XLoadFont(dpy, (char *)fromVal.addr); ! 316: if (f != 0) { done(&f, Font); } ! 317: } ! 318: ! 319: ! 320: /*ARGSUSED*/ ! 321: static void CvtIntToFont(dpy, fromVal, toVal) ! 322: Display *dpy; ! 323: XrmValue fromVal; ! 324: XrmValue *toVal; ! 325: { ! 326: done(fromVal.addr, int); ! 327: }; ! 328: ! 329: ! 330: /*ARGSUSED*/ ! 331: static void CvtStringToFontStruct(dpy, fromVal, toVal) ! 332: Display *dpy; ! 333: XrmValue fromVal; ! 334: XrmValue *toVal; ! 335: { ! 336: static XFontStruct *f; ! 337: ! 338: f = XLoadQueryFont(dpy, (char *)fromVal.addr); ! 339: if (f != NULL) { done(&f, XFontStruct *); } ! 340: } ! 341: ! 342: /*ARGSUSED*/ ! 343: static void CvtStringToGeometry(dpy, fromVal, toVal) ! 344: Display *dpy; ! 345: XrmValue fromVal; ! 346: XrmValue *toVal; ! 347: { ! 348: static Geometry g; ! 349: int i; ! 350: ! 351: g.pos.xpos = g.pos.ypos = g.dims.width = g.dims.height = 0; ! 352: i = XParseGeometry((char *) fromVal.addr, ! 353: &g.pos.xpos, &g.pos.ypos, &g.dims.width, &g.dims.height); ! 354: if (i == NoValue) return; ! 355: if (i & XNegative) ! 356: g.pos.xpos = DisplayWidth(dpy, DefaultScreen(dpy))-1-g.pos.xpos; ! 357: if (i & YNegative) ! 358: g.pos.ypos = DisplayHeight(dpy, DefaultScreen(dpy))-1-g.pos.ypos; ! 359: done(&g, Geometry); ! 360: }; ! 361: ! 362: ! 363: /*ARGSUSED*/ ! 364: static void CvtStringToInt(dpy, fromVal, toVal) ! 365: Display *dpy; ! 366: XrmValue fromVal; ! 367: XrmValue *toVal; ! 368: { ! 369: static int i; ! 370: ! 371: if (sscanf((char *)fromVal.addr, "%d", &i) == 1) { done(&i, int); } ! 372: } ! 373: ! 374: ! 375: /*ARGSUSED*/ ! 376: static void CvtStringToPixel(dpy, fromVal, toVal) ! 377: Display *dpy; ! 378: XrmValue fromVal; ! 379: XrmValue *toVal; ! 380: { ! 381: _XrmConvert(dpy, XrmQString, fromVal, XrmQColor, toVal); ! 382: if ((*toVal).addr == NULL) return; ! 383: done(&((XColor *)((*toVal).addr))->pixel, int) ! 384: }; ! 385: ! 386: ! 387: /*ARGSUSED*/ ! 388: static void CvtXColorToPixel(dpy, fromVal, toVal) ! 389: Display *dpy; ! 390: XrmValue fromVal; ! 391: XrmValue *toVal; ! 392: { ! 393: done(&((XColor *)fromVal.addr)->pixel, int); ! 394: }; ! 395: ! 396: ! 397: /*ARGSUSED*/ ! 398: static void CvtIntToPixel(dpy, fromVal, toVal) ! 399: Display *dpy; ! 400: XrmValue fromVal; ! 401: XrmValue *toVal; ! 402: { ! 403: done(fromVal.addr, int); ! 404: }; ! 405: ! 406: ! 407: /*ARGSUSED*/ ! 408: static void CvtStringToPixmap(dpy, fromVal, toVal) ! 409: Display *dpy; ! 410: XrmValue fromVal; ! 411: XrmValue *toVal; ! 412: { ! 413: XrmValue pixelVal; ! 414: ! 415: _XrmConvert(dpy, XrmQString, fromVal, XrmQPixel, &pixelVal); ! 416: if (pixelVal.addr == NULL) return; ! 417: _XrmConvert(dpy, XrmQPixel, pixelVal, XrmQPixmap, toVal); ! 418: } ! 419: ! 420: ! 421: static Bool initialized = False; ! 422: ! 423: void XrmInitialize() ! 424: { ! 425: if (initialized) ! 426: return; ! 427: initialized = True; ! 428: ! 429: _XrmRegisterTypeConverter(XrmQColor, XrmQPixel, CvtXColorToPixel); ! 430: ! 431: _XrmRegisterTypeConverter(XrmQGeometry, XrmQDims, CvtGeometryToDims); ! 432: ! 433: _XrmRegisterTypeConverter(XrmQInt, XrmQBoolean, CvtIntToBoolean); ! 434: _XrmRegisterTypeConverter(XrmQInt, XrmQPixel, CvtIntToPixel); ! 435: _XrmRegisterTypeConverter(XrmQInt, XrmQFont, CvtIntToFont); ! 436: _XrmRegisterTypeConverter(XrmQInt, XrmQColor, CvtIntOrPixelToXColor); ! 437: ! 438: _XrmRegisterTypeConverter(XrmQString, XrmQBoolean, CvtStringToBoolean); ! 439: _XrmRegisterTypeConverter(XrmQString, XrmQColor, CvtStringToXColor); ! 440: _XrmRegisterTypeConverter(XrmQString, XrmQCursor, CvtStringToCursor); ! 441: _XrmRegisterTypeConverter(XrmQString, XrmQDisplay, CvtStringToDisplay); ! 442: _XrmRegisterTypeConverter(XrmQString, XrmQFile, CvtStringToFile); ! 443: _XrmRegisterTypeConverter(XrmQString, XrmQFont, CvtStringToFont); ! 444: _XrmRegisterTypeConverter(XrmQString, XrmQFontStruct, CvtStringToFontStruct); ! 445: _XrmRegisterTypeConverter(XrmQString, XrmQGeometry, CvtStringToGeometry); ! 446: _XrmRegisterTypeConverter(XrmQString, XrmQInt, CvtStringToInt); ! 447: _XrmRegisterTypeConverter(XrmQString, XrmQPixel, CvtStringToPixel); ! 448: _XrmRegisterTypeConverter(XrmQString, XrmQPixmap, CvtStringToPixmap); ! 449: ! 450: _XrmRegisterTypeConverter(XrmQPixel, XrmQColor, CvtIntOrPixelToXColor); ! 451: ! 452: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.