|
|
1.1 ! root 1: #include "jerq.h" ! 2: #include <signal.h> ! 3: ! 4: #define CURSOR '\001' ! 5: ! 6: #define NUL '\000' ! 7: #define SOH '\001' ! 8: #define STX '\002' ! 9: #define ETX '\003' ! 10: #define EOT '\004' ! 11: #define ENQ '\005' ! 12: #define ACK '\006' ! 13: #define BEL '\007' ! 14: #define BS '\010' ! 15: #define HT '\011' ! 16: #define NL '\012' ! 17: #define VT '\013' ! 18: #define FF '\014' ! 19: #define CR '\015' ! 20: #define SO '\016' ! 21: #define SI '\017' ! 22: #define DLE '\020' ! 23: #define DC1 '\021' ! 24: #define DC2 '\022' ! 25: #define DC3 '\023' ! 26: #define DC4 '\024' ! 27: #define NAK '\025' ! 28: #define SYN '\026' ! 29: #define ETB '\027' ! 30: #define CAN '\030' ! 31: #define EM '\031' ! 32: #define SUB '\032' ! 33: #define ESC '\033' ! 34: #define FS '\034' ! 35: #define GS '\035' ! 36: #define RS '\036' ! 37: #define US '\037' ! 38: #define DEL '\177' ! 39: ! 40: #define NORMAL 0 ! 41: #define DEFOCUSED 1 ! 42: #define WRITETHRU 2 ! 43: ! 44: #define OUTMODED -1 ! 45: #define DISALLOWED 0 ! 46: #define ALLOWED 1 ! 47: #define FLASHED 2 ! 48: #define PENDING 3 ! 49: #define DIMMED 4 ! 50: #define REMOTE 6 ! 51: #define LOCAL 7 ! 52: #define ALPHA 8 ! 53: #define GIN 9 ! 54: #define GRAPH 10 ! 55: #define POINT 11 ! 56: #define SPECIALPOINT 12 ! 57: #define INCREMENTAL 13 ! 58: #define RESET 14 ! 59: #define EXIT 15 ! 60: ! 61: #define SAVEC 64 ! 62: #define SAVEL 32 ! 63: #define SAVEP 128 ! 64: ! 65: #define TEKXMAX 4096 ! 66: #define TEKYMAX 3120 ! 67: ! 68: #define MAGICSIZE 16 ! 69: ! 70: /* There is no checking on buffer overrun in magic mode, since there is no ! 71: way to recover if it happens. */ ! 72: ! 73: char magicbase[MAGICSIZE],*magicbot=magicbase,*magictop=magicbase; ! 74: ! 75: short menu2_bits[] = { ! 76: 0x1FF8, 0x1008, 0x1008, 0x1008, ! 77: 0x1FF8, 0x1FF8, 0x1FF8, 0x1C38, ! 78: 0x1188, 0x13C8, 0x1188, 0x1DB8, ! 79: 0x1188, 0x1008, 0x1008, 0x1FF8, ! 80: }; ! 81: Cursor menu2; ! 82: ! 83: short sunset_bits[] = { ! 84: 0x5006, 0xA819, 0x00A0, 0x04A0, ! 85: 0x049F, 0x12A4, 0x0808, 0x03E0, ! 86: 0x2412, 0x0808, 0x0808, 0x3FFF, ! 87: 0x3C1F, 0x7E7E, 0x783E, 0xFCFC, ! 88: }; ! 89: Cursor sunset; ! 90: ! 91: short none_bits[] = { ! 92: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ! 93: }; ! 94: Cursor none; ! 95: ! 96: short grey_bits[] = { ! 97: 0x1111, 0x4444, 0x1111, 0x4444, 0x1111, 0x4444, 0x1111, 0x4444, ! 98: 0x1111, 0x4444, 0x1111, 0x4444, 0x1111, 0x4444, 0x1111, 0x4444, ! 99: }; ! 100: Texture grey; ! 101: ! 102: short hdots_bits[] = { ! 103: 0xAAAA, 0xAAAA, 0xAAAA, 0xAAAA, ! 104: 0xAAAA, 0xAAAA, 0xAAAA, 0xAAAA, ! 105: 0xAAAA, 0xAAAA, 0xAAAA, 0xAAAA, ! 106: 0xAAAA, 0xAAAA, 0xAAAA, 0xAAAA, ! 107: }; ! 108: Texture hdots; ! 109: ! 110: short vdots_bits[] = { ! 111: 0xFFFF, 0x0000, 0xFFFF, 0x0000, ! 112: 0xFFFF, 0x0000, 0xFFFF, 0x0000, ! 113: 0xFFFF, 0x0000, 0xFFFF, 0x0000, ! 114: 0xFFFF, 0x0000, 0xFFFF, 0x0000, ! 115: }; ! 116: Texture vdots; ! 117: ! 118: char style_dotted[] = { 2, 2, 0}; ! 119: char style_dot_dash[] = {7, 2, 2, 1, 2, 2, 0}; ! 120: char style_short_dash[] = {4, 4, 0}; ! 121: char style_long_dash[] = {8, 8, 0}; ! 122: char *styles[] = { ! 123: 0, /* = 0 ==> solid */ ! 124: style_dotted, /* = 1 ==> dotted */ ! 125: style_dot_dash, /* = 2 ==> dot-dash */ ! 126: style_short_dash, /* = 3 ==> short-dash */ ! 127: style_long_dash, /* = 4 ==> long-dash */ ! 128: }; ! 129: ! 130: extern Font defont; ! 131: ! 132: int width[]={56,51,34,31,56,51,34,31},height[]={88,82,53,48,88,82,53,48}; ! 133: Font *font[8]; ! 134: ! 135: /* Map for size 16 x 16 */ ! 136: ! 137: unsigned char dither[16][16] = { ! 138: 127, 223, 95, 247, 119, 215, 87, 253, 125, 221, 93, 245, 117, 213, 85, 255, ! 139: 128, 32, 160, 8, 136, 40, 168, 2, 130, 34, 162, 10, 138, 42, 170, 0, ! 140: 64, 224, 96, 200, 72, 232, 104, 194, 66, 226, 98, 202, 74, 234, 106, 192, ! 141: 176, 16, 144, 56, 184, 24, 152, 50, 178, 18, 146, 58, 186, 26, 154, 48, ! 142: 112, 208, 80, 248, 120, 216, 88, 242, 114, 210, 82, 250, 122, 218, 90, 240, ! 143: 140, 44, 172, 4, 132, 36, 164, 14, 142, 46, 174, 6, 134, 38, 166, 12, ! 144: 76, 236, 108, 196, 68, 228, 100, 206, 78, 238, 110, 198, 70, 230, 102, 204, ! 145: 188, 28, 156, 52, 180, 20, 148, 62, 190, 30, 158, 54, 182, 22, 150, 60, ! 146: 124, 220, 92, 244, 116, 212, 84, 254, 126, 222, 94, 246, 118, 214, 86, 252, ! 147: 131, 35, 163, 11, 139, 43, 171, 1, 129, 33, 161, 9, 137, 41, 169, 3, ! 148: 67, 227, 99, 203, 75, 235, 107, 193, 65, 225, 97, 201, 73, 233, 105, 195, ! 149: 179, 19, 147, 59, 187, 27, 155, 49, 177, 17, 145, 57, 185, 25, 153, 51, ! 150: 115, 211, 83, 251, 123, 219, 91, 241, 113, 209, 81, 249, 121, 217, 89, 243, ! 151: 143, 47, 175, 7, 135, 39, 167, 13, 141, 45, 173, 5, 133, 37, 165, 15, ! 152: 79, 239, 111, 199, 71, 231, 103, 205, 77, 237, 109, 197, 69, 229, 101, 207, ! 153: 191, 31, 159, 55, 183, 23, 151, 61, 189, 29, 157, 53, 181, 21, 149, 63, ! 154: }; ! 155: ! 156: int dispmode, kbdmode, tekmargin, currfont, penstate, flash_state, flashmode, ! 157: dim_state, zaxis, drawallowed, bypass, intensity, aplmode, dithermode, ! 158: lastmouse, smear, F_DRAW, lockfont; ! 159: char *linestyle; ! 160: Point tekcursor,tekhairs,jerqcursor,jerqhairs; ! 161: Point jerqorigin,jerqsize; ! 162: Rectangle jerqrect; ! 163: ! 164: int DELimpliesLOY = 0, LFeffect = 0, CReffect = 0, ! 165: GINcount = 5, DIMallowed = ALLOWED; ! 166: ! 167: char *switchtext[]= ! 168: {"local","page","reset","font","flash","random", ! 169: "focus","shift","exit",NULL}; ! 170: Menu switchmenu={switchtext}; ! 171: ! 172: char *fonttext[]= ! 173: {"lock ","apl "," jumbo"," big "," small"," tiny ",NULL}; ! 174: Menu fontmenu={fonttext}; ! 175: ! 176: int waitforchar() ! 177: { ! 178: ! 179: int perm,xoff; ! 180: int c,delay; ! 181: ! 182: perm = RCV|KBD|MOUSE; ! 183: xoff = 0; ! 184: /* flash_state = ALLOWED;*/ ! 185: flash_state = DISALLOWED; ! 186: if (dispmode == ALPHA) ! 187: dim_state = DIMallowed; ! 188: else ! 189: dim_state = DISALLOWED; ! 190: for(;;) { ! 191: /* ! 192: * if (got&ALARM) { ! 193: * if (flash_state == ALLOWED) { ! 194: * flash_state = flash(); ! 195: * alarm(6); ! 196: * } else if (flash_state == FLASHED) { ! 197: * unflash(); ! 198: * flash_state = DISALLOWED; ! 199: * alarm(60); ! 200: * } else if (dim_state == ALLOWED) { ! 201: * dim_state = PENDING; ! 202: * alarm(60); ! 203: * delay = 90; ! 204: * } else if ((dim_state == PENDING) && (--delay == 0)) { ! 205: * dim_state = dim(); ! 206: * alarm(60); ! 207: * } ! 208: */ ! 209: wait(perm); ! 210: if (P->state&RESHAPED) { ! 211: c = reshape(); ! 212: if (c == OUTMODED) ! 213: break; ! 214: } ! 215: if (button123()) { ! 216: if button3() ! 217: continue; ! 218: else if ((c = dobuttons()) != ALLOWED) ! 219: break; ! 220: } ! 221: if (P->state&KBD) { ! 222: c = kbdchar(); ! 223: /* ! 224: * if (c == 0xB2) { ! 225: * addmagic(ESC); ! 226: * addmagic(FF); ! 227: * } else ! 228: */ ! 229: if (dispmode == GIN) { ! 230: if (kbdmode == REMOTE) { ! 231: /*sendchar(c);*/ ! 232: reportcursor(c, tekhairs); ! 233: dispmode = ALPHA; ! 234: c = OUTMODED; ! 235: break; ! 236: } /* else ! 237: throw character away; */ ! 238: } else { ! 239: if (kbdmode == LOCAL) ! 240: break; ! 241: if (c == DC3) { ! 242: perm &= ~RCV; ! 243: xoff = 1; ! 244: } else { ! 245: if (xoff) { ! 246: xoff = 0; ! 247: perm |= RCV; ! 248: if (c != DC1) ! 249: sendchar(c); ! 250: } else ! 251: sendchar(c); ! 252: } ! 253: } ! 254: } ! 255: if ((c = magicchar()) != -1) ! 256: break; ! 257: if ((perm&RCV) && P->state&RCV) { ! 258: c = rcvchar(); ! 259: if (kbdmode != LOCAL) ! 260: break; ! 261: } ! 262: } ! 263: /* if (flash_state == FLASHED) ! 264: * unflash(); ! 265: */ ! 266: if (dim_state == DIMMED) ! 267: undim(); ! 268: return c; ! 269: } ! 270: ! 271: int dim() { ! 272: texture(&display,jerqrect,&grey,F_XOR); ! 273: return DIMMED; ! 274: } ! 275: ! 276: undim() { ! 277: texture(&display,jerqrect,&grey,F_XOR); ! 278: } ! 279: ! 280: int magicchar() { ! 281: if (magicbot < magictop) ! 282: return *magicbot++; ! 283: magicbot = magictop = magicbase; ! 284: return -1; ! 285: } ! 286: ! 287: addmagic(c) ! 288: char c; ! 289: { ! 290: *magictop++ = c; ! 291: } ! 292: ! 293: clearmagic() ! 294: { ! 295: magicbot = magictop = magicbase; ! 296: } ! 297: ! 298: Point jerqtotek(p) ! 299: Point p; ! 300: { ! 301: Point q; ! 302: ! 303: q.x = muldiv(p.x - jerqorigin.x,TEKXMAX,jerqsize.x); ! 304: q.y = TEKYMAX - muldiv(p.y - jerqorigin.y,TEKYMAX,jerqsize.y); ! 305: if (q.x < 0) ! 306: q.x = 0; ! 307: if (q.x >= TEKXMAX) ! 308: q.x = TEKXMAX-1; ! 309: if (q.y < 0) ! 310: q.y = 0; ! 311: if (q.y >= TEKYMAX) ! 312: q.y = TEKYMAX-1; ! 313: return q; ! 314: } ! 315: ! 316: static int *xtab, *ytab; ! 317: ! 318: maketable() ! 319: { ! 320: int x, y, *p; ! 321: for (x=0, p=xtab; x<TEKXMAX; x++) ! 322: *p++ = jerqorigin.x + muldiv(x,jerqsize.x,TEKXMAX); ! 323: for (y=0, p=ytab; y<TEKYMAX; y++) ! 324: *p++ = jerqorigin.y + muldiv(TEKYMAX-y,jerqsize.y,TEKYMAX); ! 325: } ! 326: ! 327: Point tektojerq(p) ! 328: Point p; ! 329: { ! 330: Point q; ! 331: ! 332: q.x = xtab[p.x]; ! 333: q.y = ytab[p.y]; ! 334: return q; ! 335: } ! 336: ! 337: reportcursor(c, p) ! 338: Point p; ! 339: { ! 340: static char buf[]={' ',' ',' ',' ',' ',CR,EOT}; ! 341: ! 342: buf[0] = c; ! 343: buf[1] = 040 | (p.x>>7); ! 344: buf[2] = 040 | ((p.x>>2)&037); ! 345: buf[3] = 040 | (p.y>>7); ! 346: buf[4] = 040 | ((p.y>>2)&037); ! 347: if (c) ! 348: sendnchars(GINcount+1,buf); ! 349: else ! 350: sendnchars(GINcount,buf+1); ! 351: } ! 352: ! 353: int reshape() { ! 354: int omode; ! 355: P->state &= ~RESHAPED; ! 356: jerqorigin = add(display.rect.origin,Pt(5,7)); ! 357: jerqsize = sub(sub(display.rect.corner,Pt(5,7)), jerqorigin); ! 358: jerqrect = inset(display.rect,3); ! 359: maketable(); ! 360: jerqcursor = tektojerq(tekcursor); ! 361: jerqhairs = tektojerq(tekhairs); ! 362: omode = dispmode; ! 363: clearscreen(); ! 364: if (omode == GIN) ! 365: hairs(jerqhairs); ! 366: addmagic(ESC); ! 367: addmagic(FF); ! 368: return OUTMODED; ! 369: } ! 370: ! 371: hairs(p) ! 372: Point p; ! 373: { ! 374: texture(&display,Rect(0,p.y,Drect.corner.x,p.y+1),&hdots,F_XOR); ! 375: texture(&display,Rect(p.x,0,p.x+1,Drect.corner.y),&vdots,F_XOR); ! 376: } ! 377: ! 378: dofontmenu() { ! 379: Cursor *old; ! 380: int which, oldfont; ! 381: static char *whichmagic = "89:;"; ! 382: if (lockfont) { ! 383: switchtext[3] = "font"; ! 384: lockfont = 0; ! 385: return; ! 386: } ! 387: old = cursswitch(&menu2); ! 388: while (!button123()) ! 389: wait(MOUSE); ! 390: if (button13()) { ! 391: cursswitch(old); ! 392: return; ! 393: } ! 394: if (aplmode) ! 395: fonttext[1] = "ascii "; ! 396: else ! 397: fonttext[1] = "apl "; ! 398: oldfont = currfont - aplmode + 2; ! 399: fonttext[oldfont][0] = '>'; ! 400: cursswitch((Texture *)0); ! 401: switch(which = menuhit(&fontmenu,2)) { ! 402: case 0: ! 403: lockfont = 1; ! 404: switchtext[3] = "unlock font"; ! 405: break; ! 406: case 2: ! 407: case 3: ! 408: case 4: ! 409: case 5: ! 410: addmagic(ESC); ! 411: addmagic(whichmagic[which-2]); ! 412: break; ! 413: case 1: ! 414: addmagic(ESC); ! 415: if (aplmode) ! 416: addmagic(SI); ! 417: else ! 418: addmagic(SO); ! 419: break; ! 420: } ! 421: fonttext[oldfont][0] = ' '; ! 422: cursswitch(old); ! 423: } ! 424: ! 425: int dobuttons() { ! 426: /* returns ALLOWED if waitforchar should continue; else char to return */ ! 427: Cursor *old; ! 428: Point p; ! 429: if (button1() && (dispmode == GIN) &&(flash_state == DISALLOWED)) { ! 430: old = cursswitch(&none); ! 431: while (button1()) { ! 432: p = mouse.xy; ! 433: if ((!eqpt(p,jerqhairs)) && ptinrect(p,jerqrect)) { ! 434: hairs(jerqhairs); ! 435: jerqhairs = p; ! 436: tekhairs = jerqtotek(jerqhairs); ! 437: hairs(jerqhairs); ! 438: } ! 439: wait(MOUSE); ! 440: } ! 441: cursswitch(old); ! 442: return ALLOWED; ! 443: } ! 444: if (button2()) { ! 445: if (dim_state == DIMMED) { ! 446: switchtext[7] = "shift"; ! 447: switchtext[8] = "exit"; ! 448: switchtext[9] = NULL; ! 449: } else { ! 450: switchtext[7] = "exit"; ! 451: switchtext[8] = NULL; ! 452: } ! 453: switch(menuhit(&switchmenu,2)) { ! 454: case 0: ! 455: if (kbdmode == REMOTE) { ! 456: switchtext[0] = "line"; ! 457: kbdmode = LOCAL; ! 458: } else { ! 459: switchtext[0] = "local"; ! 460: kbdmode = REMOTE; ! 461: } ! 462: return ALLOWED; ! 463: case 1: ! 464: addmagic(ESC); ! 465: addmagic(FF); ! 466: return ALLOWED; ! 467: case 2: ! 468: dispmode = RESET; ! 469: return OUTMODED; ! 470: case 3: ! 471: dofontmenu(); ! 472: return ALLOWED; ! 473: case 4: ! 474: if (flashmode) { ! 475: switchtext[4] = "flash"; ! 476: flashmode = 0; ! 477: } else { ! 478: switchtext[4] = "no flash"; ! 479: flashmode = 1; ! 480: } ! 481: return ALLOWED; ! 482: case 5: ! 483: if (dithermode) { ! 484: switchtext[5] = "dither"; ! 485: dithermode = 0; ! 486: } else { ! 487: switchtext[5] = "random"; ! 488: dithermode = 1; ! 489: } ! 490: return ALLOWED; ! 491: case 6: if (smear) { ! 492: switchtext[6] = "smear"; ! 493: smear = 0; ! 494: } else { ! 495: switchtext[6] = "focus"; ! 496: smear = 1; ! 497: } ! 498: return ALLOWED; ! 499: case 7: ! 500: if (dim_state == DIMMED) ! 501: return DISALLOWED; ! 502: /* else fall through */ ! 503: case 8: ! 504: old = cursswitch(&sunset); ! 505: while (!button123()) ! 506: wait(MOUSE); ! 507: while (button3()) ! 508: wait(MOUSE); ! 509: cursswitch(old); ! 510: if (button12()) { ! 511: while (button123()) ! 512: wait(MOUSE); ! 513: return ALLOWED; ! 514: } ! 515: dispmode = EXIT; ! 516: return OUTMODED; ! 517: } ! 518: } ! 519: return ALLOWED; ! 520: } ! 521: ! 522: statemachine() ! 523: { ! 524: for(dispmode = RESET; dispmode != EXIT; ) { ! 525: switch(dispmode) { ! 526: case RESET: ! 527: resetmode(); ! 528: break; ! 529: case ALPHA: ! 530: alphamode(); ! 531: break; ! 532: case GIN: ! 533: ginmode(); ! 534: break; ! 535: case GRAPH: ! 536: case POINT: ! 537: graphmode(); ! 538: break; ! 539: case SPECIALPOINT: ! 540: specialpointmode(); ! 541: break; ! 542: case INCREMENTAL: ! 543: incrementalmode(); ! 544: break; ! 545: } ! 546: } ! 547: } ! 548: ! 549: resetmode() { ! 550: intensity = 100; ! 551: if (!lockfont) { ! 552: currfont = 0; ! 553: aplmode = 0; ! 554: defont = *font[currfont]; ! 555: #ifdef X11 ! 556: XSetFont(dpy, gc, defont.fid); ! 557: #endif X11 ! 558: } ! 559: homecursor(); ! 560: dispmode = ALPHA; ! 561: zaxis = NORMAL; ! 562: linestyle = styles[0]; ! 563: /* flash_state = ALLOWED; */ ! 564: /*flashmode = 0;*/ ! 565: } ! 566: ! 567: int controlchar(c) ! 568: int c; ! 569: { ! 570: if (c == OUTMODED) ! 571: return; ! 572: switch(c) { ! 573: case BEL: ! 574: ringbell(); ! 575: bypass = 0; ! 576: return 0; ! 577: case BS: ! 578: case HT: ! 579: case VT: ! 580: bypass = 0; ! 581: if (dispmode == ALPHA) ! 582: return c; ! 583: return 0; ! 584: case CR: ! 585: if (dispmode == ALPHA) { ! 586: if (CReffect) ! 587: addmagic(NL); ! 588: return c; ! 589: } ! 590: dispmode = ALPHA; ! 591: bypass = 0; ! 592: addmagic(c); ! 593: if (CReffect) ! 594: addmagic(NL); ! 595: return OUTMODED; ! 596: case FS: ! 597: if ((dispmode == ALPHA) || (dispmode == GRAPH)) { ! 598: dispmode = POINT; ! 599: return OUTMODED; ! 600: } ! 601: return 0; ! 602: case GS: ! 603: if ((dispmode == ALPHA) || (dispmode == GRAPH)) { ! 604: dispmode = GRAPH; ! 605: drawallowed = 0; ! 606: return OUTMODED; ! 607: } ! 608: return 0; ! 609: case NL: ! 610: if (LFeffect) ! 611: addmagic(CR); ! 612: if (dispmode == ALPHA) ! 613: return c; ! 614: return 0; ! 615: case RS: ! 616: if (dispmode != GIN) { ! 617: dispmode = INCREMENTAL; ! 618: penstate = 0; ! 619: return OUTMODED; ! 620: } ! 621: return 0; ! 622: case US: ! 623: if (dispmode == ALPHA) ! 624: return 0; ! 625: dispmode = ALPHA; ! 626: bypass = 0; ! 627: return OUTMODED; ! 628: case ESC: ! 629: return escmode(); ! 630: default: ! 631: if (c < 040) ! 632: return 0; ! 633: return c; ! 634: } ! 635: } ! 636: ! 637: int escmode() { ! 638: int c,ignore; ! 639: ! 640: do { ! 641: c = waitforchar(); ! 642: ignore = 0; ! 643: switch(c) { ! 644: case CAN: ! 645: bypass = 1; ! 646: return 0; ! 647: case OUTMODED: ! 648: case CR: ! 649: ignore = 1; ! 650: break; ! 651: case ENQ: ! 652: bypass = 1; ! 653: if (dispmode != GIN) { ! 654: /*sendchar(status());*/ ! 655: reportcursor(status(), tekcursor); ! 656: return 0; ! 657: } ! 658: reportcursor(0, tekhairs); ! 659: dispmode = ALPHA; ! 660: return OUTMODED; ! 661: case ETB: ! 662: /* Hard copy */ ! 663: bypass = 0; ! 664: return 0; ! 665: case FF: ! 666: clearscreen(); ! 667: homecursor(); ! 668: bypass = 0; ! 669: dispmode = ALPHA; ! 670: return OUTMODED; ! 671: case FS: ! 672: if ((dispmode == INCREMENTAL) || ( dispmode == GIN)) ! 673: return 0; ! 674: dispmode = SPECIALPOINT; ! 675: return OUTMODED; ! 676: case SI: ! 677: ! 678: if (aplmode && !lockfont) { ! 679: currfont -= aplmode; ! 680: aplmode = 0; ! 681: goto outfont; ! 682: } ! 683: return 0; ! 684: case SO: ! 685: if (!aplmode && !lockfont) { ! 686: aplmode = 4; ! 687: currfont += aplmode; ! 688: goto outfont; ! 689: } ! 690: return 0; ! 691: case SUB: ! 692: dispmode = GIN; ! 693: bypass = 1; ! 694: return OUTMODED; ! 695: case '8': ! 696: if (!lockfont) { ! 697: currfont = 0 + aplmode; ! 698: goto outfont; ! 699: } ! 700: return 0; ! 701: case '9': ! 702: if (!lockfont) { ! 703: currfont = 1 + aplmode; ! 704: goto outfont; ! 705: } ! 706: return 0; ! 707: case ':': ! 708: if (!lockfont) { ! 709: currfont = 2 + aplmode; ! 710: goto outfont; ! 711: } ! 712: return 0; ! 713: case ';': ! 714: if (!lockfont) { ! 715: currfont = 3 + aplmode; ! 716: outfont: ! 717: defont = *font[currfont]; ! 718: #ifdef X11 ! 719: XSetFont(dpy, gc, defont.fid); ! 720: #endif X11 ! 721: } ! 722: return 0; ! 723: default: ! 724: if ((c=='?') && (DELimpliesLOY)) ! 725: return DEL; ! 726: if ((c<'`')||(c>'w')) ! 727: break; ! 728: c -= '`'; ! 729: if (((c + 1) & 7) >= 6) ! 730: break; ! 731: zaxis = c / 8; ! 732: /* zaxis = 0 ==> Normal ! 733: * = 1 ==> Defocused ! 734: * = 2 ==> Write-through ! 735: */ ! 736: if ((c + 1) & 7) ! 737: linestyle = styles[c & 7]; ! 738: /* = 0 ==> solid ! 739: * = 1 ==> dotted ! 740: * = 2 ==> dot-dash ! 741: * = 3 ==> short-dash ! 742: * = 4 ==> long-dash ! 743: */ ! 744: return 0; ! 745: } ! 746: } while (ignore); ! 747: return 0; ! 748: } ! 749: ! 750: ginmode() { ! 751: int c; ! 752: hairs(jerqhairs); ! 753: c = waitforchar(); ! 754: hairs(jerqhairs); ! 755: c = controlchar(c); ! 756: } ! 757: ! 758: specialpointmode() { ! 759: int c; ! 760: static char intents[] = { ! 761: 14, 16, 17, 19, 20, 22, 23, 25, 28, 31, 34, 38, 41, 44, 47, 50, ! 762: /* SP , ! , " , # , $ , % , & , ' , ( , ) , * , + , , , - , . , / , */ ! 763: 56, 62, 69, 75, 81, 88, 94,100, 56, 62, 69, 75, 81, 88, 94,100, ! 764: /* 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , : , ; , < , = , > , ? , */ ! 765: 0, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, ! 766: /* @ , A , B , C , D , E , F , G , H , I , J , K , L , M , N , O , */ ! 767: 4, 4, 4, 5, 5, 5, 6, 6, 7, 8, 9, 10, 11, 12, 12, 13, ! 768: /* P , Q , R , S , T , U , V , W , X , Y , Z , [ , \ , ] , ^ , _ , */ ! 769: 14, 16, 17, 19, 20, 22, 23, 25, 28, 31, 34, 38, 41, 44, 47, 50, ! 770: /* ` , a , b , c , d , e , f , g , h , i , j , k , l , m , n , o , */ ! 771: 56, 62, 69, 75, 81, 88, 94,100, 56, 62, 69, 75, 81, 88, 94,100, ! 772: /* p , q , r , s , t , u , v , w , x , y , z , { , | , } , ~ ,DEL, */ ! 773: }; ! 774: ! 775: if (((c = waitforchar()) < 040) || (c >= '~')) { ! 776: c = controlchar(c); ! 777: return; ! 778: } ! 779: intensity = intents[c-' ']; ! 780: intensity = muldiv(intensity, 200-intensity, 100); ! 781: graphmode(); ! 782: } ! 783: ! 784: intent(p) ! 785: Point p; ! 786: { ! 787: int i,j,cnt=0; ! 788: for (i=0;i<=smear;i++) ! 789: for (j=0;j<=smear;j++) ! 790: if (dithermode) { ! 791: if ( (16*16*intensity) > ! 792: (100*dither[(p.y+i)%16][(p.x+j)%16]) ) ! 793: cnt++; ! 794: } else { ! 795: if (intensity > (rand()%100)) ! 796: cnt++; ! 797: } ! 798: return cnt; ! 799: } ! 800: ! 801: graphmode() { ! 802: register b,c; ! 803: static Point ojcurs; ! 804: static hix, hiy, lox, loy, extra; ! 805: register int numdots; ! 806: ! 807: if ((c = waitforchar()) < 040) { ! 808: c = controlchar(c); ! 809: return; ! 810: } ! 811: if ((c & 0140) == 040) { /* new hiy */ ! 812: hiy = c & 037; ! 813: do ! 814: if (((c = waitforchar()) < 040) && ! 815: ((c = controlchar(c)) == OUTMODED)) ! 816: return; ! 817: while (c == 0); ! 818: } ! 819: if ((c & 0140) == 0140) { /* new loy */ ! 820: b = c & 037; ! 821: do ! 822: if (((c = waitforchar()) < 040) && ! 823: ((c = controlchar(c)) == OUTMODED)) ! 824: return; ! 825: while (c == 0); ! 826: if ((c & 0140) == 0140) { /* no, it was extra */ ! 827: extra = b; ! 828: loy = c & 037; ! 829: do ! 830: if (((c = waitforchar()) < 040) && ! 831: ((c = controlchar(c)) == OUTMODED)) ! 832: return; ! 833: while (c == 0); ! 834: } ! 835: else ! 836: loy = b; ! 837: } ! 838: if ((c & 0140) == 040) { /* new hix */ ! 839: hix = c & 037; ! 840: do ! 841: if (((c = waitforchar()) < 040) && ! 842: ((c = controlchar(c)) == OUTMODED)) ! 843: return; ! 844: while (c == 0); ! 845: } ! 846: lox = c & 037; /* this should be lox */ ! 847: if (extra & 020) ! 848: tekmargin = TEKXMAX/2; ! 849: tekcursor.x = (hix<<7) | (lox<<2) | (extra & 03); ! 850: tekcursor.y = (hiy<<7) | (loy<<2) | ((extra & 014)>>2); ! 851: jerqcursor = tektojerq(tekcursor); ! 852: if (dispmode == GRAPH) { ! 853: if (drawallowed) { ! 854: if (zaxis != WRITETHRU) { ! 855: dsegment(&display,ojcurs,jerqcursor, ! 856: F_DRAW, linestyle); ! 857: point(&display,jerqcursor,F_DRAW); ! 858: } ! 859: saveline(ojcurs,jerqcursor,linestyle); ! 860: } ! 861: } else { ! 862: if ((numdots = intent(tekcursor)) >= 4) ! 863: point(&display,sub(jerqcursor,Pt(0,1)),F_DRAW); ! 864: if (numdots >= 3) ! 865: point(&display,sub(jerqcursor,Pt(1,0)),F_DRAW); ! 866: if (numdots >= 2) ! 867: point(&display,sub(jerqcursor,Pt(1,1)),F_DRAW); ! 868: if (numdots >= 1) ! 869: point(&display,jerqcursor,F_DRAW); ! 870: savepoint(jerqcursor); ! 871: } ! 872: ojcurs = jerqcursor; ! 873: drawallowed = 1; ! 874: } ! 875: ! 876: incrementalmode() { ! 877: int c; ! 878: register int numdots; ! 879: ! 880: if ((c = waitforchar()) == OUTMODED) ! 881: return; ! 882: if ((c < 040) && ((c = controlchar(c)) <= 0)) ! 883: return; ! 884: if (c&040) ! 885: penstate = 0; ! 886: if (c&020) ! 887: penstate = 1; ! 888: if (c&04) ! 889: tekcursor.y++; ! 890: if (c&010) ! 891: tekcursor.y--; ! 892: if (c&01) ! 893: tekcursor.x++; ! 894: if (c&02) ! 895: tekcursor.x--; ! 896: jerqcursor = tektojerq(tekcursor); ! 897: if (penstate == 0) ! 898: return; ! 899: if ((numdots = intent(tekcursor)) >= 4) ! 900: point(&display,sub(jerqcursor,Pt(0,1)),F_DRAW); ! 901: if (numdots >= 3) ! 902: point(&display,sub(jerqcursor,Pt(1,0)),F_DRAW); ! 903: if (numdots >= 2) ! 904: point(&display,sub(jerqcursor,Pt(1,1)),F_DRAW); ! 905: if (numdots >= 1) ! 906: point(&display,jerqcursor,F_DRAW); ! 907: savepoint(jerqcursor); ! 908: } ! 909: ! 910: alphamode() { ! 911: int c; ! 912: ! 913: c = waitforchar(); ! 914: if (c == OUTMODED) ! 915: return; ! 916: if ((c < 040) && ((c = controlchar(c)) <= 0)) ! 917: return; ! 918: if (bypass) ! 919: return; ! 920: switch(c) { ! 921: case DEL: ! 922: /* ignore */ ! 923: return; ! 924: case BS: ! 925: if ((tekcursor.x -= width[currfont]) < tekmargin) ! 926: tekcursor.x = TEKXMAX - width[currfont]; ! 927: break; ! 928: case NL: ! 929: tekcursor.y -= height[currfont]; ! 930: break; ! 931: case CR: ! 932: tekcursor.x = tekmargin; ! 933: break; ! 934: case HT: ! 935: tekcursor.x += width[currfont]; ! 936: break; ! 937: case VT: ! 938: if ((tekcursor.y += height[currfont]) >= TEKYMAX) ! 939: tekcursor.y = 0; ! 940: break; ! 941: case ' ': ! 942: tekcursor.x += width[currfont]; ! 943: break; ! 944: default: ! 945: if (c <= ' ') ! 946: return; ! 947: if (zaxis != WRITETHRU) ! 948: drawchar(currfont,c,jerqcursor,F_DRAW); ! 949: savechar(currfont,c,jerqcursor); ! 950: tekcursor.x += width[currfont]; ! 951: break; ! 952: } ! 953: if (tekcursor.x >= TEKXMAX) { ! 954: tekcursor.x = tekmargin; ! 955: tekcursor.y -= height[currfont]; ! 956: } ! 957: if (tekcursor.y < 0) { ! 958: tekcursor.y = TEKYMAX - height[currfont]; ! 959: tekcursor.x -= tekmargin; ! 960: tekmargin = (TEKXMAX/2) - tekmargin; ! 961: if ((tekcursor.x += tekmargin) > TEKXMAX) ! 962: tekcursor.x -= tekmargin; ! 963: } ! 964: jerqcursor = tektojerq(tekcursor); ! 965: } ! 966: ! 967: drawchar(f,c,p,m) ! 968: int f,m; ! 969: Point p; ! 970: char c; ! 971: { ! 972: static char s[2]; ! 973: ! 974: s[0] = c; ! 975: string(font[f], s , &display, ! 976: #ifdef X11 ! 977: Pt(p.x,p.y-font[f]->max_bounds.ascent), m); ! 978: #endif X11 ! 979: #ifdef SUNTOOLS ! 980: Pt(p.x,p.y+(*font[f])->pf_char[0].pc_home.y), m); ! 981: #endif SUNTOOLS ! 982: ! 983: } ! 984: ! 985: clearscreen(){ ! 986: savereset(); ! 987: flash_state = DISALLOWED; ! 988: dim_state = DISALLOWED; ! 989: rectf(&display,Drect,F_CLR); ! 990: homecursor(); ! 991: } ! 992: ! 993: homecursor(){ ! 994: bypass = 0; ! 995: tekcursor.x = 0; ! 996: tekcursor.y = TEKYMAX - height[currfont]; ! 997: jerqcursor = tektojerq(tekcursor); ! 998: tekmargin = 0; ! 999: } ! 1000: ! 1001: int status(){ ! 1002: int s; ! 1003: s = 33; ! 1004: if (dispmode == GRAPH) ! 1005: s |= 8; ! 1006: if (dispmode == ALPHA) ! 1007: s |= 4; ! 1008: if (tekmargin) ! 1009: s |= 2; ! 1010: return s; ! 1011: } ! 1012: ! 1013: errorabort(s) ! 1014: char *s; { ! 1015: sendnchars(strlen(s),s); ! 1016: sleep(5); ! 1017: exit(); ! 1018: } ! 1019: ! 1020: main(argc,argv) ! 1021: int argc; ! 1022: char *argv[]; ! 1023: { ! 1024: char *s; ! 1025: Font savedefont; ! 1026: extern int childid; ! 1027: static Font sfonts[8]; ! 1028: ! 1029: kbdmode = REMOTE; ! 1030: startshell(); ! 1031: initdisplay(argc, argv); ! 1032: initcursors(); ! 1033: savedefont = defont; ! 1034: #ifdef X11 ! 1035: font[0] = XLoadQueryFont(dpy, "9x15"); ! 1036: font[1] = &savedefont; ! 1037: font[2] = XLoadQueryFont(dpy, "6x12"); ! 1038: font[3] = XLoadQueryFont(dpy, "6x10"); ! 1039: #endif X11 ! 1040: #ifdef SUNTOOLS ! 1041: sfonts[0] = pf_open("/usr/lib/fonts/tekfonts/tekfont0"); ! 1042: sfonts[1] = pf_open("/usr/lib/fonts/tekfonts/tekfont1"); ! 1043: sfonts[2] = pf_open("/usr/lib/fonts/tekfonts/tekfont2"); ! 1044: sfonts[3] = pf_open("/usr/lib/fonts/tekfonts/tekfont3"); ! 1045: font[0] = &sfonts[0]; ! 1046: font[1] = &sfonts[1]; ! 1047: font[2] = &sfonts[2]; ! 1048: font[3] = &sfonts[3]; ! 1049: #endif SUNTOOLS ! 1050: font[4] = font[0]; ! 1051: font[5] = font[1]; ! 1052: font[6] = font[2]; ! 1053: font[7] = font[3]; ! 1054: xtab = (int *)alloc(TEKXMAX*sizeof(int)); ! 1055: ytab = (int *)alloc(TEKYMAX*sizeof(int)); ! 1056: dithermode = 1; ! 1057: smear = 1; ! 1058: lockfont = 0; ! 1059: tekhairs.x = TEKXMAX/2; ! 1060: tekhairs.y = TEKYMAX/2; ! 1061: while (--argc) ! 1062: if ((s = argv[argc]) && (*s) && (*s++ == '-')) ! 1063: while (*s) ! 1064: switch(*s++) { ! 1065: case 'd': ! 1066: DELimpliesLOY = 1; ! 1067: break; ! 1068: case 'l': ! 1069: LFeffect = 1; ! 1070: CReffect = 0; ! 1071: break; ! 1072: case 'c': ! 1073: CReffect = 1; ! 1074: LFeffect = 0; ! 1075: break; ! 1076: case 'g': ! 1077: GINcount = 4; ! 1078: break; ! 1079: case 'e': ! 1080: GINcount = 6; ! 1081: break; ! 1082: case 'u': ! 1083: DIMallowed = DISALLOWED; ! 1084: break; ! 1085: } ! 1086: DIMallowed = DISALLOWED; ! 1087: F_DRAW = F_OR; ! 1088: statemachine(); ! 1089: sendchar(NL); ! 1090: kill(childid, SIGHUP); ! 1091: } ! 1092: ! 1093: initcursors() ! 1094: { ! 1095: menu2 = ToCursor(menu2_bits, menu2_bits, 7, 7); ! 1096: sunset = ToCursor(sunset_bits, sunset_bits, 7, 7); ! 1097: none = ToCursor(none_bits, none_bits, 7, 7); ! 1098: vdots = ToTexture(vdots_bits); ! 1099: hdots = ToTexture(hdots_bits); ! 1100: grey = ToTexture(grey_bits); ! 1101: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.