document distributed with 4.2BSD
[unix-history] / usr / src / lib / libcurses / refresh.c
CommitLineData
c2affd4a
KM
1/*
2 * Copyright (c) 1980 Regents of the University of California.
3 * All rights reserved. The Berkeley software License Agreement
4 * specifies the terms and conditions for redistribution.
5 */
6
7#ifndef lint
8static char sccsid[] = "@(#)refresh.c 5.1 (Berkeley) %G%";
9#endif not lint
10
55bb1023
KA
11/*
12 * make the current screen look like "win" over the area coverd by
13 * win.
55bb1023
KA
14 */
15
16# include "curses.ext"
17
01bcb98c
KA
18# ifdef DEBUG
19# define STATIC
55bb1023 20# else
01bcb98c 21# define STATIC static
55bb1023
KA
22# endif
23
01bcb98c
KA
24STATIC short ly, lx;
25
26STATIC bool curwin;
27
55bb1023
KA
28WINDOW *_win = NULL;
29
30wrefresh(win)
31reg WINDOW *win;
32{
33 reg short wy;
01bcb98c 34 reg int retval;
7376ec5f 35 reg WINDOW *orig;
55bb1023
KA
36
37 /*
38 * make sure were in visual state
39 */
40 if (_endwin) {
41 _puts(VS);
42 _puts(TI);
43 _endwin = FALSE;
44 }
01bcb98c
KA
45
46 /*
47 * initialize loop parameters
48 */
49
50 ly = curscr->_cury;
51 lx = curscr->_curx;
52 wy = 0;
53 _win = win;
54 curwin = (win == curscr);
55
56 if (win->_clear || curscr->_clear || curwin) {
55bb1023
KA
57 if ((win->_flags & _FULLWIN) || curscr->_clear) {
58 _puts(CL);
524d237b
KA
59 ly = 0;
60 lx = 0;
61 if (!curwin) {
62 curscr->_clear = FALSE;
63 curscr->_cury = 0;
64 curscr->_curx = 0;
01bcb98c 65 werase(curscr);
524d237b 66 }
55bb1023
KA
67 touchwin(win);
68 }
69 win->_clear = FALSE;
70 }
71 if (!CA) {
72 if (win->_curx != 0)
7376ec5f 73 _putchar('\n');
01bcb98c
KA
74 if (!curwin)
75 werase(curscr);
55bb1023
KA
76 }
77# ifdef DEBUG
01bcb98c 78 fprintf(outf, "REFRESH(%0.2o): curwin = %d\n", win, curwin);
55bb1023
KA
79 fprintf(outf, "REFRESH:\n\tfirstch\tlastch\n");
80# endif
55bb1023
KA
81 for (wy = 0; wy < win->_maxy; wy++) {
82# ifdef DEBUG
7376ec5f
JB
83 fprintf(outf, "%d\t%d\t%d\n", wy, win->_firstch[wy],
84 win->_lastch[wy]);
55bb1023
KA
85# endif
86 if (win->_firstch[wy] != _NOCHANGE)
87 if (makech(win, wy) == ERR)
88 return ERR;
7376ec5f
JB
89 else {
90 if (win->_firstch[wy] >= win->_ch_off)
91 win->_firstch[wy] = win->_maxx +
92 win->_ch_off;
93 if (win->_lastch[wy] < win->_maxx +
94 win->_ch_off)
95 win->_lastch[wy] = win->_ch_off;
96 if (win->_lastch[wy] < win->_firstch[wy])
97 win->_firstch[wy] = _NOCHANGE;
98 }
99# ifdef DEBUG
100 fprintf(outf, "\t%d\t%d\n", win->_firstch[wy],
101 win->_lastch[wy]);
102# endif
55bb1023 103 }
7376ec5f 104
524d237b
KA
105 if (win == curscr)
106 domvcur(ly, lx, win->_cury, win->_curx);
55bb1023 107 else {
7376ec5f
JB
108 if (win->_leave) {
109 curscr->_cury = ly;
110 curscr->_curx = lx;
111 ly -= win->_begy;
112 lx -= win->_begx;
113 if (ly >= 0 && ly < win->_maxy && lx >= 0 &&
114 lx < win->_maxx) {
115 win->_cury = ly;
116 win->_curx = lx;
117 }
118 else
119 win->_cury = win->_curx = 0;
120 }
121 else {
122 domvcur(ly, lx, win->_cury + win->_begy,
123 win->_curx + win->_begx);
124 curscr->_cury = win->_cury + win->_begy;
125 curscr->_curx = win->_curx + win->_begx;
126 }
55bb1023 127 }
01bcb98c
KA
128 retval = OK;
129ret:
55bb1023
KA
130 _win = NULL;
131 fflush(stdout);
01bcb98c 132 return retval;
55bb1023
KA
133}
134
135/*
136 * make a change on the screen
137 */
01bcb98c 138STATIC
55bb1023
KA
139makech(win, wy)
140reg WINDOW *win;
141short wy;
142{
143 reg char *nsp, *csp, *ce;
144 reg short wx, lch, y;
145 reg int nlsp, clsp; /* last space in lines */
146
7376ec5f
JB
147 wx = win->_firstch[wy] - win->_ch_off;
148 if (wx >= win->_maxx)
149 return OK;
150 else if (wx < 0)
151 wx = 0;
152 lch = win->_lastch[wy] - win->_ch_off;
153 if (lch < 0)
154 return OK;
155 else if (lch >= win->_maxx)
156 lch = win->_maxx - 1;;
55bb1023 157 y = wy + win->_begy;
7376ec5f 158
01bcb98c
KA
159 if (curwin)
160 csp = " ";
161 else
162 csp = &curscr->_y[wy + win->_begy][wx + win->_begx];
7376ec5f 163
55bb1023 164 nsp = &win->_y[wy][wx];
01bcb98c 165 if (CE && !curwin) {
55bb1023
KA
166 for (ce = &win->_y[wy][win->_maxx - 1]; *ce == ' '; ce--)
167 if (ce <= win->_y[wy])
168 break;
169 nlsp = ce - win->_y[wy];
170 }
7376ec5f 171
01bcb98c
KA
172 if (!curwin)
173 ce = CE;
174 else
175 ce = NULL;
7376ec5f 176
55bb1023
KA
177 while (wx <= lch) {
178 if (*nsp != *csp) {
1fe7814b 179 domvcur(ly, lx, y, wx + win->_begx);
55bb1023
KA
180# ifdef DEBUG
181 fprintf(outf, "MAKECH: 1: wx = %d, lx = %d\n", wx, lx);
182# endif
183 ly = y;
184 lx = wx + win->_begx;
185 while (*nsp != *csp && wx <= lch) {
01bcb98c 186 if (ce != NULL && wx >= nlsp && *nsp == ' ') {
55bb1023
KA
187 /*
188 * check for clear to end-of-line
189 */
190 ce = &curscr->_y[ly][COLS - 1];
191 while (*ce == ' ')
192 if (ce-- <= csp)
193 break;
194 clsp = ce - curscr->_y[ly] - win->_begx;
195# ifdef DEBUG
196 fprintf(outf, "MAKECH: clsp = %d, nlsp = %d\n", clsp, nlsp);
197# endif
198 if (clsp - nlsp >= strlen(CE)
199 && clsp < win->_maxx) {
200# ifdef DEBUG
201 fprintf(outf, "MAKECH: using CE\n");
202# endif
203 _puts(CE);
204 lx = wx + win->_begx;
205 while (wx++ <= clsp)
206 *csp++ = ' ';
7376ec5f 207 return OK;
55bb1023
KA
208 }
209 ce = NULL;
210 }
211 /*
212 * enter/exit standout mode as appropriate
213 */
214 if (SO && (*nsp&_STANDOUT) != (curscr->_flags&_STANDOUT)) {
215 if (*nsp & _STANDOUT) {
216 _puts(SO);
217 curscr->_flags |= _STANDOUT;
218 }
219 else {
220 _puts(SE);
221 curscr->_flags &= ~_STANDOUT;
222 }
223 }
224 wx++;
3bd5da8b 225 if (wx >= win->_maxx && wy == win->_maxy - 1)
01bcb98c 226 if (win->_scroll) {
1fe7814b
KA
227 if ((curscr->_flags&_STANDOUT) &&
228 (win->_flags & _ENDLINE))
229 if (!MS) {
230 _puts(SE);
231 curscr->_flags &= ~_STANDOUT;
232 }
01bcb98c 233 if (!curwin)
7376ec5f 234 _putchar((*csp = *nsp) & 0177);
01bcb98c 235 else
7376ec5f 236 _putchar(*nsp & 0177);
01bcb98c
KA
237 if (win->_flags&_FULLWIN && !curwin)
238 scroll(curscr);
239 ly = win->_begy+win->_cury;
240 lx = win->_begx+win->_curx;
241 return OK;
242 }
243 else if (win->_flags&_SCROLLWIN) {
244 lx = --wx;
245 return ERR;
246 }
247 if (!curwin)
7376ec5f 248 _putchar((*csp++ = *nsp) & 0177);
01bcb98c 249 else
7376ec5f
JB
250 _putchar(*nsp & 0177);
251# ifdef FULLDEBUG
252 fprintf(outf,
253 "MAKECH:putchar(%c)\n", *nsp & 0177);
254# endif
55bb1023 255 if (UC && (*nsp & _STANDOUT)) {
7376ec5f 256 _putchar('\b');
55bb1023
KA
257 _puts(UC);
258 }
259 nsp++;
260 }
261# ifdef DEBUG
262 fprintf(outf, "MAKECH: 2: wx = %d, lx = %d\n", wx, lx);
263# endif
264 if (lx == wx + win->_begx) /* if no change */
265 break;
266 lx = wx + win->_begx;
072ff498
KM
267 if (lx >= COLS && AM) {
268 lx = 0;
269 ly++;
270 /*
271 * xn glitch: chomps a newline after auto-wrap.
272 * we just feed it now and forget about it.
273 */
274 if (XN) {
275 _putchar('\n');
276 _putchar('\r');
277 }
278 }
55bb1023 279 }
072ff498
KM
280 else if (wx <= lch)
281 while (*nsp == *csp && wx <= lch) {
01bcb98c
KA
282 nsp++;
283 if (!curwin)
284 csp++;
55bb1023
KA
285 ++wx;
286 }
287 else
288 break;
289# ifdef DEBUG
290 fprintf(outf, "MAKECH: 3: wx = %d, lx = %d\n", wx, lx);
291# endif
292 }
1fe7814b
KA
293 return OK;
294}
295
296/*
297 * perform a mvcur, leaving standout mode if necessary
298 */
7376ec5f 299STATIC
1fe7814b
KA
300domvcur(oy, ox, ny, nx)
301int oy, ox, ny, nx; {
302
303 if (curscr->_flags & _STANDOUT && !MS) {
55bb1023 304 _puts(SE);
1fe7814b 305 curscr->_flags &= ~_STANDOUT;
55bb1023 306 }
1fe7814b 307 mvcur(oy, ox, ny, nx);
55bb1023 308}