12261Sarnold /* 22261Sarnold * make the current screen look like "win" over the area coverd by 32261Sarnold * win. 42261Sarnold * 5*11736Sarnold * 03/27/83 (Berkeley) @(#)refresh.c 1.6 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 { 91*11736Sarnold domvcur(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) { 134*11736Sarnold domvcur(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++; 1802906Sarnold if (wx >= win->_maxx && wy == win->_maxy - 1) 1812287Sarnold if (win->_scroll) { 182*11736Sarnold if ((curscr->_flags&_STANDOUT) && 183*11736Sarnold (win->_flags & _ENDLINE)) 184*11736Sarnold if (!MS) { 185*11736Sarnold _puts(SE); 186*11736Sarnold curscr->_flags &= ~_STANDOUT; 187*11736Sarnold } 1882287Sarnold if (!curwin) 1892287Sarnold putchar((*csp = *nsp) & 0177); 1902287Sarnold else 1912287Sarnold putchar(*nsp & 0177); 1922287Sarnold scroll(win); 1932287Sarnold if (win->_flags&_FULLWIN && !curwin) 1942287Sarnold scroll(curscr); 1952287Sarnold ly = win->_begy+win->_cury; 1962287Sarnold lx = win->_begx+win->_curx; 1972287Sarnold return OK; 1982287Sarnold } 1992287Sarnold else if (win->_flags&_SCROLLWIN) { 2002287Sarnold lx = --wx; 2012287Sarnold return ERR; 2022287Sarnold } 2032287Sarnold if (!curwin) 2042287Sarnold putchar((*csp++ = *nsp) & 0177); 2052287Sarnold else 2062287Sarnold 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) { 2222287Sarnold nsp++; 2232287Sarnold if (!curwin) 2242287Sarnold 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: 234*11736Sarnold return OK; 235*11736Sarnold } 236*11736Sarnold 237*11736Sarnold /* 238*11736Sarnold * perform a mvcur, leaving standout mode if necessary 239*11736Sarnold */ 240*11736Sarnold static 241*11736Sarnold domvcur(oy, ox, ny, nx) 242*11736Sarnold int oy, ox, ny, nx; { 243*11736Sarnold 244*11736Sarnold if (curscr->_flags & _STANDOUT && !MS) { 2452261Sarnold _puts(SE); 246*11736Sarnold curscr->_flags &= ~_STANDOUT; 2472261Sarnold } 248*11736Sarnold mvcur(oy, ox, ny, nx); 2492261Sarnold } 250