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