Annotation of researchv9/X11/src/X.V11R1/clients/xterm/scrollbar.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  *     $Source: /orpheus/u1/X11/clients/xterm/RCS/scrollbar.c,v $
                      3:  *     $Header: scrollbar.c,v 1.20 87/08/17 19:38:44 swick Exp $
                      4:  */
                      5: 
                      6: #include <X11/copyright.h>
                      7: 
                      8: /*
                      9:  * Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts.
                     10:  *
                     11:  *                         All Rights Reserved
                     12:  *
                     13:  * Permission to use, copy, modify, and distribute this software and its
                     14:  * documentation for any purpose and without fee is hereby granted,
                     15:  * provided that the above copyright notice appear in all copies and that
                     16:  * both that copyright notice and this permission notice appear in
                     17:  * supporting documentation, and that the name of Digital Equipment
                     18:  * Corporation not be used in advertising or publicity pertaining to
                     19:  * distribution of the software without specific, written prior permission.
                     20:  *
                     21:  *
                     22:  * DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
                     23:  * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
                     24:  * DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
                     25:  * ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
                     26:  * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
                     27:  * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
                     28:  * SOFTWARE.
                     29:  */
                     30: 
                     31: #include <stdio.h>
                     32: #include <setjmp.h>
                     33: #include <X11/Xlib.h>
                     34: #include <X11/Xtlib.h>
                     35: #include <X11/Xatom.h>
                     36: #include <X11/Xutil.h>
                     37: #include "ptyx.h"
                     38: #include "data.h"
                     39: #include "error.h"
                     40: 
                     41: extern void bcopy();
                     42: 
                     43: #ifndef lint
                     44: static char rcs_id[] = "$Header: scrollbar.c,v 1.20 87/08/17 19:38:44 swick Exp $";
                     45: #endif lint
                     46: 
                     47: /* Event handlers */
                     48: extern EventDoNothing();
                     49: 
                     50: extern ScrollTextTo();
                     51: extern ScrollTextUpDownBy();
                     52: 
                     53: static Bool IsEventType( display, event, type )
                     54:        Display *display;
                     55:        XEvent *event;
                     56:        int type;
                     57: {
                     58:        if (event->type == type)
                     59:            return( True );
                     60:        else
                     61:            return( False );
                     62: }
                     63: 
                     64: 
                     65: /* resize the text window for a terminal screen, modifying the
                     66:  * appropriate WM_SIZE_HINTS and taking advantage of bit gravity.
                     67:  */
                     68: 
                     69: static void ResizeScreen( screen, min_width, min_height )
                     70:        register TScreen *screen;
                     71:        int min_width, min_height;
                     72: {
                     73:        XSizeHints sizehints;
                     74:        XSetWindowAttributes newAttributes;
                     75:        XWindowAttributes oldAttributes;
                     76:        XEvent event;
                     77: 
                     78:        XGrabServer(screen->display);
                     79:        if (!XGetSizeHints(screen->display, VWindow(screen),
                     80:                &sizehints, XA_WM_NORMAL_HINTS))
                     81:            sizehints.flags = 0;
                     82:        sizehints.min_width = min_width;
                     83:        sizehints.min_height = min_height;
                     84:        sizehints.width_inc = FontWidth(screen);
                     85:        sizehints.height_inc = FontHeight(screen);
                     86:        sizehints.width =  (screen->max_col + 1) * FontWidth(screen)
                     87:                                + min_width;
                     88:        sizehints.height = FontHeight(screen) * (screen->max_row + 1)
                     89:                                + min_height;
                     90:        sizehints.flags |= PMinSize|PResizeInc|PSize;
                     91:        XSetSizeHints(screen->display,
                     92:         TextWindow(screen), &sizehints, XA_WM_NORMAL_HINTS);
                     93:        XUngrabServer(screen->display);
                     94: 
                     95:        XGetWindowAttributes( screen->display, TextWindow(screen),
                     96:                              &oldAttributes );
                     97: 
                     98:        newAttributes.event_mask =
                     99:            oldAttributes.your_event_mask | StructureNotifyMask;
                    100:        /* assume that the scrollbar always goes on the left! */
                    101:        newAttributes.bit_gravity = EastGravity;
                    102: 
                    103:        XChangeWindowAttributes( screen->display, TextWindow(screen),
                    104:                                 CWEventMask|CWBitGravity,
                    105:                                 &newAttributes );
                    106:        XResizeWindow(
                    107:            screen->display,
                    108:            TextWindow(screen),
                    109:            (unsigned) (screen->max_col + 1) * FontWidth(screen) + min_width,
                    110:            (unsigned) FontHeight(screen) * (screen->max_row + 1)
                    111:                      + min_height );
                    112: 
                    113:        /* wait for a window manager to actually do it */
                    114:        XIfEvent( screen->display, &event, IsEventType, ConfigureNotify );
                    115: 
                    116:        newAttributes.event_mask = oldAttributes.your_event_mask;
                    117:        newAttributes.bit_gravity = NorthWestGravity;
                    118:        XChangeWindowAttributes( screen->display, TextWindow(screen),
                    119:                                 CWEventMask|CWBitGravity,
                    120:                                 &newAttributes );
                    121: }
                    122: 
                    123: 
                    124: Window CreateScrollBar(w, x, y, height)
                    125:        Window w;
                    126:        int x, y, height;
                    127: {
                    128:        Window scrollWindow;
                    129:        TScreen *screen = &term.screen;
                    130:        XSetWindowAttributes attr;
                    131:        extern char *calloc();
                    132: 
                    133:        static Arg argList[] = {
                    134:           {XtNbackground,      (caddr_t) 0},
                    135:           {XtNborder,          (caddr_t) 0},
                    136:           {XtNx,               (caddr_t) 0},
                    137:           {XtNy,               (caddr_t) 0},
                    138:           {XtNheight,          (caddr_t) 0},
                    139:           {XtNorientation,     (caddr_t) XtorientVertical},
                    140:           {XtNscrollUpDownProc,(caddr_t) ScrollTextUpDownBy},
                    141:           {XtNthumbProc,       (caddr_t) ScrollTextTo},
                    142:           {XtNborderWidth,     (caddr_t) 1},
                    143:           {XtNwidth,           (caddr_t) SCROLLBARWIDTH-1},
                    144:        };   
                    145: 
                    146:        argList[0].value = (caddr_t) screen->background;
                    147:        argList[1].value = (caddr_t) screen->bordercolor;
                    148:        argList[2].value = (caddr_t) x;
                    149:        argList[3].value = (caddr_t) y;
                    150:        argList[4].value = (caddr_t) height;
                    151: 
                    152:        scrollWindow = XtScrollBarCreate(screen->display, w, 
                    153:          argList, XtNumber(argList));
                    154: 
                    155:        attr.do_not_propagate_mask = 
                    156:          LeaveWindowMask | EnterWindowMask | StructureNotifyMask;
                    157:        XChangeWindowAttributes(screen->display, scrollWindow, 
                    158:          CWDontPropagate, &attr);
                    159: 
                    160:        return(scrollWindow);
                    161: }
                    162: 
                    163: 
                    164: RedrawScrollBar(scrollWindow)
                    165:        Window scrollWindow;
                    166: {
                    167: 
                    168:        TScreen *screen = &term.screen;
                    169:        XtSendExpose(screen->display, scrollWindow);
                    170: }
                    171: 
                    172: ScrollBarReverseVideo(scrollWindow)
                    173:        register Window scrollWindow;
                    174: {
                    175:        register TScreen *screen = &term.screen;
                    176:        register caddr_t temp;
                    177: 
                    178:        static Arg argList[] = {
                    179: /* Don't muck with the order */
                    180:           {XtNforeground,      (caddr_t) NULL},        
                    181:           {XtNbackground,      (caddr_t) NULL},
                    182:           {XtNborder,          (caddr_t) NULL},
                    183:        };   
                    184: 
                    185:        XtScrollBarGetValues(
                    186:                screen->display, scrollWindow, argList, XtNumber(argList));
                    187: 
                    188:        /* Swap background and foreground */
                    189:        temp             = argList[0].value;
                    190:        argList[0].value = argList[1].value;
                    191:        argList[1].value = temp;
                    192: 
                    193:        /* Should really only do this if the old bordertile is the same as
                    194:           the scrollbar's current bordertile |||  LGR: ???*/
                    195:        argList[2].value = (caddr_t) screen->bordercolor;
                    196: 
                    197:        XtScrollBarGetValues(
                    198:                screen->display, scrollWindow, argList, XtNumber(argList));
                    199: 
                    200: }
                    201: 
                    202: 
                    203: ScrollBarDrawThumb(scrollWindow)
                    204:        register Window scrollWindow;
                    205: {
                    206:        register TScreen *screen = &term.screen;
                    207:        register int thumbTop, thumbHeight, totalHeight;
                    208:        
                    209:        thumbTop    = screen->topline + screen->savedlines;
                    210:        thumbHeight = screen->max_row + 1;
                    211:        totalHeight = thumbHeight + screen->savedlines;
                    212: 
                    213:        XtScrollBarSetThumb(screen->display, scrollWindow,
                    214:         ((float)thumbTop) / totalHeight,
                    215:         ((float)thumbHeight) / totalHeight);
                    216:        
                    217: }
                    218: 
                    219: ResizeScrollBar(scrollWindow, x, y, height)
                    220:        register Window scrollWindow;
                    221:        int x, y;
                    222:        unsigned height;
                    223: {
                    224:        register TScreen *screen = &term.screen;
                    225: 
                    226:        XMoveResizeWindow(
                    227:            screen->display, scrollWindow,
                    228:            x, y, 
                    229:            (SCROLLBARWIDTH - 1), height);
                    230:        ScrollBarDrawThumb(scrollWindow);
                    231: }
                    232: 
                    233: WindowScroll(screen, top)
                    234:        register TScreen *screen;
                    235:        int top;
                    236: {
                    237:        register int i, lines;
                    238:        register int scrolltop, scrollheight, refreshtop;
                    239: 
                    240:        if (top < -screen->savedlines)
                    241:                top = -screen->savedlines;
                    242:        else if (top > 0)
                    243:                top = 0;
                    244:        if((i = screen->topline - top) == 0) {
                    245:                ScrollBarDrawThumb(screen->scrollWindow);
                    246:                return;
                    247:        }
                    248: 
                    249:        ScrollSelection(i);
                    250: 
                    251:        if(screen->cursor_state)
                    252:                HideCursor();
                    253:        lines = i > 0 ? i : -i;
                    254:        if(lines > screen->max_row + 1)
                    255:                lines = screen->max_row + 1;
                    256:        scrollheight = screen->max_row - lines + 1;
                    257:        if(i > 0)
                    258:                refreshtop = scrolltop = 0;
                    259:        else {
                    260:                scrolltop = lines;
                    261:                refreshtop = scrollheight;
                    262:        }
                    263:        if(scrollheight > 0) {
                    264:                if (screen->multiscroll && scrollheight == 1 &&
                    265:                 screen->topline == 0 && screen->top_marg == 0 &&
                    266:                 screen->bot_marg == screen->max_row) {
                    267:                        if (screen->incopy < 0 && screen->scrolls == 0)
                    268:                                CopyWait (screen);
                    269:                        screen->scrolls++;
                    270:                } else {
                    271:                        if (screen->incopy)
                    272:                                CopyWait (screen);
                    273:                        screen->incopy = -1;
                    274:                }
                    275:                XCopyArea(
                    276:                    screen->display, 
                    277:                    TextWindow(screen), TextWindow(screen),
                    278:                    screen->normalGC,
                    279:                    (int) screen->border + screen->scrollbar,
                    280:                    (int) scrolltop * FontHeight(screen) + screen->border, 
                    281:                    (unsigned) Width(screen),
                    282:                    (unsigned) scrollheight * FontHeight(screen),
                    283:                    (int) screen->border + screen->scrollbar,
                    284:                    (int) (scrolltop + i) * FontHeight(screen)
                    285:                        + screen->border);
                    286:        }
                    287:        screen->topline = top;
                    288:        XClearArea(
                    289:            screen->display,
                    290:            TextWindow(screen), 
                    291:            (int) screen->border + screen->scrollbar, 
                    292:            (int) refreshtop * FontHeight(screen) + screen->border, 
                    293:            (unsigned) Width(screen),
                    294:            (unsigned) lines * FontHeight(screen),
                    295:            FALSE);
                    296:        ScrnRefresh(screen, refreshtop, 0, lines, screen->max_col + 1);
                    297: 
                    298:        ScrollBarDrawThumb(screen->scrollWindow);
                    299: }
                    300: 
                    301: ScrollBarOn(screen, init)
                    302:        register TScreen *screen;
                    303:        int init;
                    304: {
                    305:        register int border = 2 * screen->border;
                    306:        register int i;
                    307:        char *realloc(), *calloc();
                    308: 
                    309:        if(screen->scrollbar)
                    310:                return;
                    311:        if(!screen->scrollWindow) {
                    312:                if((screen->scrollWindow = CreateScrollBar(TextWindow(screen),
                    313:                 -1, - 1, Height(screen) + border)) == NULL) {
                    314:                        Bell();
                    315:                        return;
                    316:                }
                    317:                if((screen->allbuf = (ScrnBuf) realloc((char *) screen->buf,
                    318:                 (unsigned) 2*(screen->max_row + 2 + screen->savelines) * sizeof(char *)))
                    319:                 == NULL)
                    320:                        Error (ERROR_SBRALLOC);
                    321:                screen->buf = &screen->allbuf[2 * screen->savelines];
                    322:                bcopy ((char *)screen->allbuf, (char *)screen->buf,
                    323:                 2 * (screen->max_row + 2) * sizeof (char *));
                    324:                for(i = 2 * screen->savelines - 1 ; i >= 0 ; i--)
                    325:                        if((screen->allbuf[i] =
                    326:                         calloc((unsigned) screen->max_col + 1, sizeof(char))) == NULL)
                    327:                                Error (ERROR_SBRALLOC2);
                    328:        }
                    329:        screen->scrollbar = SCROLLBARWIDTH;
                    330:        ScrollBarDrawThumb(screen->scrollWindow);
                    331:        if (!init) ResizeScreen( screen, border + SCROLLBARWIDTH, border );
                    332:        /* map afterwards so BitGravity can be used profitably */
                    333:        XMapWindow(screen->display, screen->scrollWindow);
                    334: }
                    335: 
                    336: ScrollBarOff(screen)
                    337:        register TScreen *screen;
                    338: {
                    339:        register int border = 2 * screen->border;
                    340: 
                    341:        if(!screen->scrollbar)
                    342:                return;
                    343:        screen->scrollbar = 0;
                    344:        XUnmapWindow(screen->display, screen->scrollWindow);
                    345:        ResizeScreen( screen, border, border );
                    346: }
                    347: 
                    348: /*ARGSUSED*/
                    349: ScrollTextTo(dpy, scrollbarWindow, clientWindow, topPercent)
                    350:        Display *dpy;
                    351:        Window scrollbarWindow, clientWindow;
                    352:        float topPercent;
                    353: {
                    354:        register TScreen *screen = &term.screen;
                    355:        int thumbTop;   /* relative to first saved line */
                    356:        int newTopLine;
                    357: 
                    358: /*
                    359:    screen->savedlines : Number of offscreen text lines,
                    360:    screen->maxrow + 1 : Number of onscreen  text lines,
                    361:    screen->topline    : -Number of lines above the last screen->max_row+1 lines
                    362: */
                    363: 
                    364:        thumbTop = topPercent * (screen->savedlines + screen->max_row+1);
                    365:        newTopLine = thumbTop - screen->savedlines;
                    366:        WindowScroll(screen, newTopLine);
                    367: }
                    368: 
                    369: /*ARGSUSED*/
                    370: ScrollTextUpDownBy(dpy, scrollbarWindow, clientWindow, pixels)
                    371:        Display *dpy;
                    372:        Window scrollbarWindow, clientWindow;
                    373:        int pixels;
                    374: {
                    375:        register TScreen *screen = &term.screen;
                    376:        register int rowOnScreen, newTopLine;
                    377: 
                    378:        rowOnScreen = pixels / FontHeight(screen);
                    379:        if (rowOnScreen == 0) {
                    380:                if (pixels < 0)
                    381:                        rowOnScreen = -1;
                    382:                else if (pixels > 0)
                    383:                        rowOnScreen = 1;
                    384:        }
                    385:        newTopLine = screen->topline + rowOnScreen;
                    386:        WindowScroll(screen, newTopLine);
                    387: }

unix.superglobalmegacorp.com

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