|
|
1.1 root 1: #ifndef lint
2: static char rcsid[] = "$Header: Initialize.c,v 1.44 87/09/13 22:55:11 newman Exp $";
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: /* Make sure all wm properties can make it out of the resource manager */
28:
29: #include <stdio.h>
30: #include <pwd.h>
31: #include <sys/param.h>
32:
33: /* Xlib definitions */
34: /* things like Window, Display, XEvent are defined herein */
35: #include "Intrinsic.h"
36: #include <X11/Xutil.h>
37: #include "Atoms.h"
38: #include "TopLevel.h"
39:
40: extern char *index();
41: extern char *strcat();
42: extern char *strncpy();
43: extern char *strcpy();
44:
45: /*
46: This is a set of default records describing the command line arguments that
47: Xlib will parse and set into the resource data base.
48:
49: This list is applied before the users list to enforce these defaults. This is
50: policy, which the toolkit avoids but I hate differing programs at this level.
51: */
52:
53: static XrmOptionDescRec opTable[] = {
54: {"=", XtNgeometry, XrmoptionIsArg, (caddr_t) NULL},
55: {"-bd", XtNborder, XrmoptionSepArg, (caddr_t) NULL},
56: {"-bordercolor",XtNborder, XrmoptionSepArg, (caddr_t) NULL},
57: {"-bg", XtNbackground, XrmoptionSepArg, (caddr_t) NULL},
58: {"-background", XtNbackground, XrmoptionSepArg, (caddr_t) NULL},
59: {"-bw", XtNborderWidth, XrmoptionSepArg, (caddr_t) NULL},
60: {"-border", XtNborderWidth, XrmoptionSepArg, (caddr_t) NULL},
61: {"-fg", XtNforeground, XrmoptionSepArg, (caddr_t) NULL},
62: {"-foreground", XtNforeground, XrmoptionSepArg, (caddr_t) NULL},
63: {"-fn", XtNfont, XrmoptionSepArg, (caddr_t) NULL},
64: {"-font", XtNfont, XrmoptionSepArg, (caddr_t) NULL},
65: {"-rv", XtNreverseVideo, XrmoptionNoArg, (caddr_t) "on"},
66: {"-reverse", XtNreverseVideo, XrmoptionNoArg, (caddr_t) "on"},
67: {"+rv", XtNreverseVideo, XrmoptionNoArg, (caddr_t) "off"},
68: {"-n", XtNname, XrmoptionSepArg, (caddr_t) NULL},
69: {"-name", XtNname, XrmoptionSepArg, (caddr_t) NULL},
70: {"-title", XtNtitle, XrmoptionSepArg, (caddr_t) NULL},
71: {"-t", XtNtitle, XrmoptionSepArg, (caddr_t) NULL}
72: };
73:
74: typedef struct {
75: int argc;
76: char **argv;
77: char *classname;
78: char *icon_name;
79: char *title;
80: Pixmap icon_pixmap;
81: Window icon_window;
82: Boolean iconic;
83: Boolean input;
84: Boolean resizeable;
85: char *geostr;
86: int initial;
87: XSizeHints hints;
88: } TopLevelPart;
89:
90: /****************************************************************
91: *
92: * Full instance record declaration
93: *
94: ****************************************************************/
95:
96: typedef struct {
97: CorePart core;
98: CompositePart composite;
99: TopLevelPart top;
100: } TopLevelRec, *TopLevelWidget;
101:
102: static XtResource resources[]=
103: {
104: { XtNiconName, XtCIconPixmap, XrmRString, sizeof(caddr_t),
105: XtOffset(TopLevelWidget, top.icon_name), XrmRString, (caddr_t) NULL},
106: { XtNiconPixmap, XtCIconPixmap, XrmRPixmap, sizeof(caddr_t),
107: XtOffset(TopLevelWidget, top.icon_pixmap), XrmRPixmap,
108: (caddr_t) NULL},
109: { XtNiconWindow, XtCIconWindow, XrmRWindow, sizeof(caddr_t),
110: XtOffset(TopLevelWidget, top.icon_window), XrmRWindow,
111: (caddr_t) NULL},
112: { XtNallowtopresize, XtCAllowtopresize, XrmRBoolean, sizeof(Boolean),
113: XtOffset(TopLevelWidget, top.resizeable), XrmRString, "FALSE"},
114: { XtNgeometry, XtCGeometry, XrmRString, sizeof(caddr_t),
115: XtOffset(TopLevelWidget, top.geostr), XrmRString, (caddr_t) NULL},
116: { XtNinput, XtCInput, XrmRBoolean, sizeof(Boolean),
117: XtOffset(TopLevelWidget, top.input), XrmRString, "FALSE"},
118: { XtNiconic, XtCIconic, XrmRBoolean, sizeof(Boolean),
119: XtOffset(TopLevelWidget, top.iconic), XrmRBoolean, "FALSE"},
120: { XtNtitle, XtCTitle, XrmRString, sizeof(char *),
121: XtOffset(TopLevelWidget, top.title), XrmRString, NULL},
122: /* { XtNinitial, XtCInitial, XrmRInitialstate, sizeof(int),
123: XtOffset(TopLevelWidget, top.initial), XrmRString, "Normal"} */
124: { XtNinitial, XtCInitial, XrmRInt, sizeof(int),
125: XtOffset(TopLevelWidget, top.initial), XrmRString, "0"}
126: /* ||| Temp hack to provide initialization. */
127: };
128: static void Initialize();
129: static void Realize();
130: static Boolean SetValues();
131: static void Destroy();
132: static void InsertChild();
133: static void ChangeManaged(); /* XXX */
134: static XtGeometryResult GeometryManager();
135: static void EventHandler();
136: static void ClassInitialize();
137:
138: typedef struct _TopLevelClassRec {
139: CoreClassPart core_class;
140: CompositeClassPart composite_class;
141: } TopLevelClassRec;
142:
143:
144: TopLevelClassRec topLevelClassRec = {
145: /* superclass */ (WidgetClass) &compositeClassRec,
146: /* class_name */ "No Name",
147: /* toplevel doesn't have a name it is pass
148: * to XtInitialize
149: */
150: /* size */ sizeof(TopLevelRec),
151: /* Class Initializer */ ClassInitialize,
152: /* Class init'ed ? */ FALSE,
153: /* initialize */ Initialize,
154: /* realize */ Realize,
155: /* actions */ NULL,
156: /* num_actions */ 0,
157: /* resources */ resources,
158: /* resource_count */ XtNumber(resources),
159: /* xrm_class */ NULLQUARK,
160: /* compress_motion */ FALSE,
161: /* compress_exposure */ TRUE,
162: /* visible_interest */ FALSE,
163: /* destroy */ Destroy,
164: /* resize */ NULL,
165: /* expose */ NULL,
166: /* set_values */ SetValues,
167: /* accept_focus */ NULL,
168: /* geometry_manager */ GeometryManager,
169: /* change_managed */ ChangeManaged,
170: /* insert_child */ InsertChild,
171: /* delete_child */ NULL, /* ||| Inherit from Composite */
172: /* move_focus_to_next */ NULL,
173: /* move_focus_to_prev */ NULL
174: };
175:
176: WidgetClass topLevelWidgetClass = (WidgetClass) (&topLevelClassRec);
177:
178: /****************************************************************
179: *
180: * Private Procedures
181: *
182: ****************************************************************/
183:
184: /* this is the old initialize routine */
185: /* This needs to be updated to reflect the new world. */
186: static void
187: DO_Initialize() {
188:
189: extern void QuarkInitialize();
190: extern void ResourceListInitialize();
191: extern void EventInitialize();
192: extern void TranslateInitialize();
193: extern void CursorsInitialize();
194:
195: /* Resource management initialization */
196: QuarkInitialize();
197: XrmInitialize();
198: ResourceListInitialize();
199:
200: /* Other intrinsic intialization */
201: EventInitialize();
202: TranslateInitialize();
203: CursorsInitialize();
204: InitializeCallbackTable();
205:
206:
207: }
208: Atom XtHasInput;
209: Atom XtTimerExpired;
210:
211: static void
212: init_atoms(dpy)
213: Display *dpy;
214: {
215: XtHasInput = XInternAtom(dpy, "XtHasInput", False);
216: XtTimerExpired = XInternAtom(dpy, "XtTimerExpired", False);
217: }
218:
219:
220: static void ClassInitialize()
221: {
222: CompositeWidgetClass superclass;
223: TopLevelWidgetClass myclass;
224:
225: myclass = (TopLevelWidgetClass) topLevelWidgetClass;
226: superclass = (CompositeWidgetClass) myclass->core_class.superclass;
227:
228: /* Inherit delete_child from Composite */
229: /* I have a insert_child that calls my parents superclasses insert_child */
230: /* I can't inherit this one because of the implied add that Joel wants */
231:
232: myclass->composite_class.delete_child =
233: superclass->composite_class.delete_child;
234: }
235:
236: /*
237: What this routine does load the resource data base.
238:
239: The order that things are loaded into the database follows,
240: 1) an optional application specific file.
241: 2) server defaults, generic.
242: 3) server defaults for machine.
243: 4) .Xdefaults
244:
245: */
246:
247: static XrmResourceDataBase
248: XGetUsersDataBase(dpy, name)
249: Display *dpy;
250: char *name;
251: {
252: XrmResourceDataBase userResources = NULL;
253: XrmResourceDataBase resources = NULL;
254: int uid;
255: extern struct passwd *getpwuid();
256: struct passwd *pw;
257: char filename[1024];
258: FILE *f;
259: static Boolean first = TRUE;
260:
261: if(name != NULL) { /* application provided a file */
262: f = fopen(name, "r");
263: if (f) {
264: XrmGetCurrentDataBase(&resources);
265: XrmGetDataBase(f, &userResources);
266: XrmMergeDataBases(userResources, &resources);
267: XrmSetCurrentDataBase(userResources);
268: (void) fclose(f);
269: }
270: }
271: if (first) {
272: first = FALSE;
273: /*
274: MERGE server defaults
275: */
276: /* Open .Xdefaults file and merge into existing data base */
277:
278: uid = getuid();
279: pw = getpwuid(uid);
280: if (pw) {
281: (void) strcpy(filename, pw->pw_dir);
282: (void) strcat(filename, "/.Xdefaults");
283: f = fopen(filename, "r");
284: if (f) {
285: XrmGetCurrentDataBase(&resources);
286: XrmGetDataBase(f, &userResources);
287: XrmMergeDataBases(userResources, &resources);
288: XrmSetCurrentDataBase(userResources);
289: (void) fclose(f);
290: }
291: }
292: }
293: return userResources;
294: }
295:
296: static void
297: Initialize(request, new)
298: Widget request, new;
299: {
300: TopLevelWidget w = (TopLevelWidget) new;
301:
302: int flag;
303:
304: if(w->top.icon_name == NULL) {
305: w->top.icon_name = w->core.name;
306: }
307: if(w->top.title == NULL) {
308: w->top.title = w->top.icon_name;
309: }
310: w->top.hints.flags = 0;
311: w->core.background_pixmap = None;
312: /*
313: w->core.border_width = 0;
314: w->core.border_pixmap = NULL;
315: */
316: if(w->top.geostr != NULL) {
317: flag = XParseGeometry(w->top.geostr, &w->core.x, &w->core.y,
318: &w->core.width, &w->core.height);
319:
320: w->top.hints.flags |= USPosition | USSize;
321: if(flag & XNegative)
322: w->core.x =
323: w->core.screen->width - w->core.width - w->core.x;
324: if(flag & YNegative)
325: w->core.y =
326: w->core.screen->height - w->core.height - w->core.y;
327: }
328:
329: XtAddEventHandler(
330: new, (EventMask) StructureNotifyMask,
331: FALSE, EventHandler, (Opaque) NULL);
332: }
333:
334: static void
335: Realize(wid, mask, attr)
336: Widget wid;
337: Mask mask;
338: XSetWindowAttributes *attr;
339: {
340: TopLevelWidget w = (TopLevelWidget) wid;
341: Window win;
342: Display *dpy = XtDisplay(w);
343: /*
344: char hostname[1024];
345: */
346: XWMHints wmhints;
347:
348:
349: mask &= ~(CWBackPixel);
350: mask |= CWBackPixmap;
351: attr->background_pixmap = None; /* I must have a background pixmap of
352: none, and no background pixel.
353: This should give me a transparent
354: background so that if there is
355: latency from when I get resized and
356: when my child is resized it won't be
357: as obvious.
358: */
359: win = w->core.window = XCreateWindow( dpy,
360: w->core.screen->root, w->core.x, w->core.y,
361: w->core.width, w->core.height,
362: w->core.border_width, w->core.depth, CopyFromParent,
363: CopyFromParent, mask, attr);
364:
365: XStoreName(dpy, win, w->top.title);
366: XSetIconName(dpy, win, w->top.icon_name);
367: XSetCommand(dpy, win, w->top.argv, w->top.argc);
368: #ifdef UNIX
369: gethostname(hostname, sizeof(hostname));
370: #endif
371:
372: /* now hide everything needed to set the properties until realize is called */
373: wmhints.flags = 0;
374: wmhints.flags |= InputHint ;
375: if(w->top.input)
376: wmhints.input = TRUE;
377: else
378: wmhints.input = FALSE;
379:
380: /* Should I tell the window manager to bring me up iconfied */
381: wmhints.initial_state = w->top.initial;
382: if(w->top.iconic)
383: wmhints.initial_state = IconicState;
384: if(w->top.icon_pixmap != NULL) {
385: wmhints.flags |= IconPixmapHint;
386: wmhints.icon_pixmap = w->top.icon_pixmap;
387: }
388: if(w->top.icon_window != NULL) {
389: wmhints.flags |= IconWindowHint;
390: wmhints.icon_window = w->top.icon_window;
391: }
392: XSetWMHints(dpy, win, &wmhints);
393: /* |||
394: XSetHostName(dpy, win, hostname);
395: XSetClass(dpy, win, w->top.classname);/* And w->core.name XXX*/
396:
397: w->top.hints.x = w->core.x;
398: w->top.hints.y = w->core.y;
399: w->top.hints.width = w->core.width;
400: w->top.hints.height = w->core.height;
401: XSetNormalHints(dpy, win, &w->top.hints);
402: }
403:
404: /* ARGSUSED */
405: static void
406: EventHandler(wid, closure, event)
407: Widget wid;
408: Opaque closure;
409: XEvent *event;
410: {
411: Widget childwid;
412: int i;
413: TopLevelWidget w = (TopLevelWidget) wid;
414:
415: if(w->core.window != event->xany.window) {
416: XtError("Event with wrong window");
417: return;
418: }
419: /* I am only interested in resize */
420: switch(event->type) {
421: case ConfigureNotify:
422: w->core.width = event->xconfigure.width;
423: w->core.height = event->xconfigure.height;
424: w->core.border_width = event->xconfigure.border_width;
425: w->core.x = event->xconfigure.x;
426: w->core.y = event->xconfigure.y;
427:
428: for(i = 0; i < w->composite.num_children; i++) {
429: if(w->composite.children[i]->core.managed) {
430: childwid = w->composite.children[i];
431: XtResizeWidget(
432: childwid,
433: w->core.width,
434: w->core.height,
435: w->core.border_width);
436: break;
437: }
438: }
439: break;
440: default:
441: return;
442: }
443: }
444:
445: static void
446: Destroy(wid)
447: Widget wid;
448: {
449: TopLevelWidget w = (TopLevelWidget) wid;
450:
451: if(w->top.argv != NULL)
452: XtFree((char *)w->top.argv);
453: w->top.argv = NULL;
454: if(w->top.classname != NULL)
455: XtFree(w->top.classname);
456: }
457:
458: /* ARGSUSED */
459: static void InsertChild(w, args, num_args)
460: Widget w;
461: ArgList args;
462: Cardinal num_args;
463: {
464: ((CompositeWidgetClass) XtSuperclass(w->core.parent))
465: ->composite_class.insert_child(w, args, num_args);
466: XtManageChild(w); /* Add to managed set now */
467: }
468:
469: /*
470: * There is some real ugliness here. If I have a width and a height which are
471: * zero, and as such suspect, and I have not yet been realized then I will
472: * grow to match my child.
473: *
474: */
475: static void
476: ChangeManaged(wid)
477: CompositeWidget wid;
478: {
479: TopLevelWidget w = (TopLevelWidget) wid;
480: int i;
481: Widget childwid;
482:
483: for (i = 0; i < w->composite.num_children; i++) {
484: if (w->composite.children[i]->core.managed) {
485: childwid = w->composite.children[i];
486: if (!XtIsRealized ((Widget) wid)) {
487: if (w->core.border_width == 0) {
488: w->core.border_width = childwid->core.border_width;
489: } else {
490: childwid->core.border_width = w->core.border_width;
491: }
492: if (w->core.width == 0
493: && w->core.height == 0) {
494: /* we inherit our child's attributes */
495: w->core.width = childwid->core.width;
496: w->core.height = childwid->core.height;
497: w->top.hints.flags |= PSize;
498: } else {
499: /* our child gets our attributes */
500: XtResizeWidget (
501: childwid,
502: w->core.width,
503: w->core.height,
504: w->core.border_width);
505: }
506: }
507: if (childwid->core.x != -(w->core.border_width) ||
508: childwid->core.y != -(w->core.border_width)) {
509: XtMoveWidget (childwid,
510: -(w->core.border_width),
511: -(w->core.border_width));
512: }
513: }
514: }
515:
516: }
517:
518: /*
519: * This is gross, I can't wait to see if the change happened so I will ask
520: * the window manager to change my size and do the appropriate X work.
521: * I will then tell the requester that he can't. Care must be taken because
522: * it is possible that some time in the future the request will be
523: * asynchronusly granted.
524: */
525:
526: static XtGeometryResult
527: GeometryManager( wid, request, reply )
528: Widget wid;
529: XtWidgetGeometry *request;
530: XtWidgetGeometry *reply;
531: {
532: XWindowChanges values;
533: XSizeHints oldhints;
534: TopLevelWidget w = (TopLevelWidget)(wid->core.parent);
535:
536: if(w->top.resizeable == FALSE)
537: return(XtGeometryNo);
538: if(!XtIsRealized((Widget)w)){
539: if (request->request_mode & (CWX|CWY)) {
540: if(request->request_mode & (CWX|CWY) ==
541: request->request_mode) {
542: return(XtGeometryNo);
543: } else {
544: *reply = *request;
545: reply->request_mode = request->request_mode &
546: ~(CWX|CWY);
547: return(XtGeometryAlmost);
548: }
549: }
550: *reply = *request;
551: if(request->request_mode & CWWidth)
552: w->core.width = request->width;
553: if(request->request_mode & CWHeight)
554: w->core.height = request->height;
555: if(request->request_mode & CWBorderWidth)
556: w->core.border_width = request->border_width;
557: return(XtGeometryYes);
558: }
559: values = *(XWindowChanges *) (&(request->x));
560: XGrabServer(XtDisplay(w));
561: XGetNormalHints(XtDisplay(w), w->core.window, &oldhints);
562: if(request->request_mode & CWWidth) {
563: oldhints.flags &= ~USSize;
564: oldhints.flags |= PSize;
565: oldhints.width = request->width;
566: }
567: if(request->request_mode & CWHeight) {
568: oldhints.flags &= ~USSize;
569: oldhints.flags |= PSize;
570: oldhints.height = request->height;
571: }
572: XSetNormalHints(XtDisplay(w), w->core.window, &oldhints);
573: /* ||| this code depends on the core x,y,width,height,borderwidth fields */
574: /* being the same size and same order as an XWindowChanges record. Yechh!!! */
575: XConfigureWindow(XtDisplay(w), w->core.window,
576: request->request_mode, (XWindowChanges *)&(request->x));
577: XUngrabServer(XtDisplay(w));
578: return(XtGeometryNo);
579: }
580:
581: static Boolean SetValues (current, request, new, last)
582: Widget current, request, new;
583: Boolean last;
584: {
585: XWMHints wmhints, *oldhints;
586: TopLevelWidget cur = (TopLevelWidget) current;
587: TopLevelWidget req = (TopLevelWidget) request;
588: TopLevelWidget tnew = (TopLevelWidget) new;
589: Boolean name = FALSE;
590: Boolean pixmap = FALSE;
591: Boolean window = FALSE;
592: Boolean title = FALSE;
593:
594: /* I don't let people play with most of my values */
595: tnew->top = cur->top;
596:
597: /* except these few.... */
598:
599: tnew-> top.resizeable = req->top.resizeable;
600: if(req ->top.icon_name != cur->top.icon_name) {
601: tnew ->top.icon_name = req->top.icon_name;
602: name = TRUE;
603: }
604: /*XXX Leak allert These should be copied and freed but I am lazy */
605: if(req ->top.icon_pixmap != cur->top.icon_pixmap) {
606: tnew ->top.icon_pixmap = req->top.icon_pixmap;
607: pixmap = TRUE;
608: }
609: if(req ->top.icon_window != cur->top.icon_window) {
610: tnew ->top.icon_window = req->top.icon_window;
611: window = TRUE;
612: }
613: if(req ->top.title != cur->top.title) {
614: tnew ->top.title = req->top.title;
615: name = TRUE;
616: }
617: if((name || pixmap || window || title) && XtIsRealized((Widget)tnew)) {
618: if(name) {
619: XSetIconName(XtDisplay(tnew), tnew->core.window, tnew->top.icon_name);
620: }
621: if( title ) {
622: XStoreName(XtDisplay(tnew), tnew->core.window, tnew->top.title);
623: }
624: if(pixmap || window) {
625: oldhints = XGetWMHints(XtDisplay(tnew), tnew->core.window);
626: wmhints = *oldhints;
627: XtFree((char *)oldhints);
628: if(pixmap) {
629: wmhints.flags |= IconPixmapHint;
630: wmhints.icon_pixmap = tnew->top.icon_pixmap;
631: }
632: if(window) {
633: wmhints.flags |= IconWindowHint;
634: wmhints.icon_window = tnew->top.icon_window;
635: }
636: XSetWMHints( XtDisplay(tnew), tnew->core.window, &wmhints);
637: }
638: }
639:
640: return (FALSE); /* redisplay is never needed */
641:
642: }
643:
644: /*
645: * This routine creates the desired widget and does the "Right Thing" for
646: * the toolkit and for window managers.
647: */
648:
649: Widget
650: XtInitialize(name, classname, urlist, urlistCount, argc, argv)
651: char *name;
652: char *classname;
653: XrmOptionDescRec *urlist;
654: Cardinal urlistCount;
655: Cardinal *argc;
656: char *argv[];
657: {
658: char displayName[256];
659: /*
660: char *displayName_ptr = displayName;
661: */
662: Arg args[8];
663: Cardinal num_args = 0;
664: int i;
665: /*
666: int val;
667: int flags = 0;
668: */
669: char filename[MAXPATHLEN];
670: char **saved_argv;
671: int saved_argc = *argc;
672: Display *dpy;
673: char *ptr, *rindex();
674: TopLevelWidget w;
675: Widget root;
676: int squish = -1;
677: Boolean dosync = FALSE;
678:
679:
680: if( name == NULL) {
681: ptr = rindex(argv[0], '/');
682: if(ptr)
683: name = ++ ptr;
684: else
685: name = argv[0];
686: }
687:
688: /* save away argv and argc so I can set the properties latter */
689:
690: saved_argv = (char **) XtCalloc(
691: (unsigned) ((*argc) + 1) , (unsigned)sizeof(*saved_argv));
692: for (i = 0 ; i < *argc ; i++)
693: saved_argv[i] = argv[i];
694: saved_argv[i] = NULL;
695: /*
696: Find the display name and open it
697: While we are at it we look for name because that is needed
698: soon after to do the arguement parsing.
699: */
700: displayName[0] = 0;
701:
702: for(i = 1; i < *argc; i++) {
703: if (index(argv[i], ':') != NULL) {
704: (void) strncpy(displayName, argv[i], sizeof(displayName));
705: if( *argc == i + 1) {
706: (*argc)--;
707: } else { /* need to squish this one out of the list */
708: squish = i;
709: }
710: continue;
711: }
712: if(!strcmp("-name", argv[i]) || ! strcmp("-n", argv[i])) {
713: i++;
714: if(i == *argc) break;
715: name = argv[i];
716: continue;
717: }
718: if (!strcmp("-sync", argv[i])) {
719: dosync = TRUE;
720: continue;
721: }
722: }
723: if(squish != -1) {
724: (*argc)--;
725: for(i = squish; i < *argc; i++) {
726: argv[i] = argv[i+1];
727: }
728: }
729: /* Open display */
730: if (!(dpy = XOpenDisplay(displayName))) {
731: char buf[1024];
732: (void) strcpy(buf, "Can't Open display: ");
733: (void) strcat(buf, displayName);
734: XtError(buf);
735: }
736: toplevelDisplay = dpy;
737: if (dosync) XSynchronize(dpy, TRUE);
738:
739: XtSetArg(args[num_args], "display", dpy);
740: num_args++;
741: XtSetArg(args[num_args], "screen", dpy->default_screen);
742: num_args++;
743:
744: /* initialize the toolkit */
745: DO_Initialize();
746: #define UNIX
747: #ifdef UNIX
748: #define XAPPLOADDIR "/usr/lib/Xapps/"
749: #endif
750: (void) strcpy(filename, XAPPLOADDIR);
751: (void) strcat(filename, classname);
752:
753:
754: /*set up resource database */
755: XGetUsersDataBase(dpy, filename);
756:
757: /*
758: This routine parses the command line arguments and removes them from
759: argv.
760: */
761: XrmParseCommand( opTable, XtNumber(opTable), name, argc, argv);
762:
763: if(urlistCount >0) {
764: /* the application has some more defaults */
765: XrmParseCommand( urlist, urlistCount, name, argc, argv);
766: }
767: /* Resources are initialize and loaded */
768: /* I now must handle geometry specs a compond resource */
769:
770: /*
771: Create the top level widget.
772: Unlike most classes the toplevel widget class has no classname
773: The name is supplied in the call to XtInitialize.
774: */
775: (void) strcpy(
776: ((TopLevelClassRec *)(topLevelWidgetClass))->core_class.class_name
777: = (String)XtMalloc((unsigned)strlen(classname)+1),
778: classname);
779: root = TopLevelCreate(name, topLevelWidgetClass,
780: &(dpy->screens[dpy->default_screen]),
781: args, num_args);
782:
783: w = (TopLevelWidget) root;
784: w->top.argc = saved_argc;
785: w->top.argv = saved_argv;
786: (void) strcpy(w->top.classname = (char *)XtMalloc((unsigned)strlen(classname)+1)
787: ,classname);
788:
789: init_atoms(dpy);
790:
791: return(root);
792: }
793:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.