added "more" command
[unix-history] / usr / src / usr.bin / window / cmd5.c
index 2b87d28..23fb50e 100644 (file)
@@ -1,23 +1,99 @@
 #ifndef lint
 #ifndef lint
-static char *sccsid = "@(#)cmd5.c      3.1 83/08/11";
+static char sccsid[] = "@(#)cmd5.c     3.14 %G%";
 #endif
 
 #endif
 
+/*
+ * Copyright (c) 1983 Regents of the University of California,
+ * All rights reserved.  Redistribution permitted subject to
+ * the terms of the Berkeley Software License Agreement.
+ */
+
 #include "defs.h"
 
 /*
 #include "defs.h"
 
 /*
-c_scroll(dir)
-int dir;
+ * Window movement.
+ */
+
+c_move(w)
+register struct ww *w;
 {
 {
-       register brow = selwin->ww_scroll;
-
-       brow += dir * selwin->ww_w.nrow / 2;
-       if (brow < 0)
-               brow = 0;
-       else if (brow + selwin->ww_w.nrow > selwin->ww_nline)
-               brow = selwin->ww_nline - selwin->ww_w.nrow;
-       if (brow != selwin->ww_scroll) {
-               selwin->ww_scroll = brow;
-               wwredrawwin(selwin);
+       int col, row;
+       int mincol, minrow;
+       int maxcol, maxrow;
+       int curcol, currow;
+
+       if (!terse)
+               wwputs("New window position: ", cmdwin);
+       col = w->ww_w.l;
+       row = w->ww_w.t;
+       wwadd(boxwin, framewin->ww_back);
+       for (;;) {
+               wwbox(boxwin, row - 1, col - 1, w->ww_w.nr + 2, w->ww_w.nc + 2);
+               getminmax(row, w->ww_w.nr, 1, wwnrow,
+                       &currow, &minrow, &maxrow);
+               getminmax(col, w->ww_w.nc, 0, wwncol,
+                       &curcol, &mincol, &maxcol);
+               wwsetcursor(currow, curcol);
+               while (wwpeekc() < 0)
+                       wwiomux();
+               switch (getpos(&row, &col, minrow, mincol, maxrow, maxcol)) {
+               case 3:
+                       wwunbox(boxwin);
+                       wwdelete(boxwin);
+                       return;
+               case 2:
+                       wwunbox(boxwin);
+                       break;
+               case 1:
+                       wwunbox(boxwin);
+               case 0:
+                       continue;
+               }
+               break;
        }
        }
+       wwdelete(boxwin);
+       if (!terse)
+               wwputc('\n', cmdwin);
+       wwcurtowin(cmdwin);
+       movewin(w, row, col);
+}
+
+movewin(w, row, col)
+register struct ww *w;
+{
+       struct ww *back = w->ww_back;
+
+       w->ww_alt.t = w->ww_w.t;
+       w->ww_alt.l = w->ww_w.l;
+       wwdelete(w);
+       wwmove(w, row, col);
+       wwadd(w, back);
+       reframe();
+}
+
+/*
+ * Weird stufff, don't ask.
+ */
+getminmax(x, n, a, b, curx, minx, maxx)
+register x, n, a, b;
+int *curx, *minx, *maxx;
+{
+       if (x < 0)
+               *curx = x + n - 1;
+       else
+               *curx = x;
+
+       if (x <= a)
+               *minx = 1 - n;
+       else if (x <= b - n)
+               *minx = a;
+       else
+               *minx = b - n;
+
+       if (x >= b - n)
+               *maxx = b - 1;
+       else if (x >= a)
+               *maxx = b - n;
+       else
+               *maxx = a;
 }
 }
-*/