Commit | Line | Data |
---|---|---|
f6dc361a | 1 | #ifndef lint |
8baf70f5 | 2 | static char *sccsid = "@(#)cmd.c 3.9 83/08/31"; |
f6dc361a EW |
3 | #endif |
4 | ||
5 | #include "defs.h" | |
6 | ||
f6dc361a EW |
7 | docmd() |
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 | 16 | top: |
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; |
187 | out: | |
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 | ||
199 | struct ww * | |
200 | getwin() | |
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 | ||
225 | setselwin(w) | |
fe24a747 EW |
226 | struct ww *w; |
227 | { | |
228 | if ((selwin = w) != 0) | |
229 | front(w); | |
230 | } | |
231 | ||
232 | front(w) | |
f6dc361a EW |
233 | register 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 | ||
245 | reframe() | |
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 | 257 | labelwin(w) |
f6dc361a EW |
258 | register 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 | } |