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

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

unix.superglobalmegacorp.com

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