Annotation of 43BSD/contrib/X/xterm/Tplot.c, revision 1.1

1.1     ! root        1: #include <X/mit-copyright.h>
        !             2: 
        !             3: /* Copyright 1984, 1985 Massachusetts Institute of Technology */
        !             4: /* Tplot.c */
        !             5: 
        !             6: #ifndef lint
        !             7: static char *rcsid_Tplot_c = "$Header: Tplot.c,v 10.8 86/02/01 16:05:23 tony Rel $";
        !             8: #endif lint
        !             9: 
        !            10: #include <X/Xlib.h>
        !            11: #include "ptyx.h"
        !            12: #undef CTRL
        !            13: #include <stdio.h>
        !            14: #include <sys/file.h>
        !            15: #include <sgtty.h>
        !            16: #include <pwd.h>
        !            17: #undef CTRL
        !            18: 
        !            19: extern debug;
        !            20: 
        !            21: static int bplot[5];
        !            22: static int nplot;
        !            23: static int ipchr;
        !            24: static int refresh;
        !            25: static int LoYSet;
        !            26: 
        !            27: #define MAX_PTS 150
        !            28: #define MAX_VTX 300
        !            29: static Vertex Tline[MAX_VTX];
        !            30: static Vertex *line_pt;
        !            31: 
        !            32: static FILE *rfile, *wfile;
        !            33: 
        !            34: static TekLink *TekBuf = NULL;
        !            35: TekLink *tb_end_link = NULL;     /* world accessible for TekBufPut */
        !            36: int tb_end = TEK_LINK_BLOCK_SIZE; /* world accessible for TekBufPut */
        !            37: static TekLink *tb_pt_link = NULL;
        !            38: static int tb_pt = TEK_LINK_BLOCK_SIZE;
        !            39: 
        !            40: #include "../cursors/tcross.cursor"
        !            41: #include "../cursors/tcross_mask.cursor"
        !            42: 
        !            43: TekErase (term)
        !            44: 
        !            45: /* Reset buffer pointer for display list to start of buffer */
        !            46: 
        !            47: Terminal *term;
        !            48: {
        !            49:        register Screen *screen = &term->screen;
        !            50:        register struct _TekLink *pnt;
        !            51:        register struct _TekLink *next;
        !            52: 
        !            53:        pnt = (struct _TekLink *) TekBuf;
        !            54: 
        !            55:        /* free stored list */
        !            56:        while (pnt)
        !            57:        {
        !            58:                next = pnt->next;
        !            59:                free (pnt);
        !            60:                pnt = next;
        !            61:        }
        !            62:                
        !            63:        /* reset pointers */
        !            64:        TekBuf = tb_end_link = tb_pt_link = NULL;
        !            65:        tb_end = tb_pt = TEK_LINK_BLOCK_SIZE;
        !            66: 
        !            67:        refresh = 0;
        !            68:        screen->cur_x = 0;
        !            69:        screen->cur_y = 0;
        !            70:        screen->TekGMode = 0;
        !            71:        screen->TekAMode = 0;
        !            72:        LoYSet = 0;
        !            73: 
        !            74:        if (debug) wfile = fopen ("testbufw","w"); 
        !            75: 
        !            76:        return;
        !            77: }
        !            78: 
        !            79: 
        !            80: TekRefresh (term)
        !            81: 
        !            82: /* Redisplay graphics screen, including positioned alpha strings */
        !            83: 
        !            84: register Terminal *term;
        !            85: {
        !            86:        register Screen *screen = &term->screen;
        !            87:        Window window = screen->window;
        !            88:        Font fnt = screen->fnt_norm;
        !            89:        int chr, nstr;
        !            90:        register int ch;
        !            91:        unsigned char str[257];
        !            92:        int modeG = screen->TekGMode, modeA = screen->TekAMode,
        !            93:            modeI = screen->TekIMode, modeP = screen->TekPMode;
        !            94: 
        !            95:        TekBufResetPt ();
        !            96: 
        !            97:        if (TekBufEmpty ()) return;
        !            98: 
        !            99:        if (debug) rfile = fopen ("testbufr","w"); 
        !           100: 
        !           101:        refresh = 1;
        !           102:        TekAlph (term,0);
        !           103:        screen->cur_x = screen->cur_y = 0;
        !           104: 
        !           105:        while (TekBufGet (&chr) != -1)
        !           106:        {
        !           107:                ch = chr;       /* lets get the char into a register */
        !           108:                if (screen->TekGMode)
        !           109:                {
        !           110:                        if (ch > 31)
        !           111:                        {
        !           112:                                if (screen->TekIMode) TekPoint (term,ch);
        !           113:                                else TekPlot (term,ch);
        !           114:                        }
        !           115:                        else if (ch > 27 && ch < 31) TekInit (term,ch);
        !           116:                        else if (ch == 31 || ch < 28) TekAlph (term,0);
        !           117:                        continue;
        !           118:                }
        !           119: 
        !           120:                if (ch > 27 && ch < 31)
        !           121:                {
        !           122:                        TekInit (term, ch);
        !           123:                        continue;
        !           124:                }
        !           125: 
        !           126:                if (ch > (unsigned) 128)
        !           127:                {
        !           128:                        nstr = ch - (unsigned) 128;
        !           129: 
        !           130:                        if (debug)
        !           131:                        {
        !           132:                                fprintf (rfile,"alpha mode %d chars\n",nstr);
        !           133:                                fflush (rfile);
        !           134:                        }
        !           135: 
        !           136:                        if (nstr > 256) exit (77);
        !           137:                        TekBufGetString (str, nstr);
        !           138:                        *(str + nstr) = NULL;
        !           139: 
        !           140:                        XTextMask ( window,
        !           141:                                TCursorX(screen), TCursorY(screen),
        !           142:                                str, nstr, fnt, screen->foreground);
        !           143: 
        !           144:                        screen->cur_X += (nstr * screen->f_width);
        !           145:                        screen->cur_x +=
        !           146:                                (nstr * screen->f_width / screen->TekScale);
        !           147:                }
        !           148:            }
        !           149: 
        !           150:        if (nplot > 0) TekFlush (term);
        !           151:        refresh = 0;
        !           152: 
        !           153:        screen->TekGMode = modeG;
        !           154:        screen->TekAMode = modeA;
        !           155:        screen->TekIMode = modeI;
        !           156:        screen->TekPMode = modeP;
        !           157: }
        !           158: 
        !           159: 
        !           160: TekString (term, str, nchr)
        !           161: 
        !           162: /* Display positioned alphanumeric string, saving it in display list */
        !           163: 
        !           164: register Terminal *term;
        !           165: unsigned char *str;
        !           166: int nchr;
        !           167: {
        !           168:        register Screen *screen = &term->screen;
        !           169:        Window window = screen->window;
        !           170:        Font fnt = screen->fnt_norm;
        !           171: 
        !           172:        TekBufPut (128 + nchr);
        !           173:        if (debug)
        !           174:        {
        !           175:                fprintf (wfile,"alpha mode %d character string\n",nchr);
        !           176:                fflush (wfile);
        !           177:        }
        !           178: 
        !           179:        TekBufPutString (str, nchr);
        !           180: 
        !           181:        XTextMask (window,
        !           182:                TCursorX(screen), TCursorY(screen),
        !           183:                str, nchr, fnt, screen->foreground);
        !           184: 
        !           185:        screen->cur_X = screen->cur_X + (nchr * screen->f_width);
        !           186:        screen->cur_x = screen->cur_x +
        !           187:                        (nchr * screen->f_width / screen->TekScale);
        !           188: }
        !           189: 
        !           190: TekBufResetPt ()
        !           191: /* set pt to point to beginning of buffer */
        !           192: {
        !           193:        tb_pt_link = TekBuf;
        !           194:        tb_pt = 0;
        !           195: }
        !           196: 
        !           197: TekBufEmpty ()
        !           198: /* return nonzero iff TekBuf is empty */
        !           199: {
        !           200:        return (((tb_end & ~TEK_LINK_BLOCK_SIZE) == 0)
        !           201:                && (tb_end_link == TekBuf));
        !           202: }
        !           203: 
        !           204: 
        !           205: /* Extend display buffer */
        !           206: TekBufExtend ()
        !           207: {
        !           208: 
        !           209:        /* if TekBuf is NULL then must initialize */
        !           210:        if (!TekBuf)
        !           211:        {
        !           212:                TekBuf = (TekLink *) malloc (sizeof (TekLink));
        !           213:                TekBuf->next = NULL;
        !           214:                tb_end_link = TekBuf;
        !           215:                tb_end = 0;
        !           216:        }
        !           217:        else
        !           218:        {
        !           219:                tb_end_link->next =
        !           220:                (struct _TekLink *) malloc (sizeof (TekLink));
        !           221:                tb_end_link = (TekLink *) tb_end_link->next;
        !           222:                tb_end_link->next = NULL;
        !           223:                tb_end = 0;
        !           224:        }
        !           225: }
        !           226: 
        !           227: /*
        !           228:    effect: puts len bytes at str into display buffer
        !           229:  */
        !           230: TekBufPutString (str, len)
        !           231: register unsigned char *str;
        !           232: register int len;
        !           233: {
        !           234:        register int amount;
        !           235: 
        !           236:        while (len)
        !           237:        {
        !           238:                if (tb_end & TEK_LINK_BLOCK_SIZE) TekBufExtend ();
        !           239: 
        !           240:                amount = TEK_LINK_BLOCK_SIZE - tb_end;
        !           241:                if (amount > len) amount = len;
        !           242: 
        !           243:                bcopy (str, tb_end_link->data + tb_end, amount);
        !           244:                str += amount;
        !           245:                len -= amount;
        !           246:                tb_end += amount;
        !           247:        }
        !           248: }
        !           249: 
        !           250: 
        !           251: /* Read character from display list */
        !           252: 
        !           253: int TekBufGet (chr)
        !           254: register unsigned int *chr;
        !           255: {
        !           256:        if (tb_pt & TEK_LINK_BLOCK_SIZE)
        !           257: 
        !           258:        /* if tb_pt_link is NULL then check for a TekBuf */
        !           259:            if (!tb_pt_link)
        !           260:            {
        !           261:                if (!TekBuf) return (-1);
        !           262:                tb_pt_link = TekBuf;
        !           263:                tb_pt = 0;
        !           264:            }
        !           265:            else
        !           266:                if (tb_pt_link->next == NULL) return (-1);
        !           267:                else
        !           268:                {
        !           269:                        tb_pt_link = (TekLink *) tb_pt_link->next;
        !           270:                        tb_pt = 0;
        !           271:                }
        !           272:                
        !           273:        if ((tb_pt_link ==  tb_end_link) && (tb_pt >= tb_end)) return (-1);
        !           274: 
        !           275:        *chr = tb_pt_link->data [tb_pt++];
        !           276:        return (0);
        !           277: }
        !           278: 
        !           279: /* store next len characters of TekBuf in str, advancing tb_pt */
        !           280: TekBufGetString (str, len)
        !           281: register char *str;
        !           282: register int len;
        !           283: {
        !           284:        register int n;
        !           285: 
        !           286:        while (len)
        !           287:        {
        !           288:                n = TEK_LINK_BLOCK_SIZE - tb_pt;
        !           289:                n = (n < len) ? n : len;
        !           290: 
        !           291:                bcopy (tb_pt_link->data + tb_pt, str, n);
        !           292:                tb_pt += n;
        !           293:                len -= n;
        !           294:                str += n;
        !           295: 
        !           296:                if (tb_pt == TEK_LINK_BLOCK_SIZE)
        !           297:                {
        !           298:                        if (tb_pt_link->next == NULL) return;
        !           299:                        tb_pt_link = (TekLink *) tb_pt_link->next;
        !           300:                        tb_pt = 0;
        !           301:                }
        !           302:        }
        !           303: }
        !           304: 
        !           305: /* Switch to graphics mode and initialize byte and point counters */
        !           306: 
        !           307: TekInit (term,chr)
        !           308: Terminal *term;
        !           309: register int chr;
        !           310: {
        !           311:        register Screen *screen = &term->screen;
        !           312: 
        !           313:        if (debug)
        !           314:            if (!refresh)
        !           315:                {
        !           316:                fprintf (wfile,"switching to graphics mode %d\n",chr);
        !           317:                fflush (wfile);
        !           318:                }
        !           319:            else
        !           320:                {
        !           321:                fprintf (rfile,"switching to graphics mode %d\n",chr);
        !           322:                fflush (rfile);
        !           323:                }
        !           324: 
        !           325:        if (!screen->TekGMode && nplot > 0) TekFlush (term);
        !           326: 
        !           327:        screen->pen = 0;
        !           328:        ipchr = 0;
        !           329:        screen->TekPMode = 0;
        !           330:        screen->TekIMode = 0;
        !           331:        if (chr == 28) screen->TekPMode = 1;
        !           332:        if (chr == 30) screen->TekIMode = 1;
        !           333: 
        !           334:        if (!refresh) TekBufPut (chr);
        !           335:        if (screen->TekGMode) return;
        !           336: 
        !           337:        nplot = 0;
        !           338:        screen->TekGMode = 1;
        !           339:        screen->TekAMode = 1;
        !           340: /*
        !           341:  *     screen->cur_row = 0;
        !           342:  *     screen->cur_col = 0;
        !           343:  */
        !           344:        line_pt = Tline;
        !           345: }
        !           346: 
        !           347: TekAlph (term,chr)
        !           348: 
        !           349: /* Switch back to alphanumeric mode from graphics mode */
        !           350: 
        !           351: Terminal *term;
        !           352: int chr;
        !           353: {
        !           354:        register Screen *screen = &term->screen;
        !           355: 
        !           356:        if (!screen->TekGMode) return;
        !           357: 
        !           358:        if (debug)
        !           359:            if (!refresh)
        !           360:                {
        !           361:                fprintf (wfile,"switching to alpha mode %d\n",chr);
        !           362:                fflush (wfile);
        !           363:                }
        !           364:            else
        !           365:                {
        !           366:                fprintf (rfile,"switching to alpha mode %d\n",chr);
        !           367:                fflush (rfile);
        !           368:                }
        !           369: 
        !           370:        if (!refresh) TekBufPut (chr);
        !           371:        if (nplot > 0) TekFlush (term);
        !           372: 
        !           373:        screen->TekGMode = 0;
        !           374:        screen->TekPMode = 0;
        !           375:        screen->TekIMode = 0;
        !           376:        if (chr>0 && chr != 31) TekReset(term);
        !           377:        return;
        !           378: }
        !           379: 
        !           380: 
        !           381: TekReset (term)
        !           382: 
        !           383: /* Switch back to vt100 alphanumeric mode from Tektronix alphanumeric mode
        !           384:  *  This allows alphanumeric strings to be positioned by graphics commands,
        !           385:  *  but reenables scrolling after CR or LF.  */
        !           386: 
        !           387: Terminal *term;
        !           388: {
        !           389:        register Screen *screen = &term->screen;
        !           390:        int fh = screen->f_height;
        !           391:        int fw = screen->f_width;
        !           392: 
        !           393:        screen->TekAMode = 0;
        !           394: 
        !           395:        if (debug)
        !           396:            if (!refresh)
        !           397:                {
        !           398:                fprintf (wfile,"resetting to alpha mode\n");
        !           399:                fflush (wfile);
        !           400:                }
        !           401:            else
        !           402:                {
        !           403:                fprintf (rfile,"resetting to alpha mode\n");
        !           404:                fflush (rfile);
        !           405:                }
        !           406: 
        !           407:        if (screen->cur_Y > 0)
        !           408:           {
        !           409:           screen->cur_row = (screen->cur_Y - (fh >> 1)) / fh;
        !           410:           if (screen->cur_row > screen->max_row)
        !           411:                screen->cur_row = screen->max_row;
        !           412:           screen->cur_Y = 0;
        !           413:           }
        !           414:        if (screen->cur_X > 0)
        !           415:           {
        !           416:           screen->cur_col = (screen->cur_X + (fw >> 1)) / fw;
        !           417:           if (screen->cur_col > screen->max_col)
        !           418:                screen->cur_col = screen->max_col;
        !           419:           screen->cur_X = 0;
        !           420:           }
        !           421:        screen->cur_x = 0;
        !           422:        screen->cur_y = 0;
        !           423: 
        !           424:        return;
        !           425: }
        !           426: 
        !           427: 
        !           428: TekCursor (term)
        !           429: 
        !           430: /* Reads position of mouse cursor when a character is typed and returns
        !           431:  *  it in Tektronix-format coordinates */
        !           432: 
        !           433: Terminal *term;
        !           434: {
        !           435:        register Screen *screen = &term->screen;
        !           436:        Keyboard *keyboard = &term->keyboard;
        !           437:        register Window window = screen->window;
        !           438:        int MouseX, MouseY;
        !           439:        XEvent reply;
        !           440:        XEvent *rep = &reply;
        !           441:        Window subw;
        !           442:        int pty = screen->respond;
        !           443:        int keycode, event, shifts;
        !           444:        short c;
        !           445:        char cplot [5];
        !           446:        extern int wflush ();
        !           447:        int x, y;
        !           448:        Cursor cursor;
        !           449:        char *string = " ";
        !           450:        int nbytes;
        !           451: 
        !           452:        TekAlph (term, 0);
        !           453:        TekReset (term);
        !           454: 
        !           455:        /* Set cross-hair cursor raster array */
        !           456:        cursor = XCreateCursor(tcross_width, tcross_height, 
        !           457:                tcross_bits, tcross_bits, 7, 7,
        !           458:                screen->foreground, screen->background, GXxor);
        !           459: 
        !           460:        /* Display cross-hair cursor */
        !           461:        XDefineCursor(window, cursor);
        !           462:        
        !           463:        /* reselect input.  Must be careful not to leave stray button
        !           464:         * events upon return since handle buttons would be invoked */
        !           465: 
        !           466:        XSelectInput (window, ButtonReleased | KeyPressed);
        !           467: 
        !           468:        /* Wait for keyboard entry */
        !           469:        XWindowEvent (window, KeyPressed | ButtonReleased, &reply);
        !           470: 
        !           471:        keycode = ((XKeyOrButtonEvent *)rep)->detail;
        !           472:        event = reply.type;
        !           473: 
        !           474:        /* Get current mouse position and translate to screen coordinates */
        !           475:        XUpdateMouse (window, &MouseX, &MouseY, &subw);
        !           476: 
        !           477:        x = ((MouseX - screen->border) << 1);
        !           478:        y = 782 - ((MouseY - screen->border) << 1);
        !           479:        screen->cur_X = MouseX;
        !           480:        screen->cur_Y = MouseY;
        !           481: 
        !           482:        /* Translate x and y to Tektronix code */
        !           483:        cplot[1] = 32 + (x >> 5);
        !           484:        cplot[2] = 32 + (x & 31);
        !           485:        cplot[3] = 32 + (y >> 5);
        !           486:        cplot[4] = 32 + (y & 31);
        !           487: 
        !           488:        /* Translate keyboard entry and return one byte from terminal */
        !           489:        if (event == KeyPressed)
        !           490:        {
        !           491:                string = XLookupMapping ((XKeyPressedEvent *)& reply, &nbytes);
        !           492:                c = *string;
        !           493:        }
        !           494:        else c = keycode + 48;
        !           495: 
        !           496:        cplot[0] = c;
        !           497: 
        !           498:        /* Return encode screen coordinates */
        !           499:        write (pty, cplot, 5 * sizeof (char));
        !           500: 
        !           501:        /* Reset cursor and return */
        !           502: 
        !           503:        XFreeCursor(cursor);
        !           504:        XDefineCursor(window,
        !           505:                (term->flags & INVERSE) ? screen->rcurs : screen->curs);
        !           506: 
        !           507: 
        !           508:        TekInit (term,0);
        !           509: 
        !           510:        XSelectInput (window, KeyPressed | ExposeWindow | ExposeRegion |
        !           511:                      ExposeCopy | ButtonPressed | ButtonReleased);
        !           512: }
        !           513: 
        !           514: 
        !           515: TekPlot (term,chr)
        !           516: 
        !           517: /* Translates Tektronix byte-encoded screen coordinates to integer screen
        !           518:  * coordinates each time the final byte of a coordinate set is encountered.  */
        !           519: 
        !           520:        Terminal *term;
        !           521:        register int chr;
        !           522: {
        !           523:        register Screen *screen = &term->screen;
        !           524:        register int *bp = bplot;
        !           525:        register int x, y;
        !           526: 
        !           527:        ipchr++;
        !           528:        if (ipchr > 5)
        !           529:        {
        !           530:                TekAlph (term,chr);
        !           531:                return;
        !           532:        }
        !           533: 
        !           534:        /* decode Tektronix byte position codes */
        !           535: 
        !           536:        if (chr < 64)
        !           537:        {
        !           538:                if (LoYSet)                     /* 4st byte */
        !           539:                {
        !           540:                        bp[3] = chr & ~32;
        !           541:                }
        !           542:                else                            /* 1st byte */
        !           543:                {
        !           544:                        bp[0] = chr & ~32;
        !           545:                        bp[1] = 0;
        !           546:                }
        !           547:        }
        !           548:        else if (chr > 95)
        !           549:        {
        !           550:                if (LoYSet)                     /* 2nd byte */
        !           551:                {                               /* 3rd if 2nd present */
        !           552:                        bp[1] = bp[2];
        !           553:                        bp[2] = chr & ~96;
        !           554:                }
        !           555:                else                            /* 3rd byte */
        !           556:                {
        !           557:                        bp[2] = chr & ~96;
        !           558:                        bp[1] = 0;
        !           559:                        LoYSet = 1;
        !           560:                }
        !           561:        }
        !           562:        else                                    /* 5th byte */
        !           563:        {
        !           564:                bp[4] = chr & ~64;
        !           565:                ipchr = 0;
        !           566:                LoYSet = 0;
        !           567: 
        !           568:                /* compute screen x and y coordinates ignoring extended
        !           569:                 * precision byte */
        !           570: 
        !           571:                y = (bp[0] << 7) + (bp[2] << 2);
        !           572:                x = (bp[3] << 7) + (bp[4] << 2);
        !           573: 
        !           574:                /* add in 4014 extended precision byte */
        !           575:                if (bp[1] > 0)
        !           576:                {
        !           577:                        x += (bp [1] & 3);
        !           578:                        y += ((bp [1] & 12) >> 2);
        !           579:                }
        !           580: 
        !           581:                /* Check to make sure screen limits are not exceeded */
        !           582:                if (y > 3127)  y = 3127;
        !           583: 
        !           584:                /* transfer this point to vertex array */
        !           585:                if (screen->TekPMode)
        !           586:                {
        !           587:                        TekDraw (0, x, y, term);
        !           588:                        TekDraw (1, x, y, term);
        !           589:                }
        !           590:                else
        !           591:                {
        !           592:                        TekDraw (screen->pen, x, y, term);
        !           593:                        screen->pen = 1;
        !           594:                }
        !           595:        }
        !           596: }
        !           597: 
        !           598: 
        !           599: TekPoint (term,chr)
        !           600: 
        !           601: /* Translates Tektronix byte-encoded incremental plot commands to screen
        !           602:  * coordinates and writes them to the vector buffer */
        !           603: 
        !           604: register Terminal *term;
        !           605: register int chr;
        !           606: {
        !           607:        Screen *screen = &term->screen;
        !           608:        register int pen,x,y;
        !           609: 
        !           610:        x = screen->cur_x;
        !           611:        y = screen->cur_y;
        !           612:        pen = screen->pen;
        !           613: 
        !           614:        if (nplot == 0) TekDraw (0,x,y,term);
        !           615: 
        !           616:        switch (chr)
        !           617:            {
        !           618:            case ' ':   screen->pen = 0;
        !           619:                        break;
        !           620: 
        !           621:            case 'P':   screen->pen = 1;
        !           622:                        break;
        !           623: 
        !           624:            case 'D':   TekDraw (pen, x, ++y, term);
        !           625:                        break;
        !           626: 
        !           627:            case 'E':   TekDraw (pen, ++x, ++y, term);
        !           628:                        break;
        !           629: 
        !           630:            case 'A':   TekDraw (pen, ++x, y, term);
        !           631:                        break;
        !           632: 
        !           633:            case 'I':   TekDraw (pen, ++x, --y, term);
        !           634:                        break;
        !           635: 
        !           636:            case 'H':   TekDraw (pen, x, --y, term);
        !           637:                        break;
        !           638: 
        !           639:            case 'J':   TekDraw (pen, --x, --y, term);
        !           640:                        break;
        !           641: 
        !           642:            case 'B':   TekDraw (pen, --x, y, term);
        !           643:                        break;
        !           644: 
        !           645:            case 'F':   TekDraw (pen, --x, ++y, term);
        !           646:                        break;
        !           647: 
        !           648:            }
        !           649: }
        !           650: 
        !           651: 
        !           652: TekDraw (pen, x, y, term)
        !           653: 
        !           654: /* Translates Tektronix screen coordinates to vs100 screen
        !           655:  *  coordinates, drawing them to the screen when a buffer is filled */
        !           656: 
        !           657: int x,y,pen;
        !           658: Terminal *term;
        !           659: {
        !           660:        register Screen *screen = &term->screen;
        !           661:        register Vertex *lp = line_pt;
        !           662: 
        !           663:        screen->cur_x = x;
        !           664:        screen->cur_y = y;
        !           665: 
        !           666:        /* convert to vs100 window coordinates */
        !           667:        screen->cur_X = (x + 1) * screen->TekScale + screen->border;
        !           668:        screen->cur_Y = (3128 - y) * screen->TekScale + screen->border;
        !           669: 
        !           670:        /* write to plot buffer */
        !           671:        lp->x = screen->cur_X;
        !           672:        lp->y = screen->cur_Y;
        !           673: 
        !           674:        if (pen) lp->flags = VertexDrawLastPoint;
        !           675:        else lp->flags = VertexDontDraw;
        !           676: 
        !           677:        lp = ++line_pt;
        !           678:        nplot++;
        !           679: 
        !           680:        if (debug)
        !           681:            if (refresh) fprintf (rfile,"%d: %d %d,%d -> %d,%d\n",
        !           682:                nplot,pen,x,y,screen->cur_X,screen->cur_Y);
        !           683:            else fprintf (wfile,"%d: %d %d,%d -> %d,%d\n",
        !           684:                nplot,pen,x,y,screen->cur_X,screen->cur_Y);
        !           685:        if (debug)
        !           686:            if (refresh) fflush (rfile);
        !           687:            else fflush (wfile);
        !           688: 
        !           689:        /* draw line if buffer limit has been reached */
        !           690:        if (nplot >= MAX_PTS)
        !           691:        {
        !           692:                TekFlush (term);
        !           693:                lp = line_pt;
        !           694:                lp->x = screen->cur_X;
        !           695:                lp->y = screen->cur_Y;
        !           696:                lp->flags = VertexDontDraw;
        !           697:                line_pt++;
        !           698:                nplot++;
        !           699:        }
        !           700: }
        !           701: 
        !           702: 
        !           703: TekFlush (term)
        !           704: 
        !           705: register Terminal *term;
        !           706: {
        !           707:        Window window = term->screen.window;
        !           708: 
        !           709:        XDraw (window, Tline, nplot, 1, 1, term->screen.foreground, GXcopy, 
        !           710:               AllPlanes);
        !           711:        nplot = 0;
        !           712: 
        !           713:        line_pt = Tline;
        !           714: }
        !           715: 
        !           716: TekInq (term)
        !           717: /* Reports position of cursor in Tektronix-format coordinates */
        !           718: Terminal *term;
        !           719: {
        !           720:        register Screen *screen = &term->screen;
        !           721:        int pty = screen->respond;
        !           722:        char cplot [5];
        !           723:        int x, y;
        !           724:        x = ((screen->cur_X - screen->border) << 1);
        !           725:        y = 782 - ((screen->cur_Y - screen->border) << 1);
        !           726:        /* Translate x and y to Tektronix code */
        !           727:        cplot[1] = 32 + (x >> 5);
        !           728:        cplot[2] = 32 + (x & 31);
        !           729:        cplot[3] = 32 + (y >> 5);
        !           730:        cplot[4] = 32 + (y & 31);
        !           731:        cplot[0] = '%'; /* standard hardware config */
        !           732:        /* Return encoded screen coordinates */
        !           733:        write (pty, cplot, 5 * sizeof (char));
        !           734: }
        !           735: 
        !           736: #ifdef ENABLE_PRINT
        !           737: 
        !           738: #include <signal.h>
        !           739: 
        !           740: TekPrint ()
        !           741: 
        !           742: /* Dump graphics screen, including positioned alpha strings */
        !           743: 
        !           744: {
        !           745:        int chr, pid, uid, i;
        !           746:        char c;
        !           747:        FILE *tekfile;
        !           748:        char *uname, tekfile_name[40];
        !           749:        struct passwd *upasswd;
        !           750:        int temp_tb_pt = tb_pt;
        !           751:        TekLink *temp_tb_pt_link = tb_pt_link;
        !           752: 
        !           753:        TekBufResetPt ();
        !           754:        if (TekBufEmpty ()) return;
        !           755: 
        !           756:        pid = getpid ();
        !           757:        uid = getuid ();
        !           758:        upasswd = getpwuid (uid);
        !           759:        sprintf (tekfile_name,"/tmp/vst%d\.%s\0",pid,upasswd->pw_name);
        !           760: 
        !           761:        tekfile = fopen (tekfile_name,"w"); 
        !           762: 
        !           763:        while (TekBufGet (&chr) != -1)
        !           764:        {
        !           765:                c = chr;
        !           766:                if (chr < 128) putc (c,tekfile);
        !           767:        }
        !           768: 
        !           769:        tb_pt = temp_tb_pt;
        !           770:        tb_pt_link = temp_tb_pt_link;
        !           771: 
        !           772:        fclose (tekfile);
        !           773: 
        !           774:        if (debug) printf ("attempting fork\n");
        !           775: 
        !           776:        switch (fork ())
        !           777:        {
        !           778:                case -1:        Error ();
        !           779:                                break;
        !           780: 
        !           781:                case  0:        for (i= 0; i < _NFILE; i++) close (i);
        !           782:                                signal(SIGCHLD, SIG_DFL);
        !           783:                                signal(SIGTERM, SIG_DFL);
        !           784:                                signal(SIGHUP,  SIG_IGN);
        !           785:                                execlp("imtek", "imtek", "-x",tekfile_name, 0);
        !           786:                                exit (1);
        !           787:                                break;
        !           788: 
        !           789:                default:
        !           790:                                break;
        !           791:        }
        !           792: }
        !           793: 
        !           794: #endif

unix.superglobalmegacorp.com

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