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