wwfree changed
[unix-history] / usr / src / usr.bin / window / wwframe.c
CommitLineData
65478625 1#ifndef lint
43c1dd56 2static 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 8wwframe(w, wframe)
0896e17e
EW
9register struct ww *w;
10struct 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 137wwframeok(w, r, c)
0896e17e
EW
138struct ww *w;
139register 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 149wwframec(f, rr, cc, code, dofmap)
85af59e4
EW
150register struct ww *f;
151register rr, cc;
0896e17e 152int code;
43c1dd56 153char 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}