checkpoint of hacking for mail.cs.berkeley.edu
[unix-history] / usr / src / usr.bin / window / wwframe.c
CommitLineData
60de5df9 1/*
46e9ea25
KB
2 * Copyright (c) 1983 Regents of the University of California.
3 * All rights reserved.
4 *
3dd3a9e5
KB
5 * This code is derived from software contributed to Berkeley by
6 * Edward Wang at The University of California, Berkeley.
7 *
87f529ec 8 * %sccs.include.redist.c%
60de5df9
EW
9 */
10
46e9ea25 11#ifndef lint
3dd3a9e5 12static char sccsid[] = "@(#)wwframe.c 3.20 (Berkeley) %G%";
46e9ea25
KB
13#endif /* not lint */
14
65478625 15#include "ww.h"
e908bfac 16#include "tt.h"
65478625 17
6e2a769e 18#define frameok(w, r, c) (w1 = wwindex[wwsmap[r][c]], \
4a4250bc 19 w1->ww_fmap || w1->ww_order > (w)->ww_order)
6e2a769e 20
85af59e4 21wwframe(w, wframe)
0896e17e
EW
22register struct ww *w;
23struct ww *wframe;
65478625 24{
0896e17e
EW
25 register r, c;
26 char a1, a2, a3;
27 char b1, b2, b3;
28 register char *smap;
29 register code;
6e2a769e 30 register struct ww *w1;
65478625 31
0896e17e
EW
32 if (w->ww_w.t > 0) {
33 r = w->ww_w.t - 1;
19f9784c 34 c = w->ww_i.l - 1;
0896e17e
EW
35 smap = &wwsmap[r + 1][c + 1];
36 a1 = 0;
37 a2 = 0;
38 b1 = 0;
6e2a769e 39 b2 = c < 0 || frameok(w, r, c);
65478625 40
19f9784c 41 for (; c < w->ww_i.r; c++) {
3531d4a4
EW
42 if (c + 1 >= wwncol) {
43 a3 = 1;
44 b3 = 1;
45 } else {
46 a3 = w->ww_index == *smap++;
47 b3 = frameok(w, r, c + 1);
48 }
0896e17e
EW
49 if (b2) {
50 code = 0;
51 if ((a1 || a2) && b1)
52 code |= WWF_L;
53 if ((a2 || a3) && b3)
54 code |= WWF_R;
55 if (code)
2357b64e 56 wwframec(wframe, r, c, code|WWF_TOP);
0896e17e
EW
57 }
58 a1 = a2;
59 a2 = a3;
60 b1 = b2;
61 b2 = b3;
62 }
63 if ((a1 || a2) && b1 && b2)
2357b64e 64 wwframec(wframe, r, c, WWF_L|WWF_TOP);
65478625
EW
65 }
66
0896e17e
EW
67 if (w->ww_w.b < wwnrow) {
68 r = w->ww_w.b;
19f9784c 69 c = w->ww_i.l - 1;
0896e17e
EW
70 smap = &wwsmap[r - 1][c + 1];
71 a1 = 0;
72 a2 = 0;
73 b1 = 0;
6e2a769e 74 b2 = c < 0 || frameok(w, r, c);
0896e17e 75
19f9784c 76 for (; c < w->ww_i.r; c++) {
3531d4a4
EW
77 if (c + 1 >= wwncol) {
78 a3 = 1;
79 b3 = 1;
80 } else {
81 a3 = w->ww_index == *smap++;
82 b3 = frameok(w, r, c + 1);
83 }
0896e17e
EW
84 if (b2) {
85 code = 0;
86 if ((a1 || a2) && b1)
87 code |= WWF_L;
88 if ((a2 || a3) && b3)
89 code |= WWF_R;
90 if (code)
2357b64e 91 wwframec(wframe, r, c, code);
0896e17e
EW
92 }
93 a1 = a2;
94 a2 = a3;
95 b1 = b2;
96 b2 = b3;
97 }
98 if ((a1 || a2) && b1 && b2)
2357b64e 99 wwframec(wframe, r, c, WWF_L);
65478625 100 }
65478625 101
0896e17e 102 if (w->ww_w.l > 0) {
19f9784c 103 r = w->ww_i.t - 1;
0896e17e
EW
104 c = w->ww_w.l - 1;
105 a1 = 0;
106 a2 = 0;
107 b1 = 0;
6e2a769e 108 b2 = r < 0 || frameok(w, r, c);
85af59e4 109
19f9784c 110 for (; r < w->ww_i.b; r++) {
3531d4a4
EW
111 if (r + 1 >= wwnrow) {
112 a3 = 1;
113 b3 = 1;
114 } else {
115 a3 = w->ww_index == wwsmap[r + 1][c + 1];
116 b3 = frameok(w, r + 1, c);
117 }
0896e17e
EW
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)
2357b64e 125 wwframec(wframe, r, c, code);
0896e17e
EW
126 }
127 a1 = a2;
128 a2 = a3;
129 b1 = b2;
130 b2 = b3;
131 }
132 if ((a1 || a2) && b1 && b2)
2357b64e 133 wwframec(wframe, r, c, WWF_U);
85af59e4 134 }
0896e17e
EW
135
136 if (w->ww_w.r < wwncol) {
19f9784c 137 r = w->ww_i.t - 1;
0896e17e
EW
138 c = w->ww_w.r;
139 a1 = 0;
140 a2 = 0;
141 b1 = 0;
6e2a769e 142 b2 = r < 0 || frameok(w, r, c);
0896e17e 143
19f9784c 144 for (; r < w->ww_i.b; r++) {
3531d4a4
EW
145 if (r + 1 >= wwnrow) {
146 a3 = 1;
147 b3 = 1;
148 } else {
149 a3 = w->ww_index == wwsmap[r + 1][c - 1];
150 b3 = frameok(w, r + 1, c);
151 }
0896e17e
EW
152 if (b2) {
153 code = 0;
154 if ((a1 || a2) && b1)
155 code |= WWF_U;
156 if ((a2 || a3) && b3)
157 code |= WWF_D;
158 if (code)
2357b64e 159 wwframec(wframe, r, c, code);
0896e17e
EW
160 }
161 a1 = a2;
162 a2 = a3;
163 b1 = b2;
164 b2 = b3;
165 }
166 if ((a1 || a2) && b1 && b2)
2357b64e 167 wwframec(wframe, r, c, WWF_U);
65478625 168 }
65478625
EW
169}
170
f2a77fe1 171wwframec(f, r, c, code)
85af59e4 172register struct ww *f;
f2a77fe1 173register r, c;
6e2a769e 174char code;
85af59e4 175{
6e2a769e 176 char oldcode;
84ad208b 177 register char *smap;
85af59e4 178
f2a77fe1 179 if (r < f->ww_i.t || r >= f->ww_i.b || c < f->ww_i.l || c >= f->ww_i.r)
85af59e4 180 return;
84ad208b
EW
181
182 smap = &wwsmap[r][c];
183
0896e17e
EW
184 {
185 register struct ww *w;
6e2a769e 186
84ad208b 187 w = wwindex[*smap];
0896e17e 188 if (w->ww_order > f->ww_order) {
84ad208b
EW
189 if (w != &wwnobody && w->ww_win[r][c] == 0)
190 w->ww_nvis[r]--;
191 *smap = f->ww_index;
c417b691 192 }
85af59e4 193 }
2357b64e 194
2357b64e 195 if (f->ww_fmap != 0) {
0896e17e 196 register char *fmap;
6e2a769e 197
2357b64e 198 fmap = &f->ww_fmap[r][c];
6e2a769e 199 oldcode = *fmap;
0896e17e
EW
200 *fmap |= code;
201 if (code & WWF_TOP)
202 *fmap &= ~WWF_LABEL;
6e2a769e
EW
203 code = *fmap;
204 } else
205 oldcode = 0;
206 {
f2a77fe1 207 register char *win = &f->ww_win[r][c];
6e2a769e 208
84ad208b 209 if (*win == WWM_GLS && *smap == f->ww_index)
f2a77fe1
EW
210 f->ww_nvis[r]++;
211 *win &= ~WWM_GLS;
212 }
213 if (oldcode != code && (code & WWF_LABEL) == 0) {
214 register short frame;
215
a830e8bb 216 frame = tt.tt_frame[code & WWF_MASK];
f2a77fe1
EW
217 f->ww_buf[r][c].c_w = frame;
218 if (wwsmap[r][c] == f->ww_index) {
04d70db4 219 wwtouched[r] |= WWU_TOUCHED;
f2a77fe1 220 wwns[r][c].c_w = frame;
861cd1ed 221 }
0896e17e
EW
222 }
223}