Annotation of src/usr.bin/window/cmd.c, Revision 1.1.1.1
1.1 deraadt 1: /* $NetBSD: cmd.c,v 1.3 1995/09/28 10:34:02 tls 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: #ifndef lint
40: #if 0
41: static char sccsid[] = "@(#)cmd.c 8.1 (Berkeley) 6/6/93";
42: #else
43: static char rcsid[] = "$NetBSD: cmd.c,v 1.3 1995/09/28 10:34:02 tls Exp $";
44: #endif
45: #endif /* not lint */
46:
47: #include "defs.h"
48: #include "char.h"
49:
50: docmd()
51: {
52: register char c;
53: register struct ww *w;
54: char out = 0;
55:
56: while (!out && !quit) {
57: if ((c = wwgetc()) < 0) {
58: if (terse)
59: wwsetcursor(0, 0);
60: else {
61: wwputs("Command: ", cmdwin);
62: wwcurtowin(cmdwin);
63: }
64: do
65: wwiomux();
66: while ((c = wwgetc()) < 0);
67: }
68: if (!terse)
69: wwputc('\n', cmdwin);
70: switch (c) {
71: default:
72: if (c != escapec)
73: break;
74: case 'h': case 'j': case 'k': case 'l':
75: case 'y': case 'p':
76: case ctrl('y'):
77: case ctrl('e'):
78: case ctrl('u'):
79: case ctrl('d'):
80: case ctrl('b'):
81: case ctrl('f'):
82: case ctrl('s'):
83: case ctrl('q'):
84: case ctrl('['):
85: if (selwin == 0) {
86: error("No window.");
87: continue;
88: }
89: }
90: switch (c) {
91: case '1': case '2': case '3': case '4': case '5':
92: case '6': case '7': case '8': case '9':
93: if ((w = window[c - '1']) == 0) {
94: error("%c: No such window.", c);
95: break;
96: }
97: setselwin(w);
98: if (checkproc(selwin) >= 0)
99: out = 1;
100: break;
101: case '%':
102: if ((w = getwin()) != 0)
103: setselwin(w);
104: break;
105: case ctrl('^'):
106: if (lastselwin != 0) {
107: setselwin(lastselwin);
108: if (checkproc(selwin) >= 0)
109: out = 1;
110: } else
111: error("No previous window.");
112: break;
113: case 'c':
114: if ((w = getwin()) != 0)
115: closewin(w);
116: break;
117: case 'w':
118: c_window();
119: break;
120: case 'm':
121: if ((w = getwin()) != 0)
122: c_move(w);
123: break;
124: case 'M':
125: if ((w = getwin()) != 0)
126: movewin(w, w->ww_alt.t, w->ww_alt.l);
127: break;
128: case 's':
129: if ((w = getwin()) != 0)
130: c_size(w);
131: break;
132: case 'S':
133: if ((w = getwin()) != 0)
134: sizewin(w, w->ww_alt.nr, w->ww_alt.nc);
135: break;
136: case 'y':
137: c_yank();
138: break;
139: case 'p':
140: c_put();
141: break;
142: case ':':
143: c_colon();
144: break;
145: case 'h':
146: (void) wwwrite(selwin, "\b", 1);
147: break;
148: case 'j':
149: (void) wwwrite(selwin, "\n", 1);
150: break;
151: case 'k':
152: (void) wwwrite(selwin, "\033A", 2);
153: break;
154: case 'l':
155: (void) wwwrite(selwin, "\033C", 2);
156: break;
157: case ctrl('e'):
158: wwscroll(selwin, 1);
159: break;
160: case ctrl('y'):
161: wwscroll(selwin, -1);
162: break;
163: case ctrl('d'):
164: wwscroll(selwin, selwin->ww_w.nr / 2);
165: break;
166: case ctrl('u'):
167: wwscroll(selwin, - selwin->ww_w.nr / 2);
168: break;
169: case ctrl('f'):
170: wwscroll(selwin, selwin->ww_w.nr);
171: break;
172: case ctrl('b'):
173: wwscroll(selwin, - selwin->ww_w.nr);
174: break;
175: case ctrl('s'):
176: stopwin(selwin);
177: break;
178: case ctrl('q'):
179: startwin(selwin);
180: break;
181: case ctrl('l'):
182: wwredraw();
183: break;
184: case '?':
185: c_help();
186: break;
187: case ctrl('['):
188: if (checkproc(selwin) >= 0)
189: out = 1;
190: break;
191: case ctrl('z'):
192: wwsuspend();
193: break;
194: case 'q':
195: c_quit();
196: break;
197: /* debugging stuff */
198: case '&':
199: if (debug) {
200: c_debug();
201: break;
202: }
203: default:
204: if (c == escapec) {
205: if (checkproc(selwin) >= 0) {
206: (void) write(selwin->ww_pty,
207: &escapec, 1);
208: out = 1;
209: }
210: } else {
211: if (!terse)
212: wwbell();
213: error("Type ? for help.");
214: }
215: }
216: }
217: if (!quit)
218: setcmd(0);
219: }
220:
221: struct ww *
222: getwin()
223: {
224: register int c;
225: struct ww *w = 0;
226:
227: if (!terse)
228: wwputs("Which window? ", cmdwin);
229: wwcurtowin(cmdwin);
230: while ((c = wwgetc()) < 0)
231: wwiomux();
232: if (debug && c == 'c')
233: w = cmdwin;
234: else if (debug && c == 'f')
235: w = framewin;
236: else if (debug && c == 'b')
237: w = boxwin;
238: else if (c >= '1' && c < NWINDOW + '1')
239: w = window[c - '1'];
240: else if (c == '+')
241: w = selwin;
242: else if (c == '-')
243: w = lastselwin;
244: if (w == 0)
245: wwbell();
246: if (!terse)
247: wwputc('\n', cmdwin);
248: return w;
249: }
250:
251: checkproc(w)
252: struct ww *w;
253: {
254: if (w->ww_state != WWS_HASPROC) {
255: error("No process in window.");
256: return -1;
257: }
258: return 0;
259: }
260:
261: setcmd(new)
262: char new;
263: {
264: if (new && !incmd) {
265: if (!terse)
266: wwadd(cmdwin, &wwhead);
267: if (selwin != 0)
268: wwcursor(selwin, 1);
269: wwcurwin = 0;
270: } else if (!new && incmd) {
271: if (!terse) {
272: wwdelete(cmdwin);
273: reframe();
274: }
275: if (selwin != 0)
276: wwcursor(selwin, 0);
277: wwcurwin = selwin;
278: }
279: incmd = new;
280: }
281:
282: setterse(new)
283: char new;
284: {
285: if (incmd)
286: if (new && !terse) {
287: wwdelete(cmdwin);
288: reframe();
289: } else if (!new && terse)
290: wwadd(cmdwin, &wwhead);
291: terse = new;
292: }
293:
294: /*
295: * Set the current window.
296: */
297: setselwin(w)
298: struct ww *w;
299: {
300: if (selwin == w)
301: return;
302: if (selwin != 0)
303: lastselwin = selwin;
304: if ((selwin = w) != 0)
305: front(selwin, 1);
306: }