Annotation of researchv9/X11/src/X.V11R1/lib/oldXtk/ButtonBox.c, revision 1.1.1.1

1.1       root        1: /* $Header: ButtonBox.c,v 1.1 87/09/11 07:57:18 toddb Exp $ */
                      2: #ifndef lint
                      3: static char *sccsid = "@(#)ButtonBox.c 1.14    2/26/87";
                      4: #endif lint
                      5: 
                      6: /*
                      7:  * Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts.
                      8:  * 
                      9:  *                         All Rights Reserved
                     10:  * 
                     11:  * Permission to use, copy, modify, and distribute this software and its 
                     12:  * documentation for any purpose and without fee is hereby granted, 
                     13:  * provided that the above copyright notice appear in all copies and that
                     14:  * both that copyright notice and this permission notice appear in 
                     15:  * supporting documentation, and that the name of Digital Equipment
                     16:  * Corporation not be used in advertising or publicity pertaining to
                     17:  * distribution of the software without specific, written prior permission.  
                     18:  * 
                     19:  * 
                     20:  * DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
                     21:  * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
                     22:  * DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
                     23:  * ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
                     24:  * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
                     25:  * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
                     26:  * SOFTWARE.
                     27:  */
                     28: 
                     29: 
                     30: /* 
                     31:  * ButtonBox.c - Button box composite widget
                     32:  * 
                     33:  * Author:     haynes
                     34:  *             Digital Equipment Corporation
                     35:  *             Western Research Laboratory
                     36:  * Date:       Sat Jan 24 1987
                     37:  */
                     38: 
                     39: #include       "Xlib.h"
                     40: #include       "Intrinsic.h"
                     41: #include       "ButtonBox.h"
                     42: #include       "Atoms.h"
                     43: 
                     44: #define MAXHEIGHT      ((1 << 31)-1)
                     45: #define MAXWIDTH       ((1 << 31)-1)
                     46: 
                     47: #define max(x, y)      (((x) > (y)) ? (x) : (y))
                     48: #define min(x, y)      (((x) < (y)) ? (x) : (y))
                     49: #define assignmax(x, y)        if ((y) > (x)) x = (y)
                     50: #define assignmin(x, y)        if ((y) < (x)) x = (y)
                     51: 
                     52: /****************************************************************
                     53:  *
                     54:  * Private Types
                     55:  *
                     56:  ****************************************************************/
                     57: 
                     58: typedef        struct _WidgetDataRec {
                     59:     Display            *dpy;           /* widget display connection */
                     60:     Window             w;              /* widget window */
                     61:     Position           x, y;           /* widget window location */
                     62:     Dimension          width, height;  /* widget window width and height */
                     63:     Dimension          borderWidth;    /* widget window border width */
                     64:     Pixel              borderpixel;    /* widget window border color */
                     65:     Pixel              bgpixel;        /* widget window background color */
                     66:     Dimension          hspace, vspace; /* spacing between buttons */
                     67:     int                        numbuttons;     /* number of managed buttons */
                     68:     WindowLugPtr       buttons;        /* list of managed buttons */
                     69:     Boolean             allowresize;    /* reconfigure on notify */
                     70: } WidgetDataRec, *WidgetData;
                     71: 
                     72: 
                     73: /****************************************************************
                     74:  *
                     75:  * Private Data
                     76:  *
                     77:  ****************************************************************/
                     78: 
                     79: static int      index; /* index into button list to add/delete window */
                     80: 
                     81: static WidgetDataRec globaldata;
                     82: static WidgetDataRec globalinit = {
                     83:     NULL,              /* Display dpy; */
                     84:     NULL,              /* Window w; */
                     85:     0, 0,              /* Position x, y; */
                     86:     0, 0,              /* Dimension width, height; */
                     87:     1,                 /* Dimension borderWidth; */
                     88:     NULL,              /* Pixmap borderpixel; */
                     89:     NULL,              /* Pixmap bgpixel; */
                     90:     4, 4,              /* int hspace, vspace; */
                     91:     0,                 /* int numbuttons; */
                     92:     NULL,              /* WindowLugPtr buttons; */
                     93:     TRUE               /* resizable */
                     94: };
                     95: 
                     96: static Resource resources[] = {
                     97:     {XtNwindow, XtCWindow, XrmRWindow, sizeof(Window),
                     98:         (caddr_t)&globaldata.w, (caddr_t)NULL},
                     99:     {XtNx, XtCX, XrmRInt, sizeof(int),
                    100:         (caddr_t)&globaldata.x, (caddr_t)NULL},
                    101:     {XtNy, XtCY, XrmRInt, sizeof(int),
                    102:         (caddr_t)&globaldata.y, (caddr_t)NULL},
                    103:     {XtNwidth, XtCWidth, XrmRInt, sizeof(int),
                    104:         (caddr_t)&globaldata.width, (caddr_t)NULL},
                    105:     {XtNheight, XtCHeight, XrmRInt, sizeof(int),
                    106:         (caddr_t)&globaldata.height, (caddr_t)NULL},
                    107:     {XtNborderWidth, XtCBorderWidth, XrmRInt, sizeof(int),
                    108:         (caddr_t)&globaldata.borderWidth, (caddr_t)NULL},
                    109:     {XtNborder, XtCColor, XrmRPixel, sizeof(int),
                    110:         (caddr_t)&globaldata.borderpixel, (caddr_t)&XtDefaultFGPixel},
                    111:     {XtNbackground, XtCColor, XrmRPixel, sizeof(int),
                    112:         (caddr_t)&globaldata.bgpixel, (caddr_t)&XtDefaultBGPixel},
                    113:     {XtNhSpace, XtCHSpace, XrmRInt, sizeof(int),
                    114:         (caddr_t)&globaldata.hspace, (caddr_t)NULL},
                    115:     {XtNvSpace, XtCVSpace, XrmRInt, sizeof(int),
                    116:         (caddr_t)&globaldata.vspace, (caddr_t)NULL},
                    117:     {XtNresizable, XtCBoolean, XrmRBoolean, sizeof(Boolean),
                    118:         (caddr_t)&globaldata.allowresize, (caddr_t) NULL}
                    119: };
                    120: 
                    121: 
                    122: static int     indexinit = -1;
                    123: static Resource parmResources[] = {
                    124:     {XtNindex, XtCIndex, XrmRInt,
                    125:         sizeof(int), (caddr_t)&index, (caddr_t)&indexinit},
                    126: };
                    127: 
                    128: /****************************************************************
                    129:  *
                    130:  * Private Routines
                    131:  *
                    132:  ****************************************************************/
                    133: 
                    134: static Boolean initialized = FALSE;
                    135: 
                    136: static XContext widgetContext;
                    137: 
                    138: static void ButtonBoxInitialize()
                    139: {
                    140:     if (initialized)
                    141:        return;
                    142:     initialized = TRUE;
                    143: 
                    144:     widgetContext = XUniqueContext();
                    145: }
                    146: 
                    147: /*
                    148:  * Given a display and window, get the widget data.
                    149:  */
                    150: 
                    151: static WidgetData DataFromWindow(dpy, window)
                    152: Display *dpy;
                    153: Window window;
                    154: {
                    155:     WidgetData result;
                    156:     if (XFindContext(dpy, window, widgetContext, (caddr_t *)&result))
                    157:         return NULL;
                    158:     return result;
                    159: }
                    160: 
                    161: /*
                    162:  *
                    163:  * Do a layout, either actually assigning positions, or just calculating size.
                    164:  * Returns 1 on success; 0 if it couldn't make things fit.
                    165:  *
                    166:  */
                    167: 
                    168: static int DoLayout(data, width, height, box, position)
                    169: WidgetData     data;
                    170: Dimension      width, height;
                    171: WindowBox      *box;           /* RETURN */
                    172: Boolean                position;       /* actually reposition the windows? */
                    173: {
                    174:     int        i;
                    175:     int        w, h, lw, lh, count;
                    176: 
                    177:     w = data->hspace;
                    178:     if ((w > width) && !position) return (0);
                    179:     h = data->vspace;
                    180:     if ((h > height) && !position) return (0);
                    181:    
                    182:     for (i = 0; i < data->numbuttons; ) {
                    183:        count = 0;
                    184:        lh = 0;
                    185:        lw = data->hspace;
                    186:        /* compute one line worth */
                    187:        for ( ; (i < data->numbuttons); i++) {
                    188:            int tw, th;
                    189:            tw = lw
                    190:                + data->buttons[i].wb.width
                    191:                + 2*data->buttons[i].wb.borderWidth
                    192:                + data->hspace;
                    193:            if (tw > width) {
                    194:              if (!position) break;
                    195:              if (count > 0) break;
                    196:            }
                    197:            if (position &&
                    198:                (lw != data->buttons[i].wb.x || h != data->buttons[i].wb.y)) {
                    199:                XMoveWindow(data->dpy, data->buttons[i].w, lw, h);
                    200:                data->buttons[i].wb.x = lw;
                    201:                data->buttons[i].wb.y = h;
                    202:                (void) XtSendConfigureNotify(data->dpy, data->buttons[i].w,
                    203:                                             &(data->buttons[i].wb));
                    204:            }
                    205:            lw = tw;
                    206:            th = data->buttons[i].wb.height + 2*data->buttons[i].wb.borderWidth;
                    207:            assignmax(lh, th);
                    208:            count++;
                    209:        }
                    210:        if (count == 0) return (0);
                    211:        assignmax(w, lw);
                    212:        h += lh+data->vspace;
                    213:        if ((h > height) && !position) return (0);
                    214:     }
                    215: 
                    216:     if (box != NULL) {
                    217:        box->width = w;
                    218:        box->height = h;
                    219:     }
                    220:     return (1);
                    221: }
                    222: 
                    223: /*
                    224:  *
                    225:  * Calculate preferred size, given constraining box
                    226:  *
                    227:  */
                    228: 
                    229: static int PreferredSize(data, width, height, box)
                    230: WidgetData     data;
                    231: Dimension      width, height;
                    232: WindowBox      *box;           /* RETURN */
                    233: {
                    234:     return DoLayout(data, width, height, box, FALSE);
                    235: }
                    236: 
                    237: /*
                    238:  *
                    239:  * Compute the layout of the button box
                    240:  *
                    241:  */
                    242: 
                    243: static void Layout(data)
                    244: WidgetData     data;
                    245: {
                    246:     (void) DoLayout(data, data->width, data->height, (WindowBox *)NULL, TRUE);
                    247: }
                    248: 
                    249: /*
                    250:  *
                    251:  * Main buttonbox event handler
                    252:  *
                    253:  */
                    254: 
                    255: static XtEventReturnCode EventHandler(event, eventdata)
                    256: XEvent *event;
                    257: caddr_t eventdata;
                    258: {
                    259:     WidgetData data = (WidgetData) eventdata;
                    260:     void Destroy();
                    261: 
                    262:     switch (event->type) {
                    263:        case ConfigureNotify: {
                    264:            data->x = event->xconfigure.x;
                    265:            data->y = event->xconfigure.y;
                    266:            data->borderWidth = event->xconfigure.border_width;
                    267:             if (data->allowresize) {
                    268:                if (data->height != event->xconfigure.height ||
                    269:                      data->width != event->xconfigure.width) {
                    270:                    data->height = event->xconfigure.height;
                    271:                    data->width = event->xconfigure.width;
                    272:                    (void) TryLayout(data, data->width, MAXHEIGHT);
                    273:                    Layout(data);
                    274:                }
                    275:            }
                    276:            break;
                    277:        }
                    278: 
                    279:         case DestroyNotify: Destroy(data); break;
                    280:     }
                    281: 
                    282:     return (XteventHandled);
                    283: }
                    284: 
                    285: 
                    286: /*
                    287:  *
                    288:  * Handle events on subwidgets
                    289:  *
                    290:  */
                    291: 
                    292: static XtEventReturnCode SubEventHandler(event, eventdata)
                    293: XEvent *event;
                    294: caddr_t eventdata;
                    295: {
                    296:     WidgetData data = (WidgetData) eventdata;
                    297:     int i;
                    298:     if (event->type == DestroyNotify) {
                    299:        for (i=0 ; i<data->numbuttons; i++)
                    300:            if (data->buttons[i].w == event->xany.window) {
                    301:                DeleteButton(data, i);
                    302:                (void) TryNewLayout(data);
                    303:                Layout(data);
                    304:                break;
                    305:            }
                    306:     }
                    307: }
                    308: 
                    309: /*
                    310:  *
                    311:  * Destroy the buttonbox
                    312:  *
                    313:  */
                    314: 
                    315: static void Destroy(data)
                    316: WidgetData     data;
                    317: {
                    318:     int        i;
                    319:     /* send destroy messages to all my subwindows */
                    320:     for (i=0; i < data->numbuttons; i++)
                    321:        (void) XtSendDestroyNotify(data->dpy, data->buttons[i].w);
                    322:     XtFree((char *) data->buttons);
                    323: 
                    324:     XtClearEventHandlers(data->dpy, data->w);
                    325:     (void) XDeleteContext(data->dpy, data->w, widgetContext);
                    326:     XtFree ((char *) data);
                    327: }
                    328: 
                    329: /*
                    330:  *
                    331:  * Find Button
                    332:  *
                    333:  */
                    334: 
                    335: static WindowLugPtr FindButton(data, w)
                    336:     WidgetData data;
                    337:     Window     w;
                    338: {
                    339:     int        i;
                    340: 
                    341:     for (i=0; i<data->numbuttons; i++)
                    342:        if (data->buttons[i].w == w) return &(data->buttons[i]);
                    343: 
                    344:     return NULL;
                    345: }
                    346: 
                    347: /*
                    348:  *
                    349:  * Try to do a new layout within a particular width and height
                    350:  *
                    351:  */
                    352: 
                    353: static int TryLayout(data, width, height)
                    354: WidgetData     data;
                    355: Dimension      width, height;
                    356: {
                    357:     WindowBox  box, rbox;
                    358: 
                    359:     if (!PreferredSize(data, width, height, &box)) return (0);
                    360: 
                    361:     /* let's see if our parent will go for it. */
                    362:     switch (XtMakeGeometryRequest(
                    363:        data->dpy, data->w, XtgeometryResize, &box, &rbox)) {
                    364: 
                    365:        case XtgeometryNoManager:
                    366:            XResizeWindow(data->dpy, data->w, box.width, box.height);
                    367:            /* fall through to "yes" */
                    368: 
                    369:        case XtgeometryYes:
                    370:            data->width = box.width;
                    371:            data->height = box.height;
                    372:            return (1);
                    373: 
                    374: 
                    375:        case XtgeometryNo:
                    376:            return (0);
                    377: 
                    378: 
                    379:        case XtgeometryAlmost:
                    380:            if (! PreferredSize(data, rbox.width, rbox.height,
                    381:                                (WindowBox *) NULL))
                    382:                return (0);
                    383:            box = rbox;
                    384:            (void) XtMakeGeometryRequest(data->dpy, data->w, XtgeometryResize, &box, &rbox);
                    385:            data->width = box.width;
                    386:            data->height = box.height;
                    387:            return (1);
                    388: 
                    389:     }
                    390:     return (0);
                    391: }
                    392: 
                    393: /*
                    394:  *
                    395:  * Try to do a new layout
                    396:  *
                    397:  */
                    398: 
                    399: static int TryNewLayout(data)
                    400: WidgetData     data;
                    401: {
                    402:     if (TryLayout(data, data->width, data->height)) return (1);
                    403:     if (TryLayout(data, data->width, MAXHEIGHT)) return (1);
                    404:     if (TryLayout(data, MAXWIDTH, MAXHEIGHT)) return(1);
                    405:     return (0);
                    406: }
                    407: 
                    408: /*
                    409:  *
                    410:  * Button Resize Request
                    411:  *
                    412:  */
                    413: 
                    414: /*ARGSUSED*/
                    415: static XtGeometryReturnCode ResizeButtonRequest(data, w, reqBox, replBox)
                    416: WidgetData     data;
                    417: Window         w;
                    418: WindowBox      *reqBox;
                    419: WindowBox      *replBox;       /* RETURN */
                    420: 
                    421: {
                    422:     WindowLugPtr       b;
                    423:     WindowLug          oldb;
                    424: 
                    425:     b = FindButton(data, w);
                    426:     if (b == NULL) return (XtgeometryNo);
                    427:     oldb = *b;
                    428:     b->wb = *reqBox;
                    429:     b->wb.borderWidth = oldb.wb.borderWidth;
                    430:  /* HACK -- maybe we need a "change borderWidth" command? */
                    431: 
                    432:     if ((reqBox->width <= oldb.wb.width && reqBox->height <= oldb.wb.height) ||
                    433:                                /* making the button smaller always works */
                    434:        (PreferredSize(data, data->width, data->height, (WindowBox *) NULL)) ||
                    435:                                /* will it fit inside old dims? */
                    436:        (TryNewLayout(data)))
                    437:                                /* can we make it fit at all? */
                    438:     {
                    439:        XResizeWindow(data->dpy, b->w, b->wb.width, b->wb.height);
                    440:        (void) XtSendConfigureNotify(data->dpy, b->w, &(b->wb));
                    441:        Layout(data);
                    442:        return XtgeometryYes;
                    443:     }
                    444:     *b = oldb;
                    445:     return (XtgeometryNo);
                    446: }
                    447: 
                    448: /*
                    449:  *
                    450:  * Button Box Geometry Manager
                    451:  *
                    452:  */
                    453: 
                    454: static XtGeometryReturnCode ButtonBoxGeometryManager(
                    455:        dpy, w, req, reqBox, replBox)
                    456:     Display            *dpy;
                    457:     Window             w;
                    458:     XtGeometryRequest  req;
                    459:     WindowBox          *reqBox;
                    460:     WindowBox          *replBox;       /* RETURN */
                    461: {
                    462:     WidgetData data;
                    463: 
                    464:     if (XFindContext(dpy, w, widgetContext, (caddr_t *)&data) == XCNOENT)
                    465:        return (XtgeometryYes);
                    466:     /* requests: move, resize, top, bottom */
                    467:     switch (req) {
                    468:     case XtgeometryTop    : return (XtgeometryYes);
                    469:     case XtgeometryBottom : return (XtgeometryYes);
                    470:     case XtgeometryMove   : return (XtgeometryNo);
                    471:     case XtgeometryResize :
                    472:         return (ResizeButtonRequest(data, w, reqBox, replBox));
                    473:     }
                    474:     return (XtgeometryNo);
                    475: }
                    476: 
                    477: static XtStatus AddButton(data, w, index)
                    478: WidgetData data;
                    479: Window w;
                    480: int    index;
                    481: {
                    482:     int                i;
                    483:     WindowLug  b;
                    484: 
                    485:     b.w = w;
                    486:     if (XtGetWindowSize(data->dpy, w, &b.wb.width, &b.wb.height,
                    487:                        &b.wb.borderWidth))
                    488:        return (0);
                    489:     
                    490:     if (FindButton(data, b.w) != NULL) return (0);
                    491: 
                    492:     data->numbuttons++;
                    493:     if (data->numbuttons == 1) {
                    494:        data->buttons = (WindowLugPtr) XtCalloc(1, sizeof(WindowLug));
                    495:     } else {
                    496:        data->buttons = (WindowLugPtr) XtRealloc(
                    497:            (char *)data->buttons,
                    498:            (unsigned) data->numbuttons*sizeof(WindowLug));
                    499:     }
                    500: 
                    501:     for (i=data->numbuttons-1; i > index; i--)
                    502:        data->buttons[i] = data->buttons[i-1];
                    503: 
                    504:     b.wb.x = b.wb.y = -99;
                    505:     data->buttons[index] = b;
                    506:     (void) XSaveContext(data->dpy, b.w, widgetContext, (caddr_t)data);
                    507:     (void) XtSetGeometryHandler(
                    508:        data->dpy, b.w, (XtGeometryHandler) ButtonBoxGeometryManager);
                    509:     XtSetEventHandler(data->dpy, b.w, SubEventHandler, StructureNotifyMask,
                    510:                      (caddr_t)data);
                    511: 
                    512:     return(1);
                    513: }
                    514: 
                    515: static DeleteButton(data, index)
                    516:     WidgetData data;
                    517:     int                index;
                    518: {
                    519:     (void) XDeleteContext(data->dpy, data->buttons[index].w, widgetContext);
                    520:     (void) XtClearGeometryHandler(data->dpy, data->buttons[index].w);
                    521:     XtDeleteEventHandler(data->dpy, data->buttons[index].w, SubEventHandler);
                    522: 
                    523:     for (index++; index<data->numbuttons; index++)
                    524:        data->buttons[index-1] = data->buttons[index];
                    525: 
                    526:     data->numbuttons--;
                    527:     data->buttons = (WindowLugPtr) XtRealloc(
                    528:         (char *)data->buttons,
                    529:        (unsigned) data->numbuttons*sizeof(WindowLug));
                    530: }
                    531: 
                    532: /****************************************************************
                    533:  *
                    534:  * Public Routines
                    535:  *
                    536:  ****************************************************************/
                    537: 
                    538: Window XtButtonBoxCreate(dpy, parent, args, argCount)
                    539:     Display  *dpy;
                    540:     Window   parent;
                    541:     ArgList  args;
                    542:     int      argCount;
                    543: {
                    544:     WidgetData data;
                    545:     XrmNameList        names;
                    546:     XrmClassList classes;
                    547:     unsigned long valuemask;
                    548:     XSetWindowAttributes wvals;
                    549:     Boolean found;
                    550: 
                    551:     if (!initialized) ButtonBoxInitialize();
                    552: 
                    553:     data = (WidgetData) XtMalloc(sizeof(WidgetDataRec));
                    554: 
                    555:     globaldata = globalinit;
                    556:     globaldata.dpy = dpy;
                    557:     XtGetResources(dpy, resources, XtNumber(resources), args, argCount, parent,
                    558:        "buttonBox", "ButtonBox", &names, &classes);
                    559:     *data = globaldata;
                    560:     if (data->width == 0)
                    561:         data->width = ((data->hspace != 0) ? data->hspace : 10);
                    562:     if (data->height == 0)
                    563:        data->height = ((data->vspace != 0) ? data->vspace : 10);
                    564: 
                    565:     wvals.background_pixel = data->bgpixel;
                    566:     wvals.border_pixel = data->borderpixel;
                    567:     wvals.bit_gravity = NorthWestGravity;
                    568:     valuemask = CWBackPixel | CWBorderPixel | CWBitGravity;
                    569:     
                    570:     if (data->w != NULL) {
                    571:        Drawable root;
                    572:        Position x, y;
                    573:        unsigned int depth;
                    574: 
                    575:         /* set global data from window parameters */
                    576:         if (!XGetGeometry(data->dpy, data->w, &root, &x, &y,
                    577:                          &(data->width), &(data->height),
                    578:                          &(data->borderWidth), &depth)) {
                    579:             data->w = NULL;
                    580:         } else {
                    581:             /* set window according to args */
                    582:            XChangeWindowAttributes(data->dpy, data->w, valuemask, &wvals);
                    583:        }
                    584:     }
                    585:     if (data->w == NULL) {
                    586:        data->w = XCreateWindow(data->dpy, parent, data->x, data->y,
                    587:                                data->width, data->height, data->borderWidth,
                    588:                                0, InputOutput, (Visual *)CopyFromParent,
                    589:                                valuemask, &wvals);
                    590:     }
                    591: 
                    592:     XtSetNameAndClass(data->dpy, data->w, names, classes);
                    593:     XrmFreeNameList(names);
                    594:     XrmFreeClassList(classes);
                    595: 
                    596:     /* set handler for message and destroy events */
                    597:     XtSetEventHandler(dpy, 
                    598:        data->w, (XtEventHandler)EventHandler, StructureNotifyMask,
                    599:        (caddr_t) data);
                    600: 
                    601:     (void) XSaveContext(data->dpy, data->w, widgetContext, (caddr_t)data);
                    602: 
                    603:     /* batch add initial buttons */
                    604:     if (argCount) {
                    605:        found = FALSE;
                    606:        for ( ; --argCount >= 0; args++) {
                    607:            if (XrmAtomsEqual(args->name, XtNbutton)) {
                    608:                (void) AddButton(
                    609:                        data, (Window)args->value, data->numbuttons);
                    610:                found = TRUE;
                    611:            }
                    612:        }
                    613:        if (found) {
                    614:            (void) TryNewLayout(data);
                    615:            Layout(data);
                    616:            XMapSubwindows(data->dpy, data->w);
                    617:        }
                    618:     }
                    619: 
                    620:     return (data->w);
                    621: }
                    622: 
                    623: XtStatus XtButtonBoxAddButton(dpy, parent, args, argCount)
                    624:     Display  *dpy;
                    625:     Window   parent;
                    626:     ArgList  args;
                    627:     int      argCount;
                    628: {
                    629:     WidgetData data;
                    630: 
                    631:     (void) XFindContext(dpy, parent, widgetContext, (caddr_t *)&data);
                    632:     index = -1;
                    633:     XtSetValues(parmResources, XtNumber(parmResources), args, argCount);
                    634:     if ((index < -1) || (index > data->numbuttons)) return (0);
                    635: 
                    636:     /* batch add buttons */
                    637:     if (argCount) {
                    638:        for ( ; --argCount >= 0; args++) {
                    639:            if (XrmAtomsEqual(args->name, XtNwindow)) {
                    640:                (void) AddButton(
                    641:                        data,
                    642:                        (Window)args->value,
                    643:                        ((index < 0) ? data->numbuttons : index));
                    644:                if (index >= 0) index++;
                    645:            }
                    646:        }
                    647:        (void) TryNewLayout(data);
                    648:        Layout(data);
                    649:        XMapSubwindows(data->dpy, data->w);
                    650:     }
                    651: /*
                    652:     if (!AddButton(data, parms.w, index)) return(0);
                    653: 
                    654:     if (!TryNewLayout(data)) return(0);
                    655:     Layout(data);
                    656: */
                    657:     return (1);
                    658: }
                    659: 
                    660: XtStatus XtButtonBoxDeleteButton(dpy, parent, args, argCount)
                    661:     Display  *dpy;
                    662:     Window   parent;
                    663:     ArgList  args;
                    664:     int      argCount;
                    665: {
                    666:     WidgetData data;
                    667:     Boolean    foundOne = FALSE;
                    668:     int                i;
                    669: 
                    670:     (void) XFindContext(dpy, parent, widgetContext, (caddr_t *) &data);
                    671: 
                    672:     index = -1;
                    673:     XtSetValues(parmResources, XtNumber(parmResources), args, argCount);
                    674:     if ((index < -1) || (index >= data->numbuttons)) return(0);
                    675: 
                    676:     if (index >= 0) {
                    677:        DeleteButton(data, index);
                    678:        foundOne = TRUE;
                    679:     } else if (argCount) {
                    680:        for ( ; --argCount >= 0; args++) {
                    681:            if (XrmAtomsEqual(args->name, XtNwindow)) {
                    682:                for (i=0; i<data->numbuttons; i++) {
                    683:                    if (data->buttons[i].w == (Window)args->value) {
                    684:                        DeleteButton(data, i);
                    685:                        foundOne = TRUE;
                    686:                        break;
                    687:                    }
                    688:                }
                    689:            }
                    690:        }
                    691:     }
                    692: 
                    693:     if (! foundOne) return(0);
                    694: 
                    695:     (void) TryNewLayout(data); /* We may want to SHRINK things! */
                    696:     Layout(data);
                    697:     return (1);
                    698: }
                    699: 
                    700: /*
                    701:  *
                    702:  * Get Attributes
                    703:  *
                    704:  */
                    705: 
                    706: void XtButtonBoxGetValues (dpy, window, args, argCount)
                    707: Display *dpy;
                    708: Window window;
                    709: ArgList args;
                    710: int argCount;
                    711: {
                    712:     WidgetData  data;
                    713:     data = DataFromWindow(dpy, window);
                    714:     if (data == NULL) return;
                    715:     globaldata = *data;
                    716:     XtGetValues(resources, XtNumber(resources), args, argCount);
                    717: }
                    718: 
                    719: /*
                    720:  *
                    721:  * Set Attributes
                    722:  *
                    723:  */
                    724: 
                    725: void XtButtonBoxSetValues (dpy, window, args, argCount)
                    726: Display *dpy;
                    727: Window window;
                    728: ArgList args;
                    729: int argCount;
                    730: {
                    731:     WidgetData  data;
                    732:     data = DataFromWindow(dpy, window);
                    733:     if (data == NULL) return;
                    734:     globaldata = *data;
                    735:     XtSetValues(resources, XtNumber(resources), args, argCount);
                    736:     *data = globaldata;
                    737: }
                    738: 

unix.superglobalmegacorp.com

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