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