Commit | Line | Data |
---|---|---|
60de5df9 | 1 | /* |
a5338855 KB |
2 | * Copyright (c) 1983, 1993 |
3 | * The Regents of the University of California. All rights reserved. | |
46e9ea25 | 4 | * |
3dd3a9e5 KB |
5 | * This code is derived from software contributed to Berkeley by |
6 | * Edward Wang at The University of California, Berkeley. | |
7 | * | |
87f529ec | 8 | * %sccs.include.redist.c% |
60de5df9 EW |
9 | */ |
10 | ||
46e9ea25 | 11 | #ifndef lint |
a5338855 | 12 | static char sccsid[] = "@(#)wwframe.c 8.1 (Berkeley) %G%"; |
46e9ea25 KB |
13 | #endif /* not lint */ |
14 | ||
65478625 | 15 | #include "ww.h" |
e908bfac | 16 | #include "tt.h" |
65478625 | 17 | |
6e2a769e | 18 | #define frameok(w, r, c) (w1 = wwindex[wwsmap[r][c]], \ |
4a4250bc | 19 | w1->ww_fmap || w1->ww_order > (w)->ww_order) |
6e2a769e | 20 | |
85af59e4 | 21 | wwframe(w, wframe) |
0896e17e EW |
22 | register struct ww *w; |
23 | struct ww *wframe; | |
65478625 | 24 | { |
0896e17e EW |
25 | register r, c; |
26 | char a1, a2, a3; | |
27 | char b1, b2, b3; | |
28 | register char *smap; | |
29 | register code; | |
6e2a769e | 30 | register struct ww *w1; |
65478625 | 31 | |
0896e17e EW |
32 | if (w->ww_w.t > 0) { |
33 | r = w->ww_w.t - 1; | |
19f9784c | 34 | c = w->ww_i.l - 1; |
0896e17e EW |
35 | smap = &wwsmap[r + 1][c + 1]; |
36 | a1 = 0; | |
37 | a2 = 0; | |
38 | b1 = 0; | |
6e2a769e | 39 | b2 = c < 0 || frameok(w, r, c); |
65478625 | 40 | |
19f9784c | 41 | for (; c < w->ww_i.r; c++) { |
3531d4a4 EW |
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 | } | |
0896e17e EW |
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) | |
2357b64e | 56 | wwframec(wframe, r, c, code|WWF_TOP); |
0896e17e EW |
57 | } |
58 | a1 = a2; | |
59 | a2 = a3; | |
60 | b1 = b2; | |
61 | b2 = b3; | |
62 | } | |
63 | if ((a1 || a2) && b1 && b2) | |
2357b64e | 64 | wwframec(wframe, r, c, WWF_L|WWF_TOP); |
65478625 EW |
65 | } |
66 | ||
0896e17e EW |
67 | if (w->ww_w.b < wwnrow) { |
68 | r = w->ww_w.b; | |
19f9784c | 69 | c = w->ww_i.l - 1; |
0896e17e EW |
70 | smap = &wwsmap[r - 1][c + 1]; |
71 | a1 = 0; | |
72 | a2 = 0; | |
73 | b1 = 0; | |
6e2a769e | 74 | b2 = c < 0 || frameok(w, r, c); |
0896e17e | 75 | |
19f9784c | 76 | for (; c < w->ww_i.r; c++) { |
3531d4a4 EW |
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 | } | |
0896e17e EW |
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) | |
2357b64e | 91 | wwframec(wframe, r, c, code); |
0896e17e EW |
92 | } |
93 | a1 = a2; | |
94 | a2 = a3; | |
95 | b1 = b2; | |
96 | b2 = b3; | |
97 | } | |
98 | if ((a1 || a2) && b1 && b2) | |
2357b64e | 99 | wwframec(wframe, r, c, WWF_L); |
65478625 | 100 | } |
65478625 | 101 | |
0896e17e | 102 | if (w->ww_w.l > 0) { |
19f9784c | 103 | r = w->ww_i.t - 1; |
0896e17e EW |
104 | c = w->ww_w.l - 1; |
105 | a1 = 0; | |
106 | a2 = 0; | |
107 | b1 = 0; | |
6e2a769e | 108 | b2 = r < 0 || frameok(w, r, c); |
85af59e4 | 109 | |
19f9784c | 110 | for (; r < w->ww_i.b; r++) { |
3531d4a4 EW |
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 | } | |
0896e17e EW |
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) | |
2357b64e | 125 | wwframec(wframe, r, c, code); |
0896e17e EW |
126 | } |
127 | a1 = a2; | |
128 | a2 = a3; | |
129 | b1 = b2; | |
130 | b2 = b3; | |
131 | } | |
132 | if ((a1 || a2) && b1 && b2) | |
2357b64e | 133 | wwframec(wframe, r, c, WWF_U); |
85af59e4 | 134 | } |
0896e17e EW |
135 | |
136 | if (w->ww_w.r < wwncol) { | |
19f9784c | 137 | r = w->ww_i.t - 1; |
0896e17e EW |
138 | c = w->ww_w.r; |
139 | a1 = 0; | |
140 | a2 = 0; | |
141 | b1 = 0; | |
6e2a769e | 142 | b2 = r < 0 || frameok(w, r, c); |
0896e17e | 143 | |
19f9784c | 144 | for (; r < w->ww_i.b; r++) { |
3531d4a4 EW |
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 | } | |
0896e17e EW |
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) | |
2357b64e | 159 | wwframec(wframe, r, c, code); |
0896e17e EW |
160 | } |
161 | a1 = a2; | |
162 | a2 = a3; | |
163 | b1 = b2; | |
164 | b2 = b3; | |
165 | } | |
166 | if ((a1 || a2) && b1 && b2) | |
2357b64e | 167 | wwframec(wframe, r, c, WWF_U); |
65478625 | 168 | } |
65478625 EW |
169 | } |
170 | ||
f2a77fe1 | 171 | wwframec(f, r, c, code) |
85af59e4 | 172 | register struct ww *f; |
f2a77fe1 | 173 | register r, c; |
6e2a769e | 174 | char code; |
85af59e4 | 175 | { |
6e2a769e | 176 | char oldcode; |
84ad208b | 177 | register char *smap; |
85af59e4 | 178 | |
f2a77fe1 | 179 | if (r < f->ww_i.t || r >= f->ww_i.b || c < f->ww_i.l || c >= f->ww_i.r) |
85af59e4 | 180 | return; |
84ad208b EW |
181 | |
182 | smap = &wwsmap[r][c]; | |
183 | ||
0896e17e EW |
184 | { |
185 | register struct ww *w; | |
6e2a769e | 186 | |
84ad208b | 187 | w = wwindex[*smap]; |
0896e17e | 188 | if (w->ww_order > f->ww_order) { |
84ad208b EW |
189 | if (w != &wwnobody && w->ww_win[r][c] == 0) |
190 | w->ww_nvis[r]--; | |
191 | *smap = f->ww_index; | |
c417b691 | 192 | } |
85af59e4 | 193 | } |
2357b64e | 194 | |
2357b64e | 195 | if (f->ww_fmap != 0) { |
0896e17e | 196 | register char *fmap; |
6e2a769e | 197 | |
2357b64e | 198 | fmap = &f->ww_fmap[r][c]; |
6e2a769e | 199 | oldcode = *fmap; |
0896e17e EW |
200 | *fmap |= code; |
201 | if (code & WWF_TOP) | |
202 | *fmap &= ~WWF_LABEL; | |
6e2a769e EW |
203 | code = *fmap; |
204 | } else | |
205 | oldcode = 0; | |
206 | { | |
f2a77fe1 | 207 | register char *win = &f->ww_win[r][c]; |
6e2a769e | 208 | |
84ad208b | 209 | if (*win == WWM_GLS && *smap == f->ww_index) |
f2a77fe1 EW |
210 | f->ww_nvis[r]++; |
211 | *win &= ~WWM_GLS; | |
212 | } | |
213 | if (oldcode != code && (code & WWF_LABEL) == 0) { | |
214 | register short frame; | |
215 | ||
a830e8bb | 216 | frame = tt.tt_frame[code & WWF_MASK]; |
f2a77fe1 EW |
217 | f->ww_buf[r][c].c_w = frame; |
218 | if (wwsmap[r][c] == f->ww_index) { | |
04d70db4 | 219 | wwtouched[r] |= WWU_TOUCHED; |
f2a77fe1 | 220 | wwns[r][c].c_w = frame; |
861cd1ed | 221 | } |
0896e17e EW |
222 | } |
223 | } |