xref: /csrg-svn/usr.bin/window/wwframe.c (revision 62479)
118735Sedward /*
2*62479Sbostic  * Copyright (c) 1983, 1993
3*62479Sbostic  *	The Regents of the University of California.  All rights reserved.
433514Sbostic  *
542954Sbostic  * This code is derived from software contributed to Berkeley by
642954Sbostic  * Edward Wang at The University of California, Berkeley.
742954Sbostic  *
842835Sbostic  * %sccs.include.redist.c%
918735Sedward  */
1018735Sedward 
1133514Sbostic #ifndef lint
12*62479Sbostic static char sccsid[] = "@(#)wwframe.c	8.1 (Berkeley) 06/06/93";
1333514Sbostic #endif /* not lint */
1433514Sbostic 
1513983Sedward #include "ww.h"
1614649Sedward #include "tt.h"
1713983Sedward 
1814756Sedward #define frameok(w, r, c) (w1 = wwindex[wwsmap[r][c]], \
1917406Sedward 	w1->ww_fmap || w1->ww_order > (w)->ww_order)
2014756Sedward 
wwframe(w,wframe)2114415Sedward wwframe(w, wframe)
2214591Sedward register struct ww *w;
2314591Sedward struct ww *wframe;
2413983Sedward {
2514591Sedward 	register r, c;
2614591Sedward 	char a1, a2, a3;
2714591Sedward 	char b1, b2, b3;
2814591Sedward 	register char *smap;
2914591Sedward 	register code;
3014756Sedward 	register struct ww *w1;
3113983Sedward 
3214591Sedward 	if (w->ww_w.t > 0) {
3314591Sedward 		r = w->ww_w.t - 1;
3414972Sedward 		c = w->ww_i.l - 1;
3514591Sedward 		smap = &wwsmap[r + 1][c + 1];
3614591Sedward 		a1 = 0;
3714591Sedward 		a2 = 0;
3814591Sedward 		b1 = 0;
3914756Sedward 		b2 = c < 0 || frameok(w, r, c);
4013983Sedward 
4114972Sedward 		for (; c < w->ww_i.r; c++) {
4214829Sedward 			if (c + 1 >= wwncol) {
4314829Sedward 				a3 = 1;
4414829Sedward 				b3 = 1;
4514829Sedward 			} else {
4614829Sedward 				a3 = w->ww_index == *smap++;
4714829Sedward 				b3 = frameok(w, r, c + 1);
4814829Sedward 			}
4914591Sedward 			if (b2) {
5014591Sedward 				code = 0;
5114591Sedward 				if ((a1 || a2) && b1)
5214591Sedward 					code |= WWF_L;
5314591Sedward 				if ((a2 || a3) && b3)
5414591Sedward 					code |= WWF_R;
5514591Sedward 				if (code)
5614772Sedward 					wwframec(wframe, r, c, code|WWF_TOP);
5714591Sedward 			}
5814591Sedward 			a1 = a2;
5914591Sedward 			a2 = a3;
6014591Sedward 			b1 = b2;
6114591Sedward 			b2 = b3;
6214591Sedward 		}
6314591Sedward 		if ((a1 || a2) && b1 && b2)
6414772Sedward 			wwframec(wframe, r, c, WWF_L|WWF_TOP);
6513983Sedward 	}
6613983Sedward 
6714591Sedward 	if (w->ww_w.b < wwnrow) {
6814591Sedward 		r = w->ww_w.b;
6914972Sedward 		c = w->ww_i.l - 1;
7014591Sedward 		smap = &wwsmap[r - 1][c + 1];
7114591Sedward 		a1 = 0;
7214591Sedward 		a2 = 0;
7314591Sedward 		b1 = 0;
7414756Sedward 		b2 = c < 0 || frameok(w, r, c);
7513983Sedward 
7614972Sedward 		for (; c < w->ww_i.r; c++) {
7714829Sedward 			if (c + 1 >= wwncol) {
7814829Sedward 				a3 = 1;
7914829Sedward 				b3 = 1;
8014829Sedward 			} else {
8114829Sedward 				a3 = w->ww_index == *smap++;
8214829Sedward 				b3 = frameok(w, r, c + 1);
8314829Sedward 			}
8414591Sedward 			if (b2) {
8514591Sedward 				code = 0;
8614591Sedward 				if ((a1 || a2) && b1)
8714591Sedward 					code |= WWF_L;
8814591Sedward 				if ((a2 || a3) && b3)
8914591Sedward 					code |= WWF_R;
9014591Sedward 				if (code)
9114772Sedward 					wwframec(wframe, r, c, code);
9214591Sedward 			}
9314591Sedward 			a1 = a2;
9414591Sedward 			a2 = a3;
9514591Sedward 			b1 = b2;
9614591Sedward 			b2 = b3;
9714591Sedward 		}
9814591Sedward 		if ((a1 || a2) && b1 && b2)
9914772Sedward 			wwframec(wframe, r, c, WWF_L);
10013983Sedward 	}
10113983Sedward 
10214591Sedward 	if (w->ww_w.l > 0) {
10314972Sedward 		r = w->ww_i.t - 1;
10414591Sedward 		c = w->ww_w.l - 1;
10514591Sedward 		a1 = 0;
10614591Sedward 		a2 = 0;
10714591Sedward 		b1 = 0;
10814756Sedward 		b2 = r < 0 || frameok(w, r, c);
10914591Sedward 
11014972Sedward 		for (; r < w->ww_i.b; r++) {
11114829Sedward 			if (r + 1 >= wwnrow) {
11214829Sedward 				a3 = 1;
11314829Sedward 				b3 = 1;
11414829Sedward 			} else {
11514829Sedward 				a3 = w->ww_index == wwsmap[r + 1][c + 1];
11614829Sedward 				b3 = frameok(w, r + 1, c);
11714829Sedward 			}
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)
12514772Sedward 					wwframec(wframe, r, c, code);
12614591Sedward 			}
12714591Sedward 			a1 = a2;
12814591Sedward 			a2 = a3;
12914591Sedward 			b1 = b2;
13014591Sedward 			b2 = b3;
13114591Sedward 		}
13214591Sedward 		if ((a1 || a2) && b1 && b2)
13314772Sedward 			wwframec(wframe, r, c, WWF_U);
13413983Sedward 	}
13513983Sedward 
13614591Sedward 	if (w->ww_w.r < wwncol) {
13714972Sedward 		r = w->ww_i.t - 1;
13814591Sedward 		c = w->ww_w.r;
13914591Sedward 		a1 = 0;
14014591Sedward 		a2 = 0;
14114591Sedward 		b1 = 0;
14214756Sedward 		b2 = r < 0 || frameok(w, r, c);
14314415Sedward 
14414972Sedward 		for (; r < w->ww_i.b; r++) {
14514829Sedward 			if (r + 1 >= wwnrow) {
14614829Sedward 				a3 = 1;
14714829Sedward 				b3 = 1;
14814829Sedward 			} else {
14914829Sedward 				a3 = w->ww_index == wwsmap[r + 1][c - 1];
15014829Sedward 				b3 = frameok(w, r + 1, c);
15114829Sedward 			}
15214591Sedward 			if (b2) {
15314591Sedward 				code = 0;
15414591Sedward 				if ((a1 || a2) && b1)
15514591Sedward 					code |= WWF_U;
15614591Sedward 				if ((a2 || a3) && b3)
15714591Sedward 					code |= WWF_D;
15814591Sedward 				if (code)
15914772Sedward 					wwframec(wframe, r, c, code);
16014591Sedward 			}
16114591Sedward 			a1 = a2;
16214591Sedward 			a2 = a3;
16314591Sedward 			b1 = b2;
16414591Sedward 			b2 = b3;
16514591Sedward 		}
16614591Sedward 		if ((a1 || a2) && b1 && b2)
16714772Sedward 			wwframec(wframe, r, c, WWF_U);
16814415Sedward 	}
16913983Sedward }
17013983Sedward 
wwframec(f,r,c,code)17114987Sedward wwframec(f, r, c, code)
17214415Sedward register struct ww *f;
17314987Sedward register r, c;
17414756Sedward char code;
17513983Sedward {
17614756Sedward 	char oldcode;
17715587Sedward 	register char *smap;
17813983Sedward 
17914987Sedward 	if (r < f->ww_i.t || r >= f->ww_i.b || c < f->ww_i.l || c >= f->ww_i.r)
18014415Sedward 		return;
18115587Sedward 
18215587Sedward 	smap = &wwsmap[r][c];
18315587Sedward 
18414591Sedward 	{
18514591Sedward 		register struct ww *w;
18614756Sedward 
18715587Sedward 		w = wwindex[*smap];
18814591Sedward 		if (w->ww_order > f->ww_order) {
18915587Sedward 			if (w != &wwnobody && w->ww_win[r][c] == 0)
19015587Sedward 				w->ww_nvis[r]--;
19115587Sedward 			*smap = f->ww_index;
19214415Sedward 		}
19313983Sedward 	}
19414772Sedward 
19514772Sedward 	if (f->ww_fmap != 0) {
19614591Sedward 		register char *fmap;
19714756Sedward 
19814772Sedward 		fmap = &f->ww_fmap[r][c];
19914756Sedward 		oldcode = *fmap;
20014591Sedward 		*fmap |= code;
20114591Sedward 		if (code & WWF_TOP)
20214591Sedward 			*fmap &= ~WWF_LABEL;
20314756Sedward 		code = *fmap;
20414756Sedward 	} else
20514756Sedward 		oldcode = 0;
20614756Sedward 	{
20714987Sedward 		register char *win = &f->ww_win[r][c];
20814756Sedward 
20915587Sedward 		if (*win == WWM_GLS && *smap == f->ww_index)
21014987Sedward 			f->ww_nvis[r]++;
21114987Sedward 		*win &= ~WWM_GLS;
21214987Sedward 	}
21314987Sedward 	if (oldcode != code && (code & WWF_LABEL) == 0) {
21414987Sedward 		register short frame;
21514756Sedward 
21615733Sedward 		frame = tt.tt_frame[code & WWF_MASK];
21714987Sedward 		f->ww_buf[r][c].c_w = frame;
21814987Sedward 		if (wwsmap[r][c] == f->ww_index) {
21915654Sedward 			wwtouched[r] |= WWU_TOUCHED;
22014987Sedward 			wwns[r][c].c_w = frame;
22114756Sedward 		}
22214591Sedward 	}
22313983Sedward }
224