113983Sedward #ifndef lint 2*14415Sedward static char *sccsid = "@(#)wwframe.c 2.1.1.1 83/08/09"; 313983Sedward #endif 413983Sedward 513983Sedward #include "ww.h" 613983Sedward 7*14415Sedward char **wwfmap; 8*14415Sedward #define U 1 9*14415Sedward #define R 2 10*14415Sedward #define D 4 11*14415Sedward #define L 8 1214077Sedward 13*14415Sedward wwframe(w, wframe) 14*14415Sedward register struct ww *w, *wframe; 1513983Sedward { 1613983Sedward register i; 1714077Sedward char noleft, noright, notop, nobot; 1813983Sedward 19*14415Sedward if (wwfmap == 0 20*14415Sedward && (wwfmap = wwalloc(wwnrow, wwncol, sizeof (char))) == 0) 21*14415Sedward return -1; 22*14415Sedward noleft = w->ww_w.l == 0; 23*14415Sedward noright = w->ww_w.r >= wwncol; 24*14415Sedward notop = w->ww_w.t == 0; 25*14415Sedward nobot = w->ww_w.b >= wwnrow; 2613983Sedward 2713983Sedward if (!notop) { 28*14415Sedward for (i = w->ww_w.l; i < w->ww_w.r; i++) 29*14415Sedward wwframex(w, w->ww_w.t, i, wframe); 3013983Sedward } 3113983Sedward 3213983Sedward if (!nobot) { 33*14415Sedward for (i = w->ww_w.l; i < w->ww_w.r; i++) 34*14415Sedward wwframex(w, w->ww_w.b - 1, i, wframe); 3513983Sedward } 3613983Sedward 3713983Sedward if (!noleft) { 38*14415Sedward for (i = w->ww_w.t; i < w->ww_w.b; i++) 39*14415Sedward wwframex(w, i, w->ww_w.l, wframe); 4013983Sedward } 4113983Sedward 4213983Sedward if (!noright) { 43*14415Sedward for (i = w->ww_w.t; i < w->ww_w.b; i++) 44*14415Sedward wwframex(w, i, w->ww_w.r - 1, wframe); 4513983Sedward } 46*14415Sedward } 4713983Sedward 48*14415Sedward wwframex(w, r, c, wframe) 49*14415Sedward register struct ww *w, *wframe; 50*14415Sedward register r, c; 51*14415Sedward { 52*14415Sedward char ul, top, ur, right, lr, bottom, ll, left; 53*14415Sedward 54*14415Sedward if (w->ww_index != wwsmap[r][c]) 55*14415Sedward return; 56*14415Sedward ul = wwframeok(w, r - 1, c - 1); 57*14415Sedward top = wwframeok(w, r - 1, c); 58*14415Sedward ur = wwframeok(w, r - 1, c + 1); 59*14415Sedward right = wwframeok(w, r, c + 1); 60*14415Sedward lr = wwframeok(w, r + 1, c + 1); 61*14415Sedward bottom = wwframeok(w, r + 1, c); 62*14415Sedward ll = wwframeok(w, r + 1, c - 1); 63*14415Sedward left = wwframeok(w, r, c - 1); 64*14415Sedward if (top && ul) { 65*14415Sedward wwframec(r - 1, c - 1, wframe, R); 66*14415Sedward wwframec(r - 1, c, wframe, L); 67*14415Sedward } 68*14415Sedward if (top && ur) { 69*14415Sedward wwframec(r - 1, c, wframe, R); 70*14415Sedward wwframec(r - 1, c + 1, wframe, L); 71*14415Sedward } 72*14415Sedward if (right && ur) { 73*14415Sedward wwframec(r - 1, c + 1, wframe, D); 74*14415Sedward wwframec(r, c + 1, wframe, U); 75*14415Sedward } 76*14415Sedward if (right && lr) { 77*14415Sedward wwframec(r, c + 1, wframe, D); 78*14415Sedward wwframec(r + 1, c + 1, wframe, U); 79*14415Sedward } 80*14415Sedward if (bottom && lr) { 81*14415Sedward wwframec(r + 1, c + 1, wframe, L); 82*14415Sedward wwframec(r + 1, c, wframe, R); 83*14415Sedward } 84*14415Sedward if (bottom && ll) { 85*14415Sedward wwframec(r + 1, c, wframe, L); 86*14415Sedward wwframec(r + 1, c - 1, wframe, R); 87*14415Sedward } 88*14415Sedward if (left && ll) { 89*14415Sedward wwframec(r + 1, c - 1, wframe, U); 90*14415Sedward wwframec(r, c - 1, wframe, D); 91*14415Sedward } 92*14415Sedward if (left && ul) { 93*14415Sedward wwframec(r, c - 1, wframe, U); 94*14415Sedward wwframec(r - 1, c - 1, wframe, D); 95*14415Sedward } 9613983Sedward } 9713983Sedward 98*14415Sedward wwframeok(w, r, c) 9913983Sedward register struct ww *w; 10013983Sedward { 101*14415Sedward register struct ww *w1; 10213983Sedward 103*14415Sedward if (r < 0 || r >= wwnrow || c < 0 || c >= wwncol) 10414077Sedward return 1; 105*14415Sedward w1 = wwindex[wwsmap[r][c]]; 106*14415Sedward if (w1->ww_hasframe && w1->ww_order <= w->ww_order) 107*14415Sedward return 0; 108*14415Sedward return 1; 10913983Sedward } 11013983Sedward 111*14415Sedward wwframec(rr, cc, f, code) 112*14415Sedward register struct ww *f; 113*14415Sedward register rr, cc; 11413983Sedward { 115*14415Sedward register struct ww *w2; 116*14415Sedward register r, c; 11713983Sedward 118*14415Sedward if (rr < 0 || rr >= wwnrow || cc < 0 || cc >= wwncol) 119*14415Sedward return; 120*14415Sedward w2 = wwindex[wwsmap[rr][cc]]; 121*14415Sedward if (w2->ww_order > f->ww_order) { 122*14415Sedward if (w2 != &wwnobody) { 123*14415Sedward r = rr - w2->ww_w.t; 124*14415Sedward c = cc - w2->ww_w.l; 125*14415Sedward if ((w2->ww_win[r][c] |= WWM_COV) == WWM_COV) 126*14415Sedward w2->ww_nvis[r]--; 127*14415Sedward w2->ww_cov[r][c] = f->ww_index; 128*14415Sedward } 129*14415Sedward wwsmap[rr][cc] = f->ww_index; 13013983Sedward } 131*14415Sedward code = wwfmap[rr][cc] |= code; 132*14415Sedward r = rr - f->ww_w.t; 133*14415Sedward c = cc - f->ww_w.l; 134*14415Sedward if (f->ww_win[r][c] == WWM_GLS) 135*14415Sedward f->ww_nvis[r]++; 136*14415Sedward f->ww_win[r][c] &= ~WWM_GLS; 137*14415Sedward f->ww_buf[f->ww_scroll + r][c].c_w = tt.tt_frame[code] & WWC_CMASK; 138*14415Sedward if (wwsmap[rr][cc] == f->ww_index) 139*14415Sedward wwns[rr][cc].c_w = tt.tt_frame[code] & WWC_CMASK; 14013983Sedward } 141