deec51dd0c5dd5a76c2bc32df58484cce9de80bb
[dragonfly.git] / usr.bin / window / cmd.c
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 }