don't select on ptys with full buffers
[unix-history] / usr / src / usr.bin / window / cmd.c
CommitLineData
f6dc361a 1#ifndef lint
356ef21c 2static char sccsid[] = "@(#)cmd.c 3.31 %G%";
f6dc361a
EW
3#endif
4
5#include "defs.h"
0e64e422 6#include "char.h"
f6dc361a 7
f6dc361a
EW
8docmd()
9{
10 register char c;
11 register struct ww *w;
ffa20db4 12 char out = 0;
f6dc361a 13
86845af3 14 for (;;) {
8fa6d94c 15 while ((c = wwgetc()) >= 0) {
86845af3 16 if (!terse)
bf3b96e9 17 wwputc('\n', cmdwin);
86845af3
EW
18 switch (c) {
19 default:
20 if (c == escapec)
21 goto foo;
f6dc361a 22 break;
86845af3 23 case 'h': case 'j': case 'k': case 'l':
0e64e422
EW
24 case ctrl(y):
25 case ctrl(e):
26 case ctrl(u):
27 case ctrl(d):
28 case ctrl(b):
29 case ctrl(f):
30 case ctrl(s):
31 case ctrl(q):
32 case ctrl([):
86845af3
EW
33 foo:
34 if (selwin == 0) {
35 error("No window.");
36 continue;
37 }
f6dc361a 38 }
86845af3
EW
39 switch (c) {
40 case '1': case '2': case '3': case '4': case '5':
41 case '6': case '7': case '8': case '9':
42 if ((w = window[c - '1']) == 0) {
7c0483b9 43 error("%c: No such window.", c);
86845af3
EW
44 break;
45 }
4c8ea7ce 46 setselwin(w);
86845af3 47 if (checkproc(selwin) >= 0)
ffa20db4 48 out = 1;
86845af3
EW
49 break;
50 case '%':
51 if ((w = getwin()) != 0)
52 setselwin(w);
53 break;
0e64e422 54 case ctrl(^):
7c0483b9
EW
55 if (lastselwin != 0) {
56 setselwin(lastselwin);
57 if (checkproc(selwin) >= 0)
ffa20db4 58 out = 1;
7c0483b9
EW
59 } else
60 error("No previous window.");
61 break;
86845af3
EW
62 case 'c':
63 if ((w = getwin()) != 0)
64 c_close(w);
65 break;
86845af3
EW
66 case 'w':
67 c_window();
68 break;
69 case 'm':
70 if ((w = getwin()) != 0)
71 c_move(w);
72 break;
f176f953
EW
73 case 'M':
74 if ((w = getwin()) != 0)
356ef21c
EW
75 movewin(w, w->ww_alt.t, w->ww_alt.l);
76 break;
77 case 's':
78 if ((w = getwin()) != 0)
79 c_size(w);
80 break;
81 case 'S':
82 if ((w = getwin()) != 0)
83 sizewin(w, w->ww_alt.nr, w->ww_alt.nc);
f176f953 84 break;
86845af3
EW
85 case ':':
86 c_colon();
87 break;
88 case 'h':
89 (void) wwwrite(selwin, "\b", 1);
90 break;
91 case 'j':
92 (void) wwwrite(selwin, "\n", 1);
93 break;
94 case 'k':
95 (void) wwwrite(selwin, "\033A", 2);
96 break;
97 case 'l':
98 (void) wwwrite(selwin, "\033C", 2);
99 break;
0e64e422 100 case ctrl(e):
86845af3
EW
101 wwscroll(selwin, 1);
102 break;
0e64e422 103 case ctrl(y):
86845af3
EW
104 wwscroll(selwin, -1);
105 break;
0e64e422 106 case ctrl(d):
86845af3
EW
107 wwscroll(selwin, selwin->ww_w.nr / 2);
108 break;
0e64e422 109 case ctrl(u):
86845af3
EW
110 wwscroll(selwin, - selwin->ww_w.nr / 2);
111 break;
0e64e422 112 case ctrl(f):
86845af3
EW
113 wwscroll(selwin, selwin->ww_w.nr);
114 break;
0e64e422 115 case ctrl(b):
86845af3
EW
116 wwscroll(selwin, - selwin->ww_w.nr);
117 break;
0e64e422 118 case ctrl(s):
356ef21c
EW
119 if (selwin->ww_pty < 0)
120 break;
121 if (selwin->ww_ispty) {
122 (void) ioctl(selwin->ww_pty, TIOCSTOP,
123 (char *)0);
124 selwin->ww_stopped = 1;
125 } else
126 (void) write(selwin->ww_pty,
127 &wwwintty.ww_tchars.t_stopc, 1);
86845af3 128 break;
0e64e422 129 case ctrl(q):
356ef21c
EW
130 if (selwin->ww_pty < 0)
131 break;
132 if (selwin->ww_ispty) {
133 (void) ioctl(selwin->ww_pty, TIOCSTART,
134 (char *)0);
135 selwin->ww_stopped = 0;
136 } else
137 (void) write(selwin->ww_pty,
138 &wwwintty.ww_tchars.t_startc,
139 1);
86845af3 140 break;
0e64e422 141 case ctrl(l):
86845af3
EW
142 wwredraw();
143 break;
144 case '?':
145 c_help();
146 break;
0e64e422 147 case ctrl([):
86845af3 148 if (checkproc(selwin) >= 0)
ffa20db4 149 out = 1;
86845af3 150 break;
0e64e422 151 case ctrl(z):
86845af3
EW
152 wwsuspend();
153 break;
154 case 'q':
155 c_quit();
156 break;
f176f953
EW
157 /* debugging stuff */
158 case '&':
159 if (debug) {
160 c_debug();
161 break;
162 }
86845af3 163 default:
86845af3
EW
164 if (c == escapec) {
165 if (checkproc(selwin) >= 0) {
166 (void) write(selwin->ww_pty,
167 &escapec, 1);
ffa20db4 168 out = 1;
86845af3
EW
169 }
170 } else {
171 if (!terse)
7ecf4dca 172 wwbell();
86845af3
EW
173 error("Type ? for help.");
174 }
74329e4e 175 }
f6dc361a 176 }
ffa20db4 177 if (out || quit)
86845af3
EW
178 break;
179 if (terse)
180 wwsetcursor(0, 0);
181 else {
b1189050 182 wwputs("Command: ", cmdwin);
86845af3
EW
183 wwcurtowin(cmdwin);
184 }
8fa6d94c
EW
185 while (wwpeekc() < 0)
186 wwiomux();
101acab4 187 }
ffa20db4
EW
188 if (!quit)
189 setcmd(0);
f6dc361a
EW
190}
191
192struct ww *
193getwin()
194{
195 register int c;
4c8ea7ce 196 struct ww *w = 0;
f6dc361a 197
101acab4 198 if (!terse)
b1189050 199 wwputs("Which window? ", cmdwin);
f2a77fe1 200 wwcurtowin(cmdwin);
8fa6d94c
EW
201 while ((c = wwgetc()) < 0)
202 wwiomux();
bb05dfb5
EW
203 if (debug && c == 'c')
204 w = cmdwin;
205 else if (debug && c == 'f')
206 w = framewin;
720ae37c
EW
207 else if (debug && c == 'b')
208 w = boxwin;
bb05dfb5
EW
209 else if (c >= '1' && c < NWINDOW + '1')
210 w = window[c - '1'];
211 if (w == 0)
7ecf4dca 212 wwbell();
101acab4 213 if (!terse)
bf3b96e9 214 wwputc('\n', cmdwin);
f6dc361a
EW
215 return w;
216}
217
86845af3
EW
218checkproc(w)
219struct ww *w;
220{
221 if (w->ww_state != WWS_HASPROC) {
222 error("No process in window.");
223 return -1;
224 }
225 return 0;
226}
ffa20db4
EW
227
228setcmd(new)
229char new;
230{
231 if (new && !incmd) {
232 if (!terse)
233 wwadd(cmdwin, &wwhead);
234 if (selwin != 0)
235 wwcursor(selwin, 1);
236 wwcurwin = 0;
237 } else if (!new && incmd) {
238 if (!terse) {
239 wwdelete(cmdwin);
240 reframe();
241 }
242 if (selwin != 0)
243 wwcursor(selwin, 0);
244 wwcurwin = selwin;
245 }
246 incmd = new;
247}
248
249setterse(new)
250char new;
251{
252 if (incmd)
253 if (new && !terse) {
254 wwdelete(cmdwin);
255 reframe();
256 } else if (!new && terse)
257 wwadd(cmdwin, &wwhead);
258 terse = new;
259}
260
261/*
262 * Set the current window.
263 */
264setselwin(w)
265struct ww *w;
266{
267 if (selwin == w)
268 return;
142f32ee
EW
269 if (selwin != 0)
270 lastselwin = selwin;
271 if ((selwin = w) != 0)
272 front(selwin, 1);
ffa20db4 273}