xref: /csrg-svn/lib/libcurses/refresh.c (revision 2287)
12261Sarnold /*
22261Sarnold  * make the current screen look like "win" over the area coverd by
32261Sarnold  * win.
42261Sarnold  *
5*2287Sarnold  * 01/27/81 (Berkeley) @(#)refresh.c	1.2
62261Sarnold  */
72261Sarnold 
82261Sarnold # include	"curses.ext"
92261Sarnold 
10*2287Sarnold # ifdef DEBUG
11*2287Sarnold # define	STATIC
122261Sarnold # else
13*2287Sarnold # define	STATIC	static
142261Sarnold # endif
152261Sarnold 
16*2287Sarnold STATIC short	ly, lx;
17*2287Sarnold 
18*2287Sarnold STATIC bool	curwin;
19*2287Sarnold 
202261Sarnold WINDOW	*_win = NULL;
212261Sarnold 
222261Sarnold wrefresh(win)
232261Sarnold reg WINDOW	*win;
242261Sarnold {
252261Sarnold 	reg short	wy;
26*2287Sarnold 	reg int		retval;
272261Sarnold 
282261Sarnold 	/*
292261Sarnold 	 * make sure were in visual state
302261Sarnold 	 */
312261Sarnold 	if (_endwin) {
322261Sarnold 		_puts(VS);
332261Sarnold 		_puts(TI);
342261Sarnold 		_endwin = FALSE;
352261Sarnold 	}
36*2287Sarnold 
37*2287Sarnold 	/*
38*2287Sarnold 	 * initialize loop parameters
39*2287Sarnold 	 */
40*2287Sarnold 
41*2287Sarnold 	ly = curscr->_cury;
42*2287Sarnold 	lx = curscr->_curx;
43*2287Sarnold 	wy = 0;
44*2287Sarnold 	_win = win;
45*2287Sarnold 	curwin = (win == curscr);
46*2287Sarnold 
47*2287Sarnold 	if (win->_clear || curscr->_clear || curwin) {
482261Sarnold 		if ((win->_flags & _FULLWIN) || curscr->_clear) {
492261Sarnold 			_puts(CL);
50*2287Sarnold 			if (!curwin) {
51*2287Sarnold 				curscr->_curx = curscr->_cury = 0;
52*2287Sarnold 				curscr->_clear = FALSE;
53*2287Sarnold 				werase(curscr);
54*2287Sarnold 			}
552261Sarnold 			touchwin(win);
562261Sarnold 		}
572261Sarnold 		win->_clear = FALSE;
582261Sarnold 	}
592261Sarnold 	if (!CA) {
602261Sarnold 		if (win->_curx != 0)
612261Sarnold 			putchar('\n');
62*2287Sarnold 		if (!curwin)
63*2287Sarnold 			werase(curscr);
642261Sarnold 	}
652261Sarnold # ifdef DEBUG
66*2287Sarnold 	fprintf(outf, "REFRESH(%0.2o): curwin = %d\n", win, curwin);
672261Sarnold 	fprintf(outf, "REFRESH:\n\tfirstch\tlastch\n");
682261Sarnold # endif
692261Sarnold 	for (wy = 0; wy < win->_maxy; wy++) {
702261Sarnold # ifdef DEBUG
712261Sarnold 		fprintf(outf, "%d\t%d\t%d\n", wy, win->_firstch[wy], win->_lastch[wy]);
722261Sarnold # endif
732261Sarnold 		if (win->_firstch[wy] != _NOCHANGE)
742261Sarnold 			if (makech(win, wy) == ERR)
752261Sarnold 				return ERR;
762261Sarnold 			else
772261Sarnold 				win->_firstch[wy] = _NOCHANGE;
782261Sarnold 	}
792261Sarnold 	if (win->_leave) {
802261Sarnold 		curscr->_cury = ly;
812261Sarnold 		curscr->_curx = lx;
822261Sarnold 		ly -= win->_begy;
832261Sarnold 		lx -= win->_begx;
842261Sarnold 		if (ly >= 0 && ly < win->_maxy && lx >= 0 && lx < win->_maxx) {
852261Sarnold 			win->_cury = ly;
862261Sarnold 			win->_curx = lx;
872261Sarnold 		}
882261Sarnold 		else
892261Sarnold 			win->_cury = win->_curx = 0;
902261Sarnold 	}
912261Sarnold 	else {
922261Sarnold 		mvcur(ly, lx, win->_cury + win->_begy, win->_curx + win->_begx);
932261Sarnold 		curscr->_cury = win->_cury + win->_begy;
942261Sarnold 		curscr->_curx = win->_curx + win->_begx;
952261Sarnold 	}
96*2287Sarnold 	retval = OK;
97*2287Sarnold ret:
982261Sarnold 	_win = NULL;
992261Sarnold 	fflush(stdout);
100*2287Sarnold 	return retval;
1012261Sarnold }
1022261Sarnold 
1032261Sarnold /*
1042261Sarnold  * make a change on the screen
1052261Sarnold  */
106*2287Sarnold STATIC
1072261Sarnold makech(win, wy)
1082261Sarnold reg WINDOW	*win;
1092261Sarnold short		wy;
1102261Sarnold {
1112261Sarnold 	reg char	*nsp, *csp, *ce;
1122261Sarnold 	reg short	wx, lch, y;
1132261Sarnold 	reg int		nlsp, clsp;	/* last space in lines		*/
1142261Sarnold 
1152261Sarnold 	wx = win->_firstch[wy];
1162261Sarnold 	y = wy + win->_begy;
1172261Sarnold 	lch = win->_lastch[wy];
118*2287Sarnold 	if (curwin)
119*2287Sarnold 		csp = " ";
120*2287Sarnold 	else
121*2287Sarnold 		csp = &curscr->_y[wy + win->_begy][wx + win->_begx];
1222261Sarnold 	nsp = &win->_y[wy][wx];
123*2287Sarnold 	if (CE && !curwin) {
1242261Sarnold 		for (ce = &win->_y[wy][win->_maxx - 1]; *ce == ' '; ce--)
1252261Sarnold 			if (ce <= win->_y[wy])
1262261Sarnold 				break;
1272261Sarnold 		nlsp = ce - win->_y[wy];
1282261Sarnold 	}
129*2287Sarnold 	if (!curwin)
130*2287Sarnold 		ce = CE;
131*2287Sarnold 	else
132*2287Sarnold 		ce = NULL;
1332261Sarnold 	while (wx <= lch) {
1342261Sarnold 		if (*nsp != *csp) {
1352261Sarnold 			mvcur(ly, lx, y, wx + win->_begx);
1362261Sarnold # ifdef DEBUG
1372261Sarnold 			fprintf(outf, "MAKECH: 1: wx = %d, lx = %d\n", wx, lx);
1382261Sarnold # endif
1392261Sarnold 			ly = y;
1402261Sarnold 			lx = wx + win->_begx;
1412261Sarnold 			while (*nsp != *csp && wx <= lch) {
142*2287Sarnold 				if (ce != NULL && wx >= nlsp && *nsp == ' ') {
1432261Sarnold 					/*
1442261Sarnold 					 * check for clear to end-of-line
1452261Sarnold 					 */
1462261Sarnold 					ce = &curscr->_y[ly][COLS - 1];
1472261Sarnold 					while (*ce == ' ')
1482261Sarnold 						if (ce-- <= csp)
1492261Sarnold 							break;
1502261Sarnold 					clsp = ce - curscr->_y[ly] - win->_begx;
1512261Sarnold # ifdef DEBUG
1522261Sarnold 					fprintf(outf, "MAKECH: clsp = %d, nlsp = %d\n", clsp, nlsp);
1532261Sarnold # endif
1542261Sarnold 					if (clsp - nlsp >= strlen(CE)
1552261Sarnold 					    && clsp < win->_maxx) {
1562261Sarnold # ifdef DEBUG
1572261Sarnold 						fprintf(outf, "MAKECH: using CE\n");
1582261Sarnold # endif
1592261Sarnold 						_puts(CE);
1602261Sarnold 						lx = wx + win->_begx;
1612261Sarnold 						while (wx++ <= clsp)
1622261Sarnold 							*csp++ = ' ';
1632261Sarnold 						goto ret;
1642261Sarnold 					}
1652261Sarnold 					ce = NULL;
1662261Sarnold 				}
1672261Sarnold 				/*
1682261Sarnold 				 * enter/exit standout mode as appropriate
1692261Sarnold 				 */
1702261Sarnold 				if (SO && (*nsp&_STANDOUT) != (curscr->_flags&_STANDOUT)) {
1712261Sarnold 					if (*nsp & _STANDOUT) {
1722261Sarnold 						_puts(SO);
1732261Sarnold 						curscr->_flags |= _STANDOUT;
1742261Sarnold 					}
1752261Sarnold 					else {
1762261Sarnold 						_puts(SE);
1772261Sarnold 						curscr->_flags &= ~_STANDOUT;
1782261Sarnold 					}
1792261Sarnold 				}
1802261Sarnold 				wx++;
1812261Sarnold 				if (wx >= win->_maxx && wy == win->_maxy)
182*2287Sarnold 					if (win->_scroll) {
183*2287Sarnold 					    if ((win->_flags&(_ENDLINE|_STANDOUT)) == (_ENDLINE|_STANDOUT))
184*2287Sarnold 						if (!MS) {
185*2287Sarnold 							_puts(SE);
186*2287Sarnold 							win->_flags &= ~_STANDOUT;
1872261Sarnold 						}
188*2287Sarnold 					    if (!curwin)
189*2287Sarnold 						putchar((*csp = *nsp) & 0177);
190*2287Sarnold 					    else
191*2287Sarnold 						putchar(*nsp & 0177);
192*2287Sarnold 					    scroll(win);
193*2287Sarnold 					    if (win->_flags&_FULLWIN && !curwin)
194*2287Sarnold 						scroll(curscr);
195*2287Sarnold 					    ly = win->_begy+win->_cury;
196*2287Sarnold 					    lx = win->_begx+win->_curx;
197*2287Sarnold 					    return OK;
198*2287Sarnold 					}
199*2287Sarnold 					else if (win->_flags&_SCROLLWIN) {
200*2287Sarnold 					    lx = --wx;
201*2287Sarnold 					    return ERR;
202*2287Sarnold 					}
203*2287Sarnold 				if (!curwin)
204*2287Sarnold 					putchar((*csp++ = *nsp) & 0177);
205*2287Sarnold 				else
206*2287Sarnold 					putchar(*nsp & 0177);
2072261Sarnold 				if (UC && (*nsp & _STANDOUT)) {
2082261Sarnold 					putchar('\b');
2092261Sarnold 					_puts(UC);
2102261Sarnold 				}
2112261Sarnold 				nsp++;
2122261Sarnold 			}
2132261Sarnold # ifdef DEBUG
2142261Sarnold 			fprintf(outf, "MAKECH: 2: wx = %d, lx = %d\n", wx, lx);
2152261Sarnold # endif
2162261Sarnold 			if (lx == wx + win->_begx)	/* if no change */
2172261Sarnold 				break;
2182261Sarnold 			lx = wx + win->_begx;
2192261Sarnold 		}
2202261Sarnold 		else if (wx < lch)
2212261Sarnold 			while (*nsp == *csp) {
222*2287Sarnold 				nsp++;
223*2287Sarnold 				if (!curwin)
224*2287Sarnold 					csp++;
2252261Sarnold 				++wx;
2262261Sarnold 			}
2272261Sarnold 		else
2282261Sarnold 			break;
2292261Sarnold # ifdef DEBUG
2302261Sarnold 		fprintf(outf, "MAKECH: 3: wx = %d, lx = %d\n", wx, lx);
2312261Sarnold # endif
2322261Sarnold 	}
2332261Sarnold ret:
2342261Sarnold 	if ((win->_flags & _STANDOUT) && !MS) {
2352261Sarnold 		_puts(SE);
2362261Sarnold 		win->_flags &= ~_STANDOUT;
2372261Sarnold 	}
2382261Sarnold 	return OK;
2392261Sarnold }
240