]> git.saurik.com Git - apple/shell_cmds.git/blob - window/cmd1.c
shell_cmds-34.tar.gz
[apple/shell_cmds.git] / window / cmd1.c
1 /* $NetBSD: cmd1.c,v 1.5 1997/11/21 08:35:46 lukem 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. All advertising materials mentioning features or use of this software
19 * must display the following acknowledgement:
20 * This product includes software developed by the University of
21 * California, Berkeley and its contributors.
22 * 4. Neither the name of the University nor the names of its contributors
23 * may be used to endorse or promote products derived from this software
24 * without specific prior written permission.
25 *
26 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
27 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
28 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
29 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
30 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
31 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
32 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
33 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
34 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
35 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
36 * SUCH DAMAGE.
37 */
38
39 #include <sys/cdefs.h>
40 #ifndef lint
41 #if 0
42 static char sccsid[] = "@(#)cmd1.c 8.1 (Berkeley) 6/6/93";
43 #else
44 __RCSID("$NetBSD: cmd1.c,v 1.5 1997/11/21 08:35:46 lukem Exp $");
45 #endif
46 #endif /* not lint */
47
48 #include "defs.h"
49 #include "char.h"
50
51 void
52 c_window()
53 {
54 int col, row, xcol, xrow;
55 int id;
56
57 if ((id = findid()) < 0)
58 return;
59 if (!terse)
60 wwputs("New window (upper left corner): ", cmdwin);
61 col = 0;
62 row = 1;
63 wwadd(boxwin, framewin->ww_back);
64 for (;;) {
65 wwbox(boxwin, row - 1, col - 1, 3, 3);
66 wwsetcursor(row, col);
67 while (wwpeekc() < 0)
68 wwiomux();
69 switch (getpos(&row, &col, row > 1, 0,
70 wwnrow - 1, wwncol - 1)) {
71 case 3:
72 wwunbox(boxwin);
73 wwdelete(boxwin);
74 return;
75 case 2:
76 wwunbox(boxwin);
77 break;
78 case 1:
79 wwunbox(boxwin);
80 case 0:
81 continue;
82 }
83 break;
84 }
85 if (!terse)
86 wwputs("\nNew window (lower right corner): ", cmdwin);
87 xcol = col;
88 xrow = row;
89 for (;;) {
90 wwbox(boxwin, row - 1, col - 1,
91 xrow - row + 3, xcol - col + 3);
92 wwsetcursor(xrow, xcol);
93 while (wwpeekc() < 0)
94 wwiomux();
95 switch (getpos(&xrow, &xcol, row, col, wwnrow - 1, wwncol - 1))
96 {
97 case 3:
98 wwunbox(boxwin);
99 wwdelete(boxwin);
100 return;
101 case 2:
102 wwunbox(boxwin);
103 break;
104 case 1:
105 wwunbox(boxwin);
106 case 0:
107 continue;
108 }
109 break;
110 }
111 wwdelete(boxwin);
112 if (!terse)
113 wwputc('\n', cmdwin);
114 wwcurtowin(cmdwin);
115 (void) openwin(id, row, col, xrow-row+1, xcol-col+1, default_nline,
116 (char *) 0, WWT_PTY, WWU_HASFRAME, default_shellfile,
117 default_shell);
118 }
119
120 int
121 getpos(row, col, minrow, mincol, maxrow, maxcol)
122 int *row, *col;
123 int minrow, mincol;
124 int maxrow, maxcol;
125 {
126 static int scount;
127 int count;
128 int c;
129 int oldrow = *row, oldcol = *col;
130
131 while ((c = wwgetc()) >= 0) {
132 switch (c) {
133 case '0': case '1': case '2': case '3': case '4':
134 case '5': case '6': case '7': case '8': case '9':
135 scount = scount * 10 + c - '0';
136 continue;
137 }
138 count = scount ? scount : 1;
139 scount = 0;
140 switch (c) {
141 case 'h':
142 if ((*col -= count) < mincol)
143 *col = mincol;
144 break;
145 case 'H':
146 *col = mincol;
147 break;
148 case 'l':
149 if ((*col += count) > maxcol)
150 *col = maxcol;
151 break;
152 case 'L':
153 *col = maxcol;
154 break;
155 case 'j':
156 if ((*row += count) > maxrow)
157 *row = maxrow;
158 break;
159 case 'J':
160 *row = maxrow;
161 break;
162 case 'k':
163 if ((*row -= count) < minrow)
164 *row = minrow;
165 break;
166 case 'K':
167 *row = minrow;
168 break;
169 case ctrl('['):
170 if (!terse)
171 wwputs("\nCancelled. ", cmdwin);
172 return 3;
173 case '\r':
174 return 2;
175 default:
176 if (!terse)
177 wwputs("\nType [hjklHJKL] to move, return to enter position, escape to cancel.", cmdwin);
178 wwbell();
179 }
180 }
181 return oldrow != *row || oldcol != *col;
182 }