terse mode and some new commands.
[unix-history] / usr / src / usr.bin / window / cmd1.c
CommitLineData
827ef1a8 1#ifndef lint
101acab4 2static char *sccsid = "@(#)cmd1.c 1.6 83/07/28";
827ef1a8
EW
3#endif
4
5#include "defs.h"
6
8c4fb896 7struct ww *doopen();
827ef1a8
EW
8
9dowindow()
10{
11 int col, row, xcol, xrow;
827ef1a8 12 int id;
827ef1a8 13
8c4fb896 14 if ((id = findid()) < 0) {
101acab4
EW
15 if (terse)
16 Ding();
17 else
18 wwputs("Too many windows. ", cmdwin);
827ef1a8
EW
19 return;
20 }
101acab4
EW
21 if (!terse)
22 wwputs("Upper left corner: ", cmdwin);
827ef1a8
EW
23 col = 0;
24 row = 1;
25 for (;;) {
26 wwsetcursor(row, col);
b4be6cd6 27 while (bpeekc() < 0)
827ef1a8 28 bread();
827ef1a8
EW
29 switch (getpos(&row, &col, 0, 0)) {
30 case -1:
31 WBoxActive = 0;
101acab4
EW
32 if (!terse)
33 wwputs("\r\nCancelled. ", cmdwin);
b4be6cd6 34 return;
827ef1a8
EW
35 case 1:
36 break;
37 case 0:
38 continue;
39 }
40 break;
41 }
101acab4
EW
42 if (!terse)
43 wwputs("\r\nLower right corner: ", cmdwin);
827ef1a8
EW
44 xcol = col + 1;
45 xrow = row + 1;
46 for (;;) {
47 Wbox(col, row, xcol - col + 1, xrow - row + 1);
48 wwsetcursor(xrow, xcol);
49 wwflush();
b4be6cd6 50 while (bpeekc() < 0)
827ef1a8 51 bread();
827ef1a8
EW
52 switch (getpos(&xrow, &xcol, row + 1, col + 1)) {
53 case -1:
54 WBoxActive = 0;
101acab4
EW
55 if (!terse)
56 wwputs("\r\nCancelled. ", cmdwin);
b4be6cd6 57 return;
827ef1a8
EW
58 case 1:
59 break;
60 case 0:
61 continue;
62 }
63 break;
64 }
65 WBoxActive = 0;
101acab4
EW
66 if (!terse)
67 wwputs("\r\n", cmdwin);
8c4fb896
EW
68 wwsetcursor(WCurRow(cmdwin->ww_win), WCurCol(cmdwin->ww_win));
69 if (doopen(id, xrow-row+1, xcol-col+1, row, col) == 0)
101acab4
EW
70 if (terse)
71 Ding();
72 else
73 wwputs("Can't open window. ", cmdwin);
8c4fb896
EW
74}
75
76findid()
77{
78 register id;
79 char ids[10];
80 register struct ww *w;
8c4fb896
EW
81
82 for (id = 1; id <= NWINDOW; id++)
83 ids[id] = 0;
84 for (w = wwhead; w; w = w->ww_next) {
85 if (w->ww_ident < 1 || w->ww_ident > NWINDOW)
86 continue;
87 ids[w->ww_ident]++;
827ef1a8 88 }
8c4fb896
EW
89 for (id = 1; id <= NWINDOW && ids[id]; id++)
90 ;
91 return id < 10 ? id : -1;
827ef1a8
EW
92}
93
94getpos(row, col, minrow, mincol)
95register int *row, *col, minrow, mincol;
96{
97 static int scount = 0;
98 int count;
99 char c;
100
101 while ((c = bgetc()) >= 0) {
102 switch (c) {
103 case '0': case '1': case '2': case '3': case '4':
104 case '5': case '6': case '7': case '8': case '9':
105 scount = scount * 10 + c - '0';
106 continue;
107 }
108 count = scount ? scount : 1;
109 scount = 0;
110 switch (c) {
111 case 'h':
112 if ((*col -= count) < mincol)
113 *col = mincol;
114 break;
115 case 'H':
116 *col = mincol;
117 break;
118 case 'l':
c417b691
EW
119 if ((*col += count) >= wwncol)
120 *col = wwncol - 1;
827ef1a8
EW
121 break;
122 case 'L':
c417b691 123 *col = wwncol - 1;
827ef1a8
EW
124 break;
125 case 'j':
c417b691
EW
126 if ((*row += count) >= wwnrow)
127 *row = wwnrow - 1;
827ef1a8
EW
128 break;
129 case 'J':
c417b691 130 *row = wwnrow - 1;
827ef1a8
EW
131 break;
132 case 'k':
133 if ((*row -= count) < minrow)
134 *row = minrow;
135 break;
136 case 'K':
137 *row = minrow;
138 break;
139 case CTRL([):
140 return -1;
141 case '\r':
142 return 1;
143 default:
101acab4
EW
144 if (!terse)
145 wwputs("\r\nType [hjklHJKL] to move, return to enter position, escape to cancel.", cmdwin);
827ef1a8
EW
146 Ding();
147 }
148 }
149 return 0;
150}
151
8c4fb896
EW
152struct ww *
153doopen(id, nrow, ncol, row, col)
154int id, nrow, ncol, row, col;
827ef1a8
EW
155{
156 register struct ww *w;
157
8c4fb896
EW
158 if (id < 0 && (id = findid()) < 0)
159 return 0;
160 if ((w = wwopen(WW_PTY, id, nrow, ncol, row, col)) == 0)
161 return 0;
8c4fb896 162 reframe();
c417b691
EW
163 if (selwin == 0)
164 setselwin(w);
165 else
166 wwsetcurwin(cmdwin);
8c4fb896
EW
167 wwflush();
168 switch (wwfork(w)) {
169 case -1:
101acab4 170 doclose(w);
8c4fb896
EW
171 return 0;
172 case 0:
173 execl("/bin/csh", "csh", 0);
174 perror("exec(csh)");
175 exit(1);
827ef1a8 176 }
8c4fb896 177 return w;
827ef1a8 178}
c417b691
EW
179
180reframe()
181{
182 register struct ww *w;
183
184 for (w = wwhead; w; w = w->ww_next) {
185 if (w == cmdwin)
186 continue;
187 wwunframe(w);
188 wwframe(w);
799e7001 189 labelwin(w);
c417b691
EW
190 }
191}