Annotation of researchv9/X11/src/X.V11R1/lib/Xtk/Intrinsic.c, revision 1.1.1.1

1.1       root        1: #ifndef lint
                      2: static char rcsid[] = "$Header: Intrinsic.c,v 1.34 87/09/14 00:39:44 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: #include "Intrinsic.h"
                     28: #include "TM.h"
                     29: #include "Atoms.h"
                     30: 
                     31: extern char *strcpy();
                     32: extern void RegisterWindow(); /* from event, should be in .h ||| */
                     33: extern void UnregisterWindow(); /* from event, should be in .h ||| */
                     34: /******************************************************************
                     35:  *
                     36:  * Core Resources
                     37:  *
                     38:  ******************************************************************/
                     39: 
                     40: static XtResource resources[] = {
                     41:     {XtNx, XtCPosition, XrmRInt, sizeof(int),
                     42:          XtOffset(Widget,core.x), XtRString, "0"},
                     43:     {XtNy, XtCPosition, XrmRInt, sizeof(int),
                     44:          XtOffset(Widget,core.y), XtRString, "0"},
                     45:     {XtNwidth, XtCWidth, XrmRInt, sizeof(int),
                     46:          XtOffset(Widget,core.width), XtRString, "0"},
                     47:     {XtNheight, XtCHeight, XrmRInt, sizeof(int),
                     48:          XtOffset(Widget,core.height), XtRString, "0"},
                     49: /* default depth should be "InheritFromParent", and we should have a */
                     50: /* string to depth type converter, but it needs the widget to be able */
                     51: /* to find the parent's depth... right now, we kludge it and check for */
                     52: /* a depth of 0 in XtCreateWidget. Gross. */
                     53:     {XtNdepth, XtCDepth,XrmRInt,sizeof(int),
                     54:          XtOffset(Widget,core.depth), XtRString, "0"},
                     55:     {XtNbackground,XtCBackground,XrmRPixel,sizeof(Pixel),
                     56:          XtOffset(Widget,core.background_pixel), XtRString, "White"},
                     57:     {XtNborderWidth, XtCBorderWidth,XrmRInt, sizeof(int),
                     58:          XtOffset(Widget,core.border_width),XtRString, "1"},
                     59:     {XtNborder,XtCBorderColor,XrmRPixel,sizeof(Pixel),
                     60:          XtOffset(Widget,core.border_pixel),XtRString, "Black"},
                     61:     {XtNsensitive,XtCSensitive,XrmRBoolean, sizeof(Boolean),
                     62:          XtOffset(Widget,core.sensitive),XtRString,"TRUE"},
                     63:     {XtNmappedWhenManaged,XtCMappedWhenManaged,XrmRBoolean, sizeof(Boolean),
                     64:          XtOffset(Widget,core.mapped_when_managed),XtRString,"TRUE"}
                     65:     };
                     66: static void CoreDestroy();
                     67: static Boolean CoreSetValues ();
                     68: 
                     69: CompositeWidgetClass compositeWidgetClass = &compositeClassRec;
                     70: ConstraintWidgetClass constraintWidgetClass = &constraintClassRec;
                     71: 
                     72: /* ||| Should have defaults for Inherit from superclass to work */
                     73: 
                     74: WidgetClassRec widgetClassRec = {
                     75:          (WidgetClass)NULL,    /*superclass pointer*/
                     76:          "Core",               /*class_name*/
                     77:           sizeof(WidgetRec),   /*size of core data record*/
                     78:          (XtWidgetProc)NULL,     /* class initializer routine */
                     79:          FALSE,                /* not init'ed */
                     80:           (XtWidgetProc)NULL,  /* Instance Initializer routine*/
                     81:           (XtWidgetProc)NULL,  /*Realize*/
                     82:           NULL,                        /*actions*/
                     83:           0,                   /*number of actions in translation table*/
                     84:           resources,           /*resource list*/
                     85:           XtNumber(resources), /*resource_count*/
                     86:           NULLQUARK,           /*xrm_class*/
                     87:           FALSE,                /*compress motion*/
                     88:           TRUE,                 /*compress exposure*/
                     89:           FALSE,               /*visible_interest*/
                     90:           CoreDestroy,         /*destroy proc*/
                     91:           (XtWidgetProc) NULL,  /*resize*/
                     92:           (XtExposeProc)NULL, /*expose*/
                     93:           CoreSetValues,               /*set_values*/
                     94:           (XtWidgetProc)NULL      /*accept_focus*/
                     95: };
                     96: 
                     97: static void CompositeInsertChild();
                     98: static void CompositeDeleteChild();
                     99: static void CompositeDestroy();
                    100: 
                    101: ConstraintClassRec constraintClassRec = {
                    102:     {
                    103:          (WidgetClass)&widgetClassRec, /*superclass pointer*/
                    104:          "Composite",          /*class_name*/
                    105:           sizeof(CompositeRec),   /*size of core data record*/
                    106:          (XtWidgetProc)NULL,     /* class initializer routine */
                    107:          FALSE,                /* not init'ed */
                    108:           (XtWidgetProc)NULL,  /* Instance Initializer routine*/
                    109:           (XtWidgetProc)NULL,  /*Realize*/
                    110:           NULL,                        /*actions*/
                    111:           0,                    /*number of actions*/
                    112:           NULL,                        /*resource list*/
                    113:           0,                   /*resource_count*/
                    114:           NULLQUARK,           /*xrm_class*/
                    115:           FALSE,                /*compress motion*/
                    116:           TRUE,                 /*compress expose*/
                    117:           FALSE,               /*visible_interest*/
                    118:           (XtWidgetProc) CompositeDestroy,     /*destroy proc*/
                    119:           (XtWidgetProc) NULL,  /*resize*/
                    120:           (XtExposeProc)NULL, /*expose*/
                    121:           NULL,                        /*set_values*/
                    122:           (XtWidgetProc)NULL,      /*accept_focus*/
                    123:     },{
                    124:        (XtGeometryHandler) NULL,       /* geometry_manager */
                    125:        (XtWidgetProc) NULL,
                    126:        CompositeInsertChild,
                    127:        CompositeDeleteChild,
                    128:        (XtWidgetProc) NULL,
                    129:        (XtWidgetProc) NULL,
                    130:     },{
                    131:        NULL,
                    132:        0
                    133:     }
                    134: };
                    135: 
                    136: CompositeClassRec compositeClassRec = {
                    137:     {
                    138:          (WidgetClass)&widgetClassRec, /*superclass pointer*/
                    139:          "Composite",          /*class_name*/
                    140:           sizeof(CompositeRec),   /*size of core data record*/
                    141:          (XtWidgetProc)NULL,     /* class initializer routine */
                    142:          FALSE,                /* not init'ed */
                    143:           (XtWidgetProc)NULL,  /* Instance Initializer routine*/
                    144:           (XtWidgetProc)NULL,  /*Realize*/
                    145:           NULL,                        /*actions*/
                    146:           0,                    /*number of actions*/
                    147:           NULL,                        /*resource list*/
                    148:           0,                   /*resource_count*/
                    149:           NULLQUARK,           /*xrm_class*/
                    150:           FALSE,                /*compress motion*/
                    151:           TRUE,                 /*compress expose*/
                    152:           FALSE,               /*visible_interest*/
                    153:           (XtWidgetProc) CompositeDestroy,     /*destroy proc*/
                    154:           (XtWidgetProc) NULL,  /*resize*/
                    155:           (XtExposeProc)NULL, /*expose*/
                    156:           NULL,                        /*set_values*/
                    157:           (XtWidgetProc)NULL,      /*accept_focus*/
                    158:     },{
                    159:        (XtGeometryHandler) NULL,       /* geometry_manager */
                    160:        (XtWidgetProc) NULL,
                    161:        CompositeInsertChild,
                    162:        CompositeDeleteChild,
                    163:        (XtWidgetProc) NULL,
                    164:        (XtWidgetProc) NULL,
                    165:     }
                    166: };
                    167: 
                    168: void ClassInit(widgetClass)
                    169:     WidgetClass widgetClass;
                    170: {
                    171:     if ((widgetClass->core_class.superclass != NULL) 
                    172:            && (!(widgetClass->core_class.superclass-> core_class.class_inited)))
                    173:        ClassInit(widgetClass->core_class.superclass);
                    174:     if (widgetClass->core_class.class_initialize != NULL)
                    175:        widgetClass->core_class.class_initialize();
                    176:     widgetClass->core_class.class_inited = TRUE;
                    177:     return;
                    178: }
                    179: 
                    180: static void RecurseInitialize (reqWidget, newWidget, args, num_args, class)
                    181:     Widget reqWidget;
                    182:     Widget newWidget;
                    183:     ArgList args;
                    184:     Cardinal num_args;
                    185:     WidgetClass class;
                    186: {
                    187:     if (class->core_class.superclass)
                    188:                RecurseInitialize (reqWidget, newWidget, args, num_args, 
                    189:            class->core_class.superclass);
                    190:     if (class->core_class.initialize)
                    191:                (*class->core_class.initialize) (reqWidget, newWidget, args, num_args);
                    192: }
                    193: 
                    194: Widget TopLevelCreate(name,widgetClass,screen,args,num_args)
                    195:     char *name;
                    196:     WidgetClass widgetClass;
                    197:     Screen* screen;
                    198:     ArgList args;
                    199:     Cardinal num_args;
                    200: {
                    201:     Widget widget, reqWidget;
                    202:     unsigned widget_size;
                    203:     if(!(widgetClass->core_class.class_inited))
                    204:         ClassInit(widgetClass);
                    205:     widget_size = widgetClass->core_class.widget_size;
                    206:     widget = (Widget)XtMalloc(widget_size);
                    207:     widget->core.window = (Window) NULL;
                    208:     widget->core.name = strcpy(XtMalloc((unsigned) strlen(name)+1), name);
                    209:     widget->core.widget_class = widgetClass;
                    210:     widget->core.parent = NULL;
                    211:     widget->core.screen = screen;
                    212:     widget->core.managed = FALSE;
                    213:     widget->core.visible = TRUE;
                    214:     widget->core.background_pixmap = (Pixmap) NULL;
                    215:     widget->core.border_pixmap = (Pixmap) NULL;
                    216:     widget->core.event_table = NULL;
                    217:     widget->core.sensitive = TRUE;
                    218:     widget->core.ancestor_sensitive = TRUE;
                    219:     widget->core.translations = NULL;
                    220:     widget->core.destroy_callbacks = NULL;
                    221:     widget->core.being_destroyed = FALSE;
                    222: 
                    223:    if (XtIsComposite(widget)) {
                    224:                 ((CompositeWidget)widget)->composite.num_children = 0;
                    225:                ((CompositeWidget)widget)->composite.num_mapped_children = 0;
                    226:                 ((CompositeWidget)widget)->composite.children = NULL;
                    227:                 }
                    228:     XtGetResources(widget,args,num_args);
                    229:     if (widget->core.depth == 0)
                    230:     /* ||| gross kludge! fix this!!! */
                    231:        widget->core.depth = XtScreen(widget)->root_depth;
                    232:     reqWidget = (Widget)XtMalloc(widget_size);
                    233:     bcopy ((char *) widget, (char *) reqWidget, widget_size);
                    234:     RecurseInitialize (reqWidget, widget, args, num_args, widgetClass);
                    235:     XtFree ((char *) reqWidget);
                    236: 
                    237:     return (widget);
                    238: }
                    239: 
                    240: static void CompositeDestroy(w)
                    241:     CompositeWidget    w;
                    242: {
                    243:     XtFree((char *) w->composite.children);
                    244: }
                    245: 
                    246: /* ARGSUSED */
                    247: static void CompositeInsertChild(w, args, num_args)
                    248:     Widget     w;
                    249:     ArgList    args;
                    250:     Cardinal   num_args;
                    251: {
                    252:     Cardinal       position;
                    253:     Cardinal       i;
                    254:     CompositeWidget cw;
                    255: 
                    256:     cw = (CompositeWidget) w->core.parent;
                    257: 
                    258:     /* ||| Get position from "insert_position" procedure */
                    259:     position = cw->composite.num_children;
                    260: 
                    261:     /* ||| Some better allocation, don't realloc every time ! */
                    262:     cw->composite.children = 
                    263:         (WidgetList) XtRealloc((caddr_t) cw->composite.children,
                    264:        (unsigned) (cw->composite.num_children + 1) * sizeof(Widget));
                    265:     /* Ripple children up one space from "position" */
                    266:     for (i = cw->composite.num_children; i > position; i--) {
                    267:         cw->composite.children[i] = cw->composite.children[i-1];
                    268:     }
                    269:     cw->composite.children[position] = w;
                    270:     cw->composite.num_children++;
                    271: }
                    272: 
                    273: static void CompositeDeleteChild(w)
                    274:     Widget     w;
                    275: {
                    276:     Cardinal       position;
                    277:     Cardinal       i;
                    278:     CompositeWidget cw;
                    279: 
                    280:     cw = (CompositeWidget) w->core.parent;
                    281: 
                    282:     for (position = 0; position < cw->composite.num_children; position++) {
                    283:         if (cw->composite.children[position] == w) {
                    284:            break;
                    285:        }
                    286:     }
                    287: 
                    288:     /* Ripple children down one space from "position" */
                    289:     cw->composite.num_children--;
                    290:     for (i = position; i < cw->composite.num_children; i++) {
                    291:         cw->composite.children[i] = cw->composite.children[i+1];
                    292:     }
                    293: }
                    294: 
                    295: Widget XtCreateWidget(name,widgetClass,parent,args,num_args)
                    296:     char       *name;  
                    297:     WidgetClass widgetClass;
                    298:     Widget     parent;
                    299:     ArgList     args;
                    300:     Cardinal    num_args;
                    301: 
                    302: {
                    303:     Widget    widget, reqWidget;
                    304:     unsigned widget_size;
                    305:     if (widgetClass == NULL || parent == NULL || ! XtIsComposite(parent))  {
                    306:                        XtError("invalid parameters to XtCreateWidget");
                    307:                        return NULL;
                    308:                        }
                    309:     if (! (widgetClass->core_class.class_inited))
                    310:        ClassInit(widgetClass);
                    311: 
                    312:     widget_size = widgetClass->core_class.widget_size;
                    313:     widget = (Widget)XtMalloc(widget_size);
                    314:     widget->core.window = (Window) NULL;
                    315:     widget->core.name = strcpy(XtMalloc((unsigned)strlen(name)+1), name);
                    316:     widget->core.widget_class = widgetClass;
                    317:     widget->core.parent = parent;
                    318:     widget->core.screen = parent->core.screen;
                    319:     widget->core.managed = FALSE;
                    320:     widget->core.visible = TRUE;
                    321:     widget->core.background_pixmap = (Pixmap) NULL;
                    322:     widget->core.border_pixmap = (Pixmap) NULL;
                    323:     widget->core.event_table = NULL;
                    324:     widget->core.sensitive = TRUE;
                    325:     widget->core.ancestor_sensitive = TRUE;
                    326:     widget->core.translations = NULL;
                    327:     widget->core.destroy_callbacks = NULL;
                    328:     widget->core.being_destroyed = parent -> core.being_destroyed;
                    329:     /* ||| Should be in CompositeInitialize */
                    330:     if (XtIsComposite (widget)) {
                    331:                ((CompositeWidget)widget)->composite.num_children = 0;
                    332:                ((CompositeWidget)widget)->composite.num_mapped_children = 0;
                    333:                ((CompositeWidget)widget)->composite.children = NULL;
                    334:                ((CompositeWidget)widget)->composite.num_slots = 0;
                    335:                 }
                    336:     XtGetResources(widget,args,num_args);
                    337:     if (widget->core.depth == 0)
                    338:     /* ||| gross kludge! fix this!!! */
                    339:        widget->core.depth = widget->core.parent->core.depth;
                    340:     DefineTranslation(widget);
                    341:     reqWidget = (Widget)XtMalloc(widget_size);
                    342:     bcopy ((char *) widget, (char *) reqWidget, widget_size);
                    343:     RecurseInitialize (reqWidget, widget, args, num_args, widgetClass);
                    344:     XtFree ((char *) reqWidget);
                    345:     ((CompositeWidgetClass)(widget->core.parent->core.widget_class))
                    346:        ->composite_class.insert_child(widget, args, num_args);
                    347:     return (widget);
                    348: }
                    349: 
                    350: void FillInParameters(widget,valuemask,values)
                    351:     Widget  widget;
                    352:     XtValueMask *valuemask;
                    353:     XSetWindowAttributes *values;
                    354: {
                    355:     *valuemask = (CWBackPixel | CWBorderPixel | CWEventMask);
                    356:     (*values).event_mask = _XtBuildEventMask(widget);
                    357:     (*values).background_pixel = widget->core.background_pixel;
                    358:     (*values).border_pixel = widget->core.border_pixel;
                    359:     return;
                    360: }
                    361: 
                    362: Boolean XtIsRealized (widget)
                    363:     Widget   widget;
                    364: {
                    365:    return (widget->core.window != NULL);
                    366: }
                    367: 
                    368: Boolean XtIsSubclass(widget, widgetClass)
                    369:     Widget    widget;
                    370:     WidgetClass widgetClass;
                    371: {
                    372:   WidgetClass w;
                    373:   for(w=widget->core.widget_class; w != NULL; w = w->core_class.superclass)
                    374:         if (w == widgetClass) return (TRUE);
                    375:   return (FALSE);
                    376: }
                    377: 
                    378: void XtRealizeWidget (widget)
                    379:     
                    380:     Widget    widget;
                    381: {
                    382:     CompositeWidget cwidget;
                    383:     XtValueMask valuemask;
                    384:     XSetWindowAttributes values;
                    385:     Cardinal i;
                    386:    if (XtIsRealized(widget)) return;
                    387:    FillInParameters (widget,&valuemask,&values);
                    388:    widget->core.widget_class->core_class.realize(widget,valuemask,&values);
                    389:    RegisterWindow(widget->core.window, widget);
                    390:    if (XtIsComposite (widget)) {
                    391:         cwidget = (CompositeWidget)widget;
                    392:        for (i= cwidget->composite.num_children;i!=0;--i) 
                    393:                XtRealizeWidget(cwidget->composite.children[i-1]);
                    394:         if (cwidget->composite.num_children == cwidget->composite.num_mapped_children)
                    395:                XMapSubwindows(XtDisplay(widget), XtWindow(widget));
                    396:        else while (i = cwidget->composite.num_mapped_children != 0) {
                    397:                if (cwidget->composite.children[i-1]->core.managed) {
                    398:                        XtMapWidget(cwidget->composite.children[i-1]);
                    399:                        i--;
                    400:                        } }
                    401:    }
                    402:     if (widget->core.parent == NULL) XtMapWidget(widget);
                    403:    return;
                    404: }
                    405: 
                    406: void XtCreateWindow(widget, windowClass, visual, valueMask, attributes)
                    407: Widget widget;
                    408: unsigned int windowClass;
                    409: Visual *visual;
                    410: Mask valueMask;
                    411: XSetWindowAttributes *attributes;
                    412: {
                    413:     if (widget->core.window == None) {
                    414:        widget->core.window = 
                    415:            XCreateWindow(XtDisplay(widget), (widget->core.parent ?
                    416:                                              widget->core.parent->core.window:
                    417:                                              widget->core.screen->root),
                    418:                          widget->core.x, widget->core.y,
                    419:                          widget->core.width, widget->core.height,
                    420:                          widget->core.border_width, (int)widget->core.depth,
                    421:                          windowClass, visual, valueMask, attributes);
                    422:     }
                    423: }      
                    424:                        
                    425:                
                    426: void XtUnmanageChildren(children, num_children)
                    427:     WidgetList children;
                    428:     Cardinal num_children;
                    429: {
                    430:     CompositeWidget    parent;
                    431:     register Widget    child;
                    432:     Cardinal           newCount, oldCount;
                    433: 
                    434:     if (num_children == 0) return;
                    435:     parent = (CompositeWidget) children[0]->core.parent;
                    436:     if (parent->core.being_destroyed) return;
                    437: 
                    438:     newCount = 0;
                    439:     for (oldCount = 0; oldCount < num_children; oldCount++) {
                    440:        child = children[oldCount];
                    441:         if ((CompositeWidget) child->core.parent != parent) {
                    442:            XtWarning("Not all children have same parent in XtRemoveChildren");
                    443:        } else if ((! child->core.managed) || (child->core.being_destroyed)) {
                    444:            /* Do nothing */
                    445:        } else {
                    446:            if (XtIsRealized(child)) {
                    447:                XtUnmapWidget(child);
                    448:            }
                    449:            child->core.managed = FALSE;
                    450:            newCount++;
                    451:        }
                    452:     }
                    453:     parent->composite.num_mapped_children =
                    454:        parent->composite.num_mapped_children - newCount;
                    455: 
                    456:     ((CompositeWidgetClass)parent->core.widget_class)
                    457:         ->composite_class.change_managed(parent);
                    458: }
                    459: 
                    460: void XtUnmanageChild(child)
                    461:     Widget child;
                    462: {
                    463:     XtUnmanageChildren(&child, 1);
                    464: }
                    465: 
                    466: void XtManageChildren(children, num_children)
                    467:     WidgetList children;
                    468:     Cardinal num_children;
                    469: {
                    470:     CompositeWidget    parent;
                    471:     register Widget    child;
                    472:     Cardinal           newCount, oldCount;
                    473: 
                    474:     if (num_children == 0) return;
                    475:     parent = (CompositeWidget) children[0]->core.parent;
                    476:     if (parent->core.being_destroyed) return;
                    477: 
                    478:     newCount = 0;
                    479:     for (oldCount = 0; oldCount < num_children; oldCount++) {
                    480:        child = children[oldCount];
                    481:         if ((CompositeWidget) child->core.parent != parent) {
                    482:            XtWarning("Not all children have same parent in XtAddChildren");
                    483:        } else if ((child->core.managed) || (child->core.being_destroyed)) {
                    484:            /* Do nothing */
                    485:        } else {
                    486:            if (XtIsRealized(child)) {
                    487:                /* ||| Do mapping after change_managed */
                    488:                XtMapWidget(child);
                    489:            }
                    490:            child->core.managed = TRUE;
                    491:            newCount++;
                    492:        }
                    493:     }
                    494:     parent->composite.num_mapped_children =
                    495:        parent->composite.num_mapped_children + newCount;
                    496: 
                    497:     ((CompositeWidgetClass)parent->core.widget_class)
                    498:         ->composite_class.change_managed(parent);
                    499: }
                    500: 
                    501: void XtManageChild(child)
                    502:     Widget child;
                    503: {
                    504:     XtManageChildren(&child, (Cardinal) 1);
                    505: }
                    506: 
                    507: void XtSetMappedWhenManaged(widget, mappedWhenManaged)
                    508:     Widget    widget;
                    509:     Boolean   mappedWhenManaged;
                    510: {
                    511:     if (widget->core.mapped_when_managed == mappedWhenManaged) return;
                    512:     XtWarning("Mapped when managed not implemented."); /* ||| */
                    513:     if (mappedWhenManaged) {
                    514:        /* we didn't used to be mapped when managed. If we are realized and */
                    515:         /* managed then map us, increment parent's count of mapped children */
                    516:     } else {
                    517:        /* we used to be mapped when managed. If we were realized and */
                    518:        /* managed then unmap us, decrement parent's mapped children count */
                    519:     }
                    520: }
                    521: 
                    522: void XtSetSensitive(widget,sensitive)
                    523:     Widget    widget;
                    524:     Boolean   sensitive;
                    525: {
                    526:     int i;
                    527:     widget->core.sensitive = sensitive;
                    528:     if ((widget->core.sensitive == widget->core.ancestor_sensitive) 
                    529:                                  && XtIsComposite (widget))
                    530:       for (i= ((CompositeWidget)widget)->composite.num_children;i != 0; --i)
                    531:         XtSetSensitive (((CompositeWidget)widget)->composite.children[i-1],sensitive);
                    532:       
                    533: }
                    534: 
                    535: #define TABLESIZE 20
                    536: typedef struct {
                    537:     int offset;
                    538:     WidgetClass widgetClass;
                    539: } CallbackTableRec,*CallbackTable;
                    540: typedef void (*fooProc)();
                    541: static CallbackTable callbackTable = NULL;
                    542: static XtCallbackKind currentIndex = 1;
                    543: static XtCallbackKind maxIndex;
                    544: InitializeCallbackTable ()
                    545: {
                    546:   callbackTable = (CallbackTable) XtMalloc(
                    547:        (unsigned)TABLESIZE*sizeof(CallbackTableRec));
                    548:    maxIndex = TABLESIZE;
                    549: }
                    550: 
                    551: static void ExpandTable()
                    552: {
                    553: 
                    554:    callbackTable = (CallbackTable)XtRealloc(
                    555:        (char *)callbackTable,
                    556:        (unsigned)(currentIndex+TABLESIZE)*sizeof(CallbackTableRec));
                    557:    maxIndex = currentIndex + TABLESIZE;
                    558: } 
                    559:                                              
                    560: 
                    561: XtCallbackKind XtNewCallbackKind(widgetClass,offset)
                    562:     WidgetClass widgetClass;
                    563:     Cardinal  offset;
                    564: {
                    565:     if (currentIndex ==  maxIndex) ExpandTable();
                    566:     callbackTable[currentIndex].offset = offset;
                    567:     callbackTable[currentIndex].widgetClass = widgetClass;
                    568:     return(currentIndex++);
                    569: }
                    570: 
                    571: 
                    572: 
                    573: XtCallbackList *FetchXtCallbackList (widget,callbackKind)
                    574:     Widget  widget;
                    575:     XtCallbackKind  callbackKind;
                    576: {
                    577:     if ( callbackKind >= maxIndex ||
                    578:        !XtIsSubclass(widget,callbackTable[callbackKind].widgetClass) )
                    579:           return(NULL);
                    580: 
                    581:     return ((XtCallbackList*)((int)widget + callbackTable[callbackKind].offset));
                    582: }
                    583: 
                    584: 
                    585: void AddCallback (widget,callbackList,callback,closure)
                    586:     Widget widget;
                    587:     XtCallbackList *callbackList;
                    588:     XtCallbackProc callback;
                    589:     Opaque closure;
                    590: {
                    591: 
                    592:      XtCallbackRec *c,*cl;
                    593:      c =  (XtCallbackRec*) XtMalloc((unsigned)sizeof(XtCallbackRec));
                    594:      c -> next = NULL;
                    595:      c -> widget = widget;
                    596:      c -> closure = closure;
                    597:      c -> callback = callback; 
                    598:     if (*callbackList == NULL){
                    599:              (*callbackList) = c;
                    600:              return;
                    601:     }
                    602:     for (cl = (*callbackList); cl->next != NULL; cl = cl->next) {}
                    603:     cl->next = c;
                    604:     return;
                    605: }
                    606: 
                    607: void XtAddCallback(widget, callbackKind,callback,closure)
                    608:     Widget    widget;
                    609:     XtCallbackKind callbackKind;
                    610:     XtCallbackProc callback;
                    611:     Opaque      closure;
                    612: {
                    613:     XtCallbackList *callbackList;
                    614:     callbackList = FetchXtCallbackList(widget,callbackKind);
                    615:     if (callbackList == NULL) {
                    616:        XtError("invalid parameters to XtAddCallback");
                    617:        return;
                    618:     }
                    619:     AddCallback(widget,callbackList,callback,closure);
                    620:     return;
                    621: }
                    622: 
                    623: void RemoveCallback (widget,callbackList, callback, closure)
                    624:     Widget  widget;
                    625:     XtCallbackList *callbackList;
                    626:     XtCallbackProc callback;
                    627:     Opaque closure;
                    628: 
                    629: {
                    630:    XtCallbackList cl;
                    631: 
                    632:    for (
                    633:        cl = *callbackList;
                    634:        cl != NULL;
                    635:        (cl = *(callbackList = &cl->next)))
                    636:            if (( cl->widget == widget) && (cl->closure == closure)
                    637:                             && (cl->callback == callback) ) {
                    638:               *callbackList = cl->next;
                    639:                XtFree ((char *)cl);
                    640:            }
                    641:    return;
                    642: }
                    643: 
                    644: void XtRemoveCallback (widget, callbackKind, callback, closure)
                    645:     Widget    widget;
                    646:     XtCallbackKind callbackKind;
                    647:     XtCallbackProc callback;
                    648:     Opaque      closure;
                    649: {
                    650:    XtCallbackList *callbackList;
                    651:    callbackList = FetchXtCallbackList(widget,callbackKind);
                    652:    if (callbackList == NULL) {
                    653:       XtError("invalid parameters to XtRemoveCallback");
                    654:       return;
                    655:    }
                    656:    RemoveCallback(widget,callbackList,callback,closure);
                    657:     return;
                    658: }
                    659: 
                    660: 
                    661: void RemoveAllCallbacks (callbackList)
                    662:     XtCallbackList *callbackList;
                    663: 
                    664: {
                    665:    XtCallbackList cl, tcl;
                    666: 
                    667:    cl = *callbackList;
                    668:    while (cl != NULL) {
                    669:        tcl = cl;
                    670:        cl = cl->next;
                    671:        XtFree((char *) tcl);
                    672:    }
                    673: 
                    674:    (*callbackList) = NULL;
                    675: }
                    676: 
                    677: void XtRemoveAllCallbacks(widget, callbackKind)
                    678:     Widget widget;
                    679:     XtCallbackKind  callbackKind;
                    680: {
                    681:    XtCallbackList *callbackList;
                    682:    callbackList = FetchXtCallbackList(widget,callbackKind);
                    683:    if (callbackList == NULL) {
                    684:       XtError("invalid parameters to XtRemoveAllCallbacks");
                    685:      return;
                    686:    }
                    687:    RemoveAllCallbacks(callbackList);
                    688:    return;
                    689: }
                    690: 
                    691: 
                    692: void CallCallbacks (callbackList,callData)
                    693:     XtCallbackList *callbackList;
                    694:     Opaque callData;
                    695: {
                    696:     XtCallbackRec *cl;
                    697:     if ((*callbackList) == NULL )return;
                    698:     for (cl = (*callbackList); cl != NULL; cl = cl->next) 
                    699:              (*(cl->callback))(cl->widget,cl->closure,callData);
                    700: }
                    701: 
                    702: void XtCallCallbacks (widget, callbackKind, callData)
                    703:     Widget   widget;
                    704:     XtCallbackKind callbackKind;
                    705:     Opaque  callData;
                    706: {
                    707:    XtCallbackList *callbackList;
                    708:    callbackList = FetchXtCallbackList(widget,callbackKind);
                    709:    if (callbackList == NULL) {
                    710:      XtError("invalid parameters to XtCallCallbacks");
                    711:      return;
                    712:    }
                    713:    CallCallbacks(callbackList,callData);
                    714:    return;
                    715: }
                    716: 
                    717: 
                    718: void Phase1Destroy (widget)
                    719:     Widget    widget;
                    720: {
                    721:     int i;
                    722:     if (widget->core.being_destroyed) return;
                    723:     widget-> core.being_destroyed = TRUE;
                    724:     if (XtIsComposite (widget))
                    725:         for (i= ((CompositeWidget)widget)->composite.num_children; i != 0; --i)
                    726:             Phase1Destroy (((CompositeWidget)widget)->composite.children[i-1]);
                    727:     return;
                    728: }
                    729: void Recursive(widget,proc)
                    730:    Widget  widget;
                    731:    fooProc proc;
                    732: {
                    733:   CompositeWidget cwidget;
                    734:   int i;
                    735:   if (XtIsComposite(widget)) {
                    736:       cwidget=(CompositeWidget)widget;
                    737:       for (i=cwidget->composite.num_children;
                    738:            i != 0; --i) {
                    739:          Recursive(cwidget->composite.children[i-1],proc);
                    740:       }
                    741:   } 
                    742:   (*proc)(widget);  
                    743:   return;
                    744: }
                    745: 
                    746: void Phase2Callbacks(widget)
                    747:     Widget    widget;
                    748: {
                    749:      CallCallbacks(&(widget->core.destroy_callbacks),
                    750:          (Opaque) NULL);
                    751:      return;
                    752: }
                    753: 
                    754: /* ARGSUSED */
                    755: void Phase2Destroy(widget, closure, callData)
                    756:     Widget    widget;
                    757:     Opaque     closure;
                    758:     Opaque     callData;
                    759: {
                    760:   WidgetClass widgetClass;
                    761:   for(widgetClass = widget->core.widget_class;
                    762:       widgetClass != NULL; 
                    763:       widgetClass = widgetClass ->core_class.superclass) 
                    764:   if ((widgetClass->core_class.destroy) != NULL)
                    765:        (*(widgetClass->core_class.destroy))(widget);
                    766: }
                    767: 
                    768: void XtPhase2Destroy (widget, closure, callData)
                    769:     Widget    widget;
                    770: {
                    771:     Display *display;
                    772:     Window window;
                    773:     if (widget->core.parent != NULL) {
                    774:        XtUnmanageChild(widget);
                    775:        ((CompositeWidgetClass) widget->core.parent->core.widget_class)
                    776:                ->composite_class.delete_child(widget);
                    777:     }
                    778:     display = XtDisplay(widget); /* Phase2Destroy removes Widget*/
                    779:     window = widget->core.window;
                    780:     Recursive(widget,Phase2Callbacks);
                    781:     Recursive(widget,Phase2Destroy);
                    782:     if (window != NULL) XDestroyWindow(display,window);
                    783:     return;
                    784: }
                    785: 
                    786: 
                    787: void XtDestroyWidget (widget)
                    788:     Widget    widget;
                    789: 
                    790: {
                    791:     if (widget->core.being_destroyed) return;
                    792: 
                    793:     Phase1Destroy(widget);
                    794:     AddCallback(widget, &DestroyList, XtPhase2Destroy, (Opaque)NULL);
                    795: 
                    796: }
                    797: 
                    798: static void CoreDestroy (widget)
                    799:     Widget    widget;
                    800: {
                    801:    register XtEventRec *p1,*p2;
                    802:    XtFree((char*)(widget->core.name));
                    803:    if (widget->core.background_pixmap != NULL) 
                    804:       XFreePixmap(XtDisplay(widget),widget->core.background_pixmap);
                    805:    if (widget->core.border_pixmap != NULL)
                    806:       XFreePixmap(XtDisplay(widget),widget->core.border_pixmap);
                    807:    p1 = widget->core.event_table;
                    808:    while(p1 != NULL){
                    809:      p2 = p1;
                    810:      p1 = p1->next;
                    811:      XtFree((char*)p2);
                    812:    }
                    813:    if (widget->core.translations != NULL)
                    814:      TranslateTableFree(widget->core.translations);
                    815:    UnregisterWindow(widget->core.window,widget);
                    816: /* if (onGrabList(widget))RemoveGrab(widget); */
                    817:    XtFree((char*)widget);
                    818:    return;
                    819:      
                    820: }
                    821: 
                    822: static Boolean CoreSetValues()
                    823: {
                    824: /* ||| */
                    825: return (FALSE);
                    826: }

unix.superglobalmegacorp.com

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