|
|
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:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.