12261Sarnold /* 22261Sarnold * make the current screen look like "win" over the area coverd by 32261Sarnold * win. 42261Sarnold * 5*2287Sarnold * 01/27/81 (Berkeley) @(#)refresh.c 1.2 62261Sarnold */ 72261Sarnold 82261Sarnold # include "curses.ext" 92261Sarnold 10*2287Sarnold # ifdef DEBUG 11*2287Sarnold # define STATIC 122261Sarnold # else 13*2287Sarnold # define STATIC static 142261Sarnold # endif 152261Sarnold 16*2287Sarnold STATIC short ly, lx; 17*2287Sarnold 18*2287Sarnold STATIC bool curwin; 19*2287Sarnold 202261Sarnold WINDOW *_win = NULL; 212261Sarnold 222261Sarnold wrefresh(win) 232261Sarnold reg WINDOW *win; 242261Sarnold { 252261Sarnold reg short wy; 26*2287Sarnold reg int retval; 272261Sarnold 282261Sarnold /* 292261Sarnold * make sure were in visual state 302261Sarnold */ 312261Sarnold if (_endwin) { 322261Sarnold _puts(VS); 332261Sarnold _puts(TI); 342261Sarnold _endwin = FALSE; 352261Sarnold } 36*2287Sarnold 37*2287Sarnold /* 38*2287Sarnold * initialize loop parameters 39*2287Sarnold */ 40*2287Sarnold 41*2287Sarnold ly = curscr->_cury; 42*2287Sarnold lx = curscr->_curx; 43*2287Sarnold wy = 0; 44*2287Sarnold _win = win; 45*2287Sarnold curwin = (win == curscr); 46*2287Sarnold 47*2287Sarnold if (win->_clear || curscr->_clear || curwin) { 482261Sarnold if ((win->_flags & _FULLWIN) || curscr->_clear) { 492261Sarnold _puts(CL); 50*2287Sarnold if (!curwin) { 51*2287Sarnold curscr->_curx = curscr->_cury = 0; 52*2287Sarnold curscr->_clear = FALSE; 53*2287Sarnold werase(curscr); 54*2287Sarnold } 552261Sarnold touchwin(win); 562261Sarnold } 572261Sarnold win->_clear = FALSE; 582261Sarnold } 592261Sarnold if (!CA) { 602261Sarnold if (win->_curx != 0) 612261Sarnold putchar('\n'); 62*2287Sarnold if (!curwin) 63*2287Sarnold werase(curscr); 642261Sarnold } 652261Sarnold # ifdef DEBUG 66*2287Sarnold fprintf(outf, "REFRESH(%0.2o): curwin = %d\n", win, curwin); 672261Sarnold fprintf(outf, "REFRESH:\n\tfirstch\tlastch\n"); 682261Sarnold # endif 692261Sarnold for (wy = 0; wy < win->_maxy; wy++) { 702261Sarnold # ifdef DEBUG 712261Sarnold fprintf(outf, "%d\t%d\t%d\n", wy, win->_firstch[wy], win->_lastch[wy]); 722261Sarnold # endif 732261Sarnold if (win->_firstch[wy] != _NOCHANGE) 742261Sarnold if (makech(win, wy) == ERR) 752261Sarnold return ERR; 762261Sarnold else 772261Sarnold win->_firstch[wy] = _NOCHANGE; 782261Sarnold } 792261Sarnold if (win->_leave) { 802261Sarnold curscr->_cury = ly; 812261Sarnold curscr->_curx = lx; 822261Sarnold ly -= win->_begy; 832261Sarnold lx -= win->_begx; 842261Sarnold if (ly >= 0 && ly < win->_maxy && lx >= 0 && lx < win->_maxx) { 852261Sarnold win->_cury = ly; 862261Sarnold win->_curx = lx; 872261Sarnold } 882261Sarnold else 892261Sarnold win->_cury = win->_curx = 0; 902261Sarnold } 912261Sarnold else { 922261Sarnold mvcur(ly, lx, win->_cury + win->_begy, win->_curx + win->_begx); 932261Sarnold curscr->_cury = win->_cury + win->_begy; 942261Sarnold curscr->_curx = win->_curx + win->_begx; 952261Sarnold } 96*2287Sarnold retval = OK; 97*2287Sarnold ret: 982261Sarnold _win = NULL; 992261Sarnold fflush(stdout); 100*2287Sarnold return retval; 1012261Sarnold } 1022261Sarnold 1032261Sarnold /* 1042261Sarnold * make a change on the screen 1052261Sarnold */ 106*2287Sarnold STATIC 1072261Sarnold makech(win, wy) 1082261Sarnold reg WINDOW *win; 1092261Sarnold short wy; 1102261Sarnold { 1112261Sarnold reg char *nsp, *csp, *ce; 1122261Sarnold reg short wx, lch, y; 1132261Sarnold reg int nlsp, clsp; /* last space in lines */ 1142261Sarnold 1152261Sarnold wx = win->_firstch[wy]; 1162261Sarnold y = wy + win->_begy; 1172261Sarnold lch = win->_lastch[wy]; 118*2287Sarnold if (curwin) 119*2287Sarnold csp = " "; 120*2287Sarnold else 121*2287Sarnold csp = &curscr->_y[wy + win->_begy][wx + win->_begx]; 1222261Sarnold nsp = &win->_y[wy][wx]; 123*2287Sarnold if (CE && !curwin) { 1242261Sarnold for (ce = &win->_y[wy][win->_maxx - 1]; *ce == ' '; ce--) 1252261Sarnold if (ce <= win->_y[wy]) 1262261Sarnold break; 1272261Sarnold nlsp = ce - win->_y[wy]; 1282261Sarnold } 129*2287Sarnold if (!curwin) 130*2287Sarnold ce = CE; 131*2287Sarnold else 132*2287Sarnold ce = NULL; 1332261Sarnold while (wx <= lch) { 1342261Sarnold if (*nsp != *csp) { 1352261Sarnold mvcur(ly, lx, y, wx + win->_begx); 1362261Sarnold # ifdef DEBUG 1372261Sarnold fprintf(outf, "MAKECH: 1: wx = %d, lx = %d\n", wx, lx); 1382261Sarnold # endif 1392261Sarnold ly = y; 1402261Sarnold lx = wx + win->_begx; 1412261Sarnold while (*nsp != *csp && wx <= lch) { 142*2287Sarnold if (ce != NULL && wx >= nlsp && *nsp == ' ') { 1432261Sarnold /* 1442261Sarnold * check for clear to end-of-line 1452261Sarnold */ 1462261Sarnold ce = &curscr->_y[ly][COLS - 1]; 1472261Sarnold while (*ce == ' ') 1482261Sarnold if (ce-- <= csp) 1492261Sarnold break; 1502261Sarnold clsp = ce - curscr->_y[ly] - win->_begx; 1512261Sarnold # ifdef DEBUG 1522261Sarnold fprintf(outf, "MAKECH: clsp = %d, nlsp = %d\n", clsp, nlsp); 1532261Sarnold # endif 1542261Sarnold if (clsp - nlsp >= strlen(CE) 1552261Sarnold && clsp < win->_maxx) { 1562261Sarnold # ifdef DEBUG 1572261Sarnold fprintf(outf, "MAKECH: using CE\n"); 1582261Sarnold # endif 1592261Sarnold _puts(CE); 1602261Sarnold lx = wx + win->_begx; 1612261Sarnold while (wx++ <= clsp) 1622261Sarnold *csp++ = ' '; 1632261Sarnold goto ret; 1642261Sarnold } 1652261Sarnold ce = NULL; 1662261Sarnold } 1672261Sarnold /* 1682261Sarnold * enter/exit standout mode as appropriate 1692261Sarnold */ 1702261Sarnold if (SO && (*nsp&_STANDOUT) != (curscr->_flags&_STANDOUT)) { 1712261Sarnold if (*nsp & _STANDOUT) { 1722261Sarnold _puts(SO); 1732261Sarnold curscr->_flags |= _STANDOUT; 1742261Sarnold } 1752261Sarnold else { 1762261Sarnold _puts(SE); 1772261Sarnold curscr->_flags &= ~_STANDOUT; 1782261Sarnold } 1792261Sarnold } 1802261Sarnold wx++; 1812261Sarnold if (wx >= win->_maxx && wy == win->_maxy) 182*2287Sarnold if (win->_scroll) { 183*2287Sarnold if ((win->_flags&(_ENDLINE|_STANDOUT)) == (_ENDLINE|_STANDOUT)) 184*2287Sarnold if (!MS) { 185*2287Sarnold _puts(SE); 186*2287Sarnold win->_flags &= ~_STANDOUT; 1872261Sarnold } 188*2287Sarnold if (!curwin) 189*2287Sarnold putchar((*csp = *nsp) & 0177); 190*2287Sarnold else 191*2287Sarnold putchar(*nsp & 0177); 192*2287Sarnold scroll(win); 193*2287Sarnold if (win->_flags&_FULLWIN && !curwin) 194*2287Sarnold scroll(curscr); 195*2287Sarnold ly = win->_begy+win->_cury; 196*2287Sarnold lx = win->_begx+win->_curx; 197*2287Sarnold return OK; 198*2287Sarnold } 199*2287Sarnold else if (win->_flags&_SCROLLWIN) { 200*2287Sarnold lx = --wx; 201*2287Sarnold return ERR; 202*2287Sarnold } 203*2287Sarnold if (!curwin) 204*2287Sarnold putchar((*csp++ = *nsp) & 0177); 205*2287Sarnold else 206*2287Sarnold putchar(*nsp & 0177); 2072261Sarnold if (UC && (*nsp & _STANDOUT)) { 2082261Sarnold putchar('\b'); 2092261Sarnold _puts(UC); 2102261Sarnold } 2112261Sarnold nsp++; 2122261Sarnold } 2132261Sarnold # ifdef DEBUG 2142261Sarnold fprintf(outf, "MAKECH: 2: wx = %d, lx = %d\n", wx, lx); 2152261Sarnold # endif 2162261Sarnold if (lx == wx + win->_begx) /* if no change */ 2172261Sarnold break; 2182261Sarnold lx = wx + win->_begx; 2192261Sarnold } 2202261Sarnold else if (wx < lch) 2212261Sarnold while (*nsp == *csp) { 222*2287Sarnold nsp++; 223*2287Sarnold if (!curwin) 224*2287Sarnold csp++; 2252261Sarnold ++wx; 2262261Sarnold } 2272261Sarnold else 2282261Sarnold break; 2292261Sarnold # ifdef DEBUG 2302261Sarnold fprintf(outf, "MAKECH: 3: wx = %d, lx = %d\n", wx, lx); 2312261Sarnold # endif 2322261Sarnold } 2332261Sarnold ret: 2342261Sarnold if ((win->_flags & _STANDOUT) && !MS) { 2352261Sarnold _puts(SE); 2362261Sarnold win->_flags &= ~_STANDOUT; 2372261Sarnold } 2382261Sarnold return OK; 2392261Sarnold } 240