xref: /csrg-svn/usr.bin/talk/display.c (revision 62301)
122390Sdist /*
2*62301Sbostic  * Copyright (c) 1983, 1993
3*62301Sbostic  *	The Regents of the University of California.  All rights reserved.
434373Sbostic  *
542770Sbostic  * %sccs.include.redist.c%
622390Sdist  */
722390Sdist 
816363Skarels #ifndef lint
9*62301Sbostic static char sccsid[] = "@(#)display.c	8.1 (Berkeley) 06/06/93";
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  */
max(a,b)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  */
display(win,text,size)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);
9051583Sbostic 			text++;
9116363Skarels 			continue;
9216363Skarels 		}
9316363Skarels 		/* line kill */
9416363Skarels 		if (*text == win->kill) {
9516363Skarels 			wmove(win->x_win, win->x_line, 0);
9616363Skarels 			wclrtoeol(win->x_win);
9716363Skarels 			getyx(win->x_win, win->x_line, win->x_col);
9816363Skarels 			text++;
9916363Skarels 			continue;
10016363Skarels 		}
10116363Skarels 		if (*text == '\f') {
10216363Skarels 			if (win == &my_win)
10316363Skarels 				wrefresh(curscr);
10416363Skarels 			text++;
10516363Skarels 			continue;
10616363Skarels 		}
10716363Skarels 		if (win->x_col == COLS-1) {
10816363Skarels 			/* check for wraparound */
10916363Skarels 			xscroll(win, 0);
11016363Skarels 		}
11116363Skarels 		if (*text < ' ' && *text != '\t') {
11216363Skarels 			waddch(win->x_win, '^');
11316363Skarels 			getyx(win->x_win, win->x_line, win->x_col);
11416363Skarels 			if (win->x_col == COLS-1) /* check for wraparound */
11516363Skarels 				xscroll(win, 0);
11616363Skarels 			cch = (*text & 63) + 64;
11716363Skarels 			waddch(win->x_win, cch);
11816363Skarels 		} else
11916363Skarels 			waddch(win->x_win, *text);
12016363Skarels 		getyx(win->x_win, win->x_line, win->x_col);
12116363Skarels 		text++;
12216346Skarels 	}
12316363Skarels 	wrefresh(win->x_win);
12416346Skarels }
12516346Skarels 
12616346Skarels /*
12716363Skarels  * Read the character at the indicated position in win
12816363Skarels  */
readwin(win,line,col)12916346Skarels readwin(win, line, col)
13016363Skarels 	WINDOW *win;
13116346Skarels {
13216363Skarels 	int oldline, oldcol;
13316363Skarels 	register int c;
13416346Skarels 
13516363Skarels 	getyx(win, oldline, oldcol);
13616363Skarels 	wmove(win, line, col);
13716363Skarels 	c = winch(win);
13816363Skarels 	wmove(win, oldline, oldcol);
13916363Skarels 	return (c);
14016346Skarels }
14116346Skarels 
14216346Skarels /*
14316363Skarels  * Scroll a window, blanking out the line following the current line
14416363Skarels  * so that the current position is obvious
14516363Skarels  */
xscroll(win,flag)14616346Skarels xscroll(win, flag)
14716363Skarels 	register xwin_t *win;
14816363Skarels 	int flag;
14916346Skarels {
15016363Skarels 
15116363Skarels 	if (flag == -1) {
15216363Skarels 		wmove(win->x_win, 0, 0);
15316363Skarels 		win->x_line = 0;
15416363Skarels 		win->x_col = 0;
15516363Skarels 		return;
15616363Skarels 	}
15716363Skarels 	win->x_line = (win->x_line + 1) % win->x_nlines;
15816346Skarels 	win->x_col = 0;
15916363Skarels 	wmove(win->x_win, win->x_line, win->x_col);
16016363Skarels 	wclrtoeol(win->x_win);
16116363Skarels 	wmove(win->x_win, (win->x_line + 1) % win->x_nlines, win->x_col);
16216363Skarels 	wclrtoeol(win->x_win);
16316363Skarels 	wmove(win->x_win, win->x_line, win->x_col);
16416346Skarels }
165