xref: /csrg-svn/usr.bin/talk/display.c (revision 42770)
122390Sdist /*
222390Sdist  * Copyright (c) 1983 Regents of the University of California.
334373Sbostic  * All rights reserved.
434373Sbostic  *
5*42770Sbostic  * %sccs.include.redist.c%
622390Sdist  */
722390Sdist 
816363Skarels #ifndef lint
9*42770Sbostic static char sccsid[] = "@(#)display.c	5.4 (Berkeley) 06/01/90";
1034373Sbostic #endif /* not lint */
1116346Skarels 
1216363Skarels /*
1316363Skarels  * The window 'manager', initializes curses and handles the actual
1416346Skarels  * displaying of text
1516346Skarels  */
1616346Skarels #include "talk.h"
1716346Skarels 
1816363Skarels xwin_t	my_win;
1916363Skarels xwin_t	his_win;
2016363Skarels WINDOW	*line_win;
2116346Skarels 
2216363Skarels int	curses_initialized = 0;
2316346Skarels 
2416363Skarels /*
2516363Skarels  * max HAS to be a function, it is called with
2616363Skarels  * a argument of the form --foo at least once.
2716363Skarels  */
2816346Skarels max(a,b)
2916363Skarels 	int a, b;
3016346Skarels {
3116363Skarels 
3216363Skarels 	return (a > b ? a : b);
3316346Skarels }
3416346Skarels 
3516346Skarels /*
3616346Skarels  * Display some text on somebody's window, processing some control
3716346Skarels  * characters while we are at it.
3816346Skarels  */
3916346Skarels display(win, text, size)
4016363Skarels 	register xwin_t *win;
4116363Skarels 	register char *text;
4216363Skarels 	int size;
4316346Skarels {
4416363Skarels 	register int i;
4516363Skarels 	char cch;
4616346Skarels 
4716363Skarels 	for (i = 0; i < size; i++) {
4816363Skarels 		if (*text == '\n') {
4916363Skarels 			xscroll(win, 0);
5016363Skarels 			text++;
5116363Skarels 			continue;
5216363Skarels 		}
5316363Skarels 		/* erase character */
5416363Skarels 		if (*text == win->cerase) {
5516363Skarels 			wmove(win->x_win, win->x_line, max(--win->x_col, 0));
5616363Skarels 			getyx(win->x_win, win->x_line, win->x_col);
5716363Skarels 			waddch(win->x_win, ' ');
5816363Skarels 			wmove(win->x_win, win->x_line, win->x_col);
5916363Skarels 			getyx(win->x_win, win->x_line, win->x_col);
6016363Skarels 			text++;
6116363Skarels 			continue;
6216363Skarels 		}
6316363Skarels 		/*
6416363Skarels 		 * On word erase search backwards until we find
6516363Skarels 		 * the beginning of a word or the beginning of
6616363Skarels 		 * the line.
6716363Skarels 		 */
6816363Skarels 		if (*text == win->werase) {
6916363Skarels 			int endcol, xcol, i, c;
7016346Skarels 
7116363Skarels 			endcol = win->x_col;
7216363Skarels 			xcol = endcol - 1;
7316363Skarels 			while (xcol >= 0) {
7416363Skarels 				c = readwin(win->x_win, win->x_line, xcol);
7516363Skarels 				if (c != ' ')
7616363Skarels 					break;
7716363Skarels 				xcol--;
7816363Skarels 			}
7916363Skarels 			while (xcol >= 0) {
8016363Skarels 				c = readwin(win->x_win, win->x_line, xcol);
8116363Skarels 				if (c == ' ')
8216363Skarels 					break;
8316363Skarels 				xcol--;
8416363Skarels 			}
8516363Skarels 			wmove(win->x_win, win->x_line, xcol + 1);
8616363Skarels 			for (i = xcol + 1; i < endcol; i++)
8716363Skarels 				waddch(win->x_win, ' ');
8816363Skarels 			wmove(win->x_win, win->x_line, xcol + 1);
8916363Skarels 			getyx(win->x_win, win->x_line, win->x_col);
9016363Skarels 			continue;
9116363Skarels 		}
9216363Skarels 		/* line kill */
9316363Skarels 		if (*text == win->kill) {
9416363Skarels 			wmove(win->x_win, win->x_line, 0);
9516363Skarels 			wclrtoeol(win->x_win);
9616363Skarels 			getyx(win->x_win, win->x_line, win->x_col);
9716363Skarels 			text++;
9816363Skarels 			continue;
9916363Skarels 		}
10016363Skarels 		if (*text == '\f') {
10116363Skarels 			if (win == &my_win)
10216363Skarels 				wrefresh(curscr);
10316363Skarels 			text++;
10416363Skarels 			continue;
10516363Skarels 		}
10616363Skarels 		if (win->x_col == COLS-1) {
10716363Skarels 			/* check for wraparound */
10816363Skarels 			xscroll(win, 0);
10916363Skarels 		}
11016363Skarels 		if (*text < ' ' && *text != '\t') {
11116363Skarels 			waddch(win->x_win, '^');
11216363Skarels 			getyx(win->x_win, win->x_line, win->x_col);
11316363Skarels 			if (win->x_col == COLS-1) /* check for wraparound */
11416363Skarels 				xscroll(win, 0);
11516363Skarels 			cch = (*text & 63) + 64;
11616363Skarels 			waddch(win->x_win, cch);
11716363Skarels 		} else
11816363Skarels 			waddch(win->x_win, *text);
11916363Skarels 		getyx(win->x_win, win->x_line, win->x_col);
12016363Skarels 		text++;
12116346Skarels 	}
12216363Skarels 	wrefresh(win->x_win);
12316346Skarels }
12416346Skarels 
12516346Skarels /*
12616363Skarels  * Read the character at the indicated position in win
12716363Skarels  */
12816346Skarels readwin(win, line, col)
12916363Skarels 	WINDOW *win;
13016346Skarels {
13116363Skarels 	int oldline, oldcol;
13216363Skarels 	register int c;
13316346Skarels 
13416363Skarels 	getyx(win, oldline, oldcol);
13516363Skarels 	wmove(win, line, col);
13616363Skarels 	c = winch(win);
13716363Skarels 	wmove(win, oldline, oldcol);
13816363Skarels 	return (c);
13916346Skarels }
14016346Skarels 
14116346Skarels /*
14216363Skarels  * Scroll a window, blanking out the line following the current line
14316363Skarels  * so that the current position is obvious
14416363Skarels  */
14516346Skarels xscroll(win, flag)
14616363Skarels 	register xwin_t *win;
14716363Skarels 	int flag;
14816346Skarels {
14916363Skarels 
15016363Skarels 	if (flag == -1) {
15116363Skarels 		wmove(win->x_win, 0, 0);
15216363Skarels 		win->x_line = 0;
15316363Skarels 		win->x_col = 0;
15416363Skarels 		return;
15516363Skarels 	}
15616363Skarels 	win->x_line = (win->x_line + 1) % win->x_nlines;
15716346Skarels 	win->x_col = 0;
15816363Skarels 	wmove(win->x_win, win->x_line, win->x_col);
15916363Skarels 	wclrtoeol(win->x_win);
16016363Skarels 	wmove(win->x_win, (win->x_line + 1) % win->x_nlines, win->x_col);
16116363Skarels 	wclrtoeol(win->x_win);
16216363Skarels 	wmove(win->x_win, win->x_line, win->x_col);
16316346Skarels }
164