|
|
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 */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.