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