xref: /original-bsd/usr.bin/window/wwframe.c (revision e74403ba)
1 #ifndef lint
2 static	char *sccsid = "@(#)wwframe.c	3.13 83/12/17";
3 #endif
4 
5 #include "ww.h"
6 #include "tt.h"
7 
8 #define frameok(w, r, c) (w1 = wwindex[wwsmap[r][c]], \
9 	!w1->ww_hasframe || w1->ww_order > (w)->ww_order)
10 
11 wwframe(w, wframe)
12 register struct ww *w;
13 struct ww *wframe;
14 {
15 	register r, c;
16 	char a1, a2, a3;
17 	char b1, b2, b3;
18 	register char *smap;
19 	register code;
20 	register struct ww *w1;
21 
22 	if (w->ww_w.t > 0) {
23 		r = w->ww_w.t - 1;
24 		c = w->ww_i.l - 1;
25 		smap = &wwsmap[r + 1][c + 1];
26 		a1 = 0;
27 		a2 = 0;
28 		b1 = 0;
29 		b2 = c < 0 || frameok(w, r, c);
30 
31 		for (; c < w->ww_i.r; c++) {
32 			if (c + 1 >= wwncol) {
33 				a3 = 1;
34 				b3 = 1;
35 			} else {
36 				a3 = w->ww_index == *smap++;
37 				b3 = frameok(w, r, c + 1);
38 			}
39 			if (b2) {
40 				code = 0;
41 				if ((a1 || a2) && b1)
42 					code |= WWF_L;
43 				if ((a2 || a3) && b3)
44 					code |= WWF_R;
45 				if (code)
46 					wwframec(wframe, r, c, code|WWF_TOP);
47 			}
48 			a1 = a2;
49 			a2 = a3;
50 			b1 = b2;
51 			b2 = b3;
52 		}
53 		if ((a1 || a2) && b1 && b2)
54 			wwframec(wframe, r, c, WWF_L|WWF_TOP);
55 	}
56 
57 	if (w->ww_w.b < wwnrow) {
58 		r = w->ww_w.b;
59 		c = w->ww_i.l - 1;
60 		smap = &wwsmap[r - 1][c + 1];
61 		a1 = 0;
62 		a2 = 0;
63 		b1 = 0;
64 		b2 = c < 0 || frameok(w, r, c);
65 
66 		for (; c < w->ww_i.r; c++) {
67 			if (c + 1 >= wwncol) {
68 				a3 = 1;
69 				b3 = 1;
70 			} else {
71 				a3 = w->ww_index == *smap++;
72 				b3 = frameok(w, r, c + 1);
73 			}
74 			if (b2) {
75 				code = 0;
76 				if ((a1 || a2) && b1)
77 					code |= WWF_L;
78 				if ((a2 || a3) && b3)
79 					code |= WWF_R;
80 				if (code)
81 					wwframec(wframe, r, c, code);
82 			}
83 			a1 = a2;
84 			a2 = a3;
85 			b1 = b2;
86 			b2 = b3;
87 		}
88 		if ((a1 || a2) && b1 && b2)
89 			wwframec(wframe, r, c, WWF_L);
90 	}
91 
92 	if (w->ww_w.l > 0) {
93 		r = w->ww_i.t - 1;
94 		c = w->ww_w.l - 1;
95 		a1 = 0;
96 		a2 = 0;
97 		b1 = 0;
98 		b2 = r < 0 || frameok(w, r, c);
99 
100 		for (; r < w->ww_i.b; r++) {
101 			if (r + 1 >= wwnrow) {
102 				a3 = 1;
103 				b3 = 1;
104 			} else {
105 				a3 = w->ww_index == wwsmap[r + 1][c + 1];
106 				b3 = frameok(w, r + 1, c);
107 			}
108 			if (b2) {
109 				code = 0;
110 				if ((a1 || a2) && b1)
111 					code |= WWF_U;
112 				if ((a2 || a3) && b3)
113 					code |= WWF_D;
114 				if (code)
115 					wwframec(wframe, r, c, code);
116 			}
117 			a1 = a2;
118 			a2 = a3;
119 			b1 = b2;
120 			b2 = b3;
121 		}
122 		if ((a1 || a2) && b1 && b2)
123 			wwframec(wframe, r, c, WWF_U);
124 	}
125 
126 	if (w->ww_w.r < wwncol) {
127 		r = w->ww_i.t - 1;
128 		c = w->ww_w.r;
129 		a1 = 0;
130 		a2 = 0;
131 		b1 = 0;
132 		b2 = r < 0 || frameok(w, r, c);
133 
134 		for (; r < w->ww_i.b; r++) {
135 			if (r + 1 >= wwnrow) {
136 				a3 = 1;
137 				b3 = 1;
138 			} else {
139 				a3 = w->ww_index == wwsmap[r + 1][c - 1];
140 				b3 = frameok(w, r + 1, c);
141 			}
142 			if (b2) {
143 				code = 0;
144 				if ((a1 || a2) && b1)
145 					code |= WWF_U;
146 				if ((a2 || a3) && b3)
147 					code |= WWF_D;
148 				if (code)
149 					wwframec(wframe, r, c, code);
150 			}
151 			a1 = a2;
152 			a2 = a3;
153 			b1 = b2;
154 			b2 = b3;
155 		}
156 		if ((a1 || a2) && b1 && b2)
157 			wwframec(wframe, r, c, WWF_U);
158 	}
159 }
160 
161 wwframec(f, r, c, code)
162 register struct ww *f;
163 register r, c;
164 char code;
165 {
166 	char oldcode;
167 	register char *smap;
168 
169 	if (r < f->ww_i.t || r >= f->ww_i.b || c < f->ww_i.l || c >= f->ww_i.r)
170 		return;
171 
172 	smap = &wwsmap[r][c];
173 
174 	{
175 		register struct ww *w;
176 
177 		w = wwindex[*smap];
178 		if (w->ww_order > f->ww_order) {
179 			if (w != &wwnobody && w->ww_win[r][c] == 0)
180 				w->ww_nvis[r]--;
181 			*smap = f->ww_index;
182 		}
183 	}
184 
185 	if (f->ww_fmap != 0) {
186 		register char *fmap;
187 
188 		fmap = &f->ww_fmap[r][c];
189 		oldcode = *fmap;
190 		*fmap |= code;
191 		if (code & WWF_TOP)
192 			*fmap &= ~WWF_LABEL;
193 		code = *fmap;
194 	} else
195 		oldcode = 0;
196 	{
197 		register char *win = &f->ww_win[r][c];
198 
199 		if (*win == WWM_GLS && *smap == f->ww_index)
200 			f->ww_nvis[r]++;
201 		*win &= ~WWM_GLS;
202 	}
203 	if (oldcode != code && (code & WWF_LABEL) == 0) {
204 		register short frame;
205 
206 		frame = tt.tt_frame[code & WWF_MASK];
207 		f->ww_buf[r][c].c_w = frame;
208 		if (wwsmap[r][c] == f->ww_index) {
209 			wwtouched[r] |= WWU_TOUCHED;
210 			wwns[r][c].c_w = frame;
211 		}
212 	}
213 }
214