xref: /csrg-svn/lib/libcurses/refresh.c (revision 2261)
1*2261Sarnold /*
2*2261Sarnold  * make the current screen look like "win" over the area coverd by
3*2261Sarnold  * win.
4*2261Sarnold  *
5*2261Sarnold  * 01/26/81 (Berkeley) @(#)refresh.c	1.1
6*2261Sarnold  */
7*2261Sarnold 
8*2261Sarnold # include	"curses.ext"
9*2261Sarnold 
10*2261Sarnold # ifndef DEBUG
11*2261Sarnold static short	ly, lx;
12*2261Sarnold # else
13*2261Sarnold short		ly, lx;
14*2261Sarnold # endif
15*2261Sarnold 
16*2261Sarnold WINDOW	*_win = NULL;
17*2261Sarnold 
18*2261Sarnold wrefresh(win)
19*2261Sarnold reg WINDOW	*win;
20*2261Sarnold {
21*2261Sarnold 	reg short	wy;
22*2261Sarnold 
23*2261Sarnold 	/*
24*2261Sarnold 	 * make sure were in visual state
25*2261Sarnold 	 */
26*2261Sarnold 	if (_endwin) {
27*2261Sarnold 		_puts(VS);
28*2261Sarnold 		_puts(TI);
29*2261Sarnold 		_endwin = FALSE;
30*2261Sarnold 	}
31*2261Sarnold 	if (win->_clear || curscr->_clear) {
32*2261Sarnold 		if ((win->_flags & _FULLWIN) || curscr->_clear) {
33*2261Sarnold 			_puts(CL);
34*2261Sarnold 			curscr->_curx = curscr->_cury = 0;
35*2261Sarnold 			curscr->_clear = FALSE;
36*2261Sarnold 			werase(curscr);
37*2261Sarnold 			touchwin(win);
38*2261Sarnold 		}
39*2261Sarnold 		win->_clear = FALSE;
40*2261Sarnold 	}
41*2261Sarnold 	if (!CA) {
42*2261Sarnold 		if (win->_curx != 0)
43*2261Sarnold 			putchar('\n');
44*2261Sarnold 		werase(curscr);
45*2261Sarnold 	}
46*2261Sarnold # ifdef DEBUG
47*2261Sarnold 	fprintf(outf, "REFRESH:\n\tfirstch\tlastch\n");
48*2261Sarnold # endif
49*2261Sarnold 	ly = curscr->_cury;
50*2261Sarnold 	lx = curscr->_curx;
51*2261Sarnold 	wy = 0;
52*2261Sarnold 	_win = win;
53*2261Sarnold 	for (wy = 0; wy < win->_maxy; wy++) {
54*2261Sarnold # ifdef DEBUG
55*2261Sarnold 		fprintf(outf, "%d\t%d\t%d\n", wy, win->_firstch[wy], win->_lastch[wy]);
56*2261Sarnold # endif
57*2261Sarnold 		if (win->_firstch[wy] != _NOCHANGE)
58*2261Sarnold 			if (makech(win, wy) == ERR)
59*2261Sarnold 				return ERR;
60*2261Sarnold 			else
61*2261Sarnold 				win->_firstch[wy] = _NOCHANGE;
62*2261Sarnold 	}
63*2261Sarnold 	if (win->_leave) {
64*2261Sarnold 		curscr->_cury = ly;
65*2261Sarnold 		curscr->_curx = lx;
66*2261Sarnold 		ly -= win->_begy;
67*2261Sarnold 		lx -= win->_begx;
68*2261Sarnold 		if (ly >= 0 && ly < win->_maxy && lx >= 0 && lx < win->_maxx) {
69*2261Sarnold 			win->_cury = ly;
70*2261Sarnold 			win->_curx = lx;
71*2261Sarnold 		}
72*2261Sarnold 		else
73*2261Sarnold 			win->_cury = win->_curx = 0;
74*2261Sarnold 	}
75*2261Sarnold 	else {
76*2261Sarnold 		mvcur(ly, lx, win->_cury + win->_begy, win->_curx + win->_begx);
77*2261Sarnold 		curscr->_cury = win->_cury + win->_begy;
78*2261Sarnold 		curscr->_curx = win->_curx + win->_begx;
79*2261Sarnold 	}
80*2261Sarnold 	_win = NULL;
81*2261Sarnold 	fflush(stdout);
82*2261Sarnold 	return OK;
83*2261Sarnold }
84*2261Sarnold 
85*2261Sarnold /*
86*2261Sarnold  * make a change on the screen
87*2261Sarnold  */
88*2261Sarnold # ifndef DEBUG
89*2261Sarnold static
90*2261Sarnold # endif
91*2261Sarnold makech(win, wy)
92*2261Sarnold reg WINDOW	*win;
93*2261Sarnold short		wy;
94*2261Sarnold {
95*2261Sarnold 	reg char	*nsp, *csp, *ce;
96*2261Sarnold 	reg short	wx, lch, y;
97*2261Sarnold 	reg int		nlsp, clsp;	/* last space in lines		*/
98*2261Sarnold 
99*2261Sarnold 	wx = win->_firstch[wy];
100*2261Sarnold 	y = wy + win->_begy;
101*2261Sarnold 	lch = win->_lastch[wy];
102*2261Sarnold 	csp = &curscr->_y[wy + win->_begy][wx + win->_begx];
103*2261Sarnold 	nsp = &win->_y[wy][wx];
104*2261Sarnold 	if (CE) {
105*2261Sarnold 		for (ce = &win->_y[wy][win->_maxx - 1]; *ce == ' '; ce--)
106*2261Sarnold 			if (ce <= win->_y[wy])
107*2261Sarnold 				break;
108*2261Sarnold 		nlsp = ce - win->_y[wy];
109*2261Sarnold 	}
110*2261Sarnold 	ce = CE;
111*2261Sarnold 	while (wx <= lch) {
112*2261Sarnold 		if (*nsp != *csp) {
113*2261Sarnold 			mvcur(ly, lx, y, wx + win->_begx);
114*2261Sarnold # ifdef DEBUG
115*2261Sarnold 			fprintf(outf, "MAKECH: 1: wx = %d, lx = %d\n", wx, lx);
116*2261Sarnold # endif
117*2261Sarnold 			ly = y;
118*2261Sarnold 			lx = wx + win->_begx;
119*2261Sarnold 			while (*nsp != *csp && wx <= lch) {
120*2261Sarnold 				if (ce && wx >= nlsp && *nsp == ' ') {
121*2261Sarnold 					/*
122*2261Sarnold 					 * check for clear to end-of-line
123*2261Sarnold 					 */
124*2261Sarnold 					ce = &curscr->_y[ly][COLS - 1];
125*2261Sarnold 					while (*ce == ' ')
126*2261Sarnold 						if (ce-- <= csp)
127*2261Sarnold 							break;
128*2261Sarnold 					clsp = ce - curscr->_y[ly] - win->_begx;
129*2261Sarnold # ifdef DEBUG
130*2261Sarnold 					fprintf(outf, "MAKECH: clsp = %d, nlsp = %d\n", clsp, nlsp);
131*2261Sarnold # endif
132*2261Sarnold 					if (clsp - nlsp >= strlen(CE)
133*2261Sarnold 					    && clsp < win->_maxx) {
134*2261Sarnold # ifdef DEBUG
135*2261Sarnold 						fprintf(outf, "MAKECH: using CE\n");
136*2261Sarnold # endif
137*2261Sarnold 						_puts(CE);
138*2261Sarnold 						lx = wx + win->_begx;
139*2261Sarnold 						while (wx++ <= clsp)
140*2261Sarnold 							*csp++ = ' ';
141*2261Sarnold 						goto ret;
142*2261Sarnold 					}
143*2261Sarnold 					ce = NULL;
144*2261Sarnold 				}
145*2261Sarnold 				/*
146*2261Sarnold 				 * enter/exit standout mode as appropriate
147*2261Sarnold 				 */
148*2261Sarnold 				if (SO && (*nsp&_STANDOUT) != (curscr->_flags&_STANDOUT)) {
149*2261Sarnold 					if (*nsp & _STANDOUT) {
150*2261Sarnold 						_puts(SO);
151*2261Sarnold 						curscr->_flags |= _STANDOUT;
152*2261Sarnold 					}
153*2261Sarnold 					else {
154*2261Sarnold 						_puts(SE);
155*2261Sarnold 						curscr->_flags &= ~_STANDOUT;
156*2261Sarnold 					}
157*2261Sarnold 				}
158*2261Sarnold 				wx++;
159*2261Sarnold 				if (wx >= win->_maxx && wy == win->_maxy)
160*2261Sarnold 						if (win->_scroll) {
161*2261Sarnold 						    if ((win->_flags&(_ENDLINE|_STANDOUT)) == (_ENDLINE|_STANDOUT))
162*2261Sarnold 							if (!MS) {
163*2261Sarnold 								_puts(SE);
164*2261Sarnold 								win->_flags &= ~_STANDOUT;
165*2261Sarnold 							}
166*2261Sarnold 						    putchar((*csp = *nsp) & 0177);
167*2261Sarnold 						    scroll(win);
168*2261Sarnold 						    if (win->_flags&_FULLWIN)
169*2261Sarnold 							scroll(curscr);
170*2261Sarnold 						    ly = win->_begy+win->_cury;
171*2261Sarnold 						    lx = win->_begx+win->_curx;
172*2261Sarnold 						    return OK;
173*2261Sarnold 						}
174*2261Sarnold 						else if (win->_flags&_SCROLLWIN) {
175*2261Sarnold 						    lx = --wx;
176*2261Sarnold 						    return ERR;
177*2261Sarnold 						}
178*2261Sarnold 				putchar((*csp++ = *nsp) & 0177);
179*2261Sarnold 				if (UC && (*nsp & _STANDOUT)) {
180*2261Sarnold 					putchar('\b');
181*2261Sarnold 					_puts(UC);
182*2261Sarnold 				}
183*2261Sarnold 				nsp++;
184*2261Sarnold 			}
185*2261Sarnold # ifdef DEBUG
186*2261Sarnold 			fprintf(outf, "MAKECH: 2: wx = %d, lx = %d\n", wx, lx);
187*2261Sarnold # endif
188*2261Sarnold 			if (lx == wx + win->_begx)	/* if no change */
189*2261Sarnold 				break;
190*2261Sarnold 			lx = wx + win->_begx;
191*2261Sarnold 		}
192*2261Sarnold 		else if (wx < lch)
193*2261Sarnold 			while (*nsp == *csp) {
194*2261Sarnold 				nsp++, csp++;
195*2261Sarnold 				++wx;
196*2261Sarnold 			}
197*2261Sarnold 		else
198*2261Sarnold 			break;
199*2261Sarnold # ifdef DEBUG
200*2261Sarnold 		fprintf(outf, "MAKECH: 3: wx = %d, lx = %d\n", wx, lx);
201*2261Sarnold # endif
202*2261Sarnold 	}
203*2261Sarnold ret:
204*2261Sarnold 	if ((win->_flags & _STANDOUT) && !MS) {
205*2261Sarnold 		_puts(SE);
206*2261Sarnold 		win->_flags &= ~_STANDOUT;
207*2261Sarnold 	}
208*2261Sarnold 	return OK;
209*2261Sarnold }
210