xref: /csrg-svn/usr.bin/window/wwframe.c (revision 14415)
113983Sedward #ifndef lint
2*14415Sedward static	char *sccsid = "@(#)wwframe.c	2.1.1.1 83/08/09";
313983Sedward #endif
413983Sedward 
513983Sedward #include "ww.h"
613983Sedward 
7*14415Sedward char **wwfmap;
8*14415Sedward #define U 1
9*14415Sedward #define R 2
10*14415Sedward #define D 4
11*14415Sedward #define L 8
1214077Sedward 
13*14415Sedward wwframe(w, wframe)
14*14415Sedward register struct ww *w, *wframe;
1513983Sedward {
1613983Sedward 	register i;
1714077Sedward 	char noleft, noright, notop, nobot;
1813983Sedward 
19*14415Sedward 	if (wwfmap == 0
20*14415Sedward 	    && (wwfmap = wwalloc(wwnrow, wwncol, sizeof (char))) == 0)
21*14415Sedward 		return -1;
22*14415Sedward 	noleft = w->ww_w.l == 0;
23*14415Sedward 	noright = w->ww_w.r >= wwncol;
24*14415Sedward 	notop = w->ww_w.t == 0;
25*14415Sedward 	nobot = w->ww_w.b >= wwnrow;
2613983Sedward 
2713983Sedward 	if (!notop) {
28*14415Sedward 		for (i = w->ww_w.l; i < w->ww_w.r; i++)
29*14415Sedward 			wwframex(w, w->ww_w.t, i, wframe);
3013983Sedward 	}
3113983Sedward 
3213983Sedward 	if (!nobot) {
33*14415Sedward 		for (i = w->ww_w.l; i < w->ww_w.r; i++)
34*14415Sedward 			wwframex(w, w->ww_w.b - 1, i, wframe);
3513983Sedward 	}
3613983Sedward 
3713983Sedward 	if (!noleft) {
38*14415Sedward 		for (i = w->ww_w.t; i < w->ww_w.b; i++)
39*14415Sedward 			wwframex(w, i, w->ww_w.l, wframe);
4013983Sedward 	}
4113983Sedward 
4213983Sedward 	if (!noright) {
43*14415Sedward 		for (i = w->ww_w.t; i < w->ww_w.b; i++)
44*14415Sedward 			wwframex(w, i, w->ww_w.r - 1, wframe);
4513983Sedward 	}
46*14415Sedward }
4713983Sedward 
48*14415Sedward wwframex(w, r, c, wframe)
49*14415Sedward register struct ww *w, *wframe;
50*14415Sedward register r, c;
51*14415Sedward {
52*14415Sedward 	char ul, top, ur, right, lr, bottom, ll, left;
53*14415Sedward 
54*14415Sedward 	if (w->ww_index != wwsmap[r][c])
55*14415Sedward 		return;
56*14415Sedward 	ul = wwframeok(w, r - 1, c - 1);
57*14415Sedward 	top = wwframeok(w, r - 1, c);
58*14415Sedward 	ur = wwframeok(w, r - 1, c + 1);
59*14415Sedward 	right = wwframeok(w, r, c + 1);
60*14415Sedward 	lr = wwframeok(w, r + 1, c + 1);
61*14415Sedward 	bottom = wwframeok(w, r + 1, c);
62*14415Sedward 	ll = wwframeok(w, r + 1, c - 1);
63*14415Sedward 	left = wwframeok(w, r, c - 1);
64*14415Sedward 	if (top && ul) {
65*14415Sedward 		wwframec(r - 1, c - 1, wframe, R);
66*14415Sedward 		wwframec(r - 1, c, wframe, L);
67*14415Sedward 	}
68*14415Sedward 	if (top && ur) {
69*14415Sedward 		wwframec(r - 1, c, wframe, R);
70*14415Sedward 		wwframec(r - 1, c + 1, wframe, L);
71*14415Sedward 	}
72*14415Sedward 	if (right && ur) {
73*14415Sedward 		wwframec(r - 1, c + 1, wframe, D);
74*14415Sedward 		wwframec(r, c + 1, wframe, U);
75*14415Sedward 	}
76*14415Sedward 	if (right && lr) {
77*14415Sedward 		wwframec(r, c + 1, wframe, D);
78*14415Sedward 		wwframec(r + 1, c + 1, wframe, U);
79*14415Sedward 	}
80*14415Sedward 	if (bottom && lr) {
81*14415Sedward 		wwframec(r + 1, c + 1, wframe, L);
82*14415Sedward 		wwframec(r + 1, c, wframe, R);
83*14415Sedward 	}
84*14415Sedward 	if (bottom && ll) {
85*14415Sedward 		wwframec(r + 1, c, wframe, L);
86*14415Sedward 		wwframec(r + 1, c - 1, wframe, R);
87*14415Sedward 	}
88*14415Sedward 	if (left && ll) {
89*14415Sedward 		wwframec(r + 1, c - 1, wframe, U);
90*14415Sedward 		wwframec(r, c - 1, wframe, D);
91*14415Sedward 	}
92*14415Sedward 	if (left && ul) {
93*14415Sedward 		wwframec(r, c - 1, wframe, U);
94*14415Sedward 		wwframec(r - 1, c - 1, wframe, D);
95*14415Sedward 	}
9613983Sedward }
9713983Sedward 
98*14415Sedward wwframeok(w, r, c)
9913983Sedward register struct ww *w;
10013983Sedward {
101*14415Sedward 	register struct ww *w1;
10213983Sedward 
103*14415Sedward 	if (r < 0 || r >= wwnrow || c < 0 || c >= wwncol)
10414077Sedward 		return 1;
105*14415Sedward 	w1 = wwindex[wwsmap[r][c]];
106*14415Sedward 	if (w1->ww_hasframe && w1->ww_order <= w->ww_order)
107*14415Sedward 		return 0;
108*14415Sedward 	return 1;
10913983Sedward }
11013983Sedward 
111*14415Sedward wwframec(rr, cc, f, code)
112*14415Sedward register struct ww *f;
113*14415Sedward register rr, cc;
11413983Sedward {
115*14415Sedward 	register struct ww *w2;
116*14415Sedward 	register r, c;
11713983Sedward 
118*14415Sedward 	if (rr < 0 || rr >= wwnrow || cc < 0 || cc >= wwncol)
119*14415Sedward 		return;
120*14415Sedward 	w2 = wwindex[wwsmap[rr][cc]];
121*14415Sedward 	if (w2->ww_order > f->ww_order) {
122*14415Sedward 		if (w2 != &wwnobody) {
123*14415Sedward 			r = rr - w2->ww_w.t;
124*14415Sedward 			c = cc - w2->ww_w.l;
125*14415Sedward 			if ((w2->ww_win[r][c] |= WWM_COV) == WWM_COV)
126*14415Sedward 				w2->ww_nvis[r]--;
127*14415Sedward 			w2->ww_cov[r][c] = f->ww_index;
128*14415Sedward 		}
129*14415Sedward 		wwsmap[rr][cc] = f->ww_index;
13013983Sedward 	}
131*14415Sedward 	code = wwfmap[rr][cc] |= code;
132*14415Sedward 	r = rr - f->ww_w.t;
133*14415Sedward 	c = cc - f->ww_w.l;
134*14415Sedward 	if (f->ww_win[r][c] == WWM_GLS)
135*14415Sedward 		f->ww_nvis[r]++;
136*14415Sedward 	f->ww_win[r][c] &= ~WWM_GLS;
137*14415Sedward 	f->ww_buf[f->ww_scroll + r][c].c_w = tt.tt_frame[code] & WWC_CMASK;
138*14415Sedward 	if (wwsmap[rr][cc] == f->ww_index)
139*14415Sedward 		wwns[rr][cc].c_w = tt.tt_frame[code] & WWC_CMASK;
14013983Sedward }
141