date and time created 83/08/19 15:05:34 by edward
[unix-history] / usr / src / usr.bin / window / wwframe.c
CommitLineData
65478625 1#ifndef lint
6e2a769e 2static char *sccsid = "@(#)wwframe.c 3.6 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)
43c1dd56 41 wwframec(wframe, r, c, code|WWF_TOP, 1);
0896e17e
EW
42 }
43 a1 = a2;
44 a2 = a3;
45 b1 = b2;
46 b2 = b3;
47 }
48 if ((a1 || a2) && b1 && b2)
43c1dd56 49 wwframec(wframe, r, c, WWF_L|WWF_TOP, 1);
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)
43c1dd56 71 wwframec(wframe, r, c, code, 1);
0896e17e
EW
72 }
73 a1 = a2;
74 a2 = a3;
75 b1 = b2;
76 b2 = b3;
77 }
78 if ((a1 || a2) && b1 && b2)
43c1dd56 79 wwframec(wframe, r, c, WWF_L, 1);
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)
43c1dd56 100 wwframec(wframe, r, c, code, 1);
0896e17e
EW
101 }
102 a1 = a2;
103 a2 = a3;
104 b1 = b2;
105 b2 = b3;
106 }
107 if ((a1 || a2) && b1 && b2)
43c1dd56 108 wwframec(wframe, r, c, WWF_U, 1);
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)
43c1dd56 129 wwframec(wframe, r, c, code, 1);
0896e17e
EW
130 }
131 a1 = a2;
132 a2 = a3;
133 b1 = b2;
134 b2 = b3;
135 }
136 if ((a1 || a2) && b1 && b2)
43c1dd56 137 wwframec(wframe, r, c, WWF_U, 1);
65478625 138 }
65478625
EW
139}
140
43c1dd56 141wwframec(f, rr, cc, code, dofmap)
85af59e4
EW
142register struct ww *f;
143register rr, cc;
6e2a769e 144char code;
43c1dd56 145char dofmap;
85af59e4 146{
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
EW
154 register r, c;
155
0896e17e
EW
156 w = wwindex[wwsmap[rr][cc]];
157 if (w->ww_order > f->ww_order) {
158 if (w != &wwnobody) {
159 r = rr - w->ww_w.t;
160 c = cc - w->ww_w.l;
161 if ((w->ww_win[r][c] |= WWM_COV) == WWM_COV)
162 w->ww_nvis[r]--;
163 w->ww_cov[r][c] = f->ww_index;
164 }
165 wwsmap[rr][cc] = f->ww_index;
c417b691 166 }
85af59e4 167 }
43c1dd56 168 if (dofmap) {
0896e17e 169 register char *fmap;
6e2a769e 170
0896e17e 171 fmap = &wwfmap[rr][cc];
6e2a769e 172 oldcode = *fmap;
0896e17e
EW
173 *fmap |= code;
174 if (code & WWF_TOP)
175 *fmap &= ~WWF_LABEL;
6e2a769e
EW
176 code = *fmap;
177 } else
178 oldcode = 0;
179 {
180 register r, c;
181
182 r = rr - f->ww_w.t;
183 c = cc - f->ww_w.l;
184 {
185 register char *win = &f->ww_win[r][c];
186
187 if (*win == WWM_GLS)
188 f->ww_nvis[r]++;
189 *win &= ~WWM_GLS;
190 }
191 if (oldcode != code && (code & WWF_LABEL) == 0) {
192 register short frame;
193
194 frame = tt.tt_frame[code & WWF_MASK] & WWC_CMASK;
195 f->ww_buf[f->ww_scroll + r][c].c_w = frame;
196 if (wwsmap[rr][cc] == f->ww_index) {
197 wwtouched[rr] = 1;
198 wwns[rr][cc].c_w = frame;
199 }
861cd1ed 200 }
0896e17e
EW
201 }
202}