|
|
1.1 ! root 1: #include <stdio.h> ! 2: #include <sgtty.h> ! 3: #include "/usr/jerq/include/jioctl.h" ! 4: #include "jerq.h" ! 5: #include "io.h" ! 6: #include "balloc.h" ! 7: #include "commands.h" ! 8: ! 9: extern int lookUpFont(); ! 10: extern Font *fntab[]; ! 11: extern Font *loadFont(); ! 12: ! 13: Rectangle Jrect, Drect; ! 14: int Jin, Jout; ! 15: ! 16: #define mouseQsize 20 ! 17: Mouse mouseQ[mouseQsize]; ! 18: int Qnum = 0; ! 19: int lookMouse = 0; nextMouse = 0; ! 20: ! 21: struct sgttyb ttyisave, ttyosave, ttymodes; ! 22: ! 23: int jinit() ! 24: { ! 25: if (system("32ld /usr/jerq/lib/term.m")) { ! 26: fprintf(stderr,"main: can't boot terminal program\n"); ! 27: return(0); ! 28: } ! 29: Jin = open("/dev/tty",0); ! 30: Jout = open("/dev/tty",1); ! 31: if (Jin<0 | Jout <0) { ! 32: fprintf(stderr,"couldn't open /dev/tty\n"); ! 33: return(0); ! 34: } ! 35: ioctl(Jin, TIOCGETP, &ttymodes); ! 36: ttyisave = ttymodes; ! 37: ttymodes.sg_flags |= RAW; ! 38: ttymodes.sg_flags &= ~ECHO; ! 39: ioctl(Jin, TIOCSETP, &ttymodes); ! 40: ! 41: ioctl(Jout, TIOCGETP, &ttymodes); ! 42: ttyosave = ttymodes; ! 43: ttymodes.sg_flags |= RAW; ! 44: ttymodes.sg_flags &= ~ECHO; ! 45: ioctl(Jout, TIOCSETP, &ttymodes); ! 46: ! 47: Jrect.origin.x = Jrect.origin.y = 0; ! 48: Jrect.corner.x = XMAX; Jrect.corner.y = YMAX; ! 49: Drect.origin.x = recInt(); ! 50: Drect.origin.y = recInt(); ! 51: Drect.corner.x = recInt(); ! 52: Drect.corner.y = recInt(); ! 53: BMT[0].rect = Drect; ! 54: ! 55: fntab[0] = loadFont("/usr/jerq/font/defont"); ! 56: return(1); ! 57: } ! 58: ! 59: #define BUFsize 32 ! 60: char obuf[BUFsize], ibuf[BUFsize]; ! 61: int pobuf = 0, pibuf = 0, pinum = 0; ! 62: ! 63: void flush() ! 64: { ! 65: if (pobuf>0) write(Jout,obuf,pobuf); ! 66: pobuf = 0; ! 67: } ! 68: ! 69: put(c) char c; ! 70: { ! 71: if (pobuf == BUFsize) flush(); ! 72: obuf[pobuf++] = c; ! 73: } ! 74: ! 75: char get() ! 76: { ! 77: if (pibuf==pinum) { ! 78: pinum = read(Jin,ibuf,BUFsize); ! 79: pibuf = 0; ! 80: } ! 81: return ibuf[pibuf++]; ! 82: } ! 83: ! 84: void sendChar(c) char c; ! 85: { ! 86: put(c); ! 87: } ! 88: ! 89: void sendInt(n) int n; ! 90: { ! 91: if (n<0) { ! 92: put('-'); ! 93: n = -n; ! 94: } ! 95: for ( ; n != 0; n >>= 4) put((n&15)+'A'); ! 96: put(' '); ! 97: } ! 98: ! 99: ! 100: void sendPoint(p) Point p; ! 101: { ! 102: sendInt(p.x); ! 103: sendInt(p.y); ! 104: } ! 105: ! 106: void sendRectangle(r) Rectangle r; ! 107: { ! 108: sendInt(r.origin.x); ! 109: sendInt(r.origin.y); ! 110: sendInt(r.corner.x); ! 111: sendInt(r.corner.y); ! 112: } ! 113: ! 114: void sendToBitmap(b) Bitmap *b; ! 115: { ! 116: if (b<BMT || b>BMT+BMTsize || b->jname<0) ! 117: fprintf(stderr,"inappropriate bitmap\n"); ! 118: else sendInt(b->jname); ! 119: } ! 120: ! 121: void sendToFont(f) Font *f; ! 122: { ! 123: sendInt(lookUpFont(f)); ! 124: } ! 125: ! 126: ! 127: #define TXTsize 20 ! 128: Texture *txp[TXTsize]; ! 129: Texture txtab[TXTsize]; ! 130: ! 131: void sendTexture(i,t) int i; Texture *t; ! 132: { int j; ! 133: sendInt(i); ! 134: txp[i] = t; ! 135: txtab[i] = *t; ! 136: for (j=0; j<16; j++) sendInt(t->bits[j]); ! 137: } ! 138: #define TNULL (Texture *)NULL ! 139: ! 140: void sendToTexture(t) Texture *t; ! 141: { int i, j; ! 142: if (t==TNULL) { ! 143: sendInt(-1); ! 144: sendInt(-1); ! 145: } ! 146: else { ! 147: for (i=0; i<TXTsize && txp[i]!=TNULL && txp[i]!=t; i++) ; ! 148: if (i>=TXTsize) { ! 149: fprintf(stderr,"out of space in TXTAB\n"); ! 150: exit(); ! 151: } ! 152: else if (txp[i]==TNULL) sendTexture(i,t); ! 153: else { ! 154: for (j=0; j<16 && t->bits[j]==txp[i]->bits[j]; j++) ; ! 155: if (j==16) { ! 156: sendInt(-1); ! 157: sendInt(i); ! 158: } ! 159: else sendTexture(i,t); ! 160: } ! 161: } ! 162: } ! 163: ! 164: void sendToChar(str) char *str; ! 165: { int i = 0; ! 166: do { put(str[i]); } while (str[i++] != 0); ! 167: } ! 168: ! 169: void sendToToChar(cpp) char **cpp; ! 170: { ! 171: sendToChar(*cpp); ! 172: } ! 173: ! 174: void sendUnsignedInt(n) unsigned int n; ! 175: { ! 176: for ( ; n != 0; n >>= 4) put((n&15)+'A'); ! 177: put(' '); ! 178: } ! 179: ! 180: Point recPoint() ! 181: { Point p; ! 182: p.x = recInt(); ! 183: p.y = recInt(); ! 184: return(p); ! 185: } ! 186: ! 187: Rectangle recRectangle() ! 188: { Rectangle r; ! 189: r.origin.x = recInt(); ! 190: r.origin.y = recInt(); ! 191: r.corner.x = recInt(); ! 192: r.corner.y = recInt(); ! 193: return(r); ! 194: } ! 195: ! 196: int recChar() ! 197: { int c; ! 198: return get(); ! 199: } ! 200: ! 201: int recInt() ! 202: { char c; ! 203: register n, i; ! 204: int sign = 1; ! 205: ! 206: if ((c = get()) == '-') { ! 207: sign = -1; ! 208: c = get(); ! 209: } ! 210: for (n=0, i=0; (c >= 'A' && c <= 'P'); c = get(), i+=4) ! 211: n += (c - 'A')<<i; ! 212: return (n * sign); ! 213: } ! 214: ! 215: Texture *recToTexture() ! 216: { int t; ! 217: t = recInt(); ! 218: return(&txtab[t]); ! 219: } ! 220: ! 221: void readMouse() ! 222: { int i, j; ! 223: sendCommand(CCGETMOUSE); ! 224: flush(); ! 225: Qnum = recInt(); ! 226: for (j=0; j<Qnum; j++) { ! 227: for (mouseQ[j].xy.x=0, i=0; i<4*3; i+=4) ! 228: mouseQ[j].xy.x |= (get() << i); ! 229: for (mouseQ[j].xy.y=0, i=0; i<4*3; i+=4) ! 230: mouseQ[j].xy.y |= (get() << i); ! 231: mouseQ[j].buttons = get(); ! 232: } ! 233: get(); /* dump the carriage return */ ! 234: ! 235: } ! 236: ! 237: clearMouseQ() ! 238: { ! 239: Qnum = 0; ! 240: } ! 241: ! 242: Point mousexy() ! 243: { ! 244: if (nextMouse >= Qnum) { ! 245: readMouse(); ! 246: lookMouse = nextMouse = 0; ! 247: } ! 248: lookMouse = 0; ! 249: return(mouseQ[nextMouse++].xy); ! 250: } ! 251: ! 252: int mousebuttons() ! 253: { ! 254: if (lookMouse) nextMouse++; ! 255: if (nextMouse >= Qnum) { ! 256: readMouse(); ! 257: lookMouse = nextMouse = 0; ! 258: } ! 259: lookMouse = 1; ! 260: return(mouseQ[nextMouse].buttons); ! 261: } ! 262: ! 263: int kbdbuf[50]; ! 264: int kbdp = 0; ! 265: int kbdn = 0; ! 266: ! 267: int kbdchar() ! 268: { int c; ! 269: if (kbdp >= kbdn) { ! 270: sendCommand(CCKBDCHAR); ! 271: flush(); ! 272: kbdn = kbdp = 0; ! 273: while ((c = recInt()) != -1) kbdbuf[kbdn++] = c; ! 274: } ! 275: return((kbdn == 0)? -1 : kbdbuf[kbdp++]); ! 276: } ! 277: ! 278: void jexit() ! 279: { struct sgttyb buf; ! 280: sendCommand(CCEXIT); ! 281: flush(); ! 282: ioctl(Jin, TIOCSETP, &ttyisave); ! 283: ttyosave.sg_flags &= ~RAW; ! 284: ttyosave.sg_flags |= ECHO; ! 285: ioctl(Jout, TIOCSETP, &ttyosave); ! 286: ioctl(Jout, JTERM, &ttyosave); ! 287: close(Jin); ! 288: close(Jout); ! 289: exit(); ! 290: } ! 291:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.