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