changing window size, new struct ww
[unix-history] / usr / src / usr.bin / window / wwmove.c
index 3a961b7..463f3a7 100644 (file)
@@ -1,5 +1,5 @@
 #ifndef lint
 #ifndef lint
-static char *sccsid = "@(#)wwmove.c    3.1 83/09/14";
+static char sccsid[] = "@(#)wwmove.c   3.5 %G%";
 #endif
 
 #include "ww.h"
 #endif
 
 #include "ww.h"
@@ -10,13 +10,24 @@ static      char *sccsid = "@(#)wwmove.c    3.1 83/09/14";
 wwmove(w, row, col)
 register struct ww *w;
 {
 wwmove(w, row, col)
 register struct ww *w;
 {
+       register dr, dc;
+       register i;
+
        if (w->ww_forw != 0 || w->ww_back != 0)
                return;                         /* sanity */
 
        if (w->ww_forw != 0 || w->ww_back != 0)
                return;                         /* sanity */
 
-       w->ww_w.t = row;
-       w->ww_w.b = w->ww_w.t + w->ww_w.nr;
-       w->ww_w.l = col;
-       w->ww_w.r = w->ww_w.l + w->ww_w.nc;
+       dr = row - w->ww_w.t;
+       dc = col - w->ww_w.l;
+
+       w->ww_w.t += dr;
+       w->ww_w.b += dr;
+       w->ww_w.l += dc;
+       w->ww_w.r += dc;
+
+       w->ww_b.t += dr;
+       w->ww_b.b += dr;
+       w->ww_b.l += dc;
+       w->ww_b.r += dc;
 
        w->ww_i.t = MAX(w->ww_w.t, 0);
        w->ww_i.b = MIN(w->ww_w.b, wwnrow);
 
        w->ww_i.t = MAX(w->ww_w.t, 0);
        w->ww_i.b = MIN(w->ww_w.b, wwnrow);
@@ -24,4 +35,31 @@ register struct ww *w;
        w->ww_i.l = MAX(w->ww_w.l, 0);
        w->ww_i.r = MIN(w->ww_w.r, wwncol);
        w->ww_i.nc = w->ww_i.r - w->ww_i.l;
        w->ww_i.l = MAX(w->ww_w.l, 0);
        w->ww_i.r = MIN(w->ww_w.r, wwncol);
        w->ww_i.nc = w->ww_i.r - w->ww_i.l;
+
+       w->ww_cur.r += dr;
+       w->ww_cur.c += dc;
+
+       w->ww_win -= dr;
+       for (i = w->ww_w.t; i < w->ww_w.b; i++)
+               w->ww_win[i] -= dc;
+       if (w->ww_fmap != 0) {
+               w->ww_fmap -= dr;
+               for (i = w->ww_w.t; i < w->ww_w.b; i++)
+                       w->ww_fmap[i] -= dc;
+       }
+       w->ww_nvis -= dr;
+       for (i = w->ww_i.t; i < w->ww_i.b; i++) {
+               register j = w->ww_i.l;
+               register char *win = &w->ww_win[i][j];
+               register char *smap = &wwsmap[i][j];
+               int nvis = 0;
+
+               for (; j < w->ww_i.r; j++, win++, smap++)
+                       if (*win == 0 && *smap == w->ww_index)
+                               nvis++;
+               w->ww_nvis[i] = nvis;
+       }
+       w->ww_buf -= dr;
+       for (i = w->ww_b.t; i < w->ww_b.b; i++)
+               w->ww_buf[i] -= dc;
 }
 }