118208Sedward #ifndef lint 2*18572Sedward static char sccsid[] = "@(#)wwsize.c 3.2 04/03/85"; 318208Sedward #endif 418208Sedward 518208Sedward #include "ww.h" 618208Sedward 718208Sedward /* 818208Sedward * Resize a window. Should be unattached. 918208Sedward */ 1018208Sedward wwsize(w, nrow, ncol) 1118208Sedward register struct ww *w; 1218208Sedward { 1318208Sedward register i, j; 1418208Sedward int nline; 1518208Sedward union ww_char **buf = 0; 1618208Sedward char **win = 0; 1718208Sedward short *nvis = 0; 1818208Sedward char **fmap = 0; 1918208Sedward char m; 2018208Sedward 2118208Sedward /* 2218208Sedward * First allocate new buffers. 2318208Sedward */ 2418208Sedward win = wwalloc(w->ww_w.t, w->ww_w.l, nrow, ncol, sizeof (char)); 2518208Sedward if (win == 0) 2618208Sedward goto bad; 2718208Sedward if (w->ww_fmap != 0) { 2818208Sedward fmap = wwalloc(w->ww_w.t, w->ww_w.l, nrow, ncol, sizeof (char)); 2918208Sedward if (fmap == 0) 3018208Sedward goto bad; 3118208Sedward } 3218208Sedward if (nrow > w->ww_b.nr || ncol > w->ww_b.nc) { 3318208Sedward nline = MAX(w->ww_b.nr, nrow); 3418208Sedward buf = (union ww_char **) wwalloc(w->ww_b.t, w->ww_b.l, 3518208Sedward nline, ncol, sizeof (union ww_char)); 3618208Sedward if (buf == 0) 3718208Sedward goto bad; 3818208Sedward } 3918208Sedward nvis = (short *)malloc((unsigned) nrow * sizeof (short)); 4018208Sedward if (nvis == 0) { 4118208Sedward wwerrno = WWE_NOMEM; 4218208Sedward goto bad; 4318208Sedward } 4418208Sedward nvis -= w->ww_w.t; 4518208Sedward /* 4618208Sedward * Copy text buffer. 4718208Sedward */ 4818208Sedward if (buf != 0) { 4918208Sedward int b, r; 5018208Sedward 5118208Sedward b = w->ww_b.t + nline; 5218208Sedward r = w->ww_b.l + ncol; 5318208Sedward if (ncol < w->ww_b.nc) 5418208Sedward for (i = w->ww_b.t; i < w->ww_b.b; i++) 5518208Sedward for (j = w->ww_b.l; j < r; j++) 5618208Sedward buf[i][j] = w->ww_buf[i][j]; 5718208Sedward else 5818208Sedward for (i = w->ww_b.t; i < w->ww_b.b; i++) { 5918208Sedward for (j = w->ww_b.l; j < w->ww_b.r; j++) 6018208Sedward buf[i][j] = w->ww_buf[i][j]; 6118208Sedward for (; j < r; j++) 6218208Sedward buf[i][j].c_w = ' '; 6318208Sedward } 6418208Sedward for (; i < b; i++) 6518208Sedward for (j = w->ww_b.l; j < r; j++) 6618208Sedward buf[i][j].c_w = ' '; 6718208Sedward } 6818208Sedward /* 6918208Sedward * Now free the old stuff. 7018208Sedward */ 7118208Sedward wwfree((char **)w->ww_win, w->ww_w.t); 7218208Sedward w->ww_win = win; 7318208Sedward if (buf != 0) { 7418208Sedward wwfree((char **)w->ww_buf, w->ww_b.t); 7518208Sedward w->ww_buf = buf; 7618208Sedward } 7718208Sedward if (w->ww_fmap != 0) { 7818208Sedward wwfree((char **)w->ww_fmap, w->ww_w.t); 7918208Sedward w->ww_fmap = fmap; 8018208Sedward } 8118208Sedward free((char *)(w->ww_nvis + w->ww_w.t)); 8218208Sedward w->ww_nvis = nvis; 8318208Sedward /* 8418208Sedward * Set new sizes. 8518208Sedward */ 8618208Sedward /* window */ 8718208Sedward w->ww_w.b = w->ww_w.t + nrow; 8818208Sedward w->ww_w.r = w->ww_w.l + ncol; 8918208Sedward w->ww_w.nr = nrow; 9018208Sedward w->ww_w.nc = ncol; 9118208Sedward /* text buffer */ 9218208Sedward if (buf != 0) { 9318208Sedward w->ww_b.b = w->ww_b.t + nline; 9418208Sedward w->ww_b.r = w->ww_b.l + ncol; 9518208Sedward w->ww_b.nr = nline; 9618208Sedward w->ww_b.nc = ncol; 9718208Sedward } 9818208Sedward /* scroll */ 9918208Sedward if ((i = w->ww_b.b - w->ww_w.b) < 0 || 10018208Sedward (i = w->ww_cur.r - w->ww_w.b + 1) > 0) { 10118208Sedward w->ww_buf += i; 10218208Sedward w->ww_b.t -= i; 10318208Sedward w->ww_b.b -= i; 10418208Sedward w->ww_cur.r -= i; 10518208Sedward } 10618208Sedward /* interior */ 10718208Sedward w->ww_i.b = MIN(w->ww_w.b, wwnrow); 10818208Sedward w->ww_i.r = MIN(w->ww_w.r, wwncol); 10918208Sedward w->ww_i.nr = w->ww_i.b - w->ww_i.t; 11018208Sedward w->ww_i.nc = w->ww_i.r - w->ww_i.l; 11118208Sedward /* 11218208Sedward * Initialize new buffers. 11318208Sedward */ 11418208Sedward /* window */ 11518208Sedward m = 0; 11618208Sedward if (w->ww_oflags & WWO_GLASS) 11718208Sedward m |= WWM_GLS; 11818208Sedward if (w->ww_oflags & WWO_REVERSE) 11918208Sedward m |= WWM_REV; 12018208Sedward for (i = w->ww_w.t; i < w->ww_w.b; i++) 12118208Sedward for (j = w->ww_w.l; j < w->ww_w.r; j++) 12218208Sedward w->ww_win[i][j] = m; 12318208Sedward /* frame map */ 12418208Sedward if (fmap != 0) 12518208Sedward for (i = w->ww_w.t; i < w->ww_w.b; i++) 12618208Sedward for (j = w->ww_w.l; j < w->ww_w.r; j++) 12718208Sedward w->ww_fmap[i][j] = 0; 12818208Sedward /* visibility */ 12918208Sedward j = m ? 0 : w->ww_w.nc; 13018208Sedward for (i = w->ww_w.t; i < w->ww_w.b; i++) 13118208Sedward w->ww_nvis[i] = j; 13218208Sedward /* 13318208Sedward * Put cursor back. 13418208Sedward */ 13518208Sedward if (w->ww_hascursor) { 13618208Sedward w->ww_hascursor = 0; 13718208Sedward wwcursor(w, 1); 13818208Sedward } 13918208Sedward /* 14018208Sedward * Fool with pty. 14118208Sedward */ 14218208Sedward if (w->ww_ispty && w->ww_pty >= 0) { 14318208Sedward struct winsize winsize; 14418208Sedward 14518208Sedward winsize.ws_row = nrow; 14618208Sedward winsize.ws_col = ncol; 14718208Sedward winsize.ws_xpixel = winsize.ws_ypixel = 0; 148*18572Sedward (void) ioctl(w->ww_pty, (int)TIOCSWINSZ, (char *)&winsize); 14918208Sedward } 15018208Sedward return 0; 15118208Sedward bad: 15218208Sedward if (win != 0) 15318208Sedward wwfree(win, w->ww_w.t); 15418208Sedward if (fmap != 0) 15518208Sedward wwfree(fmap, w->ww_w.t); 15618208Sedward if (buf != 0) 15718208Sedward wwfree((char **)buf, w->ww_b.t); 15818208Sedward if (nvis != 0) 15918208Sedward free((char *)(nvis + w->ww_w.t)); 16018208Sedward return -1; 16118208Sedward } 162