1 /* 2 * Copyright (c) 1983, 1993 3 * The Regents of the University of California. All rights reserved. 4 * 5 * This code is derived from software contributed to Berkeley by 6 * Edward Wang at The University of California, Berkeley. 7 * 8 * Redistribution and use in source and binary forms, with or without 9 * modification, are permitted provided that the following conditions 10 * are met: 11 * 1. Redistributions of source code must retain the above copyright 12 * notice, this list of conditions and the following disclaimer. 13 * 2. Redistributions in binary form must reproduce the above copyright 14 * notice, this list of conditions and the following disclaimer in the 15 * documentation and/or other materials provided with the distribution. 16 * 3. All advertising materials mentioning features or use of this software 17 * must display the following acknowledgement: 18 * This product includes software developed by the University of 19 * California, Berkeley and its contributors. 20 * 4. Neither the name of the University nor the names of its contributors 21 * may be used to endorse or promote products derived from this software 22 * without specific prior written permission. 23 * 24 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 25 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 26 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 27 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 28 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 29 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 30 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 31 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 32 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 33 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 34 * SUCH DAMAGE. 35 * 36 * @(#)wwframe.c 8.1 (Berkeley) 6/6/93 37 * $FreeBSD: src/usr.bin/window/wwframe.c,v 1.1.1.1.14.1 2001/05/17 09:45:01 obrien Exp $ 38 * $DragonFly: src/usr.bin/window/wwframe.c,v 1.2 2003/06/17 04:29:34 dillon Exp $ 39 */ 40 41 #include "ww.h" 42 #include "tt.h" 43 44 #define frameok(w, r, c) (w1 = wwindex[wwsmap[r][c]], \ 45 w1->ww_fmap || w1->ww_order > (w)->ww_order) 46 47 wwframe(w, wframe) 48 register struct ww *w; 49 struct ww *wframe; 50 { 51 register r, c; 52 char a1, a2, a3; 53 char b1, b2, b3; 54 register char *smap; 55 register code; 56 register struct ww *w1; 57 58 if (w->ww_w.t > 0) { 59 r = w->ww_w.t - 1; 60 c = w->ww_i.l - 1; 61 smap = &wwsmap[r + 1][c + 1]; 62 a1 = 0; 63 a2 = 0; 64 b1 = 0; 65 b2 = c < 0 || frameok(w, r, c); 66 67 for (; c < w->ww_i.r; c++) { 68 if (c + 1 >= wwncol) { 69 a3 = 1; 70 b3 = 1; 71 } else { 72 a3 = w->ww_index == *smap++; 73 b3 = frameok(w, r, c + 1); 74 } 75 if (b2) { 76 code = 0; 77 if ((a1 || a2) && b1) 78 code |= WWF_L; 79 if ((a2 || a3) && b3) 80 code |= WWF_R; 81 if (code) 82 wwframec(wframe, r, c, code|WWF_TOP); 83 } 84 a1 = a2; 85 a2 = a3; 86 b1 = b2; 87 b2 = b3; 88 } 89 if ((a1 || a2) && b1 && b2) 90 wwframec(wframe, r, c, WWF_L|WWF_TOP); 91 } 92 93 if (w->ww_w.b < wwnrow) { 94 r = w->ww_w.b; 95 c = w->ww_i.l - 1; 96 smap = &wwsmap[r - 1][c + 1]; 97 a1 = 0; 98 a2 = 0; 99 b1 = 0; 100 b2 = c < 0 || frameok(w, r, c); 101 102 for (; c < w->ww_i.r; c++) { 103 if (c + 1 >= wwncol) { 104 a3 = 1; 105 b3 = 1; 106 } else { 107 a3 = w->ww_index == *smap++; 108 b3 = frameok(w, r, c + 1); 109 } 110 if (b2) { 111 code = 0; 112 if ((a1 || a2) && b1) 113 code |= WWF_L; 114 if ((a2 || a3) && b3) 115 code |= WWF_R; 116 if (code) 117 wwframec(wframe, r, c, code); 118 } 119 a1 = a2; 120 a2 = a3; 121 b1 = b2; 122 b2 = b3; 123 } 124 if ((a1 || a2) && b1 && b2) 125 wwframec(wframe, r, c, WWF_L); 126 } 127 128 if (w->ww_w.l > 0) { 129 r = w->ww_i.t - 1; 130 c = w->ww_w.l - 1; 131 a1 = 0; 132 a2 = 0; 133 b1 = 0; 134 b2 = r < 0 || frameok(w, r, c); 135 136 for (; r < w->ww_i.b; r++) { 137 if (r + 1 >= wwnrow) { 138 a3 = 1; 139 b3 = 1; 140 } else { 141 a3 = w->ww_index == wwsmap[r + 1][c + 1]; 142 b3 = frameok(w, r + 1, c); 143 } 144 if (b2) { 145 code = 0; 146 if ((a1 || a2) && b1) 147 code |= WWF_U; 148 if ((a2 || a3) && b3) 149 code |= WWF_D; 150 if (code) 151 wwframec(wframe, r, c, code); 152 } 153 a1 = a2; 154 a2 = a3; 155 b1 = b2; 156 b2 = b3; 157 } 158 if ((a1 || a2) && b1 && b2) 159 wwframec(wframe, r, c, WWF_U); 160 } 161 162 if (w->ww_w.r < wwncol) { 163 r = w->ww_i.t - 1; 164 c = w->ww_w.r; 165 a1 = 0; 166 a2 = 0; 167 b1 = 0; 168 b2 = r < 0 || frameok(w, r, c); 169 170 for (; r < w->ww_i.b; r++) { 171 if (r + 1 >= wwnrow) { 172 a3 = 1; 173 b3 = 1; 174 } else { 175 a3 = w->ww_index == wwsmap[r + 1][c - 1]; 176 b3 = frameok(w, r + 1, c); 177 } 178 if (b2) { 179 code = 0; 180 if ((a1 || a2) && b1) 181 code |= WWF_U; 182 if ((a2 || a3) && b3) 183 code |= WWF_D; 184 if (code) 185 wwframec(wframe, r, c, code); 186 } 187 a1 = a2; 188 a2 = a3; 189 b1 = b2; 190 b2 = b3; 191 } 192 if ((a1 || a2) && b1 && b2) 193 wwframec(wframe, r, c, WWF_U); 194 } 195 } 196 197 wwframec(f, r, c, code) 198 register struct ww *f; 199 register r, c; 200 char code; 201 { 202 char oldcode; 203 register char *smap; 204 205 if (r < f->ww_i.t || r >= f->ww_i.b || c < f->ww_i.l || c >= f->ww_i.r) 206 return; 207 208 smap = &wwsmap[r][c]; 209 210 { 211 register struct ww *w; 212 213 w = wwindex[*smap]; 214 if (w->ww_order > f->ww_order) { 215 if (w != &wwnobody && w->ww_win[r][c] == 0) 216 w->ww_nvis[r]--; 217 *smap = f->ww_index; 218 } 219 } 220 221 if (f->ww_fmap != 0) { 222 register char *fmap; 223 224 fmap = &f->ww_fmap[r][c]; 225 oldcode = *fmap; 226 *fmap |= code; 227 if (code & WWF_TOP) 228 *fmap &= ~WWF_LABEL; 229 code = *fmap; 230 } else 231 oldcode = 0; 232 { 233 register char *win = &f->ww_win[r][c]; 234 235 if (*win == WWM_GLS && *smap == f->ww_index) 236 f->ww_nvis[r]++; 237 *win &= ~WWM_GLS; 238 } 239 if (oldcode != code && (code & WWF_LABEL) == 0) { 240 register short frame; 241 242 frame = tt.tt_frame[code & WWF_MASK]; 243 f->ww_buf[r][c].c_w = frame; 244 if (wwsmap[r][c] == f->ww_index) { 245 wwtouched[r] |= WWU_TOUCHED; 246 wwns[r][c].c_w = frame; 247 } 248 } 249 } 250