xref: /csrg-svn/usr.bin/talk/display.c (revision 16363)
1*16363Skarels #ifndef lint
2*16363Skarels static char sccsid[] = "@(#)display.c	1.2 (Berkeley) 04/11/84";
3*16363Skarels #endif
416346Skarels 
5*16363Skarels /*
6*16363Skarels  * The window 'manager', initializes curses and handles the actual
716346Skarels  * displaying of text
816346Skarels  */
916346Skarels #include "talk.h"
1016346Skarels 
11*16363Skarels xwin_t	my_win;
12*16363Skarels xwin_t	his_win;
13*16363Skarels WINDOW	*line_win;
1416346Skarels 
15*16363Skarels int	curses_initialized = 0;
1616346Skarels 
17*16363Skarels /*
18*16363Skarels  * max HAS to be a function, it is called with
19*16363Skarels  * a argument of the form --foo at least once.
20*16363Skarels  */
2116346Skarels max(a,b)
22*16363Skarels 	int a, b;
2316346Skarels {
24*16363Skarels 
25*16363Skarels 	return (a > b ? a : b);
2616346Skarels }
2716346Skarels 
2816346Skarels /*
2916346Skarels  * Display some text on somebody's window, processing some control
3016346Skarels  * characters while we are at it.
3116346Skarels  */
3216346Skarels display(win, text, size)
33*16363Skarels 	register xwin_t *win;
34*16363Skarels 	register char *text;
35*16363Skarels 	int size;
3616346Skarels {
37*16363Skarels 	register int i;
38*16363Skarels 	char cch;
3916346Skarels 
40*16363Skarels 	for (i = 0; i < size; i++) {
41*16363Skarels 		if (*text == '\n') {
42*16363Skarels 			xscroll(win, 0);
43*16363Skarels 			text++;
44*16363Skarels 			continue;
45*16363Skarels 		}
46*16363Skarels 		/* erase character */
47*16363Skarels 		if (*text == win->cerase) {
48*16363Skarels 			wmove(win->x_win, win->x_line, max(--win->x_col, 0));
49*16363Skarels 			getyx(win->x_win, win->x_line, win->x_col);
50*16363Skarels 			waddch(win->x_win, ' ');
51*16363Skarels 			wmove(win->x_win, win->x_line, win->x_col);
52*16363Skarels 			getyx(win->x_win, win->x_line, win->x_col);
53*16363Skarels 			text++;
54*16363Skarels 			continue;
55*16363Skarels 		}
56*16363Skarels 		/*
57*16363Skarels 		 * On word erase search backwards until we find
58*16363Skarels 		 * the beginning of a word or the beginning of
59*16363Skarels 		 * the line.
60*16363Skarels 		 */
61*16363Skarels 		if (*text == win->werase) {
62*16363Skarels 			int endcol, xcol, i, c;
6316346Skarels 
64*16363Skarels 			endcol = win->x_col;
65*16363Skarels 			xcol = endcol - 1;
66*16363Skarels 			while (xcol >= 0) {
67*16363Skarels 				c = readwin(win->x_win, win->x_line, xcol);
68*16363Skarels 				if (c != ' ')
69*16363Skarels 					break;
70*16363Skarels 				xcol--;
71*16363Skarels 			}
72*16363Skarels 			while (xcol >= 0) {
73*16363Skarels 				c = readwin(win->x_win, win->x_line, xcol);
74*16363Skarels 				if (c == ' ')
75*16363Skarels 					break;
76*16363Skarels 				xcol--;
77*16363Skarels 			}
78*16363Skarels 			wmove(win->x_win, win->x_line, xcol + 1);
79*16363Skarels 			for (i = xcol + 1; i < endcol; i++)
80*16363Skarels 				waddch(win->x_win, ' ');
81*16363Skarels 			wmove(win->x_win, win->x_line, xcol + 1);
82*16363Skarels 			getyx(win->x_win, win->x_line, win->x_col);
83*16363Skarels 			continue;
84*16363Skarels 		}
85*16363Skarels 		/* line kill */
86*16363Skarels 		if (*text == win->kill) {
87*16363Skarels 			wmove(win->x_win, win->x_line, 0);
88*16363Skarels 			wclrtoeol(win->x_win);
89*16363Skarels 			getyx(win->x_win, win->x_line, win->x_col);
90*16363Skarels 			text++;
91*16363Skarels 			continue;
92*16363Skarels 		}
93*16363Skarels 		if (*text == '\f') {
94*16363Skarels 			if (win == &my_win)
95*16363Skarels 				wrefresh(curscr);
96*16363Skarels 			text++;
97*16363Skarels 			continue;
98*16363Skarels 		}
99*16363Skarels 		if (win->x_col == COLS-1) {
100*16363Skarels 			/* check for wraparound */
101*16363Skarels 			xscroll(win, 0);
102*16363Skarels 		}
103*16363Skarels 		if (*text < ' ' && *text != '\t') {
104*16363Skarels 			waddch(win->x_win, '^');
105*16363Skarels 			getyx(win->x_win, win->x_line, win->x_col);
106*16363Skarels 			if (win->x_col == COLS-1) /* check for wraparound */
107*16363Skarels 				xscroll(win, 0);
108*16363Skarels 			cch = (*text & 63) + 64;
109*16363Skarels 			waddch(win->x_win, cch);
110*16363Skarels 		} else
111*16363Skarels 			waddch(win->x_win, *text);
112*16363Skarels 		getyx(win->x_win, win->x_line, win->x_col);
113*16363Skarels 		text++;
11416346Skarels 	}
115*16363Skarels 	wrefresh(win->x_win);
11616346Skarels }
11716346Skarels 
11816346Skarels /*
119*16363Skarels  * Read the character at the indicated position in win
120*16363Skarels  */
12116346Skarels readwin(win, line, col)
122*16363Skarels 	WINDOW *win;
12316346Skarels {
124*16363Skarels 	int oldline, oldcol;
125*16363Skarels 	register int c;
12616346Skarels 
127*16363Skarels 	getyx(win, oldline, oldcol);
128*16363Skarels 	wmove(win, line, col);
129*16363Skarels 	c = winch(win);
130*16363Skarels 	wmove(win, oldline, oldcol);
131*16363Skarels 	return (c);
13216346Skarels }
13316346Skarels 
13416346Skarels /*
135*16363Skarels  * Scroll a window, blanking out the line following the current line
136*16363Skarels  * so that the current position is obvious
137*16363Skarels  */
13816346Skarels xscroll(win, flag)
139*16363Skarels 	register xwin_t *win;
140*16363Skarels 	int flag;
14116346Skarels {
142*16363Skarels 
143*16363Skarels 	if (flag == -1) {
144*16363Skarels 		wmove(win->x_win, 0, 0);
145*16363Skarels 		win->x_line = 0;
146*16363Skarels 		win->x_col = 0;
147*16363Skarels 		return;
148*16363Skarels 	}
149*16363Skarels 	win->x_line = (win->x_line + 1) % win->x_nlines;
15016346Skarels 	win->x_col = 0;
151*16363Skarels 	wmove(win->x_win, win->x_line, win->x_col);
152*16363Skarels 	wclrtoeol(win->x_win);
153*16363Skarels 	wmove(win->x_win, (win->x_line + 1) % win->x_nlines, win->x_col);
154*16363Skarels 	wclrtoeol(win->x_win);
155*16363Skarels 	wmove(win->x_win, win->x_line, win->x_col);
15616346Skarels }
157