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

1.1       root        1: /*
                      2:  *     $Source: /orpheus/u1/X11/clients/xterm/RCS/Tekproc.c,v $
                      3:  *     $Header: Tekproc.c,v 1.5 87/09/10 17:19:46 swick Exp $
                      4:  */
                      5: 
                      6: 
                      7: #include <X11/copyright.h>
                      8: 
                      9: /*
                     10:  * Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts.
                     11:  *
                     12:  *                         All Rights Reserved
                     13:  *
                     14:  * Permission to use, copy, modify, and distribute this software and its
                     15:  * documentation for any purpose and without fee is hereby granted,
                     16:  * provided that the above copyright notice appear in all copies and that
                     17:  * both that copyright notice and this permission notice appear in
                     18:  * supporting documentation, and that the name of Digital Equipment
                     19:  * Corporation not be used in advertising or publicity pertaining to
                     20:  * distribution of the software without specific, written prior permission.
                     21:  *
                     22:  *
                     23:  * DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
                     24:  * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
                     25:  * DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
                     26:  * ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
                     27:  * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
                     28:  * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
                     29:  * SOFTWARE.
                     30:  */
                     31: 
                     32: /* Tekproc.c */
                     33: 
                     34: #include <X11/Xlib.h>
                     35: #include <X11/Intrinsic.h>
                     36: #include <X11/Xatom.h>
                     37: #include <X11/Xutil.h>
                     38: #include "ptyx.h"
                     39: #include "Tekparse.h"
                     40: #include <stdio.h>
                     41: #include <sgtty.h>
                     42: #include <ctype.h>
                     43: #include <errno.h>
                     44: #include <setjmp.h>
1.1.1.2 ! root       45: #include <time.h>
1.1       root       46: #include <pwd.h>
                     47: #include <strings.h>
                     48: #include "data.h"
                     49: #include "error.h"
                     50: #ifdef MODEMENU
                     51: #include "menu.h"
                     52: #endif MODEMENU
                     53: 
                     54: extern void exit();
                     55: extern long time();
                     56: 
                     57: /* ||| Temp stuff till I make this work again */
                     58: char *fore_color;
                     59: char *back_color;
                     60: char *curs_color;
                     61: 
                     62: #define TekColormap DefaultColormap( screen->display, \
                     63:                                    DefaultScreen(screen->display) )
                     64: 
                     65: /* Tek defines */
                     66: 
                     67: #define        BEL             07
                     68: #define        CANCEL          030
                     69: #define        DOTDASHEDLINE   2
                     70: #define        DOTTEDLINE      1
                     71: #define        EAST            01
                     72: #define        ETX             03
                     73: #define        LARGEFONT       0
                     74: #define        LARGEFONTNAME   "9x15"
                     75: #define        LINEMASK        07
                     76: #define        LONGDASHEDLINE  4
                     77: #define        MARGIN1         0
                     78: #define        MARGIN2         1
                     79: #define MAX_PTS                150
                     80: #define MAX_VTX                300
                     81: #define        NAK             025
                     82: #define        NORTH           04
                     83: #define        PENDOWN         1
                     84: #define        PENUP           0
                     85: #define        SHORTDASHEDLINE 3
                     86: #define        SMALLFONT       3
                     87: #define        SMALLFONTNAME   "5x7"
                     88: #define        SOLIDLINE       0
                     89: #define        SOUTH           010
                     90: #define        TEKBOTTOMPAD    23
                     91: #define        TEKDEFHEIGHT    565
                     92: #define        TEKDEFWIDTH     750
                     93: #define        TEKHEIGHT       3072
                     94: #define        TEKHOME         ((TekChar[screen->page.fontsize].nlines - 1)\
                     95:                         * TekChar[screen->page.fontsize].vsize)
                     96: #define        TEKMINHEIGHT    452
                     97: #define        TEKMINWIDTH     600
                     98: #define        TEKPAD          57
                     99: #define        TEKTOPPAD       34
                    100: #define        TEKWIDTH        4096
                    101: #define        TEXT_BUF_SIZE   256
                    102: #define        THREEFONT       2
                    103: #define        THREEFONTNAME   "8x13"
                    104: #define        TWOFONT         1
                    105: #define        TWOFONTNAME     "fixed"
                    106: #define        WEST            02
                    107: 
                    108: #define        TekMove(x,y)    screen->cur_X = x; screen->cur_Y = y
                    109: #define        input()         Tinput()
                    110: #define        unput(c)        *Tpushback++ = c
                    111: 
                    112: #ifndef lint
                    113: static char rcs_id[] = "$Header: Tekproc.c,v 1.5 87/09/10 17:19:46 swick Exp $";
                    114: #endif lint
                    115: 
                    116: static XPoint *T_box[TEKNUMFONTS] = {
                    117:        T_boxlarge,
                    118:        T_box2,
                    119:        T_box3,
                    120:        T_boxsmall,
                    121: };
                    122: static struct Tek_Char {
                    123:        int hsize;      /* in Tek units */
                    124:        int vsize;      /* in Tek units */
                    125:        int charsperline;
                    126:        int nlines;
                    127: } TekChar[TEKNUMFONTS] = {
                    128:        {56, 88, 74, 35},       /* large */
                    129:        {51, 82, 81, 38},       /* #2 */
                    130:        {34, 53, 121, 58},      /* #3 */
                    131:        {31, 48, 133, 64},      /* small */
                    132: };
                    133: 
                    134: static int *curstate;
                    135: static Cursor GINcursor;
                    136: static XSegment *line_pt;
                    137: static int nplot;
                    138: static TekLink Tek0;
                    139: static jmp_buf Tekjump;
                    140: static TekLink *TekRecord;
                    141: static XSegment *Tline;
                    142: static int *Tparsestate;
                    143: 
                    144: extern int Talptable[];
                    145: extern int Tbestable[];
                    146: extern int Tbyptable[];
                    147: extern int Tesctable[];
                    148: extern int Tipltable[];
                    149: extern int Tplttable[];
                    150: extern int Tpttable[];
                    151: extern int Tspttable[];
                    152: 
                    153: /* event handlers */
                    154: extern HandleKeyPressed();
                    155: extern EventDoNothing();
                    156: extern HandleEnterWindow();
                    157: extern HandleLeaveWindow();
                    158: extern HandleFocusChange();
                    159: extern TekButtonPressed();
                    160: 
                    161: 
                    162: Tekparse()
                    163: {
                    164:        register TScreen *screen = &term.screen;
                    165:        register int c, x, y;
                    166:        char ch;
                    167:        int arg;
                    168:        int Tinput();
                    169: 
                    170:        for( ; ; )
                    171:                switch(Tparsestate[c = input()]) {
                    172:                 case CASE_REPORT:
                    173:                        /* report address */
                    174:                        if(screen->TekGIN) {
                    175:                                TekGINoff();
                    176:                                TekEnqMouse(0);
                    177:                        } else {
                    178:                                c = 064;        /* has hard copy unit */
                    179:                                if(screen->margin == MARGIN2)
                    180:                                        c |= 02;
                    181:                                TekEnq(c, screen->cur_X, screen->cur_Y);
                    182:                        }
                    183:                        TekRecord->ptr[-1] = NAK; /* remove from recording */
                    184:                        Tparsestate = curstate;
                    185:                        break;
                    186: 
                    187:                 case CASE_VT_MODE:
                    188:                        /* special return to vt102 mode */
                    189:                        Tparsestate = curstate;
                    190:                        TekRecord->ptr[-1] = NAK; /* remove from recording */
                    191:                        if(screen->logging) {
                    192:                                FlushLog(screen);
                    193:                                screen->logstart = buffer;
                    194:                        }
                    195:                        return;
                    196: 
                    197:                 case CASE_SPT_STATE:
                    198:                        /* Enter Special Point Plot mode */
                    199:                        if(screen->TekGIN)
                    200:                                TekGINoff();
                    201:                        Tparsestate = curstate = Tspttable;
                    202:                        break;
                    203: 
                    204:                 case CASE_GIN:
                    205:                        /* Do Tek GIN mode */
                    206:                        screen->TekGIN = &TekRecord->ptr[-1];
                    207:                                /* Set cross-hair cursor raster array */
                    208:                        if(GINcursor = make_tcross(
                    209:                            screen->mousecolor,
                    210:                            screen->background))
                    211:                                XDefineCursor(
                    212:                                    screen->display,
                    213:                                    TWindow(screen),
                    214:                                    GINcursor);
                    215:                        Tparsestate = Tbyptable;        /* Bypass mode */
                    216:                        break;
                    217: 
                    218:                 case CASE_BEL:
                    219:                        /* BEL */
                    220:                        if(screen->TekGIN)
                    221:                                TekGINoff();
                    222:                        if(!TekRefresh)
                    223:                                Bell();
                    224:                        Tparsestate = curstate; /* clear bypass condition */
                    225:                        break;
                    226: 
                    227:                 case CASE_BS:
                    228:                        /* BS */
                    229:                        if(screen->TekGIN)
                    230:                                TekGINoff();
                    231:                        Tparsestate = curstate; /* clear bypass condition */
                    232:                        TCursorBack();
                    233:                        break;
                    234: 
                    235:                 case CASE_PT_STATE:
                    236:                        /* Enter Tek Point Plot mode */
                    237:                        if(screen->TekGIN)
                    238:                                TekGINoff();
                    239:                        Tparsestate = curstate = Tpttable;
                    240:                        break;
                    241: 
                    242:                 case CASE_PLT_STATE:
                    243:                        /* Enter Tek Plot mode */
                    244:                        if(screen->TekGIN)
                    245:                                TekGINoff();
                    246:                        Tparsestate = curstate = Tplttable;
                    247:                        if((c = input()) == BEL)
                    248:                                screen->pen = PENDOWN;
                    249:                        else {
                    250:                                unput(c);
                    251:                                screen->pen = PENUP;
                    252:                        }
                    253:                        break;
                    254: 
                    255:                 case CASE_TAB:
                    256:                        /* HT */
                    257:                        if(screen->TekGIN)
                    258:                                TekGINoff();
                    259:                        Tparsestate = curstate; /* clear bypass condition */
                    260:                        TCursorForward();
                    261:                        break;
                    262: 
                    263:                 case CASE_IPL_STATE:
                    264:                        /* Enter Tek Incremental Plot mode */
                    265:                        if(screen->TekGIN)
                    266:                                TekGINoff();
                    267:                        Tparsestate = curstate = Tipltable;
                    268:                        break;
                    269: 
                    270:                 case CASE_ALP_STATE:
                    271:                        /* Enter Tek Alpha mode from any other mode */
                    272:                        if(screen->TekGIN)
                    273:                                TekGINoff();
                    274:                        /* if in one of graphics states, move alpha cursor */
                    275:                        if(nplot > 0)   /* flush line Tbuffer */
                    276:                                TekFlush();
                    277:                        Tparsestate = curstate = Talptable;
                    278:                        break;
                    279: 
                    280:                 case CASE_UP:
                    281:                        /* cursor up */
                    282:                        if(screen->TekGIN)
                    283:                                TekGINoff();
                    284:                        Tparsestate = curstate; /* clear bypass condition */
                    285:                        TCursorUp();
                    286:                        break;
                    287: 
                    288:                 case CASE_COPY:
                    289:                        /* make copy */
                    290:                        if(screen->TekGIN)
                    291:                                TekGINoff();
                    292:                        TekCopy();
                    293:                        TekRecord->ptr[-1] = NAK; /* remove from recording */
                    294:                        Tparsestate = curstate; /* clear bypass condition */
                    295:                        break;
                    296: 
                    297:                 case CASE_PAGE:
                    298:                        /* Page Function */
                    299:                        if(screen->TekGIN)
                    300:                                TekGINoff();
                    301:                        TekPage();      /* clear bypass condition */
                    302:                        break;
                    303: 
                    304:                 case CASE_BES_STATE:
                    305:                        /* Byp: an escape char */
                    306:                        Tparsestate = Tbestable;
                    307:                        break;
                    308: 
                    309:                 case CASE_BYP_STATE:
                    310:                        /* set bypass condition */
                    311:                        Tparsestate = Tbyptable;
                    312:                        break;
                    313: 
                    314:                 case CASE_IGNORE:
                    315:                        /* Esc: totally ignore CR, ESC, LF, ~ */
                    316:                        break;
                    317: 
                    318:                 case CASE_ASCII:
                    319:                        /* Select ASCII char set */
                    320:                        /* ignore for now */
                    321:                        Tparsestate = curstate;
                    322:                        break;
                    323: 
                    324:                 case CASE_APL:
                    325:                        /* Select APL char set */
                    326:                        /* ignore for now */
                    327:                        Tparsestate = curstate;
                    328:                        break;
                    329: 
                    330:                 case CASE_CHAR_SIZE:
                    331:                        /* character size selector */
                    332:                        screen->cur.fontsize = c & 03;
                    333:                        Tparsestate = curstate;
                    334:                        break;
                    335: 
                    336:                 case CASE_BEAM_VEC:
                    337:                        /* beam and vector selector */
                    338:                        /* only line types */
                    339:                        if((c &= LINEMASK) != screen->cur.linetype) {
                    340:                                if(nplot > 0)
                    341:                                        TekFlush();
                    342:                                screen->cur.linetype = c;
                    343:                        }
                    344:                        Tparsestate = curstate;
                    345:                        break;
                    346: 
                    347:                 case CASE_CURSTATE:
                    348:                        Tparsestate = curstate;
                    349:                        break;
                    350: 
                    351:                 case CASE_PENUP:
                    352:                        /* Ipl: penup */
                    353:                        screen->pen = PENUP;
                    354:                        break;
                    355: 
                    356:                 case CASE_PENDOWN:
                    357:                        /* Ipl: pendown */
                    358:                        screen->pen = PENDOWN;
                    359:                        break;
                    360: 
                    361:                 case CASE_IPL_POINT:
                    362:                        /* Ipl: point */
                    363:                        x = screen->cur_X;
                    364:                        y = screen->cur_Y;
                    365:                        if(c & NORTH)
                    366:                                y++;
                    367:                        else if(c & SOUTH)
                    368:                                y--;
                    369:                        if(c & EAST)
                    370:                                x++;
                    371:                        else if(c & WEST)
                    372:                                x--;
                    373:                        if(screen->pen == PENDOWN)
                    374:                                TekDraw(x, y);
                    375:                        else
                    376:                                TekMove(x, y);
                    377:                        break;
                    378: 
                    379:                 case CASE_PLT_VEC:
                    380:                        /* Plt: vector */
                    381:                        unput(c);
                    382:                        if(getpoint()) {
                    383:                                if(screen->pen == PENDOWN)
                    384:                                        TekDraw(screen->cur.x, screen->cur.y);
                    385:                                else
                    386:                                        TekMove(screen->cur.x, screen->cur.y);
                    387:                                screen->pen = PENDOWN;
                    388:                        }
                    389:                        break;
                    390: 
                    391:                 case CASE_PT_POINT:
                    392:                        /* Pt: point */
                    393:                        unput(c);
                    394:                        if(getpoint()) {
                    395:                                TekMove(screen->cur.x, screen->cur.y);
                    396:                                TekDraw(screen->cur.x, screen->cur.y);
                    397:                        }
                    398:                        break;
                    399: 
                    400:                 case CASE_SPT_POINT:
                    401:                        /* Spt: point */
                    402:                        /* ignore intensity character in c */
                    403:                        if(getpoint()) {
                    404:                                TekMove(screen->cur.x, screen->cur.y);
                    405:                                TekDraw(screen->cur.x, screen->cur.y);
                    406:                        }
                    407:                        break;
                    408: 
                    409:                 case CASE_CR:
                    410:                        /* CR */
                    411:                        if(screen->TekGIN)
                    412:                                TekGINoff();
                    413:                        if(nplot > 0)   /* flush line Tbuffer */
                    414:                                TekFlush();
                    415:                        screen->cur_X = screen->margin == MARGIN1 ? 0 :
                    416:                         TEKWIDTH / 2;
                    417:                        Tparsestate = curstate = Talptable;
                    418:                        break;
                    419: 
                    420:                 case CASE_ESC_STATE:
                    421:                        /* ESC */
                    422:                        Tparsestate = Tesctable;
                    423:                        break;
                    424: 
                    425:                 case CASE_LF:
                    426:                        /* LF */
                    427:                        if(screen->TekGIN)
                    428:                                TekGINoff();
                    429:                        TCursorDown();
                    430:                        if(!TekRefresh && (screen->display->qlen > 0 ||
                    431:                         (ioctl(screen->display->fd, FIONREAD, (char *)&arg), arg) > 0))
                    432:                                xevents();
                    433:                        break;
                    434: 
                    435:                 case CASE_SP:
                    436:                        /* SP */
                    437:                        TCursorForward();
                    438:                        break;
                    439: 
                    440:                 case CASE_PRINT:
                    441:                        /* printable character */
                    442:                        ch = c;
                    443:                        c = screen->cur.fontsize;
                    444: 
                    445:                        XDrawString(
                    446:                            screen->display,
                    447:                            TWindow(screen), 
                    448:                            screen->TnormalGC,
                    449:                            (int)(screen->cur_X * TekScale(screen)) + screen->border,
                    450:                            (int)((TEKHEIGHT + TEKTOPPAD - screen->cur_Y) * TekScale(screen)) + screen->border - screen->tobaseline[c],
                    451:                            &ch,
                    452:                            1);
                    453:                        TCursorForward();
                    454:                        break;
                    455:                 case CASE_OSC:
                    456:                        /* do osc escape */
                    457:                        do_osc(Tinput);
                    458:                        Tparsestate = curstate;
                    459:                        break;
                    460:                }
                    461: }
                    462: 
                    463: static int rcnt;
                    464: static char *rptr;
                    465: static int Tselect_mask;
                    466: 
                    467: Tinput()
                    468: {
                    469:        register TScreen *screen = &term.screen;
                    470:        register char *cp;
                    471:        register int i;
                    472:        register TekLink *tek;
                    473:        extern char *malloc();
                    474: 
                    475:        if(Tpushback > Tpushb)
                    476:                return(*--Tpushback);
                    477:        if(TekRefresh) {
                    478:                if(rcnt-- > 0)
                    479:                        return(*rptr++);
                    480:                if(tek = TekRefresh->next) {
                    481:                        TekRefresh = tek;
                    482:                        rcnt = tek->count - 1;
                    483:                        rptr = tek->data;
                    484:                        return(*rptr++);
                    485:                }
                    486:                TekRefresh = (TekLink *)0;
                    487:                longjmp(Tekjump, 1);
                    488:        }
                    489: again:
                    490:        if(Tbcnt-- <= 0) {
                    491:                if(nplot > 0)   /* flush line Tbuffer */
                    492:                        TekFlush();
                    493:                Tselect_mask = pty_mask;        /* force a read */
                    494:                for( ; ; ) {
                    495:                        if(Tselect_mask & pty_mask) {
                    496:                                if(screen->logging)
                    497:                                        FlushLog(screen);
                    498:                                if((Tbcnt = read(screen->respond,
                    499:                                 Tbptr = Tbuffer, BUF_SIZE)) < 0) {
                    500:                                        if(errno == EIO && am_slave)
                    501:                                                exit(0);
1.1.1.2 ! root      502:                                        else
1.1       root      503:                                                Panic(
                    504:                                 "Tinput:read returned unexpected error (%d)\n",
                    505:                                                 errno);
                    506:                                } else if(Tbcnt == 0)
                    507:                                        Panic("input: read returned zero\n", 0);
                    508:                                else {
                    509:                                        /* strip parity bit */
                    510:                                        for(i = Tbcnt, cp = Tbptr ; i > 0 ; i--)
                    511:                                                *cp++ &= CHAR;
                    512:                                        break;
                    513:                                }
                    514:                        }
                    515:                        if (Ttoggled && curstate == Talptable) {
                    516:                                TCursorToggle(TOGGLE);
                    517:                                Ttoggled = FALSE;
                    518:                        }
                    519:                        if(QLength(screen->display))
                    520:                                Tselect_mask = X_mask;
                    521:                        else {
                    522:                                XFlush(screen->display);
                    523:                                Tselect_mask = Select_mask;
                    524:                                if((i = select(max_plus1, &Tselect_mask,
1.1.1.2 ! root      525:                                        (int *)NULL, 0x6fffffff)) < 0){
1.1       root      526:                                        if (errno != EINTR)
                    527:                                                SysError(ERROR_TSELECT);
                    528:                                        continue;
                    529:                                }
                    530:                        }
                    531:                        if(Tselect_mask & X_mask) {
                    532:                                xevents();
                    533:                                if(Tbcnt > 0)
                    534:                                        goto again;
                    535:                        }
                    536:                }
                    537:                Tbcnt--;
                    538:                if (!Ttoggled && curstate == Talptable) {
                    539:                        TCursorToggle(TOGGLE);
                    540:                        Ttoggled = TRUE;
                    541:                }
                    542:        }
                    543:        if((tek = TekRecord)->count >= TEK_LINK_BLOCK_SIZE) {
                    544:                if((TekRecord = tek->next = (TekLink *)malloc(sizeof(TekLink)))
                    545:                 == (TekLink *)0)
                    546:                        Panic("Tinput: malloc error (%d)\n", errno);
                    547:                tek = tek->next;
                    548:                tek->next = (TekLink *)0;
                    549:                tek->count = 0;
                    550:                tek->ptr = tek->data;
                    551:        }
                    552:        tek->count++;
                    553:        return(*tek->ptr++ = *Tbptr++);
                    554: }
                    555: 
                    556: TekExpose(rep)
                    557: register XExposeEvent *rep;
                    558: {
                    559:        register TScreen *screen = &term.screen;
                    560:        register int border = 2 * screen->border;
                    561:        register double d;
                    562: 
                    563:        if(rep) {
                    564:                if (rep->width != (TWidth(screen) + border) || rep->height !=
                    565:                 (THeight(screen) + border)) {
                    566:                        XClearWindow(screen->display, TWindow(screen));
                    567:                        TWidth(screen) = rep->width - border;
                    568:                        THeight(screen) = rep->height - border;
                    569:                        TekScale(screen) = (double)TWidth(screen) /
                    570:                         (TEKWIDTH + TEKPAD);
                    571:                        if((d = (double)THeight(screen) / (TEKHEIGHT +
                    572:                         TEKTOPPAD + TEKBOTTOMPAD)) < TekScale(screen))
                    573:                                TekScale(screen) = d;
                    574:                        TFullWidth(screen) = rep->width;
                    575:                        TFullHeight(screen) = rep->height;
                    576: 
                    577:                } else if(TFullHeight(screen) != rep->height)
                    578:                        TFullHeight(screen) = rep->height;
                    579:                else if(!Ttoggled)
                    580:                        TCursorToggle(CLEAR);
                    581:        }
                    582:        Ttoggled = TRUE;
                    583:        Tpushback = Tpushb;
                    584:        screen->cur_X = 0;
                    585:        screen->cur_Y = TEKHOME;
                    586:        screen->cur = screen->page;
                    587:        screen->margin = MARGIN1;
                    588:        if(screen->TekGIN) {
                    589:                screen->TekGIN = NULL;
                    590:                TekGINoff();
                    591:        }
                    592:        TekRefresh = &Tek0;
                    593:        rptr = TekRefresh->data;
                    594:        rcnt = TekRefresh->count;
                    595:        Tparsestate = curstate = Talptable;
                    596:        if(!screen->waitrefresh)
                    597:                dorefresh();
                    598: }
                    599: 
                    600: dorefresh()
                    601: {
                    602:        register TScreen *screen = &term.screen;
                    603:        register Cursor cur;
                    604: 
                    605:        XDefineCursor(screen->display, TWindow(screen), 
                    606:         cur = make_wait(screen->mousecolor, screen->background));
                    607:        XFlush(screen->display);
                    608:        if(!setjmp(Tekjump))
                    609:                Tekparse();
                    610:        XDefineCursor(screen->display, TWindow(screen), 
                    611:         (screen->TekGIN && GINcursor) ? GINcursor : screen->arrow);
                    612:        XFreeCursor(screen->display, cur);
                    613: }
                    614: 
                    615: TekPage()
                    616: {
                    617:        register TScreen *screen = &term.screen;
                    618:        register TekLink *tek, *tek2;
                    619: 
                    620:        XClearWindow(screen->display, TWindow(screen));
                    621:        screen->cur_X = 0;
                    622:        screen->cur_Y = TEKHOME;
                    623:        screen->margin = MARGIN1;
                    624:        screen->page = screen->cur;
                    625:        if(screen->TekGIN)
                    626:                TekGINoff();
                    627:        tek = TekRecord = &Tek0;
                    628:        tek->count = 0;
                    629:        tek->ptr = tek->data;
                    630:        if(tek = tek->next)
                    631:                do {
                    632:                        tek2 = tek->next;
                    633:                        free((char *)tek);
                    634:                } while(tek = tek2);
                    635:        TekRecord->next = (TekLink *)0;
                    636:        TekRefresh = (TekLink *)0;
                    637:        Ttoggled = TRUE;
                    638:        Tparsestate = curstate = Talptable;     /* Tek Alpha mode */
                    639: }
                    640: 
                    641: #define        EXTRABITS       017
                    642: #define        FIVEBITS        037
                    643: #define        HIBITS          (FIVEBITS << SHIFTHI)
                    644: #define        LOBITS          (FIVEBITS << SHIFTLO)
                    645: #define        SHIFTHI         7
                    646: #define        SHIFTLO         2
                    647: #define        TWOBITS         03
                    648: 
                    649: getpoint()
                    650: {
                    651:        register int c, x, y, e, lo_y = 0;
                    652:        register TScreen *screen = &term.screen;
                    653: 
                    654:        x = screen->cur.x;
                    655:        y = screen->cur.y;
                    656:        for( ; ; ) {
                    657:                if((c = input()) < ' ') {       /* control character */
                    658:                        unput(c);
                    659:                        return(0);
                    660:                }
                    661:                if(c < '@') {   /* Hi X or Hi Y */
                    662:                        if(lo_y) {      /* seen a Lo Y, so this must be Hi X */
                    663:                                x &= ~HIBITS;
                    664:                                x |= (c & FIVEBITS) << SHIFTHI;
                    665:                                continue;
                    666:                        }
                    667:                        /* else Hi Y */
                    668:                        y &= ~HIBITS;
                    669:                        y |= (c & FIVEBITS) << SHIFTHI;
                    670:                        continue;
                    671:                }
                    672:                if(c < '`') {   /* Lo X */
                    673:                        x &= ~LOBITS;
                    674:                        x |= (c & FIVEBITS) << SHIFTLO;
                    675:                        screen->cur.x = x;
                    676:                        screen->cur.y = y;
                    677:                        return(1);      /* OK */
                    678:                }
                    679:                /* else Lo Y */
                    680:                if(lo_y) {      /* seen a Lo Y, so other must be extra bits */
                    681:                        e = (y >> SHIFTLO) & EXTRABITS;
                    682:                        x &= ~TWOBITS;
                    683:                        x |= e & TWOBITS;
                    684:                        y &= ~TWOBITS;
                    685:                        y |= (e >> SHIFTLO) & TWOBITS;
                    686:                }
                    687:                y &= ~LOBITS;
                    688:                y |= (c & FIVEBITS) << SHIFTLO;
                    689:                lo_y++;
                    690:        }
                    691: }
                    692: 
                    693: TCursorBack()
                    694: {
                    695:        register TScreen *screen = &term.screen;
                    696:        register struct Tek_Char *t;
                    697:        register int x, l;
                    698: 
                    699:        x = ( screen->cur_X -=
                    700:                (t = &TekChar[screen->cur.fontsize])->hsize
                    701:            );
                    702: 
                    703:        if(screen->margin == MARGIN1 && x < 0 || screen->margin == MARGIN2
                    704:         && x < TEKWIDTH / 2) {
                    705:                if((l = (screen->cur_Y + (t->vsize - 1)) / t->vsize + 1) >=
                    706:                 t->nlines) {
                    707:                        screen->margin = !screen->margin;
                    708:                        l = 0;
                    709:                }
                    710:                screen->cur_Y = l * t->vsize;
                    711:                screen->cur_X = (t->charsperline - 1) * t->hsize;
                    712:        }
                    713: }
                    714: 
                    715: TCursorForward()
                    716: {
                    717:        register TScreen *screen = &term.screen;
                    718:        register struct Tek_Char *t;
                    719:        register int l;
                    720: 
                    721:        if( ( screen->cur_X +=
                    722:                ( t = &TekChar[screen->cur.fontsize])->hsize
                    723:            ) > TEKWIDTH
                    724:          ) {
                    725:                if((l = screen->cur_Y / t->vsize - 1) < 0) {
                    726:                        screen->margin = !screen->margin;
                    727:                        l = t->nlines - 1;
                    728:                }
                    729:                screen->cur_Y = l * t->vsize;
                    730:                screen->cur_X = screen->margin == MARGIN1 ? 0 : TEKWIDTH / 2;
                    731:        }
                    732: }
                    733: 
                    734: TCursorUp()
                    735: {
                    736:        register TScreen *screen = &term.screen;
                    737:        register struct Tek_Char *t;
                    738:        register int l;
                    739: 
                    740:        t = &TekChar[screen->cur.fontsize];
                    741: 
                    742:        if((l = (screen->cur_Y + (t->vsize - 1)) / t->vsize + 1) >= t->nlines) {
                    743:                l = 0;
                    744:                if((screen->margin = !screen->margin) != MARGIN1) {
                    745:                        if(screen->cur_X < TEKWIDTH / 2)
                    746:                                screen->cur_X += TEKWIDTH / 2;
                    747:                } else if(screen->cur_X >= TEKWIDTH / 2)
                    748:                        screen->cur_X -= TEKWIDTH / 2;
                    749:        }
                    750:        screen->cur_Y = l * t->vsize;
                    751: }
                    752: 
                    753: TCursorDown()
                    754: {
                    755:        register TScreen *screen = &term.screen;
                    756:        register struct Tek_Char *t;
                    757:        register int l;
                    758: 
                    759:        t = &TekChar[screen->cur.fontsize];
                    760: 
                    761:        if((l = screen->cur_Y / t->vsize - 1) < 0) {
                    762:                l = t->nlines - 1;
                    763:                if((screen->margin = !screen->margin) != MARGIN1) {
                    764:                        if(screen->cur_X < TEKWIDTH / 2)
                    765:                                screen->cur_X += TEKWIDTH / 2;
                    766:                } else if(screen->cur_X >= TEKWIDTH / 2)
                    767:                        screen->cur_X -= TEKWIDTH / 2;
                    768:        }
                    769:        screen->cur_Y = l * t->vsize;
                    770: }
                    771: 
                    772: TekDraw (x, y)
                    773: int x, y;
                    774: {
                    775:        register TScreen *screen = &term.screen;
                    776: 
                    777:        if(nplot == 0 || T_lastx != screen->cur_X || T_lasty != screen->cur_Y) {
                    778:                /*
                    779:                 * We flush on each unconnected line segment if the line
                    780:                 * type is not solid.  This solves a bug in X when drawing
                    781:                 * points while the line type is not solid.
                    782:                 */
                    783:                if(nplot > 0 && screen->cur.linetype != SOLIDLINE)
                    784:                        TekFlush();
                    785:        }
                    786:        AddToDraw(screen->cur_X, screen->cur_Y, x, y);
                    787:        T_lastx = screen->cur_X = x;
                    788:        T_lasty = screen->cur_Y = y;
                    789: }
                    790: 
                    791: AddToDraw(x1, y1, x2, y2)
                    792: int x1, y1, x2, y2;
                    793: {
                    794:        register TScreen *screen = &term.screen;
                    795:        register XSegment *lp;
                    796: 
                    797:        if(nplot >= MAX_PTS) {
                    798:                TekFlush();
                    799:        }
                    800:        lp = line_pt++;
                    801:        lp->x1 = x1 = x1 * TekScale(screen) + screen->border;
                    802:        lp->y1 = y1 = (TEKHEIGHT + TEKTOPPAD - y1) * TekScale(screen) +
                    803:         screen->border;
                    804:        lp->x2 = x2 = x2 * TekScale(screen) + screen->border;
                    805:        lp->y2 = y2 = (TEKHEIGHT + TEKTOPPAD - y2) * TekScale(screen) +
                    806:         screen->border;
                    807:        nplot++;
                    808: }
                    809: 
                    810: TekFlush ()
                    811: {
                    812:        register TScreen *screen = &term.screen;
                    813: 
                    814:        XDrawSegments(screen->display, TWindow(screen), 
                    815:                ((screen->cur.linetype == SOLIDLINE)?  screen->TnormalGC :
                    816:                 screen->linepat[screen->cur.linetype - 1]),
                    817:                 Tline, nplot);
                    818:        nplot = 0;
                    819:        line_pt = Tline;
                    820: }
                    821: 
                    822: TekGINoff()
                    823: {
                    824:        register TScreen *screen = &term.screen;
                    825:        
                    826:        XDefineCursor(screen->display, TWindow(screen), screen->arrow);
                    827:        if(GINcursor)
                    828:                XFreeCursor(screen->display, GINcursor);
                    829:        if(screen->TekGIN) {
                    830:                *screen->TekGIN = CANCEL;       /* modify recording */
                    831:                screen->TekGIN = NULL;
                    832:        }
                    833: }
                    834: 
                    835: TekEnqMouse(c)
                    836: int c;
                    837: {
                    838:        register TScreen *screen = &term.screen;
                    839:        int mousex, mousey, winx, winy;
                    840:        unsigned int mask; /* XQueryPointer */
                    841:        Window root, subw;
                    842: 
                    843:        XQueryPointer(
                    844:            screen->display, TWindow(screen), 
                    845:            &root, &subw,
                    846:            &mousex, &mousey,
                    847:            &winx, &winy,
                    848:            &mask);
                    849:        if((mousex = (mousex - screen->border) / TekScale(screen)) < 0)
                    850:                mousex = 0;
                    851:        else if(mousex >= TEKWIDTH)
                    852:                mousex = TEKWIDTH - 1;
                    853:        if((mousey = TEKHEIGHT + TEKTOPPAD - (mousey - screen->border) /
                    854:             TekScale(screen)) < 0)
                    855:                mousey = 0;
                    856:        else if(mousey >= TEKHEIGHT)
                    857:                mousey = TEKHEIGHT - 1;
                    858:        TekEnq(c, mousex, mousey);
                    859: }
                    860: 
                    861: TekEnq (status, x, y)
                    862: int status;
                    863: register int x, y;
                    864: {
                    865:        register TScreen *screen = &term.screen;
                    866:        int pty = screen->respond;
                    867:        char cplot [5];
                    868: 
                    869:        /* Translate x and y to Tektronix code */
                    870:        cplot[1] = 040 | ((x >> SHIFTHI) & FIVEBITS);
                    871:        cplot[2] = 040 | ((x >> SHIFTLO) & FIVEBITS);
                    872:        cplot[3] = 040 | ((y >> SHIFTHI) & FIVEBITS);
                    873:        cplot[4] = 040 | ((y >> SHIFTLO) & FIVEBITS);
                    874:        if(cplot[0] = status)
                    875:                write (pty, cplot, 5);
                    876:        else
                    877:                write (pty, &cplot[1], 4);
                    878: }
                    879: 
                    880: TekRun()
                    881: {
                    882:        register TScreen *screen = &term.screen;
                    883:        register int i;
                    884:        
                    885:        if(!TWindow(screen) && !TekInit()) {
                    886:                if(VWindow(screen)) {
                    887:                        screen->TekEmu = FALSE;
                    888:                        return;
                    889:                }
                    890:                Exit(ERROR_TINIT);
                    891:        }
                    892:        if(!screen->Tshow) {
                    893:                screen->Tshow = TRUE;
                    894:                XMapRaised(screen->display, TWindow(screen));
                    895:        } else
                    896:                XRaiseWindow(screen->display, TWindow(screen));
                    897:        if(screen->select)
                    898:                TekSelect();
                    899:        if (L_flag > 0) {
                    900:                XWarpPointer (screen->display, None, TWindow(screen),
                    901:                            0, 0, 0, 0,
                    902:                            TFullWidth(screen) >> 1, TFullHeight(screen) >> 1);
                    903:                L_flag = -1;
                    904:        }
                    905:        Tpushback = Tpushb;
                    906:        Tbptr = Tbuffer;
                    907:        for(i = Tbcnt = bcnt ; i > 0 ; i--)
                    908:                *Tbptr++ = *bptr++;
                    909:        Tbptr = Tbuffer;
                    910:        Ttoggled = TRUE;
                    911:        if(!setjmp(Tekend))
                    912:                Tekparse();
                    913:        if(!Ttoggled) {
                    914:                TCursorToggle(TOGGLE);
                    915:                Ttoggled = TRUE;
                    916:        }
                    917:        screen->TekEmu = FALSE;
                    918:        TekUnselect();
                    919: }
                    920: 
                    921: #define DOTTED_LENGTH 2
                    922: #define DOT_DASHED_LENGTH 4
                    923: #define SHORT_DASHED_LENGTH 2
                    924: #define LONG_DASHED_LENGTH 2
                    925: 
                    926: static int dash_length[TEKNUMLINES] = {
                    927:        DOTTED_LENGTH,
                    928:        DOT_DASHED_LENGTH,
                    929:        SHORT_DASHED_LENGTH,
                    930:        LONG_DASHED_LENGTH,
                    931: };
                    932: 
                    933: static unsigned char dotted[DOTTED_LENGTH] = {3, 1};
                    934: static unsigned char dot_dashed[DOT_DASHED_LENGTH] = {3, 4, 3, 1};
                    935: static unsigned char short_dashed[SHORT_DASHED_LENGTH] = {4, 4};
                    936: static unsigned char long_dashed[LONG_DASHED_LENGTH] = {4, 7};
                    937: 
                    938: static unsigned char *dashes[TEKNUMLINES] = {
                    939:        dotted,
                    940:        dot_dashed,
                    941:        short_dashed,
                    942:        long_dashed,
                    943: };
                    944: 
                    945: 
                    946: 
                    947: /*ARGSUSED*/
                    948: XtEventReturnCode TekExposeWindow(event, eventdata)
                    949: register XEvent *event;
                    950: caddr_t eventdata;
                    951: {
                    952:        register TScreen *screen = &term.screen;
                    953: #ifdef DEBUG
                    954:        if(debug)
                    955:                fputs("ExposeWindow Tek\n", stderr);
                    956: #endif DEBUG
                    957:        if(!screen->Tshow) {
                    958:                screen->Tshow = TRUE;
                    959:                reselectwindow(screen);
                    960:        }
                    961:        TekExpose((XExposeEvent *) event);
                    962: 
                    963:        return (XteventHandled);
                    964: }
                    965: 
                    966: /*ARGSUSED*/
                    967: XtEventReturnCode TekUnmapWindow(event, eventdata)
                    968: XEvent *event;
                    969: caddr_t eventdata;
                    970: {
                    971:        register TScreen *screen = &term.screen;
                    972: 
                    973:        if (event->type != UnmapNotify) return(XteventNotHandled);
                    974: 
                    975: #ifdef DEBUG
                    976:        if(debug)
                    977:                fputs("UnmapWindow Tek\n", stderr);
                    978: #endif DEBUG
                    979:        screen->Tshow = FALSE;
                    980: /*     if(screen->show) {
                    981:                screen->show = FALSE;
                    982:                XUnmapWindow(screen->display, screen->fullVwin.window );
                    983:                SyncUnmap( screen->fullVwin.window, WINDOWEVENTS );
                    984:        }
                    985: */
                    986:        reselectwindow(screen);
                    987:        return (XteventHandled);
                    988: }
                    989: 
                    990: 
                    991: TekInit()
                    992: {
                    993:        register TScreen *screen = &term.screen;
                    994:        register int i;
                    995:        register TekLink *tek;
                    996:        register double d;
                    997:        register int border = 2 * screen->border;
                    998:        XColor cdef;
                    999:        int pixels[2];
                   1000:        static short Tfailed;
                   1001:        int x, y, rootx, rooty, pr;
                   1002:        Window win, root;
                   1003:        unsigned int mask; /* XQueryPointer */
                   1004:        XGCValues gcv;
                   1005:        int winX, winY, width, height;
                   1006:        XSizeHints sizehints;
                   1007:        XSetWindowAttributes attr;
                   1008:        char Tdefault[32];
                   1009:        extern char *malloc();
                   1010: 
                   1011:        if(Tfailed)
                   1012:                return(0);
                   1013:        if (!(screen->Tfont[SMALLFONT] = XLoadQueryFont(screen->display, SMALLFONTNAME))) {
                   1014:            fprintf(stderr, "%s: Could not get font %s; using server default\n",
                   1015:                    xterm_name, SMALLFONTNAME);
                   1016:            screen->Tfont[SMALLFONT] =
                   1017:              XQueryFont(screen->display,
                   1018:                         DefaultGC(screen->display,
                   1019:                                   DefaultScreen(screen->display)
                   1020:                                   )->gid
                   1021:                         );
                   1022:            TEKgcFontMask = 0;
                   1023:        }
                   1024:        if((Tbuffer = (char *)malloc(BUF_SIZE)) == NULL ||
                   1025:         (Tpushb = (char *)malloc(10)) == NULL ||
                   1026:         (Tline = (XSegment *)malloc(MAX_VTX * sizeof(XSegment))) == NULL) {
                   1027:                fprintf(stderr, "%s: Not enough core for Tek mode\n",
                   1028:                 xterm_name);
                   1029:                goto mallocfailed;
                   1030:        }
                   1031: 
                   1032:        screen->xorplane = 1;
                   1033:        screen->Tbackground = XtDefaultBGPixel;
                   1034:        screen->Tforeground = XtDefaultFGPixel;
                   1035:        screen->Tcursorcolor = XtDefaultFGPixel;
                   1036: 
                   1037:        if (DisplayCells(screen->display, DefaultScreen(screen->display)) > 2
                   1038:            && (fore_color || back_color || curs_color)) {
                   1039:                if (curs_color &&
                   1040:                    XParseColor(screen->display, TekColormap, curs_color, &cdef)) {
                   1041:                        if(XAllocColorCells(
                   1042:                            screen->display,
                   1043:                            TekColormap,
                   1044:                            0, 
                   1045:                            &screen->xorplane, 1,
                   1046:                            pixels, 2)) {
                   1047:                                screen->cellsused = TRUE;
                   1048:                                screen->colorcells[2] = cdef;
                   1049:                                screen->Tbackground = pixels[0];
                   1050:                                screen->Tforeground = pixels[1];
                   1051: 
                   1052:                                screen->Tcursorcolor = screen->Tbackground |
                   1053:                                 screen->xorplane;
                   1054:                                screen->Tcolor |= C_CURSOR;
                   1055:                                screen->planeused = TRUE;
                   1056:                        }
                   1057:                } else if (XAllocColorCells(
                   1058:                    screen->display,
                   1059:                    TekColormap, 0, 
                   1060:                    &screen->xorplane, 1, &screen->Tbackground, 1)) {
                   1061:                        screen->Tforeground = screen->Tbackground |
                   1062:                         screen->xorplane;
                   1063:                        screen->Tcursorcolor = screen->Tforeground;
                   1064:                        screen->planeused = TRUE;
                   1065:                }
                   1066:                if (screen->Tbackground != XtDefaultBGPixel) {
                   1067:                        if (back_color == NULL ||
                   1068:                                !XParseColor(screen->display,
                   1069:                                 TekColormap,
                   1070:                                 back_color, &cdef)) {
                   1071:                                cdef.pixel = XtDefaultBGPixel;
                   1072:                                XQueryColor(screen->display, TekColormap, &cdef);
                   1073:                                screen->Tcolor |= C_BACKGROUND;
                   1074:                        }
                   1075:                        cdef.pixel = screen->Tbackground;
                   1076:                        XStoreColor(screen->display, TekColormap, &cdef);
                   1077:                        if(screen->cellsused) {
                   1078:                                screen->colorcells[0] = cdef;
                   1079:                                cdef.pixel = screen->Tforeground |
                   1080:                                        screen->xorplane;
                   1081:                                XStoreColor(screen->display, TekColormap,&cdef);
                   1082:                        }
                   1083:                        if (fore_color == NULL ||
                   1084:                                !XParseColor(screen->display,
                   1085:                                 TekColormap,
                   1086:                                 fore_color, &cdef)) {
                   1087:                                cdef.pixel = XtDefaultFGPixel;
                   1088:                                XQueryColor(screen->display, TekColormap, &cdef);
                   1089:                                screen->Tcolor |= C_FOREGROUND;
                   1090:                        }
                   1091:                        cdef.pixel = screen->Tforeground;
                   1092:                        XStoreColor(screen->display, TekColormap, &cdef);
                   1093:                        if(screen->cellsused) {
                   1094:                                screen->colorcells[1] = cdef;
                   1095:                                cdef.pixel = screen->Tcursorcolor;
                   1096:                                XStoreColor(screen->display, TekColormap, &cdef);
                   1097:                        }
                   1098:                }
                   1099:        }
                   1100:        
                   1101:        if (T_geometry == NULL) {
                   1102:          sprintf(Tdefault, "=%dx%d",
                   1103:            TEKDEFWIDTH + border, TEKDEFHEIGHT + border);
                   1104:          T_geometry = Tdefault;
                   1105:        }
                   1106: 
                   1107:        winX = 1;
                   1108:        winY = 1;
                   1109:        width = TEKDEFWIDTH + border;
                   1110:        height = TEKDEFHEIGHT + border;
                   1111:        
                   1112:        pr = XParseGeometry(T_geometry, &winX, &winY, &width, &height);
                   1113:          if ((pr & XValue) && (XNegative&pr))
                   1114:           winX += DisplayWidth(screen->display, DefaultScreen(screen->display))                        - width;
                   1115:         if ((pr & YValue) && (YNegative&pr))
                   1116:           winY += DisplayHeight(screen->display, DefaultScreen(screen->display))                        - height;
                   1117:   
                   1118:        /* set up size hints */
                   1119:        sizehints.min_width = TEKMINWIDTH + border;
                   1120:        sizehints.min_height = TEKMINHEIGHT + border;
                   1121:        sizehints.width_inc = 1;
                   1122:        sizehints.height_inc = 1;
                   1123:        sizehints.flags = PMinSize|PResizeInc;
                   1124:         if ((XValue&pr) && (YValue&pr))
                   1125:           sizehints.flags |= USPosition;
                   1126:         else sizehints.flags |= PPosition;
                   1127:         sizehints.width = width;
                   1128:         sizehints.height = height;
                   1129:         if ((WidthValue&pr) && (HeightValue&pr))
                   1130:           sizehints.flags |= USSize;
                   1131:         else sizehints.flags |= PSize;
                   1132: 
                   1133:        attr.border_pixmap = screen->graybordertile;
                   1134:        attr.win_gravity = NorthWestGravity;
                   1135:        attr.background_pixel = screen->Tbackground;
                   1136:        if((TWindow(screen) = XCreateWindow(
                   1137:            screen->display,
                   1138:            DefaultRootWindow(screen->display), 
                   1139:            winX, winY, width, height, screen->borderwidth,
                   1140:            DefaultDepth(screen->display, DefaultScreen(screen->display)),
                   1141:            CopyFromParent, CopyFromParent,
                   1142:            CWBorderPixmap|CWBackPixel|CWWinGravity, &attr)) == NULL) {
                   1143:                fprintf(stderr, "%s: Can't create Tek window\n", xterm_name);
                   1144:                free((char *)Tline);
                   1145: mallocfailed:
                   1146:                if(Tpushb)
                   1147:                        free((char *)Tpushb);
                   1148:                if(Tbuffer)
                   1149:                        free((char *)Tbuffer);
                   1150:                XFreeFont(screen->display, screen->Tfont[SMALLFONT]);
                   1151: fontfailed:
                   1152:                Tfailed = TRUE;
                   1153:                return(FALSE);
                   1154:        }
                   1155:         /* crock to make configure notifies get through */
                   1156:         XtMakeMaster(screen->display, TWindow(screen));
                   1157: 
                   1158:        XSetNormalHints (screen->display, TWindow(screen), &sizehints);
                   1159: 
                   1160:        XtSetEventHandler(screen->display, TWindow(screen), 
                   1161:         (XtEventHandler) HandleEnterWindow, EnterWindowMask, (caddr_t)NULL);
                   1162:        XtSetEventHandler(screen->display, TWindow(screen), 
                   1163:         (XtEventHandler) HandleLeaveWindow, LeaveWindowMask, (caddr_t)NULL);
                   1164:        XtSetEventHandler(screen->display, TWindow(screen), 
                   1165:         (XtEventHandler) HandleFocusChange, FocusChangeMask, (caddr_t)NULL);
                   1166:        XtSetEventHandler(screen->display, TWindow(screen), 
                   1167:         (XtEventHandler) TekButtonPressed, ButtonPressMask, (caddr_t)NULL);
                   1168:        XtSetEventHandler(screen->display, TWindow(screen), 
                   1169:         (XtEventHandler) EventDoNothing, ButtonReleaseMask, (caddr_t)NULL);
                   1170:        XtSetEventHandler(screen->display, TWindow(screen), 
                   1171:         (XtEventHandler) TekExposeWindow, ExposureMask, (caddr_t)NULL);
                   1172:        XtSetEventHandler(screen->display, TWindow(screen), 
                   1173:         (XtEventHandler) TekUnmapWindow, StructureNotifyMask, (caddr_t)NULL);
                   1174:        XtSetEventHandler(screen->display, TWindow(screen), 
                   1175:         (XtEventHandler) HandleKeyPressed, KeyPressMask, (caddr_t)NULL);
                   1176: 
                   1177:        screen->Tbox = T_box;
                   1178: 
                   1179:        TFullWidth(screen) = width;
                   1180:        TFullHeight(screen) = height;
                   1181:        TWidth(screen) = width - border;
                   1182:        THeight(screen) = height - border;
                   1183:        TekScale(screen) = (double)TWidth(screen)
                   1184:                                    / (TEKWIDTH + TEKPAD);
                   1185:        if((d = (double)THeight(screen) / (TEKHEIGHT + TEKTOPPAD +
                   1186:         TEKBOTTOMPAD)) < TekScale(screen))
                   1187:                TekScale(screen) = d;
                   1188: 
                   1189: 
                   1190:        screen->tobaseline[SMALLFONT] = screen->Tfont[SMALLFONT]->ascent;
                   1191: 
                   1192:        if (!(screen->Tfont[THREEFONT] = XLoadQueryFont(screen->display, THREEFONTNAME)))
                   1193:                screen->Tfont[THREEFONT] = screen->Tfont[SMALLFONT];
                   1194:        screen->tobaseline[THREEFONT] = screen->Tfont[THREEFONT]->ascent;
                   1195: 
                   1196:        if (!(screen->Tfont[TWOFONT] = XLoadQueryFont(screen->display, TWOFONTNAME)))
                   1197:                screen->Tfont[TWOFONT] = screen->Tfont[THREEFONT];
                   1198:        screen->tobaseline[TWOFONT] = screen->Tfont[TWOFONT]->ascent;
                   1199: 
                   1200:        if (!(screen->Tfont[LARGEFONT] = XLoadQueryFont(screen->display, LARGEFONTNAME)))
                   1201:                screen->Tfont[LARGEFONT] = screen->Tfont[TWOFONT];
                   1202:        screen->tobaseline[LARGEFONT] = screen->Tfont[LARGEFONT]->ascent;
                   1203: 
                   1204:        gcv.graphics_exposures = TRUE;  /* default */
                   1205:        gcv.font = screen->Tfont[screen->cur.fontsize]->fid;
                   1206:        gcv.foreground = screen->Tforeground;
                   1207:        gcv.background = screen->Tbackground;
                   1208:        screen->TnormalGC = XCreateGC(
                   1209:            screen->display, TWindow(screen), 
                   1210:            TEKgcFontMask+GCGraphicsExposures+GCForeground+GCBackground, &gcv);
                   1211: 
                   1212:        gcv.foreground = screen->Tcursorcolor;
                   1213:        gcv.background = screen->Tbackground;
                   1214:        gcv.function = GXinvert;
                   1215:        gcv.plane_mask = screen->xorplane;
                   1216:        screen->TcursorGC = XCreateGC(screen->display, TWindow(screen), 
                   1217:         GCFunction+GCPlaneMask+GCForeground+GCBackground , &gcv);
                   1218: 
                   1219:        if(term.flags & REVERSE_VIDEO) {
                   1220:                TekReverseVideo(screen);
                   1221:        } else
                   1222:                TekBackground(screen);
                   1223: 
                   1224:        gcv.foreground = screen->Tforeground;
                   1225:        gcv.line_style = LineOnOffDash;
                   1226:        for(i = 0 ; i < TEKNUMLINES ; i++) {
                   1227:                screen->linepat[i] = XCreateGC(
                   1228:                    screen->display, TWindow(screen),
                   1229:                    GCForeground+GCLineStyle, &gcv); 
                   1230:                XSetDashes(screen->display, screen->linepat[i], 0,
                   1231:                 dashes[i], dash_length[i]);
                   1232:        }
                   1233:        screen->margin = MARGIN1;               /* Margin 1             */
                   1234:        screen->cur.fontsize = LARGEFONT;       /* set large font       */
                   1235:        screen->TekGIN = FALSE;                 /* GIN off              */
                   1236: 
                   1237: 
                   1238:        XDefineCursor(screen->display, TWindow(screen), screen->curs );
                   1239:        if((screen->Ticonname = malloc((unsigned) screen->iconnamelen + 7)) == NULL)
                   1240:                Error(ERROR_TWINNAME);
                   1241:        strcpy(screen->Ticonname, screen->iconname);
                   1242:        strcat(screen->Ticonname, "(Tek) ");
                   1243:        screen->Ticonnamelen = strlen(screen->Ticonname);
                   1244:        if((screen->Ttitlename = malloc((unsigned) screen->titlenamelen + 7)) == NULL)
                   1245:                Error(ERROR_TWINNAME);
                   1246:        strcpy(screen->Ttitlename, screen->titlename);
                   1247:        strcat(screen->Ttitlename, "(Tek) ");
                   1248:        screen->Ttitlenamelen = strlen(screen->Ttitlename);
                   1249:        XStoreName (screen->display, TWindow(screen), screen->Ttitlename);
                   1250:        XChangeProperty(screen->display, TWindow(screen), XA_WM_ICON_NAME,
                   1251:          XA_STRING, 8, PropModeReplace, (unsigned char *)screen->Ticonname,
                   1252:          screen->Ticonnamelen);
                   1253: 
                   1254: 
                   1255:        tek = TekRecord = &Tek0;
                   1256:        tek->next = (TekLink *)0;
                   1257:        tek->count = 0;
                   1258:        tek->ptr = tek->data;
                   1259:        Tpushback = Tpushb;
                   1260:        screen->cur_X = 0;
                   1261:        screen->cur_Y = TEKHOME;
                   1262:        line_pt = Tline;
                   1263:        Ttoggled = TRUE;
                   1264:        return(TRUE);
                   1265: }
                   1266: 
                   1267: TekReverseVideo(screen)
                   1268: register TScreen *screen;
                   1269: {
                   1270:        register int flag, i;
                   1271:        XGCValues gcv;
                   1272:         
                   1273: 
                   1274:        i = screen->Tbackground;
                   1275:        screen->Tbackground = screen->Tforeground;
                   1276:        screen->Tforeground = i;
                   1277:        screen->Tcolor = (screen->Tcolor & ~C_FBMASK) | switchfb[screen->Tcolor
                   1278:         & C_FBMASK];
                   1279:        
                   1280:        XSetForeground(screen->display, screen->TnormalGC, 
                   1281:         screen->Tforeground);
                   1282:        XSetBackground(screen->display, screen->TnormalGC, 
                   1283:         screen->Tbackground);
                   1284: 
                   1285:        for(i = 0 ; i < TEKNUMLINES ; i++) {
                   1286:                XSetForeground(screen->display, screen->linepat[i], 
                   1287:                 screen->Tforeground);
                   1288:        }
                   1289: 
                   1290:        if(screen->cellsused) {
                   1291:                flag = (term.flags & REVERSE_VIDEO) != 0;
                   1292:                screen->Tcursorcolor = screen->Tbackground | screen->xorplane;
                   1293:                i = screen->select ? 2 : !flag;
                   1294:                screen->colorcells[i].pixel = screen->Tcursorcolor;
                   1295:                XStoreColor(screen->display, TekColormap, &screen->colorcells[i]);
                   1296:                screen->colorcells[flag].pixel = screen->Tforeground |
                   1297:                 screen->xorplane;
                   1298:                XStoreColor(screen->display, TekColormap, &screen->colorcells[flag]);
                   1299:        } else
                   1300:                screen->Tcursorcolor = screen->Tforeground;
                   1301: 
                   1302:        gcv.foreground = screen->Tcursorcolor;
                   1303:        gcv.background = screen->Tbackground;
                   1304:        XChangeGC(screen->display, screen->TcursorGC, 
                   1305:          GCForeground+GCBackground, &gcv);
                   1306: 
                   1307:        TekBackground(screen);
                   1308: }
                   1309: 
                   1310: TekBackground(screen)
                   1311: register TScreen *screen;
                   1312: {
                   1313:        if(TWindow(screen))
                   1314:                XSetWindowBackground(screen->display, TWindow(screen), 
                   1315:                 screen->Tbackground);
                   1316: }
                   1317: 
                   1318: /*
                   1319:  * Toggles cursor on or off at cursor position in screen.
                   1320:  */
                   1321: TCursorToggle(toggle)
                   1322: int toggle;
                   1323: {
                   1324:        register TScreen *screen = &term.screen;
                   1325:        register int c, x, y;
                   1326:        register T_fontsize *Tf;
                   1327: 
                   1328:        c = screen->cur.fontsize;
                   1329:        Tf = &Tfontsize[c];
                   1330: 
                   1331:        x = (screen->cur_X * TekScale(screen)) + screen->border;
                   1332:        y = ((TEKHEIGHT + TEKTOPPAD - screen->cur_Y) * TekScale(screen)) +
                   1333:         screen->border + screen->tobaseline[c] - 2*(unsigned) Tf->Theight;
                   1334:        if (toggle) {
                   1335:           if (screen->select) 
                   1336:                XFillRectangle(
                   1337:                    screen->display, TWindow(screen), screen->TcursorGC,
                   1338:                    x, y,
                   1339:                    (unsigned) Tf->Twidth, (unsigned) Tf->Theight);
                   1340:          else { /* fix to use different GC! */
                   1341:                  screen->Tbox[c]->x = x;
                   1342:                  screen->Tbox[c]->y = y ;
                   1343:                  XDrawLines(screen->display, TWindow(screen), 
                   1344:                    screen->TcursorGC,
                   1345:                    screen->Tbox[c], NBOX, CoordModePrevious);
                   1346:           }
                   1347:        } else {
                   1348:           if (screen->select) 
                   1349:                XClearArea(screen->display, TWindow(screen), x, y,
                   1350:                    (unsigned) Tf->Twidth, (unsigned) Tf->Theight, FALSE);
                   1351:           else { 
                   1352:                  screen->Tbox[c]->x = x;
                   1353:                  screen->Tbox[c]->y = y ;
                   1354:                  XDrawLines(screen->display, TWindow(screen), 
                   1355:                    screen->TcursorGC,
                   1356:                    screen->Tbox[c], NBOX, CoordModePrevious);
                   1357:           }
                   1358:        }
                   1359: }
                   1360: 
                   1361: TekSelect()
                   1362: {
                   1363:        register TScreen *screen = &term.screen;
                   1364: 
                   1365:        XSetWindowBorder(screen->display, TWindow(screen), screen->bordercolor);
                   1366: }
                   1367: 
                   1368: TekUnselect()
                   1369: {
                   1370:        register TScreen *screen = &term.screen;
                   1371: 
                   1372:        XSetWindowBorderPixmap(screen->display, TWindow(screen), screen->graybordertile);
                   1373: }
                   1374: 
                   1375: TekCopy()
                   1376: {
                   1377:        register TekLink *Tp;
                   1378:        register int fd;
                   1379:        register TScreen *screen = &term.screen;
                   1380:        register struct tm *tp;
                   1381:        long l;
                   1382:        char buf[32];
                   1383: 
                   1384:        /* for login windows, check that a user has logged in */
                   1385:        if(L_flag && !checklogin()) {
                   1386:                Bell();
                   1387:                return;
                   1388:        }
                   1389:        time(&l);
                   1390:        tp = localtime(&l);
                   1391:        sprintf(buf, "COPY%02d-%02d-%02d.%02d:%02d:%02d", tp->tm_year,
                   1392:         tp->tm_mon, tp->tm_mday, tp->tm_hour, tp->tm_min, tp->tm_sec);
1.1.1.2 ! root     1393:        if(access(buf, 0) >= 0) {       /* file exists */
        !          1394:                if(access(buf, 2) < 0) {
1.1       root     1395:                        Bell();
                   1396:                        return;
                   1397:                }
1.1.1.2 ! root     1398:        } else if(access(".", 2) < 0) { /* can't write in directory */
1.1       root     1399:                Bell();
                   1400:                return;
                   1401:        }
1.1.1.2 ! root     1402:        if((fd = creat(buf, 0644)) < 0) {
1.1       root     1403:                Bell();
                   1404:                return;
                   1405:        }
                   1406:        chown(buf, screen->uid, screen->gid);
                   1407:        sprintf(buf, "\033%c\033%c", screen->page.fontsize + '8',
                   1408:         screen->page.linetype + '`');
                   1409:        write(fd, buf, 4);
                   1410:        Tp = &Tek0; 
                   1411:        do
                   1412:                write(fd, (char *)Tp->data, Tp->count);
                   1413:        while(Tp = Tp->next);
                   1414:        close(fd);
                   1415: }
                   1416: 
                   1417: #ifdef MODEMENU
                   1418: /*
                   1419:  * TMENU_LARGE through TMENU_SMALL must be first, as they must be the same
                   1420:  * as the font size values LARGEFONT through SMALLFONT
                   1421:  */
                   1422: #define        TMENU_LARGE     0
                   1423: #define        TMENU_NUM2      (TMENU_LARGE+1)
                   1424: #define        TMENU_NUM3      (TMENU_NUM2+1)
                   1425: #define        TMENU_SMALL     (TMENU_NUM3+1)
                   1426: #define        TMENU_VTWIN     (TMENU_SMALL+1)
                   1427: #define        TMENU_LINE      (TMENU_VTWIN+1)
                   1428: #define        TMENU_PAGE      (TMENU_LINE+1)
                   1429: #define        TMENU_RESET     (TMENU_PAGE+1)
                   1430: #define        TMENU_COPY      (TMENU_RESET+1)
                   1431: #define        TMENU_VTMODE    (TMENU_COPY+1)
                   1432: #define        TMENU_HIDETEK   (TMENU_VTMODE+1)
                   1433: 
                   1434: static char *Ttext[] = {
                   1435:        "Large Characters",
                   1436:        "#2 Size Characters",
                   1437:        "#3 Size Characters",
                   1438:        "Small Characters",
                   1439:        "VT Window Showing",
                   1440:        "-",
                   1441:        "PAGE",
                   1442:        "RESET",
                   1443:        "COPY",
                   1444:        "Select VT Mode",
                   1445:        "Hide Tek Window",
                   1446:        0,
                   1447: };
                   1448: 
                   1449: static Tmodes curmodes;
                   1450: static int Tsize;
                   1451: 
                   1452: Menu *Tsetupmenu(menu)
                   1453: register Menu **menu;
                   1454: {
                   1455:        register TScreen *screen = &term.screen;
                   1456:        register char **cp;
                   1457:        register int size = screen->cur.fontsize;
                   1458:        register int kflags = term.keyboard.flags;
                   1459: 
                   1460:        curmodes = screen->cur;
                   1461:        if (*menu == NULL) {
                   1462:                if ((*menu = NewMenu("Tektronix", re_verse)) == NULL)
                   1463:                        return(NULL);
                   1464:                for(cp = Ttext ; *cp ; cp++)
                   1465:                        AddMenuItem(*menu, *cp);
                   1466:                CheckItem(*menu, size);
                   1467: /*             if(vshow = screen->show)
                   1468:                        CheckItem(*menu, TMENU_VTWIN);
                   1469:                else
                   1470:                        DisableItem(*menu, TMENU_HIDETEK);
                   1471: */
                   1472:                DisableItem(*menu, TMENU_LINE);
                   1473:                Tsize = size;
                   1474:                return(*menu);
                   1475:        }
                   1476:        if (Tsize != size) {
                   1477:                UncheckItem(*menu, Tsize);
                   1478:                CheckItem(*menu, Tsize = size);
                   1479:        }
                   1480: /*     if(vshow != screen->show) {
                   1481:                SetItemCheck(*menu, TMENU_VTWIN, (vshow = screen->show));
                   1482:                SetItemDisable(*menu, TMENU_HIDETEK, !vshow);
                   1483:        }
                   1484: */
                   1485:        return(*menu);
                   1486: }
                   1487: 
                   1488: static char *changesize[] = {
                   1489:        "\0338",
                   1490:        "\0339",
                   1491:        "\033:",
                   1492:        "\033;",
                   1493: };
                   1494: 
                   1495: Tdomenufunc(item)
                   1496: int item;
                   1497: {
                   1498:        register TScreen *screen = &term.screen;
                   1499:        register char *tp;
                   1500:        register char *fp;
                   1501:        Window win;
                   1502:        int x, y;
                   1503: 
                   1504:        switch (item) {
                   1505:        case TMENU_LARGE:
                   1506:        case TMENU_NUM2:
                   1507:        case TMENU_NUM3:
                   1508:        case TMENU_SMALL:
                   1509:                if(!Ttoggled) {
                   1510:                        TCursorToggle(TOGGLE);
                   1511:                        Ttoggled = TRUE;
                   1512:                }
                   1513:                if(Tbcnt < 0)
                   1514:                        Tbcnt = 0;
                   1515:                for(fp = changesize[item], tp = &Tbptr[Tbcnt] ; *fp ; ) {
                   1516:                        *tp++ = *fp++;
                   1517:                        Tbcnt++;
                   1518:                }
                   1519:                break;
                   1520: 
                   1521:        case TMENU_RESET:
                   1522:                bzero((char *)&curmodes, sizeof(Tmodes));
                   1523:                        /* drop through */
                   1524:        case TMENU_PAGE:
                   1525:                TekRefresh = (TekLink *)0;
                   1526:                screen->cur = curmodes;
                   1527:                TekPage();
                   1528:                screen->cur_X = 0;
                   1529:                screen->cur_Y = TEKHOME;
                   1530:                break;
                   1531: 
                   1532:        case TMENU_COPY:
                   1533:                TekCopy();
                   1534:                break;
                   1535: 
                   1536:        case TMENU_HIDETEK:
                   1537:                screen->Tshow = FALSE;
                   1538:                XUnmapWindow(screen->display, TWindow(screen));
                   1539:                SyncUnmap(TWindow(screen), TWINDOWEVENTS);
                   1540:                reselectwindow(screen);
                   1541:                TekRefresh = (TekLink *)0;
                   1542:                        /* drop through */
                   1543:        case TMENU_VTMODE:
                   1544:                if(TekRefresh)
                   1545:                        dorefresh();
                   1546:                if(screen->TekEmu) {
                   1547:                        if(screen->logging) {
                   1548:                                FlushLog(screen);
                   1549:                                screen->logstart = buffer;
                   1550:                        }
                   1551:                        longjmp(Tekend, 1);
                   1552:                } else
                   1553:                        XRaiseWindow(screen->display, VWindow(screen));
                   1554:                break;
                   1555: 
                   1556:        case TMENU_VTWIN:
                   1557: /*             if(screen->show = !screen->show) {
                   1558:                        if(VWindow(screen) || VTInit()) {
                   1559:                                XMapWindow(screen->display, VWindow(screen));
                   1560:                                screen->show = TRUE;
                   1561:                        }
                   1562:                } else {
                   1563:                        screen->show = FALSE;
                   1564:                        XUnmapWindow(screen->display, VWindow(screen));
                   1565:                        SyncUnmap(VWindow(screen), WINDOWEVENTS);
                   1566:                        if(!screen->TekEmu) {
                   1567:                                if(TekRefresh)
                   1568:                                        dorefresh();
                   1569:                                if(screen->logging) {
                   1570:                                        FlushLog(screen);
                   1571:                                        screen->logstart = Tbuffer;
                   1572:                                }
                   1573:                                screen->TekEmu = TRUE;
                   1574:                                longjmp(VTend, 1);
                   1575:                        }
                   1576:                }
                   1577: */
                   1578:                reselectwindow(screen);
                   1579:                break;
                   1580:        }
                   1581:        if(TekRefresh)
                   1582:                dorefresh();
                   1583: }
                   1584: #endif MODEMENU
                   1585: 
                   1586: 

unix.superglobalmegacorp.com

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