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