xref: /csrg-svn/lib/libcurses/refresh.c (revision 19893)
12261Sarnold /*
22261Sarnold  * make the current screen look like "win" over the area coverd by
32261Sarnold  * win.
42261Sarnold  *
5*19893Sbloom  * @(#)refresh.c	1.9 (Berkeley) 05/01/85
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;
27*19893Sbloom 	reg WINDOW	*orig;
282261Sarnold 
292261Sarnold 	/*
302261Sarnold 	 * make sure were in visual state
312261Sarnold 	 */
322261Sarnold 	if (_endwin) {
332261Sarnold 		_puts(VS);
342261Sarnold 		_puts(TI);
352261Sarnold 		_endwin = FALSE;
362261Sarnold 	}
372287Sarnold 
382287Sarnold 	/*
392287Sarnold 	 * initialize loop parameters
402287Sarnold 	 */
412287Sarnold 
422287Sarnold 	ly = curscr->_cury;
432287Sarnold 	lx = curscr->_curx;
442287Sarnold 	wy = 0;
452287Sarnold 	_win = win;
462287Sarnold 	curwin = (win == curscr);
472287Sarnold 
482287Sarnold 	if (win->_clear || curscr->_clear || curwin) {
492261Sarnold 		if ((win->_flags & _FULLWIN) || curscr->_clear) {
502261Sarnold 			_puts(CL);
5112358Sarnold 			ly = 0;
5212358Sarnold 			lx = 0;
5312358Sarnold 			if (!curwin) {
5412358Sarnold 				curscr->_clear = FALSE;
5512358Sarnold 				curscr->_cury = 0;
5612358Sarnold 				curscr->_curx = 0;
572287Sarnold 				werase(curscr);
5812358Sarnold 			}
592261Sarnold 			touchwin(win);
602261Sarnold 		}
612261Sarnold 		win->_clear = FALSE;
622261Sarnold 	}
632261Sarnold 	if (!CA) {
642261Sarnold 		if (win->_curx != 0)
65*19893Sbloom 			_putchar('\n');
662287Sarnold 		if (!curwin)
672287Sarnold 			werase(curscr);
682261Sarnold 	}
692261Sarnold # ifdef DEBUG
702287Sarnold 	fprintf(outf, "REFRESH(%0.2o): curwin = %d\n", win, curwin);
712261Sarnold 	fprintf(outf, "REFRESH:\n\tfirstch\tlastch\n");
722261Sarnold # endif
732261Sarnold 	for (wy = 0; wy < win->_maxy; wy++) {
742261Sarnold # ifdef DEBUG
75*19893Sbloom 		fprintf(outf, "%d\t%d\t%d\n", wy, win->_firstch[wy],
76*19893Sbloom 			win->_lastch[wy]);
772261Sarnold # endif
782261Sarnold 		if (win->_firstch[wy] != _NOCHANGE)
792261Sarnold 			if (makech(win, wy) == ERR)
802261Sarnold 				return ERR;
81*19893Sbloom 			else {
82*19893Sbloom 				if (win->_firstch[wy] >= win->_ch_off)
83*19893Sbloom 					win->_firstch[wy] = win->_maxx +
84*19893Sbloom 							    win->_ch_off;
85*19893Sbloom 				if (win->_lastch[wy] < win->_maxx +
86*19893Sbloom 						       win->_ch_off)
87*19893Sbloom 					win->_lastch[wy] = win->_ch_off;
88*19893Sbloom 				if (win->_lastch[wy] < win->_firstch[wy])
89*19893Sbloom 					win->_firstch[wy] = _NOCHANGE;
90*19893Sbloom 			}
91*19893Sbloom # ifdef DEBUG
92*19893Sbloom 		fprintf(outf, "\t%d\t%d\n", win->_firstch[wy],
93*19893Sbloom 			win->_lastch[wy]);
94*19893Sbloom # endif
952261Sarnold 	}
96*19893Sbloom 
9712358Sarnold 	if (win == curscr)
9812358Sarnold 		domvcur(ly, lx, win->_cury, win->_curx);
99*19893Sbloom 	else {
100*19893Sbloom 		if (win->_leave) {
101*19893Sbloom 			curscr->_cury = ly;
102*19893Sbloom 			curscr->_curx = lx;
103*19893Sbloom 			ly -= win->_begy;
104*19893Sbloom 			lx -= win->_begx;
105*19893Sbloom 			if (ly >= 0 && ly < win->_maxy && lx >= 0 &&
106*19893Sbloom 			    lx < win->_maxx) {
107*19893Sbloom 				win->_cury = ly;
108*19893Sbloom 				win->_curx = lx;
109*19893Sbloom 			}
110*19893Sbloom 			else
111*19893Sbloom 				win->_cury = win->_curx = 0;
1122261Sarnold 		}
113*19893Sbloom 		else {
114*19893Sbloom 			domvcur(ly, lx, win->_cury + win->_begy,
115*19893Sbloom 				win->_curx + win->_begx);
116*19893Sbloom 			curscr->_cury = win->_cury + win->_begy;
117*19893Sbloom 			curscr->_curx = win->_curx + win->_begx;
118*19893Sbloom 		}
1192261Sarnold 	}
1202287Sarnold 	retval = OK;
1212287Sarnold ret:
1222261Sarnold 	_win = NULL;
1232261Sarnold 	fflush(stdout);
1242287Sarnold 	return retval;
1252261Sarnold }
1262261Sarnold 
1272261Sarnold /*
1282261Sarnold  * make a change on the screen
1292261Sarnold  */
1302287Sarnold STATIC
1312261Sarnold makech(win, wy)
1322261Sarnold reg WINDOW	*win;
1332261Sarnold short		wy;
1342261Sarnold {
1352261Sarnold 	reg char	*nsp, *csp, *ce;
1362261Sarnold 	reg short	wx, lch, y;
1372261Sarnold 	reg int		nlsp, clsp;	/* last space in lines		*/
1382261Sarnold 
139*19893Sbloom 	wx = win->_firstch[wy] - win->_ch_off;
140*19893Sbloom 	if (wx >= win->_maxx)
141*19893Sbloom 		return OK;
142*19893Sbloom 	else if (wx < 0)
143*19893Sbloom 		wx = 0;
144*19893Sbloom 	lch = win->_lastch[wy] - win->_ch_off;
145*19893Sbloom 	if (lch < 0)
146*19893Sbloom 		return OK;
147*19893Sbloom 	else if (lch >= win->_maxx)
148*19893Sbloom 		lch = win->_maxx - 1;;
1492261Sarnold 	y = wy + win->_begy;
150*19893Sbloom 
1512287Sarnold 	if (curwin)
1522287Sarnold 		csp = " ";
1532287Sarnold 	else
1542287Sarnold 		csp = &curscr->_y[wy + win->_begy][wx + win->_begx];
155*19893Sbloom 
1562261Sarnold 	nsp = &win->_y[wy][wx];
1572287Sarnold 	if (CE && !curwin) {
1582261Sarnold 		for (ce = &win->_y[wy][win->_maxx - 1]; *ce == ' '; ce--)
1592261Sarnold 			if (ce <= win->_y[wy])
1602261Sarnold 				break;
1612261Sarnold 		nlsp = ce - win->_y[wy];
1622261Sarnold 	}
163*19893Sbloom 
1642287Sarnold 	if (!curwin)
1652287Sarnold 		ce = CE;
1662287Sarnold 	else
1672287Sarnold 		ce = NULL;
168*19893Sbloom 
1692261Sarnold 	while (wx <= lch) {
1702261Sarnold 		if (*nsp != *csp) {
17111736Sarnold 			domvcur(ly, lx, y, wx + win->_begx);
1722261Sarnold # ifdef DEBUG
1732261Sarnold 			fprintf(outf, "MAKECH: 1: wx = %d, lx = %d\n", wx, lx);
1742261Sarnold # endif
1752261Sarnold 			ly = y;
1762261Sarnold 			lx = wx + win->_begx;
1772261Sarnold 			while (*nsp != *csp && wx <= lch) {
1782287Sarnold 				if (ce != NULL && wx >= nlsp && *nsp == ' ') {
1792261Sarnold 					/*
1802261Sarnold 					 * check for clear to end-of-line
1812261Sarnold 					 */
1822261Sarnold 					ce = &curscr->_y[ly][COLS - 1];
1832261Sarnold 					while (*ce == ' ')
1842261Sarnold 						if (ce-- <= csp)
1852261Sarnold 							break;
1862261Sarnold 					clsp = ce - curscr->_y[ly] - win->_begx;
1872261Sarnold # ifdef DEBUG
1882261Sarnold 					fprintf(outf, "MAKECH: clsp = %d, nlsp = %d\n", clsp, nlsp);
1892261Sarnold # endif
1902261Sarnold 					if (clsp - nlsp >= strlen(CE)
1912261Sarnold 					    && clsp < win->_maxx) {
1922261Sarnold # ifdef DEBUG
1932261Sarnold 						fprintf(outf, "MAKECH: using CE\n");
1942261Sarnold # endif
1952261Sarnold 						_puts(CE);
1962261Sarnold 						lx = wx + win->_begx;
1972261Sarnold 						while (wx++ <= clsp)
1982261Sarnold 							*csp++ = ' ';
199*19893Sbloom 						return OK;
2002261Sarnold 					}
2012261Sarnold 					ce = NULL;
2022261Sarnold 				}
2032261Sarnold 				/*
2042261Sarnold 				 * enter/exit standout mode as appropriate
2052261Sarnold 				 */
2062261Sarnold 				if (SO && (*nsp&_STANDOUT) != (curscr->_flags&_STANDOUT)) {
2072261Sarnold 					if (*nsp & _STANDOUT) {
2082261Sarnold 						_puts(SO);
2092261Sarnold 						curscr->_flags |= _STANDOUT;
2102261Sarnold 					}
2112261Sarnold 					else {
2122261Sarnold 						_puts(SE);
2132261Sarnold 						curscr->_flags &= ~_STANDOUT;
2142261Sarnold 					}
2152261Sarnold 				}
2162261Sarnold 				wx++;
2172906Sarnold 				if (wx >= win->_maxx && wy == win->_maxy - 1)
2182287Sarnold 					if (win->_scroll) {
21911736Sarnold 					    if ((curscr->_flags&_STANDOUT) &&
22011736Sarnold 					        (win->_flags & _ENDLINE))
22111736Sarnold 						    if (!MS) {
22211736Sarnold 							_puts(SE);
22311736Sarnold 							curscr->_flags &= ~_STANDOUT;
22411736Sarnold 						    }
2252287Sarnold 					    if (!curwin)
226*19893Sbloom 						_putchar((*csp = *nsp) & 0177);
2272287Sarnold 					    else
228*19893Sbloom 						_putchar(*nsp & 0177);
2292287Sarnold 					    if (win->_flags&_FULLWIN && !curwin)
2302287Sarnold 						scroll(curscr);
2312287Sarnold 					    ly = win->_begy+win->_cury;
2322287Sarnold 					    lx = win->_begx+win->_curx;
2332287Sarnold 					    return OK;
2342287Sarnold 					}
2352287Sarnold 					else if (win->_flags&_SCROLLWIN) {
2362287Sarnold 					    lx = --wx;
2372287Sarnold 					    return ERR;
2382287Sarnold 					}
2392287Sarnold 				if (!curwin)
240*19893Sbloom 					_putchar((*csp++ = *nsp) & 0177);
2412287Sarnold 				else
242*19893Sbloom 					_putchar(*nsp & 0177);
243*19893Sbloom # ifdef FULLDEBUG
244*19893Sbloom 				fprintf(outf,
245*19893Sbloom 					"MAKECH:putchar(%c)\n", *nsp & 0177);
246*19893Sbloom # endif
2472261Sarnold 				if (UC && (*nsp & _STANDOUT)) {
248*19893Sbloom 					_putchar('\b');
2492261Sarnold 					_puts(UC);
2502261Sarnold 				}
2512261Sarnold 				nsp++;
2522261Sarnold 			}
2532261Sarnold # ifdef DEBUG
2542261Sarnold 			fprintf(outf, "MAKECH: 2: wx = %d, lx = %d\n", wx, lx);
2552261Sarnold # endif
2562261Sarnold 			if (lx == wx + win->_begx)	/* if no change */
2572261Sarnold 				break;
2582261Sarnold 			lx = wx + win->_begx;
2592261Sarnold 		}
2602261Sarnold 		else if (wx < lch)
261*19893Sbloom 			while (*nsp == *csp && wx < lch) {
2622287Sarnold 				nsp++;
2632287Sarnold 				if (!curwin)
2642287Sarnold 					csp++;
2652261Sarnold 				++wx;
2662261Sarnold 			}
2672261Sarnold 		else
2682261Sarnold 			break;
2692261Sarnold # ifdef DEBUG
2702261Sarnold 		fprintf(outf, "MAKECH: 3: wx = %d, lx = %d\n", wx, lx);
2712261Sarnold # endif
2722261Sarnold 	}
27311736Sarnold 	return OK;
27411736Sarnold }
27511736Sarnold 
27611736Sarnold /*
27711736Sarnold  * perform a mvcur, leaving standout mode if necessary
27811736Sarnold  */
279*19893Sbloom STATIC
28011736Sarnold domvcur(oy, ox, ny, nx)
28111736Sarnold int	oy, ox, ny, nx; {
28211736Sarnold 
28311736Sarnold 	if (curscr->_flags & _STANDOUT && !MS) {
2842261Sarnold 		_puts(SE);
28511736Sarnold 		curscr->_flags &= ~_STANDOUT;
2862261Sarnold 	}
28711736Sarnold 	mvcur(oy, ox, ny, nx);
2882261Sarnold }
289