xref: /csrg-svn/usr.bin/window/wwframe.c (revision 14591)
113983Sedward #ifndef lint
2*14591Sedward static	char *sccsid = "@(#)wwframe.c	3.2 83/08/12";
313983Sedward #endif
413983Sedward 
513983Sedward #include "ww.h"
613983Sedward 
714415Sedward wwframe(w, wframe)
8*14591Sedward register struct ww *w;
9*14591Sedward struct ww *wframe;
1013983Sedward {
11*14591Sedward 	register r, c;
12*14591Sedward 	char a1, a2, a3;
13*14591Sedward 	char b1, b2, b3;
14*14591Sedward 	register char *smap;
15*14591Sedward 	register code;
1613983Sedward 
17*14591Sedward 	if (w->ww_w.t > 0) {
18*14591Sedward 		r = w->ww_w.t - 1;
19*14591Sedward 		c = w->ww_w.l - 1;
20*14591Sedward 		smap = &wwsmap[r + 1][c + 1];
21*14591Sedward 		a1 = 0;
22*14591Sedward 		a2 = 0;
23*14591Sedward 		b1 = 0;
24*14591Sedward 		b2 = wwframeok(w, r, c);
2513983Sedward 
26*14591Sedward 		for (; c < w->ww_w.r; c++) {
27*14591Sedward 			a3 = w->ww_index == *smap++;
28*14591Sedward 			b3 = wwframeok(w, r, c + 1);
29*14591Sedward 			if (b2) {
30*14591Sedward 				code = 0;
31*14591Sedward 				if ((a1 || a2) && b1)
32*14591Sedward 					code |= WWF_L;
33*14591Sedward 				if ((a2 || a3) && b3)
34*14591Sedward 					code |= WWF_R;
35*14591Sedward 				if (code)
36*14591Sedward 					wwframec(r, c, wframe, code|WWF_TOP);
37*14591Sedward 			}
38*14591Sedward 			a1 = a2;
39*14591Sedward 			a2 = a3;
40*14591Sedward 			b1 = b2;
41*14591Sedward 			b2 = b3;
42*14591Sedward 		}
43*14591Sedward 		if ((a1 || a2) && b1 && b2)
44*14591Sedward 			wwframec(r, c, wframe, WWF_L|WWF_TOP);
4513983Sedward 	}
4613983Sedward 
47*14591Sedward 	if (w->ww_w.b < wwnrow) {
48*14591Sedward 		r = w->ww_w.b;
49*14591Sedward 		c = w->ww_w.l - 1;
50*14591Sedward 		smap = &wwsmap[r - 1][c + 1];
51*14591Sedward 		a1 = 0;
52*14591Sedward 		a2 = 0;
53*14591Sedward 		b1 = 0;
54*14591Sedward 		b2 = wwframeok(w, r, c);
5513983Sedward 
56*14591Sedward 		for (; c < w->ww_w.r; c++) {
57*14591Sedward 			a3 = w->ww_index == *smap++;
58*14591Sedward 			b3 = wwframeok(w, r, c + 1);
59*14591Sedward 			if (b2) {
60*14591Sedward 				code = 0;
61*14591Sedward 				if ((a1 || a2) && b1)
62*14591Sedward 					code |= WWF_L;
63*14591Sedward 				if ((a2 || a3) && b3)
64*14591Sedward 					code |= WWF_R;
65*14591Sedward 				if (code)
66*14591Sedward 					wwframec(r, c, wframe, code);
67*14591Sedward 			}
68*14591Sedward 			a1 = a2;
69*14591Sedward 			a2 = a3;
70*14591Sedward 			b1 = b2;
71*14591Sedward 			b2 = b3;
72*14591Sedward 		}
73*14591Sedward 		if ((a1 || a2) && b1 && b2)
74*14591Sedward 			wwframec(r, c, wframe, WWF_L);
7513983Sedward 	}
7613983Sedward 
77*14591Sedward 	if (w->ww_w.l > 0) {
78*14591Sedward 		r = w->ww_w.t - 1;
79*14591Sedward 		c = w->ww_w.l - 1;
80*14591Sedward 		a1 = 0;
81*14591Sedward 		a2 = 0;
82*14591Sedward 		b1 = 0;
83*14591Sedward 		b2 = wwframeok(w, r, c);
84*14591Sedward 
85*14591Sedward 		for (; r < w->ww_w.b; r++) {
86*14591Sedward 			a3 = w->ww_index == wwsmap[r + 1][c + 1];
87*14591Sedward 			b3 = wwframeok(w, r + 1, c);
88*14591Sedward 			if (b2) {
89*14591Sedward 				code = 0;
90*14591Sedward 				if ((a1 || a2) && b1)
91*14591Sedward 					code |= WWF_U;
92*14591Sedward 				if ((a2 || a3) && b3)
93*14591Sedward 					code |= WWF_D;
94*14591Sedward 				if (code)
95*14591Sedward 					wwframec(r, c, wframe, code);
96*14591Sedward 			}
97*14591Sedward 			a1 = a2;
98*14591Sedward 			a2 = a3;
99*14591Sedward 			b1 = b2;
100*14591Sedward 			b2 = b3;
101*14591Sedward 		}
102*14591Sedward 		if ((a1 || a2) && b1 && b2)
103*14591Sedward 			wwframec(r, c, wframe, WWF_U);
10413983Sedward 	}
10513983Sedward 
106*14591Sedward 	if (w->ww_w.r < wwncol) {
107*14591Sedward 		r = w->ww_w.t - 1;
108*14591Sedward 		c = w->ww_w.r;
109*14591Sedward 		a1 = 0;
110*14591Sedward 		a2 = 0;
111*14591Sedward 		b1 = 0;
112*14591Sedward 		b2 = wwframeok(w, r, c);
11314415Sedward 
114*14591Sedward 		for (; r < w->ww_w.b; r++) {
115*14591Sedward 			a3 = w->ww_index == wwsmap[r + 1][c - 1];
116*14591Sedward 			b3 = wwframeok(w, r + 1, c);
117*14591Sedward 			if (b2) {
118*14591Sedward 				code = 0;
119*14591Sedward 				if ((a1 || a2) && b1)
120*14591Sedward 					code |= WWF_U;
121*14591Sedward 				if ((a2 || a3) && b3)
122*14591Sedward 					code |= WWF_D;
123*14591Sedward 				if (code)
124*14591Sedward 					wwframec(r, c, wframe, code);
125*14591Sedward 			}
126*14591Sedward 			a1 = a2;
127*14591Sedward 			a2 = a3;
128*14591Sedward 			b1 = b2;
129*14591Sedward 			b2 = b3;
130*14591Sedward 		}
131*14591Sedward 		if ((a1 || a2) && b1 && b2)
132*14591Sedward 			wwframec(r, c, wframe, WWF_U);
13314415Sedward 	}
13413983Sedward }
13513983Sedward 
13614415Sedward wwframeok(w, r, c)
137*14591Sedward struct ww *w;
138*14591Sedward register r, c;
13913983Sedward {
14014415Sedward 	register struct ww *w1;
14113983Sedward 
14214415Sedward 	if (r < 0 || r >= wwnrow || c < 0 || c >= wwncol)
14314077Sedward 		return 1;
14414415Sedward 	w1 = wwindex[wwsmap[r][c]];
145*14591Sedward 	return !w1->ww_hasframe || w1->ww_order > w->ww_order;
14613983Sedward }
14713983Sedward 
14814415Sedward wwframec(rr, cc, f, code)
14914415Sedward register struct ww *f;
15014415Sedward register rr, cc;
151*14591Sedward int code;
15213983Sedward {
15314415Sedward 	register r, c;
15413983Sedward 
15514415Sedward 	if (rr < 0 || rr >= wwnrow || cc < 0 || cc >= wwncol)
15614415Sedward 		return;
157*14591Sedward 	{
158*14591Sedward 		register struct ww *w;
159*14591Sedward 		w = wwindex[wwsmap[rr][cc]];
160*14591Sedward 		if (w->ww_order > f->ww_order) {
161*14591Sedward 			if (w != &wwnobody) {
162*14591Sedward 				r = rr - w->ww_w.t;
163*14591Sedward 				c = cc - w->ww_w.l;
164*14591Sedward 				if ((w->ww_win[r][c] |= WWM_COV) == WWM_COV)
165*14591Sedward 					w->ww_nvis[r]--;
166*14591Sedward 				w->ww_cov[r][c] = f->ww_index;
167*14591Sedward 			}
168*14591Sedward 			wwsmap[rr][cc] = f->ww_index;
16914415Sedward 		}
17013983Sedward 	}
171*14591Sedward 	{
172*14591Sedward 		register char *fmap;
173*14591Sedward 		fmap = &wwfmap[rr][cc];
174*14591Sedward 		*fmap |= code;
175*14591Sedward 		if (code & WWF_TOP)
176*14591Sedward 			*fmap &= ~WWF_LABEL;
177*14591Sedward 		code = *(unsigned char *)fmap;
178*14591Sedward 	}
17914415Sedward 	r = rr - f->ww_w.t;
18014415Sedward 	c = cc - f->ww_w.l;
18114415Sedward 	if (f->ww_win[r][c] == WWM_GLS)
18214415Sedward 		f->ww_nvis[r]++;
18314415Sedward 	f->ww_win[r][c] &= ~WWM_GLS;
184*14591Sedward 	if ((code & WWF_LABEL) == 0) {
185*14591Sedward 		register tmp;
186*14591Sedward 
187*14591Sedward 		tmp = tt.tt_frame[code & WWF_MASK] & WWC_CMASK;
188*14591Sedward 		f->ww_buf[f->ww_scroll + r][c].c_w = tmp;
189*14591Sedward 		if (wwsmap[rr][cc] == f->ww_index)
190*14591Sedward 			wwns[rr][cc].c_w = tmp;
191*14591Sedward 	}
19213983Sedward }
193*14591Sedward 
194*14591Sedward /*
195*14591Sedward wwckns()
196*14591Sedward {
197*14591Sedward 	register i, j;
198*14591Sedward 
199*14591Sedward 	for (i = 0; i < wwnrow; i++)
200*14591Sedward 		for (j = 0; j < wwncol; j++)
201*14591Sedward 			if ((wwns[i][j].c_c & 0x7f) < ' ')
202*14591Sedward 				abort();
203*14591Sedward }
204*14591Sedward */
205