No empty .Rs/.Re
[netbsd-mini2440.git] / usr.bin / window / cmd.c
blobac22579bfe5c7f3981311effbc47e566c9efc37b
1 /* $NetBSD: cmd.c,v 1.7 2002/06/14 01:06:51 wiz Exp $ */
3 /*
4 * Copyright (c) 1983, 1993
5 * The Regents of the University of California. All rights reserved.
7 * This code is derived from software contributed to Berkeley by
8 * Edward Wang at The University of California, Berkeley.
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.
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.
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.7 2002/06/14 01:06:51 wiz Exp $");
41 #endif
42 #endif /* not lint */
44 #include <unistd.h>
45 #include "defs.h"
46 #include "char.h"
48 int checkproc(struct ww *);
50 void
51 docmd(void)
53 int c;
54 struct ww *w;
55 char out = 0;
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);
66 wwiomux();
67 while ((c = wwgetc()) < 0);
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;
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;
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;
204 default:
205 if (c == escapec) {
206 if (checkproc(selwin) >= 0) {
207 (void) write(selwin->ww_pty,
208 &escapec, 1);
209 out = 1;
211 } else {
212 if (!terse)
213 wwbell();
214 error("Type ? for help.");
218 if (!quit)
219 setcmd(0);
222 struct ww *
223 getwin(void)
225 int c;
226 struct ww *w = 0;
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;
253 checkproc(struct ww *w)
255 if (w->ww_state != WWS_HASPROC) {
256 error("No process in window.");
257 return -1;
259 return 0;
262 void
263 setcmd(char new)
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();
276 if (selwin != 0)
277 wwcursor(selwin, 0);
278 wwcurwin = selwin;
280 incmd = new;
283 void
284 setterse(char new)
286 if (incmd) {
287 if (new && !terse) {
288 wwdelete(cmdwin);
289 reframe();
290 } else if (!new && terse)
291 wwadd(cmdwin, &wwhead);
293 terse = new;
297 * Set the current window.
299 void
300 setselwin(struct ww *w)
302 if (selwin == w)
303 return;
304 if (selwin != 0)
305 lastselwin = selwin;
306 if ((selwin = w) != 0)
307 front(selwin, 1);