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: }

Defined functions

domvcur defined in line 299; used 3 times
makech defined in line 138; used 1 times
  • in line 87
wrefresh defined in line 30; used 84 times

Defined variables

lx defined in line 24; used 21 times
ly defined in line 24; used 15 times
sccsid defined in line 8; never used

Defined macros

STATIC defined in line 21; used 4 times
Last modified: 1985-06-08
Generated: 2016-12-26
Generated by src2html V0.67
page hit count: 1726
Valid CSS Valid XHTML 1.0 Strict