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

1.1       root        1: /*
                      2:  *     $Source: /u1/X11/clients/xterm/RCS/util.c,v $
                      3:  *     $Header: util.c,v 1.11 87/09/11 08:16:49 toddb 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: /* util.c */
                     32: 
                     33: #ifndef lint
                     34: static char rcs_id[] = "$Header: util.c,v 1.11 87/09/11 08:16:49 toddb Exp $";
                     35: #endif lint
                     36: 
                     37: #include <stdio.h>
                     38: #include <X11/Xlib.h>
                     39: #include <X11/Intrinsic.h>
                     40: #include <signal.h>
                     41: #include <setjmp.h>
                     42: typedef int *jmp_ptr;
                     43: 
                     44: #include "ptyx.h"
                     45: #include "data.h"
                     46: #include "error.h"
                     47: 
                     48: /*
                     49:  * These routines are used for the jump scroll feature
                     50:  */
                     51: FlushScroll(screen)
                     52: register TScreen *screen;
                     53: {
                     54:        register int i;
                     55:        register int shift = -screen->topline;
                     56:        register int bot = screen->max_row - shift;
                     57:        register int refreshtop;
                     58:        register int refreshheight;
                     59:        register int scrolltop;
                     60:        register int scrollheight;
                     61: 
                     62:        if(screen->cursor_state)
                     63:                HideCursor();
                     64:        if(screen->scroll_amt > 0) {
                     65:                refreshheight = screen->refresh_amt;
                     66:                scrollheight = screen->bot_marg - screen->top_marg -
                     67:                 refreshheight + 1;
                     68:                if((refreshtop = screen->bot_marg - refreshheight + 1 + shift) >
                     69:                 (i = screen->max_row - screen->scroll_amt + 1))
                     70:                        refreshtop = i;
                     71:                if(screen->scrollWindow && !screen->alternate
                     72:                 && screen->top_marg == 0) {
                     73:                        scrolltop = 0;
                     74:                        if((scrollheight += shift) > i)
                     75:                                scrollheight = i;
                     76:                        if((i = screen->bot_marg - bot) > 0 &&
                     77:                         (refreshheight -= i) < screen->scroll_amt)
                     78:                                refreshheight = screen->scroll_amt;
                     79:                        if((i = screen->savedlines) < screen->savelines) {
                     80:                                if((i += screen->scroll_amt) >
                     81:                                  screen->savelines)
                     82:                                        i = screen->savelines;
                     83:                                screen->savedlines = i;
                     84:                                ScrollBarDrawThumb(screen->scrollWindow);
                     85:                        }
                     86:                } else {
                     87:                        scrolltop = screen->top_marg + shift;
                     88:                        if((i = bot - (screen->bot_marg - screen->refresh_amt +
                     89:                         screen->scroll_amt)) > 0) {
                     90:                                if(bot < screen->bot_marg)
                     91:                                        refreshheight = screen->scroll_amt + i;
                     92:                        } else {
                     93:                                scrollheight += i;
                     94:                                refreshheight = screen->scroll_amt;
                     95:                                if((i = screen->top_marg + screen->scroll_amt -
                     96:                                 1 - bot) > 0) {
                     97:                                        refreshtop += i;
                     98:                                        refreshheight -= i;
                     99:                                }
                    100:                        }
                    101:                }
                    102:        } else {
                    103:                refreshheight = -screen->refresh_amt;
                    104:                scrollheight = screen->bot_marg - screen->top_marg -
                    105:                 refreshheight + 1;
                    106:                refreshtop = screen->top_marg + shift;
                    107:                scrolltop = refreshtop + refreshheight;
                    108:                if((i = screen->bot_marg - bot) > 0)
                    109:                        scrollheight -= i;
                    110:                if((i = screen->top_marg + refreshheight - 1 - bot) > 0)
                    111:                        refreshheight -= i;
                    112:        }
                    113:        if(scrollheight > 0) {
                    114:                if (screen->multiscroll && scrollheight == 1 &&
                    115:                 screen->topline == 0 && screen->top_marg == 0 &&
                    116:                 screen->bot_marg == screen->max_row) {
                    117:                        if (screen->incopy < 0 && screen->scrolls == 0)
                    118:                                CopyWait (screen);
                    119:                        screen->scrolls++;
                    120:                } else {
                    121:                        if (screen->incopy)
                    122:                                CopyWait (screen);
                    123:                        screen->incopy = -1;
                    124:                }
                    125: 
                    126:                XCopyArea (
                    127:                    screen->display, 
                    128:                    TextWindow(screen),
                    129:                    TextWindow(screen),
                    130:                    screen->normalGC,
                    131:                    (int) screen->border + screen->scrollbar,
                    132:                    (int) (scrolltop + screen->scroll_amt) * FontHeight(screen)
                    133:                        + screen->border, 
                    134:                    (unsigned) Width(screen),
                    135:                    (unsigned) scrollheight * FontHeight(screen),
                    136:                    (int) screen->border + screen->scrollbar, 
                    137:                    (int) scrolltop*FontHeight(screen) + screen->border);
                    138:        }
                    139:        screen->scroll_amt = 0;
                    140:        screen->refresh_amt = 0;
                    141:        if(refreshheight > 0) {
                    142:                XClearArea (
                    143:                    screen->display,
                    144:                    TextWindow(screen),
                    145:                    (int) screen->border + screen->scrollbar,
                    146:                    (int) refreshtop * FontHeight(screen) + screen->border,
                    147:                    (unsigned) Width(screen),
                    148:                    (unsigned) refreshheight * FontHeight(screen),
                    149:                    FALSE);
                    150:                ScrnRefresh(screen, refreshtop, 0, refreshheight,
                    151:                 screen->max_col + 1);
                    152:        }
                    153: }
                    154: 
                    155: AddToRefresh(screen)
                    156: register TScreen *screen;
                    157: {
                    158:        register int amount = screen->refresh_amt;
                    159:        register int row = screen->cur_row;
                    160: 
                    161:        if(amount == 0)
                    162:                return(0);
                    163:        if(amount > 0) {
                    164:                register int bottom;
                    165: 
                    166:                if(row == (bottom = screen->bot_marg) - amount) {
                    167:                        screen->refresh_amt++;
                    168:                        return(1);
                    169:                }
                    170:                return(row >= bottom - amount + 1 && row <= bottom);
                    171:        } else {
                    172:                register int top;
                    173: 
                    174:                amount = -amount;
                    175:                if(row == (top = screen->top_marg) + amount) {
                    176:                        screen->refresh_amt--;
                    177:                        return(1);
                    178:                }
                    179:                return(row <= top + amount - 1 && row >= top);
                    180:        }
                    181: }
                    182: 
                    183: /* 
                    184:  * scrolls the screen by amount lines, erases bottom, doesn't alter 
                    185:  * cursor position (i.e. cursor moves down amount relative to text).
                    186:  * All done within the scrolling region, of course. 
                    187:  * requires: amount > 0
                    188:  */
                    189: Scroll(screen, amount)
                    190: register TScreen *screen;
                    191: register int amount;
                    192: {
                    193:        register int i = screen->bot_marg - screen->top_marg + 1;
                    194:        register int shift;
                    195:        register int bot;
                    196:        register int refreshtop;
                    197:        register int refreshheight;
                    198:        register int scrolltop;
                    199:        register int scrollheight;
                    200: 
                    201:        if(screen->cursor_state)
                    202:                HideCursor();
                    203:        if (amount > i)
                    204:                amount = i;
                    205:     if(screen->jumpscroll) {
                    206:        if(screen->scroll_amt > 0) {
                    207:                if(screen->refresh_amt + amount > i)
                    208:                        FlushScroll(screen);
                    209:                screen->scroll_amt += amount;
                    210:                screen->refresh_amt += amount;
                    211:        } else {
                    212:                if(screen->scroll_amt < 0)
                    213:                        FlushScroll(screen);
                    214:                screen->scroll_amt = amount;
                    215:                screen->refresh_amt = amount;
                    216:        }
                    217:        refreshheight = 0;
                    218:     } else {
                    219: 
                    220:        if (amount == i) {
                    221:                ClearScreen(screen);
                    222:                return;
                    223:        }
                    224:        shift = -screen->topline;
                    225:        bot = screen->max_row - shift;
                    226:        scrollheight = i - amount;
                    227:        refreshheight = amount;
                    228:        if((refreshtop = screen->bot_marg - refreshheight + 1 + shift) >
                    229:         (i = screen->max_row - refreshheight + 1))
                    230:                refreshtop = i;
                    231:        if(screen->scrollWindow && !screen->alternate
                    232:         && screen->top_marg == 0) {
                    233:                scrolltop = 0;
                    234:                if((scrollheight += shift) > i)
                    235:                        scrollheight = i;
                    236:                if((i = screen->savedlines) < screen->savelines) {
                    237:                        if((i += amount) > screen->savelines)
                    238:                                i = screen->savelines;
                    239:                        screen->savedlines = i;
                    240:                        ScrollBarDrawThumb(screen->scrollWindow);
                    241:                }
                    242:        } else {
                    243:                scrolltop = screen->top_marg + shift;
                    244:                if((i = screen->bot_marg - bot) > 0) {
                    245:                        scrollheight -= i;
                    246:                        if((i = screen->top_marg + amount - 1 - bot) >= 0) {
                    247:                                refreshtop += i;
                    248:                                refreshheight -= i;
                    249:                        }
                    250:                }
                    251:        }
                    252:        if(scrollheight > 0) {
                    253:                if (screen->multiscroll
                    254:                && amount==1 && screen->topline == 0
                    255:                && screen->top_marg==0
                    256:                && screen->bot_marg==screen->max_row) {
                    257:                        if (screen->incopy<0 && screen->scrolls==0)
                    258:                                CopyWait(screen);
                    259:                        screen->scrolls++;
                    260:                } else {
                    261:                        if (screen->incopy)
                    262:                                CopyWait(screen);
                    263:                        screen->incopy = -1;
                    264:                }
                    265: 
                    266:                XCopyArea(
                    267:                    screen->display, 
                    268:                    TextWindow(screen),
                    269:                    TextWindow(screen),
                    270:                    screen->normalGC,
                    271:                    (int) screen->border + screen->scrollbar,
                    272:                    (int) (scrolltop+amount) * FontHeight(screen) + screen->border, 
                    273:                    (unsigned) Width(screen),
                    274:                    (unsigned) scrollheight * FontHeight(screen),
                    275:                    (int) screen->border + screen->scrollbar,
                    276:                    (int) scrolltop * FontHeight(screen) + screen->border);
                    277:        }
                    278:        if(refreshheight > 0) {
                    279:                XClearArea (
                    280:                   screen->display,
                    281:                   TextWindow(screen),
                    282:                   (int) screen->border + screen->scrollbar,
                    283:                   (int) refreshtop * FontHeight(screen) + screen->border,
                    284:                   (unsigned) Width(screen),
                    285:                   (unsigned) refreshheight * FontHeight(screen),
                    286:                   FALSE);
                    287:                if(refreshheight > shift)
                    288:                        refreshheight = shift;
                    289:        }
                    290:     }
                    291:        if(screen->scrollWindow && !screen->alternate && screen->top_marg == 0)
                    292:                ScrnDeleteLine(screen->allbuf, screen->bot_marg +
                    293:                 screen->savelines, 0, amount, screen->max_col + 1);
                    294:        else
                    295:                ScrnDeleteLine(screen->buf, screen->bot_marg, screen->top_marg,
                    296:                 amount, screen->max_col + 1);
                    297:        if(refreshheight > 0)
                    298:                ScrnRefresh(screen, refreshtop, 0, refreshheight,
                    299:                 screen->max_col + 1);
                    300: }
                    301: 
                    302: 
                    303: /*
                    304:  * Reverse scrolls the screen by amount lines, erases top, doesn't alter
                    305:  * cursor position (i.e. cursor moves up amount relative to text).
                    306:  * All done within the scrolling region, of course.
                    307:  * Requires: amount > 0
                    308:  */
                    309: RevScroll(screen, amount)
                    310: register TScreen *screen;
                    311: register int amount;
                    312: {
                    313:        register int i = screen->bot_marg - screen->top_marg + 1;
                    314:        register int shift;
                    315:        register int bot;
                    316:        register int refreshtop;
                    317:        register int refreshheight;
                    318:        register int scrolltop;
                    319:        register int scrollheight;
                    320: 
                    321:        if(screen->cursor_state)
                    322:                HideCursor();
                    323:        if (amount > i)
                    324:                amount = i;
                    325:     if(screen->jumpscroll) {
                    326:        if(screen->scroll_amt < 0) {
                    327:                if(-screen->refresh_amt + amount > i)
                    328:                        FlushScroll(screen);
                    329:                screen->scroll_amt -= amount;
                    330:                screen->refresh_amt -= amount;
                    331:        } else {
                    332:                if(screen->scroll_amt > 0)
                    333:                        FlushScroll(screen);
                    334:                screen->scroll_amt = -amount;
                    335:                screen->refresh_amt = -amount;
                    336:        }
                    337:     } else {
                    338:        shift = -screen->topline;
                    339:        bot = screen->max_row - shift;
                    340:        refreshheight = amount;
                    341:        scrollheight = screen->bot_marg - screen->top_marg -
                    342:         refreshheight + 1;
                    343:        refreshtop = screen->top_marg + shift;
                    344:        scrolltop = refreshtop + refreshheight;
                    345:        if((i = screen->bot_marg - bot) > 0)
                    346:                scrollheight -= i;
                    347:        if((i = screen->top_marg + refreshheight - 1 - bot) > 0)
                    348:                refreshheight -= i;
                    349:        if(scrollheight > 0) {
                    350:                if (screen->multiscroll
                    351:                && amount==1 && screen->topline == 0
                    352:                && screen->top_marg==0
                    353:                && screen->bot_marg==screen->max_row) {
                    354:                        if (screen->incopy<0 && screen->scrolls==0)
                    355:                                CopyWait(screen);
                    356:                        screen->scrolls++;
                    357:                } else {
                    358:                        if (screen->incopy)
                    359:                                CopyWait(screen);
                    360:                        screen->incopy = -1;
                    361:                }
                    362: 
                    363:                XCopyArea (
                    364:                    screen->display,
                    365:                    TextWindow(screen),
                    366:                    TextWindow(screen),
                    367:                    screen->normalGC,
                    368:                    (int) screen->border + screen->scrollbar, 
                    369:                    (int) (scrolltop-amount) * FontHeight(screen) + screen->border, 
                    370:                    (unsigned) Width(screen),
                    371:                    (unsigned) scrollheight * FontHeight(screen),
                    372:                    (int) screen->border + screen->scrollbar,
                    373:                    (int) scrolltop * FontHeight(screen) + screen->border);
                    374:        }
                    375:        if(refreshheight > 0)
                    376:                XClearArea (
                    377:                    screen->display,
                    378:                    TextWindow(screen),
                    379:                    (int) screen->border + screen->scrollbar,
                    380:                    (int) refreshtop * FontHeight(screen) + screen->border,
                    381:                    (unsigned) Width(screen),
                    382:                    (unsigned) refreshheight * FontHeight(screen),
                    383:                    FALSE);
                    384:     }
                    385:        ScrnInsertLine (screen->buf, screen->bot_marg, screen->top_marg,
                    386:                        amount, screen->max_col + 1);
                    387: }
                    388: 
                    389: /*
                    390:  * If cursor not in scrolling region, returns.  Else,
                    391:  * inserts n blank lines at the cursor's position.  Lines above the
                    392:  * bottom margin are lost.
                    393:  */
                    394: InsertLine (screen, n)
                    395: register TScreen *screen;
                    396: register int n;
                    397: {
                    398:        register int i;
                    399:        register int shift;
                    400:        register int bot;
                    401:        register int refreshtop;
                    402:        register int refreshheight;
                    403:        register int scrolltop;
                    404:        register int scrollheight;
                    405: 
                    406:        if (screen->cur_row < screen->top_marg ||
                    407:         screen->cur_row > screen->bot_marg)
                    408:                return;
                    409:        if(screen->cursor_state)
                    410:                HideCursor();
                    411:        screen->do_wrap = 0;
                    412:        if (n > (i = screen->bot_marg - screen->cur_row + 1))
                    413:                n = i;
                    414:     if(screen->jumpscroll) {
                    415:        if(screen->scroll_amt <= 0 &&
                    416:         screen->cur_row <= -screen->refresh_amt) {
                    417:                if(-screen->refresh_amt + n > screen->max_row + 1)
                    418:                        FlushScroll(screen);
                    419:                screen->scroll_amt -= n;
                    420:                screen->refresh_amt -= n;
                    421:        } else if(screen->scroll_amt)
                    422:                FlushScroll(screen);
                    423:     }
                    424:     if(!screen->scroll_amt) {
                    425:        shift = -screen->topline;
                    426:        bot = screen->max_row - shift;
                    427:        refreshheight = n;
                    428:        scrollheight = screen->bot_marg - screen->cur_row - refreshheight + 1;
                    429:        refreshtop = screen->cur_row + shift;
                    430:        scrolltop = refreshtop + refreshheight;
                    431:        if((i = screen->bot_marg - bot) > 0)
                    432:                scrollheight -= i;
                    433:        if((i = screen->cur_row + refreshheight - 1 - bot) > 0)
                    434:                refreshheight -= i;
                    435:        if(scrollheight > 0) {
                    436:                if (screen->incopy)
                    437:                        CopyWait (screen);
                    438:                screen->incopy = -1;
                    439:                XCopyArea (
                    440:                    screen->display, 
                    441:                    TextWindow(screen),
                    442:                    TextWindow(screen),
                    443:                    screen->normalGC,
                    444:                    (int) screen->border + screen->scrollbar,
                    445:                    (int) (scrolltop - n) * FontHeight(screen) + screen->border, 
                    446:                    (unsigned) Width(screen),
                    447:                    (unsigned) scrollheight * FontHeight(screen),
                    448:                    (int) screen->border + screen->scrollbar,
                    449:                    (int) scrolltop * FontHeight(screen) + screen->border);
                    450:        }
                    451:        if(refreshheight > 0)
                    452:                XClearArea (
                    453:                    screen->display,
                    454:                    TextWindow(screen),
                    455:                    (int) screen->border + screen->scrollbar,
                    456:                    (int) refreshtop * FontHeight(screen) + screen->border,
                    457:                    (unsigned) Width(screen),
                    458:                    (unsigned) refreshheight * FontHeight(screen),
                    459:                    FALSE);
                    460:     }
                    461:        /* adjust screen->buf */
                    462:        ScrnInsertLine(screen->buf, screen->bot_marg, screen->cur_row, n,
                    463:                        screen->max_col + 1);
                    464: }
                    465: 
                    466: /*
                    467:  * If cursor not in scrolling region, returns.  Else, deletes n lines
                    468:  * at the cursor's position, lines added at bottom margin are blank.
                    469:  */
                    470: DeleteLine(screen, n)
                    471: register TScreen *screen;
                    472: register int n;
                    473: {
                    474:        register int i;
                    475:        register int shift;
                    476:        register int bot;
                    477:        register int refreshtop;
                    478:        register int refreshheight;
                    479:        register int scrolltop;
                    480:        register int scrollheight;
                    481: 
                    482:        if (screen->cur_row < screen->top_marg ||
                    483:         screen->cur_row > screen->bot_marg)
                    484:                return;
                    485:        if(screen->cursor_state)
                    486:                HideCursor();
                    487:        screen->do_wrap = 0;
                    488:        if (n > (i = screen->bot_marg - screen->cur_row + 1))
                    489:                n = i;
                    490:     if(screen->jumpscroll) {
                    491:        if(screen->scroll_amt >= 0 && screen->cur_row == screen->top_marg) {
                    492:                if(screen->refresh_amt + n > screen->max_row + 1)
                    493:                        FlushScroll(screen);
                    494:                screen->scroll_amt += n;
                    495:                screen->refresh_amt += n;
                    496:        } else if(screen->scroll_amt)
                    497:                FlushScroll(screen);
                    498:     }
                    499:     if(!screen->scroll_amt) {
                    500: 
                    501:        shift = -screen->topline;
                    502:        bot = screen->max_row - shift;
                    503:        scrollheight = i - n;
                    504:        refreshheight = n;
                    505:        if((refreshtop = screen->bot_marg - refreshheight + 1 + shift) >
                    506:         (i = screen->max_row - refreshheight + 1))
                    507:                refreshtop = i;
                    508:        if(screen->scrollWindow && !screen->alternate && screen->cur_row == 0) {
                    509:                scrolltop = 0;
                    510:                if((scrollheight += shift) > i)
                    511:                        scrollheight = i;
                    512:                if((i = screen->savedlines) < screen->savelines) {
                    513:                        if((i += n) > screen->savelines)
                    514:                                i = screen->savelines;
                    515:                        screen->savedlines = i;
                    516:                        ScrollBarDrawThumb(screen->scrollWindow);
                    517:                }
                    518:        } else {
                    519:                scrolltop = screen->cur_row + shift;
                    520:                if((i = screen->bot_marg - bot) > 0) {
                    521:                        scrollheight -= i;
                    522:                        if((i = screen->cur_row + n - 1 - bot) >= 0) {
                    523:                                refreshheight -= i;
                    524:                        }
                    525:                }
                    526:        }
                    527:        if(scrollheight > 0) {
                    528:                if (screen->incopy)
                    529:                        CopyWait(screen);
                    530:                screen->incopy = -1;
                    531: 
                    532:                XCopyArea (
                    533:                    screen->display,
                    534:                    TextWindow(screen),
                    535:                    TextWindow(screen),
                    536:                    screen->normalGC,
                    537:                    (int) screen->border + screen->scrollbar,
                    538:                    (int) (scrolltop + n) * FontHeight(screen) + screen->border, 
                    539:                    (unsigned) Width(screen),
                    540:                    (unsigned) scrollheight * FontHeight(screen),
                    541:                    (int) screen->border + screen->scrollbar,
                    542:                    (int) scrolltop * FontHeight(screen) + screen->border);
                    543:        }
                    544:        if(refreshheight > 0)
                    545:                XClearArea (
                    546:                    screen->display,
                    547:                    TextWindow(screen),
                    548:                    (int) screen->border + screen->scrollbar,
                    549:                    (int) refreshtop * FontHeight(screen) + screen->border,
                    550:                    (unsigned) Width(screen),
                    551:                    (unsigned) refreshheight * FontHeight(screen),
                    552:                    FALSE);
                    553:     }
                    554:        /* adjust screen->buf */
                    555:        if(screen->scrollWindow && !screen->alternate && screen->cur_row == 0)
                    556:                ScrnDeleteLine(screen->allbuf, screen->bot_marg +
                    557:                 screen->savelines, 0, n, screen->max_col + 1);
                    558:        else
                    559:                ScrnDeleteLine(screen->buf, screen->bot_marg, screen->cur_row,
                    560:                 n, screen->max_col + 1);
                    561: }
                    562: 
                    563: /*
                    564:  * Insert n blanks at the cursor's position, no wraparound
                    565:  */
                    566: InsertChar (screen, n)
                    567: register TScreen *screen;
                    568: register int n;
                    569: {
                    570:        register int width = n * FontWidth(screen), cx, cy;
                    571: 
                    572:        if(screen->cursor_state)
                    573:                HideCursor();
                    574:        screen->do_wrap = 0;
                    575:        if(screen->cur_row - screen->topline <= screen->max_row) {
                    576:            if(!AddToRefresh(screen)) {
                    577:                if(screen->scroll_amt)
                    578:                        FlushScroll(screen);
                    579:        
                    580:                if (screen->incopy)
                    581:                        CopyWait (screen);
                    582:                screen->incopy = -1;
                    583:        
                    584:                cx = CursorX (screen, screen->cur_col);
                    585:                cy = CursorY (screen, screen->cur_row);
                    586:                XCopyArea(
                    587:                    screen->display,
                    588:                    TextWindow(screen), TextWindow(screen),
                    589:                    screen->normalGC,
                    590:                    cx, cy,
                    591:                    (unsigned) Width(screen)
                    592:                        - (screen->cur_col + n) * FontWidth(screen),
                    593:                    (unsigned) FontHeight(screen), 
                    594:                    cx + width, cy);
                    595:                XFillRectangle(
                    596:                    screen->display,
                    597:                    TextWindow(screen), 
                    598:                    screen->reverseGC,
                    599:                    cx, cy,
                    600:                    (unsigned) width, (unsigned) FontHeight(screen));
                    601:            }
                    602:        }
                    603:        /* adjust screen->buf */
                    604:        ScrnInsertChar(screen->buf, screen->cur_row, screen->cur_col, n,
                    605:                        screen->max_col + 1);
                    606: }
                    607: 
                    608: /*
                    609:  * Deletes n chars at the cursor's position, no wraparound.
                    610:  */
                    611: DeleteChar (screen, n)
                    612: register TScreen *screen;
                    613: register int   n;
                    614: {
                    615:        register int width, cx, cy;
                    616: 
                    617:        if(screen->cursor_state)
                    618:                HideCursor();
                    619:        screen->do_wrap = 0;
                    620:        if (n > (width = screen->max_col + 1 - screen->cur_col))
                    621:                n = width;
                    622:                
                    623:        if(screen->cur_row - screen->topline <= screen->max_row) {
                    624:            if(!AddToRefresh(screen)) {
                    625:                if(screen->scroll_amt)
                    626:                        FlushScroll(screen);
                    627:        
                    628:                width = n * FontWidth(screen);
                    629:        
                    630:                if (screen->incopy)
                    631:                        CopyWait (screen);
                    632:                screen->incopy = -1;
                    633:        
                    634:                cx = CursorX (screen, screen->cur_col);
                    635:                cy = CursorY (screen, screen->cur_row);
                    636:                XCopyArea(screen->display,
                    637:                     TextWindow(screen), TextWindow(screen),
                    638:                     screen->normalGC, 
                    639:                     cx + width, cy,
                    640:                     Width(screen) - (screen->cur_col + n) * FontWidth(screen),
                    641:                     FontHeight(screen), 
                    642:                     cx, cy);
                    643:                XFillRectangle (screen->display, TextWindow(screen),
                    644:                     screen->reverseGC,
                    645:                     screen->border + screen->scrollbar + Width(screen) - width,
                    646:                     cy, width, FontHeight(screen));
                    647:            }
                    648:        }
                    649:        /* adjust screen->buf */
                    650:        ScrnDeleteChar (screen->buf, screen->cur_row, screen->cur_col, n,
                    651:                        screen->max_col + 1);
                    652: 
                    653: }
                    654: 
                    655: /*
                    656:  * Clear from cursor position to beginning of display, inclusive.
                    657:  */
                    658: ClearAbove (screen)
                    659: register TScreen *screen;
                    660: {
                    661:        register top, height;
                    662: 
                    663:        if(screen->cursor_state)
                    664:                HideCursor();
                    665:        if((top = -screen->topline) <= screen->max_row) {
                    666:                if(screen->scroll_amt)
                    667:                        FlushScroll(screen);
                    668:                if((height = screen->cur_row + top) > screen->max_row)
                    669:                        height = screen->max_row;
                    670:                if((height -= top) > 0)
                    671:                        XClearArea(screen->display, TextWindow(screen),
                    672:                         screen->border + screen->scrollbar, top *
                    673:                         FontHeight(screen) + screen->border,
                    674:                         Width(screen), height * FontHeight(screen), FALSE);
                    675: 
                    676:                if(screen->cur_row - screen->topline <= screen->max_row)
                    677:                        ClearLeft(screen);
                    678:        }
                    679:        ClearBufRows(screen, 0, screen->cur_row - 1);
                    680: }
                    681: 
                    682: /*
                    683:  * Clear from cursor position to end of display, inclusive.
                    684:  */
                    685: ClearBelow (screen)
                    686: register TScreen *screen;
                    687: {
                    688:        register top;
                    689: 
                    690:        ClearRight(screen);
                    691:        if((top = screen->cur_row - screen->topline) <= screen->max_row) {
                    692:                if(screen->scroll_amt)
                    693:                        FlushScroll(screen);
                    694:                if(++top <= screen->max_row)
                    695:                        XClearArea(screen->display, TextWindow(screen),
                    696:                         screen->border + screen->scrollbar, top *
                    697:                         FontHeight(screen) + screen->border,
                    698:                         Width(screen), (screen->max_row - top + 1) *
                    699:                         FontHeight(screen), FALSE);
                    700:        }
                    701:        ClearBufRows(screen, screen->cur_row + 1, screen->max_row);
                    702: }
                    703: 
                    704: /* 
                    705:  * Clear last part of cursor's line, inclusive.
                    706:  */
                    707: ClearRight (screen)
                    708: register TScreen *screen;
                    709: {
                    710:        if(screen->cursor_state)
                    711:                HideCursor();
                    712:        screen->do_wrap = 0;
                    713:        if(screen->cur_row - screen->topline <= screen->max_row) {
                    714:            if(!AddToRefresh(screen)) {
                    715:        if(screen->scroll_amt)
                    716:                FlushScroll(screen);
                    717:                XFillRectangle(screen->display, TextWindow(screen),
                    718:                  screen->reverseGC,
                    719:                 CursorX(screen, screen->cur_col),
                    720:                 CursorY(screen, screen->cur_row),
                    721:                 Width(screen) - screen->cur_col * FontWidth(screen),
                    722:                 FontHeight(screen));
                    723:            }
                    724:        }
                    725:        bzero(screen->buf [2 * screen->cur_row] + screen->cur_col,
                    726:               (screen->max_col - screen->cur_col + 1));
                    727:        bzero(screen->buf [2 * screen->cur_row + 1] + screen->cur_col,
                    728:               (screen->max_col - screen->cur_col + 1));
                    729: }
                    730: 
                    731: /*
                    732:  * Clear first part of cursor's line, inclusive.
                    733:  */
                    734: ClearLeft (screen)
                    735: register TScreen *screen;
                    736: {
                    737:        if(screen->cursor_state)
                    738:                HideCursor();
                    739:        screen->do_wrap = 0;
                    740:        if(screen->cur_row - screen->topline <= screen->max_row) {
                    741:            if(!AddToRefresh(screen)) {
                    742:                if(screen->scroll_amt)
                    743:                        FlushScroll(screen);
                    744:                XFillRectangle (screen->display, TextWindow(screen),
                    745:                     screen->reverseGC,
                    746:                     screen->border + screen->scrollbar,
                    747:                      CursorY (screen, screen->cur_row),
                    748:                     (screen->cur_col + 1) * FontWidth(screen),
                    749:                     FontHeight(screen));
                    750:            }
                    751:        }
                    752:        bzero (screen->buf [2 * screen->cur_row], (screen->cur_col + 1));
                    753:        bzero (screen->buf [2 * screen->cur_row + 1], (screen->cur_col + 1));
                    754: }
                    755: 
                    756: /* 
                    757:  * Erase the cursor's line.
                    758:  */
                    759: ClearLine(screen)
                    760: register TScreen *screen;
                    761: {
                    762:        if(screen->cursor_state)
                    763:                HideCursor();
                    764:        screen->do_wrap = 0;
                    765:        if(screen->cur_row - screen->topline <= screen->max_row) {
                    766:            if(!AddToRefresh(screen)) {
                    767:                if(screen->scroll_amt)
                    768:                        FlushScroll(screen);
                    769:                XFillRectangle (screen->display, TextWindow(screen), 
                    770:                     screen->reverseGC,
                    771:                     screen->border + screen->scrollbar,
                    772:                      CursorY (screen, screen->cur_row),
                    773:                     Width(screen), FontHeight(screen));
                    774:            }
                    775:        }
                    776:        bzero (screen->buf [2 * screen->cur_row], (screen->max_col + 1));
                    777:        bzero (screen->buf [2 * screen->cur_row + 1], (screen->max_col + 1));
                    778: }
                    779: 
                    780: ClearScreen(screen)
                    781: register TScreen *screen;
                    782: {
                    783:        register int top;
                    784: 
                    785:        if(screen->cursor_state)
                    786:                HideCursor();
                    787:        screen->do_wrap = 0;
                    788:        if((top = -screen->topline) <= screen->max_row) {
                    789:                if(screen->scroll_amt)
                    790:                        FlushScroll(screen);
                    791:                if(top == 0)
                    792:                        XClearWindow(screen->display, TextWindow(screen));
                    793:                else
                    794:                        XClearArea(screen->display, TextWindow(screen),
                    795:                         screen->border + screen->scrollbar, 
                    796:                         top * FontHeight(screen) + screen->border,     
                    797:                         Width(screen), (screen->max_row - top + 1) *
                    798:                         FontHeight(screen), FALSE);
                    799:        }
                    800:        ClearBufRows (screen, 0, screen->max_row);
                    801: }
                    802: 
                    803: CopyWait(screen)
                    804: register TScreen *screen;
                    805: {
                    806:        XEvent reply;
                    807:        XEvent *rep = &reply;
                    808: 
                    809:        while (1) {
                    810:                XWindowEvent (screen->display, VWindow(screen), 
                    811:                  ExposureMask, &reply);
                    812:                switch (reply.type) {
                    813:                case Expose:
                    814:                        HandleExposure (screen, (XExposeEvent *) &reply);
                    815:                        break;
                    816:                case NoExpose:
                    817:                case GraphicsExpose:
                    818:                        if (screen->incopy <= 0) {
                    819:                                screen->incopy = 1;
                    820:                                if (screen->scrolls > 0)
                    821:                                        screen->scrolls--;
                    822:                        }
                    823:                        if (reply.type == GraphicsExpose)
                    824:                                HandleExposure (screen, (XExposeEvent *) &reply);
                    825: 
                    826:                        if ((reply.type == NoExpose) ||
                    827:                            ((XExposeEvent *)rep)->count == 0) {
                    828:                            if (screen->incopy <= 0 && screen->scrolls > 0)
                    829:                                screen->scrolls--;
                    830:                            if (screen->scrolls == 0) {
                    831:                                screen->incopy = 0;
                    832:                                return;
                    833:                            }
                    834:                            screen->incopy = -1;
                    835:                        }
                    836:                        break;
                    837:                }
                    838:        }
                    839: }
                    840: /*
                    841:  * This routine handles exposure events
                    842:  */
                    843: HandleExposure (screen, reply)
                    844: register TScreen *screen;
                    845: register XExposeEvent *reply;
                    846: {
                    847:        register int toprow, leftcol, nrows, ncols;
                    848:        extern Terminal term;   /* kludge */
                    849: 
                    850:        if((toprow = (reply->y - screen->border) /
                    851:         FontHeight(screen)) < 0)
                    852:                toprow = 0;
                    853:        if((leftcol = (reply->x - screen->border - screen->scrollbar)
                    854:         / FontWidth(screen)) < 0)
                    855:                leftcol = 0;
                    856:        nrows = (reply->y + reply->height - 1 - screen->border) / 
                    857:                FontHeight(screen) - toprow + 1;
                    858:        ncols =
                    859:         (reply->x + reply->width - 1 - screen->border - screen->scrollbar) /
                    860:                        FontWidth(screen) - leftcol + 1;
                    861:        toprow -= screen->scrolls;
                    862:        if (toprow < 0) {
                    863:                nrows += toprow;
                    864:                toprow = 0;
                    865:        }
                    866:        if (toprow + nrows - 1 > screen->max_row)
                    867:                nrows = screen->max_row - toprow + 1;
                    868:        if (leftcol + ncols - 1 > screen->max_col)
                    869:                ncols = screen->max_col - leftcol + 1;
                    870: 
                    871:        if (nrows > 0 && ncols > 0) {
                    872:                ScrnRefresh (screen, toprow, leftcol, nrows, ncols);
                    873:                if (screen->cur_row >= toprow &&
                    874:                    screen->cur_row < toprow + nrows &&
                    875:                    screen->cur_col >= leftcol &&
                    876:                    screen->cur_col < leftcol + ncols)
                    877:                        return (1);
                    878:        }
                    879:        return (0);
                    880: }
                    881: 
                    882: ReverseVideo (term)
                    883:        Terminal *term;
                    884: {
                    885:        register TScreen *screen = &term->screen;
                    886:        register GC tmpGC;
                    887:        register int tmp;
                    888:        register Window tek = TWindow(screen);
                    889: 
                    890:        tmp = screen->background;
                    891:        if(screen->cursorcolor == screen->foreground)
                    892:                screen->cursorcolor = tmp;
                    893:        if(screen->mousecolor == screen->foreground)
                    894:                screen->mousecolor = tmp;
                    895:        screen->background = screen->foreground;
                    896:        screen->foreground = tmp;
                    897: 
                    898:        tmpGC = screen->normalGC;
                    899:        screen->normalGC = screen->reverseGC;
                    900:        screen->reverseGC = tmpGC;
                    901: 
                    902:        tmpGC = screen->normalboldGC;
                    903:        screen->normalboldGC = screen->reverseboldGC;
                    904:        screen->reverseboldGC = tmpGC;
                    905: 
                    906:        screen->color = (screen->color & ~C_FBMASK) | switchfb[screen->color
                    907:         & C_FBMASK];
                    908: 
                    909: 
                    910:        XFreeCursor(screen->display, screen->curs);
                    911:        if (XStrCmp(curs_shape, "arrow") == 0) {
                    912:                screen->curs = make_arrow(screen->mousecolor, screen->background);
                    913:        } else {
                    914:                screen->curs = make_xterm(screen->mousecolor, screen->background);
                    915:        }
                    916:        XFreeCursor(screen->display, screen->arrow);
                    917:        screen->arrow = make_arrow(screen->mousecolor, screen->background);
                    918: 
                    919:        XDefineCursor(screen->display, TextWindow(screen), screen->curs);
                    920:        if(tek)
                    921:                XDefineCursor(screen->display, tek, screen->arrow);
                    922: #ifdef MODEMENU
                    923:        MenuNewCursor(screen->arrow);
                    924: #endif MODEMENU
                    925: 
                    926:        if (screen->borderwidth && screen->bordercolor == screen->background
                    927:         && (screen->foreground)) {
                    928:            screen->bordercolor = screen->foreground;
                    929:            XSetWindowBorder(screen->display, TextWindow(screen), screen->foreground);
                    930:            if(tek) {
                    931:                XSetWindowBorder(screen->display, tek,screen->foreground );
                    932:            }
                    933:        }
                    934: 
                    935:        if(screen->scrollWindow)
                    936:                ScrollBarReverseVideo(screen->scrollWindow);
                    937: 
                    938:        XSetWindowBackground(screen->display, TextWindow(screen), screen->background);
                    939:        if(tek) {
                    940:            TekReverseVideo(screen);
                    941:        }
                    942:        XClearWindow(screen->display, TextWindow(screen));
                    943:        ScrnRefresh (screen, 0, 0, screen->max_row + 1,
                    944:         screen->max_col + 1);
                    945:        if(screen->Tshow) {
                    946:            XClearWindow(screen->display, tek);
                    947:            TekExpose((XExposeEvent *) NULL);
                    948:        }
                    949: }

unix.superglobalmegacorp.com

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