fix contrib notice (Edward Wang)
[unix-history] / usr / src / usr.bin / window / cmd.c
CommitLineData
60de5df9 1/*
46e9ea25
KB
2 * Copyright (c) 1983 Regents of the University of California.
3 * All rights reserved.
4 *
3dd3a9e5
KB
5 * This code is derived from software contributed to Berkeley by
6 * Edward Wang at The University of California, Berkeley.
7 *
87f529ec 8 * %sccs.include.redist.c%
60de5df9
EW
9 */
10
46e9ea25 11#ifndef lint
3dd3a9e5 12static char sccsid[] = "@(#)cmd.c 3.40 (Berkeley) %G%";
46e9ea25
KB
13#endif /* not lint */
14
f6dc361a 15#include "defs.h"
0e64e422 16#include "char.h"
f6dc361a 17
f6dc361a
EW
18docmd()
19{
20 register char c;
21 register struct ww *w;
ffa20db4 22 char out = 0;
f6dc361a 23
2c279448
EW
24 while (!out && !quit) {
25 if ((c = wwgetc()) < 0) {
26 if (terse)
27 wwsetcursor(0, 0);
28 else {
29 wwputs("Command: ", cmdwin);
30 wwcurtowin(cmdwin);
f6dc361a 31 }
2c279448
EW
32 do
33 wwiomux();
34 while ((c = wwgetc()) < 0);
35 }
36 if (!terse)
37 wwputc('\n', cmdwin);
38 switch (c) {
39 default:
40 if (c != escapec)
41 break;
42 case 'h': case 'j': case 'k': case 'l':
43 case ctrl('y'):
44 case ctrl('e'):
45 case ctrl('u'):
46 case ctrl('d'):
47 case ctrl('b'):
48 case ctrl('f'):
49 case ctrl('s'):
50 case ctrl('q'):
51 case ctrl('['):
52 if (selwin == 0) {
53 error("No window.");
54 continue;
55 }
56 }
57 switch (c) {
58 case '1': case '2': case '3': case '4': case '5':
59 case '6': case '7': case '8': case '9':
60 if ((w = window[c - '1']) == 0) {
61 error("%c: No such window.", c);
86845af3 62 break;
2c279448
EW
63 }
64 setselwin(w);
65 if (checkproc(selwin) >= 0)
66 out = 1;
67 break;
68 case '%':
69 if ((w = getwin()) != 0)
70 setselwin(w);
71 break;
72 case ctrl('^'):
73 if (lastselwin != 0) {
74 setselwin(lastselwin);
86845af3 75 if (checkproc(selwin) >= 0)
ffa20db4 76 out = 1;
2c279448
EW
77 } else
78 error("No previous window.");
79 break;
80 case 'c':
81 if ((w = getwin()) != 0)
82 closewin(w);
83 break;
84 case 'w':
85 c_window();
86 break;
87 case 'm':
88 if ((w = getwin()) != 0)
89 c_move(w);
90 break;
91 case 'M':
92 if ((w = getwin()) != 0)
93 movewin(w, w->ww_alt.t, w->ww_alt.l);
94 break;
95 case 's':
96 if ((w = getwin()) != 0)
97 c_size(w);
98 break;
99 case 'S':
100 if ((w = getwin()) != 0)
101 sizewin(w, w->ww_alt.nr, w->ww_alt.nc);
102 break;
103 case ':':
104 c_colon();
105 break;
106 case 'h':
107 (void) wwwrite(selwin, "\b", 1);
108 break;
109 case 'j':
110 (void) wwwrite(selwin, "\n", 1);
111 break;
112 case 'k':
113 (void) wwwrite(selwin, "\033A", 2);
114 break;
115 case 'l':
116 (void) wwwrite(selwin, "\033C", 2);
117 break;
118 case ctrl('e'):
119 wwscroll(selwin, 1);
120 break;
121 case ctrl('y'):
122 wwscroll(selwin, -1);
123 break;
124 case ctrl('d'):
125 wwscroll(selwin, selwin->ww_w.nr / 2);
126 break;
127 case ctrl('u'):
128 wwscroll(selwin, - selwin->ww_w.nr / 2);
129 break;
130 case ctrl('f'):
131 wwscroll(selwin, selwin->ww_w.nr);
132 break;
133 case ctrl('b'):
134 wwscroll(selwin, - selwin->ww_w.nr);
135 break;
136 case ctrl('s'):
137 stopwin(selwin);
138 break;
139 case ctrl('q'):
140 startwin(selwin);
141 break;
142 case ctrl('l'):
143 wwredraw();
144 break;
145 case '?':
146 c_help();
147 break;
148 case ctrl('['):
149 if (checkproc(selwin) >= 0)
150 out = 1;
151 break;
152 case ctrl('z'):
153 wwsuspend();
154 break;
155 case 'q':
156 c_quit();
157 break;
158 /* debugging stuff */
159 case '&':
160 if (debug) {
161 c_debug();
86845af3 162 break;
2c279448
EW
163 }
164 default:
165 if (c == escapec) {
166 if (checkproc(selwin) >= 0) {
167 (void) write(selwin->ww_pty,
168 &escapec, 1);
169 out = 1;
86845af3 170 }
2c279448
EW
171 } else {
172 if (!terse)
173 wwbell();
174 error("Type ? for help.");
74329e4e 175 }
f6dc361a 176 }
101acab4 177 }
ffa20db4
EW
178 if (!quit)
179 setcmd(0);
f6dc361a
EW
180}
181
182struct ww *
183getwin()
184{
185 register int c;
4c8ea7ce 186 struct ww *w = 0;
f6dc361a 187
101acab4 188 if (!terse)
b1189050 189 wwputs("Which window? ", cmdwin);
f2a77fe1 190 wwcurtowin(cmdwin);
8fa6d94c
EW
191 while ((c = wwgetc()) < 0)
192 wwiomux();
bb05dfb5
EW
193 if (debug && c == 'c')
194 w = cmdwin;
195 else if (debug && c == 'f')
196 w = framewin;
720ae37c
EW
197 else if (debug && c == 'b')
198 w = boxwin;
bb05dfb5
EW
199 else if (c >= '1' && c < NWINDOW + '1')
200 w = window[c - '1'];
2422abab
EW
201 else if (c == '+')
202 w = selwin;
203 else if (c == '-')
204 w = lastselwin;
bb05dfb5 205 if (w == 0)
7ecf4dca 206 wwbell();
101acab4 207 if (!terse)
bf3b96e9 208 wwputc('\n', cmdwin);
f6dc361a
EW
209 return w;
210}
211
86845af3
EW
212checkproc(w)
213struct ww *w;
214{
215 if (w->ww_state != WWS_HASPROC) {
216 error("No process in window.");
217 return -1;
218 }
219 return 0;
220}
ffa20db4
EW
221
222setcmd(new)
223char new;
224{
225 if (new && !incmd) {
226 if (!terse)
227 wwadd(cmdwin, &wwhead);
228 if (selwin != 0)
229 wwcursor(selwin, 1);
230 wwcurwin = 0;
231 } else if (!new && incmd) {
232 if (!terse) {
233 wwdelete(cmdwin);
234 reframe();
235 }
236 if (selwin != 0)
237 wwcursor(selwin, 0);
238 wwcurwin = selwin;
239 }
240 incmd = new;
241}
242
243setterse(new)
244char new;
245{
246 if (incmd)
247 if (new && !terse) {
248 wwdelete(cmdwin);
249 reframe();
250 } else if (!new && terse)
251 wwadd(cmdwin, &wwhead);
252 terse = new;
253}
254
255/*
256 * Set the current window.
257 */
258setselwin(w)
259struct ww *w;
260{
261 if (selwin == w)
262 return;
142f32ee
EW
263 if (selwin != 0)
264 lastselwin = selwin;
265 if ((selwin = w) != 0)
266 front(selwin, 1);
ffa20db4 267}