1 /* 2 * Copyright (c) 1983, 1993 3 * The Regents of the University of California. All rights reserved. 4 * 5 * This code is derived from software contributed to Berkeley by 6 * Edward Wang at The University of California, Berkeley. 7 * 8 * %sccs.include.redist.c% 9 */ 10 11 #ifndef lint 12 static char sccsid[] = "@(#)wwsize.c 8.1 (Berkeley) 06/06/93"; 13 #endif /* not lint */ 14 15 #include "ww.h" 16 17 /* 18 * Resize a window. Should be unattached. 19 */ 20 wwsize(w, nrow, ncol) 21 register struct ww *w; 22 { 23 register i, j; 24 int nline; 25 union ww_char **buf = 0; 26 char **win = 0; 27 short *nvis = 0; 28 char **fmap = 0; 29 char m; 30 31 /* 32 * First allocate new buffers. 33 */ 34 win = wwalloc(w->ww_w.t, w->ww_w.l, nrow, ncol, sizeof (char)); 35 if (win == 0) 36 goto bad; 37 if (w->ww_fmap != 0) { 38 fmap = wwalloc(w->ww_w.t, w->ww_w.l, nrow, ncol, sizeof (char)); 39 if (fmap == 0) 40 goto bad; 41 } 42 if (nrow > w->ww_b.nr || ncol > w->ww_b.nc) { 43 nline = MAX(w->ww_b.nr, nrow); 44 buf = (union ww_char **) wwalloc(w->ww_b.t, w->ww_b.l, 45 nline, ncol, sizeof (union ww_char)); 46 if (buf == 0) 47 goto bad; 48 } 49 nvis = (short *)malloc((unsigned) nrow * sizeof (short)); 50 if (nvis == 0) { 51 wwerrno = WWE_NOMEM; 52 goto bad; 53 } 54 nvis -= w->ww_w.t; 55 /* 56 * Copy text buffer. 57 */ 58 if (buf != 0) { 59 int b, r; 60 61 b = w->ww_b.t + nline; 62 r = w->ww_b.l + ncol; 63 if (ncol < w->ww_b.nc) 64 for (i = w->ww_b.t; i < w->ww_b.b; i++) 65 for (j = w->ww_b.l; j < r; j++) 66 buf[i][j] = w->ww_buf[i][j]; 67 else 68 for (i = w->ww_b.t; i < w->ww_b.b; i++) { 69 for (j = w->ww_b.l; j < w->ww_b.r; j++) 70 buf[i][j] = w->ww_buf[i][j]; 71 for (; j < r; j++) 72 buf[i][j].c_w = ' '; 73 } 74 for (; i < b; i++) 75 for (j = w->ww_b.l; j < r; j++) 76 buf[i][j].c_w = ' '; 77 } 78 /* 79 * Now free the old stuff. 80 */ 81 wwfree((char **)w->ww_win, w->ww_w.t); 82 w->ww_win = win; 83 if (buf != 0) { 84 wwfree((char **)w->ww_buf, w->ww_b.t); 85 w->ww_buf = buf; 86 } 87 if (w->ww_fmap != 0) { 88 wwfree((char **)w->ww_fmap, w->ww_w.t); 89 w->ww_fmap = fmap; 90 } 91 free((char *)(w->ww_nvis + w->ww_w.t)); 92 w->ww_nvis = nvis; 93 /* 94 * Set new sizes. 95 */ 96 /* window */ 97 w->ww_w.b = w->ww_w.t + nrow; 98 w->ww_w.r = w->ww_w.l + ncol; 99 w->ww_w.nr = nrow; 100 w->ww_w.nc = ncol; 101 /* text buffer */ 102 if (buf != 0) { 103 w->ww_b.b = w->ww_b.t + nline; 104 w->ww_b.r = w->ww_b.l + ncol; 105 w->ww_b.nr = nline; 106 w->ww_b.nc = ncol; 107 } 108 /* scroll */ 109 if ((i = w->ww_b.b - w->ww_w.b) < 0 || 110 (i = w->ww_cur.r - w->ww_w.b + 1) > 0) { 111 w->ww_buf += i; 112 w->ww_b.t -= i; 113 w->ww_b.b -= i; 114 w->ww_cur.r -= i; 115 } 116 /* interior */ 117 w->ww_i.b = MIN(w->ww_w.b, wwnrow); 118 w->ww_i.r = MIN(w->ww_w.r, wwncol); 119 w->ww_i.nr = w->ww_i.b - w->ww_i.t; 120 w->ww_i.nc = w->ww_i.r - w->ww_i.l; 121 /* 122 * Initialize new buffers. 123 */ 124 /* window */ 125 m = 0; 126 if (w->ww_oflags & WWO_GLASS) 127 m |= WWM_GLS; 128 if (w->ww_oflags & WWO_REVERSE) 129 m |= WWM_REV; 130 for (i = w->ww_w.t; i < w->ww_w.b; i++) 131 for (j = w->ww_w.l; j < w->ww_w.r; j++) 132 w->ww_win[i][j] = m; 133 /* frame map */ 134 if (fmap != 0) 135 for (i = w->ww_w.t; i < w->ww_w.b; i++) 136 for (j = w->ww_w.l; j < w->ww_w.r; j++) 137 w->ww_fmap[i][j] = 0; 138 /* visibility */ 139 j = m ? 0 : w->ww_w.nc; 140 for (i = w->ww_w.t; i < w->ww_w.b; i++) 141 w->ww_nvis[i] = j; 142 /* 143 * Put cursor back. 144 */ 145 if (w->ww_hascursor) { 146 w->ww_hascursor = 0; 147 wwcursor(w, 1); 148 } 149 /* 150 * Fool with pty. 151 */ 152 if (w->ww_ispty && w->ww_pty >= 0) 153 (void) wwsetttysize(w->ww_pty, nrow, ncol); 154 return 0; 155 bad: 156 if (win != 0) 157 wwfree(win, w->ww_w.t); 158 if (fmap != 0) 159 wwfree(fmap, w->ww_w.t); 160 if (buf != 0) 161 wwfree((char **)buf, w->ww_b.t); 162 if (nvis != 0) 163 free((char *)(nvis + w->ww_w.t)); 164 return -1; 165 } 166