xref: /csrg-svn/lib/libcurses/refresh.c (revision 12358)
12261Sarnold /*
22261Sarnold  * make the current screen look like "win" over the area coverd by
32261Sarnold  * win.
42261Sarnold  *
5*12358Sarnold  * 05/10/83 (Berkeley) @(#)refresh.c	1.7
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);
50*12358Sarnold 			ly = 0;
51*12358Sarnold 			lx = 0;
52*12358Sarnold 			if (!curwin) {
53*12358Sarnold 				curscr->_clear = FALSE;
54*12358Sarnold 				curscr->_cury = 0;
55*12358Sarnold 				curscr->_curx = 0;
562287Sarnold 				werase(curscr);
57*12358Sarnold 			}
582261Sarnold 			touchwin(win);
592261Sarnold 		}
602261Sarnold 		win->_clear = FALSE;
612261Sarnold 	}
622261Sarnold 	if (!CA) {
632261Sarnold 		if (win->_curx != 0)
642261Sarnold 			putchar('\n');
652287Sarnold 		if (!curwin)
662287Sarnold 			werase(curscr);
672261Sarnold 	}
682261Sarnold # ifdef DEBUG
692287Sarnold 	fprintf(outf, "REFRESH(%0.2o): curwin = %d\n", win, curwin);
702261Sarnold 	fprintf(outf, "REFRESH:\n\tfirstch\tlastch\n");
712261Sarnold # endif
722261Sarnold 	for (wy = 0; wy < win->_maxy; wy++) {
732261Sarnold # ifdef DEBUG
742261Sarnold 		fprintf(outf, "%d\t%d\t%d\n", wy, win->_firstch[wy], win->_lastch[wy]);
752261Sarnold # endif
762261Sarnold 		if (win->_firstch[wy] != _NOCHANGE)
772261Sarnold 			if (makech(win, wy) == ERR)
782261Sarnold 				return ERR;
792261Sarnold 			else
802261Sarnold 				win->_firstch[wy] = _NOCHANGE;
812261Sarnold 	}
82*12358Sarnold 	if (win == curscr)
83*12358Sarnold 		domvcur(ly, lx, win->_cury, win->_curx);
84*12358Sarnold 	else if (win->_leave) {
852261Sarnold 		curscr->_cury = ly;
862261Sarnold 		curscr->_curx = lx;
872261Sarnold 		ly -= win->_begy;
882261Sarnold 		lx -= win->_begx;
892261Sarnold 		if (ly >= 0 && ly < win->_maxy && lx >= 0 && lx < win->_maxx) {
902261Sarnold 			win->_cury = ly;
912261Sarnold 			win->_curx = lx;
922261Sarnold 		}
932261Sarnold 		else
942261Sarnold 			win->_cury = win->_curx = 0;
952261Sarnold 	}
962261Sarnold 	else {
9711736Sarnold 		domvcur(ly, lx, win->_cury+win->_begy, win->_curx+win->_begx);
982261Sarnold 		curscr->_cury = win->_cury + win->_begy;
992261Sarnold 		curscr->_curx = win->_curx + win->_begx;
1002261Sarnold 	}
1012287Sarnold 	retval = OK;
1022287Sarnold ret:
1032261Sarnold 	_win = NULL;
1042261Sarnold 	fflush(stdout);
1052287Sarnold 	return retval;
1062261Sarnold }
1072261Sarnold 
1082261Sarnold /*
1092261Sarnold  * make a change on the screen
1102261Sarnold  */
1112287Sarnold STATIC
1122261Sarnold makech(win, wy)
1132261Sarnold reg WINDOW	*win;
1142261Sarnold short		wy;
1152261Sarnold {
1162261Sarnold 	reg char	*nsp, *csp, *ce;
1172261Sarnold 	reg short	wx, lch, y;
1182261Sarnold 	reg int		nlsp, clsp;	/* last space in lines		*/
1192261Sarnold 
1202261Sarnold 	wx = win->_firstch[wy];
1212261Sarnold 	y = wy + win->_begy;
1222261Sarnold 	lch = win->_lastch[wy];
1232287Sarnold 	if (curwin)
1242287Sarnold 		csp = " ";
1252287Sarnold 	else
1262287Sarnold 		csp = &curscr->_y[wy + win->_begy][wx + win->_begx];
1272261Sarnold 	nsp = &win->_y[wy][wx];
1282287Sarnold 	if (CE && !curwin) {
1292261Sarnold 		for (ce = &win->_y[wy][win->_maxx - 1]; *ce == ' '; ce--)
1302261Sarnold 			if (ce <= win->_y[wy])
1312261Sarnold 				break;
1322261Sarnold 		nlsp = ce - win->_y[wy];
1332261Sarnold 	}
1342287Sarnold 	if (!curwin)
1352287Sarnold 		ce = CE;
1362287Sarnold 	else
1372287Sarnold 		ce = NULL;
1382261Sarnold 	while (wx <= lch) {
1392261Sarnold 		if (*nsp != *csp) {
14011736Sarnold 			domvcur(ly, lx, y, wx + win->_begx);
1412261Sarnold # ifdef DEBUG
1422261Sarnold 			fprintf(outf, "MAKECH: 1: wx = %d, lx = %d\n", wx, lx);
1432261Sarnold # endif
1442261Sarnold 			ly = y;
1452261Sarnold 			lx = wx + win->_begx;
1462261Sarnold 			while (*nsp != *csp && wx <= lch) {
1472287Sarnold 				if (ce != NULL && wx >= nlsp && *nsp == ' ') {
1482261Sarnold 					/*
1492261Sarnold 					 * check for clear to end-of-line
1502261Sarnold 					 */
1512261Sarnold 					ce = &curscr->_y[ly][COLS - 1];
1522261Sarnold 					while (*ce == ' ')
1532261Sarnold 						if (ce-- <= csp)
1542261Sarnold 							break;
1552261Sarnold 					clsp = ce - curscr->_y[ly] - win->_begx;
1562261Sarnold # ifdef DEBUG
1572261Sarnold 					fprintf(outf, "MAKECH: clsp = %d, nlsp = %d\n", clsp, nlsp);
1582261Sarnold # endif
1592261Sarnold 					if (clsp - nlsp >= strlen(CE)
1602261Sarnold 					    && clsp < win->_maxx) {
1612261Sarnold # ifdef DEBUG
1622261Sarnold 						fprintf(outf, "MAKECH: using CE\n");
1632261Sarnold # endif
1642261Sarnold 						_puts(CE);
1652261Sarnold 						lx = wx + win->_begx;
1662261Sarnold 						while (wx++ <= clsp)
1672261Sarnold 							*csp++ = ' ';
1682261Sarnold 						goto ret;
1692261Sarnold 					}
1702261Sarnold 					ce = NULL;
1712261Sarnold 				}
1722261Sarnold 				/*
1732261Sarnold 				 * enter/exit standout mode as appropriate
1742261Sarnold 				 */
1752261Sarnold 				if (SO && (*nsp&_STANDOUT) != (curscr->_flags&_STANDOUT)) {
1762261Sarnold 					if (*nsp & _STANDOUT) {
1772261Sarnold 						_puts(SO);
1782261Sarnold 						curscr->_flags |= _STANDOUT;
1792261Sarnold 					}
1802261Sarnold 					else {
1812261Sarnold 						_puts(SE);
1822261Sarnold 						curscr->_flags &= ~_STANDOUT;
1832261Sarnold 					}
1842261Sarnold 				}
1852261Sarnold 				wx++;
1862906Sarnold 				if (wx >= win->_maxx && wy == win->_maxy - 1)
1872287Sarnold 					if (win->_scroll) {
18811736Sarnold 					    if ((curscr->_flags&_STANDOUT) &&
18911736Sarnold 					        (win->_flags & _ENDLINE))
19011736Sarnold 						    if (!MS) {
19111736Sarnold 							_puts(SE);
19211736Sarnold 							curscr->_flags &= ~_STANDOUT;
19311736Sarnold 						    }
1942287Sarnold 					    if (!curwin)
1952287Sarnold 						putchar((*csp = *nsp) & 0177);
1962287Sarnold 					    else
1972287Sarnold 						putchar(*nsp & 0177);
1982287Sarnold 					    scroll(win);
1992287Sarnold 					    if (win->_flags&_FULLWIN && !curwin)
2002287Sarnold 						scroll(curscr);
2012287Sarnold 					    ly = win->_begy+win->_cury;
2022287Sarnold 					    lx = win->_begx+win->_curx;
2032287Sarnold 					    return OK;
2042287Sarnold 					}
2052287Sarnold 					else if (win->_flags&_SCROLLWIN) {
2062287Sarnold 					    lx = --wx;
2072287Sarnold 					    return ERR;
2082287Sarnold 					}
2092287Sarnold 				if (!curwin)
2102287Sarnold 					putchar((*csp++ = *nsp) & 0177);
2112287Sarnold 				else
2122287Sarnold 					putchar(*nsp & 0177);
2132261Sarnold 				if (UC && (*nsp & _STANDOUT)) {
2142261Sarnold 					putchar('\b');
2152261Sarnold 					_puts(UC);
2162261Sarnold 				}
2172261Sarnold 				nsp++;
2182261Sarnold 			}
2192261Sarnold # ifdef DEBUG
2202261Sarnold 			fprintf(outf, "MAKECH: 2: wx = %d, lx = %d\n", wx, lx);
2212261Sarnold # endif
2222261Sarnold 			if (lx == wx + win->_begx)	/* if no change */
2232261Sarnold 				break;
2242261Sarnold 			lx = wx + win->_begx;
2252261Sarnold 		}
2262261Sarnold 		else if (wx < lch)
2272261Sarnold 			while (*nsp == *csp) {
2282287Sarnold 				nsp++;
2292287Sarnold 				if (!curwin)
2302287Sarnold 					csp++;
2312261Sarnold 				++wx;
2322261Sarnold 			}
2332261Sarnold 		else
2342261Sarnold 			break;
2352261Sarnold # ifdef DEBUG
2362261Sarnold 		fprintf(outf, "MAKECH: 3: wx = %d, lx = %d\n", wx, lx);
2372261Sarnold # endif
2382261Sarnold 	}
2392261Sarnold ret:
24011736Sarnold 	return OK;
24111736Sarnold }
24211736Sarnold 
24311736Sarnold /*
24411736Sarnold  * perform a mvcur, leaving standout mode if necessary
24511736Sarnold  */
24611736Sarnold static
24711736Sarnold domvcur(oy, ox, ny, nx)
24811736Sarnold int	oy, ox, ny, nx; {
24911736Sarnold 
250*12358Sarnold 	if (ny == 0 && nx == 0)
251*12358Sarnold 		abort();
25211736Sarnold 	if (curscr->_flags & _STANDOUT && !MS) {
2532261Sarnold 		_puts(SE);
25411736Sarnold 		curscr->_flags &= ~_STANDOUT;
2552261Sarnold 	}
25611736Sarnold 	mvcur(oy, ox, ny, nx);
2572261Sarnold }
258