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

1.1       root        1: #ifndef lint
                      2: static char *sccsid = "@(#)ScrollBar.c 1.8     2/25/87";
                      3: #endif lint
                      4: /*
                      5:  * Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts.
                      6:  * 
                      7:  *                         All Rights Reserved
                      8:  * 
                      9:  * Permission to use, copy, modify, and distribute this software and its 
                     10:  * documentation for any purpose and without fee is hereby granted, 
                     11:  * provided that the above copyright notice appear in all copies and that
                     12:  * both that copyright notice and this permission notice appear in 
                     13:  * supporting documentation, and that the name of Digital Equipment
                     14:  * Corporation not be used in advertising or publicity pertaining to
                     15:  * distribution of the software without specific, written prior permission.  
                     16:  * 
                     17:  * 
                     18:  * DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
                     19:  * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
                     20:  * DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
                     21:  * ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
                     22:  * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
                     23:  * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
                     24:  * SOFTWARE.
                     25:  */
                     26: 
                     27: 
                     28: /* ScrollBar.c */
                     29: /* created by weissman, Mon Jul  7 13:20:03 1986 */
                     30: 
                     31: #include "X.h"
                     32: #include "Xlib.h"
                     33: #include "Intrinsic.h"
                     34: #include "Scroll.h"
                     35: #include "Atoms.h"
                     36: #include "cursorfont.h"
                     37: 
                     38: /* Private definitions. */
                     39: 
                     40: typedef void (*NotifyProc)();
                     41: 
                     42: typedef struct _WidgetDataRec
                     43: {
                     44:     Display    *dpy;           /* Display connection */
                     45:     Window     scrollbarWindow;/* Window containing the scrollbar */
                     46:     XtOrientation orientation; /* Horizontal or vertical? */
                     47:     int                *value;         /* client data to pass in call-back procs */
                     48:     Position   x, y;           /* Location of the scroll bar */
                     49:     Dimension width, height, borderwidth;
                     50:                                /* Dimensions of the scroll bar */
                     51:     NotifyProc ScrollProc;     /* Call to scroll content */
                     52:     NotifyProc ThumbProc;      /* Call if user thumbs scrollbar */
                     53:     float      top;            /* What percent is above the win's top */
                     54:     float      shown;          /* What percent is shown in the win */
                     55:     int                topLoc;         /* Pixel that corresponds to top */
                     56:     int                shownLength;    /* Num pixels corresponding to shown */
                     57:     int                foreground;     /* thumb color */
                     58:     Pixmap     customthumb;    /* thumb pixmap */
                     59:     Pixel      background;     /* window background color. */
                     60:     Pixel      border;         /* What to use for painting the border. */
                     61:     XtEventsPtr        eventTable;     /* Table for Translation Manager */
                     62:     caddr_t    state;          /* state for Translation Manager */
                     63:     int                eventlevels;    /* recursion levels of event handling */
                     64:     Cursor     NormalCursor;   /* The normal cursor for scrollbar window */
                     65:     Cursor     ButtonCursors[4];/* The cursors to use with each button */
                     66:     short      curbutton;      /* Which button is currently held down. */
                     67:     GC gc;                     /*this will go away if thumb becomes a window*/
                     68: } WidgetDataRec, *WidgetData;
                     69: 
                     70: static int dummyvalue;
                     71: extern void Dummy ();
                     72: static WidgetDataRec globaldata;
                     73: static WidgetDataRec globalinit = {
                     74:        NULL,           /* Display dpy; */
                     75:        NULL,           /* scrollBar window */
                     76:        XtorientVertical,/*orientation */
                     77:        &dummyvalue,    /* client data */
                     78:        0,0,            /* x,y */
                     79:        10,20,          /* width,height */
                     80:        1,              /* borderwidth */
                     81:        Dummy,          /* void (*proc)(); */
                     82:        Dummy,          /* void (*proc)(); */
                     83:        0.0,            /* fraction above top */
                     84:        0.0,            /* shown fraction */
                     85:        NULL,           /* top percent pixel */
                     86:        NULL,           /* shown length */
                     87:        NULL,           /* foreground */
                     88:         NULL,          /* customthumb */
                     89:        0,              /* background pixel*/
                     90:        0,              /* border pixel */
                     91:        NULL,           /* table for TM */
                     92:        NULL,           /* state for TM */
                     93:        NULL,           /* eventlevels */
                     94:        NULL,           /* normal cursor */
                     95:        {NULL,NULL,NULL,NULL}, /*ButtonCursors */
                     96:        NULL,           /*curbotton */
                     97:        NULL            /*gc*/
                     98: };
                     99: 
                    100: 
                    101: static Resource resources[] = {
                    102:     {XtNwindow, XtCWindow, XrmRWindow, sizeof(Window),
                    103:         (caddr_t)&globaldata.scrollbarWindow, NULL},
                    104:     {XtNorientation, XtCOrientation, XtROrientation, sizeof(XtOrientation),
                    105:         (caddr_t)&globaldata.orientation, NULL},
                    106:     {XtNvalue, XtCValue, XrmRPointer, sizeof(caddr_t),
                    107:        (caddr_t)&globaldata.value,(caddr_t)NULL},
                    108:     {XtNx, XtCX, XrmRInt,
                    109:        sizeof(int),(caddr_t)&globaldata.x, (caddr_t)NULL },
                    110:     {XtNy, XtCY, XrmRInt,
                    111:        sizeof(int),(caddr_t)&globaldata.y, (caddr_t)NULL },
                    112:     {XtNwidth, XtCWidth, XrmRInt, sizeof(int),
                    113:         (caddr_t)&globaldata.width, NULL},
                    114:     {XtNheight, XtCHeight, XrmRInt, sizeof(int),
                    115:         (caddr_t)&globaldata.height, NULL},
                    116:     {XtNborderWidth, XtCBorderWidth, XrmRInt, sizeof(int),
                    117:         (caddr_t)&globaldata.borderwidth, NULL},
                    118:     {XtNborder, XtCColor, XrmRPixel, sizeof(int),
                    119:         (caddr_t)&globaldata.border, (caddr_t)&XtDefaultFGPixel},
                    120:     {XtNscrollUpDownProc, XtCFunction, XtRFunction,
                    121:         sizeof(globaldata.ScrollProc),
                    122:         (caddr_t)&globaldata.ScrollProc, NULL},
                    123:     {XtNthumbProc, XtCFunction, XtRFunction, sizeof(globaldata.ThumbProc),
                    124:         (caddr_t)&globaldata.ThumbProc, NULL},
                    125:     {XtNforeground, XtCColor, XrmRPixel, sizeof(int),
                    126:         (caddr_t)&globaldata.foreground, (caddr_t)&XtDefaultFGPixel},
                    127:     {XtNcustomthumb, XtCPixmap, XrmRPixmap, sizeof(Pixmap),
                    128:         (caddr_t)&globaldata.customthumb,NULL},
                    129:     {XtNbackground, XtCColor, XrmRPixel, sizeof(int),
                    130:         (caddr_t)&globaldata.background, (caddr_t)&XtDefaultBGPixel},
                    131:     {XtNtop, XtCFraction, XrmRFloat, sizeof(float),
                    132:         (caddr_t)&globaldata.top, NULL},
                    133:     {XtNshown, XtCFraction, XrmRFloat, sizeof(float),
                    134:         (caddr_t)&globaldata.shown, NULL},
                    135:     {XtNeventBindings,XtCEventBindings,XtREventBindings,
                    136:         sizeof(caddr_t), (caddr_t)&globaldata.eventTable, NULL}
                    137: };
                    138: 
                    139: static XContext widgetContext;
                    140: 
                    141: 
                    142: 
                    143: #define MINBARHEIGHT   7     /* How many pixels of scrollbar to always show */
                    144: #define NoButton -1
                    145: #define PICKLENGTH(data,x,y) \
                    146:     ((data->orientation == XtorientHorizontal) ? x : y)
                    147: #define PICKTHICKNESS(data,x,y) \
                    148:     ((data->orientation == XtorientHorizontal) ? y : x)
                    149: #define MIN(x,y)       ((x) < (y) ? (x) : (y))
                    150: #define MAX(x,y)       ((x) > (y) ? (x) : (y))
                    151: 
                    152: 
                    153: /* Orientation enumeration constants */
                    154: 
                    155: static XrmQuark  XtQEhorizontal;
                    156: static XrmQuark  XtQEvertical;
                    157: 
                    158: /*ARGSUSED*/
                    159: #define        done(address, type) \
                    160:        { (*toVal).size = sizeof(type); (*toVal).addr = (caddr_t) address; }
                    161: 
                    162: extern void _XLowerCase();
                    163: 
                    164: static void CvtStringToOrientation(fromVal, toVal)
                    165:     XrmValue   fromVal;
                    166:     XrmValue   *toVal;
                    167: {
                    168:     static XtOrientation orient;
                    169:     XrmQuark   q;
                    170:     char       lowerName[1000];
                    171: 
                    172: /* ||| where to put LowerCase */
                    173:     _XLowerCase((char *) fromVal.addr, lowerName);
                    174:     q = XrmAtomToQuark(lowerName);
                    175:     if (q == XtQEhorizontal) {
                    176:        orient = XtorientHorizontal;
                    177:        done(&orient, XtOrientation);
                    178:        return;
                    179:     }
                    180:     if (q == XtQEvertical) {
                    181:        orient = XtorientVertical;
                    182:        done(&orient, XtOrientation);
                    183:        return;
                    184:     }
                    185: };
                    186: 
                    187: 
                    188: static char *defaultEventBindings[] = {
                    189:        "<ButtonPress>left:             startup\n",
                    190:        "<ButtonPress>middle:           startscroll\n",
                    191:        "<ButtonPress>right:            startdown\n",
                    192:        "<ButtonRelease>left:           doup\n",
                    193:        "<ButtonRelease>middle:         doscroll\n",
                    194:        "<ButtonRelease>right:          dodown\n",
                    195:        "<MotionNotify>middle:          movebar\n", /*bug in TM forces button spec here */
                    196:        NULL
                    197: };
                    198: 
                    199: static void Ignore()
                    200: {
                    201:        (void)printf("you are being ignored\n");
                    202: }
                    203: 
                    204: static Boolean initialized = FALSE;
                    205: static void ScrollBarInitialize ()
                    206: {
                    207:     widgetContext = XUniqueContext();
                    208:     globalinit.eventTable = XtParseEventBindings(defaultEventBindings);
                    209:     XtQEhorizontal = XrmAtomToQuark(XtEhorizontal);
                    210:     XtQEvertical   = XrmAtomToQuark(XtEvertical);
                    211:     XrmRegisterTypeConverter(XrmRString, XtROrientation, CvtStringToOrientation);
                    212:     initialized = TRUE;
                    213: }
                    214: 
                    215: /*
                    216:  * Given a display and window, get the widget data.
                    217:  */
                    218: 
                    219: static WidgetData DataFromWindow(dpy, window)
                    220: Display *dpy;
                    221: Window window;
                    222: {
                    223:     WidgetData result;
                    224:     if (XFindContext(dpy, window, widgetContext, (caddr_t *)&result))
                    225:        return NULL;
                    226:     return result;
                    227: }
                    228: 
                    229: /* ARGSUSED */
                    230: static void Dummy(p)   /* default call back proc */
                    231: caddr_t p;
                    232: {
                    233:        (void) printf("dummy call back for ScrollBar\n");
                    234: }
                    235: 
                    236: /*
                    237:  * Make sure the first number is within the range specified by the other
                    238:  * two numbers.
                    239:  */
                    240: 
                    241: static int InRange(num, small, big)
                    242: int num, small, big;
                    243: {
                    244:     return (num < small) ? small : ((num > big) ? big : num);
                    245: }
                    246: 
                    247: /*
                    248:  * Same as above, but for floating numbers. 
                    249:  */
                    250: 
                    251: static float FloatInRange(num, small, big)
                    252: float num, small, big;
                    253: {
                    254:     return (num < small) ? small : ((num > big) ? big : num);
                    255: }
                    256: 
                    257: /* Given the scrollbar window, return the SbarInfo record for it. */
                    258: static WidgetData SbarInfoFromSbarWindow(dpy, window)
                    259:   Display *dpy;
                    260:   Window window;       /* Scrollbar window */
                    261: {
                    262:     WidgetData result;
                    263:     if (XFindContext(dpy, window, widgetContext, (caddr_t *)&result))
                    264:        return NULL;
                    265:     return result;
                    266: }
                    267: 
                    268: 
                    269: 
                    270: 
                    271: /* Given a WidgetData record and a point in the scrollbarWindow, determine */
                    272: /* what percentage that point indicates.                                */
                    273: 
                    274: 
                    275: 
                    276: 
                    277: 
                    278: /* Fill the area specified by top and bottom with the given pattern. */
                    279:  float FractionLoc(data,x,y)
                    280:   WidgetData data;
                    281:   int x,y;
                    282: {
                    283:     float   result;
                    284:     result = PICKLENGTH(data, (float) x/data->width, (float) y/data->height);
                    285:     return FloatInRange(result, 0.0, 1.0);
                    286: }
                    287: 
                    288: 
                    289: static FillArea(data, top, bottom, thumb)
                    290:   WidgetData data;
                    291:   Position top, bottom;
                    292:   int thumb;
                    293: {
                    294:     Dimension length = bottom-top;
                    295:     switch(thumb) {
                    296:        /* Fill the new Thumb location */
                    297:       case 1:
                    298:        if (data->orientation == XtorientHorizontal) 
                    299:            XFillRectangle(data->dpy, data->scrollbarWindow, data->gc,
                    300:                           top, 1, length, data->height-2);
                    301:        
                    302:        else XFillRectangle(data->dpy, data->scrollbarWindow, data->gc,
                    303:                            1, top, data->width-2, length);
                    304: 
                    305:        break;
                    306:        /* Clear the old Thumb location */
                    307:       case 0:
                    308:        if (data->orientation == XtorientHorizontal) 
                    309:            XClearArea(data->dpy, data->scrollbarWindow, top, 1,
                    310:                       length, data->height-2, FALSE);
                    311:        
                    312:        else XClearArea(data->dpy, data->scrollbarWindow, 1, top,
                    313:                        data->width-2, length, FALSE);
                    314: 
                    315:     }  
                    316: }
                    317: 
                    318: 
                    319: /* Paint the thumb in the area specified by data->top and
                    320:    data->shown.  The old area is erased.  The painting and
                    321:    erasing is done cleverly so that no flickering will occur. */
                    322: 
                    323: static PaintThumb(data)
                    324:   WidgetData data;
                    325: {
                    326:     int length, oldtop, oldbot, newtop, newbot;
                    327:     length = PICKLENGTH(data, data->width, data->height);
                    328:     oldtop = data->topLoc;
                    329:     oldbot = oldtop + data->shownLength;
                    330:     newtop = length * data->top;
                    331:     newbot = newtop + length * (data->shown);
                    332:     if (newbot < newtop + MINBARHEIGHT) newbot = newtop + MINBARHEIGHT;
                    333:     if (newtop < oldtop)
                    334:        FillArea(data, newtop, MIN(newbot, oldtop),1);
                    335:     if (newtop > oldtop)
                    336:        FillArea(data, oldtop, MIN(newtop, oldbot), 0);
                    337:     if (newbot < oldbot)
                    338:        FillArea(data, MAX(newbot, oldtop), oldbot,0);
                    339:     if (newbot > oldbot)
                    340:        FillArea(data, MAX(newtop, oldbot), newbot, 1);
                    341:     data->topLoc = newtop;
                    342:     data->shownLength = newbot - newtop;
                    343: }
                    344: 
                    345: 
                    346: /* Move the thumb to the value corresponding to the given point. */
                    347: 
                    348: static MoveThumb(data,x,y)
                    349:   WidgetData data;
                    350:   int x,y;
                    351: {
                    352:     data->top = FractionLoc(data, x, y);
                    353:     PaintThumb(data);
                    354: }
                    355: 
                    356: 
                    357: 
                    358: 
                    359: 
                    360: StartScroll(data,button)
                    361:   WidgetData data;
                    362:   unsigned int button;
                    363: {
                    364:     if (data->curbutton != 0) return;
                    365:     data->curbutton = button;
                    366: 
                    367:     XDefineCursor(data->dpy, data->scrollbarWindow,
                    368:                  data->ButtonCursors[data->curbutton]);
                    369:     XFlush(data->dpy);
                    370: 
                    371: }
                    372: 
                    373: 
                    374: 
                    375: ScrollElevator(data,button,x,y)
                    376:    WidgetData data;
                    377:    Position x,y;
                    378:    unsigned int button;
                    379: {
                    380:     if (data->curbutton != 0) return;
                    381:     data->curbutton = button;
                    382:     XDefineCursor(data->dpy, data->scrollbarWindow,
                    383:                  data->ButtonCursors[data->curbutton]);
                    384:     XFlush(data->dpy);
                    385: 
                    386:     MoveThumb(data,x,y);
                    387: }   
                    388: 
                    389: 
                    390: 
                    391: /* The user has thumbed to the location he wants; tell the other module where
                    392:    the thumb now is. */
                    393: 
                    394: static FinalThumbLoc(data,x,y)
                    395:   WidgetData data;
                    396:   Position x,y;
                    397: {
                    398:     MoveThumb(data, x, y);
                    399:     (*(data->ThumbProc)) (data->dpy, data->scrollbarWindow,
                    400:            data->value,
                    401:            data->top);
                    402: }
                    403: 
                    404: 
                    405: static NotifyScroll(data,x,y)
                    406:    WidgetData data;
                    407:    Position x,y;
                    408: {
                    409:     if (data->curbutton == 0) return; 
                    410:     XDefineCursor(data->dpy,data->scrollbarWindow, data->NormalCursor);
                    411:     XFlush(data->dpy);
                    412:     (*(data->ScrollProc)) (data->dpy, data->scrollbarWindow,
                    413:                           data->value,
                    414:                           InRange(PICKLENGTH(data, x,y),
                    415:                                   0,
                    416:                                   (int)PICKLENGTH(data, data->width, data->height)));
                    417:     data->curbutton = AnyButton; /*means NoButton */
                    418: 
                    419: 
                    420: }
                    421: 
                    422: static NotifyScroll1(data,x,y)
                    423:    WidgetData data;
                    424:    Position x,y;
                    425: {
                    426:     if (data->curbutton == 0) return;
                    427:     XDefineCursor(data->dpy,data->scrollbarWindow, data->NormalCursor);
                    428:     XFlush(data->dpy);
                    429:     (*(data->ScrollProc)) (data->dpy, data->scrollbarWindow,
                    430:                           data->value,
                    431:                           -InRange(PICKLENGTH(data, x,y),
                    432:                                    0,
                    433:                                    (int)PICKLENGTH(data, data->width, data->height)));
                    434:     data->curbutton = AnyButton; /*means NoButton */
                    435: 
                    436: 
                    437: }
                    438: static NotifyThumb(data,x,y)
                    439:   WidgetData data;
                    440:   Position x,y;
                    441: {
                    442:     if (data->curbutton == 0) return;
                    443:     XDefineCursor(data->dpy,data->scrollbarWindow, data->NormalCursor);
                    444:     XFlush(data->dpy);
                    445: 
                    446:            FinalThumbLoc(data, x, y);
                    447:            data->curbutton = AnyButton; /*means NoButton */
                    448: 
                    449: }
                    450: 
                    451: 
                    452: 
                    453: 
                    454: static MoveElevator(data, x,y)
                    455: WidgetData data;
                    456: Position x,y;
                    457: {
                    458:        if (data->curbutton == 0) return;
                    459:        MoveThumb(data, x, y);
                    460: }
                    461: 
                    462: 
                    463: 
                    464: /* Handle an event in a scrollBar window.  */
                    465: 
                    466: static XtEventReturnCode HandleScrollBarEvent(event, eventdata)
                    467: XEvent *event;         /* The event itself. */
                    468: caddr_t eventdata;
                    469: {
                    470:     WidgetData data = (WidgetData) eventdata;
                    471:     XtActionTokenPtr actionList;
                    472:     NotifyProc proc;
                    473: 
                    474:     data->eventlevels++;
                    475:     switch (event->type) {
                    476:            case Expose:
                    477:                if (event->xexpose.count == 0){
                    478:                    data->topLoc = -1000;       /* Forces entire thumb to be painted. */
                    479:                    PaintThumb(data); 
                    480:                }
                    481:                    return XteventHandled;
                    482:            case DestroyNotify:
                    483:                XtScrollBarDestroy(event->xany.display, event->xany.window);
                    484:                return XteventHandled;
                    485:            case ConfigureNotify:
                    486:                data->width = event->xconfigure.width;
                    487:                data->height = event->xconfigure.height;
                    488:                FillArea(data, data->topLoc, 
                    489:                 data->topLoc + data->shownLength, 0);
                    490: 
                    491:                    data->topLoc = -1000;       /* Forces entire thumb to be painted. */
                    492:                    PaintThumb(data);
                    493:                    return (XteventHandled);
                    494: 
                    495:        default:
                    496:                actionList = (XtActionTokenPtr) XtTranslateEvent(
                    497:                        event, (TranslationPtr) data->state);
                    498:                for (; actionList != NULL; actionList = actionList ->next) {
                    499:                 if (actionList ->type ==XttokenAction) {
                    500:                 proc = (NotifyProc)XtInterpretAction(data->dpy, (TranslationPtr) data->state, actionList->value.action);
                    501: 
                    502:                /* HACK until TM passes data */
                    503:        if (proc == (NotifyProc)StartScroll) StartScroll(data,event->xbutton.button);
                    504:         else if (proc == (NotifyProc)ScrollElevator) ScrollElevator(data,event->xbutton.button,event->xbutton.x,event->xbutton.y);
                    505:         else if (proc == (NotifyProc)NotifyScroll) NotifyScroll(data, event->xbutton.x, event->xbutton.y);
                    506:         else if (proc == (NotifyProc)NotifyThumb) NotifyThumb(data, event->xbutton.x,event->xbutton.y);
                    507:         else if (proc == (NotifyProc)NotifyScroll1) NotifyScroll1(data,event->xbutton.x,event->xbutton.y);
                    508:         else if (proc == (NotifyProc)MoveElevator) MoveElevator(data, event->xmotion.x, event->xmotion.y);
                    509: 
                    510: /*              (*proc) (data); */
                    511:                 }
                    512:                }
                    513:                break;
                    514: 
                    515: }
                    516:                data->eventlevels--;
                    517:                return (XteventHandled);
                    518: }
                    519: 
                    520: 
                    521: /* Public routines. */
                    522: 
                    523: /* Set the scroll bar to the given location. */
                    524: 
                    525: void XtScrollBarSetThumb(dpy, scrollbarWindow,top,shown)
                    526:   Display *dpy;
                    527:   Window scrollbarWindow;
                    528:   float top, shown;
                    529: {
                    530:     WidgetData data;
                    531:     data = SbarInfoFromSbarWindow(dpy, scrollbarWindow);
                    532:     data->top = top;
                    533:     data->shown = shown;
                    534:     PaintThumb(data);
                    535: }
                    536: 
                    537: 
                    538: /* scroll bar already destroyed, remove its associated data. */
                    539: void XtScrollBarDestroy(dpy, scrollbarWindow)
                    540:   Display *dpy;
                    541:   Window scrollbarWindow;
                    542: {
                    543:     XtFree((char *)SbarInfoFromSbarWindow(dpy, scrollbarWindow));
                    544:     XtClearEventHandlers(dpy, scrollbarWindow);
                    545:     (void) XDeleteContext(dpy, scrollbarWindow,widgetContext);
                    546: }
                    547: 
                    548: 
                    549: 
                    550: /* Given a window definition, make it a scroll bar. */
                    551: Window XtScrollBarCreate(dpy, parent, args, argCount)
                    552:        Display *dpy;
                    553:        Window parent;
                    554:        ArgList args;
                    555:        int     argCount;
                    556: {
                    557:     WidgetData data;   /* Record for info about this scrollBar */
                    558:     XrmNameList names;
                    559:     XrmClassList classes;
                    560:     XGCValues values; /* goes away if thumb becomes a window */
                    561:     unsigned long valuemask;
                    562:     XImage image;
                    563: 
                    564: static short pixmap_bits[] = {
                    565:     0xaaaa, 0xaaaa, 0x5555, 0x5555,
                    566:     0xaaaa, 0xaaaa, 0x5555, 0x5555,
                    567:     0xaaaa, 0xaaaa, 0x5555, 0x5555,
                    568:     0xaaaa, 0xaaaa, 0x5555, 0x5555,
                    569:     0xaaaa, 0xaaaa, 0x5555, 0x5555,
                    570:     0xaaaa, 0xaaaa, 0x5555, 0x5555,
                    571:     0xaaaa, 0xaaaa, 0x5555, 0x5555,
                    572:     0xaaaa, 0xaaaa, 0x5555, 0x5555,
                    573:     0xaaaa, 0xaaaa, 0x5555, 0x5555,
                    574:     0xaaaa, 0xaaaa, 0x5555, 0x5555,
                    575:     0xaaaa, 0xaaaa, 0x5555, 0x5555,
                    576:     0xaaaa, 0xaaaa, 0x5555, 0x5555,
                    577:     0xaaaa, 0xaaaa, 0x5555, 0x5555,
                    578:     0xaaaa, 0xaaaa, 0x5555, 0x5555,
                    579:     0xaaaa, 0xaaaa, 0x5555, 0x5555,
                    580:     0xaaaa, 0xaaaa, 0x5555, 0x5555
                    581: };
                    582: 
                    583: #define default_width 32
                    584: #define default_height 32
                    585: 
                    586: static XtActionsRec actionsTable[] = {
                    587:        {"startup",     (caddr_t)StartScroll},
                    588:        {"startscroll", (caddr_t)ScrollElevator},
                    589:        {"startdown",   (caddr_t)StartScroll},
                    590:        {"doup",        (caddr_t)NotifyScroll},
                    591:        {"doscroll",    (caddr_t)NotifyThumb},
                    592:        {"dodown",      (caddr_t)NotifyScroll1},
                    593:        {"movebar",     (caddr_t)MoveElevator},
                    594:        {NULL,NULL}
                    595:   };
                    596: 
                    597:     if (!initialized) ScrollBarInitialize();
                    598: 
                    599: 
                    600:     globaldata = globalinit;
                    601:     globaldata.dpy = dpy;
                    602:     XtGetResources(dpy, 
                    603:        resources, XtNumber(resources), args, argCount, parent,
                    604:        "scrollBar","ScrollBar",&names, &classes);
                    605: 
                    606:     data = (WidgetData) XtMalloc(sizeof(WidgetDataRec));
                    607:     *data = globaldata;
                    608: 
                    609:     data->state = XtSetActionBindings(data->dpy, data->eventTable, actionsTable, (caddr_t) Ignore);
                    610: 
                    611:     if (data->scrollbarWindow == NULL) {
                    612:        if (data->width == 0) data->width = 1;
                    613:        if (data->height == 0) data->height = 1;
                    614:        data->scrollbarWindow = XCreateSimpleWindow(
                    615:                data->dpy, parent, data->x, data->y,
                    616:                data->width, data->height, 1,
                    617:                data->border, data->background);
                    618:     } else {
                    619:        XWindowChanges wc;
                    620:        unsigned int valuemask;
                    621:        valuemask = CWX | CWY | CWWidth | CWHeight | CWBorderWidth;
                    622:        wc.x = data->x; wc.y = data->y; wc.width = data->width;
                    623:        wc.height=data->height; wc.border_width = data->borderwidth;
                    624:        XConfigureWindow(data->dpy,data->scrollbarWindow,valuemask,&wc);
                    625:        XReparentWindow(data->dpy,data->scrollbarWindow,parent,data->x,data->y);
                    626:     }
                    627: 
                    628:     if (data->orientation == XtorientHorizontal) {
                    629:        if (data->NormalCursor == NULL)
                    630:         data->NormalCursor = XtGetCursor(dpy, XC_sb_h_double_arrow);
                    631:        if (data -> ButtonCursors[Button1] == NULL )
                    632:         data->ButtonCursors[Button1] = XtGetCursor(dpy, XC_sb_left_arrow);
                    633:        if (data -> ButtonCursors[Button2] == NULL)
                    634:         data->ButtonCursors[Button2] = XtGetCursor(dpy, XC_sb_up_arrow);
                    635:        if (data -> ButtonCursors[Button3] == NULL)
                    636:        data->ButtonCursors[Button3] = XtGetCursor(dpy, XC_sb_right_arrow);
                    637:     } else { if (data->orientation == XtorientVertical) {
                    638:        if (data->NormalCursor == NULL)
                    639:         data->NormalCursor = XtGetCursor(dpy, XC_sb_v_double_arrow);
                    640:        if (data -> ButtonCursors[Button1] == NULL )
                    641:         data->ButtonCursors[Button1] = XtGetCursor(dpy, XC_sb_up_arrow);
                    642:        if (data -> ButtonCursors[Button2] == NULL)
                    643:         data->ButtonCursors[Button2] = XtGetCursor(dpy, XC_sb_left_arrow);
                    644:        if (data -> ButtonCursors[Button3] == NULL)
                    645:        data->ButtonCursors[Button3] = XtGetCursor(dpy, XC_sb_down_arrow);
                    646:        }
                    647:     }
                    648:   if (data->foreground == NULL)
                    649:        data->foreground = BlackPixel(data->dpy,DefaultScreen(dpy));
                    650: 
                    651: 
                    652:   
                    653:   if (data->customthumb == NULL) {
                    654:    image.height = default_height;
                    655:    image.width = default_width;
                    656:    image.xoffset = 0;
                    657:    image.format = XYBitmap;
                    658:    image.data = (char*) pixmap_bits;
                    659:    image.byte_order = ImageByteOrder(data->dpy);
                    660:    image.bitmap_pad = BitmapPad(data->dpy);
                    661:    image.bitmap_bit_order = BitmapBitOrder(data->dpy);
                    662:    image.bitmap_unit = BitmapUnit(data->dpy);
                    663:    image.depth = 1;
                    664:    image.bytes_per_line = default_width/8;
                    665:    image.obdata = NULL;
                    666: 
                    667:    data->customthumb = XCreatePixmap(data->dpy, data->scrollbarWindow,
                    668:                                     (Dimension)image.width,
                    669:                                     (Dimension)image.height, 
                    670:                                     DefaultDepth(
                    671:                                         data->dpy, DefaultScreen(data->dpy)));
                    672: 
                    673:     values.foreground = data->foreground;
                    674:     values.background = data->background;
                    675:     values.function = GXcopy;      /* need to be explicit about defaults */
                    676:     values.plane_mask = AllPlanes;  /* until XtGetGC is re-done                  */
                    677:     valuemask = GCFunction | GCForeground | GCBackground | GCPlaneMask;
                    678:     data->gc = XtGetGC( data->dpy, widgetContext, data->scrollbarWindow,
                    679:                        valuemask, &values);
                    680:     XPutImage(data->dpy, data->customthumb, data->gc, &image, 0, 0, 0, 0,
                    681:              (Dimension) image.width, (Dimension) image.height);
                    682: 
                    683:     values.fill_style = FillTiled;
                    684:     values.tile = data->customthumb;
                    685:     valuemask = GCFillStyle | GCTile;
                    686:     data->gc = XtGetGC(data->dpy,widgetContext,data->scrollbarWindow,valuemask,&values);
                    687:    }
                    688: 
                    689: else {
                    690: 
                    691:     values.foreground = data->foreground;
                    692:     values.fill_style = FillTiled;
                    693:     values.tile = data->customthumb;
                    694:     valuemask = GCForeground | GCFillStyle | GCTile;
                    695:     data->gc = XtGetGC(data->dpy,widgetContext,data->scrollbarWindow,valuemask,&values);
                    696: }
                    697:     XDefineCursor(data->dpy,data->scrollbarWindow, data->NormalCursor);
                    698: 
                    699:     XtSetNameAndClass(data->dpy, data->scrollbarWindow, names, classes);
                    700: 
                    701:     (void) XSaveContext(data->dpy, data->scrollbarWindow, widgetContext, (caddr_t)data);
                    702:     XtSetEventHandler(data->dpy, data->scrollbarWindow,
                    703:                        (XtEventHandler)HandleScrollBarEvent,
                    704:                        ButtonPressMask | ExposureMask | ButtonReleaseMask |
                    705:                            Button2MotionMask | StructureNotifyMask,
                    706:                        (caddr_t) data);
                    707:     return data->scrollbarWindow;
                    708: }
                    709: 
                    710: void XtScrollBarGetValues(dpy, window, args, argCount)
                    711: Display *dpy;
                    712: Window window;
                    713: ArgList args;
                    714: int argCount;
                    715: {
                    716:     WidgetData data;
                    717:     data = DataFromWindow(dpy, window);
                    718:     if (data == NULL) return;
                    719:     globaldata = *data;
                    720:     XtGetValues(resources, XtNumber(resources), args, argCount);
                    721: }
                    722: 
                    723: 
                    724: void XtScrollBarSetValues(dpy, window, args, argCount)
                    725: Display *dpy;
                    726: Window window;
                    727: ArgList args;
                    728: int argCount;
                    729: {
                    730:     WidgetData data;
                    731:     short thumbmoved, redraw;
                    732: 
                    733:     thumbmoved = redraw = FALSE;
                    734:     data = DataFromWindow(dpy, window);
                    735:     if (data == NULL) return;
                    736:     globaldata = *data;
                    737:     XtSetValues(resources, XtNumber(resources), args, argCount);
                    738:     if (globaldata.border != data->border) {
                    739:        data->border = globaldata.border;
                    740:        if (data->borderwidth != 0)
                    741:            XSetWindowBorder(data->dpy,data->scrollbarWindow, data->border);
                    742:     }
                    743:     data->ScrollProc = globaldata.ScrollProc;
                    744:     data->ThumbProc = globaldata.ThumbProc;
                    745:     if (globaldata.foreground != data->foreground
                    746:      || globaldata.background != data->background) {
                    747: 
                    748:     }
                    749:     if (globaldata.foreground != data->foreground) {
                    750:        data->foreground = globaldata.foreground;
                    751:     }
                    752:     if (globaldata.background != data->background) {
                    753:        data->background = globaldata.background;
                    754: 
                    755:     }
                    756: 
                    757:    if (globaldata.customthumb != data->customthumb) 
                    758:        data->customthumb = globaldata.customthumb;
                    759: 
                    760:     if (globaldata.top != data->top) {
                    761:        data->top = globaldata.top;
                    762:        thumbmoved = TRUE;
                    763:     }
                    764:     if (globaldata.shown != data->shown) {
                    765:        data->shown = globaldata.shown;
                    766:        thumbmoved = TRUE;
                    767:     }
                    768:     if (redraw) {
                    769:        XClearWindow(data->dpy, data->scrollbarWindow);
                    770:        data->topLoc = -1000;
                    771:        PaintThumb(data);
                    772:     } else if (thumbmoved)
                    773:        PaintThumb(data);
                    774: }
                    775: 

unix.superglobalmegacorp.com

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