Annotation of src/usr.bin/window/wwsize.c, Revision 1.8
1.8 ! millert 1: /* $OpenBSD: wwsize.c,v 1.7 2001/11/19 19:02:18 mpech Exp $ */
1.3 niklas 2: /* $NetBSD: wwsize.c,v 1.5 1996/02/08 20:45:11 mycroft Exp $ */
1.1 deraadt 3:
4: /*
5: * Copyright (c) 1983, 1993
6: * The Regents of the University of California. All rights reserved.
7: *
8: * This code is derived from software contributed to Berkeley by
9: * Edward Wang at The University of California, Berkeley.
10: *
11: * Redistribution and use in source and binary forms, with or without
12: * modification, are permitted provided that the following conditions
13: * are met:
14: * 1. Redistributions of source code must retain the above copyright
15: * notice, this list of conditions and the following disclaimer.
16: * 2. Redistributions in binary form must reproduce the above copyright
17: * notice, this list of conditions and the following disclaimer in the
18: * documentation and/or other materials provided with the distribution.
1.8 ! millert 19: * 3. Neither the name of the University nor the names of its contributors
1.1 deraadt 20: * may be used to endorse or promote products derived from this software
21: * without specific prior written permission.
22: *
23: * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
24: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
25: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
26: * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
27: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
28: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
29: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
30: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
31: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
32: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
33: * SUCH DAMAGE.
34: */
35:
36: #ifndef lint
37: #if 0
38: static char sccsid[] = "@(#)wwsize.c 8.1 (Berkeley) 6/6/93";
39: #else
1.8 ! millert 40: static char rcsid[] = "$OpenBSD: wwsize.c,v 1.7 2001/11/19 19:02:18 mpech Exp $";
1.1 deraadt 41: #endif
42: #endif /* not lint */
43:
1.6 millert 44: #include <stdlib.h>
1.1 deraadt 45: #include "ww.h"
46:
47: /*
48: * Resize a window. Should be unattached.
49: */
50: wwsize(w, nrow, ncol)
1.7 mpech 51: struct ww *w;
1.1 deraadt 52: {
1.7 mpech 53: int i, j;
1.1 deraadt 54: int nline;
55: union ww_char **buf = 0;
56: char **win = 0;
57: short *nvis = 0;
58: char **fmap = 0;
59: char m;
60:
61: /*
62: * First allocate new buffers.
63: */
64: win = wwalloc(w->ww_w.t, w->ww_w.l, nrow, ncol, sizeof (char));
65: if (win == 0)
66: goto bad;
67: if (w->ww_fmap != 0) {
68: fmap = wwalloc(w->ww_w.t, w->ww_w.l, nrow, ncol, sizeof (char));
69: if (fmap == 0)
70: goto bad;
71: }
72: if (nrow > w->ww_b.nr || ncol > w->ww_b.nc) {
73: nline = MAX(w->ww_b.nr, nrow);
74: buf = (union ww_char **) wwalloc(w->ww_b.t, w->ww_b.l,
75: nline, ncol, sizeof (union ww_char));
76: if (buf == 0)
77: goto bad;
78: }
1.6 millert 79: nvis = (short *)malloc(nrow * sizeof (short));
1.1 deraadt 80: if (nvis == 0) {
81: wwerrno = WWE_NOMEM;
82: goto bad;
83: }
84: nvis -= w->ww_w.t;
85: /*
86: * Copy text buffer.
87: */
88: if (buf != 0) {
89: int b, r;
90:
91: b = w->ww_b.t + nline;
92: r = w->ww_b.l + ncol;
93: if (ncol < w->ww_b.nc)
94: for (i = w->ww_b.t; i < w->ww_b.b; i++)
95: for (j = w->ww_b.l; j < r; j++)
96: buf[i][j] = w->ww_buf[i][j];
97: else
98: for (i = w->ww_b.t; i < w->ww_b.b; i++) {
99: for (j = w->ww_b.l; j < w->ww_b.r; j++)
100: buf[i][j] = w->ww_buf[i][j];
101: for (; j < r; j++)
102: buf[i][j].c_w = ' ';
103: }
104: for (; i < b; i++)
105: for (j = w->ww_b.l; j < r; j++)
106: buf[i][j].c_w = ' ';
107: }
108: /*
109: * Now free the old stuff.
110: */
111: wwfree((char **)w->ww_win, w->ww_w.t);
112: w->ww_win = win;
113: if (buf != 0) {
114: wwfree((char **)w->ww_buf, w->ww_b.t);
115: w->ww_buf = buf;
116: }
117: if (w->ww_fmap != 0) {
118: wwfree((char **)w->ww_fmap, w->ww_w.t);
119: w->ww_fmap = fmap;
120: }
121: free((char *)(w->ww_nvis + w->ww_w.t));
122: w->ww_nvis = nvis;
123: /*
124: * Set new sizes.
125: */
126: /* window */
127: w->ww_w.b = w->ww_w.t + nrow;
128: w->ww_w.r = w->ww_w.l + ncol;
129: w->ww_w.nr = nrow;
130: w->ww_w.nc = ncol;
131: /* text buffer */
132: if (buf != 0) {
133: w->ww_b.b = w->ww_b.t + nline;
134: w->ww_b.r = w->ww_b.l + ncol;
135: w->ww_b.nr = nline;
136: w->ww_b.nc = ncol;
137: }
138: /* scroll */
139: if ((i = w->ww_b.b - w->ww_w.b) < 0 ||
140: (i = w->ww_cur.r - w->ww_w.b + 1) > 0) {
141: w->ww_buf += i;
142: w->ww_b.t -= i;
143: w->ww_b.b -= i;
144: w->ww_cur.r -= i;
145: }
146: /* interior */
147: w->ww_i.b = MIN(w->ww_w.b, wwnrow);
148: w->ww_i.r = MIN(w->ww_w.r, wwncol);
149: w->ww_i.nr = w->ww_i.b - w->ww_i.t;
150: w->ww_i.nc = w->ww_i.r - w->ww_i.l;
151: /*
152: * Initialize new buffers.
153: */
154: /* window */
155: m = 0;
156: if (w->ww_oflags & WWO_GLASS)
157: m |= WWM_GLS;
158: if (w->ww_oflags & WWO_REVERSE)
159: m |= WWM_REV;
160: for (i = w->ww_w.t; i < w->ww_w.b; i++)
161: for (j = w->ww_w.l; j < w->ww_w.r; j++)
162: w->ww_win[i][j] = m;
163: /* frame map */
164: if (fmap != 0)
165: for (i = w->ww_w.t; i < w->ww_w.b; i++)
166: for (j = w->ww_w.l; j < w->ww_w.r; j++)
167: w->ww_fmap[i][j] = 0;
168: /* visibility */
169: j = m ? 0 : w->ww_w.nc;
170: for (i = w->ww_w.t; i < w->ww_w.b; i++)
171: w->ww_nvis[i] = j;
172: /*
173: * Put cursor back.
174: */
1.3 niklas 175: if (ISSET(w->ww_wflags, WWW_HASCURSOR)) {
176: CLR(w->ww_wflags, WWW_HASCURSOR);
1.1 deraadt 177: wwcursor(w, 1);
178: }
179: /*
180: * Fool with pty.
181: */
1.2 deraadt 182: if (w->ww_type == WWT_PTY && w->ww_pty >= 0)
1.1 deraadt 183: (void) wwsetttysize(w->ww_pty, nrow, ncol);
184: return 0;
185: bad:
186: if (win != 0)
187: wwfree(win, w->ww_w.t);
188: if (fmap != 0)
189: wwfree(fmap, w->ww_w.t);
190: if (buf != 0)
191: wwfree((char **)buf, w->ww_b.t);
192: if (nvis != 0)
193: free((char *)(nvis + w->ww_w.t));
194: return -1;
195: }