|
|
1.1 ! root 1: ! 2: /* ! 3: * $Source: /orpheus/u1/X11/clients/xterm/RCS/charproc.c,v $ ! 4: * $Header: charproc.c,v 1.36 87/09/09 16:40:30 swick Exp $ ! 5: */ ! 6: ! 7: ! 8: #include <X11/copyright.h> ! 9: ! 10: /* ! 11: * Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts. ! 12: * ! 13: * All Rights Reserved ! 14: * ! 15: * Permission to use, copy, modify, and distribute this software and its ! 16: * documentation for any purpose and without fee is hereby granted, ! 17: * provided that the above copyright notice appear in all copies and that ! 18: * both that copyright notice and this permission notice appear in ! 19: * supporting documentation, and that the name of Digital Equipment ! 20: * Corporation not be used in advertising or publicity pertaining to ! 21: * distribution of the software without specific, written prior permission. ! 22: * ! 23: * ! 24: * DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ! 25: * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL ! 26: * DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ! 27: * ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, ! 28: * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ! 29: * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS ! 30: * SOFTWARE. ! 31: */ ! 32: ! 33: ! 34: /* charproc.c */ ! 35: ! 36: #include <stdio.h> ! 37: #include <sgtty.h> ! 38: #include <ctype.h> ! 39: #include <errno.h> ! 40: #include <setjmp.h> ! 41: #include <sys/ioctl.h> ! 42: #include <sys/time.h> ! 43: #include <X11/Xlib.h> ! 44: #include <X11/Xutil.h> ! 45: #include <X11/Intrinsic.h> ! 46: #include <X11/Xatom.h> ! 47: #include "ptyx.h" ! 48: #include "VTparse.h" ! 49: #include "data.h" ! 50: #include "error.h" ! 51: #ifdef MODEMENU ! 52: #include "menu.h" ! 53: #endif MODEMENU ! 54: ! 55: extern void exit(), bcopy(); ! 56: ! 57: #define DEFAULT -1 ! 58: #define TEXT_BUF_SIZE 256 ! 59: #define TRACKTIMESEC 4L ! 60: #define TRACKTIMEUSEC 0L ! 61: ! 62: #define doinput() (bcnt-- > 0 ? *bptr++ : in_put()) ! 63: ! 64: #ifndef lint ! 65: static char rcs_id[] = "$Header: charproc.c,v 1.36 87/09/09 16:40:30 swick Exp $"; ! 66: #endif lint ! 67: ! 68: static long arg; ! 69: static int nparam; ! 70: static ANSI reply; ! 71: static int param[NPARAM]; ! 72: ! 73: static unsigned long ctotal; ! 74: static unsigned long ntotal; ! 75: static jmp_buf vtjmpbuf; ! 76: ! 77: extern XrmNameList nameList; ! 78: extern XrmClassList classList; ! 79: ! 80: extern int groundtable[]; ! 81: extern int csitable[]; ! 82: extern int dectable[]; ! 83: extern int eigtable[]; ! 84: extern int esctable[]; ! 85: extern int iestable[]; ! 86: extern int igntable[]; ! 87: extern int scrtable[]; ! 88: extern int scstable[]; ! 89: ! 90: ! 91: /* event handlers */ ! 92: extern XtEventReturnCode HandleKeyPressed(); ! 93: extern XtEventReturnCode EventDoNothing(); ! 94: extern XtEventReturnCode HandleEnterWindow(); ! 95: extern XtEventReturnCode HandleLeaveWindow(); ! 96: extern XtEventReturnCode HandleFocusChange(); ! 97: extern XtEventReturnCode VTButtonPressed(); ! 98: extern XtEventReturnCode VTMouseMoved(); ! 99: extern XtEventReturnCode VTButtonReleased(); ! 100: ! 101: ! 102: VTparse() ! 103: { ! 104: register TScreen *screen = &term.screen; ! 105: register int *parsestate = groundtable; ! 106: register int c; ! 107: register char *cp; ! 108: register int row, col, top, bot, scstype; ! 109: extern int bitset(), bitclr(), finput(), TrackMouse(); ! 110: ! 111: if(setjmp(vtjmpbuf)) ! 112: parsestate = groundtable; ! 113: for( ; ; ) ! 114: switch(parsestate[c = doinput()]) { ! 115: case CASE_GROUND_STATE: ! 116: /* exit ignore mode */ ! 117: parsestate = groundtable; ! 118: break; ! 119: ! 120: case CASE_IGNORE_STATE: ! 121: /* Ies: ignore anything else */ ! 122: parsestate = igntable; ! 123: break; ! 124: ! 125: case CASE_IGNORE_ESC: ! 126: /* Ign: escape */ ! 127: parsestate = iestable; ! 128: break; ! 129: ! 130: case CASE_IGNORE: ! 131: /* Ignore character */ ! 132: break; ! 133: ! 134: case CASE_BELL: ! 135: /* bell */ ! 136: Bell(); ! 137: break; ! 138: ! 139: case CASE_BS: ! 140: /* backspace */ ! 141: CursorBack(screen, 1); ! 142: break; ! 143: ! 144: case CASE_CR: ! 145: /* carriage return */ ! 146: CarriageReturn(screen); ! 147: break; ! 148: ! 149: case CASE_ESC: ! 150: /* escape */ ! 151: parsestate = esctable; ! 152: break; ! 153: ! 154: case CASE_VMOT: ! 155: /* ! 156: * form feed, line feed, vertical tab ! 157: */ ! 158: Index(screen, 1); ! 159: if (term.flags & LINEFEED) ! 160: CarriageReturn(screen); ! 161: if(screen->display->qlen > 0 || ! 162: (ioctl(screen->display->fd, FIONREAD, (char *) &arg), arg) > 0) ! 163: xevents(); ! 164: break; ! 165: ! 166: case CASE_TAB: ! 167: /* tab */ ! 168: screen->cur_col = TabNext(term.tabs, screen->cur_col); ! 169: if (screen->cur_col > screen->max_col) ! 170: screen->cur_col = screen->max_col; ! 171: break; ! 172: ! 173: case CASE_SI: ! 174: screen->curgl = 0; ! 175: break; ! 176: ! 177: case CASE_SO: ! 178: screen->curgl = 1; ! 179: break; ! 180: ! 181: case CASE_SCR_STATE: ! 182: /* enter scr state */ ! 183: parsestate = scrtable; ! 184: break; ! 185: ! 186: case CASE_SCS0_STATE: ! 187: /* enter scs state 0 */ ! 188: scstype = 0; ! 189: parsestate = scstable; ! 190: break; ! 191: ! 192: case CASE_SCS1_STATE: ! 193: /* enter scs state 1 */ ! 194: scstype = 1; ! 195: parsestate = scstable; ! 196: break; ! 197: ! 198: case CASE_SCS2_STATE: ! 199: /* enter scs state 2 */ ! 200: scstype = 2; ! 201: parsestate = scstable; ! 202: break; ! 203: ! 204: case CASE_SCS3_STATE: ! 205: /* enter scs state 3 */ ! 206: scstype = 3; ! 207: parsestate = scstable; ! 208: break; ! 209: ! 210: case CASE_ESC_IGNORE: ! 211: /* unknown escape sequence */ ! 212: parsestate = eigtable; ! 213: break; ! 214: ! 215: case CASE_ESC_DIGIT: ! 216: /* digit in csi or dec mode */ ! 217: if((row = param[nparam - 1]) == DEFAULT) ! 218: row = 0; ! 219: param[nparam - 1] = 10 * row + (c - '0'); ! 220: break; ! 221: ! 222: case CASE_ESC_SEMI: ! 223: /* semicolon in csi or dec mode */ ! 224: param[nparam++] = DEFAULT; ! 225: break; ! 226: ! 227: case CASE_DEC_STATE: ! 228: /* enter dec mode */ ! 229: parsestate = dectable; ! 230: break; ! 231: ! 232: case CASE_ICH: ! 233: /* ICH */ ! 234: if((c = param[0]) < 1) ! 235: c = 1; ! 236: InsertChar(screen, c); ! 237: parsestate = groundtable; ! 238: break; ! 239: ! 240: case CASE_CUU: ! 241: /* CUU */ ! 242: if((c = param[0]) < 1) ! 243: c = 1; ! 244: CursorUp(screen, c); ! 245: parsestate = groundtable; ! 246: break; ! 247: ! 248: case CASE_CUD: ! 249: /* CUD */ ! 250: if((c = param[0]) < 1) ! 251: c = 1; ! 252: CursorDown(screen, c); ! 253: parsestate = groundtable; ! 254: break; ! 255: ! 256: case CASE_CUF: ! 257: /* CUF */ ! 258: if((c = param[0]) < 1) ! 259: c = 1; ! 260: CursorForward(screen, c); ! 261: parsestate = groundtable; ! 262: break; ! 263: ! 264: case CASE_CUB: ! 265: /* CUB */ ! 266: if((c = param[0]) < 1) ! 267: c = 1; ! 268: CursorBack(screen, c); ! 269: parsestate = groundtable; ! 270: break; ! 271: ! 272: case CASE_CUP: ! 273: /* CUP | HVP */ ! 274: if((row = param[0]) < 1) ! 275: row = 1; ! 276: if(nparam < 2 || (col = param[1]) < 1) ! 277: col = 1; ! 278: CursorSet(screen, row-1, col-1, term.flags); ! 279: parsestate = groundtable; ! 280: break; ! 281: ! 282: case CASE_ED: ! 283: /* ED */ ! 284: switch (param[0]) { ! 285: case DEFAULT: ! 286: case 0: ! 287: ClearBelow(screen); ! 288: break; ! 289: ! 290: case 1: ! 291: ClearAbove(screen); ! 292: break; ! 293: ! 294: case 2: ! 295: ClearScreen(screen); ! 296: break; ! 297: } ! 298: parsestate = groundtable; ! 299: break; ! 300: ! 301: case CASE_EL: ! 302: /* EL */ ! 303: switch (param[0]) { ! 304: case DEFAULT: ! 305: case 0: ! 306: ClearRight(screen); ! 307: break; ! 308: case 1: ! 309: ClearLeft(screen); ! 310: break; ! 311: case 2: ! 312: ClearLine(screen); ! 313: break; ! 314: } ! 315: parsestate = groundtable; ! 316: break; ! 317: ! 318: case CASE_IL: ! 319: /* IL */ ! 320: if((c = param[0]) < 1) ! 321: c = 1; ! 322: InsertLine(screen, c); ! 323: parsestate = groundtable; ! 324: break; ! 325: ! 326: case CASE_DL: ! 327: /* DL */ ! 328: if((c = param[0]) < 1) ! 329: c = 1; ! 330: DeleteLine(screen, c); ! 331: parsestate = groundtable; ! 332: break; ! 333: ! 334: case CASE_DCH: ! 335: /* DCH */ ! 336: if((c = param[0]) < 1) ! 337: c = 1; ! 338: DeleteChar(screen, c); ! 339: parsestate = groundtable; ! 340: break; ! 341: ! 342: case CASE_TRACK_MOUSE: ! 343: /* Track mouse as long as in window and between ! 344: specified rows */ ! 345: TrackMouse(param[0], param[2]-1, param[1]-1, ! 346: param[3]-1, param[4]-2); ! 347: break; ! 348: ! 349: case CASE_DA1: ! 350: /* DA1 */ ! 351: if (param[0] <= 0) { /* less than means DEFAULT */ ! 352: reply.a_type = CSI; ! 353: reply.a_pintro = '?'; ! 354: reply.a_nparam = 2; ! 355: reply.a_param[0] = 1; /* VT102 */ ! 356: reply.a_param[1] = 2; /* VT102 */ ! 357: reply.a_inters = 0; ! 358: reply.a_final = 'c'; ! 359: unparseseq(&reply, screen->respond); ! 360: } ! 361: parsestate = groundtable; ! 362: break; ! 363: ! 364: case CASE_TBC: ! 365: /* TBC */ ! 366: if ((c = param[0]) <= 0) /* less than means default */ ! 367: TabClear(term.tabs, screen->cur_col); ! 368: else if (c == 3) ! 369: TabZonk(term.tabs); ! 370: parsestate = groundtable; ! 371: break; ! 372: ! 373: case CASE_SET: ! 374: /* SET */ ! 375: modes(&term, bitset); ! 376: parsestate = groundtable; ! 377: break; ! 378: ! 379: case CASE_RST: ! 380: /* RST */ ! 381: modes(&term, bitclr); ! 382: parsestate = groundtable; ! 383: break; ! 384: ! 385: case CASE_SGR: ! 386: /* SGR */ ! 387: for (c=0; c<nparam; ++c) { ! 388: switch (param[c]) { ! 389: case DEFAULT: ! 390: case 0: ! 391: term.flags &= ~(INVERSE|BOLD|UNDERLINE); ! 392: break; ! 393: case 1: ! 394: case 5: /* Blink, really. */ ! 395: term.flags |= BOLD; ! 396: break; ! 397: case 4: /* Underscore */ ! 398: term.flags |= UNDERLINE; ! 399: break; ! 400: case 7: ! 401: term.flags |= INVERSE; ! 402: } ! 403: } ! 404: parsestate = groundtable; ! 405: break; ! 406: ! 407: case CASE_CPR: ! 408: /* CPR */ ! 409: if ((c = param[0]) == 5) { ! 410: reply.a_type = CSI; ! 411: reply.a_pintro = 0; ! 412: reply.a_nparam = 1; ! 413: reply.a_param[0] = 0; ! 414: reply.a_inters = 0; ! 415: reply.a_final = 'n'; ! 416: unparseseq(&reply, screen->respond); ! 417: } else if (c == 6) { ! 418: reply.a_type = CSI; ! 419: reply.a_pintro = 0; ! 420: reply.a_nparam = 2; ! 421: reply.a_param[0] = screen->cur_row+1; ! 422: reply.a_param[1] = screen->cur_col+1; ! 423: reply.a_inters = 0; ! 424: reply.a_final = 'R'; ! 425: unparseseq(&reply, screen->respond); ! 426: } ! 427: parsestate = groundtable; ! 428: break; ! 429: ! 430: case CASE_DECSTBM: ! 431: /* DECSTBM */ ! 432: if((top = param[0]) < 1) ! 433: top = 1; ! 434: if(nparam < 2 || (bot = param[1]) == DEFAULT ! 435: || bot > screen->max_row + 1 ! 436: || bot == 0) ! 437: bot = screen->max_row+1; ! 438: if (bot > top) { ! 439: if(screen->scroll_amt) ! 440: FlushScroll(screen); ! 441: screen->top_marg = top-1; ! 442: screen->bot_marg = bot-1; ! 443: CursorSet(screen, 0, 0, term.flags); ! 444: } ! 445: parsestate = groundtable; ! 446: break; ! 447: ! 448: case CASE_DECREQTPARM: ! 449: /* DECREQTPARM */ ! 450: if ((c = param[0]) == DEFAULT) ! 451: c = 0; ! 452: if (c == 0 || c == 1) { ! 453: reply.a_type = CSI; ! 454: reply.a_pintro = 0; ! 455: reply.a_nparam = 7; ! 456: reply.a_param[0] = c + 2; ! 457: reply.a_param[1] = 1; /* no parity */ ! 458: reply.a_param[2] = 1; /* eight bits */ ! 459: reply.a_param[3] = 112; /* transmit 9600 baud */ ! 460: reply.a_param[4] = 112; /* receive 9600 baud */ ! 461: reply.a_param[5] = 1; /* clock multiplier ? */ ! 462: reply.a_param[6] = 0; /* STP flags ? */ ! 463: reply.a_inters = 0; ! 464: reply.a_final = 'x'; ! 465: unparseseq(&reply, screen->respond); ! 466: } ! 467: parsestate = groundtable; ! 468: break; ! 469: ! 470: case CASE_DECSET: ! 471: /* DECSET */ ! 472: dpmodes(&term, bitset); ! 473: parsestate = groundtable; ! 474: if(screen->TekEmu) ! 475: return; ! 476: break; ! 477: ! 478: case CASE_DECRST: ! 479: /* DECRST */ ! 480: dpmodes(&term, bitclr); ! 481: parsestate = groundtable; ! 482: break; ! 483: ! 484: case CASE_DECALN: ! 485: /* DECALN */ ! 486: if(screen->cursor_state) ! 487: HideCursor(); ! 488: for(row = screen->max_row ; row >= 0 ; row--) { ! 489: bzero(screen->buf[2 * row + 1], ! 490: col = screen->max_col + 1); ! 491: for(cp = screen->buf[2 * row] ; col > 0 ; col--) ! 492: *cp++ = 'E'; ! 493: } ! 494: ScrnRefresh(screen, 0, 0, screen->max_row + 1, ! 495: screen->max_col + 1); ! 496: parsestate = groundtable; ! 497: break; ! 498: ! 499: case CASE_GSETS: ! 500: screen->gsets[scstype] = c; ! 501: parsestate = groundtable; ! 502: break; ! 503: ! 504: case CASE_DECSC: ! 505: /* DECSC */ ! 506: CursorSave(&term, &screen->sc); ! 507: parsestate = groundtable; ! 508: break; ! 509: ! 510: case CASE_DECRC: ! 511: /* DECRC */ ! 512: CursorRestore(&term, &screen->sc); ! 513: parsestate = groundtable; ! 514: break; ! 515: ! 516: case CASE_DECKPAM: ! 517: /* DECKPAM */ ! 518: term.keyboard.flags |= KYPD_APL; ! 519: parsestate = groundtable; ! 520: break; ! 521: ! 522: case CASE_DECKPNM: ! 523: /* DECKPNM */ ! 524: term.keyboard.flags &= ~KYPD_APL; ! 525: parsestate = groundtable; ! 526: break; ! 527: ! 528: case CASE_IND: ! 529: /* IND */ ! 530: Index(screen, 1); ! 531: if(screen->display->qlen > 0 || ! 532: (ioctl(screen->display->fd, FIONREAD, (char *)&arg), arg) > 0) ! 533: xevents(); ! 534: parsestate = groundtable; ! 535: break; ! 536: ! 537: case CASE_NEL: ! 538: /* NEL */ ! 539: Index(screen, 1); ! 540: CarriageReturn(screen); ! 541: if(screen->display->qlen > 0 || ! 542: (ioctl(screen->display->fd, FIONREAD, (char *)&arg), arg) > 0) ! 543: xevents(); ! 544: parsestate = groundtable; ! 545: break; ! 546: ! 547: case CASE_HTS: ! 548: /* HTS */ ! 549: TabSet(term.tabs, screen->cur_col); ! 550: parsestate = groundtable; ! 551: break; ! 552: ! 553: case CASE_RI: ! 554: /* RI */ ! 555: RevIndex(screen, 1); ! 556: parsestate = groundtable; ! 557: break; ! 558: ! 559: case CASE_SS2: ! 560: /* SS2 */ ! 561: screen->curss = 2; ! 562: parsestate = groundtable; ! 563: break; ! 564: ! 565: case CASE_SS3: ! 566: /* SS3 */ ! 567: screen->curss = 3; ! 568: parsestate = groundtable; ! 569: break; ! 570: ! 571: case CASE_CSI_STATE: ! 572: /* enter csi state */ ! 573: nparam = 1; ! 574: param[0] = DEFAULT; ! 575: parsestate = csitable; ! 576: break; ! 577: ! 578: case CASE_OSC: ! 579: /* do osc escapes */ ! 580: do_osc(finput); ! 581: parsestate = groundtable; ! 582: break; ! 583: ! 584: case CASE_RIS: ! 585: /* RIS */ ! 586: VTReset(TRUE); ! 587: parsestate = groundtable; ! 588: break; ! 589: ! 590: case CASE_LS2: ! 591: /* LS2 */ ! 592: screen->curgl = 2; ! 593: parsestate = groundtable; ! 594: break; ! 595: ! 596: case CASE_LS3: ! 597: /* LS3 */ ! 598: screen->curgl = 3; ! 599: parsestate = groundtable; ! 600: break; ! 601: ! 602: case CASE_LS3R: ! 603: /* LS3R */ ! 604: screen->curgr = 3; ! 605: parsestate = groundtable; ! 606: break; ! 607: ! 608: case CASE_LS2R: ! 609: /* LS2R */ ! 610: screen->curgr = 2; ! 611: parsestate = groundtable; ! 612: break; ! 613: ! 614: case CASE_LS1R: ! 615: /* LS1R */ ! 616: screen->curgr = 1; ! 617: parsestate = groundtable; ! 618: break; ! 619: ! 620: case CASE_XTERM_SAVE: ! 621: savemodes(&term); ! 622: parsestate = groundtable; ! 623: break; ! 624: ! 625: case CASE_XTERM_RESTORE: ! 626: restoremodes(&term); ! 627: parsestate = groundtable; ! 628: break; ! 629: ! 630: case CASE_PRINT: ! 631: /* printable characters */ ! 632: top = bcnt > TEXT_BUF_SIZE ? TEXT_BUF_SIZE : bcnt; ! 633: cp = bptr; ! 634: *--bptr = c; ! 635: while(top > 0 && isprint(*cp)) { ! 636: top--; ! 637: bcnt--; ! 638: cp++; ! 639: } ! 640: if(screen->curss) { ! 641: dotext(screen, term.flags, ! 642: screen->gsets[screen->curss], bptr, bptr + 1); ! 643: screen->curss = 0; ! 644: bptr++; ! 645: } ! 646: if(bptr < cp) ! 647: dotext(screen, term.flags, ! 648: screen->gsets[screen->curgl], bptr, cp); ! 649: bptr = cp; ! 650: break; ! 651: } ! 652: } ! 653: ! 654: finput() ! 655: { ! 656: return(doinput()); ! 657: } ! 658: ! 659: static int select_mask; ! 660: static int write_mask; ! 661: ! 662: static char v_buffer[4096]; ! 663: static char *v_bufstr; ! 664: static char *v_bufptr; ! 665: static char *v_bufend; ! 666: #define ptymask() (v_bufptr > v_bufstr ? pty_mask : 0) ! 667: ! 668: v_write(f, d, l) ! 669: int f; ! 670: char *d; ! 671: int l; ! 672: { ! 673: int r; ! 674: int c = l; ! 675: ! 676: if (!v_bufstr) { ! 677: v_bufstr = v_buffer; ! 678: v_bufptr = v_buffer; ! 679: v_bufend = &v_buffer[4096]; ! 680: } ! 681: ! 682: ! 683: if ((1 << f) != pty_mask) ! 684: return(write(f, d, l)); ! 685: ! 686: if (v_bufptr > v_bufstr) { ! 687: if (l) { ! 688: if (v_bufend > v_bufptr + l) { ! 689: bcopy(d, v_bufptr, l); ! 690: v_bufptr += l; ! 691: } else { ! 692: if (v_bufstr != v_buffer) { ! 693: bcopy(v_bufstr, v_buffer, ! 694: v_bufptr - v_bufstr); ! 695: v_bufptr -= v_bufstr - v_buffer; ! 696: v_bufstr = v_buffer; ! 697: } ! 698: if (v_bufend > v_bufptr + l) { ! 699: bcopy(d, v_bufptr, l); ! 700: v_bufptr += l; ! 701: } else if (v_bufptr < v_bufend) { ! 702: fprintf(stderr, "Out of buffer space\n"); ! 703: c = v_bufend - v_bufptr; ! 704: bcopy(d, v_bufptr, c); ! 705: v_bufptr = v_bufend; ! 706: } else { ! 707: fprintf(stderr, "Out of buffer space\n"); ! 708: c = 0; ! 709: } ! 710: } ! 711: } ! 712: if (v_bufptr > v_bufstr) { ! 713: if ((r = write(f, v_bufstr, v_bufptr - v_bufstr)) <= 0) ! 714: return(r); ! 715: if ((v_bufstr += r) >= v_bufptr) ! 716: v_bufstr = v_bufptr = v_buffer; ! 717: } ! 718: } else if (l) { ! 719: if ((r = write(f, d, l)) < 0) { ! 720: if (errno == EWOULDBLOCK) ! 721: r = 0; ! 722: else if (errno == EINTR) ! 723: r = 0; ! 724: else ! 725: return(r); ! 726: } ! 727: if (l - r) { ! 728: if (l - r > v_bufend - v_buffer) { ! 729: fprintf(stderr, "Truncating to %d\n", ! 730: v_bufend - v_buffer); ! 731: l = (v_bufend - v_buffer) + r; ! 732: } ! 733: bcopy(d + r, v_buffer, l - r); ! 734: v_bufstr = v_buffer; ! 735: v_bufptr = v_buffer + (l - r); ! 736: } ! 737: } ! 738: return(c); ! 739: } ! 740: ! 741: in_put() ! 742: { ! 743: register TScreen *screen = &term.screen; ! 744: register char *cp; ! 745: register int i; ! 746: static struct timeval trackTimeOut; ! 747: ! 748: select_mask = pty_mask; /* force initial read */ ! 749: for( ; ; ) { ! 750: if((select_mask & pty_mask) && (eventMode == NORMAL)) { ! 751: if(screen->logging) ! 752: FlushLog(screen); ! 753: if((bcnt = read(screen->respond, bptr = buffer, ! 754: BUF_SIZE)) < 0) { ! 755: if(errno == EIO && am_slave) ! 756: exit(0); ! 757: else if(errno != EWOULDBLOCK) ! 758: Panic( ! 759: "input: read returned unexpected error (%d)\n", ! 760: errno); ! 761: } else if(bcnt == 0) ! 762: Panic("input: read returned zero\n", 0); ! 763: else { ! 764: /* strip parity bit */ ! 765: for(i = bcnt, cp = bptr ; i > 0 ; i--) ! 766: *cp++ &= CHAR; ! 767: if(screen->scrollWindow && screen->scrollinput && ! 768: screen->topline < 0) ! 769: /* Scroll to bottom */ ! 770: WindowScroll(screen, 0); ! 771: break; ! 772: } ! 773: } ! 774: if(screen->scroll_amt) ! 775: FlushScroll(screen); ! 776: if(screen->cursor_set && (screen->cursor_col != screen->cur_col ! 777: || screen->cursor_row != screen->cur_row)) { ! 778: if(screen->cursor_state) ! 779: HideCursor(); ! 780: ShowCursor(); ! 781: } else if(screen->cursor_set != screen->cursor_state) { ! 782: if(screen->cursor_set) ! 783: ShowCursor(); ! 784: else ! 785: HideCursor(); ! 786: } ! 787: ! 788: if (waitingForTrackInfo) { ! 789: trackTimeOut.tv_sec = TRACKTIMESEC; ! 790: trackTimeOut.tv_usec = TRACKTIMEUSEC; ! 791: select_mask = pty_mask; ! 792: if ((i = select(max_plus1, &select_mask, (int *)NULL, (int *)NULL, ! 793: &trackTimeOut)) < 0) { ! 794: if (errno != EINTR) ! 795: SysError(ERROR_SELECT); ! 796: continue; ! 797: } else if (i == 0) { ! 798: /* emacs just isn't replying, go on */ ! 799: waitingForTrackInfo = 0; ! 800: Bell(); ! 801: select_mask = Select_mask; ! 802: } ! 803: } else if (QLength(screen->display)) ! 804: select_mask = X_mask; ! 805: else { ! 806: write_mask = ptymask(); ! 807: XFlush(screen->display); ! 808: select_mask = Select_mask; ! 809: if (eventMode != NORMAL) ! 810: select_mask = X_mask; ! 811: if(select(max_plus1, &select_mask, &write_mask, ! 812: (int *)NULL, (struct timeval *) NULL) < 0){ ! 813: if (errno != EINTR) ! 814: SysError(ERROR_SELECT); ! 815: continue; ! 816: } ! 817: } ! 818: if (write_mask & ptymask()) ! 819: v_write(screen->respond, 0, 0); /* flush buffer */ ! 820: if(select_mask & X_mask) { ! 821: if (bcnt <= 0) { ! 822: bcnt = 0; ! 823: bptr = buffer; ! 824: } ! 825: xevents(); ! 826: if (bcnt > 0) ! 827: break; ! 828: } ! 829: } ! 830: bcnt--; ! 831: return(*bptr++); ! 832: } ! 833: ! 834: /* ! 835: * process a string of characters according to the character set indicated ! 836: * by charset. worry about end of line conditions (wraparound if selected). ! 837: */ ! 838: dotext(screen, flags, charset, buf, ptr) ! 839: register TScreen *screen; ! 840: unsigned flags; ! 841: char charset; ! 842: char *buf; ! 843: char *ptr; ! 844: { ! 845: register char *s; ! 846: register int len; ! 847: register int n; ! 848: register int next_col; ! 849: ! 850: switch (charset) { ! 851: case 'A': /* United Kingdom set */ ! 852: for (s=buf; s<ptr; ++s) ! 853: if (*s == '#') ! 854: *s = '\036'; /* UK pound sign*/ ! 855: break; ! 856: ! 857: case 'B': /* ASCII set */ ! 858: break; ! 859: ! 860: case '0': /* special graphics (line drawing) */ ! 861: for (s=buf; s<ptr; ++s) ! 862: if (*s>=0x5f && *s<=0x7e) ! 863: *s = *s == 0x5f ? 0x7f : *s - 0x5f; ! 864: break; ! 865: ! 866: default: /* any character sets we don't recognize*/ ! 867: return; ! 868: } ! 869: ! 870: len = ptr - buf; ! 871: ptr = buf; ! 872: while (len > 0) { ! 873: n = screen->max_col-screen->cur_col+1; ! 874: if (n <= 1) { ! 875: if (screen->do_wrap && (flags&WRAPAROUND)) { ! 876: Index(screen, 1); ! 877: screen->cur_col = 0; ! 878: screen->do_wrap = 0; ! 879: n = screen->max_col+1; ! 880: } else ! 881: n = 1; ! 882: } ! 883: if (len < n) ! 884: n = len; ! 885: next_col = screen->cur_col + n; ! 886: WriteText(screen, ptr, n, flags); ! 887: /* ! 888: * the call to WriteText updates screen->cur_col. ! 889: * If screen->cur_col != next_col, we must have ! 890: * hit the right margin, so set the do_wrap flag. ! 891: */ ! 892: screen->do_wrap = (screen->cur_col < next_col); ! 893: len -= n; ! 894: ptr += n; ! 895: } ! 896: } ! 897: ! 898: /* ! 899: * write a string str of length len onto the screen at ! 900: * the current cursor position. update cursor position. ! 901: */ ! 902: WriteText(screen, str, len, flags) ! 903: register TScreen *screen; ! 904: register char *str; ! 905: register int len; ! 906: unsigned flags; ! 907: { ! 908: register int cx, cy; ! 909: register unsigned fgs = flags; ! 910: GC currentGC; ! 911: ! 912: if(screen->cur_row - screen->topline <= screen->max_row) { ! 913: /* ! 914: if(screen->cur_row == screen->cursor_row && screen->cur_col <= ! 915: screen->cursor_col && screen->cursor_col <= screen->cur_col + len - 1) ! 916: screen->cursor_state = OFF; ! 917: */ ! 918: if(screen->cursor_state) ! 919: HideCursor(); ! 920: ! 921: /* ! 922: * make sure that the correct GC is current ! 923: */ ! 924: ! 925: if (fgs & BOLD) ! 926: if (fgs & INVERSE) ! 927: currentGC = screen->reverseboldGC; ! 928: else currentGC = screen->normalboldGC; ! 929: else /* not bold */ ! 930: if (fgs & INVERSE) ! 931: currentGC = screen->reverseGC; ! 932: else currentGC = screen->normalGC; ! 933: ! 934: if (fgs & INSERT) ! 935: InsertChar(screen, len); ! 936: if (!(AddToRefresh(screen))) { ! 937: if(screen->scroll_amt) ! 938: FlushScroll(screen); ! 939: cx = CursorX(screen, screen->cur_col); ! 940: cy = CursorY(screen, screen->cur_row)+screen->fnt_norm->max_bounds.ascent; ! 941: XDrawImageString(screen->display, TextWindow(screen), currentGC, ! 942: cx, cy, str, len); ! 943: ! 944: if((fgs & BOLD) && screen->enbolden) ! 945: if (currentGC == screen->normalGC || screen->reverseGC) ! 946: XDrawString(screen->display, TextWindow(screen), ! 947: currentGC,cx + 1, cy, str, len); ! 948: ! 949: if(fgs & UNDERLINE) ! 950: XDrawLine(screen->display, TextWindow(screen), currentGC, ! 951: cx, cy+1, ! 952: cx + len * FontWidth(screen), cy+1); ! 953: /* ! 954: * the following statements compile data to compute the average ! 955: * number of characters written on each call to XText. The data ! 956: * may be examined via the use of a "hidden" escape sequence. ! 957: */ ! 958: ctotal += len; ! 959: ++ntotal; ! 960: } ! 961: } ! 962: ScreenWrite(screen, str, flags, len); ! 963: CursorForward(screen, len); ! 964: } ! 965: ! 966: /* ! 967: * process ANSI modes set, reset ! 968: */ ! 969: modes(term, func) ! 970: Terminal *term; ! 971: int (*func)(); ! 972: { ! 973: register int i; ! 974: ! 975: for (i=0; i<nparam; ++i) { ! 976: switch (param[i]) { ! 977: case 4: /* IRM */ ! 978: (*func)(&term->flags, INSERT); ! 979: break; ! 980: ! 981: case 20: /* LNM */ ! 982: (*func)(&term->flags, LINEFEED); ! 983: break; ! 984: } ! 985: } ! 986: } ! 987: ! 988: /* ! 989: * process DEC private modes set, reset ! 990: */ ! 991: dpmodes(term, func) ! 992: Terminal *term; ! 993: int (*func)(); ! 994: { ! 995: register TScreen *screen = &term->screen; ! 996: register int i, j; ! 997: extern int bitset(); ! 998: ! 999: for (i=0; i<nparam; ++i) { ! 1000: switch (param[i]) { ! 1001: case 1: /* DECCKM */ ! 1002: (*func)(&term->keyboard.flags, CURSOR_APL); ! 1003: break; ! 1004: case 3: /* DECCOLM */ ! 1005: if(screen->c132) { ! 1006: ClearScreen(screen); ! 1007: CursorSet(screen, 0, 0, term->flags); ! 1008: if((j = func == bitset ? 132 : 80) != ! 1009: ((term->flags & IN132COLUMNS) ? 132 : 80) || ! 1010: j != screen->max_col + 1) { ! 1011: XResizeWindow( ! 1012: screen->display, ! 1013: TextWindow(screen), ! 1014: (unsigned) FontWidth(screen) * j ! 1015: + 2*screen->border ! 1016: + screen->scrollbar, ! 1017: (unsigned) FontHeight(screen) ! 1018: * (screen->max_row + 1) ! 1019: + 2 * screen->border); ! 1020: XSync(screen->display, FALSE); ! 1021: if(QLength(screen->display) > 0) ! 1022: xevents(); ! 1023: } ! 1024: (*func)(&term->flags, IN132COLUMNS); ! 1025: } ! 1026: break; ! 1027: case 4: /* DECSCLM (slow scroll) */ ! 1028: if (func == bitset) { ! 1029: screen->jumpscroll = 0; ! 1030: if (screen->scroll_amt) ! 1031: FlushScroll(screen); ! 1032: } else ! 1033: screen->jumpscroll = 1; ! 1034: (*func)(&term->flags, SMOOTHSCROLL); ! 1035: break; ! 1036: case 5: /* DECSCNM */ ! 1037: j = term->flags; ! 1038: (*func)(&term->flags, REVERSE_VIDEO); ! 1039: if ((term->flags ^ j) & REVERSE_VIDEO) ! 1040: ReverseVideo(term); ! 1041: break; ! 1042: ! 1043: case 6: /* DECOM */ ! 1044: (*func)(&term->flags, ORIGIN); ! 1045: CursorSet(screen, 0, 0, term->flags); ! 1046: break; ! 1047: ! 1048: case 7: /* DECAWM */ ! 1049: (*func)(&term->flags, WRAPAROUND); ! 1050: break; ! 1051: case 8: /* DECARM */ ! 1052: j = term->flags; ! 1053: (*func)(&term->flags, AUTOREPEAT); ! 1054: if ((term->flags ^ j) & AUTOREPEAT) ! 1055: if(term->flags & AUTOREPEAT) ! 1056: XAutoRepeatOn(screen->display); ! 1057: else ! 1058: XAutoRepeatOff(screen->display); ! 1059: break; ! 1060: case 9: /* MIT bogus sequence */ ! 1061: if(func == bitset) ! 1062: screen->send_mouse_pos = 1; ! 1063: else ! 1064: screen->send_mouse_pos = 0; ! 1065: break; ! 1066: case 38: /* DECTEK */ ! 1067: if(func == bitset & !(screen->inhibit & I_TEK)) { ! 1068: if(screen->logging) { ! 1069: FlushLog(screen); ! 1070: screen->logstart = Tbuffer; ! 1071: } ! 1072: screen->TekEmu = TRUE; ! 1073: } ! 1074: break; ! 1075: case 40: /* 132 column mode */ ! 1076: (*func)(&screen->c132, 1); ! 1077: break; ! 1078: case 41: /* curses hack */ ! 1079: (*func)(&screen->curses, 1); ! 1080: break; ! 1081: case 44: /* margin bell */ ! 1082: (*func)(&screen->marginbell, 1); ! 1083: if(!screen->marginbell) ! 1084: screen->bellarmed = -1; ! 1085: break; ! 1086: case 45: /* reverse wraparound */ ! 1087: (*func)(&term->flags, REVERSEWRAP); ! 1088: break; ! 1089: case 46: /* logging */ ! 1090: if(func == bitset) ! 1091: StartLog(screen); ! 1092: else ! 1093: CloseLog(screen); ! 1094: break; ! 1095: case 47: /* alternate buffer */ ! 1096: if(func == bitset) ! 1097: ToAlternate(screen); ! 1098: else ! 1099: FromAlternate(screen); ! 1100: break; ! 1101: case 1000: /* xtem bogus sequence */ ! 1102: if(func == bitset) ! 1103: screen->send_mouse_pos = 2; ! 1104: else ! 1105: screen->send_mouse_pos = 0; ! 1106: break; ! 1107: case 1001: /* xtem sequence w/hilite tracking */ ! 1108: if(func == bitset) ! 1109: screen->send_mouse_pos = 3; ! 1110: else ! 1111: screen->send_mouse_pos = 0; ! 1112: break; ! 1113: } ! 1114: } ! 1115: } ! 1116: ! 1117: /* ! 1118: * process xterm private modes save ! 1119: */ ! 1120: savemodes(term) ! 1121: Terminal *term; ! 1122: { ! 1123: register TScreen *screen = &term->screen; ! 1124: register int i; ! 1125: ! 1126: for (i = 0; i < nparam; i++) { ! 1127: switch (param[i]) { ! 1128: case 1: /* DECCKM */ ! 1129: screen->save_modes[0] = term->keyboard.flags & ! 1130: CURSOR_APL; ! 1131: break; ! 1132: case 3: /* DECCOLM */ ! 1133: if(screen->c132) ! 1134: screen->save_modes[1] = term->flags & ! 1135: IN132COLUMNS; ! 1136: break; ! 1137: case 4: /* DECSCLM (slow scroll) */ ! 1138: screen->save_modes[2] = term->flags & SMOOTHSCROLL; ! 1139: break; ! 1140: case 5: /* DECSCNM */ ! 1141: screen->save_modes[3] = term->flags & REVERSE_VIDEO; ! 1142: break; ! 1143: case 6: /* DECOM */ ! 1144: screen->save_modes[4] = term->flags & ORIGIN; ! 1145: break; ! 1146: ! 1147: case 7: /* DECAWM */ ! 1148: screen->save_modes[5] = term->flags & WRAPAROUND; ! 1149: break; ! 1150: case 8: /* DECARM */ ! 1151: screen->save_modes[6] = term->flags & AUTOREPEAT; ! 1152: break; ! 1153: case 9: /* mouse bogus sequence */ ! 1154: screen->save_modes[7] = screen->send_mouse_pos; ! 1155: break; ! 1156: case 40: /* 132 column mode */ ! 1157: screen->save_modes[8] = screen->c132; ! 1158: break; ! 1159: case 41: /* curses hack */ ! 1160: screen->save_modes[9] = screen->curses; ! 1161: break; ! 1162: case 44: /* margin bell */ ! 1163: screen->save_modes[12] = screen->marginbell; ! 1164: break; ! 1165: case 45: /* reverse wraparound */ ! 1166: screen->save_modes[13] = term->flags & REVERSEWRAP; ! 1167: break; ! 1168: case 46: /* logging */ ! 1169: screen->save_modes[14] = screen->logging; ! 1170: break; ! 1171: case 47: /* alternate buffer */ ! 1172: screen->save_modes[15] = screen->alternate; ! 1173: break; ! 1174: case 1000: /* mouse bogus sequence */ ! 1175: case 1001: ! 1176: screen->save_modes[7] = screen->send_mouse_pos; ! 1177: break; ! 1178: } ! 1179: } ! 1180: } ! 1181: ! 1182: /* ! 1183: * process xterm private modes restore ! 1184: */ ! 1185: restoremodes(term) ! 1186: Terminal *term; ! 1187: { ! 1188: register TScreen *screen = &term->screen; ! 1189: register int i, j; ! 1190: ! 1191: for (i = 0; i < nparam; i++) { ! 1192: switch (param[i]) { ! 1193: case 1: /* DECCKM */ ! 1194: term->keyboard.flags &= ~CURSOR_APL; ! 1195: term->keyboard.flags |= screen->save_modes[0] & ! 1196: CURSOR_APL; ! 1197: break; ! 1198: case 3: /* DECCOLM */ ! 1199: if(screen->c132) { ! 1200: ClearScreen(screen); ! 1201: CursorSet(screen, 0, 0, term->flags); ! 1202: if((j = (screen->save_modes[1] & IN132COLUMNS) ! 1203: ? 132 : 80) != ((term->flags & IN132COLUMNS) ! 1204: ? 132 : 80) || j != screen->max_col + 1) { ! 1205: XResizeWindow( ! 1206: screen->display, ! 1207: TextWindow(screen), ! 1208: (unsigned) FontWidth(screen) * j ! 1209: + 2*screen->border ! 1210: + screen->scrollbar, ! 1211: (unsigned) FontHeight(screen) ! 1212: * (screen->max_row + 1) ! 1213: + 2*screen->border); ! 1214: XSync(screen->display, FALSE); /* synchronize */ ! 1215: if(QLength(screen->display) > 0) ! 1216: xevents(); ! 1217: } ! 1218: term->flags &= ~IN132COLUMNS; ! 1219: term->flags |= screen->save_modes[1] & ! 1220: IN132COLUMNS; ! 1221: } ! 1222: break; ! 1223: case 4: /* DECSCLM (slow scroll) */ ! 1224: if (screen->save_modes[2] & SMOOTHSCROLL) { ! 1225: screen->jumpscroll = 0; ! 1226: if (screen->scroll_amt) ! 1227: FlushScroll(screen); ! 1228: } else ! 1229: screen->jumpscroll = 1; ! 1230: term->flags &= ~SMOOTHSCROLL; ! 1231: term->flags |= screen->save_modes[2] & SMOOTHSCROLL; ! 1232: break; ! 1233: case 5: /* DECSCNM */ ! 1234: if((screen->save_modes[3] ^ term->flags) & ! 1235: REVERSE_VIDEO) { ! 1236: term->flags &= ~REVERSE_VIDEO; ! 1237: term->flags |= screen->save_modes[3] & ! 1238: REVERSE_VIDEO; ! 1239: ReverseVideo(term); ! 1240: } ! 1241: break; ! 1242: case 6: /* DECOM */ ! 1243: term->flags &= ~ORIGIN; ! 1244: term->flags |= screen->save_modes[4] & ORIGIN; ! 1245: CursorSet(screen, 0, 0, term->flags); ! 1246: break; ! 1247: ! 1248: case 7: /* DECAWM */ ! 1249: term->flags &= ~WRAPAROUND; ! 1250: term->flags |= screen->save_modes[5] & WRAPAROUND; ! 1251: break; ! 1252: case 8: /* DECARM */ ! 1253: if((screen->save_modes[6] ^ term->flags) & AUTOREPEAT) { ! 1254: term->flags &= ~REVERSE_VIDEO; ! 1255: term->flags |= screen->save_modes[6] & ! 1256: REVERSE_VIDEO; ! 1257: if(term->flags & AUTOREPEAT) ! 1258: XAutoRepeatOn(screen->display); ! 1259: else ! 1260: XAutoRepeatOff(screen->display); ! 1261: } ! 1262: break; ! 1263: case 9: /* MIT bogus sequence */ ! 1264: screen->send_mouse_pos = screen->save_modes[7]; ! 1265: break; ! 1266: case 40: /* 132 column mode */ ! 1267: screen->c132 = screen->save_modes[8]; ! 1268: break; ! 1269: case 41: /* curses hack */ ! 1270: screen->curses = screen->save_modes[9]; ! 1271: break; ! 1272: case 44: /* margin bell */ ! 1273: if(!(screen->marginbell = screen->save_modes[12])) ! 1274: screen->bellarmed = -1; ! 1275: break; ! 1276: case 45: /* reverse wraparound */ ! 1277: term->flags &= ~REVERSEWRAP; ! 1278: term->flags |= screen->save_modes[13] & REVERSEWRAP; ! 1279: break; ! 1280: case 46: /* logging */ ! 1281: if(screen->save_modes[14]) ! 1282: StartLog(screen); ! 1283: else ! 1284: CloseLog(screen); ! 1285: break; ! 1286: case 47: /* alternate buffer */ ! 1287: if(screen->save_modes[15]) ! 1288: ToAlternate(screen); ! 1289: else ! 1290: FromAlternate(screen); ! 1291: break; ! 1292: case 1000: /* mouse bogus sequence */ ! 1293: case 1001: ! 1294: screen->send_mouse_pos = screen->save_modes[7]; ! 1295: break; ! 1296: } ! 1297: } ! 1298: } ! 1299: ! 1300: /* ! 1301: * set a bit in a word given a pointer to the word and a mask. ! 1302: */ ! 1303: bitset(p, mask) ! 1304: int *p; ! 1305: { ! 1306: *p |= mask; ! 1307: } ! 1308: ! 1309: /* ! 1310: * clear a bit in a word given a pointer to the word and a mask. ! 1311: */ ! 1312: bitclr(p, mask) ! 1313: int *p; ! 1314: { ! 1315: *p &= ~mask; ! 1316: } ! 1317: ! 1318: unparseseq(ap, fd) ! 1319: register ANSI *ap; ! 1320: { ! 1321: register int c; ! 1322: register int i; ! 1323: register int inters; ! 1324: ! 1325: c = ap->a_type; ! 1326: if (c>=0x80 && c<=0x9F) { ! 1327: unparseputc(ESC, fd); ! 1328: c -= 0x40; ! 1329: } ! 1330: unparseputc(c, fd); ! 1331: c = ap->a_type; ! 1332: if (c==ESC || c==DCS || c==CSI || c==OSC || c==PM || c==APC) { ! 1333: if (ap->a_pintro != 0) ! 1334: unparseputc((char) ap->a_pintro, fd); ! 1335: for (i=0; i<ap->a_nparam; ++i) { ! 1336: if (i != 0) ! 1337: unparseputc(';', fd); ! 1338: unparseputn((unsigned int) ap->a_param[i], fd); ! 1339: } ! 1340: inters = ap->a_inters; ! 1341: for (i=3; i>=0; --i) { ! 1342: c = (inters >> (8*i)) & 0xff; ! 1343: if (c != 0) ! 1344: unparseputc(c, fd); ! 1345: } ! 1346: unparseputc((char) ap->a_final, fd); ! 1347: } ! 1348: } ! 1349: ! 1350: unparseputn(n, fd) ! 1351: unsigned int n; ! 1352: int fd; ! 1353: { ! 1354: unsigned int q; ! 1355: ! 1356: q = n/10; ! 1357: if (q != 0) ! 1358: unparseputn(q, fd); ! 1359: unparseputc((char) ('0' + (n%10)), fd); ! 1360: } ! 1361: ! 1362: unparseputc(c, fd) ! 1363: char c; ! 1364: int fd; ! 1365: { ! 1366: char buf[2]; ! 1367: register i = 1; ! 1368: extern Terminal term; ! 1369: ! 1370: if((buf[0] = c) == '\r' && (term.flags & LINEFEED)) { ! 1371: buf[1] = '\n'; ! 1372: i++; ! 1373: } ! 1374: if (write(fd, buf, i) != i) ! 1375: Panic("unparseputc: error writing character\n", 0); ! 1376: } ! 1377: ! 1378: ToAlternate(screen) ! 1379: register TScreen *screen; ! 1380: { ! 1381: extern ScrnBuf Allocate(); ! 1382: ! 1383: if(screen->alternate) ! 1384: return; ! 1385: if(!screen->altbuf) ! 1386: screen->altbuf = Allocate(screen->max_row + 1, screen->max_col ! 1387: + 1); ! 1388: SwitchBufs(screen); ! 1389: screen->alternate = TRUE; ! 1390: } ! 1391: ! 1392: FromAlternate(screen) ! 1393: register TScreen *screen; ! 1394: { ! 1395: if(!screen->alternate) ! 1396: return; ! 1397: screen->alternate = FALSE; ! 1398: SwitchBufs(screen); ! 1399: } ! 1400: ! 1401: SwitchBufs(screen) ! 1402: register TScreen *screen; ! 1403: { ! 1404: register int rows, top; ! 1405: char *save [2 * MAX_ROWS]; ! 1406: ! 1407: if(screen->cursor_state) ! 1408: HideCursor(); ! 1409: rows = screen->max_row + 1; ! 1410: bcopy((char *)screen->buf, (char *)save, 2 * sizeof(char *) * rows); ! 1411: bcopy((char *)screen->altbuf, (char *)screen->buf, 2 * sizeof(char *) * ! 1412: rows); ! 1413: bcopy((char *)save, (char *)screen->altbuf, 2 * sizeof(char *) * rows); ! 1414: ! 1415: if((top = -screen->topline) <= screen->max_row) { ! 1416: if(screen->scroll_amt) ! 1417: FlushScroll(screen); ! 1418: if(top == 0) ! 1419: XClearWindow(screen->display, TextWindow(screen)); ! 1420: else ! 1421: XClearArea( ! 1422: screen->display, ! 1423: TextWindow(screen), ! 1424: (int) screen->border + screen->scrollbar, ! 1425: (int) top * FontHeight(screen) + screen->border, ! 1426: (unsigned) Width(screen), ! 1427: (unsigned) (screen->max_row - top + 1) ! 1428: * FontHeight(screen), ! 1429: FALSE); ! 1430: } ! 1431: ScrnRefresh(screen, 0, 0, rows, screen->max_col + 1); ! 1432: } ! 1433: ! 1434: VTRun() ! 1435: { ! 1436: register TScreen *screen = &term.screen; ! 1437: register int i; ! 1438: ! 1439: if(!VWindow(screen) && !VTInit()) { ! 1440: if(TWindow(screen)) { ! 1441: screen->TekEmu = TRUE; ! 1442: return; ! 1443: } ! 1444: Exit(ERROR_VINIT); ! 1445: } ! 1446: screen->cursor_state = OFF; ! 1447: screen->cursor_set = ON; ! 1448: XMapWindow(screen->display, VWindow(screen)); ! 1449: if(screen->select) ! 1450: VTSelect(); ! 1451: if (L_flag > 0) { ! 1452: XWarpPointer (screen->display, None, VWindow(screen), ! 1453: 0, 0, 0, 0, ! 1454: FullWidth(screen) >> 1, FullHeight(screen) >>1); ! 1455: L_flag = -1; ! 1456: } ! 1457: bcnt = 0; ! 1458: bptr = buffer; ! 1459: while(Tpushb > Tpushback) { ! 1460: *bptr++ = *--Tpushb; ! 1461: bcnt++; ! 1462: } ! 1463: bcnt += (i = Tbcnt); ! 1464: for( ; i > 0 ; i--) ! 1465: *bptr++ = *Tbptr++; ! 1466: bptr = buffer; ! 1467: if(!setjmp(VTend)) ! 1468: VTparse(); ! 1469: HideCursor(); ! 1470: screen->cursor_set = OFF; ! 1471: VTUnselect(); ! 1472: } ! 1473: ! 1474: /*ARGSUSED*/ ! 1475: XtEventReturnCode VTExpose(event, eventdata) ! 1476: register XExposeEvent *event; ! 1477: caddr_t eventdata; ! 1478: { ! 1479: register TScreen *screen = &term.screen; ! 1480: ! 1481: #ifdef DEBUG ! 1482: if(debug) ! 1483: fputs("Expose\n", stderr); ! 1484: #endif DEBUG ! 1485: if (event->type == Expose) { ! 1486: HandleExposure (screen, (XExposeEvent *)event); ! 1487: return(XteventHandled); ! 1488: } ! 1489: if (screen->incopy <= 0) { ! 1490: screen->incopy = 1; ! 1491: if (screen->scrolls > 0) ! 1492: screen->scrolls--; ! 1493: } ! 1494: if (event->type == GraphicsExpose) ! 1495: if (HandleExposure (screen, (XExposeEvent *)event)) ! 1496: screen->cursor_state = OFF; ! 1497: if ((event->type == NoExpose) || event->count == 0) { ! 1498: if (screen->incopy <= 0 && screen->scrolls > 0) ! 1499: screen->scrolls--; ! 1500: if (screen->scrolls) ! 1501: screen->incopy = -1; ! 1502: else ! 1503: screen->incopy = 0; ! 1504: } ! 1505: return (XteventHandled); ! 1506: } ! 1507: ! 1508: ! 1509: ! 1510: /*ARGSUSED*/ ! 1511: XtEventReturnCode VTConfigure(event, eventdata) ! 1512: XConfigureEvent *event; ! 1513: caddr_t eventdata; ! 1514: { ! 1515: register TScreen *screen = &term.screen; ! 1516: ! 1517: if (event->type ==ConfigureNotify ) { ! 1518: ScreenResize (screen, event->width, event->height, &term.flags); ! 1519: return(XteventHandled); ! 1520: } ! 1521: if (event->type != UnmapNotify) return(XteventNotHandled); ! 1522: #ifdef DEBUG ! 1523: if(debug) ! 1524: fputs("UnmapWindow VT\n", stderr); ! 1525: #endif DEBUG ! 1526: if(screen->Tshow) { ! 1527: screen->Tshow = FALSE; ! 1528: XUnmapWindow(screen->display, screen->fullTwin.window ); ! 1529: SyncUnmap( screen->fullTwin.window, TWINDOWEVENTS ); ! 1530: } ! 1531: reselectwindow(screen); ! 1532: return (XteventHandled); ! 1533: } ! 1534: ! 1535: ! 1536: ! 1537: VTInit() ! 1538: { ! 1539: unsigned int width, height; ! 1540: register TScreen *screen = &term.screen; ! 1541: register int i, j; ! 1542: XPoint *vp; ! 1543: static short failed; ! 1544: int x, y, root_x, root_y, xpos, ypos, pr; ! 1545: Window win, root; ! 1546: extern char *malloc(); ! 1547: XGCValues xgcv; ! 1548: GCMask mask; ! 1549: XSizeHints sizehints; ! 1550: XWMHints wmhints; ! 1551: extern int VTgcFontMask; ! 1552: ! 1553: if(failed) ! 1554: return(FALSE); ! 1555: ! 1556: TabReset (term.tabs); ! 1557: ! 1558: screen->fnt_norm = screen->fnt_bold = NULL; ! 1559: ! 1560: /* do the XFont calls */ ! 1561: ! 1562: if ((screen->fnt_norm = XLoadQueryFont(screen->display, f_n)) == NULL) { ! 1563: fprintf(stderr, "%s: Could not open font %s; using server default\n", ! 1564: xterm_name, f_n); ! 1565: screen->fnt_norm = ! 1566: XQueryFont(screen->display, ! 1567: DefaultGC(screen->display, ! 1568: DefaultScreen(screen->display) ! 1569: )->gid ! 1570: ); ! 1571: VTgcFontMask = 0; ! 1572: } ! 1573: ! 1574: if (!f_b || !VTgcFontMask ! 1575: || !(screen->fnt_bold = XLoadQueryFont(screen->display, f_b))) { ! 1576: screen->fnt_bold = screen->fnt_norm; ! 1577: screen->enbolden = TRUE; /*no bold font */ ! 1578: } ! 1579: ! 1580: /* find the max width and higth of the font */ ! 1581: ! 1582: screen->fullVwin.f_width = screen->fnt_norm->max_bounds.width; ! 1583: screen->fullVwin.f_height = screen->fnt_norm->max_bounds.ascent + ! 1584: screen->fnt_norm->max_bounds.descent; ! 1585: ! 1586: /* making cursor -- won't work yet */ ! 1587: ! 1588: if (XStrCmp(curs_shape, "arrow") == 0) { ! 1589: screen->curs = make_arrow(screen->mousecolor, ! 1590: screen->background); ! 1591: } else { ! 1592: screen->curs = make_xterm(screen->mousecolor, ! 1593: screen->background); ! 1594: } ! 1595: ! 1596: i = 2 * screen->border + screen->scrollbar; ! 1597: j = 2 * screen->border; ! 1598: ! 1599: ! 1600: /* set defaults */ ! 1601: xpos = 1; ypos = 1; width = 80; height = 24; ! 1602: ! 1603: pr = XParseGeometry(geo_metry, &xpos, &ypos, &width, &height); ! 1604: ! 1605: screen->max_col = width; ! 1606: screen->max_row = height; ! 1607: width = width * screen->fullVwin.f_width + i; ! 1608: height = height * screen->fullVwin.f_height + j; ! 1609: ! 1610: if ((pr & XValue) && (XNegative&pr)) ! 1611: xpos += DisplayWidth(screen->display, DefaultScreen(screen->display)) ! 1612: - width; ! 1613: if ((pr & YValue) && (YNegative&pr)) ! 1614: ypos += DisplayHeight(screen->display, DefaultScreen(screen->display)) ! 1615: - height; ! 1616: ! 1617: /* set up size hints for window manager */ ! 1618: sizehints.min_width = 2 * screen->border + screen->scrollbar; ! 1619: sizehints.min_height = 2 * screen->border; ! 1620: sizehints.width_inc = FontWidth(screen); ! 1621: sizehints.height_inc = FontHeight(screen); ! 1622: sizehints.flags = PMinSize|PResizeInc; ! 1623: sizehints.x = xpos; ! 1624: sizehints.y = ypos; ! 1625: if ((XValue&pr) && (YValue&pr)) ! 1626: sizehints.flags |= USPosition; ! 1627: else sizehints.flags |= PPosition; ! 1628: sizehints.width = width; ! 1629: sizehints.height = height; ! 1630: if ((WidthValue&pr) && (HeightValue&pr)) ! 1631: sizehints.flags |= USSize; ! 1632: else sizehints.flags |= PSize; ! 1633: ! 1634: screen->fullVwin.fullwidth = width; ! 1635: screen->fullVwin.fullheight = height; ! 1636: screen->fullVwin.width = width - i; ! 1637: screen->fullVwin.height = height - j; ! 1638: ! 1639: ! 1640: if((screen->fullVwin.window = XtCreateWindow( ! 1641: screen->display, ! 1642: DefaultRootWindow(screen->display), ! 1643: xpos, ypos, ! 1644: width, height, ! 1645: screen->borderwidth, screen->bordercolor, ! 1646: screen->background, NorthWestGravity)) == NULL) { ! 1647: fprintf(stderr, "%s: Can't create VT window\n"); ! 1648: return(FALSE); ! 1649: } ! 1650: /* crock to make configure notifies get through */ ! 1651: XtMakeMaster(screen->display, screen->fullVwin.window); ! 1652: ! 1653: /* set size hints */ ! 1654: XSetNormalHints(screen->display, VWindow(screen), &sizehints); ! 1655: /* do the GC stuff */ ! 1656: ! 1657: mask = VTgcFontMask | GCForeground | GCBackground ! 1658: | GCGraphicsExposures | GCFunction; ! 1659: ! 1660: xgcv.graphics_exposures = TRUE; /* default */ ! 1661: xgcv.function = GXcopy; ! 1662: xgcv.font = screen->fnt_norm->fid; ! 1663: xgcv.foreground = screen->foreground; ! 1664: xgcv.background = screen->background; ! 1665: ! 1666: screen->normalGC = XtGetGC( ! 1667: screen->display, ! 1668: (XContext)NULL, ! 1669: DefaultRootWindow(screen->display), ! 1670: mask, ! 1671: &xgcv); ! 1672: ! 1673: if (screen->enbolden) { /* there is no bold font */ ! 1674: xgcv.font = screen->fnt_norm->fid; ! 1675: screen->normalboldGC = screen->normalGC; ! 1676: } else { ! 1677: xgcv.font = screen->fnt_bold->fid; ! 1678: screen->normalboldGC = XtGetGC( ! 1679: screen->display, ! 1680: (XContext)NULL, ! 1681: DefaultRootWindow(screen->display), ! 1682: mask, ! 1683: &xgcv); ! 1684: } ! 1685: ! 1686: xgcv.font = screen->fnt_norm->fid; ! 1687: xgcv.foreground = screen->background; ! 1688: xgcv.background = screen->foreground; ! 1689: ! 1690: screen->reverseGC = XtGetGC( ! 1691: screen->display, ! 1692: (XContext)NULL, ! 1693: DefaultRootWindow(screen->display), ! 1694: mask, ! 1695: &xgcv); ! 1696: ! 1697: if (screen->enbolden) /* there is no bold font */ ! 1698: xgcv.font = screen->fnt_norm->fid; ! 1699: else ! 1700: xgcv.font = screen->fnt_bold->fid; ! 1701: ! 1702: screen->reverseboldGC = XtGetGC( ! 1703: screen->display, ! 1704: (XContext)NULL, ! 1705: DefaultRootWindow(screen->display), ! 1706: mask, ! 1707: &xgcv); ! 1708: ! 1709: /* we also need a set of caret (called a cursor here) gc's */ ! 1710: ! 1711: xgcv.font = screen->fnt_norm->fid; ! 1712: ! 1713: if (screen->cursorcolor != screen->foreground) { ! 1714: xgcv.foreground = screen->cursorcolor; ! 1715: xgcv.background = screen->foreground; ! 1716: } else { ! 1717: xgcv.foreground = screen->foreground; ! 1718: xgcv.background = screen->background; ! 1719: } ! 1720: ! 1721: screen->cursorGC = XtGetGC( ! 1722: screen->display, ! 1723: (XContext)NULL, ! 1724: DefaultRootWindow(screen->display), ! 1725: mask, ! 1726: &xgcv); ! 1727: ! 1728: if (screen->cursorcolor != screen->background) { ! 1729: xgcv.foreground = screen->cursorcolor; ! 1730: xgcv.background = screen->background; ! 1731: } else { ! 1732: xgcv.foreground = screen->background; ! 1733: xgcv.background = screen->foreground; ! 1734: } ! 1735: ! 1736: screen->reversecursorGC = XtGetGC( ! 1737: screen->display, ! 1738: (XContext)NULL, ! 1739: DefaultRootWindow(screen->display), ! 1740: mask, ! 1741: &xgcv); ! 1742: ! 1743: ! 1744: /* setup toolkit stuff */ ! 1745: ! 1746: XtSetNameAndClass(screen->display, screen->fullVwin.window, ! 1747: nameList, classList); ! 1748: XtSetEventHandler(screen->display, VWindow(screen), ! 1749: (XtEventHandler) HandleEnterWindow, EnterWindowMask, (caddr_t)NULL); ! 1750: XtSetEventHandler(screen->display, VWindow(screen), ! 1751: (XtEventHandler) HandleLeaveWindow, LeaveWindowMask, (caddr_t)NULL); ! 1752: XtSetEventHandler(screen->display, VWindow(screen), ! 1753: (XtEventHandler) HandleFocusChange, FocusChangeMask, (caddr_t)NULL); ! 1754: XtSetEventHandler(screen->display, VWindow(screen), ! 1755: (XtEventHandler) VTButtonPressed, ButtonPressMask, (caddr_t)NULL); ! 1756: XtSetEventHandler(screen->display, VWindow(screen), ! 1757: (XtEventHandler) VTButtonReleased, ButtonReleaseMask, (caddr_t)NULL); ! 1758: XtSetEventHandler(screen->display, VWindow(screen), ! 1759: (XtEventHandler) VTMouseMoved, ButtonMotionMask, (caddr_t)NULL); ! 1760: XtSetEventHandler(screen->display, VWindow(screen), ! 1761: (XtEventHandler) VTExpose, ExposureMask, (caddr_t)NULL); ! 1762: XtSetEventHandler(screen->display, VWindow(screen), ! 1763: (XtEventHandler) VTConfigure, StructureNotifyMask, (caddr_t)NULL); ! 1764: XtSetEventHandler(screen->display, VWindow(screen), ! 1765: (XtEventHandler) HandleKeyPressed, KeyPressMask, (caddr_t)NULL); ! 1766: ! 1767: /* ! 1768: * XCreateTerm flushes all events, which might include an EnterWindow ! 1769: * or LeaveWindow. So if the cursor is not where it is supposed to ! 1770: * be, we set select to the appropriate thing. ! 1771: */ ! 1772: if(TWindow(screen) && XQueryPointer( ! 1773: screen->display, ! 1774: DefaultRootWindow(screen->display), ! 1775: &root, &win, ! 1776: &root_x, &root_y, ! 1777: &x, &y, ! 1778: &mask)) { ! 1779: if(win == TWindow(screen)) ! 1780: screen->select |= INWINDOW; ! 1781: else ! 1782: screen->select &= ~INWINDOW; ! 1783: } ! 1784: ! 1785: /* Reset variables used by ANSI emulation. */ ! 1786: ! 1787: screen->gsets[0] = 'B'; /* ASCII_G */ ! 1788: screen->gsets[1] = 'B'; ! 1789: screen->gsets[2] = 'B'; /* DEC supplemental. */ ! 1790: screen->gsets[3] = 'B'; ! 1791: screen->curgl = 0; /* G0 => GL. */ ! 1792: screen->curgr = 2; /* G2 => GR. */ ! 1793: screen->curss = 0; /* No single shift. */ ! 1794: ! 1795: wmhints.flags = StateHint | InputHint; ! 1796: wmhints.input = True; ! 1797: if (iconstartup) wmhints.initial_state = IconicState; ! 1798: else wmhints.initial_state = NormalState; ! 1799: if(icon_geom) { ! 1800: wmhints.icon_x = 1; wmhints.icon_y = 1; width = 1; height = 1; ! 1801: pr = XParseGeometry( ! 1802: icon_geom, ! 1803: &wmhints.icon_x, &wmhints.icon_y, ! 1804: &width, &height); ! 1805: if((pr & XValue) && (pr & XNegative)) ! 1806: wmhints.icon_x += ! 1807: DisplayWidth(screen->display,DefaultScreen(screen->display)) ! 1808: - width - 2 * screen->borderwidth; ! 1809: if((pr & YValue) && (pr & YNegative)) ! 1810: wmhints.icon_y += ! 1811: DisplayHeight(screen->display,DefaultScreen(screen->display)) ! 1812: - height - 2 * screen->borderwidth; ! 1813: if ((XValue&pr) && (YValue&pr)) ! 1814: wmhints.flags |= IconPositionHint; ! 1815: } ! 1816: XSetWMHints(screen->display, VWindow(screen), &wmhints); ! 1817: ! 1818: XDefineCursor(screen->display, VWindow(screen), screen->curs ); ! 1819: XStoreName (screen->display, VWindow(screen), screen->titlename); ! 1820: XChangeProperty( ! 1821: screen->display, VWindow(screen), ! 1822: XA_WM_ICON_NAME, XA_STRING, ! 1823: 8, PropModeReplace, ! 1824: (unsigned char *)screen->iconname, screen->iconnamelen); ! 1825: ! 1826: screen->cur_col = screen->cur_row = 0; ! 1827: screen->max_col = Width(screen) / screen->fullVwin.f_width - 1; ! 1828: screen->top_marg = 0; ! 1829: screen->bot_marg = screen->max_row = Height(screen) / ! 1830: screen->fullVwin.f_height - 1; ! 1831: ! 1832: screen->sc.row = screen->sc.col = screen->sc.flags = NULL; ! 1833: ! 1834: /* allocate memory for screen buffer */ ! 1835: screen->buf = screen->allbuf = (ScrnBuf) Allocate (screen->max_row + 1, ! 1836: screen->max_col +1); ! 1837: ! 1838: screen->do_wrap = NULL; ! 1839: screen->scrolls = screen->incopy = 0; ! 1840: /* free((char *)fInfo); */ ! 1841: vp = &VTbox[1]; ! 1842: (vp++)->x = FontWidth(screen) - 1; ! 1843: (vp++)->y = FontHeight(screen) - 1; ! 1844: (vp++)->x = -(FontWidth(screen) - 1); ! 1845: vp->y = -(FontHeight(screen) - 1); ! 1846: screen->box = VTbox; ! 1847: ! 1848: screen->savelines = save_lines; ! 1849: screen->savedlines = 0; ! 1850: if(screen->scrollbar) { ! 1851: screen->scrollbar = 0; ! 1852: ScrollBarOn(screen, TRUE); ! 1853: } ! 1854: return(TRUE); ! 1855: } ! 1856: ! 1857: /* ! 1858: * Shows cursor at new cursor position in screen. ! 1859: */ ! 1860: ShowCursor() ! 1861: { ! 1862: register TScreen *screen = &term.screen; ! 1863: register int x, y, flags, y1, x1; ! 1864: char c; ! 1865: GC currentGC; ! 1866: ! 1867: if (eventMode != NORMAL) return; ! 1868: ! 1869: if (screen->cur_row - screen->topline > screen->max_row) ! 1870: return; ! 1871: c = screen->buf[y = 2 * (screen->cursor_row = screen->cur_row)] ! 1872: [x = screen->cursor_col = screen->cur_col]; ! 1873: flags = screen->buf[y + 1][x]; ! 1874: if (c == 0) ! 1875: c = ' '; ! 1876: ! 1877: if(screen->select) { ! 1878: ! 1879: if(flags & INVERSE) { /* is reverse video */ ! 1880: if (flags & BOLD) { ! 1881: currentGC = screen->normalboldGC; ! 1882: } else { ! 1883: currentGC = screen->normalGC; ! 1884: } ! 1885: ! 1886: } else { /* normal video */ ! 1887: if (flags & BOLD) { ! 1888: currentGC = screen->reverseboldGC; ! 1889: } else { ! 1890: currentGC = screen->reverseGC; ! 1891: } ! 1892: } ! 1893: } else { /* not selected */ ! 1894: if(flags & INVERSE) { /* is reverse video */ ! 1895: currentGC = screen->reverseGC; ! 1896: } else { /* normal video */ ! 1897: currentGC = screen->normalGC; ! 1898: } ! 1899: ! 1900: } ! 1901: ! 1902: ! 1903: x = CursorX (screen, screen->cur_col); ! 1904: y = CursorY(screen, screen->cur_row) + ! 1905: screen->fnt_norm->max_bounds.ascent; ! 1906: XDrawImageString(screen->display, TextWindow(screen), currentGC, ! 1907: x, y, &c, 1); ! 1908: ! 1909: if((flags & BOLD) && screen->enbolden) /* no bold font */ ! 1910: XDrawString(screen->display, TextWindow(screen), currentGC, ! 1911: x + 1, y, &c, 1); ! 1912: if(flags & UNDERLINE) ! 1913: XDrawLine(screen->display, TextWindow(screen), currentGC, ! 1914: x, y+1, x + FontWidth(screen), y+1); ! 1915: if(screen->select) { ! 1916: y1 = y - screen->fnt_norm->max_bounds.ascent; ! 1917: x1 = x + screen->fnt_norm->max_bounds.lbearing; ! 1918: XDrawLine(screen->display, TextWindow(screen), currentGC, ! 1919: x1, y1, x1, y1 + FontHeight(screen)-1); ! 1920: } else { ! 1921: screen->box->x = x + screen->fnt_norm->max_bounds.lbearing; ! 1922: screen->box->y = y - screen->fnt_norm->max_bounds.ascent; ! 1923: XDrawLines(screen->display, TextWindow(screen), currentGC, ! 1924: screen->box, NBOX, CoordModePrevious); ! 1925: } ! 1926: screen->cursor_state = ON; ! 1927: } ! 1928: ! 1929: /* ! 1930: * hide cursor at previous cursor position in screen. ! 1931: */ ! 1932: HideCursor() ! 1933: { ! 1934: register TScreen *screen = &term.screen; ! 1935: GC currentGC; ! 1936: register int x, y, flags; ! 1937: char c; ! 1938: ! 1939: if(screen->cursor_row - screen->topline > screen->max_row) ! 1940: return; ! 1941: c = screen->buf[y = 2 * screen->cursor_row][x = screen->cursor_col]; ! 1942: flags = screen->buf[y + 1][x]; ! 1943: ! 1944: if(flags & INVERSE) { ! 1945: if(flags & BOLD) { ! 1946: currentGC = screen->reverseboldGC; ! 1947: } else { ! 1948: currentGC = screen->reverseGC; ! 1949: } ! 1950: } else { ! 1951: if(flags & BOLD) { ! 1952: currentGC = screen->normalboldGC; ! 1953: } else { ! 1954: currentGC = screen->normalGC; ! 1955: } ! 1956: } ! 1957: ! 1958: if (c == 0) ! 1959: c = ' '; ! 1960: x = CursorX (screen, screen->cursor_col); ! 1961: y = (((screen->cursor_row - screen->topline) * FontHeight(screen))) + ! 1962: screen->border; ! 1963: y = y+screen->fnt_norm->max_bounds.ascent; ! 1964: XDrawImageString(screen->display, TextWindow(screen), currentGC, ! 1965: x, y, &c, 1); ! 1966: if((flags & BOLD) && screen->enbolden) ! 1967: XDrawString(screen->display, TextWindow(screen), currentGC, ! 1968: x + 1, y, &c, 1); ! 1969: if(flags & UNDERLINE) ! 1970: XDrawLine(screen->display, TextWindow(screen), currentGC, ! 1971: x, y+1, x + FontWidth(screen), y+1); ! 1972: screen->cursor_state = OFF; ! 1973: } ! 1974: ! 1975: VTSelect() ! 1976: { ! 1977: register TScreen *screen = &term.screen; ! 1978: ! 1979: XSetWindowBorder(screen->display, TextWindow(screen), screen->bordercolor); ! 1980: } ! 1981: ! 1982: VTUnselect() ! 1983: { ! 1984: register TScreen *screen = &term.screen; ! 1985: ! 1986: XSetWindowBorderPixmap(screen->display, TextWindow(screen), ! 1987: screen->graybordertile); ! 1988: } ! 1989: ! 1990: VTReset(full) ! 1991: int full; ! 1992: { ! 1993: register TScreen *screen = &term.screen; ! 1994: ! 1995: /* reset scrolling region */ ! 1996: screen->top_marg = 0; ! 1997: screen->bot_marg = screen->max_row; ! 1998: term.flags &= ~ORIGIN; ! 1999: if(full) { ! 2000: TabReset (term.tabs); ! 2001: term.keyboard.flags = NULL; ! 2002: screen->gsets[0] = 'B'; ! 2003: screen->gsets[1] = 'B'; ! 2004: screen->gsets[2] = 'B'; ! 2005: screen->gsets[3] = 'B'; ! 2006: screen->curgl = 0; ! 2007: screen->curgr = 2; ! 2008: screen->curss = 0; ! 2009: ClearScreen(screen); ! 2010: screen->cursor_state = OFF; ! 2011: if(!(term.flags & AUTOREPEAT)) ! 2012: XAutoRepeatOn(screen->display); ! 2013: if (term.flags & REVERSE_VIDEO) ! 2014: ReverseVideo(&term); ! 2015: ! 2016: term.flags = term.initflags; ! 2017: if(screen->c132 && (term.flags & IN132COLUMNS)) { ! 2018: XResizeWindow( ! 2019: screen->display, ! 2020: TextWindow(screen), ! 2021: (unsigned) 80*FontWidth(screen) ! 2022: + 2 * screen->border + screen->scrollbar, ! 2023: (unsigned) FontHeight(screen) ! 2024: * (screen->max_row + 1) + 2 * screen->border); ! 2025: XSync(screen->display, FALSE); /* synchronize */ ! 2026: if(QLength(screen->display) > 0) ! 2027: xevents(); ! 2028: } ! 2029: CursorSet(screen, 0, 0, term.flags); ! 2030: } ! 2031: longjmp(vtjmpbuf, 1); /* force ground state in parser */ ! 2032: } ! 2033: ! 2034: ! 2035: #ifdef MODEMENU ! 2036: #define MMENU_SCROLL 0 ! 2037: #define MMENU_VIDEO (MMENU_SCROLL+1) ! 2038: #define MMENU_WRAP (MMENU_VIDEO+1) ! 2039: #define MMENU_REVERSEWRAP (MMENU_WRAP+1) ! 2040: #define MMENU_NLM (MMENU_REVERSEWRAP+1) ! 2041: #define MMENU_CURSOR (MMENU_NLM+1) ! 2042: #define MMENU_PAD (MMENU_CURSOR+1) ! 2043: #define MMENU_REPEAT (MMENU_PAD+1) ! 2044: #define MMENU_SCROLLBAR (MMENU_REPEAT+1) ! 2045: #define MMENU_SCROLLKEY (MMENU_SCROLLBAR+1) ! 2046: #define MMENU_SCROLLINPUT (MMENU_SCROLLKEY+1) ! 2047: #define MMENU_C132 (MMENU_SCROLLINPUT+1) ! 2048: #define MMENU_CURSES (MMENU_C132+1) ! 2049: #define MMENU_MARGBELL (MMENU_CURSES+1) ! 2050: #define MMENU_TEKWIN (MMENU_MARGBELL+1) ! 2051: #define MMENU_ALTERN (MMENU_TEKWIN+1) ! 2052: #define MMENU_LINE (MMENU_ALTERN+1) ! 2053: #define MMENU_RESET (MMENU_LINE+1) ! 2054: #define MMENU_FULLRESET (MMENU_RESET+1) ! 2055: #define MMENU_TEKMODE (MMENU_FULLRESET+1) ! 2056: #define MMENU_HIDEVT (MMENU_TEKMODE+1) ! 2057: ! 2058: static char *vtext[] = { ! 2059: "Jump Scroll", ! 2060: "Reverse Video", ! 2061: "Auto Wraparound", ! 2062: "Reverse Wraparound", ! 2063: "Auto Linefeed", ! 2064: "Application Cursors", ! 2065: "Application Pad", ! 2066: "Auto Repeat", ! 2067: "Scrollbar", ! 2068: "Scroll to bottom on key", ! 2069: "Scroll to bottom on input", ! 2070: "80 <-> 132 Columns", ! 2071: "Curses Emulation", ! 2072: "Margin Bell", ! 2073: "Tek Window Showing", ! 2074: "Alternate Screen", ! 2075: "-", ! 2076: "Soft Reset", ! 2077: "Full Reset", ! 2078: "Select Tek Mode", ! 2079: "Hide VT Window", ! 2080: 0, ! 2081: }; ! 2082: ! 2083: ! 2084: static int menutermflags; ! 2085: static int menukbdflags; ! 2086: static int t132; ! 2087: static int taltern; ! 2088: static int tcurses; ! 2089: static int tmarginbell; ! 2090: static int tscrollbar; ! 2091: static int tscrollkey; ! 2092: static int tscrollinput; ! 2093: static int tshow; ! 2094: ! 2095: Menu *setupmenu(menu) ! 2096: register Menu **menu; ! 2097: { ! 2098: register TScreen *screen = &term.screen; ! 2099: register char **cp; ! 2100: register int flags = term.flags; ! 2101: register int kflags = term.keyboard.flags; ! 2102: ! 2103: if (*menu == NULL) { ! 2104: if ((*menu = NewMenu("Modes", re_verse)) == NULL) ! 2105: return(NULL); ! 2106: for(cp = vtext ; *cp ; cp++) ! 2107: AddMenuItem(*menu, *cp); ! 2108: if(!(flags & SMOOTHSCROLL)) ! 2109: CheckItem(*menu, MMENU_SCROLL); ! 2110: if(flags & REVERSE_VIDEO) ! 2111: CheckItem(*menu, MMENU_VIDEO); ! 2112: if(flags & WRAPAROUND) ! 2113: CheckItem(*menu, MMENU_WRAP); ! 2114: if(flags & REVERSEWRAP) ! 2115: CheckItem(*menu, MMENU_REVERSEWRAP); ! 2116: if(flags & LINEFEED) ! 2117: CheckItem(*menu, MMENU_NLM); ! 2118: if(kflags & CURSOR_APL) ! 2119: CheckItem(*menu, MMENU_CURSOR); ! 2120: if(kflags & KYPD_APL) ! 2121: CheckItem(*menu, MMENU_PAD); ! 2122: if(flags & AUTOREPEAT) ! 2123: CheckItem(*menu, MMENU_REPEAT); ! 2124: if(tscrollbar = (screen->scrollbar > 0)) { ! 2125: CheckItem(*menu, MMENU_SCROLLBAR); ! 2126: if(tscrollkey = screen->scrollkey) ! 2127: CheckItem(*menu, MMENU_SCROLLKEY); ! 2128: if(tscrollinput = screen->scrollinput) ! 2129: CheckItem(*menu, MMENU_SCROLLINPUT); ! 2130: } else { ! 2131: tscrollkey = FALSE; ! 2132: DisableItem(*menu, MMENU_SCROLLKEY); ! 2133: tscrollinput = FALSE; ! 2134: DisableItem(*menu, MMENU_SCROLLINPUT); ! 2135: } ! 2136: if(t132 = screen->c132) ! 2137: CheckItem(*menu, MMENU_C132); ! 2138: if(tcurses = screen->curses) ! 2139: CheckItem(*menu, MMENU_CURSES); ! 2140: if(tmarginbell = screen->marginbell) ! 2141: CheckItem(*menu, MMENU_MARGBELL); ! 2142: if(tshow = screen->Tshow) ! 2143: CheckItem(*menu, MMENU_TEKWIN); ! 2144: else ! 2145: DisableItem(*menu, MMENU_HIDEVT); ! 2146: DisableItem(*menu, MMENU_ALTERN); ! 2147: if(taltern = screen->alternate) { ! 2148: CheckItem(*menu, MMENU_ALTERN); ! 2149: } ! 2150: DisableItem(*menu, MMENU_LINE); ! 2151: if(screen->inhibit & I_TEK) { ! 2152: DisableItem(*menu, MMENU_TEKWIN); ! 2153: DisableItem(*menu, MMENU_TEKMODE); ! 2154: } ! 2155: menutermflags = flags; ! 2156: menukbdflags = kflags; ! 2157: return(*menu); ! 2158: } ! 2159: menutermflags ^= flags; ! 2160: menukbdflags ^= kflags; ! 2161: if (menutermflags & SMOOTHSCROLL) ! 2162: SetItemCheck(*menu, MMENU_SCROLL, !(flags & SMOOTHSCROLL)); ! 2163: if (menutermflags & REVERSE_VIDEO) ! 2164: SetItemCheck(*menu, MMENU_VIDEO, flags & REVERSE_VIDEO); ! 2165: if (menutermflags & WRAPAROUND) ! 2166: SetItemCheck(*menu, MMENU_WRAP, flags & WRAPAROUND); ! 2167: if (menutermflags & REVERSEWRAP) ! 2168: SetItemCheck(*menu, MMENU_REVERSEWRAP, flags & REVERSEWRAP); ! 2169: if (menutermflags & LINEFEED) ! 2170: SetItemCheck(*menu, MMENU_NLM, flags & LINEFEED); ! 2171: if (menukbdflags & CURSOR_APL) ! 2172: SetItemCheck(*menu, MMENU_CURSOR, kflags & CURSOR_APL); ! 2173: if (menukbdflags & KYPD_APL) ! 2174: SetItemCheck(*menu, MMENU_PAD, kflags & KYPD_APL); ! 2175: if (menutermflags & AUTOREPEAT) ! 2176: SetItemCheck(*menu, MMENU_REPEAT, flags & AUTOREPEAT); ! 2177: if(tscrollbar != (screen->scrollbar > 0)) { ! 2178: SetItemCheck(*menu, MMENU_SCROLLBAR, (tscrollbar = ! 2179: (screen->scrollbar > 0))); ! 2180: SetItemDisable(*menu, MMENU_SCROLLKEY, !tscrollbar); ! 2181: SetItemCheck(*menu, MMENU_SCROLLKEY, ! 2182: tscrollkey = (tscrollbar && screen->scrollkey)); ! 2183: SetItemDisable(*menu, MMENU_SCROLLINPUT, !tscrollbar); ! 2184: SetItemCheck(*menu, MMENU_SCROLLINPUT, ! 2185: tscrollinput = (tscrollbar && screen->scrollinput)); ! 2186: } else if (tscrollbar) { ! 2187: if (tscrollkey != screen->scrollkey) ! 2188: SetItemCheck(*menu, MMENU_SCROLLKEY, ! 2189: tscrollkey = screen->scrollkey); ! 2190: if (tscrollinput != screen->scrollinput) ! 2191: SetItemCheck(*menu, MMENU_SCROLLINPUT, ! 2192: tscrollinput = screen->scrollinput); ! 2193: } ! 2194: if(t132 != screen->c132) ! 2195: SetItemCheck(*menu, MMENU_C132, (t132 = screen->c132)); ! 2196: if(tcurses != screen->curses) ! 2197: SetItemCheck(*menu, MMENU_CURSES, (tcurses = screen->curses)); ! 2198: if(tmarginbell != screen->marginbell) ! 2199: SetItemCheck(*menu, MMENU_MARGBELL, (tmarginbell = ! 2200: screen->marginbell)); ! 2201: if(tshow != screen->Tshow) { ! 2202: SetItemCheck(*menu, MMENU_TEKWIN, (tshow = screen->Tshow)); ! 2203: SetItemDisable(*menu, MMENU_HIDEVT, !tshow); ! 2204: } ! 2205: if(taltern != screen->alternate) { ! 2206: SetItemCheck(*menu, MMENU_ALTERN, (taltern = ! 2207: screen->alternate)); ! 2208: } ! 2209: menutermflags = flags; ! 2210: menukbdflags = kflags; ! 2211: return(*menu); ! 2212: } ! 2213: ! 2214: domenufunc(item) ! 2215: int item; ! 2216: { ! 2217: register TScreen *screen = &term.screen; ! 2218: ! 2219: switch (item) { ! 2220: case MMENU_SCROLL: ! 2221: term.flags ^= SMOOTHSCROLL; ! 2222: if (term.flags & SMOOTHSCROLL) { ! 2223: screen->jumpscroll = FALSE; ! 2224: if (screen->scroll_amt) ! 2225: FlushScroll(screen); ! 2226: } else ! 2227: screen->jumpscroll = TRUE; ! 2228: break; ! 2229: ! 2230: case MMENU_VIDEO: ! 2231: term.flags ^= REVERSE_VIDEO; ! 2232: ReverseVideo(&term); ! 2233: break; ! 2234: ! 2235: case MMENU_WRAP: ! 2236: term.flags ^= WRAPAROUND; ! 2237: break; ! 2238: ! 2239: case MMENU_REVERSEWRAP: ! 2240: term.flags ^= REVERSEWRAP; ! 2241: break; ! 2242: ! 2243: case MMENU_NLM: ! 2244: term.flags ^= LINEFEED; ! 2245: break; ! 2246: ! 2247: case MMENU_CURSOR: ! 2248: term.keyboard.flags ^= CURSOR_APL; ! 2249: break; ! 2250: ! 2251: case MMENU_PAD: ! 2252: term.keyboard.flags ^= KYPD_APL; ! 2253: break; ! 2254: ! 2255: case MMENU_REPEAT: ! 2256: term.flags ^= AUTOREPEAT; ! 2257: if (term.flags & AUTOREPEAT) ! 2258: XAutoRepeatOn(screen->display); ! 2259: else ! 2260: XAutoRepeatOff(screen->display); ! 2261: break; ! 2262: ! 2263: case MMENU_SCROLLBAR: ! 2264: if(screen->scrollbar) ! 2265: ScrollBarOff(screen); ! 2266: else ! 2267: ScrollBarOn(screen, FALSE); ! 2268: break; ! 2269: ! 2270: case MMENU_SCROLLKEY: ! 2271: screen->scrollkey = !screen->scrollkey; ! 2272: break; ! 2273: ! 2274: case MMENU_SCROLLINPUT: ! 2275: screen->scrollinput = !screen->scrollinput; ! 2276: break; ! 2277: ! 2278: ! 2279: case MMENU_C132: ! 2280: screen->c132 = !screen->c132; ! 2281: break; ! 2282: ! 2283: case MMENU_MARGBELL: ! 2284: if(!(screen->marginbell = !screen->marginbell)) ! 2285: screen->bellarmed = -1; ! 2286: break; ! 2287: ! 2288: case MMENU_CURSES: ! 2289: screen->curses = !screen->curses; ! 2290: break; ! 2291: ! 2292: case MMENU_FULLRESET: ! 2293: VTReset(TRUE); ! 2294: break; ! 2295: ! 2296: case MMENU_RESET: ! 2297: VTReset(FALSE); ! 2298: break; ! 2299: ! 2300: case MMENU_HIDEVT: ! 2301: XUnmapWindow(screen->display, VWindow(screen)); ! 2302: reselectwindow(screen); ! 2303: SyncUnmap(VWindow(screen), WINDOWEVENTS); ! 2304: /* drop through */ ! 2305: case MMENU_TEKMODE: ! 2306: if(!screen->TekEmu) { ! 2307: if(screen->logging) { ! 2308: FlushLog(screen); ! 2309: screen->logstart = Tbuffer; ! 2310: } ! 2311: screen->TekEmu = TRUE; ! 2312: longjmp(VTend, 1); ! 2313: } else ! 2314: XRaiseWindow(screen->display, TWindow(screen)); ! 2315: break; ! 2316: ! 2317: case MMENU_TEKWIN: ! 2318: if(screen->Tshow = !screen->Tshow) { ! 2319: if(TWindow(screen) || TekInit()) { ! 2320: XMapWindow(screen->display, TWindow(screen)); ! 2321: screen->Tshow = TRUE; ! 2322: } ! 2323: } else { ! 2324: screen->Tshow = FALSE; ! 2325: XUnmapWindow(screen->display, TWindow(screen)); ! 2326: SyncUnmap(TWindow(screen), TWINDOWEVENTS); ! 2327: if(screen->TekEmu) { ! 2328: if(screen->logging) { ! 2329: FlushLog(screen); ! 2330: screen->logstart = buffer; ! 2331: } ! 2332: longjmp(Tekend, 1); ! 2333: } ! 2334: } ! 2335: reselectwindow(screen); ! 2336: break; ! 2337: } ! 2338: } ! 2339: #endif MODEMENU ! 2340:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.