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