New cover scheme
[unix-history] / usr / src / usr.bin / window / wwframe.c
index 8dd6d63..5190cce 100644 (file)
 #ifndef lint
 #ifndef lint
-static char *sccsid = "@(#)wwframe.c   1.3 83/07/22";
+static char *sccsid = "@(#)wwframe.c   3.11 83/11/23";
 #endif
 
 #include "ww.h"
 #endif
 
 #include "ww.h"
+#include "tt.h"
 
 
-#define TOP    0
-#define BOTTOM 1
-#define LEFT   2
-#define RIGHT  3
+#define frameok(w, r, c) (w1 = wwindex[wwsmap[r][c]], \
+       !w1->ww_hasframe || w1->ww_order > (w)->ww_order)
 
 
-wwframe(w)
+wwframe(w, wframe)
 register struct ww *w;
 register struct ww *w;
+struct ww *wframe;
 {
 {
-       register i;
-       char noleft, noright, notop, nobot;
-       char ulc, top, urc, left, right, llc, bottom, lrc;
-       struct ww_dim oldsize;
-       Pos bstart;
-
-       oldsize = w->ww_w;
-       w->ww_w = w->ww_i = w->ww_o;
-
-       if (w->ww_o.col == 0)
-               noleft = 1;
-       else {
-               noleft = 0;
-               w->ww_i.ncol--;
-               w->ww_i.col++;
-       }
-       /*
-       if (w->ww_o.row == 0)
-               notop++;
-       else
-       */
-       {
-               notop = 0;
-               w->ww_i.nrow--;
-               w->ww_i.row++;
-       }
-       if (w->ww_o.col + w->ww_o.ncol == wwncol) {
-               noright = 1;
-       /*
-       } else if (wwcheckframe(LEFT, w->ww_o.col + w->ww_o.ncol - 1,
-                       w->ww_o.row, w->ww_o.row + w->ww_o.nrow - 1, wwhead)) {
-               noright = 1;
-               w->ww_w.ncol--;
-               w->ww_i.ncol--;
-       } else if (wwcheckframe(LEFT, w->ww_o.col + w->ww_o.ncol,
-                       w->ww_o.row, w->ww_o.row + w->ww_o.nrow - 1, wwhead)) {
-               XXXXX
-               w->ww_w.ncol--;
-       */
-       } else {
-               noright = 0;
-               w->ww_i.ncol--;
-       }
-       if (w->ww_o.row + w->ww_o.nrow == wwnrow) {
-               nobot = 1;
-       } else if (wwcheckframe(TOP, w->ww_o.row + w->ww_o.nrow - 1,
-                       w->ww_o.col, w->ww_o.col + w->ww_o.ncol - 1, wwhead)) {
-               nobot = 1;
-               w->ww_w.nrow--;
-               w->ww_i.nrow--;
-       /*
-       } else if (wwcheckframe(TOP, w->ww_o.row + w->ww_o.nrow,
-                       w->ww_o.col, w->ww_o.col + w->ww_o.ncol - 1, wwhead)) {
-               XXXXX
-               ww->ww_i.nrow--;
-       */
-       } else {
-               nobot = 0;
-               w->ww_i.nrow--;
-       }
-
-       if (oldsize.nrow != w->ww_w.nrow || oldsize.ncol != w->ww_w.ncol) {
-               bstart = w->ww_win->w_bstart;
-               if (Wsize(w->ww_win, w->ww_w.ncol, w->ww_w.nrow) != 0) {
-                       wwprintf(w, "wwframe: Wsize(%d, %d) failed.\r\n",
-                               w->ww_w.ncol, w->ww_w.nrow);
-                       return -1;
+       register r, c;
+       char a1, a2, a3;
+       char b1, b2, b3;
+       register char *smap;
+       register code;
+       register struct ww *w1;
+
+       if (w->ww_w.t > 0) {
+               r = w->ww_w.t - 1;
+               c = w->ww_i.l - 1;
+               smap = &wwsmap[r + 1][c + 1];
+               a1 = 0;
+               a2 = 0;
+               b1 = 0;
+               b2 = c < 0 || frameok(w, r, c);
+
+               for (; c < w->ww_i.r; c++) {
+                       if (c + 1 >= wwncol) {
+                               a3 = 1;
+                               b3 = 1;
+                       } else {
+                               a3 = w->ww_index == *smap++;
+                               b3 = frameok(w, r, c + 1);
+                       }
+                       if (b2) {
+                               code = 0;
+                               if ((a1 || a2) && b1)
+                                       code |= WWF_L;
+                               if ((a2 || a3) && b3)
+                                       code |= WWF_R;
+                               if (code)
+                                       wwframec(wframe, r, c, code|WWF_TOP);
+                       }
+                       a1 = a2;
+                       a2 = a3;
+                       b1 = b2;
+                       b2 = b3;
                }
                }
-               w->ww_win->w_bstart = bstart;
-       }
-       Wsetmargins(w->ww_win, noleft ? 0 : 1, notop ? 0 : 1,
-               w->ww_i.ncol, w->ww_i.nrow);
-       /* scroll to the old position */
-
-       Wgetframe(&ulc, &top, &urc, &left, &right, &llc, &bottom, &lrc);
-
-       if (!notop) {
-               Wauxcursor(w->ww_win, 0, 0);
-               if (noleft)
-                       Waputc(top, 0, w->ww_win);
-               else
-                       Waputc(ulc, 0, w->ww_win);
-               for (i = w->ww_o.ncol - 2; i > 0; i--)
-                       Waputc(top, 0, w->ww_win);
-               if (noright)
-                       Waputc(top, 0, w->ww_win);
-               else
-                       Waputc(urc, 0, w->ww_win);
+               if ((a1 || a2) && b1 && b2)
+                       wwframec(wframe, r, c, WWF_L|WWF_TOP);
        }
 
        }
 
-       if (!nobot) {
-               Wauxcursor(w->ww_win, w->ww_o.nrow - 1, 0);
-               if (noleft)
-                       Waputc(bottom, 0, w->ww_win);
-               else
-                       Waputc(llc, 0, w->ww_win);
-               for (i = w->ww_o.ncol - 2; i > 0; i--)
-                       Waputc(bottom, 0, w->ww_win);
-               if (noright)
-                       Waputc(bottom, 0, w->ww_win);
-               else
-                       Waputc(lrc, 0, w->ww_win);
+       if (w->ww_w.b < wwnrow) {
+               r = w->ww_w.b;
+               c = w->ww_i.l - 1;
+               smap = &wwsmap[r - 1][c + 1];
+               a1 = 0;
+               a2 = 0;
+               b1 = 0;
+               b2 = c < 0 || frameok(w, r, c);
+
+               for (; c < w->ww_i.r; c++) {
+                       if (c + 1 >= wwncol) {
+                               a3 = 1;
+                               b3 = 1;
+                       } else {
+                               a3 = w->ww_index == *smap++;
+                               b3 = frameok(w, r, c + 1);
+                       }
+                       if (b2) {
+                               code = 0;
+                               if ((a1 || a2) && b1)
+                                       code |= WWF_L;
+                               if ((a2 || a3) && b3)
+                                       code |= WWF_R;
+                               if (code)
+                                       wwframec(wframe, r, c, code);
+                       }
+                       a1 = a2;
+                       a2 = a3;
+                       b1 = b2;
+                       b2 = b3;
+               }
+               if ((a1 || a2) && b1 && b2)
+                       wwframec(wframe, r, c, WWF_L);
        }
 
        }
 
-       if (!noleft) {
-               Wauxcursor(w->ww_win, 0, 0);
-               if (notop)
-                       Waputc(left, 0, w->ww_win);
-               else
-                       Waputc(ulc, 0, w->ww_win);
-               for (i = 1; i < w->ww_o.nrow - 1; i++) {
-                       Wauxcursor(w->ww_win, i, 0);
-                       Waputc(left, 0, w->ww_win);
+       if (w->ww_w.l > 0) {
+               r = w->ww_i.t - 1;
+               c = w->ww_w.l - 1;
+               a1 = 0;
+               a2 = 0;
+               b1 = 0;
+               b2 = r < 0 || frameok(w, r, c);
+
+               for (; r < w->ww_i.b; r++) {
+                       if (r + 1 >= wwnrow) {
+                               a3 = 1;
+                               b3 = 1;
+                       } else {
+                               a3 = w->ww_index == wwsmap[r + 1][c + 1];
+                               b3 = frameok(w, r + 1, c);
+                       }
+                       if (b2) {
+                               code = 0;
+                               if ((a1 || a2) && b1)
+                                       code |= WWF_U;
+                               if ((a2 || a3) && b3)
+                                       code |= WWF_D;
+                               if (code)
+                                       wwframec(wframe, r, c, code);
+                       }
+                       a1 = a2;
+                       a2 = a3;
+                       b1 = b2;
+                       b2 = b3;
                }
                }
-               Wauxcursor(w->ww_win, w->ww_o.nrow - 1, 0);
-               if (nobot)
-                       Waputc(left, 0, w->ww_win);
-               else
-                       Waputc(llc, 0, w->ww_win);
+               if ((a1 || a2) && b1 && b2)
+                       wwframec(wframe, r, c, WWF_U);
        }
 
        }
 
-       if (!noright) {
-               Wauxcursor(w->ww_win, 0, w->ww_o.ncol - 1);
-               if (notop)
-                       Waputc(right, 0, w->ww_win);
-               else
-                       Waputc(urc, 0, w->ww_win);
-               for (i = 1; i < w->ww_o.nrow - 1; i++) {
-                       Wauxcursor(w->ww_win, i, w->ww_o.ncol - 1);
-                       Waputc(left, 0, w->ww_win);
+       if (w->ww_w.r < wwncol) {
+               r = w->ww_i.t - 1;
+               c = w->ww_w.r;
+               a1 = 0;
+               a2 = 0;
+               b1 = 0;
+               b2 = r < 0 || frameok(w, r, c);
+
+               for (; r < w->ww_i.b; r++) {
+                       if (r + 1 >= wwnrow) {
+                               a3 = 1;
+                               b3 = 1;
+                       } else {
+                               a3 = w->ww_index == wwsmap[r + 1][c - 1];
+                               b3 = frameok(w, r + 1, c);
+                       }
+                       if (b2) {
+                               code = 0;
+                               if ((a1 || a2) && b1)
+                                       code |= WWF_U;
+                               if ((a2 || a3) && b3)
+                                       code |= WWF_D;
+                               if (code)
+                                       wwframec(wframe, r, c, code);
+                       }
+                       a1 = a2;
+                       a2 = a3;
+                       b1 = b2;
+                       b2 = b3;
                }
                }
-               Wauxcursor(w->ww_win, w->ww_o.nrow - 1, w->ww_o.ncol - 1);
-               if (nobot)
-                       Waputc(right, 0, w->ww_win);
-               else
-                       Waputc(lrc, 0, w->ww_win);
+               if ((a1 || a2) && b1 && b2)
+                       wwframec(wframe, r, c, WWF_U);
        }
        }
-
-       return 0;
 }
 
 }
 
-wwcheckframe(flag, x, a, b, w)
-register struct ww *w;
+wwframec(f, r, c, code)
+register struct ww *f;
+register r, c;
+char code;
 {
 {
-       int xx, aa, bb;
-
-       if (a >= b)
-               return 1;
-       for (; w; w = w->ww_next) {
-               switch (flag) {
-               case TOP:
-                       xx = w->ww_o.row;
-                       aa = w->ww_o.col;
-                       bb = w->ww_o.col + w->ww_o.ncol - 1;
-                       break;
-               case BOTTOM:
-                       xx = w->ww_o.row + w->ww_o.nrow - 1;
-                       aa = w->ww_o.col;
-                       bb = w->ww_o.col + w->ww_o.ncol - 1;
-                       break;
-               case LEFT:
-                       xx = w->ww_o.col;
-                       aa = w->ww_o.row;
-                       bb = w->ww_o.row + w->ww_o.nrow - 1;
-                       break;
-               case RIGHT:
-                       xx = w->ww_o.col + w->ww_o.ncol - 1;
-                       aa = w->ww_o.row;
-                       bb = w->ww_o.row + w->ww_o.nrow - 1;
-                       break;
+       char oldcode;
+       register char *smap;
+
+       if (r < f->ww_i.t || r >= f->ww_i.b || c < f->ww_i.l || c >= f->ww_i.r)
+               return;
+
+       smap = &wwsmap[r][c];
+
+       {
+               register struct ww *w;
+
+               w = wwindex[*smap];
+               if (w->ww_order > f->ww_order) {
+                       if (w != &wwnobody && w->ww_win[r][c] == 0)
+                               w->ww_nvis[r]--;
+                       *smap = f->ww_index;
                }
                }
-               if (xx != x || aa > b || bb < a)
-                       continue;
-               return wwcheckframe(flag, x, a, aa, w->ww_next)
-                       && wwcheckframe(flag, x, bb, b, w->ww_next);
        }
        }
-       return 0;
-}
 
 
-wwunframe(w)
-register struct ww *w;
-{
-       char hasbot, hastop, hasright, hasleft;
-       register i;
-
-       hastop = w->ww_o.row < w->ww_i.row;
-       hasbot = w->ww_o.row + w->ww_o.nrow > w->ww_i.row + w->ww_i.nrow;
-       hasleft = w->ww_o.col < w->ww_i.col;
-       hasright = w->ww_o.col + w->ww_o.ncol > w->ww_i.col + w->ww_i.ncol;
-
-       if (hastop) {
-               Wauxcursor(w->ww_win, 0, 0);
-               for (i = 0; i < w->ww_o.ncol; i++)
-                       Waputc(' ', WBUF, w->ww_win);
-       }
-       if (hasbot) {
-               Wauxcursor(w->ww_win, w->ww_o.nrow - 1, 0);
-               for (i = 0; i < w->ww_o.ncol; i++)
-                       Waputc(' ', WBUF, w->ww_win);
+       if (f->ww_fmap != 0) {
+               register char *fmap;
+
+               fmap = &f->ww_fmap[r][c];
+               oldcode = *fmap;
+               *fmap |= code;
+               if (code & WWF_TOP)
+                       *fmap &= ~WWF_LABEL;
+               code = *fmap;
+       } else
+               oldcode = 0;
+       {
+               register char *win = &f->ww_win[r][c];
+
+               if (*win == WWM_GLS && *smap == f->ww_index)
+                       f->ww_nvis[r]++;
+               *win &= ~WWM_GLS;
        }
        }
-       if (hasleft)
-               for (i = 0; i < w->ww_o.nrow; i++) {
-                       Wauxcursor(w->ww_win, i, 0);
-                       Waputc(' ', WBUF, w->ww_win);
+       if (oldcode != code && (code & WWF_LABEL) == 0) {
+               register short frame;
+
+               frame = tt.tt_frame[code & WWF_MASK] & WWC_CMASK;
+               f->ww_buf[r][c].c_w = frame;
+               if (wwsmap[r][c] == f->ww_index) {
+                       wwtouched[r] = 1;
+                       wwns[r][c].c_w = frame;
                }
                }
-       if (hasright)
-               for (i = 0; i < w->ww_o.nrow; i++) {
-                       Wauxcursor(w->ww_win, i, w->ww_o.ncol - 1);
-                       Waputc(' ', WBUF, w->ww_win);
-               }
-       w->ww_i.row = w->ww_o.row;
-       w->ww_i.nrow = w->ww_o.nrow;
-       w->ww_i.col = w->ww_o.col;
-       w->ww_i.ncol = w->ww_o.ncol;
-       Wsetmargins(w->ww_win, 0, 0, w->ww_o.ncol, w->ww_o.nrow);
+       }
 }
 }