|
|
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.