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