xref: /csrg-svn/usr.bin/window/wwframe.c (revision 14663)
113983Sedward #ifndef lint
2*14663Sedward static	char *sccsid = "@(#)wwframe.c	3.4 83/08/16";
313983Sedward #endif
413983Sedward 
513983Sedward #include "ww.h"
614649Sedward #include "tt.h"
713983Sedward 
814415Sedward wwframe(w, wframe)
914591Sedward register struct ww *w;
1014591Sedward struct ww *wframe;
1113983Sedward {
1214591Sedward 	register r, c;
1314591Sedward 	char a1, a2, a3;
1414591Sedward 	char b1, b2, b3;
1514591Sedward 	register char *smap;
1614591Sedward 	register code;
1713983Sedward 
1814591Sedward 	if (w->ww_w.t > 0) {
1914591Sedward 		r = w->ww_w.t - 1;
2014591Sedward 		c = w->ww_w.l - 1;
2114591Sedward 		smap = &wwsmap[r + 1][c + 1];
2214591Sedward 		a1 = 0;
2314591Sedward 		a2 = 0;
2414591Sedward 		b1 = 0;
2514591Sedward 		b2 = wwframeok(w, r, c);
2613983Sedward 
2714591Sedward 		for (; c < w->ww_w.r; c++) {
2814591Sedward 			a3 = w->ww_index == *smap++;
2914591Sedward 			b3 = wwframeok(w, r, c + 1);
3014591Sedward 			if (b2) {
3114591Sedward 				code = 0;
3214591Sedward 				if ((a1 || a2) && b1)
3314591Sedward 					code |= WWF_L;
3414591Sedward 				if ((a2 || a3) && b3)
3514591Sedward 					code |= WWF_R;
3614591Sedward 				if (code)
3714591Sedward 					wwframec(r, c, wframe, code|WWF_TOP);
3814591Sedward 			}
3914591Sedward 			a1 = a2;
4014591Sedward 			a2 = a3;
4114591Sedward 			b1 = b2;
4214591Sedward 			b2 = b3;
4314591Sedward 		}
4414591Sedward 		if ((a1 || a2) && b1 && b2)
4514591Sedward 			wwframec(r, c, wframe, WWF_L|WWF_TOP);
4613983Sedward 	}
4713983Sedward 
4814591Sedward 	if (w->ww_w.b < wwnrow) {
4914591Sedward 		r = w->ww_w.b;
5014591Sedward 		c = w->ww_w.l - 1;
5114591Sedward 		smap = &wwsmap[r - 1][c + 1];
5214591Sedward 		a1 = 0;
5314591Sedward 		a2 = 0;
5414591Sedward 		b1 = 0;
5514591Sedward 		b2 = wwframeok(w, r, c);
5613983Sedward 
5714591Sedward 		for (; c < w->ww_w.r; c++) {
5814591Sedward 			a3 = w->ww_index == *smap++;
5914591Sedward 			b3 = wwframeok(w, r, c + 1);
6014591Sedward 			if (b2) {
6114591Sedward 				code = 0;
6214591Sedward 				if ((a1 || a2) && b1)
6314591Sedward 					code |= WWF_L;
6414591Sedward 				if ((a2 || a3) && b3)
6514591Sedward 					code |= WWF_R;
6614591Sedward 				if (code)
6714591Sedward 					wwframec(r, c, wframe, code);
6814591Sedward 			}
6914591Sedward 			a1 = a2;
7014591Sedward 			a2 = a3;
7114591Sedward 			b1 = b2;
7214591Sedward 			b2 = b3;
7314591Sedward 		}
7414591Sedward 		if ((a1 || a2) && b1 && b2)
7514591Sedward 			wwframec(r, c, wframe, WWF_L);
7613983Sedward 	}
7713983Sedward 
7814591Sedward 	if (w->ww_w.l > 0) {
7914591Sedward 		r = w->ww_w.t - 1;
8014591Sedward 		c = w->ww_w.l - 1;
8114591Sedward 		a1 = 0;
8214591Sedward 		a2 = 0;
8314591Sedward 		b1 = 0;
8414591Sedward 		b2 = wwframeok(w, r, c);
8514591Sedward 
8614591Sedward 		for (; r < w->ww_w.b; r++) {
8714591Sedward 			a3 = w->ww_index == wwsmap[r + 1][c + 1];
8814591Sedward 			b3 = wwframeok(w, r + 1, c);
8914591Sedward 			if (b2) {
9014591Sedward 				code = 0;
9114591Sedward 				if ((a1 || a2) && b1)
9214591Sedward 					code |= WWF_U;
9314591Sedward 				if ((a2 || a3) && b3)
9414591Sedward 					code |= WWF_D;
9514591Sedward 				if (code)
9614591Sedward 					wwframec(r, c, wframe, code);
9714591Sedward 			}
9814591Sedward 			a1 = a2;
9914591Sedward 			a2 = a3;
10014591Sedward 			b1 = b2;
10114591Sedward 			b2 = b3;
10214591Sedward 		}
10314591Sedward 		if ((a1 || a2) && b1 && b2)
10414591Sedward 			wwframec(r, c, wframe, WWF_U);
10513983Sedward 	}
10613983Sedward 
10714591Sedward 	if (w->ww_w.r < wwncol) {
10814591Sedward 		r = w->ww_w.t - 1;
10914591Sedward 		c = w->ww_w.r;
11014591Sedward 		a1 = 0;
11114591Sedward 		a2 = 0;
11214591Sedward 		b1 = 0;
11314591Sedward 		b2 = wwframeok(w, r, c);
11414415Sedward 
11514591Sedward 		for (; r < w->ww_w.b; r++) {
11614591Sedward 			a3 = w->ww_index == wwsmap[r + 1][c - 1];
11714591Sedward 			b3 = wwframeok(w, r + 1, c);
11814591Sedward 			if (b2) {
11914591Sedward 				code = 0;
12014591Sedward 				if ((a1 || a2) && b1)
12114591Sedward 					code |= WWF_U;
12214591Sedward 				if ((a2 || a3) && b3)
12314591Sedward 					code |= WWF_D;
12414591Sedward 				if (code)
12514591Sedward 					wwframec(r, c, wframe, code);
12614591Sedward 			}
12714591Sedward 			a1 = a2;
12814591Sedward 			a2 = a3;
12914591Sedward 			b1 = b2;
13014591Sedward 			b2 = b3;
13114591Sedward 		}
13214591Sedward 		if ((a1 || a2) && b1 && b2)
13314591Sedward 			wwframec(r, c, wframe, WWF_U);
13414415Sedward 	}
13513983Sedward }
13613983Sedward 
13714415Sedward wwframeok(w, r, c)
13814591Sedward struct ww *w;
13914591Sedward register r, c;
14013983Sedward {
14114415Sedward 	register struct ww *w1;
14213983Sedward 
14314415Sedward 	if (r < 0 || r >= wwnrow || c < 0 || c >= wwncol)
14414077Sedward 		return 1;
14514415Sedward 	w1 = wwindex[wwsmap[r][c]];
14614591Sedward 	return !w1->ww_hasframe || w1->ww_order > w->ww_order;
14713983Sedward }
14813983Sedward 
14914415Sedward wwframec(rr, cc, f, code)
15014415Sedward register struct ww *f;
15114415Sedward register rr, cc;
15214591Sedward int code;
15313983Sedward {
15414415Sedward 	register r, c;
15513983Sedward 
15614415Sedward 	if (rr < 0 || rr >= wwnrow || cc < 0 || cc >= wwncol)
15714415Sedward 		return;
15814591Sedward 	{
15914591Sedward 		register struct ww *w;
16014591Sedward 		w = wwindex[wwsmap[rr][cc]];
16114591Sedward 		if (w->ww_order > f->ww_order) {
16214591Sedward 			if (w != &wwnobody) {
16314591Sedward 				r = rr - w->ww_w.t;
16414591Sedward 				c = cc - w->ww_w.l;
16514591Sedward 				if ((w->ww_win[r][c] |= WWM_COV) == WWM_COV)
16614591Sedward 					w->ww_nvis[r]--;
16714591Sedward 				w->ww_cov[r][c] = f->ww_index;
16814591Sedward 			}
16914591Sedward 			wwsmap[rr][cc] = f->ww_index;
17014415Sedward 		}
17113983Sedward 	}
17214591Sedward 	{
17314591Sedward 		register char *fmap;
17414591Sedward 		fmap = &wwfmap[rr][cc];
17514591Sedward 		*fmap |= code;
17614591Sedward 		if (code & WWF_TOP)
17714591Sedward 			*fmap &= ~WWF_LABEL;
17814591Sedward 		code = *(unsigned char *)fmap;
17914591Sedward 	}
18014415Sedward 	r = rr - f->ww_w.t;
18114415Sedward 	c = cc - f->ww_w.l;
18214415Sedward 	if (f->ww_win[r][c] == WWM_GLS)
18314415Sedward 		f->ww_nvis[r]++;
18414415Sedward 	f->ww_win[r][c] &= ~WWM_GLS;
18514591Sedward 	if ((code & WWF_LABEL) == 0) {
18614591Sedward 		register tmp;
18714591Sedward 
18814591Sedward 		tmp = tt.tt_frame[code & WWF_MASK] & WWC_CMASK;
18914591Sedward 		f->ww_buf[f->ww_scroll + r][c].c_w = tmp;
190*14663Sedward 		if (wwsmap[rr][cc] == f->ww_index) {
191*14663Sedward 			wwtouched[rr] = 1;
19214591Sedward 			wwns[rr][cc].c_w = tmp;
193*14663Sedward 		}
19414591Sedward 	}
19513983Sedward }
19614591Sedward 
19714591Sedward /*
19814591Sedward wwckns()
19914591Sedward {
20014591Sedward 	register i, j;
20114591Sedward 
20214591Sedward 	for (i = 0; i < wwnrow; i++)
20314591Sedward 		for (j = 0; j < wwncol; j++)
20414591Sedward 			if ((wwns[i][j].c_c & 0x7f) < ' ')
20514591Sedward 				abort();
20614591Sedward }
20714591Sedward */
208