|
|
1.1 ! root 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 ! 8: static char sccsid[] = "@(#)refresh.c 5.1 (Berkeley) 6/7/85"; ! 9: #endif not lint ! 10: ! 11: /* ! 12: * make the current screen look like "win" over the area coverd by ! 13: * win. ! 14: */ ! 15: ! 16: # include "curses.ext" ! 17: ! 18: # ifdef DEBUG ! 19: # define STATIC ! 20: # else ! 21: # define STATIC static ! 22: # endif ! 23: ! 24: STATIC short ly, lx; ! 25: ! 26: STATIC bool curwin; ! 27: ! 28: WINDOW *_win = NULL; ! 29: ! 30: wrefresh(win) ! 31: reg WINDOW *win; ! 32: { ! 33: reg short wy; ! 34: reg int retval; ! 35: reg WINDOW *orig; ! 36: ! 37: /* ! 38: * make sure were in visual state ! 39: */ ! 40: if (_endwin) { ! 41: _puts(VS); ! 42: _puts(TI); ! 43: _endwin = FALSE; ! 44: } ! 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) { ! 57: if ((win->_flags & _FULLWIN) || curscr->_clear) { ! 58: _puts(CL); ! 59: ly = 0; ! 60: lx = 0; ! 61: if (!curwin) { ! 62: curscr->_clear = FALSE; ! 63: curscr->_cury = 0; ! 64: curscr->_curx = 0; ! 65: werase(curscr); ! 66: } ! 67: touchwin(win); ! 68: } ! 69: win->_clear = FALSE; ! 70: } ! 71: if (!CA) { ! 72: if (win->_curx != 0) ! 73: _putchar('\n'); ! 74: if (!curwin) ! 75: werase(curscr); ! 76: } ! 77: # ifdef DEBUG ! 78: fprintf(outf, "REFRESH(%0.2o): curwin = %d\n", win, curwin); ! 79: fprintf(outf, "REFRESH:\n\tfirstch\tlastch\n"); ! 80: # endif ! 81: for (wy = 0; wy < win->_maxy; wy++) { ! 82: # ifdef DEBUG ! 83: fprintf(outf, "%d\t%d\t%d\n", wy, win->_firstch[wy], ! 84: win->_lastch[wy]); ! 85: # endif ! 86: if (win->_firstch[wy] != _NOCHANGE) ! 87: if (makech(win, wy) == ERR) ! 88: return ERR; ! 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 ! 103: } ! 104: ! 105: if (win == curscr) ! 106: domvcur(ly, lx, win->_cury, win->_curx); ! 107: else { ! 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: } ! 127: } ! 128: retval = OK; ! 129: ret: ! 130: _win = NULL; ! 131: fflush(stdout); ! 132: return retval; ! 133: } ! 134: ! 135: /* ! 136: * make a change on the screen ! 137: */ ! 138: STATIC ! 139: makech(win, wy) ! 140: reg WINDOW *win; ! 141: short wy; ! 142: { ! 143: reg char *nsp, *csp, *ce; ! 144: reg short wx, lch, y; ! 145: reg int nlsp, clsp; /* last space in lines */ ! 146: ! 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;; ! 157: y = wy + win->_begy; ! 158: ! 159: if (curwin) ! 160: csp = " "; ! 161: else ! 162: csp = &curscr->_y[wy + win->_begy][wx + win->_begx]; ! 163: ! 164: nsp = &win->_y[wy][wx]; ! 165: if (CE && !curwin) { ! 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: } ! 171: ! 172: if (!curwin) ! 173: ce = CE; ! 174: else ! 175: ce = NULL; ! 176: ! 177: while (wx <= lch) { ! 178: if (*nsp != *csp) { ! 179: domvcur(ly, lx, y, wx + win->_begx); ! 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) { ! 186: if (ce != NULL && wx >= nlsp && *nsp == ' ') { ! 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++ = ' '; ! 207: return OK; ! 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++; ! 225: if (wx >= win->_maxx && wy == win->_maxy - 1) ! 226: if (win->_scroll) { ! 227: if ((curscr->_flags&_STANDOUT) && ! 228: (win->_flags & _ENDLINE)) ! 229: if (!MS) { ! 230: _puts(SE); ! 231: curscr->_flags &= ~_STANDOUT; ! 232: } ! 233: if (!curwin) ! 234: _putchar((*csp = *nsp) & 0177); ! 235: else ! 236: _putchar(*nsp & 0177); ! 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) ! 248: _putchar((*csp++ = *nsp) & 0177); ! 249: else ! 250: _putchar(*nsp & 0177); ! 251: # ifdef FULLDEBUG ! 252: fprintf(outf, ! 253: "MAKECH:putchar(%c)\n", *nsp & 0177); ! 254: # endif ! 255: if (UC && (*nsp & _STANDOUT)) { ! 256: _putchar('\b'); ! 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; ! 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: } ! 279: } ! 280: else if (wx <= lch) ! 281: while (*nsp == *csp && wx <= lch) { ! 282: nsp++; ! 283: if (!curwin) ! 284: csp++; ! 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: } ! 293: return OK; ! 294: } ! 295: ! 296: /* ! 297: * perform a mvcur, leaving standout mode if necessary ! 298: */ ! 299: STATIC ! 300: domvcur(oy, ox, ny, nx) ! 301: int oy, ox, ny, nx; { ! 302: ! 303: if (curscr->_flags & _STANDOUT && !MS) { ! 304: _puts(SE); ! 305: curscr->_flags &= ~_STANDOUT; ! 306: } ! 307: mvcur(oy, ox, ny, nx); ! 308: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.