d31997e3e28af49f4635c22ba22f8cc9053db083
[dragonfly.git] / usr.bin / window / cmd1.c
1 /*      $NetBSD: cmd1.c,v 1.7 2003/08/07 11:17:22 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[] = "@(#)cmd1.c      8.1 (Berkeley) 6/6/93";
39 #else
40 __RCSID("$NetBSD: cmd1.c,v 1.7 2003/08/07 11:17:22 agc Exp $");
41 #endif
42 #endif /* not lint */
43
44 #include "defs.h"
45 #include "char.h"
46
47 void
48 c_window(void)
49 {
50         int col, row, xcol, xrow;
51         int id;
52
53         if ((id = findid()) < 0)
54                 return;
55         if (!terse)
56                 wwputs("New window (upper left corner): ", cmdwin);
57         col = 0;
58         row = 1;
59         wwadd(boxwin, framewin->ww_back);
60         for (;;) {
61                 wwbox(boxwin, row - 1, col - 1, 3, 3);
62                 wwsetcursor(row, col);
63                 while (wwpeekc() < 0)
64                         wwiomux();
65                 switch (getpos(&row, &col, row > 1, 0,
66                         wwnrow - 1, wwncol - 1)) {
67                 case 3:
68                         wwunbox(boxwin);
69                         wwdelete(boxwin);
70                         return;
71                 case 2:
72                         wwunbox(boxwin);
73                         break;
74                 case 1:
75                         wwunbox(boxwin);
76                 case 0:
77                         continue;
78                 }
79                 break;
80         }
81         if (!terse)
82                 wwputs("\nNew window (lower right corner): ", cmdwin);
83         xcol = col;
84         xrow = row;
85         for (;;) {
86                 wwbox(boxwin, row - 1, col - 1,
87                         xrow - row + 3, xcol - col + 3);
88                 wwsetcursor(xrow, xcol);
89                 while (wwpeekc() < 0)
90                         wwiomux();
91                 switch (getpos(&xrow, &xcol, row, col, wwnrow - 1, wwncol - 1))
92                 {
93                 case 3:
94                         wwunbox(boxwin);
95                         wwdelete(boxwin);
96                         return;
97                 case 2:
98                         wwunbox(boxwin);
99                         break;
100                 case 1:
101                         wwunbox(boxwin);
102                 case 0:
103                         continue;
104                 }
105                 break;
106         }
107         wwdelete(boxwin);
108         if (!terse)
109                 wwputc('\n', cmdwin);
110         wwcurtowin(cmdwin);
111         (void) openwin(id, row, col, xrow-row+1, xcol-col+1, default_nline,
112             (char *) 0, WWT_PTY, WWU_HASFRAME, default_shellfile,
113             default_shell);
114 }
115
116 int
117 getpos(int *row, int *col, int minrow, int mincol, int maxrow, int maxcol)
118 {
119         static int scount;
120         int count;
121         int c;
122         int oldrow = *row, oldcol = *col;
123
124         while ((c = wwgetc()) >= 0) {
125                 switch (c) {
126                 case '0': case '1': case '2': case '3': case '4':
127                 case '5': case '6': case '7': case '8': case '9':
128                         scount = scount * 10 + c - '0';
129                         continue;
130                 }
131                 count = scount ? scount : 1;
132                 scount = 0;
133                 switch (c) {
134                 case 'h':
135                         if ((*col -= count) < mincol)
136                                 *col = mincol;
137                         break;
138                 case 'H':
139                         *col = mincol;
140                         break;
141                 case 'l':
142                         if ((*col += count) > maxcol)
143                                 *col = maxcol;
144                         break;
145                 case 'L':
146                         *col = maxcol;
147                         break;
148                 case 'j':
149                         if ((*row += count) > maxrow)
150                                 *row = maxrow;
151                         break;
152                 case 'J':
153                         *row = maxrow;
154                         break;
155                 case 'k':
156                         if ((*row -= count) < minrow)
157                                 *row = minrow;
158                         break;
159                 case 'K':
160                         *row = minrow;
161                         break;
162                 case ctrl('['):
163                         if (!terse)
164                                 wwputs("\nCancelled.  ", cmdwin);
165                         return 3;
166                 case '\r':
167                         return 2;
168                 default:
169                         if (!terse)
170                                 wwputs("\nType [hjklHJKL] to move, return to enter position, escape to cancel.", cmdwin);
171                         wwbell();
172                 }
173         }
174         return oldrow != *row || oldcol != *col;
175 }