BSD 4_3_Tahoe release
[unix-history] / usr / src / ucb / window / wwframe.c
CommitLineData
60de5df9 1/*
46e9ea25
KB
2 * Copyright (c) 1983 Regents of the University of California.
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms are permitted
5e8b0e60
KB
6 * provided that the above copyright notice and this paragraph are
7 * duplicated in all such forms and that any documentation,
8 * advertising materials, and other materials related to such
9 * distribution and use acknowledge that the software was developed
10 * by the University of California, Berkeley. The name of the
11 * University may not be used to endorse or promote products derived
12 * from this software without specific prior written permission.
13 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
14 * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
15 * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
60de5df9
EW
16 */
17
46e9ea25 18#ifndef lint
ca67e7b4 19static char sccsid[] = "@(#)wwframe.c 3.18 (Berkeley) 6/29/88";
46e9ea25
KB
20#endif /* not lint */
21
65478625 22#include "ww.h"
e908bfac 23#include "tt.h"
65478625 24
6e2a769e 25#define frameok(w, r, c) (w1 = wwindex[wwsmap[r][c]], \
4a4250bc 26 w1->ww_fmap || w1->ww_order > (w)->ww_order)
6e2a769e 27
85af59e4 28wwframe(w, wframe)
0896e17e
EW
29register struct ww *w;
30struct ww *wframe;
65478625 31{
0896e17e
EW
32 register r, c;
33 char a1, a2, a3;
34 char b1, b2, b3;
35 register char *smap;
36 register code;
6e2a769e 37 register struct ww *w1;
65478625 38
0896e17e
EW
39 if (w->ww_w.t > 0) {
40 r = w->ww_w.t - 1;
19f9784c 41 c = w->ww_i.l - 1;
0896e17e
EW
42 smap = &wwsmap[r + 1][c + 1];
43 a1 = 0;
44 a2 = 0;
45 b1 = 0;
6e2a769e 46 b2 = c < 0 || frameok(w, r, c);
65478625 47
19f9784c 48 for (; c < w->ww_i.r; c++) {
3531d4a4
EW
49 if (c + 1 >= wwncol) {
50 a3 = 1;
51 b3 = 1;
52 } else {
53 a3 = w->ww_index == *smap++;
54 b3 = frameok(w, r, c + 1);
55 }
0896e17e
EW
56 if (b2) {
57 code = 0;
58 if ((a1 || a2) && b1)
59 code |= WWF_L;
60 if ((a2 || a3) && b3)
61 code |= WWF_R;
62 if (code)
2357b64e 63 wwframec(wframe, r, c, code|WWF_TOP);
0896e17e
EW
64 }
65 a1 = a2;
66 a2 = a3;
67 b1 = b2;
68 b2 = b3;
69 }
70 if ((a1 || a2) && b1 && b2)
2357b64e 71 wwframec(wframe, r, c, WWF_L|WWF_TOP);
65478625
EW
72 }
73
0896e17e
EW
74 if (w->ww_w.b < wwnrow) {
75 r = w->ww_w.b;
19f9784c 76 c = w->ww_i.l - 1;
0896e17e
EW
77 smap = &wwsmap[r - 1][c + 1];
78 a1 = 0;
79 a2 = 0;
80 b1 = 0;
6e2a769e 81 b2 = c < 0 || frameok(w, r, c);
0896e17e 82
19f9784c 83 for (; c < w->ww_i.r; c++) {
3531d4a4
EW
84 if (c + 1 >= wwncol) {
85 a3 = 1;
86 b3 = 1;
87 } else {
88 a3 = w->ww_index == *smap++;
89 b3 = frameok(w, r, c + 1);
90 }
0896e17e
EW
91 if (b2) {
92 code = 0;
93 if ((a1 || a2) && b1)
94 code |= WWF_L;
95 if ((a2 || a3) && b3)
96 code |= WWF_R;
97 if (code)
2357b64e 98 wwframec(wframe, r, c, code);
0896e17e
EW
99 }
100 a1 = a2;
101 a2 = a3;
102 b1 = b2;
103 b2 = b3;
104 }
105 if ((a1 || a2) && b1 && b2)
2357b64e 106 wwframec(wframe, r, c, WWF_L);
65478625 107 }
65478625 108
0896e17e 109 if (w->ww_w.l > 0) {
19f9784c 110 r = w->ww_i.t - 1;
0896e17e
EW
111 c = w->ww_w.l - 1;
112 a1 = 0;
113 a2 = 0;
114 b1 = 0;
6e2a769e 115 b2 = r < 0 || frameok(w, r, c);
85af59e4 116
19f9784c 117 for (; r < w->ww_i.b; r++) {
3531d4a4
EW
118 if (r + 1 >= wwnrow) {
119 a3 = 1;
120 b3 = 1;
121 } else {
122 a3 = w->ww_index == wwsmap[r + 1][c + 1];
123 b3 = frameok(w, r + 1, c);
124 }
0896e17e
EW
125 if (b2) {
126 code = 0;
127 if ((a1 || a2) && b1)
128 code |= WWF_U;
129 if ((a2 || a3) && b3)
130 code |= WWF_D;
131 if (code)
2357b64e 132 wwframec(wframe, r, c, code);
0896e17e
EW
133 }
134 a1 = a2;
135 a2 = a3;
136 b1 = b2;
137 b2 = b3;
138 }
139 if ((a1 || a2) && b1 && b2)
2357b64e 140 wwframec(wframe, r, c, WWF_U);
85af59e4 141 }
0896e17e
EW
142
143 if (w->ww_w.r < wwncol) {
19f9784c 144 r = w->ww_i.t - 1;
0896e17e
EW
145 c = w->ww_w.r;
146 a1 = 0;
147 a2 = 0;
148 b1 = 0;
6e2a769e 149 b2 = r < 0 || frameok(w, r, c);
0896e17e 150
19f9784c 151 for (; r < w->ww_i.b; r++) {
3531d4a4
EW
152 if (r + 1 >= wwnrow) {
153 a3 = 1;
154 b3 = 1;
155 } else {
156 a3 = w->ww_index == wwsmap[r + 1][c - 1];
157 b3 = frameok(w, r + 1, c);
158 }
0896e17e
EW
159 if (b2) {
160 code = 0;
161 if ((a1 || a2) && b1)
162 code |= WWF_U;
163 if ((a2 || a3) && b3)
164 code |= WWF_D;
165 if (code)
2357b64e 166 wwframec(wframe, r, c, code);
0896e17e
EW
167 }
168 a1 = a2;
169 a2 = a3;
170 b1 = b2;
171 b2 = b3;
172 }
173 if ((a1 || a2) && b1 && b2)
2357b64e 174 wwframec(wframe, r, c, WWF_U);
65478625 175 }
65478625
EW
176}
177
f2a77fe1 178wwframec(f, r, c, code)
85af59e4 179register struct ww *f;
f2a77fe1 180register r, c;
6e2a769e 181char code;
85af59e4 182{
6e2a769e 183 char oldcode;
84ad208b 184 register char *smap;
85af59e4 185
f2a77fe1 186 if (r < f->ww_i.t || r >= f->ww_i.b || c < f->ww_i.l || c >= f->ww_i.r)
85af59e4 187 return;
84ad208b
EW
188
189 smap = &wwsmap[r][c];
190
0896e17e
EW
191 {
192 register struct ww *w;
6e2a769e 193
84ad208b 194 w = wwindex[*smap];
0896e17e 195 if (w->ww_order > f->ww_order) {
84ad208b
EW
196 if (w != &wwnobody && w->ww_win[r][c] == 0)
197 w->ww_nvis[r]--;
198 *smap = f->ww_index;
c417b691 199 }
85af59e4 200 }
2357b64e 201
2357b64e 202 if (f->ww_fmap != 0) {
0896e17e 203 register char *fmap;
6e2a769e 204
2357b64e 205 fmap = &f->ww_fmap[r][c];
6e2a769e 206 oldcode = *fmap;
0896e17e
EW
207 *fmap |= code;
208 if (code & WWF_TOP)
209 *fmap &= ~WWF_LABEL;
6e2a769e
EW
210 code = *fmap;
211 } else
212 oldcode = 0;
213 {
f2a77fe1 214 register char *win = &f->ww_win[r][c];
6e2a769e 215
84ad208b 216 if (*win == WWM_GLS && *smap == f->ww_index)
f2a77fe1
EW
217 f->ww_nvis[r]++;
218 *win &= ~WWM_GLS;
219 }
220 if (oldcode != code && (code & WWF_LABEL) == 0) {
221 register short frame;
222
a830e8bb 223 frame = tt.tt_frame[code & WWF_MASK];
f2a77fe1
EW
224 f->ww_buf[r][c].c_w = frame;
225 if (wwsmap[r][c] == f->ww_index) {
04d70db4 226 wwtouched[r] |= WWU_TOUCHED;
f2a77fe1 227 wwns[r][c].c_w = frame;
861cd1ed 228 }
0896e17e
EW
229 }
230}