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