Commit | Line | Data |
---|---|---|
f6dc361a | 1 | #ifndef lint |
356ef21c | 2 | static 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 |
8 | docmd() |
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 | ||
192 | struct ww * | |
193 | getwin() | |
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 |
218 | checkproc(w) |
219 | struct 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 | |
228 | setcmd(new) | |
229 | char 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 | ||
249 | setterse(new) | |
250 | char 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 | */ | |
264 | setselwin(w) | |
265 | struct 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 | } |