Commit | Line | Data |
---|---|---|
65478625 | 1 | #ifndef lint |
a830e8bb | 2 | static char *sccsid = "@(#)wwframe.c 3.13 83/12/17"; |
65478625 EW |
3 | #endif |
4 | ||
5 | #include "ww.h" | |
e908bfac | 6 | #include "tt.h" |
65478625 | 7 | |
6e2a769e EW |
8 | #define frameok(w, r, c) (w1 = wwindex[wwsmap[r][c]], \ |
9 | !w1->ww_hasframe || w1->ww_order > (w)->ww_order) | |
10 | ||
85af59e4 | 11 | wwframe(w, wframe) |
0896e17e EW |
12 | register struct ww *w; |
13 | struct ww *wframe; | |
65478625 | 14 | { |
0896e17e EW |
15 | register r, c; |
16 | char a1, a2, a3; | |
17 | char b1, b2, b3; | |
18 | register char *smap; | |
19 | register code; | |
6e2a769e | 20 | register struct ww *w1; |
65478625 | 21 | |
0896e17e EW |
22 | if (w->ww_w.t > 0) { |
23 | r = w->ww_w.t - 1; | |
19f9784c | 24 | c = w->ww_i.l - 1; |
0896e17e EW |
25 | smap = &wwsmap[r + 1][c + 1]; |
26 | a1 = 0; | |
27 | a2 = 0; | |
28 | b1 = 0; | |
6e2a769e | 29 | b2 = c < 0 || frameok(w, r, c); |
65478625 | 30 | |
19f9784c | 31 | for (; c < w->ww_i.r; c++) { |
3531d4a4 EW |
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 | } | |
0896e17e EW |
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) | |
2357b64e | 46 | wwframec(wframe, r, c, code|WWF_TOP); |
0896e17e EW |
47 | } |
48 | a1 = a2; | |
49 | a2 = a3; | |
50 | b1 = b2; | |
51 | b2 = b3; | |
52 | } | |
53 | if ((a1 || a2) && b1 && b2) | |
2357b64e | 54 | wwframec(wframe, r, c, WWF_L|WWF_TOP); |
65478625 EW |
55 | } |
56 | ||
0896e17e EW |
57 | if (w->ww_w.b < wwnrow) { |
58 | r = w->ww_w.b; | |
19f9784c | 59 | c = w->ww_i.l - 1; |
0896e17e EW |
60 | smap = &wwsmap[r - 1][c + 1]; |
61 | a1 = 0; | |
62 | a2 = 0; | |
63 | b1 = 0; | |
6e2a769e | 64 | b2 = c < 0 || frameok(w, r, c); |
0896e17e | 65 | |
19f9784c | 66 | for (; c < w->ww_i.r; c++) { |
3531d4a4 EW |
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 | } | |
0896e17e EW |
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) | |
2357b64e | 81 | wwframec(wframe, r, c, code); |
0896e17e EW |
82 | } |
83 | a1 = a2; | |
84 | a2 = a3; | |
85 | b1 = b2; | |
86 | b2 = b3; | |
87 | } | |
88 | if ((a1 || a2) && b1 && b2) | |
2357b64e | 89 | wwframec(wframe, r, c, WWF_L); |
65478625 | 90 | } |
65478625 | 91 | |
0896e17e | 92 | if (w->ww_w.l > 0) { |
19f9784c | 93 | r = w->ww_i.t - 1; |
0896e17e EW |
94 | c = w->ww_w.l - 1; |
95 | a1 = 0; | |
96 | a2 = 0; | |
97 | b1 = 0; | |
6e2a769e | 98 | b2 = r < 0 || frameok(w, r, c); |
85af59e4 | 99 | |
19f9784c | 100 | for (; r < w->ww_i.b; r++) { |
3531d4a4 EW |
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 | } | |
0896e17e EW |
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) | |
2357b64e | 115 | wwframec(wframe, r, c, code); |
0896e17e EW |
116 | } |
117 | a1 = a2; | |
118 | a2 = a3; | |
119 | b1 = b2; | |
120 | b2 = b3; | |
121 | } | |
122 | if ((a1 || a2) && b1 && b2) | |
2357b64e | 123 | wwframec(wframe, r, c, WWF_U); |
85af59e4 | 124 | } |
0896e17e EW |
125 | |
126 | if (w->ww_w.r < wwncol) { | |
19f9784c | 127 | r = w->ww_i.t - 1; |
0896e17e EW |
128 | c = w->ww_w.r; |
129 | a1 = 0; | |
130 | a2 = 0; | |
131 | b1 = 0; | |
6e2a769e | 132 | b2 = r < 0 || frameok(w, r, c); |
0896e17e | 133 | |
19f9784c | 134 | for (; r < w->ww_i.b; r++) { |
3531d4a4 EW |
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 | } | |
0896e17e EW |
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) | |
2357b64e | 149 | wwframec(wframe, r, c, code); |
0896e17e EW |
150 | } |
151 | a1 = a2; | |
152 | a2 = a3; | |
153 | b1 = b2; | |
154 | b2 = b3; | |
155 | } | |
156 | if ((a1 || a2) && b1 && b2) | |
2357b64e | 157 | wwframec(wframe, r, c, WWF_U); |
65478625 | 158 | } |
65478625 EW |
159 | } |
160 | ||
f2a77fe1 | 161 | wwframec(f, r, c, code) |
85af59e4 | 162 | register struct ww *f; |
f2a77fe1 | 163 | register r, c; |
6e2a769e | 164 | char code; |
85af59e4 | 165 | { |
6e2a769e | 166 | char oldcode; |
84ad208b | 167 | register char *smap; |
85af59e4 | 168 | |
f2a77fe1 | 169 | if (r < f->ww_i.t || r >= f->ww_i.b || c < f->ww_i.l || c >= f->ww_i.r) |
85af59e4 | 170 | return; |
84ad208b EW |
171 | |
172 | smap = &wwsmap[r][c]; | |
173 | ||
0896e17e EW |
174 | { |
175 | register struct ww *w; | |
6e2a769e | 176 | |
84ad208b | 177 | w = wwindex[*smap]; |
0896e17e | 178 | if (w->ww_order > f->ww_order) { |
84ad208b EW |
179 | if (w != &wwnobody && w->ww_win[r][c] == 0) |
180 | w->ww_nvis[r]--; | |
181 | *smap = f->ww_index; | |
c417b691 | 182 | } |
85af59e4 | 183 | } |
2357b64e | 184 | |
2357b64e | 185 | if (f->ww_fmap != 0) { |
0896e17e | 186 | register char *fmap; |
6e2a769e | 187 | |
2357b64e | 188 | fmap = &f->ww_fmap[r][c]; |
6e2a769e | 189 | oldcode = *fmap; |
0896e17e EW |
190 | *fmap |= code; |
191 | if (code & WWF_TOP) | |
192 | *fmap &= ~WWF_LABEL; | |
6e2a769e EW |
193 | code = *fmap; |
194 | } else | |
195 | oldcode = 0; | |
196 | { | |
f2a77fe1 | 197 | register char *win = &f->ww_win[r][c]; |
6e2a769e | 198 | |
84ad208b | 199 | if (*win == WWM_GLS && *smap == f->ww_index) |
f2a77fe1 EW |
200 | f->ww_nvis[r]++; |
201 | *win &= ~WWM_GLS; | |
202 | } | |
203 | if (oldcode != code && (code & WWF_LABEL) == 0) { | |
204 | register short frame; | |
205 | ||
a830e8bb | 206 | frame = tt.tt_frame[code & WWF_MASK]; |
f2a77fe1 EW |
207 | f->ww_buf[r][c].c_w = frame; |
208 | if (wwsmap[r][c] == f->ww_index) { | |
04d70db4 | 209 | wwtouched[r] |= WWU_TOUCHED; |
f2a77fe1 | 210 | wwns[r][c].c_w = frame; |
861cd1ed | 211 | } |
0896e17e EW |
212 | } |
213 | } |