lint
[unix-history] / usr / src / usr.bin / window / cmd.c
CommitLineData
f6dc361a 1#ifndef lint
8baf70f5 2static char *sccsid = "@(#)cmd.c 3.9 83/08/31";
f6dc361a
EW
3#endif
4
5#include "defs.h"
6
f6dc361a
EW
7docmd()
8{
9 register char c;
10 register struct ww *w;
f6dc361a 11
74329e4e 12 if (!terse)
bb05dfb5 13 wwadd(cmdwin, &wwhead);
c417b691 14 if (selwin != 0)
73218728 15 wwcursor(selwin, 1);
101acab4 16top:
f6dc361a 17 while ((c = bgetc()) >= 0) {
101acab4 18 if (!terse)
bb05dfb5 19 (void) wwputs("\r\n", cmdwin);
f6dc361a 20 switch (c) {
74329e4e
EW
21 default:
22 if (c == escapec)
23 goto foo;
24 break;
c417b691 25 case 'h': case 'j': case 'k': case 'l':
b0d4d9e2
EW
26 case CTRL(y):
27 case CTRL(e):
c417b691
EW
28 case CTRL(u):
29 case CTRL(d):
30 case CTRL(b):
31 case CTRL(f):
7e04a523
EW
32 case CTRL(s):
33 case CTRL(q):
f6dc361a 34 case CTRL([):
74329e4e 35 foo:
f6dc361a 36 if (selwin == 0) {
bb05dfb5 37 error("No window.");
f6dc361a
EW
38 continue;
39 }
40 }
41 switch (c) {
42 case '1': case '2': case '3': case '4': case '5':
43 case '6': case '7': case '8': case '9':
bb05dfb5
EW
44 if ((w = window[c - '1']) == 0) {
45 wwbell();
f6dc361a
EW
46 break;
47 }
48 setselwin(w);
49 goto out;
50 case '%':
4c8ea7ce
EW
51 if ((w = getwin()) != 0)
52 setselwin(w);
f6dc361a
EW
53 break;
54 case 'c':
4c8ea7ce 55 if ((w = getwin()) != 0)
bb05dfb5 56 c_close(w);
c417b691 57 break;
f6dc361a 58 case 'C':
bb05dfb5 59 c_close((struct ww *)0);
c417b691 60 break;
f6dc361a 61 case 'w':
bb05dfb5 62 c_window();
f6dc361a 63 break;
8baf70f5
EW
64 case 'm':
65 if ((w = getwin()) != 0)
66 c_move(w);
67 break;
4c8ea7ce 68 case 'S':
bb05dfb5 69 c_show();
b4be6cd6 70 break;
101acab4 71 case 'L':
bb05dfb5 72 c_list();
101acab4 73 break;
4c8ea7ce 74 case ':':
bb05dfb5 75 c_colon();
4c8ea7ce 76 break;
c417b691 77 case 'h':
bb05dfb5 78 (void) wwwrite(selwin, "\b", 1);
c417b691
EW
79 break;
80 case 'j':
bb05dfb5 81 (void) wwwrite(selwin, "\n", 1);
c417b691
EW
82 break;
83 case 'k':
bb05dfb5 84 (void) wwwrite(selwin, "\033A", 2);
c417b691
EW
85 break;
86 case 'l':
bb05dfb5 87 (void) wwwrite(selwin, "\033C", 2);
c417b691 88 break;
b0d4d9e2
EW
89 case CTRL(e):
90 wwscroll(selwin, 1);
91 break;
92 case CTRL(y):
93 wwscroll(selwin, -1);
94 break;
c417b691 95 case CTRL(d):
b0d4d9e2 96 wwscroll(selwin, selwin->ww_w.nr / 2);
c417b691
EW
97 break;
98 case CTRL(u):
b0d4d9e2 99 wwscroll(selwin, - selwin->ww_w.nr / 2);
c417b691
EW
100 break;
101 case CTRL(f):
b0d4d9e2 102 wwscroll(selwin, selwin->ww_w.nr);
c417b691
EW
103 break;
104 case CTRL(b):
b0d4d9e2 105 wwscroll(selwin, - selwin->ww_w.nr);
c417b691 106 break;
7e04a523
EW
107 case CTRL(s):
108 (void) write(selwin->ww_pty,
109 &wwwintty.ww_tchars.t_stopc, 1);
110 break;
111 case CTRL(q):
112 (void) write(selwin->ww_pty,
113 &wwwintty.ww_tchars.t_startc, 1);
114 break;
f6dc361a 115 case CTRL(l):
bb05dfb5 116 wwredraw();
f6dc361a
EW
117 break;
118 case '?':
bb05dfb5 119 c_help();
f6dc361a 120 break;
f6dc361a
EW
121 case CTRL([):
122 goto out;
123 case CTRL(z):
124 wwsuspend();
125 break;
101acab4 126 case 'q':
bb05dfb5 127 c_quit();
8c4fb896
EW
128 if (quit)
129 goto out;
130 break;
720ae37c
EW
131 /* undocumented commands */
132 case 's':
133 c_stat();
134 break;
135 case 't':
136 c_time(RUSAGE_SELF);
137 break;
138 case 'T':
139 c_time(RUSAGE_CHILDREN);
140 break;
141 /* debugging commands */
142 case 'M':
143 if (!debug)
144 goto badcmd;
145 wwdumpsmap();
146 break;
147 case 'V':
148 if (!debug)
149 goto badcmd;
150 if ((w = getwin()) != 0)
151 wwdumpnvis(w);
152 break;
153 case 'D':
154 if (!debug)
155 goto badcmd;
156 if ((w = getwin()) != 0)
157 wwdumpcov(w);
158 break;
159 case 'W':
160 if (!debug)
161 goto badcmd;
162 if ((w = getwin()) != 0)
163 wwdumpwin(w);
101acab4 164 break;
f6dc361a 165 default:
720ae37c 166 badcmd:
74329e4e 167 if (c == escapec) {
bb05dfb5 168 (void) write(selwin->ww_pty, &escapec, 1);
74329e4e
EW
169 goto out;
170 }
101acab4 171 if (!terse)
bb05dfb5
EW
172 wwbell();
173 error("Type ? for help.");
f6dc361a
EW
174 break;
175 }
176 }
101acab4
EW
177 if (terse)
178 wwsetcursor(0, 0);
179 else {
180 if (!terse)
bb05dfb5
EW
181 (void) wwputs("Command: ", cmdwin);
182 wwsetcursor(wwcurrow(cmdwin), wwcurcol(cmdwin));
101acab4 183 }
b4be6cd6 184 while (bpeekc() < 0)
f6dc361a 185 bread();
f6dc361a
EW
186 goto top;
187out:
bb05dfb5
EW
188 if (!quit) {
189 curwin = selwin;
190 if (!terse) {
191 wwdelete(cmdwin);
192 reframe();
193 }
194 }
c417b691 195 if (selwin != 0)
73218728 196 wwcursor(selwin, 0);
f6dc361a
EW
197}
198
199struct ww *
200getwin()
201{
202 register int c;
4c8ea7ce 203 struct ww *w = 0;
f6dc361a 204
101acab4 205 if (!terse)
bb05dfb5
EW
206 (void) wwputs("Which window? ", cmdwin);
207 wwsetcursor(wwcurrow(cmdwin), wwcurcol(cmdwin));
b4be6cd6 208 while ((c = bgetc()) < 0)
f6dc361a 209 bread();
bb05dfb5
EW
210 if (debug && c == 'c')
211 w = cmdwin;
212 else if (debug && c == 'f')
213 w = framewin;
720ae37c
EW
214 else if (debug && c == 'b')
215 w = boxwin;
bb05dfb5
EW
216 else if (c >= '1' && c < NWINDOW + '1')
217 w = window[c - '1'];
218 if (w == 0)
219 wwbell();
101acab4 220 if (!terse)
bb05dfb5 221 (void) wwputs("\r\n", cmdwin);
f6dc361a
EW
222 return w;
223}
224
225setselwin(w)
fe24a747
EW
226struct ww *w;
227{
228 if ((selwin = w) != 0)
229 front(w);
230}
231
232front(w)
f6dc361a
EW
233register struct ww *w;
234{
fe24a747 235 char moved = 0;
4c8ea7ce 236
fe24a747
EW
237 while (w->ww_back != framewin) {
238 wwmoveup(w);
239 moved = 1;
4c8ea7ce 240 }
fe24a747
EW
241 if (moved)
242 reframe();
243}
244
245reframe()
246{
247 register struct ww *w;
248
249 wwunframe(framewin);
250 for (w = wwhead.ww_back; w != &wwhead; w = w->ww_back)
251 if (w->ww_hasframe) {
252 wwframe(w, framewin);
253 labelwin(w);
254 }
f6dc361a
EW
255}
256
4c8ea7ce 257labelwin(w)
f6dc361a
EW
258register struct ww *w;
259{
bb05dfb5
EW
260 int mode = w == selwin ? WWM_REV : 0;
261
262 if (w->ww_id >= 0) {
263 char buf[2];
f6dc361a 264
bb05dfb5
EW
265 buf[0] = w->ww_id + '1';
266 buf[1] = 0;
03e75950 267 wwlabel(w, framewin, 1, buf, mode);
bb05dfb5
EW
268 }
269 if (w->ww_label) {
270 int col;
271
272 if (w->ww_center) {
273 col = (w->ww_w.nc - strlen(w->ww_label)) / 2;
274 col = MAX(3, col);
275 } else
276 col = 3;
03e75950 277 wwlabel(w, framewin, col, w->ww_label, mode);
bb05dfb5 278 }
f6dc361a 279}