From: Mike Karels Date: Thu, 12 Apr 1984 06:02:48 +0000 (-0800) Subject: date and time created 84/04/11 15:02:48 by karels X-Git-Tag: BSD-4_3-Snapshot-Development~10124 X-Git-Url: https://git.subgeniuskitty.com/unix-history/.git/commitdiff_plain/a07b5a3866282d3ae1f5f5dd7d3811f69b30dac7 date and time created 84/04/11 15:02:48 by karels SCCS-vsn: usr.bin/talk/display.c 1.1 --- diff --git a/usr/src/usr.bin/talk/display.c b/usr/src/usr.bin/talk/display.c new file mode 100644 index 0000000000..22615a00ec --- /dev/null +++ b/usr/src/usr.bin/talk/display.c @@ -0,0 +1,170 @@ +/* $Header: display.c 1.2 83/04/23 02:09:33 moore Exp $ */ + +/* The window 'manager', initializes curses and handles the actual + * displaying of text + */ + +#include "talk.h" + +xwin_t my_win; +xwin_t his_win; +WINDOW *line_win; + +int curses_initialized = 0; + + /* max HAS to be a function, it is called with + * a argument of the form --foo at least once. + */ + +max(a,b) +int a, b; +{ + if (a > b) { + return(a); + } else { + return(b); + } +} + +/* + * Display some text on somebody's window, processing some control + * characters while we are at it. + */ + +display(win, text, size) +register xwin_t *win; +register char *text; +int size; +{ + register int i; + char cch; + + for (i = 0; i < size; i++) { + + if (*text == '\n') { + xscroll(win, 0); + text++; + continue; + } + + /* erase character */ + + if (*text == win->cerase) { + wmove(win->x_win, win->x_line, max(--win->x_col, 0)); + getyx(win->x_win, win->x_line, win->x_col); + waddch(win->x_win, ' '); + wmove(win->x_win, win->x_line, win->x_col); + getyx(win->x_win, win->x_line, win->x_col); + text++; + continue; + } + /* + * On word erase search backwards until we find + * the beginning of a word or the beginning of + * the line. + */ + if (*text == win->werase) { + int endcol, xcol, i, c; + + endcol = win->x_col; + xcol = endcol - 1; + while (xcol >= 0) { + c = readwin(win->x_win, win->x_line, xcol); + if (c != ' ') + break; + xcol--; + } + while (xcol >= 0) { + c = readwin(win->x_win, win->x_line, xcol); + if (c == ' ') + break; + xcol--; + } + wmove(win->x_win, win->x_line, xcol + 1); + for (i = xcol + 1; i < endcol; i++) + waddch(win->x_win, ' '); + wmove(win->x_win, win->x_line, xcol + 1); + getyx(win->x_win, win->x_line, win->x_col); + continue; + } + /* line kill */ + if (*text == win->kill) { + wmove(win->x_win, win->x_line, 0); + wclrtoeol(win->x_win); + getyx(win->x_win, win->x_line, win->x_col); + text++; + continue; + } + if (*text == '\f') { + if (win == &my_win) + wrefresh(curscr); + text++; + continue; + } + + if (win->x_col == COLS-1) { + /* check for wraparound */ + xscroll(win, 0); + } + + if (*text < ' ' && *text != '\t') { + waddch(win->x_win, '^'); + getyx(win->x_win, win->x_line, win->x_col); + + if (win->x_col == COLS-1) { + /* check for wraparound */ + xscroll(win, 0); + } + + cch = (*text & 63) + 64; + waddch(win->x_win, cch); + } else { + waddch(win->x_win, *text); + } + + getyx(win->x_win, win->x_line, win->x_col); + text++; + + } +wrefresh(win->x_win); +} + +/* +* Read the character at the indicated position in win +*/ +readwin(win, line, col) +WINDOW *win; +{ +int oldline, oldcol; +register int c; + +getyx(win, oldline, oldcol); +wmove(win, line, col); +c = winch(win); +wmove(win, oldline, oldcol); +return(c); +} + +/* +* Scroll a window, blanking out the line following the current line +* so that the current position is obvious +*/ + +xscroll(win, flag) +register xwin_t *win; +int flag; +{ + if (flag == -1) { + wmove(win->x_win, 0, 0); + win->x_line = 0; + win->x_col = 0; + return; + } + win->x_line = (win->x_line + 1) % win->x_nlines; + win->x_col = 0; + wmove(win->x_win, win->x_line, win->x_col); + wclrtoeol(win->x_win); + wmove(win->x_win, (win->x_line + 1) % win->x_nlines, win->x_col); + wclrtoeol(win->x_win); + wmove(win->x_win, win->x_line, win->x_col); +}