|
|
1.1 ! root 1: /* $Header: display.c 1.2 83/04/23 02:09:33 moore Exp $ */ ! 2: ! 3: /* The window 'manager', initializes curses and handles the actual ! 4: * displaying of text ! 5: */ ! 6: ! 7: #include "talk.h" ! 8: ! 9: xwin_t my_win; ! 10: xwin_t his_win; ! 11: WINDOW *line_win; ! 12: ! 13: int curses_initialized = 0; ! 14: ! 15: /* max HAS to be a function, it is called with ! 16: * a argument of the form --foo at least once. ! 17: */ ! 18: ! 19: max(a,b) ! 20: int a, b; ! 21: { ! 22: if (a > b) { ! 23: return(a); ! 24: } else { ! 25: return(b); ! 26: } ! 27: } ! 28: ! 29: /* ! 30: * Display some text on somebody's window, processing some control ! 31: * characters while we are at it. ! 32: */ ! 33: ! 34: display(win, text, size) ! 35: register xwin_t *win; ! 36: register char *text; ! 37: int size; ! 38: { ! 39: register int i; ! 40: char cch; ! 41: ! 42: for (i = 0; i < size; i++) { ! 43: ! 44: if (*text == '\n') { ! 45: xscroll(win, 0); ! 46: text++; ! 47: continue; ! 48: } ! 49: ! 50: /* erase character */ ! 51: ! 52: if (*text == win->cerase) { ! 53: wmove(win->x_win, win->x_line, max(--win->x_col, 0)); ! 54: getyx(win->x_win, win->x_line, win->x_col); ! 55: waddch(win->x_win, ' '); ! 56: wmove(win->x_win, win->x_line, win->x_col); ! 57: getyx(win->x_win, win->x_line, win->x_col); ! 58: text++; ! 59: continue; ! 60: } ! 61: /* ! 62: * On word erase search backwards until we find ! 63: * the beginning of a word or the beginning of ! 64: * the line. ! 65: */ ! 66: if (*text == win->werase) { ! 67: int endcol, xcol, i, c; ! 68: ! 69: endcol = win->x_col; ! 70: xcol = endcol - 1; ! 71: while (xcol >= 0) { ! 72: c = readwin(win->x_win, win->x_line, xcol); ! 73: if (c != ' ') ! 74: break; ! 75: xcol--; ! 76: } ! 77: while (xcol >= 0) { ! 78: c = readwin(win->x_win, win->x_line, xcol); ! 79: if (c == ' ') ! 80: break; ! 81: xcol--; ! 82: } ! 83: wmove(win->x_win, win->x_line, xcol + 1); ! 84: for (i = xcol + 1; i < endcol; i++) ! 85: waddch(win->x_win, ' '); ! 86: wmove(win->x_win, win->x_line, xcol + 1); ! 87: getyx(win->x_win, win->x_line, win->x_col); ! 88: continue; ! 89: } ! 90: /* line kill */ ! 91: if (*text == win->kill) { ! 92: wmove(win->x_win, win->x_line, 0); ! 93: wclrtoeol(win->x_win); ! 94: getyx(win->x_win, win->x_line, win->x_col); ! 95: text++; ! 96: continue; ! 97: } ! 98: if (*text == '\f') { ! 99: if (win == &my_win) ! 100: wrefresh(curscr); ! 101: text++; ! 102: continue; ! 103: } ! 104: ! 105: if (win->x_col == COLS-1) { ! 106: /* check for wraparound */ ! 107: xscroll(win, 0); ! 108: } ! 109: ! 110: if (*text < ' ' && *text != '\t') { ! 111: waddch(win->x_win, '^'); ! 112: getyx(win->x_win, win->x_line, win->x_col); ! 113: ! 114: if (win->x_col == COLS-1) { ! 115: /* check for wraparound */ ! 116: xscroll(win, 0); ! 117: } ! 118: ! 119: cch = (*text & 63) + 64; ! 120: waddch(win->x_win, cch); ! 121: } else { ! 122: waddch(win->x_win, *text); ! 123: } ! 124: ! 125: getyx(win->x_win, win->x_line, win->x_col); ! 126: text++; ! 127: ! 128: } ! 129: wrefresh(win->x_win); ! 130: } ! 131: ! 132: /* ! 133: * Read the character at the indicated position in win ! 134: */ ! 135: readwin(win, line, col) ! 136: WINDOW *win; ! 137: { ! 138: int oldline, oldcol; ! 139: register int c; ! 140: ! 141: getyx(win, oldline, oldcol); ! 142: wmove(win, line, col); ! 143: c = winch(win); ! 144: wmove(win, oldline, oldcol); ! 145: return(c); ! 146: } ! 147: ! 148: /* ! 149: * Scroll a window, blanking out the line following the current line ! 150: * so that the current position is obvious ! 151: */ ! 152: ! 153: xscroll(win, flag) ! 154: register xwin_t *win; ! 155: int flag; ! 156: { ! 157: if (flag == -1) { ! 158: wmove(win->x_win, 0, 0); ! 159: win->x_line = 0; ! 160: win->x_col = 0; ! 161: return; ! 162: } ! 163: win->x_line = (win->x_line + 1) % win->x_nlines; ! 164: win->x_col = 0; ! 165: wmove(win->x_win, win->x_line, win->x_col); ! 166: wclrtoeol(win->x_win); ! 167: wmove(win->x_win, (win->x_line + 1) % win->x_nlines, win->x_col); ! 168: wclrtoeol(win->x_win); ! 169: wmove(win->x_win, win->x_line, win->x_col); ! 170: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.