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