xref: /csrg-svn/usr.bin/talk/display.c (revision 34373)
122390Sdist /*
222390Sdist  * Copyright (c) 1983 Regents of the University of California.
3*34373Sbostic  * All rights reserved.
4*34373Sbostic  *
5*34373Sbostic  * Redistribution and use in source and binary forms are permitted
6*34373Sbostic  * provided that this notice is preserved and that due credit is given
7*34373Sbostic  * to the University of California at Berkeley. The name of the University
8*34373Sbostic  * may not be used to endorse or promote products derived from this
9*34373Sbostic  * software without specific prior written permission. This software
10*34373Sbostic  * is provided ``as is'' without express or implied warranty.
1122390Sdist  */
1222390Sdist 
1316363Skarels #ifndef lint
14*34373Sbostic static char sccsid[] = "@(#)display.c	5.2 (Berkeley) 05/20/88";
15*34373Sbostic #endif /* not lint */
1616346Skarels 
1716363Skarels /*
1816363Skarels  * The window 'manager', initializes curses and handles the actual
1916346Skarels  * displaying of text
2016346Skarels  */
2116346Skarels #include "talk.h"
2216346Skarels 
2316363Skarels xwin_t	my_win;
2416363Skarels xwin_t	his_win;
2516363Skarels WINDOW	*line_win;
2616346Skarels 
2716363Skarels int	curses_initialized = 0;
2816346Skarels 
2916363Skarels /*
3016363Skarels  * max HAS to be a function, it is called with
3116363Skarels  * a argument of the form --foo at least once.
3216363Skarels  */
3316346Skarels max(a,b)
3416363Skarels 	int a, b;
3516346Skarels {
3616363Skarels 
3716363Skarels 	return (a > b ? a : b);
3816346Skarels }
3916346Skarels 
4016346Skarels /*
4116346Skarels  * Display some text on somebody's window, processing some control
4216346Skarels  * characters while we are at it.
4316346Skarels  */
4416346Skarels display(win, text, size)
4516363Skarels 	register xwin_t *win;
4616363Skarels 	register char *text;
4716363Skarels 	int size;
4816346Skarels {
4916363Skarels 	register int i;
5016363Skarels 	char cch;
5116346Skarels 
5216363Skarels 	for (i = 0; i < size; i++) {
5316363Skarels 		if (*text == '\n') {
5416363Skarels 			xscroll(win, 0);
5516363Skarels 			text++;
5616363Skarels 			continue;
5716363Skarels 		}
5816363Skarels 		/* erase character */
5916363Skarels 		if (*text == win->cerase) {
6016363Skarels 			wmove(win->x_win, win->x_line, max(--win->x_col, 0));
6116363Skarels 			getyx(win->x_win, win->x_line, win->x_col);
6216363Skarels 			waddch(win->x_win, ' ');
6316363Skarels 			wmove(win->x_win, win->x_line, win->x_col);
6416363Skarels 			getyx(win->x_win, win->x_line, win->x_col);
6516363Skarels 			text++;
6616363Skarels 			continue;
6716363Skarels 		}
6816363Skarels 		/*
6916363Skarels 		 * On word erase search backwards until we find
7016363Skarels 		 * the beginning of a word or the beginning of
7116363Skarels 		 * the line.
7216363Skarels 		 */
7316363Skarels 		if (*text == win->werase) {
7416363Skarels 			int endcol, xcol, i, c;
7516346Skarels 
7616363Skarels 			endcol = win->x_col;
7716363Skarels 			xcol = endcol - 1;
7816363Skarels 			while (xcol >= 0) {
7916363Skarels 				c = readwin(win->x_win, win->x_line, xcol);
8016363Skarels 				if (c != ' ')
8116363Skarels 					break;
8216363Skarels 				xcol--;
8316363Skarels 			}
8416363Skarels 			while (xcol >= 0) {
8516363Skarels 				c = readwin(win->x_win, win->x_line, xcol);
8616363Skarels 				if (c == ' ')
8716363Skarels 					break;
8816363Skarels 				xcol--;
8916363Skarels 			}
9016363Skarels 			wmove(win->x_win, win->x_line, xcol + 1);
9116363Skarels 			for (i = xcol + 1; i < endcol; i++)
9216363Skarels 				waddch(win->x_win, ' ');
9316363Skarels 			wmove(win->x_win, win->x_line, xcol + 1);
9416363Skarels 			getyx(win->x_win, win->x_line, win->x_col);
9516363Skarels 			continue;
9616363Skarels 		}
9716363Skarels 		/* line kill */
9816363Skarels 		if (*text == win->kill) {
9916363Skarels 			wmove(win->x_win, win->x_line, 0);
10016363Skarels 			wclrtoeol(win->x_win);
10116363Skarels 			getyx(win->x_win, win->x_line, win->x_col);
10216363Skarels 			text++;
10316363Skarels 			continue;
10416363Skarels 		}
10516363Skarels 		if (*text == '\f') {
10616363Skarels 			if (win == &my_win)
10716363Skarels 				wrefresh(curscr);
10816363Skarels 			text++;
10916363Skarels 			continue;
11016363Skarels 		}
11116363Skarels 		if (win->x_col == COLS-1) {
11216363Skarels 			/* check for wraparound */
11316363Skarels 			xscroll(win, 0);
11416363Skarels 		}
11516363Skarels 		if (*text < ' ' && *text != '\t') {
11616363Skarels 			waddch(win->x_win, '^');
11716363Skarels 			getyx(win->x_win, win->x_line, win->x_col);
11816363Skarels 			if (win->x_col == COLS-1) /* check for wraparound */
11916363Skarels 				xscroll(win, 0);
12016363Skarels 			cch = (*text & 63) + 64;
12116363Skarels 			waddch(win->x_win, cch);
12216363Skarels 		} else
12316363Skarels 			waddch(win->x_win, *text);
12416363Skarels 		getyx(win->x_win, win->x_line, win->x_col);
12516363Skarels 		text++;
12616346Skarels 	}
12716363Skarels 	wrefresh(win->x_win);
12816346Skarels }
12916346Skarels 
13016346Skarels /*
13116363Skarels  * Read the character at the indicated position in win
13216363Skarels  */
13316346Skarels readwin(win, line, col)
13416363Skarels 	WINDOW *win;
13516346Skarels {
13616363Skarels 	int oldline, oldcol;
13716363Skarels 	register int c;
13816346Skarels 
13916363Skarels 	getyx(win, oldline, oldcol);
14016363Skarels 	wmove(win, line, col);
14116363Skarels 	c = winch(win);
14216363Skarels 	wmove(win, oldline, oldcol);
14316363Skarels 	return (c);
14416346Skarels }
14516346Skarels 
14616346Skarels /*
14716363Skarels  * Scroll a window, blanking out the line following the current line
14816363Skarels  * so that the current position is obvious
14916363Skarels  */
15016346Skarels xscroll(win, flag)
15116363Skarels 	register xwin_t *win;
15216363Skarels 	int flag;
15316346Skarels {
15416363Skarels 
15516363Skarels 	if (flag == -1) {
15616363Skarels 		wmove(win->x_win, 0, 0);
15716363Skarels 		win->x_line = 0;
15816363Skarels 		win->x_col = 0;
15916363Skarels 		return;
16016363Skarels 	}
16116363Skarels 	win->x_line = (win->x_line + 1) % win->x_nlines;
16216346Skarels 	win->x_col = 0;
16316363Skarels 	wmove(win->x_win, win->x_line, win->x_col);
16416363Skarels 	wclrtoeol(win->x_win);
16516363Skarels 	wmove(win->x_win, (win->x_line + 1) % win->x_nlines, win->x_col);
16616363Skarels 	wclrtoeol(win->x_win);
16716363Skarels 	wmove(win->x_win, win->x_line, win->x_col);
16816346Skarels }
169