scrolling has come
[unix-history] / usr / src / usr.bin / window / wwframe.c
CommitLineData
65478625 1#ifndef lint
861cd1ed 2static 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 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)
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 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
85af59e4
EW
149wwframec(rr, cc, f, code)
150register struct ww *f;
151register rr, cc;
0896e17e 152int 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/*
198wwckns()
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*/