118757Sedward /* 2*33514Sbostic * Copyright (c) 1983 Regents of the University of California. 3*33514Sbostic * All rights reserved. 4*33514Sbostic * 5*33514Sbostic * Redistribution and use in source and binary forms are permitted 6*33514Sbostic * provided that this notice is preserved and that due credit is given 7*33514Sbostic * to the University of California at Berkeley. The name of the University 8*33514Sbostic * may not be used to endorse or promote products derived from this 9*33514Sbostic * software without specific prior written permission. This software 10*33514Sbostic * is provided ``as is'' without express or implied warranty. 1118757Sedward */ 1218757Sedward 13*33514Sbostic #ifndef lint 14*33514Sbostic static char sccsid[] = "@(#)wwsize.c 3.5 (Berkeley) 02/21/88"; 15*33514Sbostic #endif /* not lint */ 16*33514Sbostic 1718208Sedward #include "ww.h" 1818208Sedward 1918208Sedward /* 2018208Sedward * Resize a window. Should be unattached. 2118208Sedward */ 2218208Sedward wwsize(w, nrow, ncol) 2318208Sedward register struct ww *w; 2418208Sedward { 2518208Sedward register i, j; 2618208Sedward int nline; 2718208Sedward union ww_char **buf = 0; 2818208Sedward char **win = 0; 2918208Sedward short *nvis = 0; 3018208Sedward char **fmap = 0; 3118208Sedward char m; 3218208Sedward 3318208Sedward /* 3418208Sedward * First allocate new buffers. 3518208Sedward */ 3618208Sedward win = wwalloc(w->ww_w.t, w->ww_w.l, nrow, ncol, sizeof (char)); 3718208Sedward if (win == 0) 3818208Sedward goto bad; 3918208Sedward if (w->ww_fmap != 0) { 4018208Sedward fmap = wwalloc(w->ww_w.t, w->ww_w.l, nrow, ncol, sizeof (char)); 4118208Sedward if (fmap == 0) 4218208Sedward goto bad; 4318208Sedward } 4418208Sedward if (nrow > w->ww_b.nr || ncol > w->ww_b.nc) { 4518208Sedward nline = MAX(w->ww_b.nr, nrow); 4618208Sedward buf = (union ww_char **) wwalloc(w->ww_b.t, w->ww_b.l, 4718208Sedward nline, ncol, sizeof (union ww_char)); 4818208Sedward if (buf == 0) 4918208Sedward goto bad; 5018208Sedward } 5118208Sedward nvis = (short *)malloc((unsigned) nrow * sizeof (short)); 5218208Sedward if (nvis == 0) { 5318208Sedward wwerrno = WWE_NOMEM; 5418208Sedward goto bad; 5518208Sedward } 5618208Sedward nvis -= w->ww_w.t; 5718208Sedward /* 5818208Sedward * Copy text buffer. 5918208Sedward */ 6018208Sedward if (buf != 0) { 6118208Sedward int b, r; 6218208Sedward 6318208Sedward b = w->ww_b.t + nline; 6418208Sedward r = w->ww_b.l + ncol; 6518208Sedward if (ncol < w->ww_b.nc) 6618208Sedward for (i = w->ww_b.t; i < w->ww_b.b; i++) 6718208Sedward for (j = w->ww_b.l; j < r; j++) 6818208Sedward buf[i][j] = w->ww_buf[i][j]; 6918208Sedward else 7018208Sedward for (i = w->ww_b.t; i < w->ww_b.b; i++) { 7118208Sedward for (j = w->ww_b.l; j < w->ww_b.r; j++) 7218208Sedward buf[i][j] = w->ww_buf[i][j]; 7318208Sedward for (; j < r; j++) 7418208Sedward buf[i][j].c_w = ' '; 7518208Sedward } 7618208Sedward for (; i < b; i++) 7718208Sedward for (j = w->ww_b.l; j < r; j++) 7818208Sedward buf[i][j].c_w = ' '; 7918208Sedward } 8018208Sedward /* 8118208Sedward * Now free the old stuff. 8218208Sedward */ 8318208Sedward wwfree((char **)w->ww_win, w->ww_w.t); 8418208Sedward w->ww_win = win; 8518208Sedward if (buf != 0) { 8618208Sedward wwfree((char **)w->ww_buf, w->ww_b.t); 8718208Sedward w->ww_buf = buf; 8818208Sedward } 8918208Sedward if (w->ww_fmap != 0) { 9018208Sedward wwfree((char **)w->ww_fmap, w->ww_w.t); 9118208Sedward w->ww_fmap = fmap; 9218208Sedward } 9318208Sedward free((char *)(w->ww_nvis + w->ww_w.t)); 9418208Sedward w->ww_nvis = nvis; 9518208Sedward /* 9618208Sedward * Set new sizes. 9718208Sedward */ 9818208Sedward /* window */ 9918208Sedward w->ww_w.b = w->ww_w.t + nrow; 10018208Sedward w->ww_w.r = w->ww_w.l + ncol; 10118208Sedward w->ww_w.nr = nrow; 10218208Sedward w->ww_w.nc = ncol; 10318208Sedward /* text buffer */ 10418208Sedward if (buf != 0) { 10518208Sedward w->ww_b.b = w->ww_b.t + nline; 10618208Sedward w->ww_b.r = w->ww_b.l + ncol; 10718208Sedward w->ww_b.nr = nline; 10818208Sedward w->ww_b.nc = ncol; 10918208Sedward } 11018208Sedward /* scroll */ 11118208Sedward if ((i = w->ww_b.b - w->ww_w.b) < 0 || 11218208Sedward (i = w->ww_cur.r - w->ww_w.b + 1) > 0) { 11318208Sedward w->ww_buf += i; 11418208Sedward w->ww_b.t -= i; 11518208Sedward w->ww_b.b -= i; 11618208Sedward w->ww_cur.r -= i; 11718208Sedward } 11818208Sedward /* interior */ 11918208Sedward w->ww_i.b = MIN(w->ww_w.b, wwnrow); 12018208Sedward w->ww_i.r = MIN(w->ww_w.r, wwncol); 12118208Sedward w->ww_i.nr = w->ww_i.b - w->ww_i.t; 12218208Sedward w->ww_i.nc = w->ww_i.r - w->ww_i.l; 12318208Sedward /* 12418208Sedward * Initialize new buffers. 12518208Sedward */ 12618208Sedward /* window */ 12718208Sedward m = 0; 12818208Sedward if (w->ww_oflags & WWO_GLASS) 12918208Sedward m |= WWM_GLS; 13018208Sedward if (w->ww_oflags & WWO_REVERSE) 13118208Sedward m |= WWM_REV; 13218208Sedward for (i = w->ww_w.t; i < w->ww_w.b; i++) 13318208Sedward for (j = w->ww_w.l; j < w->ww_w.r; j++) 13418208Sedward w->ww_win[i][j] = m; 13518208Sedward /* frame map */ 13618208Sedward if (fmap != 0) 13718208Sedward for (i = w->ww_w.t; i < w->ww_w.b; i++) 13818208Sedward for (j = w->ww_w.l; j < w->ww_w.r; j++) 13918208Sedward w->ww_fmap[i][j] = 0; 14018208Sedward /* visibility */ 14118208Sedward j = m ? 0 : w->ww_w.nc; 14218208Sedward for (i = w->ww_w.t; i < w->ww_w.b; i++) 14318208Sedward w->ww_nvis[i] = j; 14418208Sedward /* 14518208Sedward * Put cursor back. 14618208Sedward */ 14718208Sedward if (w->ww_hascursor) { 14818208Sedward w->ww_hascursor = 0; 14918208Sedward wwcursor(w, 1); 15018208Sedward } 15118208Sedward /* 15218208Sedward * Fool with pty. 15318208Sedward */ 15418208Sedward if (w->ww_ispty && w->ww_pty >= 0) { 15518208Sedward struct winsize winsize; 15618208Sedward 15718208Sedward winsize.ws_row = nrow; 15818208Sedward winsize.ws_col = ncol; 15918208Sedward winsize.ws_xpixel = winsize.ws_ypixel = 0; 16029723Sedward (void) ioctl(w->ww_pty, TIOCSWINSZ, (char *)&winsize); 16118208Sedward } 16218208Sedward return 0; 16318208Sedward bad: 16418208Sedward if (win != 0) 16518208Sedward wwfree(win, w->ww_w.t); 16618208Sedward if (fmap != 0) 16718208Sedward wwfree(fmap, w->ww_w.t); 16818208Sedward if (buf != 0) 16918208Sedward wwfree((char **)buf, w->ww_b.t); 17018208Sedward if (nvis != 0) 17118208Sedward free((char *)(nvis + w->ww_w.t)); 17218208Sedward return -1; 17318208Sedward } 174