xref: /csrg-svn/usr.bin/window/wwframe.c (revision 42835)
118735Sedward /*
233514Sbostic  * Copyright (c) 1983 Regents of the University of California.
333514Sbostic  * All rights reserved.
433514Sbostic  *
5*42835Sbostic  * %sccs.include.redist.c%
618735Sedward  */
718735Sedward 
833514Sbostic #ifndef lint
9*42835Sbostic static char sccsid[] = "@(#)wwframe.c	3.19 (Berkeley) 06/02/90";
1033514Sbostic #endif /* not lint */
1133514Sbostic 
1213983Sedward #include "ww.h"
1314649Sedward #include "tt.h"
1413983Sedward 
1514756Sedward #define frameok(w, r, c) (w1 = wwindex[wwsmap[r][c]], \
1617406Sedward 	w1->ww_fmap || w1->ww_order > (w)->ww_order)
1714756Sedward 
1814415Sedward wwframe(w, wframe)
1914591Sedward register struct ww *w;
2014591Sedward struct ww *wframe;
2113983Sedward {
2214591Sedward 	register r, c;
2314591Sedward 	char a1, a2, a3;
2414591Sedward 	char b1, b2, b3;
2514591Sedward 	register char *smap;
2614591Sedward 	register code;
2714756Sedward 	register struct ww *w1;
2813983Sedward 
2914591Sedward 	if (w->ww_w.t > 0) {
3014591Sedward 		r = w->ww_w.t - 1;
3114972Sedward 		c = w->ww_i.l - 1;
3214591Sedward 		smap = &wwsmap[r + 1][c + 1];
3314591Sedward 		a1 = 0;
3414591Sedward 		a2 = 0;
3514591Sedward 		b1 = 0;
3614756Sedward 		b2 = c < 0 || frameok(w, r, c);
3713983Sedward 
3814972Sedward 		for (; c < w->ww_i.r; c++) {
3914829Sedward 			if (c + 1 >= wwncol) {
4014829Sedward 				a3 = 1;
4114829Sedward 				b3 = 1;
4214829Sedward 			} else {
4314829Sedward 				a3 = w->ww_index == *smap++;
4414829Sedward 				b3 = frameok(w, r, c + 1);
4514829Sedward 			}
4614591Sedward 			if (b2) {
4714591Sedward 				code = 0;
4814591Sedward 				if ((a1 || a2) && b1)
4914591Sedward 					code |= WWF_L;
5014591Sedward 				if ((a2 || a3) && b3)
5114591Sedward 					code |= WWF_R;
5214591Sedward 				if (code)
5314772Sedward 					wwframec(wframe, r, c, code|WWF_TOP);
5414591Sedward 			}
5514591Sedward 			a1 = a2;
5614591Sedward 			a2 = a3;
5714591Sedward 			b1 = b2;
5814591Sedward 			b2 = b3;
5914591Sedward 		}
6014591Sedward 		if ((a1 || a2) && b1 && b2)
6114772Sedward 			wwframec(wframe, r, c, WWF_L|WWF_TOP);
6213983Sedward 	}
6313983Sedward 
6414591Sedward 	if (w->ww_w.b < wwnrow) {
6514591Sedward 		r = w->ww_w.b;
6614972Sedward 		c = w->ww_i.l - 1;
6714591Sedward 		smap = &wwsmap[r - 1][c + 1];
6814591Sedward 		a1 = 0;
6914591Sedward 		a2 = 0;
7014591Sedward 		b1 = 0;
7114756Sedward 		b2 = c < 0 || frameok(w, r, c);
7213983Sedward 
7314972Sedward 		for (; c < w->ww_i.r; c++) {
7414829Sedward 			if (c + 1 >= wwncol) {
7514829Sedward 				a3 = 1;
7614829Sedward 				b3 = 1;
7714829Sedward 			} else {
7814829Sedward 				a3 = w->ww_index == *smap++;
7914829Sedward 				b3 = frameok(w, r, c + 1);
8014829Sedward 			}
8114591Sedward 			if (b2) {
8214591Sedward 				code = 0;
8314591Sedward 				if ((a1 || a2) && b1)
8414591Sedward 					code |= WWF_L;
8514591Sedward 				if ((a2 || a3) && b3)
8614591Sedward 					code |= WWF_R;
8714591Sedward 				if (code)
8814772Sedward 					wwframec(wframe, r, c, code);
8914591Sedward 			}
9014591Sedward 			a1 = a2;
9114591Sedward 			a2 = a3;
9214591Sedward 			b1 = b2;
9314591Sedward 			b2 = b3;
9414591Sedward 		}
9514591Sedward 		if ((a1 || a2) && b1 && b2)
9614772Sedward 			wwframec(wframe, r, c, WWF_L);
9713983Sedward 	}
9813983Sedward 
9914591Sedward 	if (w->ww_w.l > 0) {
10014972Sedward 		r = w->ww_i.t - 1;
10114591Sedward 		c = w->ww_w.l - 1;
10214591Sedward 		a1 = 0;
10314591Sedward 		a2 = 0;
10414591Sedward 		b1 = 0;
10514756Sedward 		b2 = r < 0 || frameok(w, r, c);
10614591Sedward 
10714972Sedward 		for (; r < w->ww_i.b; r++) {
10814829Sedward 			if (r + 1 >= wwnrow) {
10914829Sedward 				a3 = 1;
11014829Sedward 				b3 = 1;
11114829Sedward 			} else {
11214829Sedward 				a3 = w->ww_index == wwsmap[r + 1][c + 1];
11314829Sedward 				b3 = frameok(w, r + 1, c);
11414829Sedward 			}
11514591Sedward 			if (b2) {
11614591Sedward 				code = 0;
11714591Sedward 				if ((a1 || a2) && b1)
11814591Sedward 					code |= WWF_U;
11914591Sedward 				if ((a2 || a3) && b3)
12014591Sedward 					code |= WWF_D;
12114591Sedward 				if (code)
12214772Sedward 					wwframec(wframe, r, c, code);
12314591Sedward 			}
12414591Sedward 			a1 = a2;
12514591Sedward 			a2 = a3;
12614591Sedward 			b1 = b2;
12714591Sedward 			b2 = b3;
12814591Sedward 		}
12914591Sedward 		if ((a1 || a2) && b1 && b2)
13014772Sedward 			wwframec(wframe, r, c, WWF_U);
13113983Sedward 	}
13213983Sedward 
13314591Sedward 	if (w->ww_w.r < wwncol) {
13414972Sedward 		r = w->ww_i.t - 1;
13514591Sedward 		c = w->ww_w.r;
13614591Sedward 		a1 = 0;
13714591Sedward 		a2 = 0;
13814591Sedward 		b1 = 0;
13914756Sedward 		b2 = r < 0 || frameok(w, r, c);
14014415Sedward 
14114972Sedward 		for (; r < w->ww_i.b; r++) {
14214829Sedward 			if (r + 1 >= wwnrow) {
14314829Sedward 				a3 = 1;
14414829Sedward 				b3 = 1;
14514829Sedward 			} else {
14614829Sedward 				a3 = w->ww_index == wwsmap[r + 1][c - 1];
14714829Sedward 				b3 = frameok(w, r + 1, c);
14814829Sedward 			}
14914591Sedward 			if (b2) {
15014591Sedward 				code = 0;
15114591Sedward 				if ((a1 || a2) && b1)
15214591Sedward 					code |= WWF_U;
15314591Sedward 				if ((a2 || a3) && b3)
15414591Sedward 					code |= WWF_D;
15514591Sedward 				if (code)
15614772Sedward 					wwframec(wframe, r, c, code);
15714591Sedward 			}
15814591Sedward 			a1 = a2;
15914591Sedward 			a2 = a3;
16014591Sedward 			b1 = b2;
16114591Sedward 			b2 = b3;
16214591Sedward 		}
16314591Sedward 		if ((a1 || a2) && b1 && b2)
16414772Sedward 			wwframec(wframe, r, c, WWF_U);
16514415Sedward 	}
16613983Sedward }
16713983Sedward 
16814987Sedward wwframec(f, r, c, code)
16914415Sedward register struct ww *f;
17014987Sedward register r, c;
17114756Sedward char code;
17213983Sedward {
17314756Sedward 	char oldcode;
17415587Sedward 	register char *smap;
17513983Sedward 
17614987Sedward 	if (r < f->ww_i.t || r >= f->ww_i.b || c < f->ww_i.l || c >= f->ww_i.r)
17714415Sedward 		return;
17815587Sedward 
17915587Sedward 	smap = &wwsmap[r][c];
18015587Sedward 
18114591Sedward 	{
18214591Sedward 		register struct ww *w;
18314756Sedward 
18415587Sedward 		w = wwindex[*smap];
18514591Sedward 		if (w->ww_order > f->ww_order) {
18615587Sedward 			if (w != &wwnobody && w->ww_win[r][c] == 0)
18715587Sedward 				w->ww_nvis[r]--;
18815587Sedward 			*smap = f->ww_index;
18914415Sedward 		}
19013983Sedward 	}
19114772Sedward 
19214772Sedward 	if (f->ww_fmap != 0) {
19314591Sedward 		register char *fmap;
19414756Sedward 
19514772Sedward 		fmap = &f->ww_fmap[r][c];
19614756Sedward 		oldcode = *fmap;
19714591Sedward 		*fmap |= code;
19814591Sedward 		if (code & WWF_TOP)
19914591Sedward 			*fmap &= ~WWF_LABEL;
20014756Sedward 		code = *fmap;
20114756Sedward 	} else
20214756Sedward 		oldcode = 0;
20314756Sedward 	{
20414987Sedward 		register char *win = &f->ww_win[r][c];
20514756Sedward 
20615587Sedward 		if (*win == WWM_GLS && *smap == f->ww_index)
20714987Sedward 			f->ww_nvis[r]++;
20814987Sedward 		*win &= ~WWM_GLS;
20914987Sedward 	}
21014987Sedward 	if (oldcode != code && (code & WWF_LABEL) == 0) {
21114987Sedward 		register short frame;
21214756Sedward 
21315733Sedward 		frame = tt.tt_frame[code & WWF_MASK];
21414987Sedward 		f->ww_buf[r][c].c_w = frame;
21514987Sedward 		if (wwsmap[r][c] == f->ww_index) {
21615654Sedward 			wwtouched[r] |= WWU_TOUCHED;
21714987Sedward 			wwns[r][c].c_w = frame;
21814756Sedward 		}
21914591Sedward 	}
22013983Sedward }
221