date and time created 83/08/17 15:48:20 by edward
[unix-history] / usr / src / usr.bin / window / cmd.c
CommitLineData
f6dc361a 1#ifndef lint
30647f51 2static char *sccsid = "@(#)cmd.c 3.1 83/08/11";
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
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;
166out:
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
180struct ww *
181getwin()
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
204setselwin(w)
205register 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 230labelwin(w)
f6dc361a
EW
231register 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}