use \n at bottom to scroll entire screen,
[unix-history] / usr / src / usr.bin / window / cmd1.c
index 71d54f1..0962c4b 100644 (file)
 #ifndef lint
 #ifndef lint
-static char *sccsid = "@(#)cmd1.c      1.7 83/07/29";
+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 *doopen();
+#include "defs.h"
+#include "char.h"
 
 
-dowindow()
+c_window()
 {
        int col, row, xcol, xrow;
        int id;
 
 {
        int col, row, xcol, xrow;
        int id;
 
-       if ((id = findid()) < 0) {
-               if (terse)
-                       Ding();
-               else
-                       wwputs("Too many windows.  ", cmdwin);
+       if ((id = findid()) < 0)
                return;
                return;
-       }
        if (!terse)
        if (!terse)
-               wwputs("Upper left corner: ", cmdwin);
+               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)
-                       bread();
-               switch (getpos(&row, &col, 0, 0)) {
-               case -1:
-                       WBoxActive = 0;
-                       if (!terse)
-                               wwputs("\r\nCancelled.  ", cmdwin);
+               while (wwpeekc() < 0)
+                       wwiomux();
+               switch (getpos(&row, &col, row > 1, 0,
+                       wwnrow - 1, wwncol - 1)) {
+               case 3:
+                       wwunbox(boxwin);
+                       wwdelete(boxwin);
                        return;
                        return;
-               case 1:
+               case 2:
+                       wwunbox(boxwin);
                        break;
                        break;
+               case 1:
+                       wwunbox(boxwin);
                case 0:
                        continue;
                }
                break;
        }
        if (!terse)
                case 0:
                        continue;
                }
                break;
        }
        if (!terse)
-               wwputs("\r\nLower right corner: ", cmdwin);
-       xcol = col + 1;
-       xrow = row + 1;
+               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)
-                       bread();
-               switch (getpos(&xrow, &xcol, row + 1, col + 1)) {
-               case -1:
-                       WBoxActive = 0;
-                       if (!terse)
-                               wwputs("\r\nCancelled.  ", cmdwin);
+               while (wwpeekc() < 0)
+                       wwiomux();
+               switch (getpos(&xrow, &xcol, row, col, wwnrow - 1, wwncol - 1))
+               {
+               case 3:
+                       wwunbox(boxwin);
+                       wwdelete(boxwin);
                        return;
                        return;
-               case 1:
+               case 2:
+                       wwunbox(boxwin);
                        break;
                        break;
+               case 1:
+                       wwunbox(boxwin);
                case 0:
                        continue;
                }
                break;
        }
                case 0:
                        continue;
                }
                break;
        }
-       WBoxActive = 0;
+       wwdelete(boxwin);
        if (!terse)
        if (!terse)
-               wwputs("\r\n", cmdwin);
-       wwsetcursor(WCurRow(cmdwin->ww_win), WCurCol(cmdwin->ww_win));
-       if (doopen(id, xrow-row+1, xcol-col+1, row, col) == 0)
-               if (terse)
-                       Ding();
-               else
-                       wwputs("Can't open window.  ", cmdwin);
+               wwputc('\n', cmdwin);
+       wwcurtowin(cmdwin);
+       (void) openwin(id, row, col, xrow-row+1, xcol-col+1, nbufline,
+               (char *) 0, 1, 1, shellfile, shell);
 }
 
 }
 
-findid()
+getpos(row, col, minrow, mincol, maxrow, maxcol)
+register int *row, *col;
+int minrow, mincol;
+int maxrow, maxcol;
 {
 {
-       register id;
-       char ids[10];
-       register struct ww *w;
-
-       for (id = 1; id <= NWINDOW; id++)
-               ids[id] = 0;
-       for (w = wwhead; w; w = w->ww_next) {
-               if (w->ww_ident < 1 || w->ww_ident > NWINDOW)
-                       continue;
-               ids[w->ww_ident]++;
-       }
-       for (id = 1; id <= NWINDOW && ids[id]; id++)
-               ;
-       return id < 10 ? id : -1;
-}
-
-getpos(row, col, minrow, mincol)
-register int *row, *col, minrow, mincol;
-{
-       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':
@@ -116,18 +107,18 @@ register int *row, *col, minrow, mincol;
                        *col = mincol;
                        break;
                case 'l':
                        *col = mincol;
                        break;
                case 'l':
-                       if ((*col += count) >= wwncol)
-                               *col = wwncol - 1;
+                       if ((*col += count) > maxcol)
+                               *col = maxcol;
                        break;
                case 'L':
                        break;
                case 'L':
-                       *col = wwncol - 1;
+                       *col = maxcol;
                        break;
                case 'j':
                        break;
                case 'j':
-                       if ((*row += count) >= wwnrow)
-                               *row = wwnrow - 1;
+                       if ((*row += count) > maxrow)
+                               *row = maxrow;
                        break;
                case 'J':
                        break;
                case 'J':
-                       *row = wwnrow - 1;
+                       *row = maxrow;
                        break;
                case 'k':
                        if ((*row -= count) < minrow)
                        break;
                case 'k':
                        if ((*row -= count) < minrow)
@@ -136,56 +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:
                        if (!terse)
                default:
                        if (!terse)
-                               wwputs("\r\nType [hjklHJKL] to move, return to enter position, escape to cancel.", cmdwin);
-                       Ding();
+                               wwputs("\nType [hjklHJKL] to move, return to enter position, escape to cancel.", cmdwin);
+                       wwbell();
                }
        }
                }
        }
-       return 0;
-}
-
-struct ww *
-doopen(id, nrow, ncol, row, col)
-int id, nrow, ncol, row, col;
-{
-       register struct ww *w;
-
-       if (id < 0 && (id = findid()) < 0)
-               return 0;
-       if ((w = wwopen(WW_PTY, id, nrow, ncol, row, col)) == 0)
-               return 0;
-       reframe();
-       if (selwin == 0)
-               setselwin(w);
-       else
-               wwsetcurwin(cmdwin);
-       wwflush();
-       switch (wwfork(w)) {
-       case -1:
-               doclose(w);
-               return 0;
-       case 0:
-               execl(shell, shellname, 0);
-               perror(shell);
-               exit(1);
-       }
-       return w;
-}
-
-reframe()
-{
-       register struct ww *w;
-
-       for (w = wwhead; w; w = w->ww_next) {
-               if (w == cmdwin)
-                       continue;
-               wwunframe(w);
-               wwframe(w);
-               labelwin(w);
-       }
+       return oldrow != *row || oldcol != *col;
 }
 }