Annotation of 43BSDTahoe/new/X/xterm/charproc.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  *     $Source: /u1/X/xterm/RCS/charproc.c,v $
                      3:  *     $Header: charproc.c,v 10.102 86/12/02 11:37:25 swick Exp $
                      4:  */
                      5: 
                      6: #include <X/mit-copyright.h>
                      7: 
                      8: /* Copyright (c) 1985 Massachusetts Institute of Technology            */
                      9: /* Copyright (c) 1985  Digital Equipment Corporation                   */
                     10: 
                     11: /* charproc.c */
                     12: 
                     13: #include <stdio.h>
                     14: #include <sgtty.h>
                     15: #include <ctype.h>
                     16: #include <errno.h>
                     17: #include <setjmp.h>
                     18: #include <sys/ioctl.h>
                     19: #include <sys/time.h>
                     20: #include <X/Xlib.h>
                     21: #include "scrollbar.h"
                     22: #include "ptyx.h"
                     23: #include "VTparse.h"
                     24: #include "data.h"
                     25: #include "error.h"
                     26: #ifdef MODEMENU
                     27: #include "menu.h"
                     28: #endif MODEMENU
                     29: 
                     30: #define        DEFAULT         -1
                     31: #define        TEXT_BUF_SIZE   256
                     32: 
                     33: #define        input()         (bcnt-- > 0 ? *bptr++ : in_put())
                     34: 
                     35: #ifndef lint
                     36: static char csrg_id[] = "@(#)charproc.c        1.6\t(Berkeley/CSRG)\t9/21/87";
                     37: static char sccs_id[] = "@(#)charproc.c\tX10/6.6B\t1/9/87";
                     38: #endif lint
                     39: 
                     40: static long arg;
                     41: static int ch;
                     42: static int nparam;
                     43: static ANSI reply;
                     44: static int param[NPARAM];
                     45: 
                     46: static unsigned long ctotal;
                     47: static unsigned long ntotal;
                     48: static jmp_buf vtjmpbuf;
                     49: 
                     50: extern int groundtable[];
                     51: extern int csitable[];
                     52: extern int dectable[];
                     53: extern int eigtable[];
                     54: extern int esctable[];
                     55: extern int iestable[];
                     56: extern int igntable[];
                     57: extern int scrtable[];
                     58: extern int scstable[];
                     59: 
                     60: VTparse()
                     61: {
                     62:        register Screen *screen = &term.screen;
                     63:        register int *parsestate = groundtable;
                     64:        register int c;
                     65:        register char *cp;
                     66:        register int row, col, top, bot, scstype;
                     67:        WindowInfo wininfo;
                     68:        extern int bitset(), bitclr(), finput();
                     69: 
                     70:        if(setjmp(vtjmpbuf))
                     71:                parsestate = groundtable;
                     72:        for( ; ; )
                     73:                switch(parsestate[c = input()]) {
                     74:                 case CASE_GROUND_STATE:
                     75:                        /* exit ignore mode */
                     76:                        parsestate = groundtable;
                     77:                        break;
                     78: 
                     79:                 case CASE_IGNORE_STATE:
                     80:                        /* Ies: ignore anything else */
                     81:                        parsestate = igntable;
                     82:                        break;
                     83: 
                     84:                 case CASE_IGNORE_ESC:
                     85:                        /* Ign: escape */
                     86:                        parsestate = iestable;
                     87:                        break;
                     88: 
                     89:                 case CASE_IGNORE:
                     90:                        /* Ignore character */
                     91:                        break;
                     92: 
                     93:                 case CASE_BELL:
                     94:                        /* bell */
                     95:                        Bell();
                     96:                        break;
                     97: 
                     98:                 case CASE_BS:
                     99:                        /* backspace */
                    100:                        CursorBack(screen, 1);
                    101:                        break;
                    102: 
                    103:                 case CASE_CR:
                    104:                        /* carriage return */
                    105:                        CarriageReturn(screen);
                    106:                        break;
                    107: 
                    108:                 case CASE_ESC:
                    109:                        /* escape */
                    110:                        parsestate = esctable;
                    111:                        break;
                    112: 
                    113:                 case CASE_VMOT:
                    114:                        /*
                    115:                         * form feed, line feed, vertical tab, but not in
                    116:                         * status line
                    117:                         */
                    118:                        if(!screen->instatus)
                    119:                                Index(screen, 1);
                    120:                        if (term.flags & LINEFEED)
                    121:                                CarriageReturn(screen);
                    122:                        if(screen->display->qlen > 0 ||
                    123:                         (ioctl(screen->display->fd, FIONREAD, &arg), arg) > 0)
                    124:                                xevents();
                    125:                        break;
                    126: 
                    127:                 case CASE_TAB:
                    128:                        /* tab */
                    129:                        screen->cur_col = TabNext(term.tabs, screen->cur_col);
                    130:                        if (screen->cur_col > screen->max_col)
                    131:                                screen->cur_col = screen->max_col;
                    132:                        break;
                    133: 
                    134:                 case CASE_SI:
                    135:                        screen->curgl = 0;
                    136:                        break;
                    137: 
                    138:                 case CASE_SO:
                    139:                        screen->curgl = 1;
                    140:                        break;
                    141: 
                    142:                 case CASE_SCR_STATE:
                    143:                        /* enter scr state */
                    144:                        parsestate = scrtable;
                    145:                        break;
                    146: 
                    147:                 case CASE_SCS0_STATE:
                    148:                        /* enter scs state 0 */
                    149:                        scstype = 0;
                    150:                        parsestate = scstable;
                    151:                        break;
                    152: 
                    153:                 case CASE_SCS1_STATE:
                    154:                        /* enter scs state 1 */
                    155:                        scstype = 1;
                    156:                        parsestate = scstable;
                    157:                        break;
                    158: 
                    159:                 case CASE_SCS2_STATE:
                    160:                        /* enter scs state 2 */
                    161:                        scstype = 2;
                    162:                        parsestate = scstable;
                    163:                        break;
                    164: 
                    165:                 case CASE_SCS3_STATE:
                    166:                        /* enter scs state 3 */
                    167:                        scstype = 3;
                    168:                        parsestate = scstable;
                    169:                        break;
                    170: 
                    171:                 case CASE_ESC_IGNORE:
                    172:                        /* unknown escape sequence */
                    173:                        parsestate = eigtable;
                    174:                        break;
                    175: 
                    176:                 case CASE_ESC_DIGIT:
                    177:                        /* digit in csi or dec mode */
                    178:                        if((row = param[nparam - 1]) == DEFAULT)
                    179:                                row = 0;
                    180:                        param[nparam - 1] = 10 * row + (c - '0');
                    181:                        break;
                    182: 
                    183:                 case CASE_ESC_SEMI:
                    184:                        /* semicolon in csi or dec mode */
                    185:                        param[nparam++] = DEFAULT;
                    186:                        break;
                    187: 
                    188:                 case CASE_DEC_STATE:
                    189:                        /* enter dec mode */
                    190:                        parsestate = dectable;
                    191:                        break;
                    192: 
                    193:                 case CASE_ICH:
                    194:                        /* ICH */
                    195:                        if((c = param[0]) < 1)
                    196:                                c = 1;
                    197:                        InsertChar(screen, c);
                    198:                        parsestate = groundtable;
                    199:                        break;
                    200: 
                    201:                 case CASE_CUU:
                    202:                        /* CUU */
                    203:                        /* only if not in status line */
                    204:                        if(!screen->instatus) {
                    205:                                if((c = param[0]) < 1)
                    206:                                        c = 1;
                    207:                                CursorUp(screen, c);
                    208:                        }
                    209:                        parsestate = groundtable;
                    210:                        break;
                    211: 
                    212:                 case CASE_CUD:
                    213:                        /* CUD */
                    214:                        /* only if not in status line */
                    215:                        if(!screen->instatus) {
                    216:                                if((c = param[0]) < 1)
                    217:                                        c = 1;
                    218:                                CursorDown(screen, c);
                    219:                        }
                    220:                        parsestate = groundtable;
                    221:                        break;
                    222: 
                    223:                 case CASE_CUF:
                    224:                        /* CUF */
                    225:                        if((c = param[0]) < 1)
                    226:                                c = 1;
                    227:                        CursorForward(screen, c);
                    228:                        parsestate = groundtable;
                    229:                        break;
                    230: 
                    231:                 case CASE_CUB:
                    232:                        /* CUB */
                    233:                        if((c = param[0]) < 1)
                    234:                                c = 1;
                    235:                        CursorBack(screen, c);
                    236:                        parsestate = groundtable;
                    237:                        break;
                    238: 
                    239:                 case CASE_CUP:
                    240:                        /* CUP | HVP */
                    241:                        /* only if not in status line */
                    242:                        if(!screen->instatus) {
                    243:                                if((row = param[0]) < 1)
                    244:                                        row = 1;
                    245:                                if(nparam < 2 || (col = param[1]) < 1)
                    246:                                        col = 1;
                    247:                                CursorSet(screen, row-1, col-1, term.flags);
                    248:                        }
                    249:                        parsestate = groundtable;
                    250:                        break;
                    251: 
                    252:                 case CASE_ED:
                    253:                        /* ED */
                    254:                        switch (param[0]) {
                    255:                         case DEFAULT:
                    256:                         case 0:
                    257:                                if(screen->instatus)
                    258:                                        ClearRight(screen);
                    259:                                else
                    260:                                        ClearBelow(screen);
                    261:                                break;
                    262: 
                    263:                         case 1:
                    264:                                if(screen->instatus)
                    265:                                        ClearLeft(screen);
                    266:                                else
                    267:                                        ClearAbove(screen);
                    268:                                break;
                    269: 
                    270:                         case 2:
                    271:                                if(screen->instatus)
                    272:                                        ClearLine(screen);
                    273:                                else
                    274:                                        ClearScreen(screen);
                    275:                                break;
                    276:                        }
                    277:                        parsestate = groundtable;
                    278:                        break;
                    279: 
                    280:                 case CASE_EL:
                    281:                        /* EL */
                    282:                        switch (param[0]) {
                    283:                         case DEFAULT:
                    284:                         case 0:
                    285:                                ClearRight(screen);
                    286:                                break;
                    287:                         case 1:
                    288:                                ClearLeft(screen);
                    289:                                break;
                    290:                         case 2:
                    291:                                ClearLine(screen);
                    292:                                break;
                    293:                        }
                    294:                        parsestate = groundtable;
                    295:                        break;
                    296: 
                    297:                 case CASE_IL:
                    298:                        /* IL */
                    299:                        /* only if not in status line */
                    300:                        if(!screen->instatus) {
                    301:                                if((c = param[0]) < 1)
                    302:                                        c = 1;
                    303:                                InsertLine(screen, c);
                    304:                        }
                    305:                        parsestate = groundtable;
                    306:                        break;
                    307: 
                    308:                 case CASE_DL:
                    309:                        /* DL */
                    310:                        /* only if not in status line */
                    311:                        if(!screen->instatus) {
                    312:                                if((c = param[0]) < 1)
                    313:                                        c = 1;
                    314:                                DeleteLine(screen, c);
                    315:                        }
                    316:                        parsestate = groundtable;
                    317:                        break;
                    318: 
                    319:                 case CASE_DCH:
                    320:                        /* DCH */
                    321:                        if((c = param[0]) < 1)
                    322:                                c = 1;
                    323:                        DeleteChar(screen, c);
                    324:                        parsestate = groundtable;
                    325:                        break;
                    326: 
                    327:                 case CASE_DA1:
                    328:                        /* DA1 */
                    329:                        if (param[0] <= 0) {    /* less than means DEFAULT */
                    330:                                reply.a_type   = CSI;
                    331:                                reply.a_pintro = '?';
                    332:                                reply.a_nparam = 2;
                    333:                                reply.a_param[0] = 1;           /* VT102 */
                    334:                                reply.a_param[1] = 2;           /* VT102 */
                    335:                                reply.a_inters = 0;
                    336:                                reply.a_final  = 'c';
                    337:                                unparseseq(&reply, screen->respond);
                    338:                        }
                    339:                        parsestate = groundtable;
                    340:                        break;
                    341: 
                    342:                 case CASE_TBC:
                    343:                        /* TBC */
                    344:                        if ((c = param[0]) <= 0) /* less than means default */
                    345:                                TabClear(term.tabs, screen->cur_col);
                    346:                        else if (c == 3)
                    347:                                TabZonk(term.tabs);
                    348:                        parsestate = groundtable;
                    349:                        break;
                    350: 
                    351:                 case CASE_SET:
                    352:                        /* SET */
                    353:                        modes(&term, bitset);
                    354:                        parsestate = groundtable;
                    355:                        break;
                    356: 
                    357:                 case CASE_RST:
                    358:                        /* RST */
                    359:                        modes(&term, bitclr);
                    360:                        parsestate = groundtable;
                    361:                        break;
                    362: 
                    363:                 case CASE_SGR:
                    364:                        /* SGR */
                    365:                        for (c=0; c<nparam; ++c) {
                    366:                                switch (param[c]) {
                    367:                                 case DEFAULT:
                    368:                                 case 0:
                    369:                                        term.flags &= ~(INVERSE|BOLD|UNDERLINE);
                    370:                                        break;
                    371:                                 case 1:
                    372:                                 case 5:        /* Blink, really.       */
                    373:                                        term.flags |= BOLD;
                    374:                                        break;
                    375:                                 case 4:        /* Underscore           */
                    376:                                        term.flags |= UNDERLINE;
                    377:                                        break;
                    378:                                 case 7:
                    379:                                        term.flags |= INVERSE;
                    380:                                }
                    381:                        }
                    382:                        parsestate = groundtable;
                    383:                        break;
                    384: 
                    385:                 case CASE_CPR:
                    386:                        /* CPR */
                    387:                        if ((c = param[0]) == 5) {
                    388:                                reply.a_type = CSI;
                    389:                                reply.a_pintro = 0;
                    390:                                reply.a_nparam = 1;
                    391:                                reply.a_param[0] = 0;
                    392:                                reply.a_inters = 0;
                    393:                                reply.a_final  = 'n';
                    394:                                unparseseq(&reply, screen->respond);
                    395:                        } else if (c == 6) {
                    396:                                reply.a_type = CSI;
                    397:                                reply.a_pintro = 0;
                    398:                                reply.a_nparam = 2;
                    399:                                reply.a_param[0] = screen->cur_row+1;
                    400:                                reply.a_param[1] = screen->cur_col+1;
                    401:                                reply.a_inters = 0;
                    402:                                reply.a_final  = 'R';
                    403:                                unparseseq(&reply, screen->respond);
                    404:                        }
                    405:                        parsestate = groundtable;
                    406:                        break;
                    407: 
                    408:                 case CASE_DECSTBM:
                    409:                        /* DECSTBM */
                    410:                        /* only if not in status line */
                    411:                        if(!screen->instatus) {
                    412:                                if((top = param[0]) < 1)
                    413:                                        top = 1;
                    414:                                if(nparam < 2 || (bot = param[1]) == DEFAULT
                    415:                                   || bot > screen->max_row + 1
                    416:                                   || bot == 0)
                    417:                                        bot = screen->max_row+1;
                    418:                                if (bot > top) {
                    419:                                        if(screen->scroll_amt)
                    420:                                                FlushScroll(screen);
                    421:                                        screen->top_marg = top-1;
                    422:                                        screen->bot_marg = bot-1;
                    423:                                        CursorSet(screen, 0, 0, term.flags);
                    424:                                }
                    425:                        }
                    426:                        parsestate = groundtable;
                    427:                        break;
                    428: 
                    429:                 case CASE_SUN_EMU:
                    430:                        /* sub-set of sun tty emulation */
                    431:                        switch(param[0]) {
                    432:                         case 3:        /* move window */
                    433:                                if(nparam == 3) {
                    434:                                        XMoveWindow(VWindow(screen), param[2],
                    435:                                         param[1]);
                    436:                                        XSync(FALSE);   /* synchronize */
                    437:                                        if(QLength() > 0)
                    438:                                                xevents();
                    439:                                }
                    440:                                break;
                    441:                         case 4:        /* resize window (pixels) */
                    442:                                if(nparam == 3) {
                    443:                                        XChangeWindow (VWindow(screen), param[1],
                    444:                                         param[2]);
                    445:                                        XSync(FALSE);   /* synchronize */
                    446:                                        if(QLength() > 0)
                    447:                                                xevents();
                    448:                                }
                    449:                                break;
                    450:                         case 5:        /* raise window */
                    451:                                XRaiseWindow(VWindow(screen));
                    452:                                break;
                    453:                         case 6:        /* lower window */
                    454:                                XLowerWindow(VWindow(screen));
                    455:                                break;
                    456:                         case 7:        /* redisplay window */
                    457:                                Redraw();
                    458:                                break;
                    459:                         case 8:        /* resize window (rows and columns) */
                    460:                                if(nparam == 3) {
                    461:                                        XChangeWindow (VWindow(screen),
                    462:                                         FontWidth(screen) * param[2] +
                    463:                                         2 * screen->border + screen->scrollbar,
                    464:                                         FontHeight(screen) * param[1] +
                    465:                                         screen->statusheight + Titlebar(screen)
                    466:                                         + 2 * screen->border);
                    467:                                        XSync(FALSE);   /* synchronize */
                    468:                                        if(QLength() > 0)
                    469:                                                xevents();
                    470:                                }
                    471:                                break;
                    472:                         case 13:       /* send window position */
                    473:                                XQueryWindow(VWindow(screen), &wininfo);
                    474:                                reply.a_type = CSI;
                    475:                                reply.a_pintro = 0;
                    476:                                reply.a_nparam = 3;
                    477:                                reply.a_param[0] = 3;
                    478:                                reply.a_param[1] = wininfo.y;
                    479:                                reply.a_param[2] = wininfo.x;
                    480:                                reply.a_inters = 0;
                    481:                                reply.a_final  = 't';
                    482:                                unparseseq(&reply, screen->respond);
                    483:                                break;
                    484:                         case 14:       /* send window size (pixels) */
                    485:                                reply.a_type = CSI;
                    486:                                reply.a_pintro = 0;
                    487:                                reply.a_nparam = 3;
                    488:                                reply.a_param[0] = 4;
                    489:                                reply.a_param[1] = (screen->max_col + 1) *
                    490:                                 FontWidth(screen) + 2 * screen->border +
                    491:                                 screen->scrollbar;
                    492:                                reply.a_param[2] = (screen->max_row + 1) *
                    493:                                 FontHeight(screen) + screen->statusheight +
                    494:                                 Titlebar(screen) + 2 * screen->border;
                    495:                                reply.a_inters = 0;
                    496:                                reply.a_final  = 't';
                    497:                                unparseseq(&reply, screen->respond);
                    498:                                break;
                    499:                         case 18:       /* send window size (rows and cols) */
                    500:                                reply.a_type = CSI;
                    501:                                reply.a_pintro = 0;
                    502:                                reply.a_nparam = 3;
                    503:                                reply.a_param[0] = 8;
                    504:                                reply.a_param[1] = screen->max_row + 1;
                    505:                                reply.a_param[2] = screen->max_col + 1;
                    506:                                reply.a_inters = 0;
                    507:                                reply.a_final  = 't';
                    508:                                unparseseq(&reply, screen->respond);
                    509:                                break;
                    510:                        }
                    511:                        parsestate = groundtable;
                    512:                        break;
                    513: 
                    514:                 case CASE_DECREQTPARM:
                    515:                        /* DECREQTPARM */
                    516:                        if ((c = param[0]) == DEFAULT)
                    517:                                c = 0;
                    518:                        if (c == 0 || c == 1) {
                    519:                                reply.a_type = CSI;
                    520:                                reply.a_pintro = 0;
                    521:                                reply.a_nparam = 7;
                    522:                                reply.a_param[0] = c + 2;
                    523:                                reply.a_param[1] = 1;   /* no parity */
                    524:                                reply.a_param[2] = 1;   /* eight bits */
                    525:                                reply.a_param[3] = 112; /* transmit 9600 baud */
                    526:                                reply.a_param[4] = 112; /* receive 9600 baud */
                    527:                                reply.a_param[5] = 1;   /* clock multiplier ? */
                    528:                                reply.a_param[6] = 0;   /* STP flags ? */
                    529:                                reply.a_inters = 0;
                    530:                                reply.a_final  = 'x';
                    531:                                unparseseq(&reply, screen->respond);
                    532:                        }
                    533:                        parsestate = groundtable;
                    534:                        break;
                    535: 
                    536:                 case CASE_DECSET:
                    537:                        /* DECSET */
                    538:                        dpmodes(&term, bitset);
                    539:                        parsestate = groundtable;
                    540:                        if(screen->TekEmu)
                    541:                                return;
                    542:                        break;
                    543: 
                    544:                 case CASE_DECRST:
                    545:                        /* DECRST */
                    546:                        dpmodes(&term, bitclr);
                    547:                        parsestate = groundtable;
                    548:                        break;
                    549: 
                    550:                 case CASE_HIDDEN:
                    551:                        /* special "hidden" sequence */
                    552:                        fprintf(stderr, "avg call = %ld char\n", ctotal/ntotal);
                    553:                        parsestate = groundtable;
                    554:                        break;
                    555: 
                    556:                 case CASE_DECALN:
                    557:                        /* DECALN */
                    558:                        if(screen->cursor_state)
                    559:                                HideCursor();
                    560:                        for(row = screen->max_row ; row >= 0 ; row--) {
                    561:                                bzero(screen->buf[2 * row + 1],
                    562:                                 col = screen->max_col + 1);
                    563:                                for(cp = screen->buf[2 * row] ; col > 0 ; col--)
                    564:                                        *cp++ = 'E';
                    565:                        }
                    566:                        ScrnRefresh(screen, 0, 0, screen->max_row + 1,
                    567:                         screen->max_col + 1);
                    568:                        parsestate = groundtable;
                    569:                        break;
                    570: 
                    571:                 case CASE_GSETS:
                    572:                        screen->gsets[scstype] = c;
                    573:                        parsestate = groundtable;
                    574:                        break;
                    575: 
                    576:                 case CASE_DECSC:
                    577:                        /* DECSC */
                    578:                        CursorSave(&term, &screen->sc);
                    579:                        parsestate = groundtable;
                    580:                        break;
                    581: 
                    582:                 case CASE_DECRC:
                    583:                        /* DECRC */
                    584:                        CursorRestore(&term, &screen->sc);
                    585:                        parsestate = groundtable;
                    586:                        break;
                    587: 
                    588:                 case CASE_DECKPAM:
                    589:                        /* DECKPAM */
                    590:                        term.keyboard.flags |= KYPD_APL;
                    591:                        parsestate = groundtable;
                    592:                        break;
                    593: 
                    594:                 case CASE_DECKPNM:
                    595:                        /* DECKPNM */
                    596:                        term.keyboard.flags &= ~KYPD_APL;
                    597:                        parsestate = groundtable;
                    598:                        break;
                    599: 
                    600:                 case CASE_IND:
                    601:                        /* IND */
                    602:                        /* only if not in status line */
                    603:                        if(!screen->instatus)
                    604:                                Index(screen, 1);
                    605:                        if(screen->display->qlen > 0 ||
                    606:                         (ioctl(screen->display->fd, FIONREAD, &arg), arg) > 0)
                    607:                                xevents();
                    608:                        parsestate = groundtable;
                    609:                        break;
                    610: 
                    611:                 case CASE_NEL:
                    612:                        /* NEL */
                    613:                        /* only if not in status line */
                    614:                        if(!screen->instatus)
                    615:                                Index(screen, 1);
                    616:                        CarriageReturn(screen);
                    617:                        if(screen->display->qlen > 0 ||
                    618:                         (ioctl(screen->display->fd, FIONREAD, &arg), arg) > 0)
                    619:                                xevents();
                    620:                        parsestate = groundtable;
                    621:                        break;
                    622: 
                    623:                 case CASE_HTS:
                    624:                        /* HTS */
                    625:                        TabSet(term.tabs, screen->cur_col);
                    626:                        parsestate = groundtable;
                    627:                        break;
                    628: 
                    629:                 case CASE_RI:
                    630:                        /* RI */
                    631:                        /* only if not in status line */
                    632:                        if(!screen->instatus)
                    633:                                RevIndex(screen, 1);
                    634:                        parsestate = groundtable;
                    635:                        break;
                    636: 
                    637:                 case CASE_SS2:
                    638:                        /* SS2 */
                    639:                        screen->curss = 2;
                    640:                        parsestate = groundtable;
                    641:                        break;
                    642: 
                    643:                 case CASE_SS3:
                    644:                        /* SS3 */
                    645:                        screen->curss = 3;
                    646:                        parsestate = groundtable;
                    647:                        break;
                    648: 
                    649:                 case CASE_CSI_STATE:
                    650:                        /* enter csi state */
                    651:                        nparam = 1;
                    652:                        param[0] = DEFAULT;
                    653:                        parsestate = csitable;
                    654:                        break;
                    655: 
                    656:                 case CASE_OSC:
                    657:                        /* do osc escapes */
                    658:                        do_osc(finput);
                    659:                        parsestate = groundtable;
                    660:                        break;
                    661: 
                    662:                 case CASE_RIS:
                    663:                        /* RIS */
                    664:                        VTReset(TRUE);
                    665:                        parsestate = groundtable;
                    666:                        break;
                    667: 
                    668:                 case CASE_LS2:
                    669:                        /* LS2 */
                    670:                        screen->curgl = 2;
                    671:                        parsestate = groundtable;
                    672:                        break;
                    673: 
                    674:                 case CASE_LS3:
                    675:                        /* LS3 */
                    676:                        screen->curgl = 3;
                    677:                        parsestate = groundtable;
                    678:                        break;
                    679: 
                    680:                 case CASE_LS3R:
                    681:                        /* LS3R */
                    682:                        screen->curgr = 3;
                    683:                        parsestate = groundtable;
                    684:                        break;
                    685: 
                    686:                 case CASE_LS2R:
                    687:                        /* LS2R */
                    688:                        screen->curgr = 2;
                    689:                        parsestate = groundtable;
                    690:                        break;
                    691: 
                    692:                 case CASE_LS1R:
                    693:                        /* LS1R */
                    694:                        screen->curgr = 1;
                    695:                        parsestate = groundtable;
                    696:                        break;
                    697: 
                    698:                 case CASE_TO_STATUS:
                    699:                        if((c = param[0]) < 1)
                    700:                                c = 1;
                    701:                        ToStatus(c - 1);
                    702:                        parsestate = groundtable;
                    703:                        break;
                    704: 
                    705:                 case CASE_FROM_STATUS:
                    706:                        FromStatus();
                    707:                        parsestate = groundtable;
                    708:                        break;
                    709: 
                    710:                 case CASE_SHOW_STATUS:
                    711:                        ShowStatus();
                    712:                        parsestate = groundtable;
                    713:                        break;
                    714: 
                    715:                 case CASE_HIDE_STATUS:
                    716:                        HideStatus();
                    717:                        parsestate = groundtable;
                    718:                        break;
                    719: 
                    720:                 case CASE_ERASE_STATUS:
                    721:                        EraseStatus();
                    722:                        parsestate = groundtable;
                    723:                        break;
                    724: 
                    725:                 case CASE_XTERM_SAVE:
                    726:                        savemodes(&term);
                    727:                        parsestate = groundtable;
                    728:                        break;
                    729: 
                    730:                 case CASE_XTERM_RESTORE:
                    731:                        restoremodes(&term);
                    732:                        parsestate = groundtable;
                    733:                        break;
                    734: 
                    735:                 case CASE_PRINT:
                    736:                        /* printable characters */
                    737:                        top = bcnt > TEXT_BUF_SIZE ? TEXT_BUF_SIZE : bcnt;
                    738:                        cp = bptr;
                    739:                        *--bptr = c;
                    740:                        while(top > 0 && isprint(*cp)) {
                    741:                                top--;
                    742:                                bcnt--;
                    743:                                cp++;
                    744:                        }
                    745:                        if(screen->curss) {
                    746:                                dotext(screen, term.flags,
                    747:                                 screen->gsets[screen->curss], bptr, bptr + 1);
                    748:                                screen->curss = 0;
                    749:                                bptr++;
                    750:                        }
                    751:                        if(bptr < cp)
                    752:                                dotext(screen, term.flags,
                    753:                                 screen->gsets[screen->curgl], bptr, cp);
                    754:                        bptr = cp;
                    755:                        break;
                    756:                }
                    757: }
                    758: 
                    759: finput()
                    760: {
                    761:        return(input());
                    762: }
                    763: 
                    764: static int select_mask;
                    765: 
                    766: in_put()
                    767: {
                    768:        register Screen *screen = &term.screen;
                    769:        register char *cp;
                    770:        register int i;
                    771: 
                    772:        select_mask = pty_mask; /* force initial read */
                    773:        for( ; ; ) {
                    774:                if(select_mask & pty_mask) {
                    775:                        if(screen->logging)
                    776:                                FlushLog(screen);
                    777:                        if((bcnt = read(screen->respond, bptr = buffer,
                    778:                         BUF_SIZE)) < 0) {
                    779:                                if(errno == EIO && am_slave)
                    780:                                        exit(0);
                    781:                                else if(errno != EWOULDBLOCK)
                    782:                                        Panic(
                    783:                                 "input: read returned unexpected error (%d)\n",
                    784:                                         errno);
                    785:                        } else if(bcnt == 0)
                    786:                                Panic("input: read returned zero\n");
                    787:                        else {
                    788:                                /* strip parity bit */
                    789:                                for(i = bcnt, cp = bptr ; i > 0 ; i--)
                    790:                                        *cp++ &= CHAR;
                    791:                                if(screen->sb && screen->scrollinput &&
                    792:                                 screen->topline < 0)
                    793:                                        ScrollToBottom(screen->sb);
                    794:                                if(screen->icon_show && !screen->iconinput) {
                    795:                                        screen->iconinput = TRUE;
                    796:                                        IconBox(screen);
                    797:                                }
                    798:                                break;
                    799:                        }
                    800:                }
                    801:                if(screen->scroll_amt)
                    802:                        FlushScroll(screen);
                    803:                if(screen->cursor_set && (screen->cursor_col != screen->cur_col
                    804:                 || screen->cursor_row != screen->cur_row)) {
                    805:                        if(screen->cursor_state)
                    806:                                HideCursor();
                    807:                        ShowCursor();
                    808:                } else if(screen->cursor_set != screen->cursor_state) {
                    809:                        if(screen->cursor_set)
                    810:                                ShowCursor();
                    811:                        else
                    812:                                HideCursor();
                    813:                }
                    814: 
                    815:                /* Window select/unselect */
                    816:                if (doonalarmcode)
                    817:                        onalarmcode();
                    818: 
                    819:                if(QLength())
                    820:                        select_mask = X_mask;
                    821:                else {
                    822:                        XFlush();
                    823:                        select_mask = Select_mask;
                    824:                        if((i = select(max_plus1, &select_mask, NULL, NULL,
                    825:                         screen->timeout)) < 0){
                    826:                                if (errno != EINTR)
                    827:                                        SysError(ERROR_SELECT);
                    828:                                continue;
                    829:                        } else if(i == 0) {
                    830:                                if(GetButtonState(screen->sb) & HILITED)
                    831:                                        WindowScroll(screen,
                    832:                                         ButtonRegion(screen->sb));
                    833:                                screen->timeout->tv_usec = STEPTIME;
                    834:                                continue;
                    835:                        }
                    836:                }
                    837:                if(select_mask & X_mask)
                    838:                        xevents();
                    839:        }
                    840:        bcnt--;
                    841:        return(*bptr++);
                    842: }
                    843: 
                    844: /*
                    845:  * process a string of characters according to the character set indicated
                    846:  * by charset.  worry about end of line conditions (wraparound if selected).
                    847:  */
                    848: dotext(screen, flags, charset, buf, ptr)
                    849: register Screen        *screen;
                    850: unsigned       flags;
                    851: char           charset;
                    852: char   *buf;
                    853: char   *ptr;
                    854: {
                    855:        register char   *s;
                    856:        register int    len;
                    857:        register int    n;
                    858:        register int    next_col;
                    859: 
                    860:        switch (charset) {
                    861:        case 'A':       /* United Kingdom set                           */
                    862:                for (s=buf; s<ptr; ++s)
                    863:                        if (*s == '#')
                    864:                                *s = '\036';    /* UK pound sign        */
                    865:                break;
                    866: 
                    867:        case 'B':       /* ASCII set                                    */
                    868:                break;
                    869: 
                    870:        case '0':       /* special graphics (line drawing)              */
                    871:                for (s=buf; s<ptr; ++s)
                    872:                        if (*s>=0x5f && *s<=0x7e)
                    873:                                *s = *s == 0x5f ? 0x7f : *s - 0x5f;
                    874:                break;
                    875: 
                    876:        default:        /* any character sets we don't recognize        */
                    877:                return;
                    878:        }
                    879: 
                    880:        len = ptr - buf; 
                    881:        ptr = buf;
                    882:        while (len > 0) {
                    883:                n = screen->max_col-screen->cur_col+1;
                    884:                if (n <= 1) {
                    885:                        if (screen->do_wrap && (flags&WRAPAROUND) &&
                    886:                         !screen->instatus) {
                    887:                                Index(screen, 1);
                    888:                                screen->cur_col = 0;
                    889:                                screen->do_wrap = 0;
                    890:                                n = screen->max_col+1;
                    891:                        } else
                    892:                                n = 1;
                    893:                }
                    894:                if (len < n)
                    895:                        n = len;
                    896:                next_col = screen->cur_col + n;
                    897:                WriteText(screen, ptr, n, flags);
                    898:                /*
                    899:                 * the call to WriteText updates screen->cur_col.
                    900:                 * If screen->cur_col != next_col, we must have
                    901:                 * hit the right margin, so set the do_wrap flag.
                    902:                 */
                    903:                screen->do_wrap = (screen->cur_col < next_col);
                    904:                len -= n;
                    905:                ptr += n;
                    906:        }
                    907: }
                    908:  
                    909: /*
                    910:  * write a string str of length len onto the screen at
                    911:  * the current cursor position.  update cursor position.
                    912:  */
                    913: WriteText(screen, str, len, flags)
                    914: register Screen        *screen;
                    915: register char  *str;
                    916: register int   len;
                    917: unsigned       flags;
                    918: {
                    919:        register int pix, cx, cy;
                    920:        register unsigned fgs = flags;
                    921:        Font    fnt;
                    922:  
                    923:    if(screen->instatus && screen->reversestatus)
                    924:        fgs ^= INVERSE;
                    925:    if(screen->cur_row - screen->topline <= screen->max_row ||
                    926:      screen->instatus) {
                    927:        /*
                    928:        if(screen->cur_row == screen->cursor_row && screen->cur_col <=
                    929:         screen->cursor_col && screen->cursor_col <= screen->cur_col + len - 1)
                    930:                screen->cursor_state = OFF;
                    931:         */
                    932:        if(screen->cursor_state)
                    933:                HideCursor();
                    934:        fnt = ActiveIcon(screen) ? screen->fnt_icon
                    935:              : (fgs & BOLD) ? screen->fnt_bold : screen->fnt_norm;
                    936:        if (fgs & INSERT)
                    937:                InsertChar(screen, len);
                    938:       if (!(AddToRefresh(screen))) {
                    939:                if(screen->scroll_amt)
                    940:                        FlushScroll(screen);
                    941:        cx = CursorX(screen, screen->cur_col);
                    942:        cy = CursorY(screen, screen->cur_row);
                    943:        if (screen->show || ActiveIcon(screen)) {
                    944:            if (fgs & INVERSE)
                    945:                XText(VWindow(screen), cx, cy, str, len, fnt,
                    946:                 pix = screen->background, screen->foreground);
                    947:            else
                    948:                XText(VWindow(screen), cx, cy, str, len, fnt,
                    949:                 pix = screen->foreground, screen->background);
                    950:            if((fgs & BOLD) && screen->enbolden)
                    951:                XTextMask(VWindow(screen), cx + 1, cy, str, len, fnt, pix);
                    952:            if(fgs & UNDERLINE) {
                    953:                cy += FontHeight(screen) - 2;
                    954:                XLine(VWindow(screen), cx, cy, cx + len * FontWidth(screen),
                    955:                 cy, 1, 1, pix, GXcopy, AllPlanes);
                    956:            }
                    957:        }
                    958:        /*
                    959:         * the following statements compile data to compute the average 
                    960:         * number of characters written on each call to XText.  The data
                    961:         * may be examined via the use of a "hidden" escape sequence.
                    962:         */
                    963:        ctotal += len;
                    964:        ++ntotal;
                    965:       }
                    966:     }
                    967:        ScreenWrite(screen, str, flags, len);
                    968:        CursorForward(screen, len);
                    969: }
                    970:  
                    971: /*
                    972:  * process ANSI modes set, reset
                    973:  */
                    974: modes(term, func)
                    975: Terminal       *term;
                    976: int            (*func)();
                    977: {
                    978:        register Screen *screen = &term->screen;
                    979:        register int    i;
                    980: 
                    981:        for (i=0; i<nparam; ++i) {
                    982:                switch (param[i]) {
                    983:                case 4:                 /* IRM                          */
                    984:                        (*func)(&term->flags, INSERT);
                    985:                        break;
                    986: 
                    987:                case 20:                /* LNM                          */
                    988:                        (*func)(&term->flags, LINEFEED);
                    989:                        break;
                    990:                }
                    991:        }
                    992: }
                    993: 
                    994: /*
                    995:  * process DEC private modes set, reset
                    996:  */
                    997: dpmodes(term, func)
                    998: Terminal       *term;
                    999: int            (*func)();
                   1000: {
                   1001:        register Screen *screen = &term->screen;
                   1002:        register int    i, j;
                   1003:        extern int bitset();
                   1004: 
                   1005:        for (i=0; i<nparam; ++i) {
                   1006:                switch (param[i]) {
                   1007:                case 1:                 /* DECCKM                       */
                   1008:                        (*func)(&term->keyboard.flags, CURSOR_APL);
                   1009:                        break;
                   1010:                case 3:                 /* DECCOLM                      */
                   1011:                        if(screen->c132) {
                   1012:                                ClearScreen(screen);
                   1013:                                CursorSet(screen, 0, 0, term->flags);
                   1014:                                if((j = func == bitset ? 132 : 80) !=
                   1015:                                 ((term->flags & IN132COLUMNS) ? 132 : 80) ||
                   1016:                                 j != screen->max_col + 1) {
                   1017:                                        XChangeWindow (VWindow(screen),
                   1018:                                         FontWidth(screen) * j + 2*screen->border
                   1019:                                         + screen->scrollbar,
                   1020:                                         FontHeight(screen) * (screen->max_row
                   1021:                                         + 1) + screen->statusheight +
                   1022:                                         Titlebar(screen) + 2 * screen->border);
                   1023:                                        XSync(FALSE);   /* synchronize */
                   1024:                                        if(QLength() > 0)
                   1025:                                                xevents();
                   1026:                                }
                   1027:                                (*func)(&term->flags, IN132COLUMNS);
                   1028:                        }
                   1029:                        break;
                   1030:                case 4:                 /* DECSCLM (slow scroll)        */
                   1031:                        if (func == bitset) {
                   1032:                                screen->jumpscroll = 0;
                   1033:                                if (screen->scroll_amt)
                   1034:                                        FlushScroll(screen);
                   1035:                        } else
                   1036:                                screen->jumpscroll = 1;
                   1037:                        (*func)(&term->flags, SMOOTHSCROLL);
                   1038:                        break;
                   1039:                case 5:                 /* DECSCNM                      */
                   1040:                        j = term->flags;
                   1041:                        (*func)(&term->flags, REVERSE_VIDEO);
                   1042:                        if ((term->flags ^ j) & REVERSE_VIDEO)
                   1043:                                ReverseVideo(term);
                   1044:                        break;
                   1045: 
                   1046:                case 6:                 /* DECOM                        */
                   1047:                        (*func)(&term->flags, ORIGIN);
                   1048:                        CursorSet(screen, 0, 0, term->flags);
                   1049:                        break;
                   1050: 
                   1051:                case 7:                 /* DECAWM                       */
                   1052:                        (*func)(&term->flags, WRAPAROUND);
                   1053:                        break;
                   1054:                case 8:                 /* DECARM                       */
                   1055:                        j = term->flags;
                   1056:                        (*func)(&term->flags, AUTOREPEAT);
                   1057:                        if ((term->flags ^ j) & AUTOREPEAT)
                   1058:                                if(term->flags & AUTOREPEAT)
                   1059:                                        XAutoRepeatOn();
                   1060:                                else
                   1061:                                        XAutoRepeatOff();
                   1062:                        break;
                   1063:                case 9:                 /* MIT bogus sequence           */
                   1064:                        (*func)(&screen->send_mouse_pos, 1);
                   1065:                        break;
                   1066:                case 38:                /* DECTEK                       */
                   1067:                        if(func == bitset & !(screen->inhibit & I_TEK)) {
                   1068:                                if(screen->logging) {
                   1069:                                        FlushLog(screen);
                   1070:                                        screen->logstart = Tbuffer;
                   1071:                                }
                   1072:                                screen->TekEmu = TRUE;
                   1073:                        }
                   1074:                        break;
                   1075:                case 40:                /* 132 column mode              */
                   1076:                        (*func)(&screen->c132, 1);
                   1077:                        break;
                   1078:                case 41:                /* curses hack                  */
                   1079:                        (*func)(&screen->curses, 1);
                   1080:                        break;
                   1081:                case 42:                /* scrollbar                    */
                   1082:                        if(func == bitset)
                   1083:                                ScrollBarOn(screen, TRUE, FALSE);
                   1084:                        else
                   1085:                                ScrollBarOff(screen);
                   1086:                        break;
                   1087:                case 43:                /* lines off top                */
                   1088:                        if(screen->sb)
                   1089:                                SetSaveState(screen->sb, (func == bitset));
                   1090:                        break;
                   1091:                case 44:                /* margin bell                  */
                   1092:                        (*func)(&screen->marginbell, 1);
                   1093:                        if(!screen->marginbell)
                   1094:                                screen->bellarmed = -1;
                   1095:                        break;
                   1096:                case 45:                /* reverse wraparound   */
                   1097:                        (*func)(&term->flags, REVERSEWRAP);
                   1098:                        break;
                   1099:                case 46:                /* logging              */
                   1100:                        if(func == bitset)
                   1101:                                StartLog(screen);
                   1102:                        else
                   1103:                                CloseLog(screen);
                   1104:                        break;
                   1105:                case 47:                /* alternate buffer             */
                   1106:                        if(func == bitset)
                   1107:                                ToAlternate(screen);
                   1108:                        else
                   1109:                                FromAlternate(screen);
                   1110:                        break;
                   1111:                case 48:                /* reverse status line  */
                   1112:                        j = screen->reversestatus;
                   1113:                        (*func)(&screen->reversestatus, 1);
                   1114:                        if(j != screen->reversestatus)
                   1115:                                ScrnRefresh(screen, screen->max_row + 1, 0, 1,
                   1116:                                 screen->max_col + 1);
                   1117:                        break;
                   1118:                case 49:                /* page mode            */
                   1119:                        j = screen->pagemode;
                   1120:                        (*func)(&screen->pagemode, 1);
                   1121:                        if(!j && screen->pagemode)
                   1122:                                screen->pagecnt = 0;
                   1123:                        break;
                   1124:                }
                   1125:        }
                   1126: }
                   1127: 
                   1128: /*
                   1129:  * process xterm private modes save
                   1130:  */
                   1131: savemodes(term)
                   1132: Terminal *term;
                   1133: {
                   1134:        register Screen *screen = &term->screen;
                   1135:        register int i;
                   1136: 
                   1137:        for (i = 0; i < nparam; i++) {
                   1138:                switch (param[i]) {
                   1139:                case 1:                 /* DECCKM                       */
                   1140:                        screen->save_modes[0] = term->keyboard.flags &
                   1141:                         CURSOR_APL;
                   1142:                        break;
                   1143:                case 3:                 /* DECCOLM                      */
                   1144:                        if(screen->c132)
                   1145:                                screen->save_modes[1] = term->flags &
                   1146:                                 IN132COLUMNS;
                   1147:                        break;
                   1148:                case 4:                 /* DECSCLM (slow scroll)        */
                   1149:                        screen->save_modes[2] = term->flags & SMOOTHSCROLL;
                   1150:                        break;
                   1151:                case 5:                 /* DECSCNM                      */
                   1152:                        screen->save_modes[3] = term->flags & REVERSE_VIDEO;
                   1153:                        break;
                   1154:                case 6:                 /* DECOM                        */
                   1155:                        screen->save_modes[4] = term->flags & ORIGIN;
                   1156:                        break;
                   1157: 
                   1158:                case 7:                 /* DECAWM                       */
                   1159:                        screen->save_modes[5] = term->flags & WRAPAROUND;
                   1160:                        break;
                   1161:                case 8:                 /* DECARM                       */
                   1162:                        screen->save_modes[6] = term->flags & AUTOREPEAT;
                   1163:                        break;
                   1164:                case 9:                 /* MIT bogus sequence           */
                   1165:                        screen->save_modes[7] = screen->send_mouse_pos;
                   1166:                        break;
                   1167:                case 40:                /* 132 column mode              */
                   1168:                        screen->save_modes[8] = screen->c132;
                   1169:                        break;
                   1170:                case 41:                /* curses hack                  */
                   1171:                        screen->save_modes[9] = screen->curses;
                   1172:                        break;
                   1173:                case 42:                /* scrollbar                    */
                   1174:                        screen->save_modes[10] = screen->scrollbar;
                   1175:                        break;
                   1176:                case 43:                /* lines off top                */
                   1177:                        if(screen->sb)
                   1178:                                screen->save_modes[11] =
                   1179:                                 GetSaveState(screen->sb);
                   1180:                        break;
                   1181:                case 44:                /* margin bell                  */
                   1182:                        screen->save_modes[12] = screen->marginbell;
                   1183:                        break;
                   1184:                case 45:                /* reverse wraparound   */
                   1185:                        screen->save_modes[13] = term->flags & REVERSEWRAP;
                   1186:                        break;
                   1187:                case 46:                /* logging              */
                   1188:                        screen->save_modes[14] = screen->logging;
                   1189:                        break;
                   1190:                case 47:                /* alternate buffer             */
                   1191:                        screen->save_modes[15] = screen->alternate;
                   1192:                        break;
                   1193:                case 48:                /* reverse status line          */
                   1194:                        screen->save_modes[16] = screen->reversestatus;
                   1195:                        break;
                   1196:                case 49:                /* page mode                    */
                   1197:                        screen->save_modes[17] = screen->pagemode;
                   1198:                        screen->save_modes[18] = screen->pagecnt;
                   1199:                        break;
                   1200:                }
                   1201:        }
                   1202: }
                   1203: 
                   1204: /*
                   1205:  * process xterm private modes restore
                   1206:  */
                   1207: restoremodes(term)
                   1208: Terminal *term;
                   1209: {
                   1210:        register Screen *screen = &term->screen;
                   1211:        register int i, j;
                   1212: 
                   1213:        for (i = 0; i < nparam; i++) {
                   1214:                switch (param[i]) {
                   1215:                case 1:                 /* DECCKM                       */
                   1216:                        term->keyboard.flags &= ~CURSOR_APL;
                   1217:                        term->keyboard.flags |= screen->save_modes[0] &
                   1218:                         CURSOR_APL;
                   1219:                        break;
                   1220:                case 3:                 /* DECCOLM                      */
                   1221:                        if(screen->c132) {
                   1222:                                ClearScreen(screen);
                   1223:                                CursorSet(screen, 0, 0, term->flags);
                   1224:                                if((j = (screen->save_modes[1] & IN132COLUMNS)
                   1225:                                 ? 132 : 80) != ((term->flags & IN132COLUMNS)
                   1226:                                 ? 132 : 80) || j != screen->max_col + 1) {
                   1227:                                        XChangeWindow (VWindow(screen),
                   1228:                                         FontWidth(screen) * j + 2*screen->border
                   1229:                                         + screen->scrollbar,
                   1230:                                         FontHeight(screen) * (screen->max_row
                   1231:                                         + 1) + screen->statusheight +
                   1232:                                         Titlebar(screen) + 2 * screen->border);
                   1233:                                        XSync(FALSE);   /* synchronize */
                   1234:                                        if(QLength() > 0)
                   1235:                                                xevents();
                   1236:                                }
                   1237:                                term->flags &= ~IN132COLUMNS;
                   1238:                                term->flags |= screen->save_modes[1] &
                   1239:                                 IN132COLUMNS;
                   1240:                        }
                   1241:                        break;
                   1242:                case 4:                 /* DECSCLM (slow scroll)        */
                   1243:                        if (screen->save_modes[2] & SMOOTHSCROLL) {
                   1244:                                screen->jumpscroll = 0;
                   1245:                                if (screen->scroll_amt)
                   1246:                                        FlushScroll(screen);
                   1247:                        } else
                   1248:                                screen->jumpscroll = 1;
                   1249:                        term->flags &= ~SMOOTHSCROLL;
                   1250:                        term->flags |= screen->save_modes[2] & SMOOTHSCROLL;
                   1251:                        break;
                   1252:                case 5:                 /* DECSCNM                      */
                   1253:                        if((screen->save_modes[3] ^ term->flags) &
                   1254:                         REVERSE_VIDEO) {
                   1255:                                term->flags &= ~REVERSE_VIDEO;
                   1256:                                term->flags |= screen->save_modes[3] &
                   1257:                                 REVERSE_VIDEO;
                   1258:                                ReverseVideo(term);
                   1259:                        }
                   1260:                        break;
                   1261:                case 6:                 /* DECOM                        */
                   1262:                        term->flags &= ~ORIGIN;
                   1263:                        term->flags |= screen->save_modes[4] & ORIGIN;
                   1264:                        CursorSet(screen, 0, 0, term->flags);
                   1265:                        break;
                   1266: 
                   1267:                case 7:                 /* DECAWM                       */
                   1268:                        term->flags &= ~WRAPAROUND;
                   1269:                        term->flags |= screen->save_modes[5] & WRAPAROUND;
                   1270:                        break;
                   1271:                case 8:                 /* DECARM                       */
                   1272:                        if((screen->save_modes[6] ^ term->flags) & AUTOREPEAT) {
                   1273:                                term->flags &= ~REVERSE_VIDEO;
                   1274:                                term->flags |= screen->save_modes[6] &
                   1275:                                 REVERSE_VIDEO;
                   1276:                                if(term->flags & AUTOREPEAT)
                   1277:                                        XAutoRepeatOn();
                   1278:                                else
                   1279:                                        XAutoRepeatOff();
                   1280:                        }
                   1281:                        break;
                   1282:                case 9:                 /* MIT bogus sequence           */
                   1283:                        screen->send_mouse_pos = screen->save_modes[7];
                   1284:                        break;
                   1285:                case 40:                /* 132 column mode              */
                   1286:                        screen->c132 = screen->save_modes[8];
                   1287:                        break;
                   1288:                case 41:                /* curses hack                  */
                   1289:                        screen->curses = screen->save_modes[9];
                   1290:                        break;
                   1291:                case 42:                /* scrollbar                    */
                   1292:                        if(screen->save_modes[10])
                   1293:                                ScrollBarOn(screen, TRUE, FALSE);
                   1294:                        else
                   1295:                                ScrollBarOff(screen);
                   1296:                        break;
                   1297:                case 43:                /* lines off top                */
                   1298:                        if(screen->sb)
                   1299:                                SetSaveState(screen->sb,screen->save_modes[11]);
                   1300:                        break;
                   1301:                case 44:                /* margin bell                  */
                   1302:                        if(!(screen->marginbell = screen->save_modes[12]))
                   1303:                                screen->bellarmed = -1;
                   1304:                        break;
                   1305:                case 45:                /* reverse wraparound   */
                   1306:                        term->flags &= ~REVERSEWRAP;
                   1307:                        term->flags |= screen->save_modes[13] & REVERSEWRAP;
                   1308:                        break;
                   1309:                case 46:                /* logging              */
                   1310:                        if(screen->save_modes[14])
                   1311:                                StartLog(screen);
                   1312:                        else
                   1313:                                CloseLog(screen);
                   1314:                        break;
                   1315:                case 47:                /* alternate buffer             */
                   1316:                        if(screen->save_modes[15])
                   1317:                                ToAlternate(screen);
                   1318:                        else
                   1319:                                FromAlternate(screen);
                   1320:                        break;
                   1321:                case 48:                /* reverse status line          */
                   1322:                        if(screen->save_modes[16] != screen->reversestatus) {
                   1323:                                screen->reversestatus = 
                   1324:                                 screen->save_modes[16];
                   1325:                                ScrnRefresh(screen, screen->max_row + 1, 0, 1,
                   1326:                                 screen->max_col + 1);
                   1327:                        }
                   1328:                        break;
                   1329:                case 49:                /* page mode                    */
                   1330:                        screen->pagemode = screen->save_modes[17];
                   1331:                        screen->pagecnt = screen->save_modes[18];
                   1332:                        break;
                   1333:                }
                   1334:        }
                   1335: }
                   1336: 
                   1337: /*
                   1338:  * set a bit in a word given a pointer to the word and a mask.
                   1339:  */
                   1340: bitset(p, mask)
                   1341: int    *p;
                   1342: {
                   1343:        *p |= mask;
                   1344: }
                   1345: 
                   1346: /*
                   1347:  * clear a bit in a word given a pointer to the word and a mask.
                   1348:  */
                   1349: bitclr(p, mask)
                   1350: int    *p;
                   1351: {
                   1352:        *p &= ~mask;
                   1353: }
                   1354: 
                   1355: unparseseq(ap, fd)
                   1356: register ANSI  *ap;
                   1357: {
                   1358:        register int    c;
                   1359:        register int    i;
                   1360:        register int    inters;
                   1361: 
                   1362:        c = ap->a_type;
                   1363:        if (c>=0x80 && c<=0x9F) {
                   1364:                unparseputc(ESC, fd);
                   1365:                c -= 0x40;
                   1366:        }
                   1367:        unparseputc(c, fd);
                   1368:        c = ap->a_type;
                   1369:        if (c==ESC || c==DCS || c==CSI || c==OSC || c==PM || c==APC) {
                   1370:                if (ap->a_pintro != 0)
                   1371:                        unparseputc(ap->a_pintro, fd);
                   1372:                for (i=0; i<ap->a_nparam; ++i) {
                   1373:                        if (i != 0)
                   1374:                                unparseputc(';', fd);
                   1375:                        unparseputn(ap->a_param[i], fd);
                   1376:                }
                   1377:                inters = ap->a_inters;
                   1378:                for (i=3; i>=0; --i)
                   1379:                        c = (inters >> (8*i)) & 0xff;
                   1380:                        if (c != 0)
                   1381:                                unparseputc(c, fd);
                   1382:                unparseputc(ap->a_final, fd);
                   1383:        }
                   1384: }
                   1385: 
                   1386: unparseputn(n, fd)
                   1387: unsigned int   n;
                   1388: {
                   1389:        unsigned int    q;
                   1390: 
                   1391:        q = n/10;
                   1392:        if (q != 0)
                   1393:                unparseputn(q, fd);
                   1394:        unparseputc((n%10) + '0', fd);
                   1395: }
                   1396: 
                   1397: unparseputc(c, fd)
                   1398: {
                   1399:        char    buf[2];
                   1400:        register i = 1;
                   1401:        extern Terminal term;
                   1402: 
                   1403:        if((buf[0] = c) == '\r' && (term.flags & LINEFEED)) {
                   1404:                buf[1] = '\n';
                   1405:                i++;
                   1406:        }
                   1407:        if (write(fd, buf, i) != i)
                   1408:                Panic("unparseputc: error writing character\n", 0);
                   1409: }
                   1410: 
                   1411: static int alt_pagecnt;
                   1412: static int alt_pagemode;
                   1413: static int alt_saving;
                   1414: 
                   1415: ToAlternate(screen)
                   1416: register Screen *screen;
                   1417: {
                   1418:        extern ScrnBuf Allocate();
                   1419: 
                   1420:        if(screen->alternate)
                   1421:                return;
                   1422:        if(!screen->altbuf)
                   1423:                screen->altbuf = Allocate(screen->max_row + 1, screen->max_col
                   1424:                 + 1);
                   1425:        if(screen->sb) {
                   1426:                alt_saving = GetSaveState(screen->sb);
                   1427:                SetSaveState(screen->sb, FALSE);
                   1428:        } else
                   1429:                alt_saving = TRUE;
                   1430:        if(alt_pagemode = screen->pagemode)
                   1431:                alt_pagecnt = screen->pagecnt;
                   1432:        screen->pagemode = FALSE;
                   1433:        SwitchBufs(screen);
                   1434:        screen->alternate = TRUE;
                   1435: }
                   1436: 
                   1437: FromAlternate(screen)
                   1438: register Screen *screen;
                   1439: {
                   1440:        if(!screen->alternate)
                   1441:                return;
                   1442:        screen->alternate = FALSE;
                   1443:        if(screen->sb)
                   1444:                SetSaveState(screen->sb, alt_saving);
                   1445:        if(screen->pagemode = alt_pagemode)
                   1446:                screen->pagecnt = alt_pagecnt;
                   1447:        SwitchBufs(screen);
                   1448: }
                   1449: 
                   1450: SwitchBufs(screen)
                   1451: register Screen *screen;
                   1452: {
                   1453:        register int rows, top;
                   1454:        char *save [2 * MAX_ROWS];
                   1455: 
                   1456:        if(screen->cursor_state)
                   1457:                HideCursor();
                   1458:        rows = screen->max_row + 1;
                   1459:        bcopy((char *)screen->buf, (char *)save, 2 * sizeof(char *) * rows);
                   1460:        bcopy((char *)screen->altbuf, (char *)screen->buf, 2 * sizeof(char *) *
                   1461:         rows);
                   1462:        bcopy((char *)save, (char *)screen->altbuf, 2 * sizeof(char *) * rows);
                   1463: 
                   1464:        if((top = -screen->topline) <= screen->max_row) {
                   1465:                if(screen->scroll_amt)
                   1466:                        FlushScroll(screen);
                   1467:                if(top == 0 && !screen->statusline)
                   1468:                        XClear(VWindow(screen));
                   1469:                else
                   1470:                        XTileSet(VWindow(screen), screen->border, top *
                   1471:                         FontHeight(screen) + screen->border + Titlebar(screen),
                   1472:                         Width(screen), (screen->max_row - top + 1) *
                   1473:                         FontHeight(screen), screen->bgndtile);
                   1474:        }
                   1475:        ScrnRefresh(screen, 0, 0, rows, screen->max_col + 1);
                   1476: }
                   1477: 
                   1478: VTRun()
                   1479: {
                   1480:        register Screen *screen = &term.screen;
                   1481:        register int i;
                   1482:        
                   1483:        if(!VWindow(screen) && !VTInit()) {
                   1484:                if(TWindow(screen)) {
                   1485:                        screen->TekEmu = TRUE;
                   1486:                        return;
                   1487:                }
                   1488:                Exit(ERROR_VINIT);
                   1489:        }
                   1490:        screen->cursor_state = OFF;
                   1491:        screen->cursor_set = ON;
                   1492:        if(screen->icon_show) {
                   1493:                if(screen->icon_show < 0) {
                   1494:                        screen->icon_show = TRUE;
                   1495:                        screen->mappedVwin = &screen->iconVwin;
                   1496:                        XMapWindow(screen->iconVwin.window);
                   1497:                }
                   1498:        } else if(!screen->show) {
                   1499:                screen->show = TRUE;
                   1500:                screen->mappedVwin = &screen->fullVwin;
                   1501:                XMapWindow(VWindow(screen));
                   1502:        } else
                   1503:                XRaiseWindow(VWindow(screen));
                   1504:        if(screen->select)
                   1505:                VTSelect();
                   1506:        if (L_flag > 0) {
                   1507:                XWarpMouse (VWindow(screen),
                   1508:                            FullWidth(screen) >> 1, FullHeight(screen) >>1);
                   1509:                L_flag = -1;
                   1510:        }
                   1511:        bcnt = 0;
                   1512:        bptr = buffer;
                   1513:        while(Tpushb > Tpushback) {
                   1514:                *bptr++ = *--Tpushb;
                   1515:                bcnt++;
                   1516:        }
                   1517:        bcnt += (i = Tbcnt);
                   1518:        for( ; i > 0 ; i--)
                   1519:                *bptr++ = *Tbptr++;
                   1520:        bptr = buffer;
                   1521:        if(!setjmp(VTend))
                   1522:                VTparse();
                   1523:        HideCursor();
                   1524:        screen->cursor_set = OFF;
                   1525:        VTUnselect();
                   1526: }
                   1527: 
                   1528: VTInit()
                   1529: {
                   1530:        int width, height;
                   1531:        FontInfo *fInfo, *ifInfo;
                   1532:        register Screen *screen = &term.screen;
                   1533:        register Vertex *vp;
                   1534:        register int i, j;
                   1535:        char *def = "=80x24+1+1";
                   1536:        char iconname[128];
                   1537:        static short failed;
                   1538:        Color cdef;
                   1539:        OpaqueFrame twindow;
                   1540:        WindowInfo wininfo;
                   1541:        int x, y;
                   1542:        Window win;
                   1543:        extern char *malloc();
                   1544: 
                   1545:        if(failed)
                   1546:                return(FALSE);
                   1547:        
                   1548:        screen->mappedVwin = &screen->fullVwin;
                   1549: 
                   1550:        TabReset (term.tabs);
                   1551: 
                   1552:        screen->fnt_norm = screen->fnt_bold = screen->fnt_icon = NULL;
                   1553:           
                   1554:        if ((fInfo = XOpenFont(f_n)) == NULL) {
                   1555:                fprintf(stderr, "%s: Could not open font %s!\n",
                   1556:                        xterm_name, f_n);
                   1557:                failed = TRUE;
                   1558:                return(FALSE);
                   1559:        }
                   1560:        screen->fnt_norm = fInfo->id;
                   1561:        if (!f_b || !(screen->fnt_bold = XGetFont(f_b))) {
                   1562:                screen->fnt_bold = screen->fnt_norm;
                   1563:                screen->enbolden = TRUE;
                   1564:        }
                   1565:        screen->fullVwin.f_width = fInfo->width;
                   1566:        screen->fullVwin.f_height = fInfo->height;
                   1567:        
                   1568:        if (screen->active_icon) {
                   1569:            if (!screen->fnt_icon) {
                   1570:                if ((ifInfo = XOpenFont(f_i)) == NULL) {
                   1571:                    fprintf( stderr, "%s: Could not open font %s!\n",
                   1572:                             xterm_name, f_i);
                   1573:                    failed = TRUE;
                   1574:                    return( FALSE );
                   1575:                }
                   1576:                screen->fnt_icon = ifInfo->id;
                   1577:            } else
                   1578:                XQueryFont( screen->fnt_icon, &ifInfo );
                   1579: 
                   1580:            screen->iconVwin.f_width = ifInfo->width;
                   1581:            screen->iconVwin.f_height = ifInfo->height;
                   1582:        }
                   1583: 
                   1584:        /* X11 arrow cursor feature */
                   1585:        if (curs_shape && strcmp(curs_shape, "arrow") == 0)
                   1586:                screen->curs = make_arrow(screen->mousecolor,
                   1587:                    screen->background, GXcopy);
                   1588:        else
                   1589:                screen->curs = make_xterm(screen->mousecolor,
                   1590:                    screen->background, GXcopy);
                   1591: 
                   1592:        twindow.bdrwidth = screen->borderwidth;
                   1593:        if(grayborder)
                   1594:                twindow.border = screen->graybordertile;
                   1595:        else
                   1596:                twindow.border = screen->bordertile;
                   1597:        twindow.background = screen->bgndtile;
                   1598:        if((screen->minrows = (MINSCROLLBARHEIGHT - 2 * screen->border +
                   1599:         fInfo->height - 1) / fInfo->height) < 0)
                   1600:                screen->minrows = 0;
                   1601: 
                   1602:        i = 2 * screen->border + screen->scrollbar;
                   1603:        j = 2 * screen->border + Titlebar(screen);
                   1604:        if(screen->statusline)
                   1605:                j += (screen->statusheight = fInfo->height + 2);
                   1606: 
                   1607:        if((screen->fullVwin.window = XCreateTerm ("Terminal Emulator", xterm_name,
                   1608:         geo_metry, def, &twindow, 12, screen->minrows, i, j, &width, &height,
                   1609:         fInfo, fInfo->width, fInfo->height)) == NULL) {
                   1610:                fprintf(stderr, "%s: Can't create VT window\n");
                   1611:                XCloseFont(fInfo);
                   1612:                return(FALSE);
                   1613:        }
                   1614:        XSelectInput(VWindow(screen), WINDOWEVENTS);
                   1615:        /*
                   1616:         * XCreateTerm flushes all events, which might include an EnterWindow
                   1617:         * or LeaveWindow.  So if the cursor is not where it is supposed to
                   1618:         * be, we set select to the appropriate thing.
                   1619:         */
                   1620:        if(TWindow(screen) && XQueryMouse(RootWindow, &x, &y, &win)) {
                   1621:                if(screen->timer) {
                   1622:                        Timer(0L);
                   1623:                        screen->timer = 0;
                   1624:                }
                   1625:                if(win == TWindow(screen))
                   1626:                        screen->select |= INWINDOW;
                   1627:                else
                   1628:                        screen->select &= ~INWINDOW;
                   1629:        }
                   1630: 
                   1631:        screen->fullVwin.fullwidth = twindow.width;
                   1632:        screen->fullVwin.fullheight = twindow.height;
                   1633:        screen->fullVwin.width = twindow.width - i;
                   1634:        screen->fullVwin.height = twindow.height - j;
                   1635: 
                   1636:        /* Reset variables used by ANSI emulation. */
                   1637: 
                   1638:        screen->gsets[0] = 'B';                 /* ASCII_G              */
                   1639:        screen->gsets[1] = 'B';
                   1640:        screen->gsets[2] = 'B';                 /* DEC supplemental.    */
                   1641:        screen->gsets[3] = 'B';
                   1642:        screen->curgl = 0;                      /* G0 => GL.            */
                   1643:        screen->curgr = 2;                      /* G2 => GR.            */
                   1644:        screen->curss = 0;                      /* No single shift.     */
                   1645: 
                   1646:        if(screen->iconTwin.window) {
                   1647:                XQueryWindow(screen->iconTwin.window, &wininfo);
                   1648:                x = wininfo.x;
                   1649:                y = wininfo.y;
                   1650:        } else {
                   1651:                x = twindow.x + (twindow.width - screen->iconVwin.width) / 2;
                   1652:                y = twindow.y + (twindow.height - screen->iconVwin.height) / 2;
                   1653:                IconGeometry(screen, &x, &y);
                   1654:        }
                   1655:        screen->iconVwin.window =
                   1656:                XCreateWindow( RootWindow, x, y, 1, 1, screen->borderwidth,
                   1657:                               screen->bordertile, screen->bgndtile );
                   1658: 
                   1659:        XSetIconWindow( screen->fullVwin.window, screen->iconVwin.window );
                   1660: 
                   1661:        XDefineCursor( screen->iconVwin.window, screen->arrow );
                   1662:        XSelectInput( screen->iconVwin.window,
                   1663:                      screen->active_icon && (term.flags & ICONINPUT)
                   1664:                        ? ICONWINDOWEVENTS | ICONINPUTEVENTS
                   1665:                        : ICONWINDOWEVENTS );
                   1666: 
                   1667:        XDefineCursor( VWindow(screen), screen->curs );
                   1668:        XStoreName (VWindow(screen), screen->winname);
                   1669:        strcpy(iconname, screen->winname);
                   1670:        strcat(iconname, " (icon)");
                   1671:        XStoreName (screen->iconVwin.window, iconname);
                   1672:        XSetResizeHint (VWindow(screen), 2 * screen->border + screen->scrollbar,
                   1673:         2 * screen->border + Titlebar(screen) + screen->statusheight,
                   1674:         fInfo->width, fInfo->height);
                   1675: 
                   1676:        screen->cur_col = screen->cur_row = 0;
                   1677:        screen->max_col = Width(screen)  / fInfo->width - 1;
                   1678:        screen->top_marg = 0;
                   1679:        screen->bot_marg = screen->max_row = Height(screen) / fInfo->height - 1;
                   1680: 
                   1681:        screen->sc.row = screen->sc.col = screen->sc.flags = NULL;
                   1682: 
                   1683:        SetIconSize( screen );          /* requires max_col, max_row */
                   1684: 
                   1685:        /* allocate memory for screen buffer (including one for status line */
                   1686:        screen->buf = screen->allbuf = (ScrnBuf) Allocate (screen->max_row + 2,
                   1687:                                          screen->max_col +1);
                   1688: 
                   1689:        screen->do_wrap = NULL;
                   1690:        screen->scrolls = screen->incopy = 0;
                   1691:        free((char *)fInfo);
                   1692:        vp = &VTbox[1];
                   1693:        (vp++)->x = FontWidth(screen) - 1;
                   1694:        (vp++)->y = FontHeight(screen) - 1;
                   1695:        (vp++)->x = -(FontWidth(screen) - 1);
                   1696:        vp->y = -(FontHeight(screen) - 1);
                   1697:        screen->box = VTbox;
                   1698:        status_box[0].x = screen->border - 1;
                   1699:        screen->savelines = save_lines;
                   1700:        if(screen->scrollbar) {
                   1701:                screen->scrollbar = 0;
                   1702:                ScrollBarOn(screen, TRUE, TRUE);
                   1703:                screen->sb->action = NONE;
                   1704:        }
                   1705:        screen->nmarginbell = n_marginbell;
                   1706:        if(Titlebar(screen))
                   1707:                VTTitleShow(TRUE);
                   1708:        CursorSave(&term, &screen->sc);
                   1709:        return(TRUE);
                   1710: }
                   1711: 
                   1712: #ifdef CHANGEFONT
                   1713: VTChangeFont(screen, newfname)
                   1714:        register Screen *screen;
                   1715:        char *newfname;
                   1716: {
                   1717:        register Vertex *vp;
                   1718:        FontInfo *fInfo;
                   1719:        register width, height, border, extra;
                   1720: 
                   1721:        /* Make sure we can get the new font */
                   1722:        if ((fInfo = XOpenFont(newfname)) == NULL)
                   1723:                return(FALSE);
                   1724: 
                   1725:        /* Disallow variable fonts with no average sizes for now */
                   1726:        if (fInfo->width == 0 || fInfo->height == 0) {
                   1727:                XCloseFont(fInfo);
                   1728:                return(FALSE);
                   1729:        }
                   1730: 
                   1731:        /* Destroy old font */
                   1732:        XFreeFont(screen->fnt_norm);
                   1733: 
                   1734:        screen->fnt_norm = fInfo->id;
                   1735: 
                   1736:        if (screen->enbolden)
                   1737:                screen->fnt_bold = screen->fnt_norm;
                   1738: 
                   1739:        XSetResizeHint (VWindow(screen), 2 * screen->border + screen->scrollbar,
                   1740:         2 * screen->border + Titlebar(screen) + screen->statusheight,
                   1741:         fInfo->width, fInfo->height);
                   1742: 
                   1743:        screen->fullVwin.f_width = fInfo->width;
                   1744:        screen->fullVwin.f_height = fInfo->height;
                   1745: 
                   1746:        free((char *)fInfo);
                   1747: 
                   1748:        width = FontWidth(screen) * (screen->max_col + 1);
                   1749:        height = FontHeight(screen) * (screen->max_row + 1);
                   1750:        border = 2 * screen->border;
                   1751:        extra = Titlebar(screen) + screen->statusheight;
                   1752: 
                   1753:        screen->fullVwin.fullwidth = width;
                   1754:        screen->fullVwin.fullheight = height;
                   1755:        screen->fullVwin.height = height - extra;
                   1756:        screen->fullVwin.width = width;
                   1757: 
                   1758:        vp = &VTbox[1];
                   1759:        (vp++)->x = FontWidth(screen) - 1;
                   1760:        (vp++)->y = FontHeight(screen) - 1;
                   1761:        (vp++)->x = -(FontWidth(screen) - 1);
                   1762:        vp->y = -(FontHeight(screen) - 1);
                   1763: 
                   1764:        if(screen->sb)
                   1765:                ResizeScrollBar(screen->sb, width - SCROLLBARWIDTH,
                   1766:                    Titlebar(screen) - 1, height - Titlebar(screen),
                   1767:                    screen->max_row + 1);
                   1768:        if(screen->title.tbar)
                   1769:                VTTitleResize(width);
                   1770: 
                   1771:        return(TRUE);
                   1772: }
                   1773: #endif
                   1774: 
                   1775: VTExpose(rep)
                   1776: register XExposeWindowEvent *rep;
                   1777: {
                   1778:        register Screen *screen = &term.screen;
                   1779: 
                   1780:        if (rep && ScreenResize (screen, rep->width, rep->height, &term.flags)
                   1781:         == -1)
                   1782:                return;
                   1783:        XClear (VWindow(screen));
                   1784:        ScrnRefresh(screen, 0, 0, screen->max_row + 1 + screen->statusline,
                   1785:         screen->max_col + 1);
                   1786: }
                   1787: 
                   1788: /*
                   1789:  * Shows cursor at new cursor position in screen.
                   1790:  */
                   1791: ShowCursor()
                   1792: {
                   1793:        register Screen *screen = &term.screen;
                   1794:        register int fg;
                   1795:        register int bg;
                   1796:        register int x, y, flags;
                   1797:        register Font fnt;
                   1798:        char c;
                   1799: 
                   1800:        if (screen->icon_show && !screen->active_icon) return;
                   1801: 
                   1802:        if(!screen->instatus && screen->cur_row - screen->topline >
                   1803:         screen->max_row)
                   1804:                return;
                   1805:        c = screen->buf[y = 2 * (screen->cursor_row = screen->cur_row)]
                   1806:         [x = screen->cursor_col = screen->cur_col];
                   1807:        flags = screen->buf[y + 1][x];
                   1808:        if (c == 0)
                   1809:                c = ' ';
                   1810:        if(screen->instatus)
                   1811:                flags ^= INVERSE;
                   1812:        if(screen->select) {
                   1813:                if(flags & INVERSE) {
                   1814:                        if(screen->cursorcolor != screen->foreground) {
                   1815:                                fg = screen->foreground;
                   1816:                                bg = screen->cursorcolor;
                   1817:                        } else {
                   1818:                                fg = screen->foreground;
                   1819:                                bg = screen->background;
                   1820:                        }
                   1821:                } else {
                   1822:                        fg = screen->background;
                   1823:                        bg = screen->cursorcolor;
                   1824:                }
                   1825:        } else {
                   1826:                if(flags & INVERSE) {
                   1827:                        fg = screen->background;
                   1828:                        bg = screen->foreground;
                   1829:                } else {
                   1830:                        fg = screen->foreground;
                   1831:                        bg = screen->background;
                   1832:                }
                   1833:        }
                   1834:        fnt = ActiveIcon(screen) ? screen->fnt_icon
                   1835:              : (flags & BOLD) ? screen->fnt_bold : screen->fnt_norm;
                   1836:        XText(VWindow(screen), x = CursorX (screen, screen->cur_col),
                   1837:         y = CursorY(screen, screen->cur_row), &c, 1, fnt, fg, bg);
                   1838:        if((flags & BOLD) && screen->enbolden)
                   1839:                XTextMask(VWindow(screen), x + 1, y, &c, 1, fnt, fg);
                   1840:        if(flags & UNDERLINE) {
                   1841:                bg = y + FontHeight(screen) - 2;
                   1842:                XLine(VWindow(screen), x, bg, x + FontWidth(screen), bg,
                   1843:                 1, 1, fg, GXcopy, AllPlanes);
                   1844:        }
                   1845:        if(!screen->select && !ActiveIcon(screen)) {
                   1846:                screen->box->x = x;
                   1847:                screen->box->y = y;
                   1848:                XDraw(VWindow(screen), screen->box, NBOX, 1, 1, fg, GXcopy,
                   1849:                 AllPlanes);
                   1850:        }
                   1851:        screen->cursor_state = ON;
                   1852: }
                   1853: 
                   1854: /*
                   1855:  * hide cursor at previous cursor position in screen.
                   1856:  */
                   1857: HideCursor()
                   1858: {
                   1859:        register Screen *screen = &term.screen;
                   1860:        register int fg;
                   1861:        register int bg;
                   1862:        register int x, y, flags, instatus;
                   1863:        register Font fnt;
                   1864:        char c;
                   1865: 
                   1866:        if (screen->icon_show && !screen->active_icon) return;
                   1867: 
                   1868:        if(!(instatus = screen->cursor_row > screen->max_row) &&
                   1869:         screen->cursor_row - screen->topline > screen->max_row)
                   1870:                return;
                   1871:        c = screen->buf[y = 2 * screen->cursor_row][x = screen->cursor_col];
                   1872:        flags = screen->buf[y + 1][x];
                   1873:        if(instatus)
                   1874:                flags ^= INVERSE;
                   1875:        if(flags & INVERSE) {
                   1876:                fg = screen->background;
                   1877:                bg = screen->foreground;
                   1878:        } else {
                   1879:                fg = screen->foreground;
                   1880:                bg = screen->background;
                   1881:        }
                   1882:        if (c == 0)
                   1883:                c = ' ';
                   1884:        y = (instatus ? (screen->cursor_row * FontHeight(screen) + 1) :
                   1885:         ((screen->cursor_row - screen->topline) * FontHeight(screen))) +
                   1886:         Titlebar(screen) + screen->border;
                   1887:        fnt = ActiveIcon(screen) ? screen->fnt_icon
                   1888:              : (flags & BOLD) ? screen->fnt_bold : screen->fnt_norm;
                   1889:        XText(VWindow(screen), x = CursorX (screen, screen->cursor_col),
                   1890:         y, &c, 1, fnt, fg, bg);
                   1891:        if((flags & BOLD) && screen->enbolden)
                   1892:                XTextMask(VWindow(screen), x + 1, y, &c, 1, fnt, fg);
                   1893:        if(flags & UNDERLINE) {
                   1894:                y += FontHeight(screen) - 2;
                   1895:                XLine(VWindow(screen), x, y, x + FontWidth(screen), y,
                   1896:                 1, 1, fg, GXcopy, AllPlanes);
                   1897:        }
                   1898:        screen->cursor_state = OFF;
                   1899: }
                   1900: 
                   1901: VTSelect()
                   1902: {
                   1903:        register Screen *screen = &term.screen;
                   1904: 
                   1905:        if(grayborder && screen->borderwidth > 0)
                   1906:                XChangeBorder(VWindow(screen), screen->bordertile);
                   1907:        if(Titlebar(screen))
                   1908:                VTTitleHilite();
                   1909: }
                   1910: 
                   1911: VTUnselect()
                   1912: {
                   1913:        register Screen *screen = &term.screen;
                   1914: 
                   1915:        if(grayborder && screen->borderwidth > 0)
                   1916:                XChangeBorder(VWindow(screen), screen->graybordertile);
                   1917:        if(Titlebar(screen))
                   1918:                VTTitleUnhilite();
                   1919: }
                   1920: 
                   1921: VTReset(full)
                   1922: int full;
                   1923: {
                   1924:        register Screen *screen = &term.screen;
                   1925: 
                   1926:        /* reset scrolling region */
                   1927:        screen->top_marg = 0;
                   1928:        screen->bot_marg = screen->max_row;
                   1929:        term.flags &= ~ORIGIN;
                   1930:        if(full) {
                   1931:                TabReset (term.tabs);
                   1932:                term.keyboard.flags = NULL;
                   1933:                screen->gsets[0] = 'B';
                   1934:                screen->gsets[1] = 'B';
                   1935:                screen->gsets[2] = 'B';
                   1936:                screen->gsets[3] = 'B';
                   1937:                screen->curgl = 0;
                   1938:                screen->curgr = 2;
                   1939:                screen->curss = 0;
                   1940:                ClearScreen(screen);
                   1941:                screen->cursor_state = OFF;
                   1942:                if(!(term.flags & AUTOREPEAT))
                   1943:                        XAutoRepeatOn();
                   1944:                if (term.flags & REVERSE_VIDEO)
                   1945:                        ReverseVideo(&term);
                   1946: 
                   1947:                term.flags = term.initflags;
                   1948:                if(screen->c132 && (term.flags & IN132COLUMNS)) {
                   1949:                        XChangeWindow (VWindow(screen), 80 * FontWidth(screen) +
                   1950:                         2 * screen->border + screen->scrollbar,
                   1951:                         FontHeight(screen) * (screen->max_row + 1) +
                   1952:                         screen->statusheight + Titlebar(screen) +
                   1953:                         2 * screen->border);
                   1954:                        XSync(FALSE);   /* synchronize */
                   1955:                        if(QLength() > 0)
                   1956:                                xevents();
                   1957:                }
                   1958:                CursorSet(screen, 0, 0, term.flags);
                   1959:        }
                   1960:        longjmp(vtjmpbuf, 1);   /* force ground state in parser */
                   1961: }
                   1962: 
                   1963: ToStatus(col)
                   1964: int col;
                   1965: {
                   1966:        register Screen *screen = &term.screen;
                   1967: 
                   1968:        if(col > screen->max_col)
                   1969:                col = screen->max_col;
                   1970:        if(!screen->instatus) {
                   1971:                if(!screen->statusline)
                   1972:                        ShowStatus();
                   1973:                CursorSave(&term, &screen->statussc);
                   1974:                screen->instatus = TRUE;
                   1975:                screen->cur_row = screen->max_row + 1;
                   1976:        }
                   1977:        screen->cur_col = col;
                   1978: }
                   1979: 
                   1980: FromStatus()
                   1981: {
                   1982:        register Screen *screen = &term.screen;
                   1983: 
                   1984:        if(!screen->instatus)
                   1985:                return;
                   1986:        screen->instatus = FALSE;
                   1987:        CursorRestore(&term, &screen->statussc);
                   1988: }
                   1989: 
                   1990: ShowStatus()
                   1991: {
                   1992:        register Screen *screen = &term.screen;
                   1993:        register int border = 2 * screen->border;
                   1994: 
                   1995:        if(screen->statusline)
                   1996:                return;
                   1997:        screen->statusline = 1;
                   1998:        screen->statusheight = FontHeight(screen) + 2;
                   1999:        XSetResizeHint(VWindow(screen), border + screen->scrollbar, border +
                   2000:         Titlebar(screen) + screen->statusheight, FontWidth(screen),
                   2001:         FontHeight(screen));
                   2002:        XChangeWindow (VWindow(screen), FontWidth(screen) * (screen->max_col + 1)
                   2003:         + border + screen->scrollbar, FontHeight(screen) *
                   2004:         (screen->max_row + 1) + screen->statusheight + Titlebar(screen) +
                   2005:         border);
                   2006: }
                   2007: 
                   2008: HideStatus()
                   2009: {
                   2010:        register Screen *screen = &term.screen;
                   2011:        register int border = 2 * screen->border;
                   2012:        register int i, j;
                   2013: 
                   2014:        if(!screen->statusline)
                   2015:                return;
                   2016:        if(screen->instatus)
                   2017:                FromStatus();
                   2018:        screen->statusline = 0;
                   2019:        screen->statusheight = 0;
                   2020:        bzero(screen->buf[i = 2 * (screen->max_row + 1)], j = screen->max_col +
                   2021:         1);
                   2022:        bzero(screen->buf[i + 1], j);
                   2023:        XSetResizeHint(VWindow(screen), border + screen->scrollbar, border +
                   2024:         Titlebar(screen), FontWidth(screen), FontHeight(screen));
                   2025:        XChangeWindow (VWindow(screen), FontWidth(screen) * j + border +
                   2026:         screen->scrollbar, FontHeight(screen) * (screen->max_row + 1) +
                   2027:         border + Titlebar(screen));
                   2028: }
                   2029: 
                   2030: EraseStatus()
                   2031: {
                   2032:        register Screen *screen = &term.screen;
                   2033:        register int i, j, pix;
                   2034: 
                   2035:        if(!screen->statusline)
                   2036:                return;
                   2037:        bzero(screen->buf[i = 2 * (screen->max_row + 1)], j = screen->max_col +
                   2038:         1);
                   2039:        bzero(screen->buf[i + 1], j);
                   2040:        XPixSet(VWindow(screen), screen->border - 1, (screen->max_row + 1) *
                   2041:         FontHeight(screen) + screen->border + Titlebar(screen), j *
                   2042:         FontWidth(screen) + 2, screen->statusheight, screen->reversestatus ?
                   2043:         screen->foreground : screen->background);
                   2044:        if(!screen->reversestatus)
                   2045:                StatusBox(screen);
                   2046: }
                   2047: 
                   2048: StatusBox(screen)
                   2049: register Screen *screen;
                   2050: {
                   2051:        status_box[0].y = (screen->max_row + 1) * FontHeight(screen) +
                   2052:         screen->border + Titlebar(screen);
                   2053:        status_box[3].x = -(status_box[1].x = (screen->max_col + 1) *
                   2054:         FontWidth(screen) + 1);
                   2055:        status_box[4].y = -(status_box[2].y = FontHeight(screen) + 1);
                   2056:        XDraw(VWindow(screen), status_box, NBOX, 1, 1, screen->foreground,
                   2057:         GXcopy, AllPlanes);
                   2058: }
                   2059: 
                   2060: VTTitleShow(init)
                   2061: int init;
                   2062: {
                   2063:        register Screen *screen = &term.screen;
                   2064:        register int border = 2 * screen->border;
                   2065: 
                   2066:        if(!screen->title.tbar)
                   2067:                VTTitleInit();
                   2068:        if(!init) {
                   2069:                XSetResizeHint(VWindow(screen), border + screen->scrollbar,
                   2070:                 border + Titlebar(screen) + screen->statusheight,
                   2071:                 FontWidth(screen), FontHeight(screen));
                   2072:                XChangeWindow (VWindow(screen), FontWidth(screen) *
                   2073:                 (screen->max_col + 1) + border + screen->scrollbar,
                   2074:                 FontHeight(screen) * (screen->max_row + 1) + screen->statusheight
                   2075:                 + Titlebar(screen) + border);
                   2076:        }
                   2077:        if(screen->select && !screen->TekEmu)
                   2078:                VTTitleHilite();
                   2079:        else
                   2080:                VTTitleUnhilite();
                   2081:        XMapWindow(screen->title.tbar);
                   2082: }
                   2083: 
                   2084: VTTitleHide()
                   2085: {
                   2086:        register Screen *screen = &term.screen;
                   2087:        register int border = 2 * screen->border;
                   2088: 
                   2089:        XUnmapWindow(screen->title.tbar);
                   2090:        XSetResizeHint(VWindow(screen), border + screen->scrollbar, border +
                   2091:         screen->statusheight, FontWidth(screen), FontHeight(screen));
                   2092:        XChangeWindow (VWindow(screen), FontWidth(screen) * (screen->max_col + 1)
                   2093:         + border + screen->scrollbar, FontHeight(screen) *
                   2094:         (screen->max_row + 1) + screen->statusheight + border);
                   2095: }
                   2096: 
                   2097: VTTitleHilite()
                   2098: {
                   2099:        register Screen *screen = &term.screen;
                   2100: 
                   2101:        if(screen->title.hilited)
                   2102:                return;
                   2103:        XMapWindow(screen->title.left);
                   2104:        XMapWindow(screen->title.right);
                   2105:        screen->title.hilited = TRUE;
                   2106: }
                   2107: 
                   2108: VTTitleUnhilite()
                   2109: {
                   2110:        register Screen *screen = &term.screen;
                   2111: 
                   2112:        if(!screen->title.hilited)
                   2113:                return;
                   2114:        XUnmapWindow(screen->title.left);
                   2115:        XUnmapWindow(screen->title.right);
                   2116:        screen->title.hilited = FALSE;
                   2117: }
                   2118: 
                   2119: VTTitleResize(width)
                   2120: register int width;
                   2121: {
                   2122:        register Screen *screen = &term.screen;
                   2123:        register int i, j;
                   2124: 
                   2125:        if((screen->title.width = i = screen->title.fullwidth) >
                   2126:         (j = width - 2 * (MINHILITE + screen->title_n_size + 1)))
                   2127:                screen->title.width = (i = j) + screen->title_n_size;
                   2128:        j = width - i - 2 * (screen->title_n_size + 1);
                   2129:        i = j / 2;
                   2130:        j -= i;
                   2131:        screen->title.x = i + 1 + screen->title_n_size;
                   2132:        XChangeWindow(screen->title.tbar, width, screen->titleheight - 1);
                   2133:        XChangeWindow(screen->title.left, i, screen->titlefont->height);
                   2134:        XConfigureWindow(screen->title.right, width - j - 1, TITLEPAD, j,
                   2135:         screen->titlefont->height);
                   2136: }
                   2137: 
                   2138: VTTitleExpose(rep)
                   2139: register XExposeWindowEvent *rep;
                   2140: {
                   2141:        register Screen *screen = &term.screen;
                   2142: 
                   2143:        if(rep && (rep->x > (screen->title.x + screen->title.width) ||
                   2144:         (rep->x + rep->width) < screen->title.x ||
                   2145:         rep->y > (screen->title.y + screen->titlefont->height) ||
                   2146:         (rep->y + rep->height) < screen->title.y))
                   2147:                return;
                   2148:        XText(screen->title.tbar, screen->title.x, screen->title.y,
                   2149:         screen->winname, screen->winnamelen, screen->titlefont->id,
                   2150:         screen->foreground, screen->background);
                   2151: }
                   2152: 
                   2153: VTTitleInit()
                   2154: {
                   2155:        register Screen *screen = &term.screen;
                   2156:        register int w, i, j;
                   2157:        OpaqueFrame hilite[2];
                   2158:        extern Pixmap make_hilite();
                   2159: 
                   2160:        if((screen->title.tbar = XCreateWindow(VWindow(screen), -1, -1,
                   2161:         w = FullWidth(screen), screen->titleheight - 1, 1, screen->bordertile,
                   2162:         screen->bgndtile)) == NULL)
                   2163:                Error(ERROR_CRTITLE);
                   2164:        XSelectInput(screen->title.tbar, ButtonPressed | ButtonReleased |
                   2165:         ExposeWindow | EnterWindow | LeaveWindow | UnmapWindow);
                   2166:        XDefineCursor(screen->title.tbar, screen->arrow);
                   2167:        if(!screen->hilitetile && (screen->hilitetile =
                   2168:         make_hilite(screen->foreground, screen->background)) == NULL)
                   2169:                Error(ERROR_HILITE);
                   2170:        screen->title.fullwidth = XQueryWidth(screen->winname,
                   2171:         screen->titlefont->id);
                   2172:        if((screen->title.width = i = screen->title.fullwidth) >
                   2173:         (j = w - 2 * (MINHILITE + screen->title_n_size + 1)))
                   2174:                screen->title.width = (i = j) + screen->title_n_size;
                   2175:        j = w - i - 2 * (screen->title_n_size + 1);
                   2176:        i = j / 2;
                   2177:        j -= i;
                   2178:        screen->title.x = i + 1 + screen->title_n_size;
                   2179:        screen->title.y = TITLEPAD;
                   2180:        hilite[0].x = 1;
                   2181:        hilite[1].x = w - j - 1;
                   2182:        hilite[0].y = hilite[1].y = TITLEPAD;
                   2183:        hilite[0].width = i;
                   2184:        hilite[1].width = j;
                   2185:        hilite[0].height = hilite[1].height = screen->titlefont->height;
                   2186:        hilite[0].bdrwidth = hilite[1].bdrwidth = 0;
                   2187:        hilite[0].border = hilite[1].border = NULL;
                   2188:        hilite[0].background = hilite[1].background = screen->hilitetile;
                   2189:        if(XCreateWindows(screen->title.tbar, hilite, 2) != 2)
                   2190:                Error(ERROR_CRLFRG);
                   2191:        screen->title.left = hilite[0].self;
                   2192:        screen->title.right = hilite[1].self;
                   2193: }
                   2194: 
                   2195: #ifdef MODEMENU
                   2196: #define        MMENU_SCROLL    0
                   2197: #define        MMENU_VIDEO     (MMENU_SCROLL+1)
                   2198: #define        MMENU_WRAP      (MMENU_VIDEO+1)
                   2199: #define        MMENU_REVERSEWRAP (MMENU_WRAP+1)
                   2200: #define        MMENU_NLM       (MMENU_REVERSEWRAP+1)
                   2201: #define        MMENU_CURSOR    (MMENU_NLM+1)
                   2202: #define        MMENU_PAD       (MMENU_CURSOR+1)
                   2203: #define        MMENU_REPEAT    (MMENU_PAD+1)
                   2204: #define        MMENU_SCROLLBAR (MMENU_REPEAT+1)
                   2205: #define        MMENU_PAGEMODE  (MMENU_SCROLLBAR+1)
                   2206: #define        MMENU_STATUS    (MMENU_PAGEMODE+1)
                   2207: #define        MMENU_REVSTATUS (MMENU_STATUS+1)
                   2208: #define        MMENU_C132      (MMENU_REVSTATUS+1)
                   2209: #define        MMENU_CURSES    (MMENU_C132+1)
                   2210: #define        MMENU_MARGBELL  (MMENU_CURSES+1)
                   2211: #define        MMENU_TEKWIN    (MMENU_MARGBELL+1)
                   2212: #define        MMENU_ALTERN    (MMENU_TEKWIN+1)
                   2213: #define        MMENU_LINE      (MMENU_ALTERN+1)
                   2214: #define        MMENU_RESET     (MMENU_LINE+1)
                   2215: #define        MMENU_FULLRESET (MMENU_RESET+1)
                   2216: #define        MMENU_TEKMODE   (MMENU_FULLRESET+1)
                   2217: #define        MMENU_HIDEVT    (MMENU_TEKMODE+1)
                   2218: 
                   2219: static char *vtext[] = {
                   2220:        "Jump Scroll",
                   2221:        "Reverse Video",
                   2222:        "Auto Wraparound",
                   2223:        "Reverse Wraparound",
                   2224:        "Auto Linefeed",
                   2225:        "Application Cursors",
                   2226:        "Application Pad",
                   2227:        "Auto Repeat",
                   2228:        "Scrollbar",
                   2229:        "Page Scroll",
                   2230:        "Status Line",
                   2231:        "Reverse Status Line",
                   2232:        "80 <-> 132 Columns",
                   2233:        "Curses Emulation",
                   2234:        "Margin Bell",
                   2235:        "Tek Window Showing",
                   2236:        "Alternate Screen",
                   2237:        "-",
                   2238:        "Soft Reset",
                   2239:        "Full Reset",
                   2240:        "Select Tek Mode",
                   2241:        "Hide VT Window",
                   2242:        0,
                   2243: };
                   2244: 
                   2245: 
                   2246: static int menutermflags;
                   2247: static int menukbdflags;
                   2248: static int t132;
                   2249: static int taltern;
                   2250: static int tcurses;
                   2251: static int tmarginbell;
                   2252: static int tpagemode;
                   2253: static int trevstatus;
                   2254: static int tscrollbar;
                   2255: static int tshow;
                   2256: static int tstatusline;
                   2257: 
                   2258: Menu *setupmenu(menu)
                   2259: register Menu **menu;
                   2260: {
                   2261:        register Screen *screen = &term.screen;
                   2262:        register char **cp;
                   2263:        register int flags = term.flags;
                   2264:        register int kflags = term.keyboard.flags;
                   2265: 
                   2266:        if (*menu == NULL) {
                   2267:                if ((*menu = NewMenu("Modes", re_verse)) == NULL)
                   2268:                        return(NULL);
                   2269:                for(cp = vtext ; *cp ; cp++)
                   2270:                        AddMenuItem(*menu, *cp);
                   2271:                if(!(flags & SMOOTHSCROLL))
                   2272:                        CheckItem(*menu, MMENU_SCROLL);
                   2273:                if(flags & REVERSE_VIDEO)
                   2274:                        CheckItem(*menu, MMENU_VIDEO);
                   2275:                if(flags & WRAPAROUND)
                   2276:                        CheckItem(*menu, MMENU_WRAP);
                   2277:                if(flags & REVERSEWRAP)
                   2278:                        CheckItem(*menu, MMENU_REVERSEWRAP);
                   2279:                if(flags & LINEFEED)
                   2280:                        CheckItem(*menu, MMENU_NLM);
                   2281:                if(kflags & CURSOR_APL)
                   2282:                        CheckItem(*menu, MMENU_CURSOR);
                   2283:                if(kflags & KYPD_APL)
                   2284:                        CheckItem(*menu, MMENU_PAD);
                   2285:                if(flags & AUTOREPEAT)
                   2286:                        CheckItem(*menu, MMENU_REPEAT);
                   2287:                if(tscrollbar = (screen->scrollbar > 0))
                   2288:                        CheckItem(*menu, MMENU_SCROLLBAR);
                   2289:                if(tpagemode = screen->pagemode)
                   2290:                        CheckItem(*menu, MMENU_PAGEMODE);
                   2291:                if(tstatusline = screen->statusline)
                   2292:                        CheckItem(*menu, MMENU_STATUS);
                   2293:                if(trevstatus = screen->reversestatus)
                   2294:                        CheckItem(*menu, MMENU_REVSTATUS);
                   2295:                if(t132 = screen->c132)
                   2296:                        CheckItem(*menu, MMENU_C132);
                   2297:                if(tcurses = screen->curses)
                   2298:                        CheckItem(*menu, MMENU_CURSES);
                   2299:                if(tmarginbell = screen->marginbell)
                   2300:                        CheckItem(*menu, MMENU_MARGBELL);
                   2301:                if(tshow = screen->Tshow)
                   2302:                        CheckItem(*menu, MMENU_TEKWIN);
                   2303:                else
                   2304:                        DisableItem(*menu, MMENU_HIDEVT);
                   2305:                DisableItem(*menu, MMENU_ALTERN);
                   2306:                if(taltern = screen->alternate) {
                   2307:                        CheckItem(*menu, MMENU_ALTERN);
                   2308:                        DisableItem(*menu, MMENU_PAGEMODE);
                   2309:                }
                   2310:                DisableItem(*menu, MMENU_LINE);
                   2311:                if(screen->inhibit & I_TEK) {
                   2312:                        DisableItem(*menu, MMENU_TEKWIN);
                   2313:                        DisableItem(*menu, MMENU_TEKMODE);
                   2314:                }
                   2315:                menutermflags = flags;
                   2316:                menukbdflags = kflags;
                   2317:                return(*menu);
                   2318:        }
                   2319:        if ((menutermflags ^= flags) & SMOOTHSCROLL)
                   2320:                SetItemCheck(*menu, MMENU_SCROLL, !(flags & SMOOTHSCROLL));
                   2321:        if (menutermflags & REVERSE_VIDEO)
                   2322:                SetItemCheck(*menu, MMENU_VIDEO, flags & REVERSE_VIDEO);
                   2323:        if (menutermflags & WRAPAROUND)
                   2324:                SetItemCheck(*menu, MMENU_WRAP, flags & WRAPAROUND);
                   2325:        if (menutermflags & REVERSEWRAP)
                   2326:                SetItemCheck(*menu, MMENU_REVERSEWRAP, flags & REVERSEWRAP);
                   2327:        if (menutermflags & LINEFEED)
                   2328:                SetItemCheck(*menu, MMENU_NLM, flags & LINEFEED);
                   2329:        if ((menukbdflags ^= kflags) & CURSOR_APL)
                   2330:                SetItemCheck(*menu, MMENU_CURSOR, kflags & CURSOR_APL);
                   2331:        if (menukbdflags & KYPD_APL)
                   2332:                SetItemCheck(*menu, MMENU_PAD, NULL, kflags & KYPD_APL);
                   2333:        if(tscrollbar != (screen->scrollbar > 0))
                   2334:                SetItemCheck(*menu, MMENU_SCROLLBAR, (tscrollbar =
                   2335:                 (screen->scrollbar > 0)));
                   2336:        if(tpagemode != screen->pagemode)
                   2337:                SetItemCheck(*menu, MMENU_PAGEMODE, (tpagemode =
                   2338:                 screen->pagemode));
                   2339:        if(tstatusline != screen->statusline)
                   2340:                SetItemCheck(*menu, MMENU_STATUS, (tstatusline =
                   2341:                 screen->statusline));
                   2342:        if(trevstatus != screen->reversestatus)
                   2343:                SetItemCheck(*menu, MMENU_REVSTATUS, (trevstatus =
                   2344:                 screen->reversestatus));
                   2345:        if(t132 != screen->c132)
                   2346:                SetItemCheck(*menu, MMENU_C132, (t132 = screen->c132));
                   2347:        if(tcurses != screen->curses)
                   2348:                SetItemCheck(*menu, MMENU_CURSES, (tcurses = screen->curses));
                   2349:        if(tmarginbell != screen->marginbell)
                   2350:                SetItemCheck(*menu, MMENU_MARGBELL, (tmarginbell =
                   2351:                screen->marginbell));
                   2352:        if(tshow != screen->Tshow) {
                   2353:                SetItemCheck(*menu, MMENU_TEKWIN, (tshow = screen->Tshow));
                   2354:                SetItemDisable(*menu, MMENU_HIDEVT, !tshow);
                   2355:        }
                   2356:        if(taltern != screen->alternate) {
                   2357:                SetItemCheck(*menu, MMENU_ALTERN, (taltern =
                   2358:                 screen->alternate));
                   2359:                SetItemDisable(*menu, MMENU_PAGEMODE, taltern);
                   2360:        }
                   2361:        menutermflags = flags;
                   2362:        menukbdflags = kflags;
                   2363:        return(*menu);
                   2364: }
                   2365: 
                   2366: domenufunc(item)
                   2367: int item;
                   2368: {
                   2369:        register Screen *screen = &term.screen;
                   2370: 
                   2371:        switch (item) {
                   2372:        case MMENU_SCROLL:
                   2373:                term.flags ^= SMOOTHSCROLL;
                   2374:                if (term.flags & SMOOTHSCROLL) {
                   2375:                        screen->jumpscroll = FALSE;
                   2376:                        if (screen->scroll_amt)
                   2377:                                FlushScroll(screen);
                   2378:                } else
                   2379:                        screen->jumpscroll = TRUE;
                   2380:                break;
                   2381: 
                   2382:        case MMENU_VIDEO:
                   2383:                term.flags ^= REVERSE_VIDEO;
                   2384:                ReverseVideo(&term);
                   2385:                break;
                   2386: 
                   2387:        case MMENU_WRAP:
                   2388:                term.flags ^= WRAPAROUND;
                   2389:                break;
                   2390: 
                   2391:        case MMENU_REVERSEWRAP:
                   2392:                term.flags ^= REVERSEWRAP;
                   2393:                break;
                   2394: 
                   2395:        case MMENU_NLM:
                   2396:                term.flags ^= LINEFEED;
                   2397:                break;
                   2398: 
                   2399:        case MMENU_CURSOR:
                   2400:                term.keyboard.flags ^= CURSOR_APL;
                   2401:                break;
                   2402: 
                   2403:        case MMENU_PAD:
                   2404:                term.keyboard.flags ^= KYPD_APL;
                   2405:                break;
                   2406: 
                   2407:        case MMENU_REPEAT:
                   2408:                term.flags ^= AUTOREPEAT;
                   2409:                if (term.flags & AUTOREPEAT)
                   2410:                        XAutoRepeatOn();
                   2411:                else
                   2412:                        XAutoRepeatOff();
                   2413:                break;
                   2414: 
                   2415:        case MMENU_SCROLLBAR:
                   2416:                if(screen->scrollbar)
                   2417:                        ScrollBarOff(screen);
                   2418:                else
                   2419:                        ScrollBarOn(screen, TRUE, FALSE);
                   2420:                break;
                   2421: 
                   2422:        case MMENU_PAGEMODE:
                   2423:                if(screen->pagemode = !screen->pagemode)
                   2424:                        screen->pagecnt = 0;
                   2425:                break;
                   2426: 
                   2427:        case MMENU_STATUS:
                   2428:                if(screen->statusline)
                   2429:                        HideStatus();
                   2430:                else
                   2431:                        ShowStatus();
                   2432:                break;
                   2433: 
                   2434:        case MMENU_REVSTATUS:
                   2435:                screen->reversestatus = !screen->reversestatus;
                   2436:                ScrnRefresh(screen, screen->max_row + 1, 0, 1, screen->max_col
                   2437:                 + 1);
                   2438:                break;
                   2439: 
                   2440:        case MMENU_C132:
                   2441:                screen->c132 = !screen->c132;
                   2442:                break;
                   2443: 
                   2444:        case MMENU_MARGBELL:
                   2445:                if(!(screen->marginbell = !screen->marginbell))
                   2446:                        screen->bellarmed = -1;
                   2447:                break;
                   2448: 
                   2449:        case MMENU_CURSES:
                   2450:                screen->curses = !screen->curses;
                   2451:                break;
                   2452: 
                   2453:        case MMENU_FULLRESET:
                   2454:                VTReset(TRUE);
                   2455:                break;
                   2456: 
                   2457:        case MMENU_RESET:
                   2458:                VTReset(FALSE);
                   2459:                break;
                   2460: 
                   2461:        case MMENU_HIDEVT:
                   2462:                screen->show = FALSE;
                   2463:                XUnmapWindow(VWindow(screen));
                   2464:                reselectwindow(screen);
                   2465:                SyncUnmap(VWindow(screen), WINDOWEVENTS);
                   2466:                        /* drop through */
                   2467:        case MMENU_TEKMODE:
                   2468:                if(!screen->TekEmu) {
                   2469:                        if(screen->logging) {
                   2470:                                FlushLog(screen);
                   2471:                                screen->logstart = Tbuffer;
                   2472:                        }
                   2473:                        screen->TekEmu = TRUE;
                   2474:                        if(screen->pagemode) {
                   2475:                                Scroll(screen, screen->pagecnt);
                   2476:                                screen->pagecnt = 0;
                   2477:                                ioctl(screen->respond, TIOCSTART, NULL);
                   2478:                        }
                   2479:                        longjmp(VTend, 1);
                   2480:                } else
                   2481:                        XRaiseWindow(TWindow(screen));
                   2482:                break;
                   2483: 
                   2484:        case MMENU_TEKWIN:
                   2485:                if(screen->Tshow = !screen->Tshow) {
                   2486:                        if(TWindow(screen) || TekInit()) {
                   2487:                                XMapWindow(TWindow(screen));
                   2488:                                screen->Tshow = TRUE;
                   2489:                        }
                   2490:                } else {
                   2491:                        screen->Tshow = FALSE;
                   2492:                        XUnmapWindow(TWindow(screen));
                   2493:                        SyncUnmap(TWindow(screen), TWINDOWEVENTS);
                   2494:                        if(screen->TekEmu) {
                   2495:                                if(screen->logging) {
                   2496:                                        FlushLog(screen);
                   2497:                                        screen->logstart = buffer;
                   2498:                                }
                   2499:                                longjmp(Tekend, 1);
                   2500:                        }
                   2501:                }
                   2502:                reselectwindow(screen);
                   2503:                break;
                   2504:        }
                   2505: }
                   2506: #endif MODEMENU

unix.superglobalmegacorp.com

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