12261Sarnold /* 22261Sarnold * make the current screen look like "win" over the area coverd by 32261Sarnold * win. 42261Sarnold * 5*2906Sarnold * 03/05/81 (Berkeley) @(#)refresh.c 1.4 62261Sarnold */ 72261Sarnold 82261Sarnold # include "curses.ext" 92261Sarnold 102287Sarnold # ifdef DEBUG 112287Sarnold # define STATIC 122261Sarnold # else 132287Sarnold # define STATIC static 142261Sarnold # endif 152261Sarnold 162287Sarnold STATIC short ly, lx; 172287Sarnold 182287Sarnold STATIC bool curwin; 192287Sarnold 202261Sarnold WINDOW *_win = NULL; 212261Sarnold 222261Sarnold wrefresh(win) 232261Sarnold reg WINDOW *win; 242261Sarnold { 252261Sarnold reg short wy; 262287Sarnold 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 } 362287Sarnold 372287Sarnold /* 382287Sarnold * initialize loop parameters 392287Sarnold */ 402287Sarnold 412287Sarnold ly = curscr->_cury; 422287Sarnold lx = curscr->_curx; 432287Sarnold wy = 0; 442287Sarnold _win = win; 452287Sarnold curwin = (win == curscr); 462287Sarnold 472287Sarnold if (win->_clear || curscr->_clear || curwin) { 482261Sarnold if ((win->_flags & _FULLWIN) || curscr->_clear) { 492261Sarnold _puts(CL); 502464Sarnold ly = lx = curscr->_curx = curscr->_cury = 0; 512464Sarnold curscr->_clear = FALSE; 522464Sarnold if (!curwin) 532287Sarnold werase(curscr); 542261Sarnold touchwin(win); 552261Sarnold } 562261Sarnold win->_clear = FALSE; 572261Sarnold } 582261Sarnold if (!CA) { 592261Sarnold if (win->_curx != 0) 602261Sarnold putchar('\n'); 612287Sarnold if (!curwin) 622287Sarnold werase(curscr); 632261Sarnold } 642261Sarnold # ifdef DEBUG 652287Sarnold fprintf(outf, "REFRESH(%0.2o): curwin = %d\n", win, curwin); 662261Sarnold fprintf(outf, "REFRESH:\n\tfirstch\tlastch\n"); 672261Sarnold # endif 682261Sarnold for (wy = 0; wy < win->_maxy; wy++) { 692261Sarnold # ifdef DEBUG 702261Sarnold fprintf(outf, "%d\t%d\t%d\n", wy, win->_firstch[wy], win->_lastch[wy]); 712261Sarnold # endif 722261Sarnold if (win->_firstch[wy] != _NOCHANGE) 732261Sarnold if (makech(win, wy) == ERR) 742261Sarnold return ERR; 752261Sarnold else 762261Sarnold win->_firstch[wy] = _NOCHANGE; 772261Sarnold } 782261Sarnold if (win->_leave) { 792261Sarnold curscr->_cury = ly; 802261Sarnold curscr->_curx = lx; 812261Sarnold ly -= win->_begy; 822261Sarnold lx -= win->_begx; 832261Sarnold if (ly >= 0 && ly < win->_maxy && lx >= 0 && lx < win->_maxx) { 842261Sarnold win->_cury = ly; 852261Sarnold win->_curx = lx; 862261Sarnold } 872261Sarnold else 882261Sarnold win->_cury = win->_curx = 0; 892261Sarnold } 902261Sarnold else { 912261Sarnold mvcur(ly, lx, win->_cury + win->_begy, win->_curx + win->_begx); 922261Sarnold curscr->_cury = win->_cury + win->_begy; 932261Sarnold curscr->_curx = win->_curx + win->_begx; 942261Sarnold } 952287Sarnold retval = OK; 962287Sarnold ret: 972261Sarnold _win = NULL; 982261Sarnold fflush(stdout); 992287Sarnold return retval; 1002261Sarnold } 1012261Sarnold 1022261Sarnold /* 1032261Sarnold * make a change on the screen 1042261Sarnold */ 1052287Sarnold STATIC 1062261Sarnold makech(win, wy) 1072261Sarnold reg WINDOW *win; 1082261Sarnold short wy; 1092261Sarnold { 1102261Sarnold reg char *nsp, *csp, *ce; 1112261Sarnold reg short wx, lch, y; 1122261Sarnold reg int nlsp, clsp; /* last space in lines */ 1132261Sarnold 1142261Sarnold wx = win->_firstch[wy]; 1152261Sarnold y = wy + win->_begy; 1162261Sarnold lch = win->_lastch[wy]; 1172287Sarnold if (curwin) 1182287Sarnold csp = " "; 1192287Sarnold else 1202287Sarnold csp = &curscr->_y[wy + win->_begy][wx + win->_begx]; 1212261Sarnold nsp = &win->_y[wy][wx]; 1222287Sarnold if (CE && !curwin) { 1232261Sarnold for (ce = &win->_y[wy][win->_maxx - 1]; *ce == ' '; ce--) 1242261Sarnold if (ce <= win->_y[wy]) 1252261Sarnold break; 1262261Sarnold nlsp = ce - win->_y[wy]; 1272261Sarnold } 1282287Sarnold if (!curwin) 1292287Sarnold ce = CE; 1302287Sarnold else 1312287Sarnold ce = NULL; 1322261Sarnold while (wx <= lch) { 1332261Sarnold if (*nsp != *csp) { 1342261Sarnold mvcur(ly, lx, y, wx + win->_begx); 1352261Sarnold # ifdef DEBUG 1362261Sarnold fprintf(outf, "MAKECH: 1: wx = %d, lx = %d\n", wx, lx); 1372261Sarnold # endif 1382261Sarnold ly = y; 1392261Sarnold lx = wx + win->_begx; 1402261Sarnold while (*nsp != *csp && wx <= lch) { 1412287Sarnold if (ce != NULL && wx >= nlsp && *nsp == ' ') { 1422261Sarnold /* 1432261Sarnold * check for clear to end-of-line 1442261Sarnold */ 1452261Sarnold ce = &curscr->_y[ly][COLS - 1]; 1462261Sarnold while (*ce == ' ') 1472261Sarnold if (ce-- <= csp) 1482261Sarnold break; 1492261Sarnold clsp = ce - curscr->_y[ly] - win->_begx; 1502261Sarnold # ifdef DEBUG 1512261Sarnold fprintf(outf, "MAKECH: clsp = %d, nlsp = %d\n", clsp, nlsp); 1522261Sarnold # endif 1532261Sarnold if (clsp - nlsp >= strlen(CE) 1542261Sarnold && clsp < win->_maxx) { 1552261Sarnold # ifdef DEBUG 1562261Sarnold fprintf(outf, "MAKECH: using CE\n"); 1572261Sarnold # endif 1582261Sarnold _puts(CE); 1592261Sarnold lx = wx + win->_begx; 1602261Sarnold while (wx++ <= clsp) 1612261Sarnold *csp++ = ' '; 1622261Sarnold goto ret; 1632261Sarnold } 1642261Sarnold ce = NULL; 1652261Sarnold } 1662261Sarnold /* 1672261Sarnold * enter/exit standout mode as appropriate 1682261Sarnold */ 1692261Sarnold if (SO && (*nsp&_STANDOUT) != (curscr->_flags&_STANDOUT)) { 1702261Sarnold if (*nsp & _STANDOUT) { 1712261Sarnold _puts(SO); 1722261Sarnold curscr->_flags |= _STANDOUT; 1732261Sarnold } 1742261Sarnold else { 1752261Sarnold _puts(SE); 1762261Sarnold curscr->_flags &= ~_STANDOUT; 1772261Sarnold } 1782261Sarnold } 1792261Sarnold wx++; 180*2906Sarnold if (wx >= win->_maxx && wy == win->_maxy - 1) 1812287Sarnold if (win->_scroll) { 1822287Sarnold if ((win->_flags&(_ENDLINE|_STANDOUT)) == (_ENDLINE|_STANDOUT)) 1832287Sarnold if (!MS) { 184*2906Sarnold _puts(SE); 185*2906Sarnold win->_flags &= ~_STANDOUT; 1862261Sarnold } 1872287Sarnold if (!curwin) 1882287Sarnold putchar((*csp = *nsp) & 0177); 1892287Sarnold else 1902287Sarnold putchar(*nsp & 0177); 1912287Sarnold scroll(win); 1922287Sarnold if (win->_flags&_FULLWIN && !curwin) 1932287Sarnold scroll(curscr); 1942287Sarnold ly = win->_begy+win->_cury; 1952287Sarnold lx = win->_begx+win->_curx; 1962287Sarnold return OK; 1972287Sarnold } 1982287Sarnold else if (win->_flags&_SCROLLWIN) { 1992287Sarnold lx = --wx; 2002287Sarnold return ERR; 2012287Sarnold } 2022287Sarnold if (!curwin) 2032287Sarnold putchar((*csp++ = *nsp) & 0177); 2042287Sarnold else 2052287Sarnold putchar(*nsp & 0177); 2062261Sarnold if (UC && (*nsp & _STANDOUT)) { 2072261Sarnold putchar('\b'); 2082261Sarnold _puts(UC); 2092261Sarnold } 2102261Sarnold nsp++; 2112261Sarnold } 2122261Sarnold # ifdef DEBUG 2132261Sarnold fprintf(outf, "MAKECH: 2: wx = %d, lx = %d\n", wx, lx); 2142261Sarnold # endif 2152261Sarnold if (lx == wx + win->_begx) /* if no change */ 2162261Sarnold break; 2172261Sarnold lx = wx + win->_begx; 2182261Sarnold } 2192261Sarnold else if (wx < lch) 2202261Sarnold while (*nsp == *csp) { 2212287Sarnold nsp++; 2222287Sarnold if (!curwin) 2232287Sarnold csp++; 2242261Sarnold ++wx; 2252261Sarnold } 2262261Sarnold else 2272261Sarnold break; 2282261Sarnold # ifdef DEBUG 2292261Sarnold fprintf(outf, "MAKECH: 3: wx = %d, lx = %d\n", wx, lx); 2302261Sarnold # endif 2312261Sarnold } 2322261Sarnold ret: 2332261Sarnold if ((win->_flags & _STANDOUT) && !MS) { 2342261Sarnold _puts(SE); 2352261Sarnold win->_flags &= ~_STANDOUT; 2362261Sarnold } 2372261Sarnold return OK; 2382261Sarnold } 239