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