Annotation of researchv9/X11/src/X.V11R1/lib/Xrm/Conversion.c, revision 1.1.1.1

1.1       root        1: /* $Header: Conversion.c,v 1.2 87/09/12 12:34:55 toddb Exp $ */
                      2: #ifndef lint
                      3: static char *sccsid = "@(#)Conversion.c        1.11    3/19/87";
                      4: #endif lint
                      5: 
                      6: /*
                      7:  * Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts.
                      8:  * 
                      9:  *                         All Rights Reserved
                     10:  * 
                     11:  * Permission to use, copy, modify, and distribute this software and its 
                     12:  * documentation for any purpose and without fee is hereby granted, 
                     13:  * provided that the above copyright notice appear in all copies and that
                     14:  * both that copyright notice and this permission notice appear in 
                     15:  * supporting documentation, and that the name of Digital Equipment
                     16:  * Corporation not be used in advertising or publicity pertaining to
                     17:  * distribution of the software without specific, written prior permission.  
                     18:  * 
                     19:  * 
                     20:  * DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
                     21:  * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
                     22:  * DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
                     23:  * ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
                     24:  * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
                     25:  * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
                     26:  * SOFTWARE.
                     27:  */
                     28: 
                     29: 
                     30: /* Conversion.c - implementations of resource type conversion procs */
                     31: 
                     32: #include       "Xlib.h"
                     33: #include       "Xutil.h"
                     34: #include       "Xresource.h"
                     35: #include       "XrmConvert.h"
                     36: #include       "Conversion.h"
                     37: #include       "Quarks.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 CvtStringToDisplay();
                     56: extern void CvtStringToEventBindings();
                     57: static void CvtStringToFile();
                     58: static void CvtStringToFont();
                     59: static void CvtStringToFontStruct();
                     60: static void CvtStringToGeometry();
                     61: static void CvtStringToInt();
                     62: static void CvtStringToPixel();
                     63: static void CvtStringToPixmap();
                     64: 
                     65: void _XLowerCase(source, dest)
                     66:     register char  *source, *dest;
                     67: {
                     68:     register char ch;
                     69: 
                     70:     for (; (ch = *source) != 0; source++, dest++) {
                     71:        if ('A' <= ch && ch <= 'Z')
                     72:            *dest = ch - 'A' + 'a';
                     73:        else
                     74:            *dest = ch;
                     75:     }
                     76:     *dest = 0;
                     77: }
                     78: 
                     79: 
                     80: /*ARGSUSED*/
                     81: static void CvtIntToBoolean(screen, fromVal, toVal)
                     82:     Screen     *screen;
                     83:     XrmValuePtr        fromVal;
                     84:     XrmValuePtr        toVal;
                     85: {
                     86:     static int b;
                     87: 
                     88:     b = (int) (*(int *)fromVal->addr != 0);
                     89:     done(&b, int);
                     90: };
                     91: 
                     92: 
                     93: /*ARGSUSED*/
                     94: static void CvtStringToBoolean(screen, fromVal, toVal)
                     95:     Screen     *screen;
                     96:     XrmValuePtr        fromVal;
                     97:     XrmValuePtr        toVal;
                     98: {
                     99:     static int b;
                    100:     XrmQuark   q;
                    101:     char       lowerName[1000];
                    102: 
                    103:     _XLowerCase((char *) fromVal->addr, lowerName);
                    104:     q = XrmAtomToQuark(lowerName);
                    105: 
                    106:     if (q == XrmQEtrue)        { b = 1; done(&b, int); return; }
                    107:     if (q == XrmQEon)  { b = 1; done(&b, int); return; }
                    108:     if (q == XrmQEyes) { b = 1; done(&b, int); return; }
                    109: 
                    110:     if (q == XrmQEfalse)       { b = 0; done(&b, int); return; }
                    111:     if (q == XrmQEoff) { b = 0; done(&b, int); return; }
                    112:     if (q == XrmQEno)  { b = 0; done(&b, int); return; }
                    113: };
                    114: 
                    115: 
                    116: /*ARGSUSED*/
                    117: static void CvtIntOrPixelToXColor(screen, fromVal, toVal)
                    118:     Screen     *screen;
                    119:     XrmValuePtr        fromVal;
                    120:     XrmValuePtr        toVal;
                    121: {    
                    122:     static XColor      c;
                    123: 
                    124:     if (DefaultVisualOfScreen(screen)->class == StaticGray)
                    125:        return;
                    126: 
                    127:     c.pixel = *(int *)fromVal->addr;
                    128:     XQueryColor(DisplayOfScreen(screen),
                    129:        DefaultColormapOfScreen(screen), &c);
                    130:                                /* !!! Need some error checking ... ||| */
                    131:     done(&c, XColor);
                    132: };
                    133: 
                    134: 
                    135: /*ARGSUSED*/
                    136: static void CvtStringToXColor(screen, fromVal, toVal)
                    137:     Screen     *screen;
                    138:     XrmValuePtr        fromVal;
                    139:     XrmValuePtr        toVal;
                    140: {
                    141:     static XColor      c;
                    142:     Status             s;
                    143: 
                    144:     if (DefaultVisualOfScreen(screen)->class == StaticGray)
                    145:        return;
                    146: 
                    147:     s = XParseColor(DisplayOfScreen(screen), DefaultColormapOfScreen(screen),
                    148:                        (char *)fromVal->addr, &c);
                    149:     if (s == 0) return;
                    150:     s = XAllocColor(DisplayOfScreen(screen), DefaultColormapOfScreen(screen), &c);
                    151:     if (s == 0) return;
                    152:     done(&c, XColor);
                    153: };
                    154: 
                    155: 
                    156: /*ARGSUSED*/
                    157: static void CvtGeometryToDims(screen, fromVal, toVal)
                    158:     Screen     *screen;
                    159:     XrmValuePtr        fromVal;
                    160:     XrmValuePtr        toVal;
                    161: {
                    162:     done(&((Geometry *)fromVal->addr)->dims, Dims);
                    163: };
                    164: 
                    165: 
                    166: /*ARGSUSED*/
                    167: static void CvtStringToDisplay(screen, fromVal, toVal)
                    168:     Screen     *screen;
                    169:     XrmValuePtr        fromVal;
                    170:     XrmValuePtr        toVal;
                    171: {
                    172:     static Display     *d;
                    173: 
                    174:     d = XOpenDisplay((char *)fromVal->addr);
                    175:     if (d != NULL) { done(d, Display); }
                    176: };
                    177: 
                    178: 
                    179: /*ARGSUSED*/
                    180: static void CvtStringToFile(screen, fromVal, toVal)
                    181:     Screen     *screen;
                    182:     XrmValuePtr        fromVal;
                    183:     XrmValuePtr        toVal;
                    184: {
                    185:     static FILE        *f;
                    186: 
                    187:     f = fopen((char *)fromVal->addr, "r");
                    188:     if (f != NULL) { done(f, FILE); }
                    189: };
                    190: 
                    191: 
                    192: /*ARGSUSED*/
                    193: static void CvtStringToFont(screen, fromVal, toVal)
                    194:     Screen     *screen;
                    195:     XrmValuePtr        fromVal;
                    196:     XrmValuePtr        toVal;
                    197: {
                    198:     static Font        f;
                    199: 
                    200:     f = XLoadFont(DisplayOfScreen(screen), (char *)fromVal->addr);
                    201:     if (f != 0) { done(&f, Font); }
                    202: }
                    203: 
                    204: 
                    205: /*ARGSUSED*/
                    206: static void CvtIntToFont(screen, fromVal, toVal)
                    207:     Screen     *screen;
                    208:     XrmValuePtr        fromVal;
                    209:     XrmValuePtr        toVal;
                    210: {
                    211:     done(fromVal->addr, int);
                    212: };
                    213: 
                    214: 
                    215: /*ARGSUSED*/
                    216: static void CvtStringToFontStruct(screen, fromVal, toVal)
                    217:     Screen     *screen;
                    218:     XrmValuePtr        fromVal;
                    219:     XrmValuePtr        toVal;
                    220: {
                    221:     static XFontStruct *f;
                    222: 
                    223:     f = XLoadQueryFont(DisplayOfScreen(screen), (char *)fromVal->addr);
                    224:     if (f != NULL) { done(&f, XFontStruct *); }
                    225: }
                    226: 
                    227: /*ARGSUSED*/
                    228: static void CvtStringToGeometry(screen, fromVal, toVal)
                    229:     Screen     *screen;
                    230:     XrmValuePtr        fromVal;
                    231:     XrmValuePtr        toVal;
                    232: {
                    233:     static Geometry    g;
                    234:     int                        i;
                    235: 
                    236:     g.pos.xpos = g.pos.ypos = g.dims.width = g.dims.height = 0;
                    237:     i = XParseGeometry((char *) fromVal->addr,
                    238:            &g.pos.xpos, &g.pos.ypos, &g.dims.width, &g.dims.height);
                    239:     if (i == NoValue) return;
                    240:     if (i & XNegative)
                    241:        g.pos.xpos = WidthOfScreen(screen)-1-g.pos.xpos;
                    242:     if (i & YNegative)
                    243:        g.pos.ypos = HeightOfScreen(screen)-1-g.pos.ypos;
                    244:     done(&g, Geometry);
                    245: };
                    246: 
                    247: 
                    248: /*ARGSUSED*/
                    249: static void CvtStringToInt(screen, fromVal, toVal)
                    250:     Screen     *screen;
                    251:     XrmValuePtr        fromVal;
                    252:     XrmValuePtr        toVal;
                    253: {
                    254:     static int i;
                    255: 
                    256:     if (sscanf((char *)fromVal->addr, "%d", &i) == 1) { done(&i, int); }
                    257: }
                    258: 
                    259: 
                    260: /*ARGSUSED*/
                    261: static void CvtStringToPixel(screen, fromVal, toVal)
                    262:     Screen     *screen;
                    263:     XrmValuePtr        fromVal;
                    264:     XrmValuePtr        toVal;
                    265: {
                    266:     _XrmConvert(screen, XrmQString, fromVal, XrmQColor, toVal);
                    267:     if ((*toVal).addr == NULL) return;
                    268:     done(&((XColor *)((*toVal).addr))->pixel, int)
                    269: };
                    270: 
                    271: 
                    272: /*ARGSUSED*/
                    273: static void CvtXColorToPixel(screen, fromVal, toVal)
                    274:     Screen     *screen;
                    275:     XrmValuePtr        fromVal;
                    276:     XrmValuePtr        toVal;
                    277: {
                    278:     done(&((XColor *)fromVal->addr)->pixel, int);
                    279: };
                    280: 
                    281: 
                    282: /*ARGSUSED*/
                    283: static void CvtIntToPixel(screen, fromVal, toVal)
                    284:     Screen     *screen;
                    285:     XrmValuePtr        fromVal;
                    286:     XrmValuePtr        toVal;
                    287: {
                    288:        done(fromVal->addr, int);
                    289: };
                    290: 
                    291: 
                    292: /*ARGSUSED*/
                    293: static void CvtStringToPixmap(screen, fromVal, toVal)
                    294:     Screen     *screen;
                    295:     XrmValuePtr        fromVal;
                    296:     XrmValuePtr        toVal;
                    297: {
                    298:     XrmValue   pixelVal;
                    299: 
                    300:     _XrmConvert(screen, XrmQString, fromVal, XrmQPixel, &pixelVal);
                    301:     if (pixelVal.addr == NULL) return;
                    302:     _XrmConvert(screen, XrmQPixel, &pixelVal, XrmQPixmap, toVal);
                    303: }
                    304: 
                    305: 
                    306: static Bool initialized = False;
                    307: 
                    308: void XrmInitialize()
                    309: {
                    310:     if (initialized)
                    311:        return;
                    312:     initialized = True;
                    313: 
                    314:     _XrmRegisterTypeConverter(XrmQColor, XrmQPixel,    CvtXColorToPixel);
                    315: 
                    316:     _XrmRegisterTypeConverter(XrmQGeometry, XrmQDims,  CvtGeometryToDims);
                    317: 
                    318:     _XrmRegisterTypeConverter(XrmQInt,         XrmQBoolean,    CvtIntToBoolean);
                    319:     _XrmRegisterTypeConverter(XrmQInt,         XrmQPixel,      CvtIntToPixel);
                    320:     _XrmRegisterTypeConverter(XrmQInt,         XrmQFont,       CvtIntToFont);
                    321:     _XrmRegisterTypeConverter(XrmQInt,         XrmQColor,      CvtIntOrPixelToXColor);
                    322: 
                    323:     _XrmRegisterTypeConverter(XrmQString, XrmQBoolean, CvtStringToBoolean);
                    324:     _XrmRegisterTypeConverter(XrmQString, XrmQColor,   CvtStringToXColor);
                    325:     _XrmRegisterTypeConverter(XrmQString, XrmQDisplay, CvtStringToDisplay);
                    326:     _XrmRegisterTypeConverter(XrmQString, XrmQFile,    CvtStringToFile);
                    327:     _XrmRegisterTypeConverter(XrmQString, XrmQFont,    CvtStringToFont);
                    328:     _XrmRegisterTypeConverter(XrmQString, XrmQFontStruct,      CvtStringToFontStruct);
                    329:     _XrmRegisterTypeConverter(XrmQString, XrmQGeometry,        CvtStringToGeometry);
                    330:     _XrmRegisterTypeConverter(XrmQString, XrmQInt,     CvtStringToInt);
                    331:     _XrmRegisterTypeConverter(XrmQString, XrmQPixel,   CvtStringToPixel);
                    332:     _XrmRegisterTypeConverter(XrmQString, XrmQPixmap,  CvtStringToPixmap);
                    333: 
                    334:     _XrmRegisterTypeConverter(XrmQPixel, XrmQColor,    CvtIntOrPixelToXColor);
                    335: 
                    336: }
                    337: 
                    338: #ifndef lint
                    339: /*
                    340:  * This hack is to pull in the right error description code from
                    341:  * the resource manager library if you have a load line:
                    342:  *     cc -o foo *.o -loldRm -lX
                    343:  * or
                    344:  *     cc -o foo *.o -lnewRm -lX
                    345:  * This should be removed as soon as the resource manager makes its way
                    346:  * into Xlib.
                    347:  */
                    348: static kludge()
                    349: {
                    350:        XGetErrorText();
                    351: }
                    352: #endif /* lint */

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.