added "more" command
[unix-history] / usr / src / usr.bin / window / cmd1.c
index 4417601..0962c4b 100644 (file)
 #ifndef lint
 #ifndef lint
-static char *sccsid = "@(#)cmd1.c      1.1 83/07/18";
+static char sccsid[] = "@(#)cmd1.c     3.29 %G%";
 #endif
 
 #endif
 
-#include "defs.h"
+/*
+ * Copyright (c) 1983 Regents of the University of California,
+ * All rights reserved.  Redistribution permitted subject to
+ * the terms of the Berkeley Software License Agreement.
+ */
 
 
-struct ww *getwin();
-struct ww *openwin();
-char *strtime();
+#include "defs.h"
+#include "char.h"
 
 
-dowindow()
+c_window()
 {
        int col, row, xcol, xrow;
 {
        int col, row, xcol, xrow;
-       register struct ww *w;
        int id;
        int id;
-       char ids[10];
 
 
-       for (id = 1; id < 10; id++)
-               ids[id] = 0;
-       for (w = wwhead; w; w = w->ww_next)
-               ids[w->ww_ident] = 1;
-       for (id = 1; id < 10 && ids[id]; id++)
-               ;
-       if (id == 10) {
-               wwputs("Too many windows.  ", cmdwin);
+       if ((id = findid()) < 0)
                return;
                return;
-       }
-       wwputs("Upper left corner: ", cmdwin);
+       if (!terse)
+               wwputs("New window (upper left corner): ", cmdwin);
        col = 0;
        row = 1;
        col = 0;
        row = 1;
+       wwadd(boxwin, framewin->ww_back);
        for (;;) {
        for (;;) {
+               wwbox(boxwin, row - 1, col - 1, 3, 3);
                wwsetcursor(row, col);
                wwsetcursor(row, col);
-               while (bpeekc() < 0) {
-                       wwflush();
-                       bread();
-               }
-               switch (getpos(&row, &col, 0, 0)) {
-               case -1:
-                       WBoxActive = 0;
-                       goto out;
-               case 1:
+               while (wwpeekc() < 0)
+                       wwiomux();
+               switch (getpos(&row, &col, row > 1, 0,
+                       wwnrow - 1, wwncol - 1)) {
+               case 3:
+                       wwunbox(boxwin);
+                       wwdelete(boxwin);
+                       return;
+               case 2:
+                       wwunbox(boxwin);
                        break;
                        break;
+               case 1:
+                       wwunbox(boxwin);
                case 0:
                        continue;
                }
                break;
        }
                case 0:
                        continue;
                }
                break;
        }
-       wwprintf(cmdwin, "%d %d.  Upper left corner: ", col, row);
-       xcol = col + 1;
-       xrow = row + 1;
+       if (!terse)
+               wwputs("\nNew window (lower right corner): ", cmdwin);
+       xcol = col;
+       xrow = row;
        for (;;) {
        for (;;) {
-               Wbox(col, row, xcol - col + 1, xrow - row + 1);
+               wwbox(boxwin, row - 1, col - 1,
+                       xrow - row + 3, xcol - col + 3);
                wwsetcursor(xrow, xcol);
                wwflush();
                wwsetcursor(xrow, xcol);
                wwflush();
-               while (bpeekc() < 0) {
-                       wwflush();
-                       bread();
-               }
-               switch (getpos(&xrow, &xcol, row + 1, col + 1)) {
-               case -1:
-                       WBoxActive = 0;
-                       goto out;
-               case 1:
+               while (wwpeekc() < 0)
+                       wwiomux();
+               switch (getpos(&xrow, &xcol, row, col, wwnrow - 1, wwncol - 1))
+               {
+               case 3:
+                       wwunbox(boxwin);
+                       wwdelete(boxwin);
+                       return;
+               case 2:
+                       wwunbox(boxwin);
                        break;
                        break;
+               case 1:
+                       wwunbox(boxwin);
                case 0:
                        continue;
                }
                break;
        }
                case 0:
                        continue;
                }
                break;
        }
-       WBoxActive = 0;
-       wwprintf(cmdwin, "%d %d.  ", xcol, xrow);
-       if ((w = wwopen(WW_PTY, id, xrow-row+1, xcol-col+1, row, col)) == 0) {
-               wwprintf(cmdwin, "Can't open window.  ");
-               return;
-       }
-       wwframe(w);
-       labelwin(w, 0);
-       /*
-       reframe();
-       */
-       wwsetcursor(WCurRow(w->ww_win), WCurCol(w->ww_win));
-       wwflush();
-       switch (wwfork(w)) {
-       case -1:
-               wwprintf(cmdwin, "Can't fork.  ");
-               wwclose(w);
-               return;
-       case 0:
-               execl("/bin/csh", "csh", 0);
-               perror("exec(csh)");
-               exit(1);
-       }
-       if (selwin == 0)
-               setselwin(w);
-       else
-               wwsetcurrent(cmdwin);
-out:
-       wwputs("\r\n", cmdwin);
+       wwdelete(boxwin);
+       if (!terse)
+               wwputc('\n', cmdwin);
+       wwcurtowin(cmdwin);
+       (void) openwin(id, row, col, xrow-row+1, xcol-col+1, nbufline,
+               (char *) 0, 1, 1, shellfile, shell);
 }
 
 }
 
-getpos(row, col, minrow, mincol)
-register int *row, *col, minrow, mincol;
+getpos(row, col, minrow, mincol, maxrow, maxcol)
+register int *row, *col;
+int minrow, mincol;
+int maxrow, maxcol;
 {
 {
-       static int scount = 0;
+       static int scount;
        int count;
        char c;
        int count;
        char c;
+       int oldrow = *row, oldcol = *col;
 
 
-       while ((c = bgetc()) >= 0) {
+       while ((c = wwgetc()) >= 0) {
                switch (c) {
                case '0': case '1': case '2': case '3': case '4':
                case '5': case '6': case '7': case '8': case '9':
                switch (c) {
                case '0': case '1': case '2': case '3': case '4':
                case '5': case '6': case '7': case '8': case '9':
@@ -123,18 +107,18 @@ register int *row, *col, minrow, mincol;
                        *col = mincol;
                        break;
                case 'l':
                        *col = mincol;
                        break;
                case 'l':
-                       if ((*col += count) >= WCols)
-                               *col = WCols - 1;
+                       if ((*col += count) > maxcol)
+                               *col = maxcol;
                        break;
                case 'L':
                        break;
                case 'L':
-                       *col = WCols - 1;
+                       *col = maxcol;
                        break;
                case 'j':
                        break;
                case 'j':
-                       if ((*row += count) >= WRows)
-                               *row = WRows - 1;
+                       if ((*row += count) > maxrow)
+                               *row = maxrow;
                        break;
                case 'J':
                        break;
                case 'J':
-                       *row = WRows - 1;
+                       *row = maxrow;
                        break;
                case 'k':
                        if ((*row -= count) < minrow)
                        break;
                case 'k':
                        if ((*row -= count) < minrow)
@@ -143,26 +127,17 @@ register int *row, *col, minrow, mincol;
                case 'K':
                        *row = minrow;
                        break;
                case 'K':
                        *row = minrow;
                        break;
-               case CTRL([):
-                       return -1;
+               case ctrl([):
+                       if (!terse)
+                               wwputs("\nCanceled.  ", cmdwin);
+                       return 3;
                case '\r':
                case '\r':
-                       return 1;
+                       return 2;
                default:
                default:
-                       Ding();
+                       if (!terse)
+                               wwputs("\nType [hjklHJKL] to move, return to enter position, escape to cancel.", cmdwin);
+                       wwbell();
                }
        }
                }
        }
-       return 0;
-}
-
-/*
-reframe()
-{
-       register struct ww *w;
-
-       for (w = wwhead; w; w = w->ww_next) {
-               wwunframe(w);
-               wwframe(w);
-               labelwin(w, selwin == w ? WINVERSE : 0);
-       }
+       return oldrow != *row || oldcol != *col;
 }
 }
-*/