Commit | Line | Data |
---|---|---|
65478625 | 1 | #ifndef lint |
43c1dd56 | 2 | static char *sccsid = "@(#)wwframe.c 3.5 83/08/18"; |
65478625 EW |
3 | #endif |
4 | ||
5 | #include "ww.h" | |
e908bfac | 6 | #include "tt.h" |
65478625 | 7 | |
85af59e4 | 8 | wwframe(w, wframe) |
0896e17e EW |
9 | register struct ww *w; |
10 | struct ww *wframe; | |
65478625 | 11 | { |
0896e17e EW |
12 | register r, c; |
13 | char a1, a2, a3; | |
14 | char b1, b2, b3; | |
15 | register char *smap; | |
16 | register code; | |
65478625 | 17 | |
0896e17e EW |
18 | if (w->ww_w.t > 0) { |
19 | r = w->ww_w.t - 1; | |
20 | c = w->ww_w.l - 1; | |
21 | smap = &wwsmap[r + 1][c + 1]; | |
22 | a1 = 0; | |
23 | a2 = 0; | |
24 | b1 = 0; | |
25 | b2 = wwframeok(w, r, c); | |
65478625 | 26 | |
0896e17e EW |
27 | for (; c < w->ww_w.r; c++) { |
28 | a3 = w->ww_index == *smap++; | |
29 | b3 = wwframeok(w, r, c + 1); | |
30 | if (b2) { | |
31 | code = 0; | |
32 | if ((a1 || a2) && b1) | |
33 | code |= WWF_L; | |
34 | if ((a2 || a3) && b3) | |
35 | code |= WWF_R; | |
36 | if (code) | |
43c1dd56 | 37 | wwframec(wframe, r, c, code|WWF_TOP, 1); |
0896e17e EW |
38 | } |
39 | a1 = a2; | |
40 | a2 = a3; | |
41 | b1 = b2; | |
42 | b2 = b3; | |
43 | } | |
44 | if ((a1 || a2) && b1 && b2) | |
43c1dd56 | 45 | wwframec(wframe, r, c, WWF_L|WWF_TOP, 1); |
65478625 EW |
46 | } |
47 | ||
0896e17e EW |
48 | if (w->ww_w.b < wwnrow) { |
49 | r = w->ww_w.b; | |
50 | c = w->ww_w.l - 1; | |
51 | smap = &wwsmap[r - 1][c + 1]; | |
52 | a1 = 0; | |
53 | a2 = 0; | |
54 | b1 = 0; | |
55 | b2 = wwframeok(w, r, c); | |
56 | ||
57 | for (; c < w->ww_w.r; c++) { | |
58 | a3 = w->ww_index == *smap++; | |
59 | b3 = wwframeok(w, r, c + 1); | |
60 | if (b2) { | |
61 | code = 0; | |
62 | if ((a1 || a2) && b1) | |
63 | code |= WWF_L; | |
64 | if ((a2 || a3) && b3) | |
65 | code |= WWF_R; | |
66 | if (code) | |
43c1dd56 | 67 | wwframec(wframe, r, c, code, 1); |
0896e17e EW |
68 | } |
69 | a1 = a2; | |
70 | a2 = a3; | |
71 | b1 = b2; | |
72 | b2 = b3; | |
73 | } | |
74 | if ((a1 || a2) && b1 && b2) | |
43c1dd56 | 75 | wwframec(wframe, r, c, WWF_L, 1); |
65478625 | 76 | } |
65478625 | 77 | |
0896e17e EW |
78 | if (w->ww_w.l > 0) { |
79 | r = w->ww_w.t - 1; | |
80 | c = w->ww_w.l - 1; | |
81 | a1 = 0; | |
82 | a2 = 0; | |
83 | b1 = 0; | |
84 | b2 = wwframeok(w, r, c); | |
85af59e4 | 85 | |
0896e17e EW |
86 | for (; r < w->ww_w.b; r++) { |
87 | a3 = w->ww_index == wwsmap[r + 1][c + 1]; | |
88 | b3 = wwframeok(w, r + 1, c); | |
89 | if (b2) { | |
90 | code = 0; | |
91 | if ((a1 || a2) && b1) | |
92 | code |= WWF_U; | |
93 | if ((a2 || a3) && b3) | |
94 | code |= WWF_D; | |
95 | if (code) | |
43c1dd56 | 96 | wwframec(wframe, r, c, code, 1); |
0896e17e EW |
97 | } |
98 | a1 = a2; | |
99 | a2 = a3; | |
100 | b1 = b2; | |
101 | b2 = b3; | |
102 | } | |
103 | if ((a1 || a2) && b1 && b2) | |
43c1dd56 | 104 | wwframec(wframe, r, c, WWF_U, 1); |
85af59e4 | 105 | } |
0896e17e EW |
106 | |
107 | if (w->ww_w.r < wwncol) { | |
108 | r = w->ww_w.t - 1; | |
109 | c = w->ww_w.r; | |
110 | a1 = 0; | |
111 | a2 = 0; | |
112 | b1 = 0; | |
113 | b2 = wwframeok(w, r, c); | |
114 | ||
115 | for (; r < w->ww_w.b; r++) { | |
116 | a3 = w->ww_index == wwsmap[r + 1][c - 1]; | |
117 | b3 = wwframeok(w, r + 1, c); | |
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) | |
43c1dd56 | 125 | wwframec(wframe, r, c, code, 1); |
0896e17e EW |
126 | } |
127 | a1 = a2; | |
128 | a2 = a3; | |
129 | b1 = b2; | |
130 | b2 = b3; | |
131 | } | |
132 | if ((a1 || a2) && b1 && b2) | |
43c1dd56 | 133 | wwframec(wframe, r, c, WWF_U, 1); |
65478625 | 134 | } |
65478625 EW |
135 | } |
136 | ||
85af59e4 | 137 | wwframeok(w, r, c) |
0896e17e EW |
138 | struct ww *w; |
139 | register r, c; | |
65478625 | 140 | { |
85af59e4 | 141 | register struct ww *w1; |
65478625 | 142 | |
85af59e4 EW |
143 | if (r < 0 || r >= wwnrow || c < 0 || c >= wwncol) |
144 | return 1; | |
145 | w1 = wwindex[wwsmap[r][c]]; | |
0896e17e | 146 | return !w1->ww_hasframe || w1->ww_order > w->ww_order; |
85af59e4 | 147 | } |
65478625 | 148 | |
43c1dd56 | 149 | wwframec(f, rr, cc, code, dofmap) |
85af59e4 EW |
150 | register struct ww *f; |
151 | register rr, cc; | |
0896e17e | 152 | int code; |
43c1dd56 | 153 | char dofmap; |
85af59e4 | 154 | { |
85af59e4 EW |
155 | register r, c; |
156 | ||
43c1dd56 EW |
157 | if (rr < f->ww_w.t || rr >= f->ww_w.b |
158 | || cc < f->ww_w.l || cc >= f->ww_w.r) | |
85af59e4 | 159 | return; |
0896e17e EW |
160 | { |
161 | register struct ww *w; | |
162 | w = wwindex[wwsmap[rr][cc]]; | |
163 | if (w->ww_order > f->ww_order) { | |
164 | if (w != &wwnobody) { | |
165 | r = rr - w->ww_w.t; | |
166 | c = cc - w->ww_w.l; | |
167 | if ((w->ww_win[r][c] |= WWM_COV) == WWM_COV) | |
168 | w->ww_nvis[r]--; | |
169 | w->ww_cov[r][c] = f->ww_index; | |
170 | } | |
171 | wwsmap[rr][cc] = f->ww_index; | |
c417b691 | 172 | } |
85af59e4 | 173 | } |
43c1dd56 | 174 | if (dofmap) { |
0896e17e EW |
175 | register char *fmap; |
176 | fmap = &wwfmap[rr][cc]; | |
177 | *fmap |= code; | |
178 | if (code & WWF_TOP) | |
179 | *fmap &= ~WWF_LABEL; | |
180 | code = *(unsigned char *)fmap; | |
181 | } | |
85af59e4 EW |
182 | r = rr - f->ww_w.t; |
183 | c = cc - f->ww_w.l; | |
184 | if (f->ww_win[r][c] == WWM_GLS) | |
185 | f->ww_nvis[r]++; | |
186 | f->ww_win[r][c] &= ~WWM_GLS; | |
0896e17e EW |
187 | if ((code & WWF_LABEL) == 0) { |
188 | register tmp; | |
189 | ||
190 | tmp = tt.tt_frame[code & WWF_MASK] & WWC_CMASK; | |
191 | f->ww_buf[f->ww_scroll + r][c].c_w = tmp; | |
861cd1ed EW |
192 | if (wwsmap[rr][cc] == f->ww_index) { |
193 | wwtouched[rr] = 1; | |
0896e17e | 194 | wwns[rr][cc].c_w = tmp; |
861cd1ed | 195 | } |
0896e17e EW |
196 | } |
197 | } |