118757Sedward /* 233514Sbostic * Copyright (c) 1983 Regents of the University of California. 333514Sbostic * All rights reserved. 433514Sbostic * 533514Sbostic * Redistribution and use in source and binary forms are permitted 6*34909Sbostic * provided that the above copyright notice and this paragraph are 7*34909Sbostic * duplicated in all such forms and that any documentation, 8*34909Sbostic * advertising materials, and other materials related to such 9*34909Sbostic * distribution and use acknowledge that the software was developed 10*34909Sbostic * by the University of California, Berkeley. The name of the 11*34909Sbostic * University may not be used to endorse or promote products derived 12*34909Sbostic * from this software without specific prior written permission. 13*34909Sbostic * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR 14*34909Sbostic * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED 15*34909Sbostic * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. 1618757Sedward */ 1718757Sedward 1833514Sbostic #ifndef lint 19*34909Sbostic static char sccsid[] = "@(#)wwsize.c 3.6 (Berkeley) 06/29/88"; 2033514Sbostic #endif /* not lint */ 2133514Sbostic 2218208Sedward #include "ww.h" 2318208Sedward 2418208Sedward /* 2518208Sedward * Resize a window. Should be unattached. 2618208Sedward */ 2718208Sedward wwsize(w, nrow, ncol) 2818208Sedward register struct ww *w; 2918208Sedward { 3018208Sedward register i, j; 3118208Sedward int nline; 3218208Sedward union ww_char **buf = 0; 3318208Sedward char **win = 0; 3418208Sedward short *nvis = 0; 3518208Sedward char **fmap = 0; 3618208Sedward char m; 3718208Sedward 3818208Sedward /* 3918208Sedward * First allocate new buffers. 4018208Sedward */ 4118208Sedward win = wwalloc(w->ww_w.t, w->ww_w.l, nrow, ncol, sizeof (char)); 4218208Sedward if (win == 0) 4318208Sedward goto bad; 4418208Sedward if (w->ww_fmap != 0) { 4518208Sedward fmap = wwalloc(w->ww_w.t, w->ww_w.l, nrow, ncol, sizeof (char)); 4618208Sedward if (fmap == 0) 4718208Sedward goto bad; 4818208Sedward } 4918208Sedward if (nrow > w->ww_b.nr || ncol > w->ww_b.nc) { 5018208Sedward nline = MAX(w->ww_b.nr, nrow); 5118208Sedward buf = (union ww_char **) wwalloc(w->ww_b.t, w->ww_b.l, 5218208Sedward nline, ncol, sizeof (union ww_char)); 5318208Sedward if (buf == 0) 5418208Sedward goto bad; 5518208Sedward } 5618208Sedward nvis = (short *)malloc((unsigned) nrow * sizeof (short)); 5718208Sedward if (nvis == 0) { 5818208Sedward wwerrno = WWE_NOMEM; 5918208Sedward goto bad; 6018208Sedward } 6118208Sedward nvis -= w->ww_w.t; 6218208Sedward /* 6318208Sedward * Copy text buffer. 6418208Sedward */ 6518208Sedward if (buf != 0) { 6618208Sedward int b, r; 6718208Sedward 6818208Sedward b = w->ww_b.t + nline; 6918208Sedward r = w->ww_b.l + ncol; 7018208Sedward if (ncol < w->ww_b.nc) 7118208Sedward for (i = w->ww_b.t; i < w->ww_b.b; i++) 7218208Sedward for (j = w->ww_b.l; j < r; j++) 7318208Sedward buf[i][j] = w->ww_buf[i][j]; 7418208Sedward else 7518208Sedward for (i = w->ww_b.t; i < w->ww_b.b; i++) { 7618208Sedward for (j = w->ww_b.l; j < w->ww_b.r; j++) 7718208Sedward buf[i][j] = w->ww_buf[i][j]; 7818208Sedward for (; j < r; j++) 7918208Sedward buf[i][j].c_w = ' '; 8018208Sedward } 8118208Sedward for (; i < b; i++) 8218208Sedward for (j = w->ww_b.l; j < r; j++) 8318208Sedward buf[i][j].c_w = ' '; 8418208Sedward } 8518208Sedward /* 8618208Sedward * Now free the old stuff. 8718208Sedward */ 8818208Sedward wwfree((char **)w->ww_win, w->ww_w.t); 8918208Sedward w->ww_win = win; 9018208Sedward if (buf != 0) { 9118208Sedward wwfree((char **)w->ww_buf, w->ww_b.t); 9218208Sedward w->ww_buf = buf; 9318208Sedward } 9418208Sedward if (w->ww_fmap != 0) { 9518208Sedward wwfree((char **)w->ww_fmap, w->ww_w.t); 9618208Sedward w->ww_fmap = fmap; 9718208Sedward } 9818208Sedward free((char *)(w->ww_nvis + w->ww_w.t)); 9918208Sedward w->ww_nvis = nvis; 10018208Sedward /* 10118208Sedward * Set new sizes. 10218208Sedward */ 10318208Sedward /* window */ 10418208Sedward w->ww_w.b = w->ww_w.t + nrow; 10518208Sedward w->ww_w.r = w->ww_w.l + ncol; 10618208Sedward w->ww_w.nr = nrow; 10718208Sedward w->ww_w.nc = ncol; 10818208Sedward /* text buffer */ 10918208Sedward if (buf != 0) { 11018208Sedward w->ww_b.b = w->ww_b.t + nline; 11118208Sedward w->ww_b.r = w->ww_b.l + ncol; 11218208Sedward w->ww_b.nr = nline; 11318208Sedward w->ww_b.nc = ncol; 11418208Sedward } 11518208Sedward /* scroll */ 11618208Sedward if ((i = w->ww_b.b - w->ww_w.b) < 0 || 11718208Sedward (i = w->ww_cur.r - w->ww_w.b + 1) > 0) { 11818208Sedward w->ww_buf += i; 11918208Sedward w->ww_b.t -= i; 12018208Sedward w->ww_b.b -= i; 12118208Sedward w->ww_cur.r -= i; 12218208Sedward } 12318208Sedward /* interior */ 12418208Sedward w->ww_i.b = MIN(w->ww_w.b, wwnrow); 12518208Sedward w->ww_i.r = MIN(w->ww_w.r, wwncol); 12618208Sedward w->ww_i.nr = w->ww_i.b - w->ww_i.t; 12718208Sedward w->ww_i.nc = w->ww_i.r - w->ww_i.l; 12818208Sedward /* 12918208Sedward * Initialize new buffers. 13018208Sedward */ 13118208Sedward /* window */ 13218208Sedward m = 0; 13318208Sedward if (w->ww_oflags & WWO_GLASS) 13418208Sedward m |= WWM_GLS; 13518208Sedward if (w->ww_oflags & WWO_REVERSE) 13618208Sedward m |= WWM_REV; 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_win[i][j] = m; 14018208Sedward /* frame map */ 14118208Sedward if (fmap != 0) 14218208Sedward for (i = w->ww_w.t; i < w->ww_w.b; i++) 14318208Sedward for (j = w->ww_w.l; j < w->ww_w.r; j++) 14418208Sedward w->ww_fmap[i][j] = 0; 14518208Sedward /* visibility */ 14618208Sedward j = m ? 0 : w->ww_w.nc; 14718208Sedward for (i = w->ww_w.t; i < w->ww_w.b; i++) 14818208Sedward w->ww_nvis[i] = j; 14918208Sedward /* 15018208Sedward * Put cursor back. 15118208Sedward */ 15218208Sedward if (w->ww_hascursor) { 15318208Sedward w->ww_hascursor = 0; 15418208Sedward wwcursor(w, 1); 15518208Sedward } 15618208Sedward /* 15718208Sedward * Fool with pty. 15818208Sedward */ 15918208Sedward if (w->ww_ispty && w->ww_pty >= 0) { 16018208Sedward struct winsize winsize; 16118208Sedward 16218208Sedward winsize.ws_row = nrow; 16318208Sedward winsize.ws_col = ncol; 16418208Sedward winsize.ws_xpixel = winsize.ws_ypixel = 0; 16529723Sedward (void) ioctl(w->ww_pty, TIOCSWINSZ, (char *)&winsize); 16618208Sedward } 16718208Sedward return 0; 16818208Sedward bad: 16918208Sedward if (win != 0) 17018208Sedward wwfree(win, w->ww_w.t); 17118208Sedward if (fmap != 0) 17218208Sedward wwfree(fmap, w->ww_w.t); 17318208Sedward if (buf != 0) 17418208Sedward wwfree((char **)buf, w->ww_b.t); 17518208Sedward if (nvis != 0) 17618208Sedward free((char *)(nvis + w->ww_w.t)); 17718208Sedward return -1; 17818208Sedward } 179