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