1*2261Sarnold /* 2*2261Sarnold * make the current screen look like "win" over the area coverd by 3*2261Sarnold * win. 4*2261Sarnold * 5*2261Sarnold * 01/26/81 (Berkeley) @(#)refresh.c 1.1 6*2261Sarnold */ 7*2261Sarnold 8*2261Sarnold # include "curses.ext" 9*2261Sarnold 10*2261Sarnold # ifndef DEBUG 11*2261Sarnold static short ly, lx; 12*2261Sarnold # else 13*2261Sarnold short ly, lx; 14*2261Sarnold # endif 15*2261Sarnold 16*2261Sarnold WINDOW *_win = NULL; 17*2261Sarnold 18*2261Sarnold wrefresh(win) 19*2261Sarnold reg WINDOW *win; 20*2261Sarnold { 21*2261Sarnold reg short wy; 22*2261Sarnold 23*2261Sarnold /* 24*2261Sarnold * make sure were in visual state 25*2261Sarnold */ 26*2261Sarnold if (_endwin) { 27*2261Sarnold _puts(VS); 28*2261Sarnold _puts(TI); 29*2261Sarnold _endwin = FALSE; 30*2261Sarnold } 31*2261Sarnold if (win->_clear || curscr->_clear) { 32*2261Sarnold if ((win->_flags & _FULLWIN) || curscr->_clear) { 33*2261Sarnold _puts(CL); 34*2261Sarnold curscr->_curx = curscr->_cury = 0; 35*2261Sarnold curscr->_clear = FALSE; 36*2261Sarnold werase(curscr); 37*2261Sarnold touchwin(win); 38*2261Sarnold } 39*2261Sarnold win->_clear = FALSE; 40*2261Sarnold } 41*2261Sarnold if (!CA) { 42*2261Sarnold if (win->_curx != 0) 43*2261Sarnold putchar('\n'); 44*2261Sarnold werase(curscr); 45*2261Sarnold } 46*2261Sarnold # ifdef DEBUG 47*2261Sarnold fprintf(outf, "REFRESH:\n\tfirstch\tlastch\n"); 48*2261Sarnold # endif 49*2261Sarnold ly = curscr->_cury; 50*2261Sarnold lx = curscr->_curx; 51*2261Sarnold wy = 0; 52*2261Sarnold _win = win; 53*2261Sarnold for (wy = 0; wy < win->_maxy; wy++) { 54*2261Sarnold # ifdef DEBUG 55*2261Sarnold fprintf(outf, "%d\t%d\t%d\n", wy, win->_firstch[wy], win->_lastch[wy]); 56*2261Sarnold # endif 57*2261Sarnold if (win->_firstch[wy] != _NOCHANGE) 58*2261Sarnold if (makech(win, wy) == ERR) 59*2261Sarnold return ERR; 60*2261Sarnold else 61*2261Sarnold win->_firstch[wy] = _NOCHANGE; 62*2261Sarnold } 63*2261Sarnold if (win->_leave) { 64*2261Sarnold curscr->_cury = ly; 65*2261Sarnold curscr->_curx = lx; 66*2261Sarnold ly -= win->_begy; 67*2261Sarnold lx -= win->_begx; 68*2261Sarnold if (ly >= 0 && ly < win->_maxy && lx >= 0 && lx < win->_maxx) { 69*2261Sarnold win->_cury = ly; 70*2261Sarnold win->_curx = lx; 71*2261Sarnold } 72*2261Sarnold else 73*2261Sarnold win->_cury = win->_curx = 0; 74*2261Sarnold } 75*2261Sarnold else { 76*2261Sarnold mvcur(ly, lx, win->_cury + win->_begy, win->_curx + win->_begx); 77*2261Sarnold curscr->_cury = win->_cury + win->_begy; 78*2261Sarnold curscr->_curx = win->_curx + win->_begx; 79*2261Sarnold } 80*2261Sarnold _win = NULL; 81*2261Sarnold fflush(stdout); 82*2261Sarnold return OK; 83*2261Sarnold } 84*2261Sarnold 85*2261Sarnold /* 86*2261Sarnold * make a change on the screen 87*2261Sarnold */ 88*2261Sarnold # ifndef DEBUG 89*2261Sarnold static 90*2261Sarnold # endif 91*2261Sarnold makech(win, wy) 92*2261Sarnold reg WINDOW *win; 93*2261Sarnold short wy; 94*2261Sarnold { 95*2261Sarnold reg char *nsp, *csp, *ce; 96*2261Sarnold reg short wx, lch, y; 97*2261Sarnold reg int nlsp, clsp; /* last space in lines */ 98*2261Sarnold 99*2261Sarnold wx = win->_firstch[wy]; 100*2261Sarnold y = wy + win->_begy; 101*2261Sarnold lch = win->_lastch[wy]; 102*2261Sarnold csp = &curscr->_y[wy + win->_begy][wx + win->_begx]; 103*2261Sarnold nsp = &win->_y[wy][wx]; 104*2261Sarnold if (CE) { 105*2261Sarnold for (ce = &win->_y[wy][win->_maxx - 1]; *ce == ' '; ce--) 106*2261Sarnold if (ce <= win->_y[wy]) 107*2261Sarnold break; 108*2261Sarnold nlsp = ce - win->_y[wy]; 109*2261Sarnold } 110*2261Sarnold ce = CE; 111*2261Sarnold while (wx <= lch) { 112*2261Sarnold if (*nsp != *csp) { 113*2261Sarnold mvcur(ly, lx, y, wx + win->_begx); 114*2261Sarnold # ifdef DEBUG 115*2261Sarnold fprintf(outf, "MAKECH: 1: wx = %d, lx = %d\n", wx, lx); 116*2261Sarnold # endif 117*2261Sarnold ly = y; 118*2261Sarnold lx = wx + win->_begx; 119*2261Sarnold while (*nsp != *csp && wx <= lch) { 120*2261Sarnold if (ce && wx >= nlsp && *nsp == ' ') { 121*2261Sarnold /* 122*2261Sarnold * check for clear to end-of-line 123*2261Sarnold */ 124*2261Sarnold ce = &curscr->_y[ly][COLS - 1]; 125*2261Sarnold while (*ce == ' ') 126*2261Sarnold if (ce-- <= csp) 127*2261Sarnold break; 128*2261Sarnold clsp = ce - curscr->_y[ly] - win->_begx; 129*2261Sarnold # ifdef DEBUG 130*2261Sarnold fprintf(outf, "MAKECH: clsp = %d, nlsp = %d\n", clsp, nlsp); 131*2261Sarnold # endif 132*2261Sarnold if (clsp - nlsp >= strlen(CE) 133*2261Sarnold && clsp < win->_maxx) { 134*2261Sarnold # ifdef DEBUG 135*2261Sarnold fprintf(outf, "MAKECH: using CE\n"); 136*2261Sarnold # endif 137*2261Sarnold _puts(CE); 138*2261Sarnold lx = wx + win->_begx; 139*2261Sarnold while (wx++ <= clsp) 140*2261Sarnold *csp++ = ' '; 141*2261Sarnold goto ret; 142*2261Sarnold } 143*2261Sarnold ce = NULL; 144*2261Sarnold } 145*2261Sarnold /* 146*2261Sarnold * enter/exit standout mode as appropriate 147*2261Sarnold */ 148*2261Sarnold if (SO && (*nsp&_STANDOUT) != (curscr->_flags&_STANDOUT)) { 149*2261Sarnold if (*nsp & _STANDOUT) { 150*2261Sarnold _puts(SO); 151*2261Sarnold curscr->_flags |= _STANDOUT; 152*2261Sarnold } 153*2261Sarnold else { 154*2261Sarnold _puts(SE); 155*2261Sarnold curscr->_flags &= ~_STANDOUT; 156*2261Sarnold } 157*2261Sarnold } 158*2261Sarnold wx++; 159*2261Sarnold if (wx >= win->_maxx && wy == win->_maxy) 160*2261Sarnold if (win->_scroll) { 161*2261Sarnold if ((win->_flags&(_ENDLINE|_STANDOUT)) == (_ENDLINE|_STANDOUT)) 162*2261Sarnold if (!MS) { 163*2261Sarnold _puts(SE); 164*2261Sarnold win->_flags &= ~_STANDOUT; 165*2261Sarnold } 166*2261Sarnold putchar((*csp = *nsp) & 0177); 167*2261Sarnold scroll(win); 168*2261Sarnold if (win->_flags&_FULLWIN) 169*2261Sarnold scroll(curscr); 170*2261Sarnold ly = win->_begy+win->_cury; 171*2261Sarnold lx = win->_begx+win->_curx; 172*2261Sarnold return OK; 173*2261Sarnold } 174*2261Sarnold else if (win->_flags&_SCROLLWIN) { 175*2261Sarnold lx = --wx; 176*2261Sarnold return ERR; 177*2261Sarnold } 178*2261Sarnold putchar((*csp++ = *nsp) & 0177); 179*2261Sarnold if (UC && (*nsp & _STANDOUT)) { 180*2261Sarnold putchar('\b'); 181*2261Sarnold _puts(UC); 182*2261Sarnold } 183*2261Sarnold nsp++; 184*2261Sarnold } 185*2261Sarnold # ifdef DEBUG 186*2261Sarnold fprintf(outf, "MAKECH: 2: wx = %d, lx = %d\n", wx, lx); 187*2261Sarnold # endif 188*2261Sarnold if (lx == wx + win->_begx) /* if no change */ 189*2261Sarnold break; 190*2261Sarnold lx = wx + win->_begx; 191*2261Sarnold } 192*2261Sarnold else if (wx < lch) 193*2261Sarnold while (*nsp == *csp) { 194*2261Sarnold nsp++, csp++; 195*2261Sarnold ++wx; 196*2261Sarnold } 197*2261Sarnold else 198*2261Sarnold break; 199*2261Sarnold # ifdef DEBUG 200*2261Sarnold fprintf(outf, "MAKECH: 3: wx = %d, lx = %d\n", wx, lx); 201*2261Sarnold # endif 202*2261Sarnold } 203*2261Sarnold ret: 204*2261Sarnold if ((win->_flags & _STANDOUT) && !MS) { 205*2261Sarnold _puts(SE); 206*2261Sarnold win->_flags &= ~_STANDOUT; 207*2261Sarnold } 208*2261Sarnold return OK; 209*2261Sarnold } 210