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