|
|
1.1 root 1: /*
2: * Copyright (c) 1983 Regents of the University of California.
3: * All rights reserved.
4: *
5: * Redistribution and use in source and binary forms are permitted
6: * provided that the above copyright notice and this paragraph are
7: * duplicated in all such forms and that any documentation,
8: * advertising materials, and other materials related to such
9: * distribution and use acknowledge that the software was developed
10: * by the University of California, Berkeley. The name of the
11: * University may not be used to endorse or promote products derived
12: * from this software without specific prior written permission.
13: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
14: * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
15: * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
16: */
17:
18: #ifndef lint
19: static char sccsid[] = "@(#)wwsize.c 3.6 (Berkeley) 6/29/88";
20: #endif /* not lint */
21:
22: #include "ww.h"
23:
24: /*
25: * Resize a window. Should be unattached.
26: */
27: wwsize(w, nrow, ncol)
28: register struct ww *w;
29: {
30: register i, j;
31: int nline;
32: union ww_char **buf = 0;
33: char **win = 0;
34: short *nvis = 0;
35: char **fmap = 0;
36: char m;
37:
38: /*
39: * First allocate new buffers.
40: */
41: win = wwalloc(w->ww_w.t, w->ww_w.l, nrow, ncol, sizeof (char));
42: if (win == 0)
43: goto bad;
44: if (w->ww_fmap != 0) {
45: fmap = wwalloc(w->ww_w.t, w->ww_w.l, nrow, ncol, sizeof (char));
46: if (fmap == 0)
47: goto bad;
48: }
49: if (nrow > w->ww_b.nr || ncol > w->ww_b.nc) {
50: nline = MAX(w->ww_b.nr, nrow);
51: buf = (union ww_char **) wwalloc(w->ww_b.t, w->ww_b.l,
52: nline, ncol, sizeof (union ww_char));
53: if (buf == 0)
54: goto bad;
55: }
56: nvis = (short *)malloc((unsigned) nrow * sizeof (short));
57: if (nvis == 0) {
58: wwerrno = WWE_NOMEM;
59: goto bad;
60: }
61: nvis -= w->ww_w.t;
62: /*
63: * Copy text buffer.
64: */
65: if (buf != 0) {
66: int b, r;
67:
68: b = w->ww_b.t + nline;
69: r = w->ww_b.l + ncol;
70: if (ncol < w->ww_b.nc)
71: for (i = w->ww_b.t; i < w->ww_b.b; i++)
72: for (j = w->ww_b.l; j < r; j++)
73: buf[i][j] = w->ww_buf[i][j];
74: else
75: for (i = w->ww_b.t; i < w->ww_b.b; i++) {
76: for (j = w->ww_b.l; j < w->ww_b.r; j++)
77: buf[i][j] = w->ww_buf[i][j];
78: for (; j < r; j++)
79: buf[i][j].c_w = ' ';
80: }
81: for (; i < b; i++)
82: for (j = w->ww_b.l; j < r; j++)
83: buf[i][j].c_w = ' ';
84: }
85: /*
86: * Now free the old stuff.
87: */
88: wwfree((char **)w->ww_win, w->ww_w.t);
89: w->ww_win = win;
90: if (buf != 0) {
91: wwfree((char **)w->ww_buf, w->ww_b.t);
92: w->ww_buf = buf;
93: }
94: if (w->ww_fmap != 0) {
95: wwfree((char **)w->ww_fmap, w->ww_w.t);
96: w->ww_fmap = fmap;
97: }
98: free((char *)(w->ww_nvis + w->ww_w.t));
99: w->ww_nvis = nvis;
100: /*
101: * Set new sizes.
102: */
103: /* window */
104: w->ww_w.b = w->ww_w.t + nrow;
105: w->ww_w.r = w->ww_w.l + ncol;
106: w->ww_w.nr = nrow;
107: w->ww_w.nc = ncol;
108: /* text buffer */
109: if (buf != 0) {
110: w->ww_b.b = w->ww_b.t + nline;
111: w->ww_b.r = w->ww_b.l + ncol;
112: w->ww_b.nr = nline;
113: w->ww_b.nc = ncol;
114: }
115: /* scroll */
116: if ((i = w->ww_b.b - w->ww_w.b) < 0 ||
117: (i = w->ww_cur.r - w->ww_w.b + 1) > 0) {
118: w->ww_buf += i;
119: w->ww_b.t -= i;
120: w->ww_b.b -= i;
121: w->ww_cur.r -= i;
122: }
123: /* interior */
124: w->ww_i.b = MIN(w->ww_w.b, wwnrow);
125: w->ww_i.r = MIN(w->ww_w.r, wwncol);
126: w->ww_i.nr = w->ww_i.b - w->ww_i.t;
127: w->ww_i.nc = w->ww_i.r - w->ww_i.l;
128: /*
129: * Initialize new buffers.
130: */
131: /* window */
132: m = 0;
133: if (w->ww_oflags & WWO_GLASS)
134: m |= WWM_GLS;
135: if (w->ww_oflags & WWO_REVERSE)
136: m |= WWM_REV;
137: for (i = w->ww_w.t; i < w->ww_w.b; i++)
138: for (j = w->ww_w.l; j < w->ww_w.r; j++)
139: w->ww_win[i][j] = m;
140: /* frame map */
141: if (fmap != 0)
142: for (i = w->ww_w.t; i < w->ww_w.b; i++)
143: for (j = w->ww_w.l; j < w->ww_w.r; j++)
144: w->ww_fmap[i][j] = 0;
145: /* visibility */
146: j = m ? 0 : w->ww_w.nc;
147: for (i = w->ww_w.t; i < w->ww_w.b; i++)
148: w->ww_nvis[i] = j;
149: /*
150: * Put cursor back.
151: */
152: if (w->ww_hascursor) {
153: w->ww_hascursor = 0;
154: wwcursor(w, 1);
155: }
156: /*
157: * Fool with pty.
158: */
159: if (w->ww_ispty && w->ww_pty >= 0) {
160: struct winsize winsize;
161:
162: winsize.ws_row = nrow;
163: winsize.ws_col = ncol;
164: winsize.ws_xpixel = winsize.ws_ypixel = 0;
165: (void) ioctl(w->ww_pty, TIOCSWINSZ, (char *)&winsize);
166: }
167: return 0;
168: bad:
169: if (win != 0)
170: wwfree(win, w->ww_w.t);
171: if (fmap != 0)
172: wwfree(fmap, w->ww_w.t);
173: if (buf != 0)
174: wwfree((char **)buf, w->ww_b.t);
175: if (nvis != 0)
176: free((char *)(nvis + w->ww_w.t));
177: return -1;
178: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.