|
|
1.1 root 1: /*
2: * Copyright (c) 1981 Regents of the University of California.
3: * All rights reserved.
4: *
5: * Redistribution and use in source and binary forms are permitted
6: * provided that: (1) source distributions retain this entire copyright
7: * notice and comment, and (2) distributions including binaries display
8: * the following acknowledgement: ``This product includes software
9: * developed by the University of California, Berkeley and its contributors''
10: * in the documentation or other materials provided with the distribution
11: * and in all advertising materials mentioning features or use of this
12: * software. Neither the name of the University nor the names of its
13: * contributors may be used to endorse or promote products derived
14: * from this software without specific prior written permission.
15: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
16: * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
17: * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
18: */
19:
20: #ifndef lint
21: static char sccsid[] = "@(#)refresh.c 5.4 (Berkeley) 6/1/90";
22: #endif /* not lint */
23:
24: /*
25: * make the current screen look like "win" over the area coverd by
26: * win.
27: */
28:
29: # include "curses.ext"
30:
31: # ifdef DEBUG
32: # define STATIC
33: # else
34: # define STATIC static
35: # endif
36:
37: STATIC short ly, lx;
38:
39: STATIC bool curwin;
40:
41: WINDOW *_win = NULL;
42:
43: wrefresh(win)
44: reg WINDOW *win;
45: {
46: reg short wy;
47: reg int retval;
48: reg WINDOW *orig;
49:
50: /*
51: * make sure were in visual state
52: */
53: if (_endwin) {
54: _puts(VS);
55: _puts(TI);
56: _endwin = FALSE;
57: }
58:
59: /*
60: * initialize loop parameters
61: */
62:
63: ly = curscr->_cury;
64: lx = curscr->_curx;
65: wy = 0;
66: _win = win;
67: curwin = (win == curscr);
68:
69: if (win->_clear || curscr->_clear || curwin) {
70: if ((win->_flags & _FULLWIN) || curscr->_clear) {
71: _puts(CL);
72: ly = 0;
73: lx = 0;
74: if (!curwin) {
75: curscr->_clear = FALSE;
76: curscr->_cury = 0;
77: curscr->_curx = 0;
78: werase(curscr);
79: }
80: touchwin(win);
81: }
82: win->_clear = FALSE;
83: }
84: if (!CA) {
85: if (win->_curx != 0)
86: _putchar('\n');
87: if (!curwin)
88: werase(curscr);
89: }
90: # ifdef DEBUG
91: fprintf(outf, "REFRESH(%0.2o): curwin = %d\n", win, curwin);
92: fprintf(outf, "REFRESH:\n\tfirstch\tlastch\n");
93: # endif
94: for (wy = 0; wy < win->_maxy; wy++) {
95: # ifdef DEBUG
96: fprintf(outf, "%d\t%d\t%d\n", wy, win->_firstch[wy],
97: win->_lastch[wy]);
98: # endif
99: if (win->_firstch[wy] != _NOCHANGE)
100: if (makech(win, wy) == ERR)
101: return ERR;
102: else {
103: if (win->_firstch[wy] >= win->_ch_off)
104: win->_firstch[wy] = win->_maxx +
105: win->_ch_off;
106: if (win->_lastch[wy] < win->_maxx +
107: win->_ch_off)
108: win->_lastch[wy] = win->_ch_off;
109: if (win->_lastch[wy] < win->_firstch[wy])
110: win->_firstch[wy] = _NOCHANGE;
111: }
112: # ifdef DEBUG
113: fprintf(outf, "\t%d\t%d\n", win->_firstch[wy],
114: win->_lastch[wy]);
115: # endif
116: }
117:
118: if (win == curscr)
119: domvcur(ly, lx, win->_cury, win->_curx);
120: else {
121: if (win->_leave) {
122: curscr->_cury = ly;
123: curscr->_curx = lx;
124: ly -= win->_begy;
125: lx -= win->_begx;
126: if (ly >= 0 && ly < win->_maxy && lx >= 0 &&
127: lx < win->_maxx) {
128: win->_cury = ly;
129: win->_curx = lx;
130: }
131: else
132: win->_cury = win->_curx = 0;
133: }
134: else {
135: domvcur(ly, lx, win->_cury + win->_begy,
136: win->_curx + win->_begx);
137: curscr->_cury = win->_cury + win->_begy;
138: curscr->_curx = win->_curx + win->_begx;
139: }
140: }
141: retval = OK;
142: ret:
143: _win = NULL;
144: fflush(stdout);
145: return retval;
146: }
147:
148: /*
149: * make a change on the screen
150: */
151: STATIC
152: makech(win, wy)
153: reg WINDOW *win;
154: short wy;
155: {
156: reg char *nsp, *csp, *ce;
157: reg short wx, lch, y;
158: reg int nlsp, clsp; /* last space in lines */
159:
160: wx = win->_firstch[wy] - win->_ch_off;
161: if (wx >= win->_maxx)
162: return OK;
163: else if (wx < 0)
164: wx = 0;
165: lch = win->_lastch[wy] - win->_ch_off;
166: if (lch < 0)
167: return OK;
168: else if (lch >= win->_maxx)
169: lch = win->_maxx - 1;;
170: y = wy + win->_begy;
171:
172: if (curwin)
173: csp = " ";
174: else
175: csp = &curscr->_y[wy + win->_begy][wx + win->_begx];
176:
177: nsp = &win->_y[wy][wx];
178: if (CE && !curwin) {
179: for (ce = &win->_y[wy][win->_maxx - 1]; *ce == ' '; ce--)
180: if (ce <= win->_y[wy])
181: break;
182: nlsp = ce - win->_y[wy];
183: }
184:
185: if (!curwin)
186: ce = CE;
187: else
188: ce = NULL;
189:
190: while (wx <= lch) {
191: if (*nsp != *csp) {
192: domvcur(ly, lx, y, wx + win->_begx);
193: # ifdef DEBUG
194: fprintf(outf, "MAKECH: 1: wx = %d, lx = %d\n", wx, lx);
195: # endif
196: ly = y;
197: lx = wx + win->_begx;
198: while (*nsp != *csp && wx <= lch) {
199: if (ce != NULL && wx >= nlsp && *nsp == ' ') {
200: /*
201: * check for clear to end-of-line
202: */
203: ce = &curscr->_y[ly][COLS - 1];
204: while (*ce == ' ')
205: if (ce-- <= csp)
206: break;
207: clsp = ce - curscr->_y[ly] - win->_begx;
208: # ifdef DEBUG
209: fprintf(outf, "MAKECH: clsp = %d, nlsp = %d\n", clsp, nlsp);
210: # endif
211: if (clsp - nlsp >= strlen(CE)
212: && clsp < win->_maxx) {
213: # ifdef DEBUG
214: fprintf(outf, "MAKECH: using CE\n");
215: # endif
216: _puts(CE);
217: lx = wx + win->_begx;
218: while (wx++ <= clsp)
219: *csp++ = ' ';
220: return OK;
221: }
222: ce = NULL;
223: }
224: /*
225: * enter/exit standout mode as appropriate
226: */
227: if (SO && (*nsp&_STANDOUT) != (curscr->_flags&_STANDOUT)) {
228: if (*nsp & _STANDOUT) {
229: _puts(SO);
230: curscr->_flags |= _STANDOUT;
231: }
232: else {
233: _puts(SE);
234: curscr->_flags &= ~_STANDOUT;
235: }
236: }
237: wx++;
238: if (wx >= win->_maxx && wy == win->_maxy - 1)
239: if (win->_scroll) {
240: if ((curscr->_flags&_STANDOUT) &&
241: (win->_flags & _ENDLINE))
242: if (!MS) {
243: _puts(SE);
244: curscr->_flags &= ~_STANDOUT;
245: }
246: if (!curwin)
247: _putchar((*csp = *nsp) & 0177);
248: else
249: _putchar(*nsp & 0177);
250: if (win->_flags&_FULLWIN && !curwin)
251: scroll(curscr);
252: ly = win->_begy+win->_cury;
253: lx = win->_begx+win->_curx;
254: return OK;
255: }
256: else if (win->_flags&_SCROLLWIN) {
257: lx = --wx;
258: return ERR;
259: }
260: if (!curwin)
261: _putchar((*csp++ = *nsp) & 0177);
262: else
263: _putchar(*nsp & 0177);
264: # ifdef FULLDEBUG
265: fprintf(outf,
266: "MAKECH:putchar(%c)\n", *nsp & 0177);
267: # endif
268: if (UC && (*nsp & _STANDOUT)) {
269: _putchar('\b');
270: _puts(UC);
271: }
272: nsp++;
273: }
274: # ifdef DEBUG
275: fprintf(outf, "MAKECH: 2: wx = %d, lx = %d\n", wx, lx);
276: # endif
277: if (lx == wx + win->_begx) /* if no change */
278: break;
279: lx = wx + win->_begx;
280: if (lx >= COLS && AM) {
281: lx = 0;
282: ly++;
283: /*
284: * xn glitch: chomps a newline after auto-wrap.
285: * we just feed it now and forget about it.
286: */
287: if (XN) {
288: _putchar('\n');
289: _putchar('\r');
290: }
291: }
292: }
293: else if (wx <= lch)
294: while (*nsp == *csp && wx <= lch) {
295: nsp++;
296: if (!curwin)
297: csp++;
298: ++wx;
299: }
300: else
301: break;
302: # ifdef DEBUG
303: fprintf(outf, "MAKECH: 3: wx = %d, lx = %d\n", wx, lx);
304: # endif
305: }
306: return OK;
307: }
308:
309: /*
310: * perform a mvcur, leaving standout mode if necessary
311: */
312: STATIC
313: domvcur(oy, ox, ny, nx)
314: int oy, ox, ny, nx; {
315:
316: if (curscr->_flags & _STANDOUT && !MS) {
317: _puts(SE);
318: curscr->_flags &= ~_STANDOUT;
319: }
320: mvcur(oy, ox, ny, nx);
321: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.