|
|
1.1 root 1: /* $Header: Resources.c,v 1.1 87/09/11 07:59:15 toddb Exp $ */
2: #ifndef lint
3: static char *sccsid = "@(#)ResourceList.c 1.10 2/25/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: /* XtResourceList.c -- compile and process resource lists. */
31:
32: #include "Xlib.h"
33: #include "Intrinsic.h"
34: #include "Atoms.h"
35: #include "Xresource.h"
36: #include <stdio.h>
37:
38:
39: #define XtNewNameList() ((XrmNameList) XrmNewQuarkList())
40: #define XtCopyNameList(names) ((XrmNameList) XrmCopyQuarkList(names))
41:
42: #define XtNewClassList() ((XrmClassList) XrmNewQuarkList())
43: #define XtCopyClassList(classes) ((XrmClassList) XrmCopyQuarkList(classes))
44:
45: int XtDefaultFGPixel, XtDefaultBGPixel;
46: Pixmap XtDefaultFGPixmap, XtDefaultBGPixmap;
47:
48: static XrmName Qname, QreverseVideo;
49: static XrmClass QBoolean, QString;
50:
51: static XContext nameListContext; /* Context to attach NameList to window */
52: static XContext classListContext; /* Context to attach ClassList to window */
53:
54: extern void bcopy();
55:
56: static void CopyFromArg(src, dst, size)
57: XtArgVal src, dst;
58: register unsigned int size;
59: {
60: if (size == sizeof(XtArgVal))
61: *(XtArgVal *)dst = src;
62: #ifdef BIGENDIAN
63: else if (size == sizeof(short))
64: *(short *)dst = (short)src;
65: #endif BIGENDIAN
66: else if (size < sizeof(XtArgVal))
67: bcopy((char *) &src, (char *) dst, (int) size);
68: else
69: bcopy((char *) src, (char *) dst, (int) size);
70:
71: }
72:
73: static void CopyToArg(src, dst, size)
74: XtArgVal src, *dst;
75: register unsigned int size;
76: {
77: if (size == sizeof(XtArgVal))
78: *dst = *(XtArgVal *)src;
79: #ifdef BIGENDIAN
80: else if (size == sizeof(short))
81: *dst = (XtArgVal) *((short *) src);
82: #endif BIGENDIAN
83: else if (size < sizeof(XtArgVal))
84: bcopy((char *) src, (char *) dst, (int) size);
85: else
86: bcopy((char *) src, (char *) *dst, (int) size);
87:
88: }
89:
90: void PrintResourceList(list, count)
91: register ResourceList list;
92: register int count;
93: {
94: for (; --count >= 0; list++) {
95: (void) printf(" name: %s, class, %s, type: %s,\n",
96: list->name, list->class, list->type);
97: (void) printf(" size: %d, addr: 0x%x, defaddr: 0x%x\n",
98: list->size, list->addr, list->defaultaddr);
99: }
100: }
101:
102: static void GetNameAndClass(dpy, w, names, classes)
103: register Display *dpy;
104: register Window w;
105: XrmNameList *names;
106: XrmClassList *classes;
107: {
108: if (XFindContext(dpy, w, nameListContext, (caddr_t *)names))
109: *names = XtNewNameList();
110: if (XFindContext(dpy, w, classListContext, (caddr_t *)classes))
111: *classes = XtNewClassList();
112: }
113:
114: void XtSetNameAndClass(dpy, w, names, classes)
115: register Display *dpy;
116: register Window w;
117: XrmNameList names;
118: XrmClassList classes;
119: {
120: (void)XSaveContext(
121: dpy, w, nameListContext, (caddr_t)XtCopyNameList(names));
122: (void)XSaveContext(
123: dpy, w, classListContext, (caddr_t)XtCopyClassList(classes));
124: }
125:
126: static XrmName resourceNames[1000];
127:
128: void XtGetResources(
129: dpy,
130: resources, resourceCount, args, argCount,
131: parent, widgetName, widgetClass, names, classes)
132:
133: Display *dpy; /* The widget's display connection */
134: ResourceList resources; /* The list of resources required. */
135: int resourceCount; /* number of items in resource list */
136: ArgList args; /* ArgList to override resources */
137: int argCount; /* number of items in arg list */
138: Window parent; /* Parent window for computing inheritance */
139: XrmAtom widgetName; /* name of this widget (may be overridden) */
140: XrmAtom widgetClass; /* class of this widget */
141: register XrmNameList *names; /* Full inheritance name of widget window */
142: register XrmClassList *classes;/* Full inheritance class of widget window */
143: {
144: register ArgList arg;
145: register XrmName argName;
146: register ResourceList res;
147: XrmNameList parentNames;
148: XrmClassList parentClasses;
149: XrmValue val;
150: register int j;
151: int length, i;
152: Boolean reverseVideo, getReverseVideo;
153: XrmHashTable searchList[100];
154: static Boolean found[1000];
155:
156: reverseVideo = FALSE;
157: getReverseVideo = TRUE;
158:
159: if (((args == NULL) && (argCount != 0)) ||
160: ((resources == NULL) && (resourceCount != 0))) {
161: /* ||| call warning handler here */
162: return;
163: }
164:
165: if (resourceCount != 0) {
166: for (res = resources, j = 0; j < resourceCount; j++, res++) {
167: found[j] = FALSE;
168: resourceNames[j] = XrmAtomToName(res->name);
169: }
170:
171: /* find the widget name and copy the args into the resources */
172: for (arg = args, i = 0; i < argCount; i++, arg++) {
173: argName = XrmAtomToName(arg->name);
174: if (argName == Qname) {
175: widgetName = (XrmAtom) arg->value;
176: } else if (argName == QreverseVideo) {
177: reverseVideo = (Boolean) arg->value;
178: getReverseVideo = FALSE;
179: } else {
180: for (j = 0, res = resources; j < resourceCount; j++, res++) {
181: if (argName == resourceNames[j]) {
182: CopyFromArg(arg->value, res->addr, res->size);
183: found[j] = TRUE;
184: break;
185: }
186: }
187: }
188: }
189: }
190:
191: /* set up the name of the widget */
192: GetNameAndClass(dpy, parent, &parentNames, &parentClasses);
193: length = XrmNameListLength(parentNames);
194: *names = (XrmNameList) XtCalloc((unsigned) length+3, sizeof(XrmName));
195: *classes = (XrmClassList) XtCalloc((unsigned) length+3, sizeof(XrmClass));
196: for (i=0; i<length; i++) {
197: (*names)[i] = parentNames[i];
198: (*classes)[i] = parentClasses[i];
199: }
200: (*names)[length] = XrmAtomToName(widgetName);
201: (*classes)[length] = XrmAtomToClass(widgetClass);
202: (*names)[length+1] = NULLQUARK;
203: (*classes)[length+1] = NULLQUARK;
204: (*names)[length+2] = NULLQUARK;
205: (*classes)[length+2] = NULLQUARK;
206:
207: if (XDisplayCells(dpy, DefaultScreen(dpy)) > 2) {
208: /* Color box, ignore ReverseVideo */
209: reverseVideo = FALSE;
210: } else if (getReverseVideo) {
211: (*names)[length+1] = QreverseVideo;
212: (*classes)[length+1] = QBoolean;
213: XrmGetResource(dpy, *names, *classes, QBoolean, &val);
214: if (val.addr)
215: reverseVideo = *((Boolean *) val.addr);
216: }
217: if (reverseVideo) {
218: XtDefaultFGPixel = WhitePixel(dpy, DefaultScreen(dpy));
219: XtDefaultBGPixel = BlackPixel(dpy, DefaultScreen(dpy));
220: } else {
221: XtDefaultFGPixel = BlackPixel(dpy, DefaultScreen(dpy));
222: XtDefaultBGPixel = WhitePixel(dpy, DefaultScreen(dpy));
223: }
224:
225: (*names)[length+1] = NULLQUARK;
226: (*classes)[length+1] = NULLQUARK;
227:
228: if (resourceCount != 0) {
229:
230: /* Ask resource manager for a list of database levels that we can
231: do a single-level search on each resource */
232:
233: XrmGetSearchList(*names, *classes, searchList);
234:
235: /* go to the resource manager for those resources not found yet */
236: /* if it's not in the resource database copy the default value in */
237:
238: for (res = resources, j = 0; j < resourceCount; j++, res++) {
239: if (! found[j]) {
240: XrmGetSearchResource(dpy, searchList, resourceNames[j],
241: XrmAtomToClass(res->class), res->type, &val);
242: if (val.addr) {
243: /* ||| Kludgy */
244: if (XrmAtomToQuark(res->type) == QString) {
245: *((caddr_t *)(res->addr)) = val.addr;
246: #ifdef BIGENDIAN
247: /* ||| Why? This should be handled by string to short, etc. conversions */
248: } else if (res->size == sizeof(short)) {
249: *(short *) (res->addr) = (short)*((int *)val.addr);
250: #endif BIGENDIAN
251: } else {
252: bcopy(
253: (char *) val.addr,
254: (char *) res->addr,
255: (int) res->size);
256: }
257: } else if (res->defaultaddr != NULL) {
258: bcopy(
259: (char *)res->defaultaddr,
260: (char *)res->addr,
261: (int) res->size);
262: }
263: }
264: }
265: }
266: }
267:
268: void XtGetValues(resources, resourceCount, args, argCount)
269: register ResourceList resources; /* The current resource values. */
270: int resourceCount; /* number of items in resources */
271: ArgList args; /* The resource values requested */
272: int argCount; /* number of items in arg list */
273: {
274: register ArgList arg;
275: register ResourceList res;
276: register int i;
277: register XrmName argName;
278:
279: if (argCount == 0) return;
280: if (((args == NULL) && (argCount != 0)) ||
281: ((resources == NULL) && (resourceCount != 0))) {
282: /* call warning handler here */
283: return;
284: }
285:
286: for (res = resources, i = 0; i < resourceCount; i++, res++) {
287: resourceNames[i] = XrmAtomToName(res->name);
288: }
289: for (arg = args ; --argCount >= 0; arg++) {
290: argName = XrmAtomToName(arg->name);
291: for (res = resources, i = 0; i < resourceCount; i++, res++) {
292: if (argName == resourceNames[i]) {
293: CopyToArg(res->addr, &arg->value, res->size);
294: break;
295: }
296: }
297: }
298: }
299:
300: void XtSetValues(resources, resourceCount, args, argCount)
301: register ResourceList resources; /* The current resource values. */
302: int resourceCount; /* number of items in resources */
303: ArgList args; /* The resource values to set */
304: int argCount; /* number of items in arg list */
305: {
306: register ArgList arg;
307: register ResourceList res;
308: register int i;
309: register XrmName argName;
310:
311: if (argCount == 0) return;
312: if (((args == NULL) && (argCount != 0)) ||
313: ((resources == NULL) && (resourceCount != 0))) {
314: /* call warning handler here */
315: return;
316: }
317:
318: for (res = resources, i = 0; i < resourceCount; i++, res++) {
319: resourceNames[i] = XrmAtomToQuark(res->name);
320: }
321: for (arg = args ; --argCount >= 0; arg++) {
322: argName = XrmAtomToName(arg->name);
323: for (res = resources, i = 0; i < resourceCount; i++, res++) {
324: if (argName == resourceNames[i]) {
325: CopyFromArg(arg->value, res->addr, res->size);
326: break;
327: }
328: }
329: }
330: }
331:
332: static Boolean initialized = FALSE;
333:
334: extern void ResourceListInitialize()
335: {
336: if (initialized)
337: return;
338: initialized = TRUE;
339:
340: nameListContext = XUniqueContext();
341: classListContext = XUniqueContext();
342:
343: Qname = XrmAtomToName(XtNname);
344: QreverseVideo = XrmAtomToName(XtNreverseVideo);
345: QBoolean = XrmAtomToClass(XtCBoolean);
346: QString = XrmAtomToClass(XtCString);
347: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.