Commit | Line | Data |
---|---|---|
f6dc361a | 1 | #ifndef lint |
30647f51 | 2 | static char *sccsid = "@(#)cmd.c 3.1 83/08/11"; |
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 EW |
15 | wwadd(cmdwin, &wwhead); |
16 | /* | |
c417b691 EW |
17 | if (selwin != 0) |
18 | Woncursor(selwin->ww_win, 1); | |
bb05dfb5 | 19 | */ |
101acab4 | 20 | top: |
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 EW |
29 | case 'h': case 'j': case 'k': case 'l': |
30 | case CTRL(u): | |
31 | case CTRL(d): | |
32 | case CTRL(b): | |
33 | case CTRL(f): | |
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 'Z': |
bb05dfb5 | 62 | error("Command Z is now C."); |
f6dc361a EW |
63 | break; |
64 | case 'w': | |
bb05dfb5 | 65 | c_window(); |
f6dc361a | 66 | break; |
4c8ea7ce | 67 | case 'S': |
bb05dfb5 | 68 | c_show(); |
b4be6cd6 | 69 | break; |
101acab4 | 70 | case 'L': |
bb05dfb5 | 71 | c_list(); |
101acab4 | 72 | break; |
bb05dfb5 EW |
73 | case 's': |
74 | c_stat(); | |
74329e4e | 75 | break; |
bb05dfb5 EW |
76 | case 'M': |
77 | wwdumpsmap(); | |
4c8ea7ce | 78 | break; |
bb05dfb5 EW |
79 | case 'V': |
80 | if ((w = getwin()) != 0) | |
81 | wwdumpnvis(w); | |
f6dc361a | 82 | break; |
bb05dfb5 EW |
83 | case 'D': |
84 | if ((w = getwin()) != 0) | |
85 | wwdumpcov(w); | |
f6dc361a | 86 | break; |
bb05dfb5 EW |
87 | case 'W': |
88 | if ((w = getwin()) != 0) | |
89 | wwdumpwin(w); | |
6821e691 | 90 | break; |
f6dc361a | 91 | case 't': |
bb05dfb5 | 92 | c_time(RUSAGE_SELF); |
f6dc361a EW |
93 | break; |
94 | case 'T': | |
bb05dfb5 | 95 | c_time(RUSAGE_CHILDREN); |
f6dc361a | 96 | break; |
4c8ea7ce | 97 | case ':': |
bb05dfb5 | 98 | c_colon(); |
4c8ea7ce | 99 | break; |
c417b691 | 100 | case 'h': |
bb05dfb5 | 101 | (void) wwwrite(selwin, "\b", 1); |
c417b691 EW |
102 | break; |
103 | case 'j': | |
bb05dfb5 | 104 | (void) wwwrite(selwin, "\n", 1); |
c417b691 EW |
105 | break; |
106 | case 'k': | |
bb05dfb5 | 107 | (void) wwwrite(selwin, "\033A", 2); |
c417b691 EW |
108 | break; |
109 | case 'l': | |
bb05dfb5 | 110 | (void) wwwrite(selwin, "\033C", 2); |
c417b691 | 111 | break; |
bb05dfb5 | 112 | /* |
c417b691 | 113 | case CTRL(d): |
bb05dfb5 | 114 | c_scroll(1); |
c417b691 EW |
115 | break; |
116 | case CTRL(u): | |
bb05dfb5 | 117 | c_scroll(-1); |
c417b691 EW |
118 | break; |
119 | case CTRL(f): | |
bb05dfb5 | 120 | c_scroll(2); |
c417b691 EW |
121 | break; |
122 | case CTRL(b): | |
bb05dfb5 | 123 | c_scroll(-2); |
c417b691 | 124 | break; |
bb05dfb5 | 125 | */ |
f6dc361a | 126 | case CTRL(l): |
bb05dfb5 | 127 | wwredraw(); |
f6dc361a EW |
128 | break; |
129 | case '?': | |
bb05dfb5 | 130 | c_help(); |
f6dc361a | 131 | break; |
f6dc361a EW |
132 | case CTRL([): |
133 | goto out; | |
134 | case CTRL(z): | |
135 | wwsuspend(); | |
136 | break; | |
101acab4 | 137 | case 'q': |
bb05dfb5 | 138 | c_quit(); |
8c4fb896 EW |
139 | if (quit) |
140 | goto out; | |
141 | break; | |
101acab4 | 142 | case '.': |
bb05dfb5 | 143 | error("Use q to quit."); |
101acab4 | 144 | break; |
f6dc361a | 145 | default: |
74329e4e | 146 | if (c == escapec) { |
bb05dfb5 | 147 | (void) write(selwin->ww_pty, &escapec, 1); |
74329e4e EW |
148 | goto out; |
149 | } | |
101acab4 | 150 | if (!terse) |
bb05dfb5 EW |
151 | wwbell(); |
152 | error("Type ? for help."); | |
f6dc361a EW |
153 | break; |
154 | } | |
155 | } | |
101acab4 EW |
156 | if (terse) |
157 | wwsetcursor(0, 0); | |
158 | else { | |
159 | if (!terse) | |
bb05dfb5 EW |
160 | (void) wwputs("Command: ", cmdwin); |
161 | wwsetcursor(wwcurrow(cmdwin), wwcurcol(cmdwin)); | |
101acab4 | 162 | } |
b4be6cd6 | 163 | while (bpeekc() < 0) |
f6dc361a | 164 | bread(); |
f6dc361a EW |
165 | goto top; |
166 | out: | |
bb05dfb5 EW |
167 | if (!quit) { |
168 | curwin = selwin; | |
169 | if (!terse) { | |
170 | wwdelete(cmdwin); | |
171 | reframe(); | |
172 | } | |
173 | } | |
174 | /* | |
c417b691 EW |
175 | if (selwin != 0) |
176 | Woncursor(selwin->ww_win, 0); | |
bb05dfb5 | 177 | */ |
f6dc361a EW |
178 | } |
179 | ||
180 | struct ww * | |
181 | getwin() | |
182 | { | |
183 | register int c; | |
4c8ea7ce | 184 | struct ww *w = 0; |
f6dc361a | 185 | |
101acab4 | 186 | if (!terse) |
bb05dfb5 EW |
187 | (void) wwputs("Which window? ", cmdwin); |
188 | wwsetcursor(wwcurrow(cmdwin), wwcurcol(cmdwin)); | |
b4be6cd6 | 189 | while ((c = bgetc()) < 0) |
f6dc361a | 190 | bread(); |
bb05dfb5 EW |
191 | if (debug && c == 'c') |
192 | w = cmdwin; | |
193 | else if (debug && c == 'f') | |
194 | w = framewin; | |
195 | else if (c >= '1' && c < NWINDOW + '1') | |
196 | w = window[c - '1']; | |
197 | if (w == 0) | |
198 | wwbell(); | |
101acab4 | 199 | if (!terse) |
bb05dfb5 | 200 | (void) wwputs("\r\n", cmdwin); |
f6dc361a EW |
201 | return w; |
202 | } | |
203 | ||
204 | setselwin(w) | |
205 | register struct ww *w; | |
206 | { | |
bb05dfb5 | 207 | register struct ww *oldselwin = selwin; |
4c8ea7ce EW |
208 | |
209 | if (w == oldselwin) | |
210 | return; | |
c417b691 | 211 | if (selwin = w) { |
bb05dfb5 EW |
212 | wwdelete(w); |
213 | /* | |
214 | * Stick it in front of the old selected window, | |
215 | * or behind everbody else. | |
216 | */ | |
217 | wwadd(w, (oldselwin ? oldselwin : &wwhead)->ww_back); | |
218 | /* | |
c417b691 | 219 | Woncursor(w->ww_win, 1); |
bb05dfb5 | 220 | */ |
f6dc361a | 221 | } |
bb05dfb5 | 222 | /* |
4c8ea7ce | 223 | if (oldselwin) { |
4c8ea7ce EW |
224 | Woncursor(oldselwin->ww_win, 0); |
225 | } | |
bb05dfb5 EW |
226 | */ |
227 | reframe(); | |
f6dc361a EW |
228 | } |
229 | ||
4c8ea7ce | 230 | labelwin(w) |
f6dc361a EW |
231 | register struct ww *w; |
232 | { | |
bb05dfb5 EW |
233 | int mode = w == selwin ? WWM_REV : 0; |
234 | ||
235 | if (w->ww_id >= 0) { | |
236 | char buf[2]; | |
f6dc361a | 237 | |
bb05dfb5 EW |
238 | buf[0] = w->ww_id + '1'; |
239 | buf[1] = 0; | |
240 | (void) wwlabel(w, framewin, 1, buf, mode); | |
241 | } | |
242 | if (w->ww_label) { | |
243 | int col; | |
244 | ||
245 | if (w->ww_center) { | |
246 | col = (w->ww_w.nc - strlen(w->ww_label)) / 2; | |
247 | col = MAX(3, col); | |
248 | } else | |
249 | col = 3; | |
250 | (void) wwlabel(w, framewin, col, w->ww_label, mode); | |
251 | } | |
f6dc361a | 252 | } |