1 /* @(#)cmd.c 8.1 (Berkeley) 6/6/93 */
2 /* $NetBSD: cmd.c,v 1.8 2003/08/07 11:17:21 agc Exp $ */
3
4 /*
5 * Copyright (c) 1983, 1993
6 * The Regents of the University of California. All rights reserved.
7 *
8 * This code is derived from software contributed to Berkeley by
9 * Edward Wang at The University of California, Berkeley.
10 *
11 * Redistribution and use in source and binary forms, with or without
12 * modification, are permitted provided that the following conditions
13 * are met:
14 * 1. Redistributions of source code must retain the above copyright
15 * notice, this list of conditions and the following disclaimer.
16 * 2. Redistributions in binary form must reproduce the above copyright
17 * notice, this list of conditions and the following disclaimer in the
18 * documentation and/or other materials provided with the distribution.
19 * 3. Neither the name of the University nor the names of its contributors
20 * may be used to endorse or promote products derived from this software
21 * without specific prior written permission.
22 *
23 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
24 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
25 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
26 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
27 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
28 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
29 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
30 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
31 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
32 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
33 * SUCH DAMAGE.
34 */
35
36 #include <unistd.h>
37 #include "defs.h"
38 #include "char.h"
39
40 int checkproc(struct ww *);
41
42 void
docmd(void)43 docmd(void)
44 {
45 int c;
46 struct ww *w;
47 char out = 0;
48
49 while (!out && !quit) {
50 if ((c = wwgetc()) < 0) {
51 if (terse)
52 wwsetcursor(0, 0);
53 else {
54 wwputs("Command: ", cmdwin);
55 wwcurtowin(cmdwin);
56 }
57 do
58 wwiomux();
59 while ((c = wwgetc()) < 0);
60 }
61 if (!terse)
62 wwputc('\n', cmdwin);
63 switch (c) {
64 default:
65 if (c != escapec)
66 break;
67 /* FALLTHROUGH */
68 case 'h': case 'j': case 'k': case 'l':
69 case 'y': case 'p':
70 case ctrl('y'):
71 case ctrl('e'):
72 case ctrl('u'):
73 case ctrl('d'):
74 case ctrl('b'):
75 case ctrl('f'):
76 case ctrl('s'):
77 case ctrl('q'):
78 case ctrl('['):
79 if (selwin == 0) {
80 error("No window.");
81 continue;
82 }
83 }
84 switch (c) {
85 case '1': case '2': case '3': case '4': case '5':
86 case '6': case '7': case '8': case '9':
87 if ((w = window[c - '1']) == NULL) {
88 error("%c: No such window.", c);
89 break;
90 }
91 setselwin(w);
92 if (checkproc(selwin) >= 0)
93 out = 1;
94 break;
95 case '%':
96 if ((w = getwin()) != NULL)
97 setselwin(w);
98 break;
99 case ctrl('^'):
100 if (lastselwin != 0) {
101 setselwin(lastselwin);
102 if (checkproc(selwin) >= 0)
103 out = 1;
104 } else
105 error("No previous window.");
106 break;
107 case 'c':
108 if ((w = getwin()) != NULL)
109 closewin(w);
110 break;
111 case 'w':
112 c_window();
113 break;
114 case 'm':
115 if ((w = getwin()) != NULL)
116 c_move(w);
117 break;
118 case 'M':
119 if ((w = getwin()) != NULL)
120 movewin(w, w->ww_alt.t, w->ww_alt.l);
121 break;
122 case 's':
123 if ((w = getwin()) != NULL)
124 c_size(w);
125 break;
126 case 'S':
127 if ((w = getwin()) != NULL)
128 sizewin(w, w->ww_alt.nr, w->ww_alt.nc);
129 break;
130 case 'y':
131 c_yank();
132 break;
133 case 'p':
134 c_put();
135 break;
136 case ':':
137 c_colon();
138 break;
139 case 'h':
140 (void) wwwrite(selwin, "\b", 1);
141 break;
142 case 'j':
143 (void) wwwrite(selwin, "\n", 1);
144 break;
145 case 'k':
146 (void) wwwrite(selwin, "\033A", 2);
147 break;
148 case 'l':
149 (void) wwwrite(selwin, "\033C", 2);
150 break;
151 case ctrl('e'):
152 wwscroll(selwin, 1);
153 break;
154 case ctrl('y'):
155 wwscroll(selwin, -1);
156 break;
157 case ctrl('d'):
158 wwscroll(selwin, selwin->ww_w.nr / 2);
159 break;
160 case ctrl('u'):
161 wwscroll(selwin, - selwin->ww_w.nr / 2);
162 break;
163 case ctrl('f'):
164 wwscroll(selwin, selwin->ww_w.nr);
165 break;
166 case ctrl('b'):
167 wwscroll(selwin, - selwin->ww_w.nr);
168 break;
169 case ctrl('s'):
170 stopwin(selwin);
171 break;
172 case ctrl('q'):
173 startwin(selwin);
174 break;
175 case ctrl('l'):
176 wwredraw();
177 break;
178 case '?':
179 c_help();
180 break;
181 case ctrl('['):
182 if (checkproc(selwin) >= 0)
183 out = 1;
184 break;
185 case ctrl('z'):
186 wwsuspend();
187 break;
188 case 'q':
189 c_quit();
190 break;
191 /* debugging stuff */
192 case '&':
193 if (debug) {
194 c_debug();
195 break;
196 }
197 /* FALLTHROUGH */
198 default:
199 if (c == escapec) {
200 if (checkproc(selwin) >= 0) {
201 (void) write(selwin->ww_pty,
202 &escapec, 1);
203 out = 1;
204 }
205 } else {
206 if (!terse)
207 wwbell();
208 error("Type ? for help.");
209 }
210 }
211 }
212 if (!quit)
213 setcmd(0);
214 }
215
216 struct ww *
getwin(void)217 getwin(void)
218 {
219 int c;
220 struct ww *w = NULL;
221
222 if (!terse)
223 wwputs("Which window? ", cmdwin);
224 wwcurtowin(cmdwin);
225 while ((c = wwgetc()) < 0)
226 wwiomux();
227 if (debug && c == 'c')
228 w = cmdwin;
229 else if (debug && c == 'f')
230 w = framewin;
231 else if (debug && c == 'b')
232 w = boxwin;
233 else if (c >= '1' && c < NWINDOW + '1')
234 w = window[c - '1'];
235 else if (c == '+')
236 w = selwin;
237 else if (c == '-')
238 w = lastselwin;
239 if (w == NULL)
240 wwbell();
241 if (!terse)
242 wwputc('\n', cmdwin);
243 return w;
244 }
245
246 int
checkproc(struct ww * w)247 checkproc(struct ww *w)
248 {
249 if (w->ww_state != WWS_HASPROC) {
250 error("No process in window.");
251 return -1;
252 }
253 return 0;
254 }
255
256 void
setcmd(char new)257 setcmd(char new)
258 {
259 if (new && !incmd) {
260 if (!terse)
261 wwadd(cmdwin, &wwhead);
262 if (selwin != 0)
263 wwcursor(selwin, 1);
264 wwcurwin = 0;
265 } else if (!new && incmd) {
266 if (!terse) {
267 wwdelete(cmdwin);
268 reframe();
269 }
270 if (selwin != 0)
271 wwcursor(selwin, 0);
272 wwcurwin = selwin;
273 }
274 incmd = new;
275 }
276
277 void
setterse(char new)278 setterse(char new)
279 {
280 if (incmd) {
281 if (new && !terse) {
282 wwdelete(cmdwin);
283 reframe();
284 } else if (!new && terse)
285 wwadd(cmdwin, &wwhead);
286 }
287 terse = new;
288 }
289
290 /*
291 * Set the current window.
292 */
293 void
setselwin(struct ww * w)294 setselwin(struct ww *w)
295 {
296 if (selwin == w)
297 return;
298 if (selwin != 0)
299 lastselwin = selwin;
300 if ((selwin = w) != NULL)
301 front(selwin, 1);
302 }
303