|
|
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.