1*18208Sedward #ifndef lint 2*18208Sedward static char sccsid[] = "@(#)wwsize.c 3.1 03/01/85"; 3*18208Sedward #endif 4*18208Sedward 5*18208Sedward #include "ww.h" 6*18208Sedward 7*18208Sedward /* 8*18208Sedward * Resize a window. Should be unattached. 9*18208Sedward */ 10*18208Sedward wwsize(w, nrow, ncol) 11*18208Sedward register struct ww *w; 12*18208Sedward { 13*18208Sedward register i, j; 14*18208Sedward int nline; 15*18208Sedward union ww_char **buf = 0; 16*18208Sedward char **win = 0; 17*18208Sedward short *nvis = 0; 18*18208Sedward char **fmap = 0; 19*18208Sedward char m; 20*18208Sedward 21*18208Sedward if (w->ww_forw != 0 || w->ww_back != 0) 22*18208Sedward return; /* sanity */ 23*18208Sedward /* 24*18208Sedward * First allocate new buffers. 25*18208Sedward */ 26*18208Sedward win = wwalloc(w->ww_w.t, w->ww_w.l, nrow, ncol, sizeof (char)); 27*18208Sedward if (win == 0) 28*18208Sedward goto bad; 29*18208Sedward if (w->ww_fmap != 0) { 30*18208Sedward fmap = wwalloc(w->ww_w.t, w->ww_w.l, nrow, ncol, sizeof (char)); 31*18208Sedward if (fmap == 0) 32*18208Sedward goto bad; 33*18208Sedward } 34*18208Sedward if (nrow > w->ww_b.nr || ncol > w->ww_b.nc) { 35*18208Sedward nline = MAX(w->ww_b.nr, nrow); 36*18208Sedward buf = (union ww_char **) wwalloc(w->ww_b.t, w->ww_b.l, 37*18208Sedward nline, ncol, sizeof (union ww_char)); 38*18208Sedward if (buf == 0) 39*18208Sedward goto bad; 40*18208Sedward } 41*18208Sedward nvis = (short *)malloc((unsigned) nrow * sizeof (short)); 42*18208Sedward if (nvis == 0) { 43*18208Sedward wwerrno = WWE_NOMEM; 44*18208Sedward goto bad; 45*18208Sedward } 46*18208Sedward nvis -= w->ww_w.t; 47*18208Sedward /* 48*18208Sedward * Copy text buffer. 49*18208Sedward */ 50*18208Sedward if (buf != 0) { 51*18208Sedward int b, r; 52*18208Sedward 53*18208Sedward b = w->ww_b.t + nline; 54*18208Sedward r = w->ww_b.l + ncol; 55*18208Sedward if (ncol < w->ww_b.nc) 56*18208Sedward for (i = w->ww_b.t; i < w->ww_b.b; i++) 57*18208Sedward for (j = w->ww_b.l; j < r; j++) 58*18208Sedward buf[i][j] = w->ww_buf[i][j]; 59*18208Sedward else 60*18208Sedward for (i = w->ww_b.t; i < w->ww_b.b; i++) { 61*18208Sedward for (j = w->ww_b.l; j < w->ww_b.r; j++) 62*18208Sedward buf[i][j] = w->ww_buf[i][j]; 63*18208Sedward for (; j < r; j++) 64*18208Sedward buf[i][j].c_w = ' '; 65*18208Sedward } 66*18208Sedward for (; i < b; i++) 67*18208Sedward for (j = w->ww_b.l; j < r; j++) 68*18208Sedward buf[i][j].c_w = ' '; 69*18208Sedward } 70*18208Sedward /* 71*18208Sedward * Now free the old stuff. 72*18208Sedward */ 73*18208Sedward wwfree((char **)w->ww_win, w->ww_w.t); 74*18208Sedward w->ww_win = win; 75*18208Sedward if (buf != 0) { 76*18208Sedward wwfree((char **)w->ww_buf, w->ww_b.t); 77*18208Sedward w->ww_buf = buf; 78*18208Sedward } 79*18208Sedward if (w->ww_fmap != 0) { 80*18208Sedward wwfree((char **)w->ww_fmap, w->ww_w.t); 81*18208Sedward w->ww_fmap = fmap; 82*18208Sedward } 83*18208Sedward free((char *)(w->ww_nvis + w->ww_w.t)); 84*18208Sedward w->ww_nvis = nvis; 85*18208Sedward /* 86*18208Sedward * Set new sizes. 87*18208Sedward */ 88*18208Sedward /* window */ 89*18208Sedward w->ww_w.b = w->ww_w.t + nrow; 90*18208Sedward w->ww_w.r = w->ww_w.l + ncol; 91*18208Sedward w->ww_w.nr = nrow; 92*18208Sedward w->ww_w.nc = ncol; 93*18208Sedward /* text buffer */ 94*18208Sedward if (buf != 0) { 95*18208Sedward w->ww_b.b = w->ww_b.t + nline; 96*18208Sedward w->ww_b.r = w->ww_b.l + ncol; 97*18208Sedward w->ww_b.nr = nline; 98*18208Sedward w->ww_b.nc = ncol; 99*18208Sedward } 100*18208Sedward /* scroll */ 101*18208Sedward if ((i = w->ww_b.b - w->ww_w.b) < 0 || 102*18208Sedward (i = w->ww_cur.r - w->ww_w.b + 1) > 0) { 103*18208Sedward w->ww_buf += i; 104*18208Sedward w->ww_b.t -= i; 105*18208Sedward w->ww_b.b -= i; 106*18208Sedward w->ww_cur.r -= i; 107*18208Sedward } 108*18208Sedward /* interior */ 109*18208Sedward w->ww_i.b = MIN(w->ww_w.b, wwnrow); 110*18208Sedward w->ww_i.r = MIN(w->ww_w.r, wwncol); 111*18208Sedward w->ww_i.nr = w->ww_i.b - w->ww_i.t; 112*18208Sedward w->ww_i.nc = w->ww_i.r - w->ww_i.l; 113*18208Sedward /* 114*18208Sedward * Initialize new buffers. 115*18208Sedward */ 116*18208Sedward /* window */ 117*18208Sedward m = 0; 118*18208Sedward if (w->ww_oflags & WWO_GLASS) 119*18208Sedward m |= WWM_GLS; 120*18208Sedward if (w->ww_oflags & WWO_REVERSE) 121*18208Sedward m |= WWM_REV; 122*18208Sedward for (i = w->ww_w.t; i < w->ww_w.b; i++) 123*18208Sedward for (j = w->ww_w.l; j < w->ww_w.r; j++) 124*18208Sedward w->ww_win[i][j] = m; 125*18208Sedward /* frame map */ 126*18208Sedward if (fmap != 0) 127*18208Sedward for (i = w->ww_w.t; i < w->ww_w.b; i++) 128*18208Sedward for (j = w->ww_w.l; j < w->ww_w.r; j++) 129*18208Sedward w->ww_fmap[i][j] = 0; 130*18208Sedward /* visibility */ 131*18208Sedward j = m ? 0 : w->ww_w.nc; 132*18208Sedward for (i = w->ww_w.t; i < w->ww_w.b; i++) 133*18208Sedward w->ww_nvis[i] = j; 134*18208Sedward /* 135*18208Sedward * Put cursor back. 136*18208Sedward */ 137*18208Sedward if (w->ww_hascursor) { 138*18208Sedward w->ww_hascursor = 0; 139*18208Sedward wwcursor(w, 1); 140*18208Sedward } 141*18208Sedward /* 142*18208Sedward * Fool with pty. 143*18208Sedward */ 144*18208Sedward if (w->ww_ispty && w->ww_pty >= 0) { 145*18208Sedward struct winsize winsize; 146*18208Sedward 147*18208Sedward winsize.ws_row = nrow; 148*18208Sedward winsize.ws_col = ncol; 149*18208Sedward winsize.ws_xpixel = winsize.ws_ypixel = 0; 150*18208Sedward (void) ioctl(w->ww_pty, TIOCSWINSZ, (char *)&winsize); 151*18208Sedward } 152*18208Sedward return 0; 153*18208Sedward bad: 154*18208Sedward if (win != 0) 155*18208Sedward wwfree(win, w->ww_w.t); 156*18208Sedward if (fmap != 0) 157*18208Sedward wwfree(fmap, w->ww_w.t); 158*18208Sedward if (buf != 0) 159*18208Sedward wwfree((char **)buf, w->ww_b.t); 160*18208Sedward if (nvis != 0) 161*18208Sedward free((char *)(nvis + w->ww_w.t)); 162*18208Sedward return -1; 163*18208Sedward } 164