xref: /csrg-svn/usr.bin/window/wwframe.c (revision 14829)
113983Sedward #ifndef lint
2*14829Sedward static	char *sccsid = "@(#)wwframe.c	3.8 83/08/23";
313983Sedward #endif
413983Sedward 
513983Sedward #include "ww.h"
614649Sedward #include "tt.h"
713983Sedward 
814756Sedward #define frameok(w, r, c) (w1 = wwindex[wwsmap[r][c]], \
914756Sedward 	!w1->ww_hasframe || w1->ww_order > (w)->ww_order)
1014756Sedward 
1114415Sedward wwframe(w, wframe)
1214591Sedward register struct ww *w;
1314591Sedward struct ww *wframe;
1413983Sedward {
1514591Sedward 	register r, c;
1614591Sedward 	char a1, a2, a3;
1714591Sedward 	char b1, b2, b3;
1814591Sedward 	register char *smap;
1914591Sedward 	register code;
2014756Sedward 	register struct ww *w1;
2113983Sedward 
2214591Sedward 	if (w->ww_w.t > 0) {
2314591Sedward 		r = w->ww_w.t - 1;
2414591Sedward 		c = w->ww_w.l - 1;
2514591Sedward 		smap = &wwsmap[r + 1][c + 1];
2614591Sedward 		a1 = 0;
2714591Sedward 		a2 = 0;
2814591Sedward 		b1 = 0;
2914756Sedward 		b2 = c < 0 || frameok(w, r, c);
3013983Sedward 
3114591Sedward 		for (; c < w->ww_w.r; c++) {
32*14829Sedward 			if (c + 1 >= wwncol) {
33*14829Sedward 				a3 = 1;
34*14829Sedward 				b3 = 1;
35*14829Sedward 			} else {
36*14829Sedward 				a3 = w->ww_index == *smap++;
37*14829Sedward 				b3 = frameok(w, r, c + 1);
38*14829Sedward 			}
3914591Sedward 			if (b2) {
4014591Sedward 				code = 0;
4114591Sedward 				if ((a1 || a2) && b1)
4214591Sedward 					code |= WWF_L;
4314591Sedward 				if ((a2 || a3) && b3)
4414591Sedward 					code |= WWF_R;
4514591Sedward 				if (code)
4614772Sedward 					wwframec(wframe, r, c, code|WWF_TOP);
4714591Sedward 			}
4814591Sedward 			a1 = a2;
4914591Sedward 			a2 = a3;
5014591Sedward 			b1 = b2;
5114591Sedward 			b2 = b3;
5214591Sedward 		}
5314591Sedward 		if ((a1 || a2) && b1 && b2)
5414772Sedward 			wwframec(wframe, r, c, WWF_L|WWF_TOP);
5513983Sedward 	}
5613983Sedward 
5714591Sedward 	if (w->ww_w.b < wwnrow) {
5814591Sedward 		r = w->ww_w.b;
5914591Sedward 		c = w->ww_w.l - 1;
6014591Sedward 		smap = &wwsmap[r - 1][c + 1];
6114591Sedward 		a1 = 0;
6214591Sedward 		a2 = 0;
6314591Sedward 		b1 = 0;
6414756Sedward 		b2 = c < 0 || frameok(w, r, c);
6513983Sedward 
6614591Sedward 		for (; c < w->ww_w.r; c++) {
67*14829Sedward 			if (c + 1 >= wwncol) {
68*14829Sedward 				a3 = 1;
69*14829Sedward 				b3 = 1;
70*14829Sedward 			} else {
71*14829Sedward 				a3 = w->ww_index == *smap++;
72*14829Sedward 				b3 = frameok(w, r, c + 1);
73*14829Sedward 			}
7414591Sedward 			if (b2) {
7514591Sedward 				code = 0;
7614591Sedward 				if ((a1 || a2) && b1)
7714591Sedward 					code |= WWF_L;
7814591Sedward 				if ((a2 || a3) && b3)
7914591Sedward 					code |= WWF_R;
8014591Sedward 				if (code)
8114772Sedward 					wwframec(wframe, r, c, code);
8214591Sedward 			}
8314591Sedward 			a1 = a2;
8414591Sedward 			a2 = a3;
8514591Sedward 			b1 = b2;
8614591Sedward 			b2 = b3;
8714591Sedward 		}
8814591Sedward 		if ((a1 || a2) && b1 && b2)
8914772Sedward 			wwframec(wframe, r, c, WWF_L);
9013983Sedward 	}
9113983Sedward 
9214591Sedward 	if (w->ww_w.l > 0) {
9314591Sedward 		r = w->ww_w.t - 1;
9414591Sedward 		c = w->ww_w.l - 1;
9514591Sedward 		a1 = 0;
9614591Sedward 		a2 = 0;
9714591Sedward 		b1 = 0;
9814756Sedward 		b2 = r < 0 || frameok(w, r, c);
9914591Sedward 
10014591Sedward 		for (; r < w->ww_w.b; r++) {
101*14829Sedward 			if (r + 1 >= wwnrow) {
102*14829Sedward 				a3 = 1;
103*14829Sedward 				b3 = 1;
104*14829Sedward 			} else {
105*14829Sedward 				a3 = w->ww_index == wwsmap[r + 1][c + 1];
106*14829Sedward 				b3 = frameok(w, r + 1, c);
107*14829Sedward 			}
10814591Sedward 			if (b2) {
10914591Sedward 				code = 0;
11014591Sedward 				if ((a1 || a2) && b1)
11114591Sedward 					code |= WWF_U;
11214591Sedward 				if ((a2 || a3) && b3)
11314591Sedward 					code |= WWF_D;
11414591Sedward 				if (code)
11514772Sedward 					wwframec(wframe, r, c, code);
11614591Sedward 			}
11714591Sedward 			a1 = a2;
11814591Sedward 			a2 = a3;
11914591Sedward 			b1 = b2;
12014591Sedward 			b2 = b3;
12114591Sedward 		}
12214591Sedward 		if ((a1 || a2) && b1 && b2)
12314772Sedward 			wwframec(wframe, r, c, WWF_U);
12413983Sedward 	}
12513983Sedward 
12614591Sedward 	if (w->ww_w.r < wwncol) {
12714591Sedward 		r = w->ww_w.t - 1;
12814591Sedward 		c = w->ww_w.r;
12914591Sedward 		a1 = 0;
13014591Sedward 		a2 = 0;
13114591Sedward 		b1 = 0;
13214756Sedward 		b2 = r < 0 || frameok(w, r, c);
13314415Sedward 
13414591Sedward 		for (; r < w->ww_w.b; r++) {
135*14829Sedward 			if (r + 1 >= wwnrow) {
136*14829Sedward 				a3 = 1;
137*14829Sedward 				b3 = 1;
138*14829Sedward 			} else {
139*14829Sedward 				a3 = w->ww_index == wwsmap[r + 1][c - 1];
140*14829Sedward 				b3 = frameok(w, r + 1, c);
141*14829Sedward 			}
14214591Sedward 			if (b2) {
14314591Sedward 				code = 0;
14414591Sedward 				if ((a1 || a2) && b1)
14514591Sedward 					code |= WWF_U;
14614591Sedward 				if ((a2 || a3) && b3)
14714591Sedward 					code |= WWF_D;
14814591Sedward 				if (code)
14914772Sedward 					wwframec(wframe, r, c, code);
15014591Sedward 			}
15114591Sedward 			a1 = a2;
15214591Sedward 			a2 = a3;
15314591Sedward 			b1 = b2;
15414591Sedward 			b2 = b3;
15514591Sedward 		}
15614591Sedward 		if ((a1 || a2) && b1 && b2)
15714772Sedward 			wwframec(wframe, r, c, WWF_U);
15814415Sedward 	}
15913983Sedward }
16013983Sedward 
16114772Sedward wwframec(f, rr, cc, code)
16214415Sedward register struct ww *f;
16314415Sedward register rr, cc;
16414756Sedward char code;
16513983Sedward {
16614772Sedward 	register r, c;
16714756Sedward 	char oldcode;
16813983Sedward 
16914720Sedward 	if (rr < f->ww_w.t || rr >= f->ww_w.b
17014720Sedward 	    || cc < f->ww_w.l || cc >= f->ww_w.r)
17114415Sedward 		return;
17214591Sedward 	{
17314591Sedward 		register struct ww *w;
17414756Sedward 
17514591Sedward 		w = wwindex[wwsmap[rr][cc]];
17614591Sedward 		if (w->ww_order > f->ww_order) {
17714591Sedward 			if (w != &wwnobody) {
17814591Sedward 				r = rr - w->ww_w.t;
17914591Sedward 				c = cc - w->ww_w.l;
18014591Sedward 				if ((w->ww_win[r][c] |= WWM_COV) == WWM_COV)
18114591Sedward 					w->ww_nvis[r]--;
18214591Sedward 				w->ww_cov[r][c] = f->ww_index;
18314591Sedward 			}
18414591Sedward 			wwsmap[rr][cc] = f->ww_index;
18514415Sedward 		}
18613983Sedward 	}
18714772Sedward 
18814772Sedward 	r = rr - f->ww_w.t;
18914772Sedward 	c = cc - f->ww_w.l;
19014772Sedward 	if (f->ww_fmap != 0) {
19114591Sedward 		register char *fmap;
19214756Sedward 
19314772Sedward 		fmap = &f->ww_fmap[r][c];
19414756Sedward 		oldcode = *fmap;
19514591Sedward 		*fmap |= code;
19614591Sedward 		if (code & WWF_TOP)
19714591Sedward 			*fmap &= ~WWF_LABEL;
19814756Sedward 		code = *fmap;
19914756Sedward 	} else
20014756Sedward 		oldcode = 0;
20114756Sedward 	{
20214756Sedward 		{
20314756Sedward 			register char *win = &f->ww_win[r][c];
20414756Sedward 
20514756Sedward 			if (*win == WWM_GLS)
20614756Sedward 				f->ww_nvis[r]++;
20714756Sedward 			*win &= ~WWM_GLS;
20814663Sedward 		}
20914756Sedward 		if (oldcode != code && (code & WWF_LABEL) == 0) {
21014756Sedward 			register short frame;
21114756Sedward 
21214756Sedward 			frame = tt.tt_frame[code & WWF_MASK] & WWC_CMASK;
21314756Sedward 			f->ww_buf[f->ww_scroll + r][c].c_w = frame;
21414756Sedward 			if (wwsmap[rr][cc] == f->ww_index) {
21514756Sedward 				wwtouched[rr] = 1;
21614756Sedward 				wwns[rr][cc].c_w = frame;
21714756Sedward 			}
21814756Sedward 		}
21914591Sedward 	}
22013983Sedward }
221