1*16363Skarels #ifndef lint 2*16363Skarels static char sccsid[] = "@(#)display.c 1.2 (Berkeley) 04/11/84"; 3*16363Skarels #endif 416346Skarels 5*16363Skarels /* 6*16363Skarels * The window 'manager', initializes curses and handles the actual 716346Skarels * displaying of text 816346Skarels */ 916346Skarels #include "talk.h" 1016346Skarels 11*16363Skarels xwin_t my_win; 12*16363Skarels xwin_t his_win; 13*16363Skarels WINDOW *line_win; 1416346Skarels 15*16363Skarels int curses_initialized = 0; 1616346Skarels 17*16363Skarels /* 18*16363Skarels * max HAS to be a function, it is called with 19*16363Skarels * a argument of the form --foo at least once. 20*16363Skarels */ 2116346Skarels max(a,b) 22*16363Skarels int a, b; 2316346Skarels { 24*16363Skarels 25*16363Skarels return (a > b ? a : b); 2616346Skarels } 2716346Skarels 2816346Skarels /* 2916346Skarels * Display some text on somebody's window, processing some control 3016346Skarels * characters while we are at it. 3116346Skarels */ 3216346Skarels display(win, text, size) 33*16363Skarels register xwin_t *win; 34*16363Skarels register char *text; 35*16363Skarels int size; 3616346Skarels { 37*16363Skarels register int i; 38*16363Skarels char cch; 3916346Skarels 40*16363Skarels for (i = 0; i < size; i++) { 41*16363Skarels if (*text == '\n') { 42*16363Skarels xscroll(win, 0); 43*16363Skarels text++; 44*16363Skarels continue; 45*16363Skarels } 46*16363Skarels /* erase character */ 47*16363Skarels if (*text == win->cerase) { 48*16363Skarels wmove(win->x_win, win->x_line, max(--win->x_col, 0)); 49*16363Skarels getyx(win->x_win, win->x_line, win->x_col); 50*16363Skarels waddch(win->x_win, ' '); 51*16363Skarels wmove(win->x_win, win->x_line, win->x_col); 52*16363Skarels getyx(win->x_win, win->x_line, win->x_col); 53*16363Skarels text++; 54*16363Skarels continue; 55*16363Skarels } 56*16363Skarels /* 57*16363Skarels * On word erase search backwards until we find 58*16363Skarels * the beginning of a word or the beginning of 59*16363Skarels * the line. 60*16363Skarels */ 61*16363Skarels if (*text == win->werase) { 62*16363Skarels int endcol, xcol, i, c; 6316346Skarels 64*16363Skarels endcol = win->x_col; 65*16363Skarels xcol = endcol - 1; 66*16363Skarels while (xcol >= 0) { 67*16363Skarels c = readwin(win->x_win, win->x_line, xcol); 68*16363Skarels if (c != ' ') 69*16363Skarels break; 70*16363Skarels xcol--; 71*16363Skarels } 72*16363Skarels while (xcol >= 0) { 73*16363Skarels c = readwin(win->x_win, win->x_line, xcol); 74*16363Skarels if (c == ' ') 75*16363Skarels break; 76*16363Skarels xcol--; 77*16363Skarels } 78*16363Skarels wmove(win->x_win, win->x_line, xcol + 1); 79*16363Skarels for (i = xcol + 1; i < endcol; i++) 80*16363Skarels waddch(win->x_win, ' '); 81*16363Skarels wmove(win->x_win, win->x_line, xcol + 1); 82*16363Skarels getyx(win->x_win, win->x_line, win->x_col); 83*16363Skarels continue; 84*16363Skarels } 85*16363Skarels /* line kill */ 86*16363Skarels if (*text == win->kill) { 87*16363Skarels wmove(win->x_win, win->x_line, 0); 88*16363Skarels wclrtoeol(win->x_win); 89*16363Skarels getyx(win->x_win, win->x_line, win->x_col); 90*16363Skarels text++; 91*16363Skarels continue; 92*16363Skarels } 93*16363Skarels if (*text == '\f') { 94*16363Skarels if (win == &my_win) 95*16363Skarels wrefresh(curscr); 96*16363Skarels text++; 97*16363Skarels continue; 98*16363Skarels } 99*16363Skarels if (win->x_col == COLS-1) { 100*16363Skarels /* check for wraparound */ 101*16363Skarels xscroll(win, 0); 102*16363Skarels } 103*16363Skarels if (*text < ' ' && *text != '\t') { 104*16363Skarels waddch(win->x_win, '^'); 105*16363Skarels getyx(win->x_win, win->x_line, win->x_col); 106*16363Skarels if (win->x_col == COLS-1) /* check for wraparound */ 107*16363Skarels xscroll(win, 0); 108*16363Skarels cch = (*text & 63) + 64; 109*16363Skarels waddch(win->x_win, cch); 110*16363Skarels } else 111*16363Skarels waddch(win->x_win, *text); 112*16363Skarels getyx(win->x_win, win->x_line, win->x_col); 113*16363Skarels text++; 11416346Skarels } 115*16363Skarels wrefresh(win->x_win); 11616346Skarels } 11716346Skarels 11816346Skarels /* 119*16363Skarels * Read the character at the indicated position in win 120*16363Skarels */ 12116346Skarels readwin(win, line, col) 122*16363Skarels WINDOW *win; 12316346Skarels { 124*16363Skarels int oldline, oldcol; 125*16363Skarels register int c; 12616346Skarels 127*16363Skarels getyx(win, oldline, oldcol); 128*16363Skarels wmove(win, line, col); 129*16363Skarels c = winch(win); 130*16363Skarels wmove(win, oldline, oldcol); 131*16363Skarels return (c); 13216346Skarels } 13316346Skarels 13416346Skarels /* 135*16363Skarels * Scroll a window, blanking out the line following the current line 136*16363Skarels * so that the current position is obvious 137*16363Skarels */ 13816346Skarels xscroll(win, flag) 139*16363Skarels register xwin_t *win; 140*16363Skarels int flag; 14116346Skarels { 142*16363Skarels 143*16363Skarels if (flag == -1) { 144*16363Skarels wmove(win->x_win, 0, 0); 145*16363Skarels win->x_line = 0; 146*16363Skarels win->x_col = 0; 147*16363Skarels return; 148*16363Skarels } 149*16363Skarels win->x_line = (win->x_line + 1) % win->x_nlines; 15016346Skarels win->x_col = 0; 151*16363Skarels wmove(win->x_win, win->x_line, win->x_col); 152*16363Skarels wclrtoeol(win->x_win); 153*16363Skarels wmove(win->x_win, (win->x_line + 1) % win->x_nlines, win->x_col); 154*16363Skarels wclrtoeol(win->x_win); 155*16363Skarels wmove(win->x_win, win->x_line, win->x_col); 15616346Skarels } 157