Merge branch 'vendor/OPENSSH'
[dragonfly.git] / usr.bin / window / cmd.c
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
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 *
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
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
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
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
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 }