1: /*
   2:  * make the current screen look like "win" over the area coverd by
   3:  * win.
   4:  *
   5:  * 5/12/83 (Berkeley) @(#)refresh.c	1.8
   6:  */
   7: 
   8: # include   "curses.ext"
   9: 
  10: # ifdef DEBUG
  11: # define    STATIC
  12: # else
  13: # define    STATIC  static
  14: # endif
  15: 
  16: STATIC short    ly, lx;
  17: 
  18: STATIC bool curwin;
  19: 
  20: WINDOW  *_win = NULL;
  21: 
  22: wrefresh(win)
  23: reg WINDOW  *win;
  24: {
  25:     reg short   wy;
  26:     reg int     retval;
  27: 
  28:     /*
  29: 	 * make sure were in visual state
  30: 	 */
  31:     if (_endwin) {
  32:         _puts(VS);
  33:         _puts(TI);
  34:         _endwin = FALSE;
  35:     }
  36: 
  37:     /*
  38: 	 * initialize loop parameters
  39: 	 */
  40: 
  41:     ly = curscr->_cury;
  42:     lx = curscr->_curx;
  43:     wy = 0;
  44:     _win = win;
  45:     curwin = (win == curscr);
  46: 
  47:     if (win->_clear || curscr->_clear || curwin) {
  48:         if ((win->_flags & _FULLWIN) || curscr->_clear) {
  49:             _puts(CL);
  50:             ly = 0;
  51:             lx = 0;
  52:             if (!curwin) {
  53:                 curscr->_clear = FALSE;
  54:                 curscr->_cury = 0;
  55:                 curscr->_curx = 0;
  56:                 werase(curscr);
  57:             }
  58:             touchwin(win);
  59:         }
  60:         win->_clear = FALSE;
  61:     }
  62:     if (!CA) {
  63:         if (win->_curx != 0)
  64:             putchar('\n');
  65:         if (!curwin)
  66:             werase(curscr);
  67:     }
  68: # ifdef DEBUG
  69:     fprintf(outf, "REFRESH(%0.2o): curwin = %d\n", win, curwin);
  70:     fprintf(outf, "REFRESH:\n\tfirstch\tlastch\n");
  71: # endif
  72:     for (wy = 0; wy < win->_maxy; wy++) {
  73: # ifdef DEBUG
  74:         fprintf(outf, "%d\t%d\t%d\n", wy, win->_firstch[wy], win->_lastch[wy]);
  75: # endif
  76:         if (win->_firstch[wy] != _NOCHANGE)
  77:             if (makech(win, wy) == ERR)
  78:                 return ERR;
  79:             else
  80:                 win->_firstch[wy] = _NOCHANGE;
  81:     }
  82:     if (win == curscr)
  83:         domvcur(ly, lx, win->_cury, win->_curx);
  84:     else if (win->_leave) {
  85:         curscr->_cury = ly;
  86:         curscr->_curx = lx;
  87:         ly -= win->_begy;
  88:         lx -= win->_begx;
  89:         if (ly >= 0 && ly < win->_maxy && lx >= 0 && lx < win->_maxx) {
  90:             win->_cury = ly;
  91:             win->_curx = lx;
  92:         }
  93:         else
  94:             win->_cury = win->_curx = 0;
  95:     }
  96:     else {
  97:         domvcur(ly, lx, win->_cury+win->_begy, win->_curx+win->_begx);
  98:         curscr->_cury = win->_cury + win->_begy;
  99:         curscr->_curx = win->_curx + win->_begx;
 100:     }
 101:     retval = OK;
 102: ret:
 103:     _win = NULL;
 104:     fflush(stdout);
 105:     return retval;
 106: }
 107: 
 108: /*
 109:  * make a change on the screen
 110:  */
 111: STATIC
 112: makech(win, wy)
 113: reg WINDOW  *win;
 114: short       wy;
 115: {
 116:     reg char    *nsp, *csp, *ce;
 117:     reg short   wx, lch, y;
 118:     reg int     nlsp, clsp; /* last space in lines		*/
 119: 
 120:     wx = win->_firstch[wy];
 121:     y = wy + win->_begy;
 122:     lch = win->_lastch[wy];
 123:     if (curwin)
 124:         csp = " ";
 125:     else
 126:         csp = &curscr->_y[wy + win->_begy][wx + win->_begx];
 127:     nsp = &win->_y[wy][wx];
 128:     if (CE && !curwin) {
 129:         for (ce = &win->_y[wy][win->_maxx - 1]; *ce == ' '; ce--)
 130:             if (ce <= win->_y[wy])
 131:                 break;
 132:         nlsp = ce - win->_y[wy];
 133:     }
 134:     if (!curwin)
 135:         ce = CE;
 136:     else
 137:         ce = NULL;
 138:     while (wx <= lch) {
 139:         if (*nsp != *csp) {
 140:             domvcur(ly, lx, y, wx + win->_begx);
 141: # ifdef DEBUG
 142:             fprintf(outf, "MAKECH: 1: wx = %d, lx = %d\n", wx, lx);
 143: # endif
 144:             ly = y;
 145:             lx = wx + win->_begx;
 146:             while (*nsp != *csp && wx <= lch) {
 147:                 if (ce != NULL && wx >= nlsp && *nsp == ' ') {
 148:                     /*
 149: 					 * check for clear to end-of-line
 150: 					 */
 151:                     ce = &curscr->_y[ly][COLS - 1];
 152:                     while (*ce == ' ')
 153:                         if (ce-- <= csp)
 154:                             break;
 155:                     clsp = ce - curscr->_y[ly] - win->_begx;
 156: # ifdef DEBUG
 157:                     fprintf(outf, "MAKECH: clsp = %d, nlsp = %d\n", clsp, nlsp);
 158: # endif
 159:                     if (clsp - nlsp >= strlen(CE)
 160:                         && clsp < win->_maxx) {
 161: # ifdef DEBUG
 162:                         fprintf(outf, "MAKECH: using CE\n");
 163: # endif
 164:                         _puts(CE);
 165:                         lx = wx + win->_begx;
 166:                         while (wx++ <= clsp)
 167:                             *csp++ = ' ';
 168:                         goto ret;
 169:                     }
 170:                     ce = NULL;
 171:                 }
 172:                 /*
 173: 				 * enter/exit standout mode as appropriate
 174: 				 */
 175:                 if (SO && (*nsp&_STANDOUT) != (curscr->_flags&_STANDOUT)) {
 176:                     if (*nsp & _STANDOUT) {
 177:                         _puts(SO);
 178:                         curscr->_flags |= _STANDOUT;
 179:                     }
 180:                     else {
 181:                         _puts(SE);
 182:                         curscr->_flags &= ~_STANDOUT;
 183:                     }
 184:                 }
 185:                 wx++;
 186:                 if (wx >= win->_maxx && wy == win->_maxy - 1)
 187:                     if (win->_scroll) {
 188:                         if ((curscr->_flags&_STANDOUT) &&
 189:                             (win->_flags & _ENDLINE))
 190:                             if (!MS) {
 191:                             _puts(SE);
 192:                             curscr->_flags &= ~_STANDOUT;
 193:                             }
 194:                         if (!curwin)
 195:                         putchar((*csp = *nsp) & 0177);
 196:                         else
 197:                         putchar(*nsp & 0177);
 198:                         scroll(win);
 199:                         if (win->_flags&_FULLWIN && !curwin)
 200:                         scroll(curscr);
 201:                         ly = win->_begy+win->_cury;
 202:                         lx = win->_begx+win->_curx;
 203:                         return OK;
 204:                     }
 205:                     else if (win->_flags&_SCROLLWIN) {
 206:                         lx = --wx;
 207:                         return ERR;
 208:                     }
 209:                 if (!curwin)
 210:                     putchar((*csp++ = *nsp) & 0177);
 211:                 else
 212:                     putchar(*nsp & 0177);
 213:                 if (UC && (*nsp & _STANDOUT)) {
 214:                     putchar('\b');
 215:                     _puts(UC);
 216:                 }
 217:                 nsp++;
 218:             }
 219: # ifdef DEBUG
 220:             fprintf(outf, "MAKECH: 2: wx = %d, lx = %d\n", wx, lx);
 221: # endif
 222:             if (lx == wx + win->_begx)  /* if no change */
 223:                 break;
 224:             lx = wx + win->_begx;
 225:         }
 226:         else if (wx < lch)
 227:             while (*nsp == *csp) {
 228:                 nsp++;
 229:                 if (!curwin)
 230:                     csp++;
 231:                 ++wx;
 232:             }
 233:         else
 234:             break;
 235: # ifdef DEBUG
 236:         fprintf(outf, "MAKECH: 3: wx = %d, lx = %d\n", wx, lx);
 237: # endif
 238:     }
 239: ret:
 240:     return OK;
 241: }
 242: 
 243: /*
 244:  * perform a mvcur, leaving standout mode if necessary
 245:  */
 246: static
 247: domvcur(oy, ox, ny, nx)
 248: int oy, ox, ny, nx; {
 249: 
 250:     if (curscr->_flags & _STANDOUT && !MS) {
 251:         _puts(SE);
 252:         curscr->_flags &= ~_STANDOUT;
 253:     }
 254:     mvcur(oy, ox, ny, nx);
 255: }

Defined functions

domvcur defined in line 246; used 3 times
makech defined in line 111; used 1 times
  • in line 77

Defined variables

lx defined in line 16; used 19 times
ly defined in line 16; used 14 times

Defined macros

STATIC defined in line 13; used 3 times
Last modified: 1983-05-24
Generated: 2016-12-26
Generated by src2html V0.67
page hit count: 860
Valid CSS Valid XHTML 1.0 Strict