118757Sedward /* 233514Sbostic * Copyright (c) 1983 Regents of the University of California. 333514Sbostic * All rights reserved. 433514Sbostic * 5*42954Sbostic * This code is derived from software contributed to Berkeley by 6*42954Sbostic * Edward Wang at The University of California, Berkeley. 7*42954Sbostic * 842835Sbostic * %sccs.include.redist.c% 918757Sedward */ 1018757Sedward 1133514Sbostic #ifndef lint 12*42954Sbostic static char sccsid[] = "@(#)wwsize.c 3.9 (Berkeley) 06/06/90"; 1333514Sbostic #endif /* not lint */ 1433514Sbostic 1518208Sedward #include "ww.h" 1642834Sedward #ifdef POSIX_TTY 1742834Sedward #include <sys/ioctl.h> 1842834Sedward #endif 1918208Sedward 2018208Sedward /* 2118208Sedward * Resize a window. Should be unattached. 2218208Sedward */ 2318208Sedward wwsize(w, nrow, ncol) 2418208Sedward register struct ww *w; 2518208Sedward { 2618208Sedward register i, j; 2718208Sedward int nline; 2818208Sedward union ww_char **buf = 0; 2918208Sedward char **win = 0; 3018208Sedward short *nvis = 0; 3118208Sedward char **fmap = 0; 3218208Sedward char m; 3318208Sedward 3418208Sedward /* 3518208Sedward * First allocate new buffers. 3618208Sedward */ 3718208Sedward win = wwalloc(w->ww_w.t, w->ww_w.l, nrow, ncol, sizeof (char)); 3818208Sedward if (win == 0) 3918208Sedward goto bad; 4018208Sedward if (w->ww_fmap != 0) { 4118208Sedward fmap = wwalloc(w->ww_w.t, w->ww_w.l, nrow, ncol, sizeof (char)); 4218208Sedward if (fmap == 0) 4318208Sedward goto bad; 4418208Sedward } 4518208Sedward if (nrow > w->ww_b.nr || ncol > w->ww_b.nc) { 4618208Sedward nline = MAX(w->ww_b.nr, nrow); 4718208Sedward buf = (union ww_char **) wwalloc(w->ww_b.t, w->ww_b.l, 4818208Sedward nline, ncol, sizeof (union ww_char)); 4918208Sedward if (buf == 0) 5018208Sedward goto bad; 5118208Sedward } 5218208Sedward nvis = (short *)malloc((unsigned) nrow * sizeof (short)); 5318208Sedward if (nvis == 0) { 5418208Sedward wwerrno = WWE_NOMEM; 5518208Sedward goto bad; 5618208Sedward } 5718208Sedward nvis -= w->ww_w.t; 5818208Sedward /* 5918208Sedward * Copy text buffer. 6018208Sedward */ 6118208Sedward if (buf != 0) { 6218208Sedward int b, r; 6318208Sedward 6418208Sedward b = w->ww_b.t + nline; 6518208Sedward r = w->ww_b.l + ncol; 6618208Sedward if (ncol < w->ww_b.nc) 6718208Sedward for (i = w->ww_b.t; i < w->ww_b.b; i++) 6818208Sedward for (j = w->ww_b.l; j < r; j++) 6918208Sedward buf[i][j] = w->ww_buf[i][j]; 7018208Sedward else 7118208Sedward for (i = w->ww_b.t; i < w->ww_b.b; i++) { 7218208Sedward for (j = w->ww_b.l; j < w->ww_b.r; j++) 7318208Sedward buf[i][j] = w->ww_buf[i][j]; 7418208Sedward for (; j < r; j++) 7518208Sedward buf[i][j].c_w = ' '; 7618208Sedward } 7718208Sedward for (; i < b; i++) 7818208Sedward for (j = w->ww_b.l; j < r; j++) 7918208Sedward buf[i][j].c_w = ' '; 8018208Sedward } 8118208Sedward /* 8218208Sedward * Now free the old stuff. 8318208Sedward */ 8418208Sedward wwfree((char **)w->ww_win, w->ww_w.t); 8518208Sedward w->ww_win = win; 8618208Sedward if (buf != 0) { 8718208Sedward wwfree((char **)w->ww_buf, w->ww_b.t); 8818208Sedward w->ww_buf = buf; 8918208Sedward } 9018208Sedward if (w->ww_fmap != 0) { 9118208Sedward wwfree((char **)w->ww_fmap, w->ww_w.t); 9218208Sedward w->ww_fmap = fmap; 9318208Sedward } 9418208Sedward free((char *)(w->ww_nvis + w->ww_w.t)); 9518208Sedward w->ww_nvis = nvis; 9618208Sedward /* 9718208Sedward * Set new sizes. 9818208Sedward */ 9918208Sedward /* window */ 10018208Sedward w->ww_w.b = w->ww_w.t + nrow; 10118208Sedward w->ww_w.r = w->ww_w.l + ncol; 10218208Sedward w->ww_w.nr = nrow; 10318208Sedward w->ww_w.nc = ncol; 10418208Sedward /* text buffer */ 10518208Sedward if (buf != 0) { 10618208Sedward w->ww_b.b = w->ww_b.t + nline; 10718208Sedward w->ww_b.r = w->ww_b.l + ncol; 10818208Sedward w->ww_b.nr = nline; 10918208Sedward w->ww_b.nc = ncol; 11018208Sedward } 11118208Sedward /* scroll */ 11218208Sedward if ((i = w->ww_b.b - w->ww_w.b) < 0 || 11318208Sedward (i = w->ww_cur.r - w->ww_w.b + 1) > 0) { 11418208Sedward w->ww_buf += i; 11518208Sedward w->ww_b.t -= i; 11618208Sedward w->ww_b.b -= i; 11718208Sedward w->ww_cur.r -= i; 11818208Sedward } 11918208Sedward /* interior */ 12018208Sedward w->ww_i.b = MIN(w->ww_w.b, wwnrow); 12118208Sedward w->ww_i.r = MIN(w->ww_w.r, wwncol); 12218208Sedward w->ww_i.nr = w->ww_i.b - w->ww_i.t; 12318208Sedward w->ww_i.nc = w->ww_i.r - w->ww_i.l; 12418208Sedward /* 12518208Sedward * Initialize new buffers. 12618208Sedward */ 12718208Sedward /* window */ 12818208Sedward m = 0; 12918208Sedward if (w->ww_oflags & WWO_GLASS) 13018208Sedward m |= WWM_GLS; 13118208Sedward if (w->ww_oflags & WWO_REVERSE) 13218208Sedward m |= WWM_REV; 13318208Sedward for (i = w->ww_w.t; i < w->ww_w.b; i++) 13418208Sedward for (j = w->ww_w.l; j < w->ww_w.r; j++) 13518208Sedward w->ww_win[i][j] = m; 13618208Sedward /* frame map */ 13718208Sedward if (fmap != 0) 13818208Sedward for (i = w->ww_w.t; i < w->ww_w.b; i++) 13918208Sedward for (j = w->ww_w.l; j < w->ww_w.r; j++) 14018208Sedward w->ww_fmap[i][j] = 0; 14118208Sedward /* visibility */ 14218208Sedward j = m ? 0 : w->ww_w.nc; 14318208Sedward for (i = w->ww_w.t; i < w->ww_w.b; i++) 14418208Sedward w->ww_nvis[i] = j; 14518208Sedward /* 14618208Sedward * Put cursor back. 14718208Sedward */ 14818208Sedward if (w->ww_hascursor) { 14918208Sedward w->ww_hascursor = 0; 15018208Sedward wwcursor(w, 1); 15118208Sedward } 15218208Sedward /* 15318208Sedward * Fool with pty. 15418208Sedward */ 15518208Sedward if (w->ww_ispty && w->ww_pty >= 0) { 15618208Sedward struct winsize winsize; 15718208Sedward 15818208Sedward winsize.ws_row = nrow; 15918208Sedward winsize.ws_col = ncol; 16018208Sedward winsize.ws_xpixel = winsize.ws_ypixel = 0; 16129723Sedward (void) ioctl(w->ww_pty, TIOCSWINSZ, (char *)&winsize); 16218208Sedward } 16318208Sedward return 0; 16418208Sedward bad: 16518208Sedward if (win != 0) 16618208Sedward wwfree(win, w->ww_w.t); 16718208Sedward if (fmap != 0) 16818208Sedward wwfree(fmap, w->ww_w.t); 16918208Sedward if (buf != 0) 17018208Sedward wwfree((char **)buf, w->ww_b.t); 17118208Sedward if (nvis != 0) 17218208Sedward free((char *)(nvis + w->ww_w.t)); 17318208Sedward return -1; 17418208Sedward } 175