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