Annotation of researchv9/X11/src/X.V11R1/clients/xterm/charproc.c, revision 1.1.1.2

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

unix.superglobalmegacorp.com

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