Commit | Line | Data |
---|---|---|
65478625 | 1 | #ifndef lint |
861cd1ed | 2 | static char *sccsid = "@(#)wwframe.c 3.4 83/08/16"; |
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) | |
37 | wwframec(r, c, wframe, code|WWF_TOP); | |
38 | } | |
39 | a1 = a2; | |
40 | a2 = a3; | |
41 | b1 = b2; | |
42 | b2 = b3; | |
43 | } | |
44 | if ((a1 || a2) && b1 && b2) | |
45 | wwframec(r, c, wframe, WWF_L|WWF_TOP); | |
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) | |
67 | wwframec(r, c, wframe, code); | |
68 | } | |
69 | a1 = a2; | |
70 | a2 = a3; | |
71 | b1 = b2; | |
72 | b2 = b3; | |
73 | } | |
74 | if ((a1 || a2) && b1 && b2) | |
75 | wwframec(r, c, wframe, WWF_L); | |
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) | |
96 | wwframec(r, c, wframe, code); | |
97 | } | |
98 | a1 = a2; | |
99 | a2 = a3; | |
100 | b1 = b2; | |
101 | b2 = b3; | |
102 | } | |
103 | if ((a1 || a2) && b1 && b2) | |
104 | wwframec(r, c, wframe, WWF_U); | |
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) | |
125 | wwframec(r, c, wframe, code); | |
126 | } | |
127 | a1 = a2; | |
128 | a2 = a3; | |
129 | b1 = b2; | |
130 | b2 = b3; | |
131 | } | |
132 | if ((a1 || a2) && b1 && b2) | |
133 | wwframec(r, c, wframe, WWF_U); | |
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 | |
85af59e4 EW |
149 | wwframec(rr, cc, f, code) |
150 | register struct ww *f; | |
151 | register rr, cc; | |
0896e17e | 152 | int code; |
85af59e4 | 153 | { |
85af59e4 EW |
154 | register r, c; |
155 | ||
156 | if (rr < 0 || rr >= wwnrow || cc < 0 || cc >= wwncol) | |
157 | return; | |
0896e17e EW |
158 | { |
159 | register struct ww *w; | |
160 | w = wwindex[wwsmap[rr][cc]]; | |
161 | if (w->ww_order > f->ww_order) { | |
162 | if (w != &wwnobody) { | |
163 | r = rr - w->ww_w.t; | |
164 | c = cc - w->ww_w.l; | |
165 | if ((w->ww_win[r][c] |= WWM_COV) == WWM_COV) | |
166 | w->ww_nvis[r]--; | |
167 | w->ww_cov[r][c] = f->ww_index; | |
168 | } | |
169 | wwsmap[rr][cc] = f->ww_index; | |
c417b691 | 170 | } |
85af59e4 | 171 | } |
0896e17e EW |
172 | { |
173 | register char *fmap; | |
174 | fmap = &wwfmap[rr][cc]; | |
175 | *fmap |= code; | |
176 | if (code & WWF_TOP) | |
177 | *fmap &= ~WWF_LABEL; | |
178 | code = *(unsigned char *)fmap; | |
179 | } | |
85af59e4 EW |
180 | r = rr - f->ww_w.t; |
181 | c = cc - f->ww_w.l; | |
182 | if (f->ww_win[r][c] == WWM_GLS) | |
183 | f->ww_nvis[r]++; | |
184 | f->ww_win[r][c] &= ~WWM_GLS; | |
0896e17e EW |
185 | if ((code & WWF_LABEL) == 0) { |
186 | register tmp; | |
187 | ||
188 | tmp = tt.tt_frame[code & WWF_MASK] & WWC_CMASK; | |
189 | f->ww_buf[f->ww_scroll + r][c].c_w = tmp; | |
861cd1ed EW |
190 | if (wwsmap[rr][cc] == f->ww_index) { |
191 | wwtouched[rr] = 1; | |
0896e17e | 192 | wwns[rr][cc].c_w = tmp; |
861cd1ed | 193 | } |
0896e17e EW |
194 | } |
195 | } | |
196 | ||
197 | /* | |
198 | wwckns() | |
199 | { | |
200 | register i, j; | |
201 | ||
202 | for (i = 0; i < wwnrow; i++) | |
203 | for (j = 0; j < wwncol; j++) | |
204 | if ((wwns[i][j].c_c & 0x7f) < ' ') | |
205 | abort(); | |
65478625 | 206 | } |
0896e17e | 207 | */ |