xref: /csrg-svn/usr.bin/talk/display.c (revision 22390)
1*22390Sdist /*
2*22390Sdist  * Copyright (c) 1983 Regents of the University of California.
3*22390Sdist  * All rights reserved.  The Berkeley software License Agreement
4*22390Sdist  * specifies the terms and conditions for redistribution.
5*22390Sdist  */
6*22390Sdist 
716363Skarels #ifndef lint
8*22390Sdist static char sccsid[] = "@(#)display.c	5.1 (Berkeley) 06/06/85";
9*22390Sdist #endif not lint
1016346Skarels 
1116363Skarels /*
1216363Skarels  * The window 'manager', initializes curses and handles the actual
1316346Skarels  * displaying of text
1416346Skarels  */
1516346Skarels #include "talk.h"
1616346Skarels 
1716363Skarels xwin_t	my_win;
1816363Skarels xwin_t	his_win;
1916363Skarels WINDOW	*line_win;
2016346Skarels 
2116363Skarels int	curses_initialized = 0;
2216346Skarels 
2316363Skarels /*
2416363Skarels  * max HAS to be a function, it is called with
2516363Skarels  * a argument of the form --foo at least once.
2616363Skarels  */
2716346Skarels max(a,b)
2816363Skarels 	int a, b;
2916346Skarels {
3016363Skarels 
3116363Skarels 	return (a > b ? a : b);
3216346Skarels }
3316346Skarels 
3416346Skarels /*
3516346Skarels  * Display some text on somebody's window, processing some control
3616346Skarels  * characters while we are at it.
3716346Skarels  */
3816346Skarels display(win, text, size)
3916363Skarels 	register xwin_t *win;
4016363Skarels 	register char *text;
4116363Skarels 	int size;
4216346Skarels {
4316363Skarels 	register int i;
4416363Skarels 	char cch;
4516346Skarels 
4616363Skarels 	for (i = 0; i < size; i++) {
4716363Skarels 		if (*text == '\n') {
4816363Skarels 			xscroll(win, 0);
4916363Skarels 			text++;
5016363Skarels 			continue;
5116363Skarels 		}
5216363Skarels 		/* erase character */
5316363Skarels 		if (*text == win->cerase) {
5416363Skarels 			wmove(win->x_win, win->x_line, max(--win->x_col, 0));
5516363Skarels 			getyx(win->x_win, win->x_line, win->x_col);
5616363Skarels 			waddch(win->x_win, ' ');
5716363Skarels 			wmove(win->x_win, win->x_line, win->x_col);
5816363Skarels 			getyx(win->x_win, win->x_line, win->x_col);
5916363Skarels 			text++;
6016363Skarels 			continue;
6116363Skarels 		}
6216363Skarels 		/*
6316363Skarels 		 * On word erase search backwards until we find
6416363Skarels 		 * the beginning of a word or the beginning of
6516363Skarels 		 * the line.
6616363Skarels 		 */
6716363Skarels 		if (*text == win->werase) {
6816363Skarels 			int endcol, xcol, i, c;
6916346Skarels 
7016363Skarels 			endcol = win->x_col;
7116363Skarels 			xcol = endcol - 1;
7216363Skarels 			while (xcol >= 0) {
7316363Skarels 				c = readwin(win->x_win, win->x_line, xcol);
7416363Skarels 				if (c != ' ')
7516363Skarels 					break;
7616363Skarels 				xcol--;
7716363Skarels 			}
7816363Skarels 			while (xcol >= 0) {
7916363Skarels 				c = readwin(win->x_win, win->x_line, xcol);
8016363Skarels 				if (c == ' ')
8116363Skarels 					break;
8216363Skarels 				xcol--;
8316363Skarels 			}
8416363Skarels 			wmove(win->x_win, win->x_line, xcol + 1);
8516363Skarels 			for (i = xcol + 1; i < endcol; i++)
8616363Skarels 				waddch(win->x_win, ' ');
8716363Skarels 			wmove(win->x_win, win->x_line, xcol + 1);
8816363Skarels 			getyx(win->x_win, win->x_line, win->x_col);
8916363Skarels 			continue;
9016363Skarels 		}
9116363Skarels 		/* line kill */
9216363Skarels 		if (*text == win->kill) {
9316363Skarels 			wmove(win->x_win, win->x_line, 0);
9416363Skarels 			wclrtoeol(win->x_win);
9516363Skarels 			getyx(win->x_win, win->x_line, win->x_col);
9616363Skarels 			text++;
9716363Skarels 			continue;
9816363Skarels 		}
9916363Skarels 		if (*text == '\f') {
10016363Skarels 			if (win == &my_win)
10116363Skarels 				wrefresh(curscr);
10216363Skarels 			text++;
10316363Skarels 			continue;
10416363Skarels 		}
10516363Skarels 		if (win->x_col == COLS-1) {
10616363Skarels 			/* check for wraparound */
10716363Skarels 			xscroll(win, 0);
10816363Skarels 		}
10916363Skarels 		if (*text < ' ' && *text != '\t') {
11016363Skarels 			waddch(win->x_win, '^');
11116363Skarels 			getyx(win->x_win, win->x_line, win->x_col);
11216363Skarels 			if (win->x_col == COLS-1) /* check for wraparound */
11316363Skarels 				xscroll(win, 0);
11416363Skarels 			cch = (*text & 63) + 64;
11516363Skarels 			waddch(win->x_win, cch);
11616363Skarels 		} else
11716363Skarels 			waddch(win->x_win, *text);
11816363Skarels 		getyx(win->x_win, win->x_line, win->x_col);
11916363Skarels 		text++;
12016346Skarels 	}
12116363Skarels 	wrefresh(win->x_win);
12216346Skarels }
12316346Skarels 
12416346Skarels /*
12516363Skarels  * Read the character at the indicated position in win
12616363Skarels  */
12716346Skarels readwin(win, line, col)
12816363Skarels 	WINDOW *win;
12916346Skarels {
13016363Skarels 	int oldline, oldcol;
13116363Skarels 	register int c;
13216346Skarels 
13316363Skarels 	getyx(win, oldline, oldcol);
13416363Skarels 	wmove(win, line, col);
13516363Skarels 	c = winch(win);
13616363Skarels 	wmove(win, oldline, oldcol);
13716363Skarels 	return (c);
13816346Skarels }
13916346Skarels 
14016346Skarels /*
14116363Skarels  * Scroll a window, blanking out the line following the current line
14216363Skarels  * so that the current position is obvious
14316363Skarels  */
14416346Skarels xscroll(win, flag)
14516363Skarels 	register xwin_t *win;
14616363Skarels 	int flag;
14716346Skarels {
14816363Skarels 
14916363Skarels 	if (flag == -1) {
15016363Skarels 		wmove(win->x_win, 0, 0);
15116363Skarels 		win->x_line = 0;
15216363Skarels 		win->x_col = 0;
15316363Skarels 		return;
15416363Skarels 	}
15516363Skarels 	win->x_line = (win->x_line + 1) % win->x_nlines;
15616346Skarels 	win->x_col = 0;
15716363Skarels 	wmove(win->x_win, win->x_line, win->x_col);
15816363Skarels 	wclrtoeol(win->x_win);
15916363Skarels 	wmove(win->x_win, (win->x_line + 1) % win->x_nlines, win->x_col);
16016363Skarels 	wclrtoeol(win->x_win);
16116363Skarels 	wmove(win->x_win, win->x_line, win->x_col);
16216346Skarels }
163