Annotation of researchv9/X11/src/X.V11R1/lib/Xtk/VPane.c, revision 1.1

1.1     ! root        1: #ifndef lint
        !             2: static char rcsid[] = "$Header: VPane.c,v 1.7 87/09/13 13:31:15 swick 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: /*
        !            28:  * VPane.c - VPane composite Widget (Converted to classing toolkit)
        !            29:  *
        !            30:  * Author:   Jeanne M. Rich (Original Terry Weissman)
        !            31:  *           Digital Equipment Corporation
        !            32:  *           Western Research Laboratory
        !            33:  * Date:     Friday, Aug 28 1987
        !            34:  *
        !            35:  */
        !            36: 
        !            37: #include "Xlib.h"
        !            38: #include "cursorfont.h"
        !            39: #include "Intrinsic.h"
        !            40: #include "VPaneP.h"
        !            41: #include "VPane.h"
        !            42: #include "Knob.h"
        !            43: #include "Atoms.h"
        !            44: 
        !            45: #define offset(field) XtOffset(VPaneWidget,v_pane.field)
        !            46: #define suboffset(field) XtOffset(SubWidgetPtr,field)
        !            47: 
        !            48: /**********************************************************************************
        !            49:  *
        !            50:  * Full instance record declaration
        !            51:  *
        !            52:  *********************************************************************************/
        !            53: 
        !            54: static XtResource resources[] = {
        !            55:     {XtNforeground, XtCColor, XrmRPixel, sizeof(Pixel),
        !            56:          offset(foreground_pixel), XrmRString, "Black"},
        !            57:     {XtNknobWidth, XtCWidth, XrmRInt, sizeof(int),
        !            58:          offset(knob_width), XrmRString, "9"},
        !            59:     {XtNknobHeight, XtCHeight, XrmRInt, sizeof(int),
        !            60:         offset(knob_height), XrmRString, "9"},
        !            61:     {XtNknobIndent, XtCKnobIndent, XrmRInt, sizeof(int),
        !            62:         offset(knob_indent), XrmRString, "16"},
        !            63:     {XtNknobPixel, XtCKnobPixel, XrmRPixel, sizeof(int),
        !            64:         offset(knob_pixel), XrmRString, "Black"},
        !            65:     {XtNrefigureMode, XtCRefigureMode, XrmRBoolean, sizeof(int),
        !            66:          offset(refiguremode), XrmRString, "On"}
        !            67: };
        !            68: 
        !            69: static XtResource subresources[] = {
        !            70:     {XtNposition, XtCPosition, XrmRInt, sizeof(int),
        !            71:          suboffset(position), XrmRString, "0"},
        !            72:     {XtNmin, XtCMin, XrmRInt, sizeof(int),
        !            73:          suboffset(min), XrmRString, "0"},
        !            74:     {XtNmax, XtCMax, XrmRInt, sizeof(int),
        !            75:          suboffset(max), XrmRString, "1000"},
        !            76:     {XtNautoChange, XtCAutoChange, XrmRBoolean, sizeof(int),
        !            77:          suboffset(autochange), XrmRString, "On"}
        !            78: };
        !            79: 
        !            80: static void Initialize();
        !            81: static void Realize();
        !            82: static void Destroy();
        !            83: static void Resize();
        !            84: static void SetValues();
        !            85: static XtGeometryResult GeometryManager();
        !            86: static void ChangeManaged();
        !            87: static void InsertChild();
        !            88: static void DeleteChild();
        !            89: 
        !            90: VPaneClassRec vPaneClassRec = {
        !            91:    {
        !            92: /* core class fields */
        !            93:     /* superclass         */   (WidgetClass) &constraintClassRec,
        !            94:     /* class name         */   "VPane",
        !            95:     /* size               */   sizeof(VPaneRec),
        !            96:     /* class initialize   */   NULL,
        !            97:     /* class_inited       */   FALSE,
        !            98:     /* initialize         */   Initialize,
        !            99:     /* realize            */   Realize,
        !           100:     /* actions            */   NULL,
        !           101:     /* num_actions        */   0,
        !           102:     /* resourses          */   resources,
        !           103:     /* resource_count     */   XtNumber(resources),
        !           104:     /* xrm_class          */   NULLQUARK,
        !           105:     /* compress_motion    */   TRUE,
        !           106:     /* compress_exposure  */   TRUE,
        !           107:     /* visible_interest   */   FALSE,
        !           108:     /* destroy            */   Destroy,
        !           109:     /* resize             */   Resize,
        !           110:     /* expose             */   NULL,
        !           111:     /* set_values         */   SetValues,
        !           112:     /* accept_focus       */   NULL
        !           113:    }, {
        !           114: /* composite class fields */
        !           115:     /* geometry_manager   */   GeometryManager,
        !           116:     /* change_managed     */   ChangeManaged,
        !           117:     /* insert_child       */   InsertChild,
        !           118:     /* delete_child       */   DeleteChild,
        !           119:     /* move_focus_to_next */   NULL,
        !           120:     /* move_focus_to_prev */   NULL
        !           121:    }, {
        !           122: /* constraint class fields */
        !           123:     /* subresourses       */   subresources,
        !           124:                               /* subresource_count  */   XtNumber(subresources)
        !           125:    }, {
        !           126:     /* mumble             */   0  /* make C compiler happy */
        !           127:    }
        !           128: };
        !           129: 
        !           130: static int CursorNums[4] = {0,
        !           131:                            XC_sb_up_arrow,
        !           132:                            XC_sb_v_double_arrow,
        !           133:                            XC_sb_down_arrow};
        !           134: 
        !           135: static Boolean NeedsAdjusting(vpw)
        !           136: VPaneWidget vpw;
        !           137: {
        !           138: 
        !           139:    int needed, i;
        !           140: 
        !           141:    for (i = 0; i < (vpw->composite.num_children/2); i++) {
        !           142:       if (vpw->composite.children[i * 2]->core.managed)
        !           143:          needed += sublist[i].dheight + BORDERWIDTH;
        !           144:    }
        !           145:    needed -= BORDERWIDTH;
        !           146:    if (needed > vpw->composite.children[i * 2]->core.height)
        !           147:       return(TRUE);
        !           148:    else return(FALSE);
        !           149: 
        !           150: }
        !           151: 
        !           152: static void AdjustVPaneHeight(vpw, newheight)
        !           153:   VPaneWidget vpw;
        !           154:   Dimension newheight;
        !           155: {
        !           156:     XtWidgetGeometry request, reply;
        !           157:     XtGeometryResult result;
        !           158:     if (newheight < 1) newheight = 1;
        !           159:     request.height = newheight;
        !           160:     request.request_mode = CWHeight;
        !           161:     result = XtMakeGeometryRequest(vpw, &request, &reply);
        !           162:     if (result == XtGeometryAlmost) {
        !           163:        request = reply;
        !           164:        result = XtMakeGeometryRequest(vpw, &request, &reply);
        !           165:     }
        !           166:     if (result == XtGeometryYes) {
        !           167:        vpw->core.height = reply.height;
        !           168:     }
        !           169: }
        !           170: 
        !           171: 
        !           172: static RefigureLocations(vpw, position, dir)
        !           173:   VPaneWidget vpw;
        !           174:   int position;
        !           175:   int dir;             /* -1 = up, 1 = down, 0 = this border only */
        !           176: {
        !           177:     SubWidgetPtr sub, firstsub;
        !           178:     WidgetList children;
        !           179:     int     i, old, y, cdir, num_children, child, firstchild;
        !           180: 
        !           181:     if (vpw->composite.num_mapped_children == 0 || !vpw->v_pane.refiguremode)
        !           182:        return;
        !           183: 
        !           184:     children = vpw->composite.children;
        !           185:     num_children = vpw->composite.num_children / 2;
        !           186:     do {
        !           187:        vpw->v_pane.heightused = 0;
        !           188:        for (i = 0, sub = vpw->v_pane.sublist; i < num_children; i++, sub++) {
        !           189:             if (children[i * 2]->core.managed) {
        !           190:                if (sub->dheight < sub->min)
        !           191:                    sub->dheight = sub->min;
        !           192:                if (sub->dheight > sub->max)
        !           193:                    sub->dheight = sub->max;
        !           194:                vpw->v_pane.heightused += sub->dheight + BORDERWIDTH;
        !           195:             }
        !           196:        }
        !           197:         vpw->v_pane.heightused -= BORDERWIDTH;
        !           198:        if (dir == 0 && vpw->v_pane.heightused != vpw->core.height) {
        !           199:            for (i = 0, sub = vpw->v_pane.sublist; i < num_children; i++, sub++) {
        !           200:                 if (children[i * 2]->core.managed) {
        !           201:                    if (sub->dheight != children[i * 2]->core.height)
        !           202:                        sub->dheight += vpw->core.height - vpw->v_pane.heightused;
        !           203:                 }
        !           204:             }
        !           205:        }
        !           206:     } while (dir == 0 && vpw->v_pane.heightused != vpw->core.height);
        !           207: 
        !           208:     firstsub = vpw->v_pane.sublist + position;
        !           209:     firstchild = position * 2;
        !           210:     sub = firstsub;
        !           211:     child = firstchild;
        !           212:     cdir = dir;
        !           213:     while (vpw->v_pane.heightused != vpw->core.height) {
        !           214:         if (children[child]->core.managed) {
        !           215:            if (sub->autochange || cdir != dir) {
        !           216:                old = sub->dheight;
        !           217:                sub->dheight = vpw->core.height - vpw->v_pane.heightused + old;
        !           218:                if (sub->dheight < sub->min)
        !           219:                    sub->dheight = sub->min;
        !           220:                if (sub->dheight > sub->max)
        !           221:                    sub->dheight = sub->max;
        !           222:                vpw->v_pane.heightused += (sub->dheight - old);
        !           223:            }
        !           224:            sub += cdir;
        !           225:             child += (cdir * 2);
        !           226:            while (sub < vpw->v_pane.sublist ||
        !           227:                   sub - vpw->v_pane.sublist == num_children) {
        !           228:                cdir = -cdir;
        !           229:                if (cdir == dir) goto triplebreak;
        !           230:                sub = firstsub + cdir;
        !           231:                 child = firstchild + (cdir * 2);
        !           232:            }
        !           233:         }
        !           234:     }
        !           235: triplebreak:
        !           236:     y = -BORDERWIDTH;
        !           237:     for (i = 0, sub = vpw->v_pane.sublist; i < num_children; i++, sub++) {
        !           238:         if (child[i * 2]->core.managed) {
        !           239:           sub->dy = y;
        !           240:           y += sub->dheight + BORDERWIDTH;
        !           241:         }
        !           242:     }
        !           243: }
        !           244: 
        !           245: 
        !           246: static CommitNewLocations(vpw)
        !           247: VPaneWidget vpw;
        !           248: {
        !           249:     int i, kx, ky, num_children;
        !           250:     WidgetList children;
        !           251:     KnobWidget lastknob;
        !           252:     SubWidgetPtr sub;
        !           253: 
        !           254:     num_children = vpw->composite.num_children / 2;
        !           255:     children = vpw->composite.children
        !           256:     lastknob = NULL:
        !           257: 
        !           258:     /* First unmap all the knobs that are not managed */
        !           259:     for (i = 0; i < vpw_composite.num_children; i+2)
        !           260:        if (children[i]->core.managed == FALSE) {
        !           261:           if (children[i + 1]->core.managed == TRUE) {
        !           262:              XtUnmapWidget(children[i + 1]);
        !           263:              children[i + 1]->core.managed = FALSE;
        !           264:           }
        !           265:        }
        !           266:     }
        !           267: 
        !           268:     for (i = 0, sub = vpw->v_pane.sublist; i < num_children; i++, sub++) {
        !           269:         if (children[i * 2]->core.managed) {
        !           270: 
        !           271:             /* see if the widget needs to be moved */
        !           272:             if (sub->dy != children[i * 2]->core.y) 
        !           273:                 XtMoveWidget(children[i * 2], sub->dy, -BORDERWIDTH);
        !           274:  
        !           275:             /* see if the widget needs to be resized */
        !           276:             if ((sub->dheight != children[i * 2]->core.height) ||
        !           277:                 (children[i * 2]->core.width != vpw->core.width) ||
        !           278:                 (children[i * 2]->core.borderwidth != BORDERWIDTH)) 
        !           279:                 XtResizeWidget(children[i * 2], vpw->core.height, sub->dheight,
        !           280:                         BORDERWIDTH);
        !           281: 
        !           282:             /* Move and Display the Knob */
        !           283:            kx = vpw->core.width - vpw->v_pane.knobindent;
        !           284:            ky = children[i * 2]->core.y +  children[i * 2]->core.height -
        !           285:                   (vpw->v_pane.knobheight/2)+1;
        !           286:             XtMoveWidget(sub->knob, kx, ky);
        !           287:             if (sub->knob->core.managed == FALSE) {
        !           288:                 XtMapWidget(sub->knob);
        !           289:                 sub->knob->core.managed = TRUE;
        !           290:             }
        !           291:             XRaiseWindow(XtDisplay(sub->knob), XtWindow(sub->knob));
        !           292:             lastknob = sub->knob;
        !           293:             
        !           294:        }
        !           295:     }
        !           296: 
        !           297:     if (lastknob != NULL) {
        !           298:         XtUnMapWidget(lastknob);
        !           299:         lastknob->core.managed = FALSE;
        !           300:     }
        !           301: }
        !           302: 
        !           303: 
        !           304: static RefigureLocationsAndCommit(vpw, position, dir)
        !           305:   VPaneWidget data;
        !           306:   int position, dir;
        !           307: {
        !           308:     RefigureLocations(vpw, position, dir);
        !           309:     CommitNewLocations(vpw);
        !           310: }
        !           311: 
        !           312: 
        !           313: EraseInternalBorders(data)
        !           314:   WidgetData data;
        !           315: {
        !           316:     int     i;
        !           317:     for (i = 1; i < data->numsubwindows; i++)
        !           318:        XFillRectangle(data->dpy, data->window, data->invgc,
        !           319:                       0, data->sub[i].y, data->width, BORDERWIDTH);
        !           320: }
        !           321: /*
        !           322: 
        !           323: DrawInternalBorders(data)
        !           324:   WidgetData data;
        !           325: {
        !           326:     int     i;
        !           327:     for (i = 1; i < data->numsubwindows; i++)
        !           328:        XFillRectangle(data->dpy, data->window, data->normgc,
        !           329:                       0, data->sub[i].y, data->width, BORDERWIDTH);
        !           330: }
        !           331: 
        !           332: 
        !           333: static DrawTrackLines(data)
        !           334:   WidgetData data;
        !           335: {
        !           336:     int     i;
        !           337:     SubWindowPtr sub;
        !           338:     for (i = 1, sub = data->sub + 1; i < data->numsubwindows; i++, sub++) {
        !           339:        if (sub->olddy != sub->dy) {
        !           340:            XDrawLine(data->dpy, data->window, data->flipgc,
        !           341:                  0, sub->olddy, (Position) data->width, sub->olddy);
        !           342:            XDrawLine(data->dpy, data->window, data->flipgc,
        !           343:                  0, sub->dy, (Position) data->width, sub->dy);
        !           344:            sub->olddy = sub->dy;
        !           345:        }
        !           346:     }
        !           347: }
        !           348: 
        !           349: static EraseTrackLines(data)
        !           350:   WidgetData data;
        !           351: {
        !           352:     int     i;
        !           353:     SubWindowPtr sub;
        !           354:     for (i = 1, sub = data->sub + 1; i < data->numsubwindows; i++, sub++)
        !           355:        XDrawLine(data->dpy, data->window, data->flipgc,
        !           356:              0, sub->olddy, (Position) data->width, sub->olddy);
        !           357: }
        !           358: 
        !           359: static XtEventReturnCode HandleKnob(event)
        !           360:   XEvent *event;
        !           361: {
        !           362:     WidgetData data;
        !           363:     int     position, diff, y, i;
        !           364: 
        !           365:     data = DataFromWindow(event->xbutton.display, event->xbutton.window);
        !           366:     if (!data) return XteventNotHandled;
        !           367:     switch (event->type) {
        !           368:        case ButtonPress: 
        !           369:            y = event->xbutton.y;
        !           370:            if (data->whichtracking != -1)
        !           371:                return XteventNotHandled;
        !           372:            for (position = 0; position < data->numsubwindows; position++)
        !           373:                if (data->sub[position].knob == event->xbutton.window)
        !           374:                    break;
        !           375:            if (position >= data->numsubwindows)
        !           376:                return XteventNotHandled;
        !           377:            
        !           378:            (void) XGrabPointer(data->dpy, event->xbutton.window, FALSE,
        !           379:                                (unsigned int)PointerMotionMask | ButtonReleaseMask,
        !           380:                                GrabModeAsync, GrabModeAsync, None,
        !           381:                                XtGetCursor(data->dpy,
        !           382:                                            CursorNums[event->xbutton.button]),
        !           383:                                CurrentTime);
        !           384:            data->whichadd = data->whichsub = NULL;
        !           385:            data->whichdirection = 2 - event->xbutton.button; * Hack! *
        !           386:            data->starty = y;
        !           387:            if (data->whichdirection >= 0) {
        !           388:                data->whichadd = data->sub + position;
        !           389:                while (data->whichadd->max == data->whichadd->min &&
        !           390:                        data->whichadd > data->sub)
        !           391:                    (data->whichadd)--;
        !           392:            }
        !           393:            if (data->whichdirection <= 0) {
        !           394:                data->whichsub = data->sub + position + 1;
        !           395:                while (data->whichsub->max == data->whichsub->min &&
        !           396:                        data->whichsub < data->sub + data->numsubwindows - 1)
        !           397:                    (data->whichsub)++;
        !           398:            }
        !           399:            data->whichtracking = position;
        !           400:            if (data->whichdirection == 1)
        !           401:                (data->whichtracking)++;
        !           402:            EraseInternalBorders(data);
        !           403:            for (i = 0; i < data->numsubwindows; i++)
        !           404:                data->sub[i].olddy = -99;
        !           405:        * Fall through *
        !           406: 
        !           407:        case MotionNotify: 
        !           408:        case ButtonRelease:
        !           409:            if (event->type == MotionNotify) y = event->xmotion.y;
        !           410:            else y = event->xbutton.y;
        !           411:            if (data->whichtracking == -1)
        !           412:                return XteventNotHandled;
        !           413:            for (i = 0; i < data->numsubwindows; i++)
        !           414:                data->sub[i].dheight = data->sub[i].height;
        !           415:            diff = y - data->starty;
        !           416:            if (data->whichadd)
        !           417:                data->whichadd->dheight = data->whichadd->height + diff;
        !           418:            if (data->whichsub)
        !           419:                data->whichsub->dheight = data->whichsub->height - diff;
        !           420:            RefigureLocations(data, data->whichtracking, data->whichdirection);
        !           421: 
        !           422:            if (event->type != ButtonRelease) {
        !           423:                DrawTrackLines(data); * Draw new borders *
        !           424:                return XteventHandled;
        !           425:            }
        !           426:            XUngrabPointer(data->dpy, CurrentTime);
        !           427:            EraseTrackLines(data);
        !           428:            CommitNewLocations(data);
        !           429:            DrawInternalBorders(data);
        !           430:            data->whichtracking = -1;
        !           431:            return XteventHandled;
        !           432:     }
        !           433:     return XteventNotHandled;
        !           434: }
        !           435: */
        !           436: 
        !           437: /* Semi-public routines. */
        !           438: 
        !           439: static XtGeometryReturnCode GeometryManager(w, request, reply)
        !           440: Widget w;
        !           441: WidgetGeometry *request, *reply;
        !           442: {
        !           443: 
        !           444:    return(XtgeometryNo);
        !           445: 
        !           446: }
        !           447: 
        !           448: static void Initialize(w)
        !           449: Widget w;
        !           450: {
        !           451: 
        !           452:     VPaneWidget vpw = (VPaneWidget) w;
        !           453:     unsigned long valuemask;
        !           454:     XGCValues values;
        !           455: 
        !           456:     values.foreground = vpw->v_pane.foreground_pixel;
        !           457:     values.function = GXcopy;
        !           458:     values.plane_mask = ~0;
        !           459:     values.fill_style = FillSolid;
        !           460:     values.fill_rule = EvenOddRule;
        !           461:     values.subwindow_mode = IncludeInferiors;
        !           462:     valuemask = GCForeground | GCFunction | GCPlaneMask | GCFillStyle
        !           463:        | GCFillRule | GCSubwindowMode;
        !           464:     vpw->v_pane.normgc = XtGetGC(vpw->core.display, vpw->core.window, valuemask,
        !           465:                                    &values);
        !           466:     values.foreground = vpw->core.background_pixel;
        !           467:     vpw->v_pane.invgc = XtGetGC(vpw->core.display, vpw->core.window, valuemask,
        !           468:                                   &values);
        !           469:     values.function = GXinvert;
        !           470: #if BORDERWIDTH == 1
        !           471:     values.line_width = 0;     /* Take advantage of fast server lines. */
        !           472: #else
        !           473:     values.line_width = BORDERWIDTH;
        !           474: #endif
        !           475:     values.line_style = LineSolid;
        !           476:     valuemask |= GCLineWidth | GCLineStyle;
        !           477:     vpw->v_pane.flipgc = XtGetGC(vpw->core.display, vpw->core.window, valuemask,
        !           478:                                  &values);
        !           479:     vpw->v_pane.heightused = 0;
        !           480:     vpw->v_pane.sublist = NULL;
        !           481:     vpw->v_pane.whichtracking = -1;
        !           482:     vpw->v_pane.refiguremode = TRUE;
        !           483: }
        !           484: 
        !           485: 
        !           486: static void Realize(w, valueMask, attributes)
        !           487: register Widget w;
        !           488: Mask valueMask;
        !           489: XSetWindowAttributes *attributes;
        !           490: 
        !           491: {
        !           492: 
        !           493:     attributes->bit_gravity = NorthWestGravity;
        !           494:     valueMask |= CWBitGravity;
        !           495: 
        !           496:     w->core.window = 
        !           497:           XCreateWindow(w->core.display, w->core.parent, w->core.x, w->core.y,
        !           498:                         w->core.width, w->core.height, w_core.border_width,
        !           499:                         0, InputOutput, (Visual *)CopyFromParent, valueMask,
        !           500:                         attributes);
        !           501: } /* Realize */
        !           502: 
        !           503: static void Destroy(vpw)
        !           504: register VPaneWidget vpw;
        !           505: {
        !           506: 
        !           507:    XtFree((char *) vpw->v_pane.sublist);
        !           508: 
        !           509: } /* Destroy */
        !           510: 
        !           511: 
        !           512: static void InsertChild(w, args, argcount)
        !           513: register Widget w;
        !           514: ArgList args;
        !           515: int argcount;
        !           516: {
        !           517: 
        !           518:    static Arg knobargs[] = {
        !           519:       {XtNwidth, (XtArgVal) 0},
        !           520:       {XtNheight, (XtArgVal) 0},
        !           521:       {XtNbackground, (XtArgVal) "Black"}
        !           522:    };
        !           523: 
        !           524:    Cardinal     position;
        !           525:    VPaneWidgetClass  myclass;
        !           526:    ConstraintWidgetClass superclass;
        !           527:    ConstraintWidget cw;
        !           528:    SubWidgetPtr sub;
        !           529:    int i;
        !           530: 
        !           531:    myclass = (VPaneWidgetClass) vPaneWidgetClass;
        !           532:    superclass = (ConstraintWidgetClass) myclass->core_class.superclass;
        !           533: 
        !           534:    /* insert the child widget in the composite children list with the */
        !           535:    /* superclass insert_child routine.                                */
        !           536:    superclass->composite_class.insert_child(w, args, argcount);
        !           537: 
        !           538:    if (!XtIsSubclass(w, KnobWidgetClass)) {
        !           539:       cw = w->core.parent;
        !           540: 
        !           541:       /* ||| Panes will be added in the order they are created, temporarilly */
        !           542:       /* they are also managed at creation time.                             */
        !           543: 
        !           544:       /* will normally get the position from the insert position routine */
        !           545:       position = cw->composite_widget.num_children / 2;
        !           546:       cw->v_pane.sublist =
        !           547:          (SubWidgetPtr) XtRealloc((caddr_t) cw->v_pane.sublist,
        !           548:          ((cw->composite_widget.num_children/2 + 1) * sizeof(SubWidgetInfo)));
        !           549: 
        !           550:       /* shift up pane info then position new pane info */
        !           551:       for (i = cw->composite_widget.num_children/2; i > position; i++)
        !           552:          cw->v_pane.sublist[i] = cw->v_pane.sublist[i - 1];
        !           553: 
        !           554:       /* set the desired height of the pane */
        !           555:       cw->v_pane.sublist[position].dheight = w->core.height;
        !           556: 
        !           557:       /* Get the subresources for this child widget */
        !           558:       sub = &(cw->v_pane.sublist[position]);
        !           559:       XtGetSubResources(cw, sub, w->core.name,
        !           560:          w->core.widget_class->core_class.class_name,
        !           561:          subresources, XtNumber(subresources), args, argcount);
        !           562: 
        !           563:       /* Create the Knob Widget */
        !           564:       knobargs[0].value = (XtArgVal) cw->v_pane.knob_width;
        !           565:       knobargs[1].value = (XtArgVal) cw->v_pane.knob_height;
        !           566:       knobargs[2].value = (XtArgVal) cw->v_pane.knob_pixel;
        !           567:       sub->knob = XtCreateWidget("Knob", KnobWidgetClass, (CompositeWidget) cw,
        !           568:               knobargs, XtNumber(knobargs));
        !           569: /*
        !           570:       XtSetEventHandler(sub->knob,
        !           571:           ButtonPressMask | ButtonReleaseMask | ButtonMotionMask, FALSE, HandleKnob,
        !           572:           (caddr_t) NULL);
        !           573: */
        !           574: 
        !           575:       XDefineCursor(XtDisplay(sub->knob), sub->knob,
        !           576:                     XtGetCursor(XtDisplay(sub->knob), XC_double_arrow));
        !           577: 
        !           578:    }
        !           579: 
        !           580: } /* InsertChild */
        !           581: 
        !           582: static void DeleteChild(w)
        !           583: Widget w;
        !           584: {
        !           585: 
        !           586:    Cardinal     position;
        !           587:    VPaneWidgetClass  myclass;
        !           588:    ConstraintWidgetClass superclass;
        !           589:    ConstraintWidget cw;
        !           590:    SubWidgetPtr sub;
        !           591: 
        !           592:    /* remove the subwidget info and destroy the knob */
        !           593:    if (!XtIsSubClass(w, KnobWidgetClass)) {
        !           594:       cw = w->core.parent;
        !           595: 
        !           596:       /* find out the postion of the widget */
        !           597:       for (position = 0; position < cw->composite.num_children; position++) {
        !           598:          if (cw->composite.children[position] == w)
        !           599:             break;
        !           600:       }
        !           601:       position = position/2;
        !           602: 
        !           603:       /* Destroy the knob */
        !           604:       XtDestroyWidget(cw->v_pane.sublist[position].knob);
        !           605: 
        !           606:       /* Ripple the subwidget info down, over the deleted pane */
        !           607:       for (i = position; i < cw->composite.num_children/2; i++)
        !           608:          cw->v_pane.sublist[i] = cw->v_pane.sublist[i + 1];
        !           609: 
        !           610:    } 
        !           611: 
        !           612:    myclass = (VPaneWidgetClass) vPaneWidgetClass;
        !           613:    superclass = (ConstraintWidgetClass) myclass->core_class.superclass;
        !           614: 
        !           615:    /* delete the child widget in the composite children list with the */
        !           616:    /* superclass delete_child routine.                                */
        !           617:    superclass->composite_class.delete_child(w);
        !           618: 
        !           619: } /* DeleteChild */
        !           620: 
        !           621: static void ChangeManaged(vpw)
        !           622: VPaneWidget vpw;
        !           623: {
        !           624: 
        !           625:    /* see if the height of the VPane needs to be adjusted to fit all the panes */
        !           626:    if (NeedsAdjusting(vpw))
        !           627:       AdjustVPaneHeight(vpw);
        !           628:    RefigureLocationsAndCommit(vpw, 0, 1);
        !           629: 
        !           630: } /* ChangeManaged */
        !           631: 
        !           632: static void Resize(vpw)
        !           633: VPaneWidget vpw;
        !           634: {
        !           635: 
        !           636:    RefigureLocationsAndCommit(vpw, 0, 1);
        !           637: 
        !           638: } /* Resize */
        !           639: 
        !           640: static void SetValues(oldvpw, newvpw)
        !           641: VPaneWidget oldvpw, newvpw;
        !           642: {
        !           643: } /* SetValues */
        !           644: 
        !           645: 
        !           646: /* Change the min and max size of the given sub window. */
        !           647: 
        !           648: void XtVPanedSetMinMax(vpw, paneWidget, min, max)
        !           649: VPaneWidget vpw;
        !           650: Widget paneWidget;
        !           651: int    min, max;
        !           652: {
        !           653: 
        !           654:     int i;
        !           655: 
        !           656:     for (i = 0; i < vpw->composite.num_children; i + 2) {
        !           657:        if (vpw->composite.children[i] == paneWidget) {
        !           658:            vpw->v_pane.sublist[i / 2].min = min;
        !           659:            vpw->v_pane.sublist[i / 2].max = max;
        !           660:            RefigureLocationsAndCommit(vpw, i/2, 1);
        !           661:            return;
        !           662:        }
        !           663:     }
        !           664: }
        !           665: 
        !           666: 
        !           667: /* Get the min and max size of the given sub window. */
        !           668: 
        !           669: void XtVPanedGetMinMax(vpw, paneWidget, min, max)
        !           670: VPaneWidget vpw;
        !           671: Widget paneWindow;
        !           672: int    *min, *max;
        !           673: {
        !           674: 
        !           675:     int i;
        !           676: 
        !           677:     for (i = 0; i < vpw->composite.num_children; i + 2) {
        !           678:        if (vpw->composite.children[i] == paneWidget) {
        !           679:            *min = vpw->v_pane.sublist[i / 2].min;
        !           680:            *max = vpw->v_pane.sublist[i / 2].max;
        !           681:            return;
        !           682:        }
        !           683:     }
        !           684: }
        !           685: 
        !           686: int XtVPanedGetNumSub(vpw)
        !           687: VPaneWidget vpw;
        !           688: {
        !           689: 
        !           690:    int i, num_sub_widgets;
        !           691: 
        !           692:    num_sub_widgets = 0;
        !           693: 
        !           694:    for (i = 0; i < vpw->composite.num_children; i + 2) {
        !           695:       if (vpw->composite.children[i]->core.managed)
        !           696:           num_sub_widgets++;
        !           697:    }
        !           698: 
        !           699:    return(num_sub_widgets);
        !           700: }
        !           701: 
        !           702: 
        !           703: 
        !           704: 
        !           705: void XtVPanedRefigureMode(vpw, mode)
        !           706:   VPaneWidget vpw;
        !           707:   Boolean  mode;
        !           708: {
        !           709:     vpw->v_pane.refiguremode = mode;
        !           710:        if (mode)
        !           711:            RefigureLocationsAndCommit(vpw, vpw->composite.num_children/2 - 1, -1);
        !           712:     }
        !           713: }

unix.superglobalmegacorp.com

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