#ifndef lint
-static char *sccsid = "@(#)cmd1.c 3.7 83/08/25";
+static char sccsid[] = "@(#)cmd1.c 3.29 %G%";
#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 "char.h"
c_window()
{
int col, row, xcol, xrow;
int id;
- if ((id = findid()) < 0) {
- error("Too many windows.");
+ if ((id = findid()) < 0)
return;
- }
if (!terse)
- (void) wwputs("Upper left corner: ", cmdwin);
+ wwputs("New window (upper left corner): ", cmdwin);
col = 0;
row = 1;
wwadd(boxwin, framewin->ww_back);
for (;;) {
- wwunbox(boxwin);
wwbox(boxwin, row - 1, col - 1, 3, 3);
wwsetcursor(row, col);
- while (bpeekc() < 0)
- bread();
- switch (getpos(&row, &col, 1, 0)) {
- case -1:
+ while (wwpeekc() < 0)
+ wwiomux();
+ switch (getpos(&row, &col, row > 1, 0,
+ wwnrow - 1, wwncol - 1)) {
+ case 3:
wwunbox(boxwin);
wwdelete(boxwin);
- if (!terse)
- (void) wwputs("\r\nCancelled. ", cmdwin);
return;
- case 1:
+ case 2:
+ wwunbox(boxwin);
break;
+ case 1:
+ wwunbox(boxwin);
case 0:
continue;
}
break;
}
if (!terse)
- (void) wwputs("\r\nLower right corner: ", cmdwin);
+ wwputs("\nNew window (lower right corner): ", cmdwin);
xcol = col;
xrow = row;
for (;;) {
- wwunbox(boxwin);
wwbox(boxwin, row - 1, col - 1,
xrow - row + 3, xcol - col + 3);
wwsetcursor(xrow, xcol);
wwflush();
- while (bpeekc() < 0)
- bread();
- switch (getpos(&xrow, &xcol, row, col)) {
- case -1:
+ while (wwpeekc() < 0)
+ wwiomux();
+ switch (getpos(&xrow, &xcol, row, col, wwnrow - 1, wwncol - 1))
+ {
+ case 3:
wwunbox(boxwin);
wwdelete(boxwin);
- if (!terse)
- (void) wwputs("\r\nCancelled. ", cmdwin);
return;
- case 1:
+ case 2:
+ wwunbox(boxwin);
break;
+ case 1:
+ wwunbox(boxwin);
case 0:
continue;
}
break;
}
- wwunbox(boxwin);
wwdelete(boxwin);
if (!terse)
- (void) wwputs("\r\n", cmdwin);
+ wwputc('\n', cmdwin);
wwcurtowin(cmdwin);
- if (openwin(id, row, col, xrow-row+1, xcol-col+1, nbufline) == 0)
- error("Can't open window.");
+ (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 i;
-
- for (i = 0; i < NWINDOW && window[i] != 0; i++)
- ;
- return i < NWINDOW ? i : -1;
-}
-
-getpos(row, col, minrow, mincol)
-register int *row, *col, minrow, mincol;
-{
- static int scount = 0;
+ static int scount;
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':
*col = mincol;
break;
case 'l':
- if ((*col += count) >= wwncol)
- *col = wwncol - 1;
+ if ((*col += count) > maxcol)
+ *col = maxcol;
break;
case 'L':
- *col = wwncol - 1;
+ *col = maxcol;
break;
case 'j':
- if ((*row += count) >= wwnrow)
- *row = wwnrow - 1;
+ if ((*row += count) > maxrow)
+ *row = maxrow;
break;
case 'J':
- *row = wwnrow - 1;
+ *row = maxrow;
break;
case 'k':
if ((*row -= count) < minrow)
case 'K':
*row = minrow;
break;
- case CTRL([):
- return -1;
+ case ctrl([):
+ if (!terse)
+ wwputs("\nCanceled. ", cmdwin);
+ return 3;
case '\r':
- return 1;
+ return 2;
default:
if (!terse)
- (void) wwputs("\r\nType [hjklHJKL] to move, return to enter position, escape to cancel.", cmdwin);
+ wwputs("\nType [hjklHJKL] to move, return to enter position, escape to cancel.", cmdwin);
wwbell();
}
}
- return 0;
-}
-
-struct ww *
-openwin(id, row, col, nrow, ncol, nline)
-int id, nrow, ncol, row, col;
-{
- register struct ww *w;
-
- if (row <= 0)
- return 0;
- if (id < 0 && (id = findid()) < 0)
- return 0;
- if ((w = wwopen(WWO_PTY, nrow, ncol, row, col, nline)) == 0)
- return 0;
- w->ww_id = id;
- window[id] = w;
- w->ww_hasframe = 1;
- wwcursor(w, 1);
- wwadd(w, (selwin ? selwin : wwhead.ww_back));
- setselwin(w);
- wwupdate();
- wwflush();
- switch (wwfork(w)) {
- case -1:
- c_close(w);
- return 0;
- case 0:
- execl(shell, shellname, 0);
- perror(shell);
- exit(1);
- }
- return w;
-}
-
-reframe()
-{
- register struct ww *w;
-
- wwunframe(framewin);
- for (w = wwhead.ww_back; w != &wwhead; w = w->ww_back)
- if (w->ww_hasframe) {
- wwframe(w, framewin);
- labelwin(w);
- }
+ return oldrow != *row || oldcol != *col;
}