12261Sarnold /* 22261Sarnold * make the current screen look like "win" over the area coverd by 32261Sarnold * win. 42261Sarnold * 5*12358Sarnold * 05/10/83 (Berkeley) @(#)refresh.c 1.7 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); 50*12358Sarnold ly = 0; 51*12358Sarnold lx = 0; 52*12358Sarnold if (!curwin) { 53*12358Sarnold curscr->_clear = FALSE; 54*12358Sarnold curscr->_cury = 0; 55*12358Sarnold curscr->_curx = 0; 562287Sarnold werase(curscr); 57*12358Sarnold } 582261Sarnold touchwin(win); 592261Sarnold } 602261Sarnold win->_clear = FALSE; 612261Sarnold } 622261Sarnold if (!CA) { 632261Sarnold if (win->_curx != 0) 642261Sarnold putchar('\n'); 652287Sarnold if (!curwin) 662287Sarnold werase(curscr); 672261Sarnold } 682261Sarnold # ifdef DEBUG 692287Sarnold fprintf(outf, "REFRESH(%0.2o): curwin = %d\n", win, curwin); 702261Sarnold fprintf(outf, "REFRESH:\n\tfirstch\tlastch\n"); 712261Sarnold # endif 722261Sarnold for (wy = 0; wy < win->_maxy; wy++) { 732261Sarnold # ifdef DEBUG 742261Sarnold fprintf(outf, "%d\t%d\t%d\n", wy, win->_firstch[wy], win->_lastch[wy]); 752261Sarnold # endif 762261Sarnold if (win->_firstch[wy] != _NOCHANGE) 772261Sarnold if (makech(win, wy) == ERR) 782261Sarnold return ERR; 792261Sarnold else 802261Sarnold win->_firstch[wy] = _NOCHANGE; 812261Sarnold } 82*12358Sarnold if (win == curscr) 83*12358Sarnold domvcur(ly, lx, win->_cury, win->_curx); 84*12358Sarnold else if (win->_leave) { 852261Sarnold curscr->_cury = ly; 862261Sarnold curscr->_curx = lx; 872261Sarnold ly -= win->_begy; 882261Sarnold lx -= win->_begx; 892261Sarnold if (ly >= 0 && ly < win->_maxy && lx >= 0 && lx < win->_maxx) { 902261Sarnold win->_cury = ly; 912261Sarnold win->_curx = lx; 922261Sarnold } 932261Sarnold else 942261Sarnold win->_cury = win->_curx = 0; 952261Sarnold } 962261Sarnold else { 9711736Sarnold domvcur(ly, lx, win->_cury+win->_begy, win->_curx+win->_begx); 982261Sarnold curscr->_cury = win->_cury + win->_begy; 992261Sarnold curscr->_curx = win->_curx + win->_begx; 1002261Sarnold } 1012287Sarnold retval = OK; 1022287Sarnold ret: 1032261Sarnold _win = NULL; 1042261Sarnold fflush(stdout); 1052287Sarnold return retval; 1062261Sarnold } 1072261Sarnold 1082261Sarnold /* 1092261Sarnold * make a change on the screen 1102261Sarnold */ 1112287Sarnold STATIC 1122261Sarnold makech(win, wy) 1132261Sarnold reg WINDOW *win; 1142261Sarnold short wy; 1152261Sarnold { 1162261Sarnold reg char *nsp, *csp, *ce; 1172261Sarnold reg short wx, lch, y; 1182261Sarnold reg int nlsp, clsp; /* last space in lines */ 1192261Sarnold 1202261Sarnold wx = win->_firstch[wy]; 1212261Sarnold y = wy + win->_begy; 1222261Sarnold lch = win->_lastch[wy]; 1232287Sarnold if (curwin) 1242287Sarnold csp = " "; 1252287Sarnold else 1262287Sarnold csp = &curscr->_y[wy + win->_begy][wx + win->_begx]; 1272261Sarnold nsp = &win->_y[wy][wx]; 1282287Sarnold if (CE && !curwin) { 1292261Sarnold for (ce = &win->_y[wy][win->_maxx - 1]; *ce == ' '; ce--) 1302261Sarnold if (ce <= win->_y[wy]) 1312261Sarnold break; 1322261Sarnold nlsp = ce - win->_y[wy]; 1332261Sarnold } 1342287Sarnold if (!curwin) 1352287Sarnold ce = CE; 1362287Sarnold else 1372287Sarnold ce = NULL; 1382261Sarnold while (wx <= lch) { 1392261Sarnold if (*nsp != *csp) { 14011736Sarnold domvcur(ly, lx, y, wx + win->_begx); 1412261Sarnold # ifdef DEBUG 1422261Sarnold fprintf(outf, "MAKECH: 1: wx = %d, lx = %d\n", wx, lx); 1432261Sarnold # endif 1442261Sarnold ly = y; 1452261Sarnold lx = wx + win->_begx; 1462261Sarnold while (*nsp != *csp && wx <= lch) { 1472287Sarnold if (ce != NULL && wx >= nlsp && *nsp == ' ') { 1482261Sarnold /* 1492261Sarnold * check for clear to end-of-line 1502261Sarnold */ 1512261Sarnold ce = &curscr->_y[ly][COLS - 1]; 1522261Sarnold while (*ce == ' ') 1532261Sarnold if (ce-- <= csp) 1542261Sarnold break; 1552261Sarnold clsp = ce - curscr->_y[ly] - win->_begx; 1562261Sarnold # ifdef DEBUG 1572261Sarnold fprintf(outf, "MAKECH: clsp = %d, nlsp = %d\n", clsp, nlsp); 1582261Sarnold # endif 1592261Sarnold if (clsp - nlsp >= strlen(CE) 1602261Sarnold && clsp < win->_maxx) { 1612261Sarnold # ifdef DEBUG 1622261Sarnold fprintf(outf, "MAKECH: using CE\n"); 1632261Sarnold # endif 1642261Sarnold _puts(CE); 1652261Sarnold lx = wx + win->_begx; 1662261Sarnold while (wx++ <= clsp) 1672261Sarnold *csp++ = ' '; 1682261Sarnold goto ret; 1692261Sarnold } 1702261Sarnold ce = NULL; 1712261Sarnold } 1722261Sarnold /* 1732261Sarnold * enter/exit standout mode as appropriate 1742261Sarnold */ 1752261Sarnold if (SO && (*nsp&_STANDOUT) != (curscr->_flags&_STANDOUT)) { 1762261Sarnold if (*nsp & _STANDOUT) { 1772261Sarnold _puts(SO); 1782261Sarnold curscr->_flags |= _STANDOUT; 1792261Sarnold } 1802261Sarnold else { 1812261Sarnold _puts(SE); 1822261Sarnold curscr->_flags &= ~_STANDOUT; 1832261Sarnold } 1842261Sarnold } 1852261Sarnold wx++; 1862906Sarnold if (wx >= win->_maxx && wy == win->_maxy - 1) 1872287Sarnold if (win->_scroll) { 18811736Sarnold if ((curscr->_flags&_STANDOUT) && 18911736Sarnold (win->_flags & _ENDLINE)) 19011736Sarnold if (!MS) { 19111736Sarnold _puts(SE); 19211736Sarnold curscr->_flags &= ~_STANDOUT; 19311736Sarnold } 1942287Sarnold if (!curwin) 1952287Sarnold putchar((*csp = *nsp) & 0177); 1962287Sarnold else 1972287Sarnold putchar(*nsp & 0177); 1982287Sarnold scroll(win); 1992287Sarnold if (win->_flags&_FULLWIN && !curwin) 2002287Sarnold scroll(curscr); 2012287Sarnold ly = win->_begy+win->_cury; 2022287Sarnold lx = win->_begx+win->_curx; 2032287Sarnold return OK; 2042287Sarnold } 2052287Sarnold else if (win->_flags&_SCROLLWIN) { 2062287Sarnold lx = --wx; 2072287Sarnold return ERR; 2082287Sarnold } 2092287Sarnold if (!curwin) 2102287Sarnold putchar((*csp++ = *nsp) & 0177); 2112287Sarnold else 2122287Sarnold putchar(*nsp & 0177); 2132261Sarnold if (UC && (*nsp & _STANDOUT)) { 2142261Sarnold putchar('\b'); 2152261Sarnold _puts(UC); 2162261Sarnold } 2172261Sarnold nsp++; 2182261Sarnold } 2192261Sarnold # ifdef DEBUG 2202261Sarnold fprintf(outf, "MAKECH: 2: wx = %d, lx = %d\n", wx, lx); 2212261Sarnold # endif 2222261Sarnold if (lx == wx + win->_begx) /* if no change */ 2232261Sarnold break; 2242261Sarnold lx = wx + win->_begx; 2252261Sarnold } 2262261Sarnold else if (wx < lch) 2272261Sarnold while (*nsp == *csp) { 2282287Sarnold nsp++; 2292287Sarnold if (!curwin) 2302287Sarnold csp++; 2312261Sarnold ++wx; 2322261Sarnold } 2332261Sarnold else 2342261Sarnold break; 2352261Sarnold # ifdef DEBUG 2362261Sarnold fprintf(outf, "MAKECH: 3: wx = %d, lx = %d\n", wx, lx); 2372261Sarnold # endif 2382261Sarnold } 2392261Sarnold ret: 24011736Sarnold return OK; 24111736Sarnold } 24211736Sarnold 24311736Sarnold /* 24411736Sarnold * perform a mvcur, leaving standout mode if necessary 24511736Sarnold */ 24611736Sarnold static 24711736Sarnold domvcur(oy, ox, ny, nx) 24811736Sarnold int oy, ox, ny, nx; { 24911736Sarnold 250*12358Sarnold if (ny == 0 && nx == 0) 251*12358Sarnold abort(); 25211736Sarnold if (curscr->_flags & _STANDOUT && !MS) { 2532261Sarnold _puts(SE); 25411736Sarnold curscr->_flags &= ~_STANDOUT; 2552261Sarnold } 25611736Sarnold mvcur(oy, ox, ny, nx); 2572261Sarnold } 258