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