xref: /csrg-svn/lib/libcurses/refresh.c (revision 2906)
12261Sarnold /*
22261Sarnold  * make the current screen look like "win" over the area coverd by
32261Sarnold  * win.
42261Sarnold  *
5*2906Sarnold  * 03/05/81 (Berkeley) @(#)refresh.c	1.4
62261Sarnold  */
72261Sarnold 
82261Sarnold # include	"curses.ext"
92261Sarnold 
102287Sarnold # ifdef DEBUG
112287Sarnold # define	STATIC
122261Sarnold # else
132287Sarnold # define	STATIC	static
142261Sarnold # endif
152261Sarnold 
162287Sarnold STATIC short	ly, lx;
172287Sarnold 
182287Sarnold STATIC bool	curwin;
192287Sarnold 
202261Sarnold WINDOW	*_win = NULL;
212261Sarnold 
222261Sarnold wrefresh(win)
232261Sarnold reg WINDOW	*win;
242261Sarnold {
252261Sarnold 	reg short	wy;
262287Sarnold 	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 	}
362287Sarnold 
372287Sarnold 	/*
382287Sarnold 	 * initialize loop parameters
392287Sarnold 	 */
402287Sarnold 
412287Sarnold 	ly = curscr->_cury;
422287Sarnold 	lx = curscr->_curx;
432287Sarnold 	wy = 0;
442287Sarnold 	_win = win;
452287Sarnold 	curwin = (win == curscr);
462287Sarnold 
472287Sarnold 	if (win->_clear || curscr->_clear || curwin) {
482261Sarnold 		if ((win->_flags & _FULLWIN) || curscr->_clear) {
492261Sarnold 			_puts(CL);
502464Sarnold 			ly = lx = curscr->_curx = curscr->_cury = 0;
512464Sarnold 			curscr->_clear = FALSE;
522464Sarnold 			if (!curwin)
532287Sarnold 				werase(curscr);
542261Sarnold 			touchwin(win);
552261Sarnold 		}
562261Sarnold 		win->_clear = FALSE;
572261Sarnold 	}
582261Sarnold 	if (!CA) {
592261Sarnold 		if (win->_curx != 0)
602261Sarnold 			putchar('\n');
612287Sarnold 		if (!curwin)
622287Sarnold 			werase(curscr);
632261Sarnold 	}
642261Sarnold # ifdef DEBUG
652287Sarnold 	fprintf(outf, "REFRESH(%0.2o): curwin = %d\n", win, curwin);
662261Sarnold 	fprintf(outf, "REFRESH:\n\tfirstch\tlastch\n");
672261Sarnold # endif
682261Sarnold 	for (wy = 0; wy < win->_maxy; wy++) {
692261Sarnold # ifdef DEBUG
702261Sarnold 		fprintf(outf, "%d\t%d\t%d\n", wy, win->_firstch[wy], win->_lastch[wy]);
712261Sarnold # endif
722261Sarnold 		if (win->_firstch[wy] != _NOCHANGE)
732261Sarnold 			if (makech(win, wy) == ERR)
742261Sarnold 				return ERR;
752261Sarnold 			else
762261Sarnold 				win->_firstch[wy] = _NOCHANGE;
772261Sarnold 	}
782261Sarnold 	if (win->_leave) {
792261Sarnold 		curscr->_cury = ly;
802261Sarnold 		curscr->_curx = lx;
812261Sarnold 		ly -= win->_begy;
822261Sarnold 		lx -= win->_begx;
832261Sarnold 		if (ly >= 0 && ly < win->_maxy && lx >= 0 && lx < win->_maxx) {
842261Sarnold 			win->_cury = ly;
852261Sarnold 			win->_curx = lx;
862261Sarnold 		}
872261Sarnold 		else
882261Sarnold 			win->_cury = win->_curx = 0;
892261Sarnold 	}
902261Sarnold 	else {
912261Sarnold 		mvcur(ly, lx, win->_cury + win->_begy, win->_curx + win->_begx);
922261Sarnold 		curscr->_cury = win->_cury + win->_begy;
932261Sarnold 		curscr->_curx = win->_curx + win->_begx;
942261Sarnold 	}
952287Sarnold 	retval = OK;
962287Sarnold ret:
972261Sarnold 	_win = NULL;
982261Sarnold 	fflush(stdout);
992287Sarnold 	return retval;
1002261Sarnold }
1012261Sarnold 
1022261Sarnold /*
1032261Sarnold  * make a change on the screen
1042261Sarnold  */
1052287Sarnold STATIC
1062261Sarnold makech(win, wy)
1072261Sarnold reg WINDOW	*win;
1082261Sarnold short		wy;
1092261Sarnold {
1102261Sarnold 	reg char	*nsp, *csp, *ce;
1112261Sarnold 	reg short	wx, lch, y;
1122261Sarnold 	reg int		nlsp, clsp;	/* last space in lines		*/
1132261Sarnold 
1142261Sarnold 	wx = win->_firstch[wy];
1152261Sarnold 	y = wy + win->_begy;
1162261Sarnold 	lch = win->_lastch[wy];
1172287Sarnold 	if (curwin)
1182287Sarnold 		csp = " ";
1192287Sarnold 	else
1202287Sarnold 		csp = &curscr->_y[wy + win->_begy][wx + win->_begx];
1212261Sarnold 	nsp = &win->_y[wy][wx];
1222287Sarnold 	if (CE && !curwin) {
1232261Sarnold 		for (ce = &win->_y[wy][win->_maxx - 1]; *ce == ' '; ce--)
1242261Sarnold 			if (ce <= win->_y[wy])
1252261Sarnold 				break;
1262261Sarnold 		nlsp = ce - win->_y[wy];
1272261Sarnold 	}
1282287Sarnold 	if (!curwin)
1292287Sarnold 		ce = CE;
1302287Sarnold 	else
1312287Sarnold 		ce = NULL;
1322261Sarnold 	while (wx <= lch) {
1332261Sarnold 		if (*nsp != *csp) {
1342261Sarnold 			mvcur(ly, lx, y, wx + win->_begx);
1352261Sarnold # ifdef DEBUG
1362261Sarnold 			fprintf(outf, "MAKECH: 1: wx = %d, lx = %d\n", wx, lx);
1372261Sarnold # endif
1382261Sarnold 			ly = y;
1392261Sarnold 			lx = wx + win->_begx;
1402261Sarnold 			while (*nsp != *csp && wx <= lch) {
1412287Sarnold 				if (ce != NULL && wx >= nlsp && *nsp == ' ') {
1422261Sarnold 					/*
1432261Sarnold 					 * check for clear to end-of-line
1442261Sarnold 					 */
1452261Sarnold 					ce = &curscr->_y[ly][COLS - 1];
1462261Sarnold 					while (*ce == ' ')
1472261Sarnold 						if (ce-- <= csp)
1482261Sarnold 							break;
1492261Sarnold 					clsp = ce - curscr->_y[ly] - win->_begx;
1502261Sarnold # ifdef DEBUG
1512261Sarnold 					fprintf(outf, "MAKECH: clsp = %d, nlsp = %d\n", clsp, nlsp);
1522261Sarnold # endif
1532261Sarnold 					if (clsp - nlsp >= strlen(CE)
1542261Sarnold 					    && clsp < win->_maxx) {
1552261Sarnold # ifdef DEBUG
1562261Sarnold 						fprintf(outf, "MAKECH: using CE\n");
1572261Sarnold # endif
1582261Sarnold 						_puts(CE);
1592261Sarnold 						lx = wx + win->_begx;
1602261Sarnold 						while (wx++ <= clsp)
1612261Sarnold 							*csp++ = ' ';
1622261Sarnold 						goto ret;
1632261Sarnold 					}
1642261Sarnold 					ce = NULL;
1652261Sarnold 				}
1662261Sarnold 				/*
1672261Sarnold 				 * enter/exit standout mode as appropriate
1682261Sarnold 				 */
1692261Sarnold 				if (SO && (*nsp&_STANDOUT) != (curscr->_flags&_STANDOUT)) {
1702261Sarnold 					if (*nsp & _STANDOUT) {
1712261Sarnold 						_puts(SO);
1722261Sarnold 						curscr->_flags |= _STANDOUT;
1732261Sarnold 					}
1742261Sarnold 					else {
1752261Sarnold 						_puts(SE);
1762261Sarnold 						curscr->_flags &= ~_STANDOUT;
1772261Sarnold 					}
1782261Sarnold 				}
1792261Sarnold 				wx++;
180*2906Sarnold 				if (wx >= win->_maxx && wy == win->_maxy - 1)
1812287Sarnold 					if (win->_scroll) {
1822287Sarnold 					    if ((win->_flags&(_ENDLINE|_STANDOUT)) == (_ENDLINE|_STANDOUT))
1832287Sarnold 						if (!MS) {
184*2906Sarnold 						    _puts(SE);
185*2906Sarnold 						    win->_flags &= ~_STANDOUT;
1862261Sarnold 						}
1872287Sarnold 					    if (!curwin)
1882287Sarnold 						putchar((*csp = *nsp) & 0177);
1892287Sarnold 					    else
1902287Sarnold 						putchar(*nsp & 0177);
1912287Sarnold 					    scroll(win);
1922287Sarnold 					    if (win->_flags&_FULLWIN && !curwin)
1932287Sarnold 						scroll(curscr);
1942287Sarnold 					    ly = win->_begy+win->_cury;
1952287Sarnold 					    lx = win->_begx+win->_curx;
1962287Sarnold 					    return OK;
1972287Sarnold 					}
1982287Sarnold 					else if (win->_flags&_SCROLLWIN) {
1992287Sarnold 					    lx = --wx;
2002287Sarnold 					    return ERR;
2012287Sarnold 					}
2022287Sarnold 				if (!curwin)
2032287Sarnold 					putchar((*csp++ = *nsp) & 0177);
2042287Sarnold 				else
2052287Sarnold 					putchar(*nsp & 0177);
2062261Sarnold 				if (UC && (*nsp & _STANDOUT)) {
2072261Sarnold 					putchar('\b');
2082261Sarnold 					_puts(UC);
2092261Sarnold 				}
2102261Sarnold 				nsp++;
2112261Sarnold 			}
2122261Sarnold # ifdef DEBUG
2132261Sarnold 			fprintf(outf, "MAKECH: 2: wx = %d, lx = %d\n", wx, lx);
2142261Sarnold # endif
2152261Sarnold 			if (lx == wx + win->_begx)	/* if no change */
2162261Sarnold 				break;
2172261Sarnold 			lx = wx + win->_begx;
2182261Sarnold 		}
2192261Sarnold 		else if (wx < lch)
2202261Sarnold 			while (*nsp == *csp) {
2212287Sarnold 				nsp++;
2222287Sarnold 				if (!curwin)
2232287Sarnold 					csp++;
2242261Sarnold 				++wx;
2252261Sarnold 			}
2262261Sarnold 		else
2272261Sarnold 			break;
2282261Sarnold # ifdef DEBUG
2292261Sarnold 		fprintf(outf, "MAKECH: 3: wx = %d, lx = %d\n", wx, lx);
2302261Sarnold # endif
2312261Sarnold 	}
2322261Sarnold ret:
2332261Sarnold 	if ((win->_flags & _STANDOUT) && !MS) {
2342261Sarnold 		_puts(SE);
2352261Sarnold 		win->_flags &= ~_STANDOUT;
2362261Sarnold 	}
2372261Sarnold 	return OK;
2382261Sarnold }
239