12261Sarnold /* 2*22791Smckusick * Copyright (c) 1980 Regents of the University of California. 3*22791Smckusick * All rights reserved. The Berkeley software License Agreement 4*22791Smckusick * specifies the terms and conditions for redistribution. 5*22791Smckusick */ 6*22791Smckusick 7*22791Smckusick #ifndef lint 8*22791Smckusick static char sccsid[] = "@(#)refresh.c 5.1 (Berkeley) 06/07/85"; 9*22791Smckusick #endif not lint 10*22791Smckusick 11*22791Smckusick /* 122261Sarnold * make the current screen look like "win" over the area coverd by 132261Sarnold * win. 142261Sarnold */ 152261Sarnold 162261Sarnold # include "curses.ext" 172261Sarnold 182287Sarnold # ifdef DEBUG 192287Sarnold # define STATIC 202261Sarnold # else 212287Sarnold # define STATIC static 222261Sarnold # endif 232261Sarnold 242287Sarnold STATIC short ly, lx; 252287Sarnold 262287Sarnold STATIC bool curwin; 272287Sarnold 282261Sarnold WINDOW *_win = NULL; 292261Sarnold 302261Sarnold wrefresh(win) 312261Sarnold reg WINDOW *win; 322261Sarnold { 332261Sarnold reg short wy; 342287Sarnold reg int retval; 3519893Sbloom reg WINDOW *orig; 362261Sarnold 372261Sarnold /* 382261Sarnold * make sure were in visual state 392261Sarnold */ 402261Sarnold if (_endwin) { 412261Sarnold _puts(VS); 422261Sarnold _puts(TI); 432261Sarnold _endwin = FALSE; 442261Sarnold } 452287Sarnold 462287Sarnold /* 472287Sarnold * initialize loop parameters 482287Sarnold */ 492287Sarnold 502287Sarnold ly = curscr->_cury; 512287Sarnold lx = curscr->_curx; 522287Sarnold wy = 0; 532287Sarnold _win = win; 542287Sarnold curwin = (win == curscr); 552287Sarnold 562287Sarnold if (win->_clear || curscr->_clear || curwin) { 572261Sarnold if ((win->_flags & _FULLWIN) || curscr->_clear) { 582261Sarnold _puts(CL); 5912358Sarnold ly = 0; 6012358Sarnold lx = 0; 6112358Sarnold if (!curwin) { 6212358Sarnold curscr->_clear = FALSE; 6312358Sarnold curscr->_cury = 0; 6412358Sarnold curscr->_curx = 0; 652287Sarnold werase(curscr); 6612358Sarnold } 672261Sarnold touchwin(win); 682261Sarnold } 692261Sarnold win->_clear = FALSE; 702261Sarnold } 712261Sarnold if (!CA) { 722261Sarnold if (win->_curx != 0) 7319893Sbloom _putchar('\n'); 742287Sarnold if (!curwin) 752287Sarnold werase(curscr); 762261Sarnold } 772261Sarnold # ifdef DEBUG 782287Sarnold fprintf(outf, "REFRESH(%0.2o): curwin = %d\n", win, curwin); 792261Sarnold fprintf(outf, "REFRESH:\n\tfirstch\tlastch\n"); 802261Sarnold # endif 812261Sarnold for (wy = 0; wy < win->_maxy; wy++) { 822261Sarnold # ifdef DEBUG 8319893Sbloom fprintf(outf, "%d\t%d\t%d\n", wy, win->_firstch[wy], 8419893Sbloom win->_lastch[wy]); 852261Sarnold # endif 862261Sarnold if (win->_firstch[wy] != _NOCHANGE) 872261Sarnold if (makech(win, wy) == ERR) 882261Sarnold return ERR; 8919893Sbloom else { 9019893Sbloom if (win->_firstch[wy] >= win->_ch_off) 9119893Sbloom win->_firstch[wy] = win->_maxx + 9219893Sbloom win->_ch_off; 9319893Sbloom if (win->_lastch[wy] < win->_maxx + 9419893Sbloom win->_ch_off) 9519893Sbloom win->_lastch[wy] = win->_ch_off; 9619893Sbloom if (win->_lastch[wy] < win->_firstch[wy]) 9719893Sbloom win->_firstch[wy] = _NOCHANGE; 9819893Sbloom } 9919893Sbloom # ifdef DEBUG 10019893Sbloom fprintf(outf, "\t%d\t%d\n", win->_firstch[wy], 10119893Sbloom win->_lastch[wy]); 10219893Sbloom # endif 1032261Sarnold } 10419893Sbloom 10512358Sarnold if (win == curscr) 10612358Sarnold domvcur(ly, lx, win->_cury, win->_curx); 10719893Sbloom else { 10819893Sbloom if (win->_leave) { 10919893Sbloom curscr->_cury = ly; 11019893Sbloom curscr->_curx = lx; 11119893Sbloom ly -= win->_begy; 11219893Sbloom lx -= win->_begx; 11319893Sbloom if (ly >= 0 && ly < win->_maxy && lx >= 0 && 11419893Sbloom lx < win->_maxx) { 11519893Sbloom win->_cury = ly; 11619893Sbloom win->_curx = lx; 11719893Sbloom } 11819893Sbloom else 11919893Sbloom win->_cury = win->_curx = 0; 1202261Sarnold } 12119893Sbloom else { 12219893Sbloom domvcur(ly, lx, win->_cury + win->_begy, 12319893Sbloom win->_curx + win->_begx); 12419893Sbloom curscr->_cury = win->_cury + win->_begy; 12519893Sbloom curscr->_curx = win->_curx + win->_begx; 12619893Sbloom } 1272261Sarnold } 1282287Sarnold retval = OK; 1292287Sarnold ret: 1302261Sarnold _win = NULL; 1312261Sarnold fflush(stdout); 1322287Sarnold return retval; 1332261Sarnold } 1342261Sarnold 1352261Sarnold /* 1362261Sarnold * make a change on the screen 1372261Sarnold */ 1382287Sarnold STATIC 1392261Sarnold makech(win, wy) 1402261Sarnold reg WINDOW *win; 1412261Sarnold short wy; 1422261Sarnold { 1432261Sarnold reg char *nsp, *csp, *ce; 1442261Sarnold reg short wx, lch, y; 1452261Sarnold reg int nlsp, clsp; /* last space in lines */ 1462261Sarnold 14719893Sbloom wx = win->_firstch[wy] - win->_ch_off; 14819893Sbloom if (wx >= win->_maxx) 14919893Sbloom return OK; 15019893Sbloom else if (wx < 0) 15119893Sbloom wx = 0; 15219893Sbloom lch = win->_lastch[wy] - win->_ch_off; 15319893Sbloom if (lch < 0) 15419893Sbloom return OK; 15519893Sbloom else if (lch >= win->_maxx) 15619893Sbloom lch = win->_maxx - 1;; 1572261Sarnold y = wy + win->_begy; 15819893Sbloom 1592287Sarnold if (curwin) 1602287Sarnold csp = " "; 1612287Sarnold else 1622287Sarnold csp = &curscr->_y[wy + win->_begy][wx + win->_begx]; 16319893Sbloom 1642261Sarnold nsp = &win->_y[wy][wx]; 1652287Sarnold if (CE && !curwin) { 1662261Sarnold for (ce = &win->_y[wy][win->_maxx - 1]; *ce == ' '; ce--) 1672261Sarnold if (ce <= win->_y[wy]) 1682261Sarnold break; 1692261Sarnold nlsp = ce - win->_y[wy]; 1702261Sarnold } 17119893Sbloom 1722287Sarnold if (!curwin) 1732287Sarnold ce = CE; 1742287Sarnold else 1752287Sarnold ce = NULL; 17619893Sbloom 1772261Sarnold while (wx <= lch) { 1782261Sarnold if (*nsp != *csp) { 17911736Sarnold domvcur(ly, lx, y, wx + win->_begx); 1802261Sarnold # ifdef DEBUG 1812261Sarnold fprintf(outf, "MAKECH: 1: wx = %d, lx = %d\n", wx, lx); 1822261Sarnold # endif 1832261Sarnold ly = y; 1842261Sarnold lx = wx + win->_begx; 1852261Sarnold while (*nsp != *csp && wx <= lch) { 1862287Sarnold if (ce != NULL && wx >= nlsp && *nsp == ' ') { 1872261Sarnold /* 1882261Sarnold * check for clear to end-of-line 1892261Sarnold */ 1902261Sarnold ce = &curscr->_y[ly][COLS - 1]; 1912261Sarnold while (*ce == ' ') 1922261Sarnold if (ce-- <= csp) 1932261Sarnold break; 1942261Sarnold clsp = ce - curscr->_y[ly] - win->_begx; 1952261Sarnold # ifdef DEBUG 1962261Sarnold fprintf(outf, "MAKECH: clsp = %d, nlsp = %d\n", clsp, nlsp); 1972261Sarnold # endif 1982261Sarnold if (clsp - nlsp >= strlen(CE) 1992261Sarnold && clsp < win->_maxx) { 2002261Sarnold # ifdef DEBUG 2012261Sarnold fprintf(outf, "MAKECH: using CE\n"); 2022261Sarnold # endif 2032261Sarnold _puts(CE); 2042261Sarnold lx = wx + win->_begx; 2052261Sarnold while (wx++ <= clsp) 2062261Sarnold *csp++ = ' '; 20719893Sbloom return OK; 2082261Sarnold } 2092261Sarnold ce = NULL; 2102261Sarnold } 2112261Sarnold /* 2122261Sarnold * enter/exit standout mode as appropriate 2132261Sarnold */ 2142261Sarnold if (SO && (*nsp&_STANDOUT) != (curscr->_flags&_STANDOUT)) { 2152261Sarnold if (*nsp & _STANDOUT) { 2162261Sarnold _puts(SO); 2172261Sarnold curscr->_flags |= _STANDOUT; 2182261Sarnold } 2192261Sarnold else { 2202261Sarnold _puts(SE); 2212261Sarnold curscr->_flags &= ~_STANDOUT; 2222261Sarnold } 2232261Sarnold } 2242261Sarnold wx++; 2252906Sarnold if (wx >= win->_maxx && wy == win->_maxy - 1) 2262287Sarnold if (win->_scroll) { 22711736Sarnold if ((curscr->_flags&_STANDOUT) && 22811736Sarnold (win->_flags & _ENDLINE)) 22911736Sarnold if (!MS) { 23011736Sarnold _puts(SE); 23111736Sarnold curscr->_flags &= ~_STANDOUT; 23211736Sarnold } 2332287Sarnold if (!curwin) 23419893Sbloom _putchar((*csp = *nsp) & 0177); 2352287Sarnold else 23619893Sbloom _putchar(*nsp & 0177); 2372287Sarnold if (win->_flags&_FULLWIN && !curwin) 2382287Sarnold scroll(curscr); 2392287Sarnold ly = win->_begy+win->_cury; 2402287Sarnold lx = win->_begx+win->_curx; 2412287Sarnold return OK; 2422287Sarnold } 2432287Sarnold else if (win->_flags&_SCROLLWIN) { 2442287Sarnold lx = --wx; 2452287Sarnold return ERR; 2462287Sarnold } 2472287Sarnold if (!curwin) 24819893Sbloom _putchar((*csp++ = *nsp) & 0177); 2492287Sarnold else 25019893Sbloom _putchar(*nsp & 0177); 25119893Sbloom # ifdef FULLDEBUG 25219893Sbloom fprintf(outf, 25319893Sbloom "MAKECH:putchar(%c)\n", *nsp & 0177); 25419893Sbloom # endif 2552261Sarnold if (UC && (*nsp & _STANDOUT)) { 25619893Sbloom _putchar('\b'); 2572261Sarnold _puts(UC); 2582261Sarnold } 2592261Sarnold nsp++; 2602261Sarnold } 2612261Sarnold # ifdef DEBUG 2622261Sarnold fprintf(outf, "MAKECH: 2: wx = %d, lx = %d\n", wx, lx); 2632261Sarnold # endif 2642261Sarnold if (lx == wx + win->_begx) /* if no change */ 2652261Sarnold break; 2662261Sarnold lx = wx + win->_begx; 26722789Smckusick if (lx >= COLS && AM) { 26822789Smckusick lx = 0; 26922789Smckusick ly++; 27022789Smckusick /* 27122789Smckusick * xn glitch: chomps a newline after auto-wrap. 27222789Smckusick * we just feed it now and forget about it. 27322789Smckusick */ 27422789Smckusick if (XN) { 27522789Smckusick _putchar('\n'); 27622789Smckusick _putchar('\r'); 27722789Smckusick } 27822789Smckusick } 2792261Sarnold } 28022789Smckusick else if (wx <= lch) 28122789Smckusick while (*nsp == *csp && wx <= lch) { 2822287Sarnold nsp++; 2832287Sarnold if (!curwin) 2842287Sarnold csp++; 2852261Sarnold ++wx; 2862261Sarnold } 2872261Sarnold else 2882261Sarnold break; 2892261Sarnold # ifdef DEBUG 2902261Sarnold fprintf(outf, "MAKECH: 3: wx = %d, lx = %d\n", wx, lx); 2912261Sarnold # endif 2922261Sarnold } 29311736Sarnold return OK; 29411736Sarnold } 29511736Sarnold 29611736Sarnold /* 29711736Sarnold * perform a mvcur, leaving standout mode if necessary 29811736Sarnold */ 29919893Sbloom STATIC 30011736Sarnold domvcur(oy, ox, ny, nx) 30111736Sarnold int oy, ox, ny, nx; { 30211736Sarnold 30311736Sarnold if (curscr->_flags & _STANDOUT && !MS) { 3042261Sarnold _puts(SE); 30511736Sarnold curscr->_flags &= ~_STANDOUT; 3062261Sarnold } 30711736Sarnold mvcur(oy, ox, ny, nx); 3082261Sarnold } 309