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

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

unix.superglobalmegacorp.com

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