xref: /csrg-svn/lib/libcurses/refresh.c (revision 22791)
12261Sarnold /*
2*22791Smckusick  * Copyright (c) 1980 Regents of the University of California.
3*22791Smckusick  * All rights reserved.  The Berkeley software License Agreement
4*22791Smckusick  * specifies the terms and conditions for redistribution.
5*22791Smckusick  */
6*22791Smckusick 
7*22791Smckusick #ifndef lint
8*22791Smckusick static char sccsid[] = "@(#)refresh.c	5.1 (Berkeley) 06/07/85";
9*22791Smckusick #endif not lint
10*22791Smckusick 
11*22791Smckusick /*
122261Sarnold  * make the current screen look like "win" over the area coverd by
132261Sarnold  * win.
142261Sarnold  */
152261Sarnold 
162261Sarnold # include	"curses.ext"
172261Sarnold 
182287Sarnold # ifdef DEBUG
192287Sarnold # define	STATIC
202261Sarnold # else
212287Sarnold # define	STATIC	static
222261Sarnold # endif
232261Sarnold 
242287Sarnold STATIC short	ly, lx;
252287Sarnold 
262287Sarnold STATIC bool	curwin;
272287Sarnold 
282261Sarnold WINDOW	*_win = NULL;
292261Sarnold 
302261Sarnold wrefresh(win)
312261Sarnold reg WINDOW	*win;
322261Sarnold {
332261Sarnold 	reg short	wy;
342287Sarnold 	reg int		retval;
3519893Sbloom 	reg WINDOW	*orig;
362261Sarnold 
372261Sarnold 	/*
382261Sarnold 	 * make sure were in visual state
392261Sarnold 	 */
402261Sarnold 	if (_endwin) {
412261Sarnold 		_puts(VS);
422261Sarnold 		_puts(TI);
432261Sarnold 		_endwin = FALSE;
442261Sarnold 	}
452287Sarnold 
462287Sarnold 	/*
472287Sarnold 	 * initialize loop parameters
482287Sarnold 	 */
492287Sarnold 
502287Sarnold 	ly = curscr->_cury;
512287Sarnold 	lx = curscr->_curx;
522287Sarnold 	wy = 0;
532287Sarnold 	_win = win;
542287Sarnold 	curwin = (win == curscr);
552287Sarnold 
562287Sarnold 	if (win->_clear || curscr->_clear || curwin) {
572261Sarnold 		if ((win->_flags & _FULLWIN) || curscr->_clear) {
582261Sarnold 			_puts(CL);
5912358Sarnold 			ly = 0;
6012358Sarnold 			lx = 0;
6112358Sarnold 			if (!curwin) {
6212358Sarnold 				curscr->_clear = FALSE;
6312358Sarnold 				curscr->_cury = 0;
6412358Sarnold 				curscr->_curx = 0;
652287Sarnold 				werase(curscr);
6612358Sarnold 			}
672261Sarnold 			touchwin(win);
682261Sarnold 		}
692261Sarnold 		win->_clear = FALSE;
702261Sarnold 	}
712261Sarnold 	if (!CA) {
722261Sarnold 		if (win->_curx != 0)
7319893Sbloom 			_putchar('\n');
742287Sarnold 		if (!curwin)
752287Sarnold 			werase(curscr);
762261Sarnold 	}
772261Sarnold # ifdef DEBUG
782287Sarnold 	fprintf(outf, "REFRESH(%0.2o): curwin = %d\n", win, curwin);
792261Sarnold 	fprintf(outf, "REFRESH:\n\tfirstch\tlastch\n");
802261Sarnold # endif
812261Sarnold 	for (wy = 0; wy < win->_maxy; wy++) {
822261Sarnold # ifdef DEBUG
8319893Sbloom 		fprintf(outf, "%d\t%d\t%d\n", wy, win->_firstch[wy],
8419893Sbloom 			win->_lastch[wy]);
852261Sarnold # endif
862261Sarnold 		if (win->_firstch[wy] != _NOCHANGE)
872261Sarnold 			if (makech(win, wy) == ERR)
882261Sarnold 				return ERR;
8919893Sbloom 			else {
9019893Sbloom 				if (win->_firstch[wy] >= win->_ch_off)
9119893Sbloom 					win->_firstch[wy] = win->_maxx +
9219893Sbloom 							    win->_ch_off;
9319893Sbloom 				if (win->_lastch[wy] < win->_maxx +
9419893Sbloom 						       win->_ch_off)
9519893Sbloom 					win->_lastch[wy] = win->_ch_off;
9619893Sbloom 				if (win->_lastch[wy] < win->_firstch[wy])
9719893Sbloom 					win->_firstch[wy] = _NOCHANGE;
9819893Sbloom 			}
9919893Sbloom # ifdef DEBUG
10019893Sbloom 		fprintf(outf, "\t%d\t%d\n", win->_firstch[wy],
10119893Sbloom 			win->_lastch[wy]);
10219893Sbloom # endif
1032261Sarnold 	}
10419893Sbloom 
10512358Sarnold 	if (win == curscr)
10612358Sarnold 		domvcur(ly, lx, win->_cury, win->_curx);
10719893Sbloom 	else {
10819893Sbloom 		if (win->_leave) {
10919893Sbloom 			curscr->_cury = ly;
11019893Sbloom 			curscr->_curx = lx;
11119893Sbloom 			ly -= win->_begy;
11219893Sbloom 			lx -= win->_begx;
11319893Sbloom 			if (ly >= 0 && ly < win->_maxy && lx >= 0 &&
11419893Sbloom 			    lx < win->_maxx) {
11519893Sbloom 				win->_cury = ly;
11619893Sbloom 				win->_curx = lx;
11719893Sbloom 			}
11819893Sbloom 			else
11919893Sbloom 				win->_cury = win->_curx = 0;
1202261Sarnold 		}
12119893Sbloom 		else {
12219893Sbloom 			domvcur(ly, lx, win->_cury + win->_begy,
12319893Sbloom 				win->_curx + win->_begx);
12419893Sbloom 			curscr->_cury = win->_cury + win->_begy;
12519893Sbloom 			curscr->_curx = win->_curx + win->_begx;
12619893Sbloom 		}
1272261Sarnold 	}
1282287Sarnold 	retval = OK;
1292287Sarnold ret:
1302261Sarnold 	_win = NULL;
1312261Sarnold 	fflush(stdout);
1322287Sarnold 	return retval;
1332261Sarnold }
1342261Sarnold 
1352261Sarnold /*
1362261Sarnold  * make a change on the screen
1372261Sarnold  */
1382287Sarnold STATIC
1392261Sarnold makech(win, wy)
1402261Sarnold reg WINDOW	*win;
1412261Sarnold short		wy;
1422261Sarnold {
1432261Sarnold 	reg char	*nsp, *csp, *ce;
1442261Sarnold 	reg short	wx, lch, y;
1452261Sarnold 	reg int		nlsp, clsp;	/* last space in lines		*/
1462261Sarnold 
14719893Sbloom 	wx = win->_firstch[wy] - win->_ch_off;
14819893Sbloom 	if (wx >= win->_maxx)
14919893Sbloom 		return OK;
15019893Sbloom 	else if (wx < 0)
15119893Sbloom 		wx = 0;
15219893Sbloom 	lch = win->_lastch[wy] - win->_ch_off;
15319893Sbloom 	if (lch < 0)
15419893Sbloom 		return OK;
15519893Sbloom 	else if (lch >= win->_maxx)
15619893Sbloom 		lch = win->_maxx - 1;;
1572261Sarnold 	y = wy + win->_begy;
15819893Sbloom 
1592287Sarnold 	if (curwin)
1602287Sarnold 		csp = " ";
1612287Sarnold 	else
1622287Sarnold 		csp = &curscr->_y[wy + win->_begy][wx + win->_begx];
16319893Sbloom 
1642261Sarnold 	nsp = &win->_y[wy][wx];
1652287Sarnold 	if (CE && !curwin) {
1662261Sarnold 		for (ce = &win->_y[wy][win->_maxx - 1]; *ce == ' '; ce--)
1672261Sarnold 			if (ce <= win->_y[wy])
1682261Sarnold 				break;
1692261Sarnold 		nlsp = ce - win->_y[wy];
1702261Sarnold 	}
17119893Sbloom 
1722287Sarnold 	if (!curwin)
1732287Sarnold 		ce = CE;
1742287Sarnold 	else
1752287Sarnold 		ce = NULL;
17619893Sbloom 
1772261Sarnold 	while (wx <= lch) {
1782261Sarnold 		if (*nsp != *csp) {
17911736Sarnold 			domvcur(ly, lx, y, wx + win->_begx);
1802261Sarnold # ifdef DEBUG
1812261Sarnold 			fprintf(outf, "MAKECH: 1: wx = %d, lx = %d\n", wx, lx);
1822261Sarnold # endif
1832261Sarnold 			ly = y;
1842261Sarnold 			lx = wx + win->_begx;
1852261Sarnold 			while (*nsp != *csp && wx <= lch) {
1862287Sarnold 				if (ce != NULL && wx >= nlsp && *nsp == ' ') {
1872261Sarnold 					/*
1882261Sarnold 					 * check for clear to end-of-line
1892261Sarnold 					 */
1902261Sarnold 					ce = &curscr->_y[ly][COLS - 1];
1912261Sarnold 					while (*ce == ' ')
1922261Sarnold 						if (ce-- <= csp)
1932261Sarnold 							break;
1942261Sarnold 					clsp = ce - curscr->_y[ly] - win->_begx;
1952261Sarnold # ifdef DEBUG
1962261Sarnold 					fprintf(outf, "MAKECH: clsp = %d, nlsp = %d\n", clsp, nlsp);
1972261Sarnold # endif
1982261Sarnold 					if (clsp - nlsp >= strlen(CE)
1992261Sarnold 					    && clsp < win->_maxx) {
2002261Sarnold # ifdef DEBUG
2012261Sarnold 						fprintf(outf, "MAKECH: using CE\n");
2022261Sarnold # endif
2032261Sarnold 						_puts(CE);
2042261Sarnold 						lx = wx + win->_begx;
2052261Sarnold 						while (wx++ <= clsp)
2062261Sarnold 							*csp++ = ' ';
20719893Sbloom 						return OK;
2082261Sarnold 					}
2092261Sarnold 					ce = NULL;
2102261Sarnold 				}
2112261Sarnold 				/*
2122261Sarnold 				 * enter/exit standout mode as appropriate
2132261Sarnold 				 */
2142261Sarnold 				if (SO && (*nsp&_STANDOUT) != (curscr->_flags&_STANDOUT)) {
2152261Sarnold 					if (*nsp & _STANDOUT) {
2162261Sarnold 						_puts(SO);
2172261Sarnold 						curscr->_flags |= _STANDOUT;
2182261Sarnold 					}
2192261Sarnold 					else {
2202261Sarnold 						_puts(SE);
2212261Sarnold 						curscr->_flags &= ~_STANDOUT;
2222261Sarnold 					}
2232261Sarnold 				}
2242261Sarnold 				wx++;
2252906Sarnold 				if (wx >= win->_maxx && wy == win->_maxy - 1)
2262287Sarnold 					if (win->_scroll) {
22711736Sarnold 					    if ((curscr->_flags&_STANDOUT) &&
22811736Sarnold 					        (win->_flags & _ENDLINE))
22911736Sarnold 						    if (!MS) {
23011736Sarnold 							_puts(SE);
23111736Sarnold 							curscr->_flags &= ~_STANDOUT;
23211736Sarnold 						    }
2332287Sarnold 					    if (!curwin)
23419893Sbloom 						_putchar((*csp = *nsp) & 0177);
2352287Sarnold 					    else
23619893Sbloom 						_putchar(*nsp & 0177);
2372287Sarnold 					    if (win->_flags&_FULLWIN && !curwin)
2382287Sarnold 						scroll(curscr);
2392287Sarnold 					    ly = win->_begy+win->_cury;
2402287Sarnold 					    lx = win->_begx+win->_curx;
2412287Sarnold 					    return OK;
2422287Sarnold 					}
2432287Sarnold 					else if (win->_flags&_SCROLLWIN) {
2442287Sarnold 					    lx = --wx;
2452287Sarnold 					    return ERR;
2462287Sarnold 					}
2472287Sarnold 				if (!curwin)
24819893Sbloom 					_putchar((*csp++ = *nsp) & 0177);
2492287Sarnold 				else
25019893Sbloom 					_putchar(*nsp & 0177);
25119893Sbloom # ifdef FULLDEBUG
25219893Sbloom 				fprintf(outf,
25319893Sbloom 					"MAKECH:putchar(%c)\n", *nsp & 0177);
25419893Sbloom # endif
2552261Sarnold 				if (UC && (*nsp & _STANDOUT)) {
25619893Sbloom 					_putchar('\b');
2572261Sarnold 					_puts(UC);
2582261Sarnold 				}
2592261Sarnold 				nsp++;
2602261Sarnold 			}
2612261Sarnold # ifdef DEBUG
2622261Sarnold 			fprintf(outf, "MAKECH: 2: wx = %d, lx = %d\n", wx, lx);
2632261Sarnold # endif
2642261Sarnold 			if (lx == wx + win->_begx)	/* if no change */
2652261Sarnold 				break;
2662261Sarnold 			lx = wx + win->_begx;
26722789Smckusick 			if (lx >= COLS && AM) {
26822789Smckusick 				lx = 0;
26922789Smckusick 				ly++;
27022789Smckusick 				/*
27122789Smckusick 				 * xn glitch: chomps a newline after auto-wrap.
27222789Smckusick 				 * we just feed it now and forget about it.
27322789Smckusick 				 */
27422789Smckusick 				if (XN) {
27522789Smckusick 					_putchar('\n');
27622789Smckusick 					_putchar('\r');
27722789Smckusick 				}
27822789Smckusick 			}
2792261Sarnold 		}
28022789Smckusick 		else if (wx <= lch)
28122789Smckusick 			while (*nsp == *csp && wx <= lch) {
2822287Sarnold 				nsp++;
2832287Sarnold 				if (!curwin)
2842287Sarnold 					csp++;
2852261Sarnold 				++wx;
2862261Sarnold 			}
2872261Sarnold 		else
2882261Sarnold 			break;
2892261Sarnold # ifdef DEBUG
2902261Sarnold 		fprintf(outf, "MAKECH: 3: wx = %d, lx = %d\n", wx, lx);
2912261Sarnold # endif
2922261Sarnold 	}
29311736Sarnold 	return OK;
29411736Sarnold }
29511736Sarnold 
29611736Sarnold /*
29711736Sarnold  * perform a mvcur, leaving standout mode if necessary
29811736Sarnold  */
29919893Sbloom STATIC
30011736Sarnold domvcur(oy, ox, ny, nx)
30111736Sarnold int	oy, ox, ny, nx; {
30211736Sarnold 
30311736Sarnold 	if (curscr->_flags & _STANDOUT && !MS) {
3042261Sarnold 		_puts(SE);
30511736Sarnold 		curscr->_flags &= ~_STANDOUT;
3062261Sarnold 	}
30711736Sarnold 	mvcur(oy, ox, ny, nx);
3082261Sarnold }
309