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