Now uses screen address for all buffers.
[unix-history] / usr / src / usr.bin / window / wwmove.c
index 3a961b7..17fdc1c 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.2 83/09/15";
 #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,23 @@ 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;
+       w->ww_cov -= dr;
+       for (i = w->ww_w.t; i < w->ww_w.b; i++)
+               w->ww_cov[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;
+       w->ww_buf -= dr;
+       for (i = w->ww_b.t; i < w->ww_b.b; i++)
+               w->ww_buf[i] -= dc;
 }
 }