12261Sarnold /* 22261Sarnold * make the current screen look like "win" over the area coverd by 32261Sarnold * win. 42261Sarnold * 5*19893Sbloom * @(#)refresh.c 1.9 (Berkeley) 05/01/85 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; 27*19893Sbloom reg WINDOW *orig; 282261Sarnold 292261Sarnold /* 302261Sarnold * make sure were in visual state 312261Sarnold */ 322261Sarnold if (_endwin) { 332261Sarnold _puts(VS); 342261Sarnold _puts(TI); 352261Sarnold _endwin = FALSE; 362261Sarnold } 372287Sarnold 382287Sarnold /* 392287Sarnold * initialize loop parameters 402287Sarnold */ 412287Sarnold 422287Sarnold ly = curscr->_cury; 432287Sarnold lx = curscr->_curx; 442287Sarnold wy = 0; 452287Sarnold _win = win; 462287Sarnold curwin = (win == curscr); 472287Sarnold 482287Sarnold if (win->_clear || curscr->_clear || curwin) { 492261Sarnold if ((win->_flags & _FULLWIN) || curscr->_clear) { 502261Sarnold _puts(CL); 5112358Sarnold ly = 0; 5212358Sarnold lx = 0; 5312358Sarnold if (!curwin) { 5412358Sarnold curscr->_clear = FALSE; 5512358Sarnold curscr->_cury = 0; 5612358Sarnold curscr->_curx = 0; 572287Sarnold werase(curscr); 5812358Sarnold } 592261Sarnold touchwin(win); 602261Sarnold } 612261Sarnold win->_clear = FALSE; 622261Sarnold } 632261Sarnold if (!CA) { 642261Sarnold if (win->_curx != 0) 65*19893Sbloom _putchar('\n'); 662287Sarnold if (!curwin) 672287Sarnold werase(curscr); 682261Sarnold } 692261Sarnold # ifdef DEBUG 702287Sarnold fprintf(outf, "REFRESH(%0.2o): curwin = %d\n", win, curwin); 712261Sarnold fprintf(outf, "REFRESH:\n\tfirstch\tlastch\n"); 722261Sarnold # endif 732261Sarnold for (wy = 0; wy < win->_maxy; wy++) { 742261Sarnold # ifdef DEBUG 75*19893Sbloom fprintf(outf, "%d\t%d\t%d\n", wy, win->_firstch[wy], 76*19893Sbloom win->_lastch[wy]); 772261Sarnold # endif 782261Sarnold if (win->_firstch[wy] != _NOCHANGE) 792261Sarnold if (makech(win, wy) == ERR) 802261Sarnold return ERR; 81*19893Sbloom else { 82*19893Sbloom if (win->_firstch[wy] >= win->_ch_off) 83*19893Sbloom win->_firstch[wy] = win->_maxx + 84*19893Sbloom win->_ch_off; 85*19893Sbloom if (win->_lastch[wy] < win->_maxx + 86*19893Sbloom win->_ch_off) 87*19893Sbloom win->_lastch[wy] = win->_ch_off; 88*19893Sbloom if (win->_lastch[wy] < win->_firstch[wy]) 89*19893Sbloom win->_firstch[wy] = _NOCHANGE; 90*19893Sbloom } 91*19893Sbloom # ifdef DEBUG 92*19893Sbloom fprintf(outf, "\t%d\t%d\n", win->_firstch[wy], 93*19893Sbloom win->_lastch[wy]); 94*19893Sbloom # endif 952261Sarnold } 96*19893Sbloom 9712358Sarnold if (win == curscr) 9812358Sarnold domvcur(ly, lx, win->_cury, win->_curx); 99*19893Sbloom else { 100*19893Sbloom if (win->_leave) { 101*19893Sbloom curscr->_cury = ly; 102*19893Sbloom curscr->_curx = lx; 103*19893Sbloom ly -= win->_begy; 104*19893Sbloom lx -= win->_begx; 105*19893Sbloom if (ly >= 0 && ly < win->_maxy && lx >= 0 && 106*19893Sbloom lx < win->_maxx) { 107*19893Sbloom win->_cury = ly; 108*19893Sbloom win->_curx = lx; 109*19893Sbloom } 110*19893Sbloom else 111*19893Sbloom win->_cury = win->_curx = 0; 1122261Sarnold } 113*19893Sbloom else { 114*19893Sbloom domvcur(ly, lx, win->_cury + win->_begy, 115*19893Sbloom win->_curx + win->_begx); 116*19893Sbloom curscr->_cury = win->_cury + win->_begy; 117*19893Sbloom curscr->_curx = win->_curx + win->_begx; 118*19893Sbloom } 1192261Sarnold } 1202287Sarnold retval = OK; 1212287Sarnold ret: 1222261Sarnold _win = NULL; 1232261Sarnold fflush(stdout); 1242287Sarnold return retval; 1252261Sarnold } 1262261Sarnold 1272261Sarnold /* 1282261Sarnold * make a change on the screen 1292261Sarnold */ 1302287Sarnold STATIC 1312261Sarnold makech(win, wy) 1322261Sarnold reg WINDOW *win; 1332261Sarnold short wy; 1342261Sarnold { 1352261Sarnold reg char *nsp, *csp, *ce; 1362261Sarnold reg short wx, lch, y; 1372261Sarnold reg int nlsp, clsp; /* last space in lines */ 1382261Sarnold 139*19893Sbloom wx = win->_firstch[wy] - win->_ch_off; 140*19893Sbloom if (wx >= win->_maxx) 141*19893Sbloom return OK; 142*19893Sbloom else if (wx < 0) 143*19893Sbloom wx = 0; 144*19893Sbloom lch = win->_lastch[wy] - win->_ch_off; 145*19893Sbloom if (lch < 0) 146*19893Sbloom return OK; 147*19893Sbloom else if (lch >= win->_maxx) 148*19893Sbloom lch = win->_maxx - 1;; 1492261Sarnold y = wy + win->_begy; 150*19893Sbloom 1512287Sarnold if (curwin) 1522287Sarnold csp = " "; 1532287Sarnold else 1542287Sarnold csp = &curscr->_y[wy + win->_begy][wx + win->_begx]; 155*19893Sbloom 1562261Sarnold nsp = &win->_y[wy][wx]; 1572287Sarnold if (CE && !curwin) { 1582261Sarnold for (ce = &win->_y[wy][win->_maxx - 1]; *ce == ' '; ce--) 1592261Sarnold if (ce <= win->_y[wy]) 1602261Sarnold break; 1612261Sarnold nlsp = ce - win->_y[wy]; 1622261Sarnold } 163*19893Sbloom 1642287Sarnold if (!curwin) 1652287Sarnold ce = CE; 1662287Sarnold else 1672287Sarnold ce = NULL; 168*19893Sbloom 1692261Sarnold while (wx <= lch) { 1702261Sarnold if (*nsp != *csp) { 17111736Sarnold domvcur(ly, lx, y, wx + win->_begx); 1722261Sarnold # ifdef DEBUG 1732261Sarnold fprintf(outf, "MAKECH: 1: wx = %d, lx = %d\n", wx, lx); 1742261Sarnold # endif 1752261Sarnold ly = y; 1762261Sarnold lx = wx + win->_begx; 1772261Sarnold while (*nsp != *csp && wx <= lch) { 1782287Sarnold if (ce != NULL && wx >= nlsp && *nsp == ' ') { 1792261Sarnold /* 1802261Sarnold * check for clear to end-of-line 1812261Sarnold */ 1822261Sarnold ce = &curscr->_y[ly][COLS - 1]; 1832261Sarnold while (*ce == ' ') 1842261Sarnold if (ce-- <= csp) 1852261Sarnold break; 1862261Sarnold clsp = ce - curscr->_y[ly] - win->_begx; 1872261Sarnold # ifdef DEBUG 1882261Sarnold fprintf(outf, "MAKECH: clsp = %d, nlsp = %d\n", clsp, nlsp); 1892261Sarnold # endif 1902261Sarnold if (clsp - nlsp >= strlen(CE) 1912261Sarnold && clsp < win->_maxx) { 1922261Sarnold # ifdef DEBUG 1932261Sarnold fprintf(outf, "MAKECH: using CE\n"); 1942261Sarnold # endif 1952261Sarnold _puts(CE); 1962261Sarnold lx = wx + win->_begx; 1972261Sarnold while (wx++ <= clsp) 1982261Sarnold *csp++ = ' '; 199*19893Sbloom return OK; 2002261Sarnold } 2012261Sarnold ce = NULL; 2022261Sarnold } 2032261Sarnold /* 2042261Sarnold * enter/exit standout mode as appropriate 2052261Sarnold */ 2062261Sarnold if (SO && (*nsp&_STANDOUT) != (curscr->_flags&_STANDOUT)) { 2072261Sarnold if (*nsp & _STANDOUT) { 2082261Sarnold _puts(SO); 2092261Sarnold curscr->_flags |= _STANDOUT; 2102261Sarnold } 2112261Sarnold else { 2122261Sarnold _puts(SE); 2132261Sarnold curscr->_flags &= ~_STANDOUT; 2142261Sarnold } 2152261Sarnold } 2162261Sarnold wx++; 2172906Sarnold if (wx >= win->_maxx && wy == win->_maxy - 1) 2182287Sarnold if (win->_scroll) { 21911736Sarnold if ((curscr->_flags&_STANDOUT) && 22011736Sarnold (win->_flags & _ENDLINE)) 22111736Sarnold if (!MS) { 22211736Sarnold _puts(SE); 22311736Sarnold curscr->_flags &= ~_STANDOUT; 22411736Sarnold } 2252287Sarnold if (!curwin) 226*19893Sbloom _putchar((*csp = *nsp) & 0177); 2272287Sarnold else 228*19893Sbloom _putchar(*nsp & 0177); 2292287Sarnold if (win->_flags&_FULLWIN && !curwin) 2302287Sarnold scroll(curscr); 2312287Sarnold ly = win->_begy+win->_cury; 2322287Sarnold lx = win->_begx+win->_curx; 2332287Sarnold return OK; 2342287Sarnold } 2352287Sarnold else if (win->_flags&_SCROLLWIN) { 2362287Sarnold lx = --wx; 2372287Sarnold return ERR; 2382287Sarnold } 2392287Sarnold if (!curwin) 240*19893Sbloom _putchar((*csp++ = *nsp) & 0177); 2412287Sarnold else 242*19893Sbloom _putchar(*nsp & 0177); 243*19893Sbloom # ifdef FULLDEBUG 244*19893Sbloom fprintf(outf, 245*19893Sbloom "MAKECH:putchar(%c)\n", *nsp & 0177); 246*19893Sbloom # endif 2472261Sarnold if (UC && (*nsp & _STANDOUT)) { 248*19893Sbloom _putchar('\b'); 2492261Sarnold _puts(UC); 2502261Sarnold } 2512261Sarnold nsp++; 2522261Sarnold } 2532261Sarnold # ifdef DEBUG 2542261Sarnold fprintf(outf, "MAKECH: 2: wx = %d, lx = %d\n", wx, lx); 2552261Sarnold # endif 2562261Sarnold if (lx == wx + win->_begx) /* if no change */ 2572261Sarnold break; 2582261Sarnold lx = wx + win->_begx; 2592261Sarnold } 2602261Sarnold else if (wx < lch) 261*19893Sbloom while (*nsp == *csp && wx < lch) { 2622287Sarnold nsp++; 2632287Sarnold if (!curwin) 2642287Sarnold csp++; 2652261Sarnold ++wx; 2662261Sarnold } 2672261Sarnold else 2682261Sarnold break; 2692261Sarnold # ifdef DEBUG 2702261Sarnold fprintf(outf, "MAKECH: 3: wx = %d, lx = %d\n", wx, lx); 2712261Sarnold # endif 2722261Sarnold } 27311736Sarnold return OK; 27411736Sarnold } 27511736Sarnold 27611736Sarnold /* 27711736Sarnold * perform a mvcur, leaving standout mode if necessary 27811736Sarnold */ 279*19893Sbloom STATIC 28011736Sarnold domvcur(oy, ox, ny, nx) 28111736Sarnold int oy, ox, ny, nx; { 28211736Sarnold 28311736Sarnold if (curscr->_flags & _STANDOUT && !MS) { 2842261Sarnold _puts(SE); 28511736Sarnold curscr->_flags &= ~_STANDOUT; 2862261Sarnold } 28711736Sarnold mvcur(oy, ox, ny, nx); 2882261Sarnold } 289