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