1: #include "hd.h" 2: #include <sgtty.h> 3: 4: /* This module controls tty options. 5: 6: Tty states are treated as a stack. Use tty_push and tty_pop. 7: 8: Push COOKEDMODE and RAWMODE onto the stack. RAWMODE is now actually 9: CBREAK mode. 10: */ 11: 12: struct sgttyb newstty, oldstty; /* sgtty structures */ 13: int ttysp; /* Sp for tty stack */ 14: extern short ospeed; /* Speed for Joy's routines */ 15: 16: #define TTYLIM 16 17: char tty_stack [TTYLIM]; /* The tty stack */ 18: 19: /* Initialize tty structures */ 20: 21: tty_init () { 22: 23: gtty (infile, &oldstty); gtty (infile, &newstty); 24: oldstty.sg_flags &= ~(CBREAK | RAW); 25: newstty.sg_flags |= CBREAK; 26: ospeed = oldstty.sg_ospeed; 27: 28: ttysp = 0; tty_set (COOKEDMODE); 29: } 30: 31: /* Push a new tty mode. Use RAWMODE and COOKEDMODE as parameters. */ 32: 33: tty_push (pmode) int pmode; { 34: ttysp++; 35: if (ttysp >= TTYLIM) { 36: putmsg ("Tty stack overflow\n"); 37: leave (); 38: } 39: tty_set (pmode); 40: } 41: 42: tty_pop () { 43: ttysp--; 44: if (ttysp < 0) { 45: putmsg ("Tty stack underflow\n"); 46: leave (); 47: } 48: tty_set (tty_stack [ttysp]); 49: } 50: 51: /* Tty_set sets the tty mode indicated by its parameter. Stty is only 52: executed if a change will result. 53: */ 54: 55: tty_set (pmode) int pmode; { 56: 57: static int curmode = -1; /* Current tty mode */ 58: 59: tty_stack [ttysp] = pmode; 60: if (pmode == curmode) return; 61: curmode = pmode; 62: if (pmode == RAWMODE) tty_raw (); 63: else tty_cooked (); 64: } 65: 66: tty_raw () { stty (infile, &newstty); } 67: 68: tty_cooked () { stty (infile, &oldstty); }