date and time created 83/08/22 15:19:40 by edward
[unix-history] / usr / src / usr.bin / window / wwframe.c
CommitLineData
65478625 1#ifndef lint
2357b64e 2static char *sccsid = "@(#)wwframe.c 3.7 83/08/19";
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 11wwframe(w, wframe)
0896e17e
EW
12register struct ww *w;
13struct 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;
24 c = w->ww_w.l - 1;
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
0896e17e
EW
31 for (; c < w->ww_w.r; c++) {
32 a3 = w->ww_index == *smap++;
6e2a769e 33 b3 = c + 1 >= wwncol || frameok(w, r, c + 1);
0896e17e
EW
34 if (b2) {
35 code = 0;
36 if ((a1 || a2) && b1)
37 code |= WWF_L;
38 if ((a2 || a3) && b3)
39 code |= WWF_R;
40 if (code)
2357b64e 41 wwframec(wframe, r, c, code|WWF_TOP);
0896e17e
EW
42 }
43 a1 = a2;
44 a2 = a3;
45 b1 = b2;
46 b2 = b3;
47 }
48 if ((a1 || a2) && b1 && b2)
2357b64e 49 wwframec(wframe, r, c, WWF_L|WWF_TOP);
65478625
EW
50 }
51
0896e17e
EW
52 if (w->ww_w.b < wwnrow) {
53 r = w->ww_w.b;
54 c = w->ww_w.l - 1;
55 smap = &wwsmap[r - 1][c + 1];
56 a1 = 0;
57 a2 = 0;
58 b1 = 0;
6e2a769e 59 b2 = c < 0 || frameok(w, r, c);
0896e17e
EW
60
61 for (; c < w->ww_w.r; c++) {
62 a3 = w->ww_index == *smap++;
6e2a769e 63 b3 = c + 1 >= wwncol || frameok(w, r, c + 1);
0896e17e
EW
64 if (b2) {
65 code = 0;
66 if ((a1 || a2) && b1)
67 code |= WWF_L;
68 if ((a2 || a3) && b3)
69 code |= WWF_R;
70 if (code)
2357b64e 71 wwframec(wframe, r, c, code);
0896e17e
EW
72 }
73 a1 = a2;
74 a2 = a3;
75 b1 = b2;
76 b2 = b3;
77 }
78 if ((a1 || a2) && b1 && b2)
2357b64e 79 wwframec(wframe, r, c, WWF_L);
65478625 80 }
65478625 81
0896e17e
EW
82 if (w->ww_w.l > 0) {
83 r = w->ww_w.t - 1;
84 c = w->ww_w.l - 1;
85 a1 = 0;
86 a2 = 0;
87 b1 = 0;
6e2a769e 88 b2 = r < 0 || frameok(w, r, c);
85af59e4 89
0896e17e
EW
90 for (; r < w->ww_w.b; r++) {
91 a3 = w->ww_index == wwsmap[r + 1][c + 1];
6e2a769e 92 b3 = r + 1 >= wwnrow || frameok(w, r + 1, c);
0896e17e
EW
93 if (b2) {
94 code = 0;
95 if ((a1 || a2) && b1)
96 code |= WWF_U;
97 if ((a2 || a3) && b3)
98 code |= WWF_D;
99 if (code)
2357b64e 100 wwframec(wframe, r, c, code);
0896e17e
EW
101 }
102 a1 = a2;
103 a2 = a3;
104 b1 = b2;
105 b2 = b3;
106 }
107 if ((a1 || a2) && b1 && b2)
2357b64e 108 wwframec(wframe, r, c, WWF_U);
85af59e4 109 }
0896e17e
EW
110
111 if (w->ww_w.r < wwncol) {
112 r = w->ww_w.t - 1;
113 c = w->ww_w.r;
114 a1 = 0;
115 a2 = 0;
116 b1 = 0;
6e2a769e 117 b2 = r < 0 || frameok(w, r, c);
0896e17e
EW
118
119 for (; r < w->ww_w.b; r++) {
120 a3 = w->ww_index == wwsmap[r + 1][c - 1];
6e2a769e 121 b3 = r + 1 >= wwnrow || frameok(w, r + 1, c);
0896e17e
EW
122 if (b2) {
123 code = 0;
124 if ((a1 || a2) && b1)
125 code |= WWF_U;
126 if ((a2 || a3) && b3)
127 code |= WWF_D;
128 if (code)
2357b64e 129 wwframec(wframe, r, c, code);
0896e17e
EW
130 }
131 a1 = a2;
132 a2 = a3;
133 b1 = b2;
134 b2 = b3;
135 }
136 if ((a1 || a2) && b1 && b2)
2357b64e 137 wwframec(wframe, r, c, WWF_U);
65478625 138 }
65478625
EW
139}
140
2357b64e 141wwframec(f, rr, cc, code)
85af59e4
EW
142register struct ww *f;
143register rr, cc;
6e2a769e 144char code;
85af59e4 145{
2357b64e 146 register r, c;
6e2a769e 147 char oldcode;
85af59e4 148
43c1dd56
EW
149 if (rr < f->ww_w.t || rr >= f->ww_w.b
150 || cc < f->ww_w.l || cc >= f->ww_w.r)
85af59e4 151 return;
0896e17e
EW
152 {
153 register struct ww *w;
6e2a769e 154
0896e17e
EW
155 w = wwindex[wwsmap[rr][cc]];
156 if (w->ww_order > f->ww_order) {
157 if (w != &wwnobody) {
158 r = rr - w->ww_w.t;
159 c = cc - w->ww_w.l;
160 if ((w->ww_win[r][c] |= WWM_COV) == WWM_COV)
161 w->ww_nvis[r]--;
162 w->ww_cov[r][c] = f->ww_index;
163 }
164 wwsmap[rr][cc] = f->ww_index;
c417b691 165 }
85af59e4 166 }
2357b64e
EW
167
168 r = rr - f->ww_w.t;
169 c = cc - f->ww_w.l;
170 if (f->ww_fmap != 0) {
0896e17e 171 register char *fmap;
6e2a769e 172
2357b64e 173 fmap = &f->ww_fmap[r][c];
6e2a769e 174 oldcode = *fmap;
0896e17e
EW
175 *fmap |= code;
176 if (code & WWF_TOP)
177 *fmap &= ~WWF_LABEL;
6e2a769e
EW
178 code = *fmap;
179 } else
180 oldcode = 0;
181 {
6e2a769e
EW
182 {
183 register char *win = &f->ww_win[r][c];
184
185 if (*win == WWM_GLS)
186 f->ww_nvis[r]++;
187 *win &= ~WWM_GLS;
188 }
189 if (oldcode != code && (code & WWF_LABEL) == 0) {
190 register short frame;
191
192 frame = tt.tt_frame[code & WWF_MASK] & WWC_CMASK;
193 f->ww_buf[f->ww_scroll + r][c].c_w = frame;
194 if (wwsmap[rr][cc] == f->ww_index) {
195 wwtouched[rr] = 1;
196 wwns[rr][cc].c_w = frame;
197 }
861cd1ed 198 }
0896e17e
EW
199 }
200}