|
|
1.1 root 1: /*
2: * Copyright (c) 1983 Regents of the University of California.
3: * All rights reserved.
4: *
5: * This code is derived from software contributed to Berkeley by
6: * Edward Wang at The University of California, Berkeley.
7: *
8: * Redistribution and use in source and binary forms are permitted provided
9: * that: (1) source distributions retain this entire copyright notice and
10: * comment, and (2) distributions including binaries display the following
11: * acknowledgement: ``This product includes software developed by the
12: * University of California, Berkeley and its contributors'' in the
13: * documentation or other materials provided with the distribution and in
14: * all advertising materials mentioning features or use of this software.
15: * Neither the name of the University nor the names of its contributors may
16: * be used to endorse or promote products derived from this software without
17: * specific prior written permission.
18: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
19: * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
20: * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
21: */
22:
23: #ifndef lint
24: static char sccsid[] = "@(#)cmd.c 3.40 (Berkeley) 6/6/90";
25: #endif /* not lint */
26:
27: #include "defs.h"
28: #include "char.h"
29:
30: docmd()
31: {
32: register char c;
33: register struct ww *w;
34: char out = 0;
35:
36: while (!out && !quit) {
37: if ((c = wwgetc()) < 0) {
38: if (terse)
39: wwsetcursor(0, 0);
40: else {
41: wwputs("Command: ", cmdwin);
42: wwcurtowin(cmdwin);
43: }
44: do
45: wwiomux();
46: while ((c = wwgetc()) < 0);
47: }
48: if (!terse)
49: wwputc('\n', cmdwin);
50: switch (c) {
51: default:
52: if (c != escapec)
53: break;
54: case 'h': case 'j': case 'k': case 'l':
55: case ctrl('y'):
56: case ctrl('e'):
57: case ctrl('u'):
58: case ctrl('d'):
59: case ctrl('b'):
60: case ctrl('f'):
61: case ctrl('s'):
62: case ctrl('q'):
63: case ctrl('['):
64: if (selwin == 0) {
65: error("No window.");
66: continue;
67: }
68: }
69: switch (c) {
70: case '1': case '2': case '3': case '4': case '5':
71: case '6': case '7': case '8': case '9':
72: if ((w = window[c - '1']) == 0) {
73: error("%c: No such window.", c);
74: break;
75: }
76: setselwin(w);
77: if (checkproc(selwin) >= 0)
78: out = 1;
79: break;
80: case '%':
81: if ((w = getwin()) != 0)
82: setselwin(w);
83: break;
84: case ctrl('^'):
85: if (lastselwin != 0) {
86: setselwin(lastselwin);
87: if (checkproc(selwin) >= 0)
88: out = 1;
89: } else
90: error("No previous window.");
91: break;
92: case 'c':
93: if ((w = getwin()) != 0)
94: closewin(w);
95: break;
96: case 'w':
97: c_window();
98: break;
99: case 'm':
100: if ((w = getwin()) != 0)
101: c_move(w);
102: break;
103: case 'M':
104: if ((w = getwin()) != 0)
105: movewin(w, w->ww_alt.t, w->ww_alt.l);
106: break;
107: case 's':
108: if ((w = getwin()) != 0)
109: c_size(w);
110: break;
111: case 'S':
112: if ((w = getwin()) != 0)
113: sizewin(w, w->ww_alt.nr, w->ww_alt.nc);
114: break;
115: case ':':
116: c_colon();
117: break;
118: case 'h':
119: (void) wwwrite(selwin, "\b", 1);
120: break;
121: case 'j':
122: (void) wwwrite(selwin, "\n", 1);
123: break;
124: case 'k':
125: (void) wwwrite(selwin, "\033A", 2);
126: break;
127: case 'l':
128: (void) wwwrite(selwin, "\033C", 2);
129: break;
130: case ctrl('e'):
131: wwscroll(selwin, 1);
132: break;
133: case ctrl('y'):
134: wwscroll(selwin, -1);
135: break;
136: case ctrl('d'):
137: wwscroll(selwin, selwin->ww_w.nr / 2);
138: break;
139: case ctrl('u'):
140: wwscroll(selwin, - selwin->ww_w.nr / 2);
141: break;
142: case ctrl('f'):
143: wwscroll(selwin, selwin->ww_w.nr);
144: break;
145: case ctrl('b'):
146: wwscroll(selwin, - selwin->ww_w.nr);
147: break;
148: case ctrl('s'):
149: stopwin(selwin);
150: break;
151: case ctrl('q'):
152: startwin(selwin);
153: break;
154: case ctrl('l'):
155: wwredraw();
156: break;
157: case '?':
158: c_help();
159: break;
160: case ctrl('['):
161: if (checkproc(selwin) >= 0)
162: out = 1;
163: break;
164: case ctrl('z'):
165: wwsuspend();
166: break;
167: case 'q':
168: c_quit();
169: break;
170: /* debugging stuff */
171: case '&':
172: if (debug) {
173: c_debug();
174: break;
175: }
176: default:
177: if (c == escapec) {
178: if (checkproc(selwin) >= 0) {
179: (void) write(selwin->ww_pty,
180: &escapec, 1);
181: out = 1;
182: }
183: } else {
184: if (!terse)
185: wwbell();
186: error("Type ? for help.");
187: }
188: }
189: }
190: if (!quit)
191: setcmd(0);
192: }
193:
194: struct ww *
195: getwin()
196: {
197: register int c;
198: struct ww *w = 0;
199:
200: if (!terse)
201: wwputs("Which window? ", cmdwin);
202: wwcurtowin(cmdwin);
203: while ((c = wwgetc()) < 0)
204: wwiomux();
205: if (debug && c == 'c')
206: w = cmdwin;
207: else if (debug && c == 'f')
208: w = framewin;
209: else if (debug && c == 'b')
210: w = boxwin;
211: else if (c >= '1' && c < NWINDOW + '1')
212: w = window[c - '1'];
213: else if (c == '+')
214: w = selwin;
215: else if (c == '-')
216: w = lastselwin;
217: if (w == 0)
218: wwbell();
219: if (!terse)
220: wwputc('\n', cmdwin);
221: return w;
222: }
223:
224: checkproc(w)
225: struct ww *w;
226: {
227: if (w->ww_state != WWS_HASPROC) {
228: error("No process in window.");
229: return -1;
230: }
231: return 0;
232: }
233:
234: setcmd(new)
235: char new;
236: {
237: if (new && !incmd) {
238: if (!terse)
239: wwadd(cmdwin, &wwhead);
240: if (selwin != 0)
241: wwcursor(selwin, 1);
242: wwcurwin = 0;
243: } else if (!new && incmd) {
244: if (!terse) {
245: wwdelete(cmdwin);
246: reframe();
247: }
248: if (selwin != 0)
249: wwcursor(selwin, 0);
250: wwcurwin = selwin;
251: }
252: incmd = new;
253: }
254:
255: setterse(new)
256: char new;
257: {
258: if (incmd)
259: if (new && !terse) {
260: wwdelete(cmdwin);
261: reframe();
262: } else if (!new && terse)
263: wwadd(cmdwin, &wwhead);
264: terse = new;
265: }
266:
267: /*
268: * Set the current window.
269: */
270: setselwin(w)
271: struct ww *w;
272: {
273: if (selwin == w)
274: return;
275: if (selwin != 0)
276: lastselwin = selwin;
277: if ((selwin = w) != 0)
278: front(selwin, 1);
279: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.