xref: /csrg-svn/usr.bin/window/cmd.c (revision 14407)
113977Sedward #ifndef lint
2*14407Sedward static	char *sccsid = "@(#)cmd.c	2.1.1.1 83/08/09";
313977Sedward #endif
413977Sedward 
513977Sedward #include "defs.h"
613977Sedward 
713977Sedward struct ww *getwin();
813977Sedward 
913977Sedward docmd()
1013977Sedward {
1113977Sedward 	register char c;
1213977Sedward 	register struct ww *w;
1313977Sedward 
1414177Sedward 	if (!terse)
15*14407Sedward 		wwadd(cmdwin, &wwhead);
16*14407Sedward 	/*
1714071Sedward 	if (selwin != 0)
1814071Sedward 		Woncursor(selwin->ww_win, 1);
19*14407Sedward 	*/
2014189Sedward top:
2113977Sedward 	while ((c = bgetc()) >= 0) {
2214189Sedward 		if (!terse)
23*14407Sedward 			(void) wwputs("\r\n", cmdwin);
2413977Sedward 		switch (c) {
2514177Sedward 		default:
2614177Sedward 			if (c == escapec)
2714177Sedward 				goto foo;
2814177Sedward 			break;
2914071Sedward 		case 'h': case 'j': case 'k': case 'l':
3014071Sedward 		case CTRL(u):
3114071Sedward 		case CTRL(d):
3214071Sedward 		case CTRL(b):
3314071Sedward 		case CTRL(f):
3413977Sedward 		case CTRL([):
3514177Sedward 		foo:
3613977Sedward 			if (selwin == 0) {
37*14407Sedward 				error("No window.");
3813977Sedward 				continue;
3913977Sedward 			}
4013977Sedward 		}
4113977Sedward 		switch (c) {
4213977Sedward 		case '1': case '2': case '3': case '4': case '5':
4313977Sedward 		case '6': case '7': case '8': case '9':
44*14407Sedward 			if ((w = window[c - '1']) == 0) {
45*14407Sedward 				wwbell();
4613977Sedward 				break;
4713977Sedward 			}
4813977Sedward 			setselwin(w);
4913977Sedward 			goto out;
5013977Sedward 		case '%':
5114184Sedward 			if ((w = getwin()) != 0)
5214184Sedward 				setselwin(w);
5313977Sedward 			break;
5413977Sedward 		case 'c':
5514184Sedward 			if ((w = getwin()) != 0)
56*14407Sedward 				c_close(w);
5714071Sedward 			break;
5813977Sedward 		case 'C':
59*14407Sedward 			c_close((struct ww *)0);
6014071Sedward 			break;
6113977Sedward 		case 'Z':
62*14407Sedward 			error("Command Z is now C.");
6313977Sedward 			break;
6413977Sedward 		case 'w':
65*14407Sedward 			c_window();
6613977Sedward 			break;
6714184Sedward 		case 'S':
68*14407Sedward 			c_show();
6913994Sedward 			break;
7014189Sedward 		case 'L':
71*14407Sedward 			c_list();
7214189Sedward 			break;
73*14407Sedward 		case 's':
74*14407Sedward 			c_stat();
7514177Sedward 			break;
76*14407Sedward 		case 'M':
77*14407Sedward 			wwdumpsmap();
7814184Sedward 			break;
79*14407Sedward 		case 'V':
80*14407Sedward 			if ((w = getwin()) != 0)
81*14407Sedward 				wwdumpnvis(w);
8213977Sedward 			break;
83*14407Sedward 		case 'D':
84*14407Sedward 			if ((w = getwin()) != 0)
85*14407Sedward 				wwdumpcov(w);
8613977Sedward 			break;
87*14407Sedward 		case 'W':
88*14407Sedward 			if ((w = getwin()) != 0)
89*14407Sedward 				wwdumpwin(w);
9014080Sedward 			break;
9113977Sedward 		case 't':
92*14407Sedward 			c_time(RUSAGE_SELF);
9313977Sedward 			break;
9413977Sedward 		case 'T':
95*14407Sedward 			c_time(RUSAGE_CHILDREN);
9613977Sedward 			break;
9714184Sedward 		case ':':
98*14407Sedward 			c_colon();
9914184Sedward 			break;
10014071Sedward 		case 'h':
101*14407Sedward 			(void) wwwrite(selwin, "\b", 1);
10214071Sedward 			break;
10314071Sedward 		case 'j':
104*14407Sedward 			(void) wwwrite(selwin, "\n", 1);
10514071Sedward 			break;
10614071Sedward 		case 'k':
107*14407Sedward 			(void) wwwrite(selwin, "\033A", 2);
10814071Sedward 			break;
10914071Sedward 		case 'l':
110*14407Sedward 			(void) wwwrite(selwin, "\033C", 2);
11114071Sedward 			break;
112*14407Sedward 		/*
11314071Sedward 		case CTRL(d):
114*14407Sedward 			c_scroll(1);
11514071Sedward 			break;
11614071Sedward 		case CTRL(u):
117*14407Sedward 			c_scroll(-1);
11814071Sedward 			break;
11914071Sedward 		case CTRL(f):
120*14407Sedward 			c_scroll(2);
12114071Sedward 			break;
12214071Sedward 		case CTRL(b):
123*14407Sedward 			c_scroll(-2);
12414071Sedward 			break;
125*14407Sedward 		*/
12613977Sedward 		case CTRL(l):
127*14407Sedward 			wwredraw();
12813977Sedward 			break;
12913977Sedward 		case '?':
130*14407Sedward 			c_help();
13113977Sedward 			break;
13213977Sedward 		case CTRL([):
13313977Sedward 			goto out;
13413977Sedward 		case CTRL(z):
13513977Sedward 			wwsuspend();
13613977Sedward 			break;
13714189Sedward 		case 'q':
138*14407Sedward 			c_quit();
13914025Sedward 			if (quit)
14014025Sedward 				goto out;
14114025Sedward 			break;
14214189Sedward 		case '.':
143*14407Sedward 			error("Use q to quit.");
14414189Sedward 			break;
14513977Sedward 		default:
14614177Sedward 			if (c == escapec) {
147*14407Sedward 				(void) write(selwin->ww_pty, &escapec, 1);
14814177Sedward 				goto out;
14914177Sedward 			}
15014189Sedward 			if (!terse)
151*14407Sedward 				wwbell();
152*14407Sedward 			error("Type ? for help.");
15313977Sedward 			break;
15413977Sedward 		}
15513977Sedward 	}
15614189Sedward 	if (terse)
15714189Sedward 		wwsetcursor(0, 0);
15814189Sedward 	else {
15914189Sedward 		if (!terse)
160*14407Sedward 			(void) wwputs("Command: ", cmdwin);
161*14407Sedward 		wwsetcursor(wwcurrow(cmdwin), wwcurcol(cmdwin));
16214189Sedward 	}
16313994Sedward 	while (bpeekc() < 0)
16413977Sedward 		bread();
16513977Sedward 	goto top;
16613977Sedward out:
167*14407Sedward 	if (!quit) {
168*14407Sedward 		curwin = selwin;
169*14407Sedward 		if (!terse) {
170*14407Sedward 			wwdelete(cmdwin);
171*14407Sedward 			reframe();
172*14407Sedward 		}
173*14407Sedward 	}
174*14407Sedward 	/*
17514071Sedward 	if (selwin != 0)
17614071Sedward 		Woncursor(selwin->ww_win, 0);
177*14407Sedward 	*/
17813977Sedward }
17913977Sedward 
18013977Sedward struct ww *
18113977Sedward getwin()
18213977Sedward {
18313977Sedward 	register int c;
18414184Sedward 	struct ww *w = 0;
18513977Sedward 
18614189Sedward 	if (!terse)
187*14407Sedward 		(void) wwputs("Which window? ", cmdwin);
188*14407Sedward 	wwsetcursor(wwcurrow(cmdwin), wwcurcol(cmdwin));
18913994Sedward 	while ((c = bgetc()) < 0)
19013977Sedward 		bread();
191*14407Sedward 	if (debug && c == 'c')
192*14407Sedward 		w = cmdwin;
193*14407Sedward 	else if (debug && c == 'f')
194*14407Sedward 		w = framewin;
195*14407Sedward 	else if (c >= '1' && c < NWINDOW + '1')
196*14407Sedward 		w = window[c - '1'];
197*14407Sedward 	if (w == 0)
198*14407Sedward 		wwbell();
19914189Sedward 	if (!terse)
200*14407Sedward 		(void) wwputs("\r\n", cmdwin);
20113977Sedward 	return w;
20213977Sedward }
20313977Sedward 
20413977Sedward setselwin(w)
20513977Sedward register struct ww *w;
20613977Sedward {
207*14407Sedward 	register struct ww *oldselwin = selwin;
20814184Sedward 
20914184Sedward 	if (w == oldselwin)
21014184Sedward 		return;
21114071Sedward 	if (selwin = w) {
212*14407Sedward 		wwdelete(w);
213*14407Sedward 		/*
214*14407Sedward 		 * Stick it in front of the old selected window,
215*14407Sedward 		 * or behind everbody else.
216*14407Sedward 		 */
217*14407Sedward 		wwadd(w, (oldselwin ? oldselwin : &wwhead)->ww_back);
218*14407Sedward 		/*
21914071Sedward 		Woncursor(w->ww_win, 1);
220*14407Sedward 		*/
22113977Sedward 	}
222*14407Sedward 	/*
22314184Sedward 	if (oldselwin) {
22414184Sedward 		Woncursor(oldselwin->ww_win, 0);
22514184Sedward 	}
226*14407Sedward 	*/
227*14407Sedward 	reframe();
22813977Sedward }
22913977Sedward 
23014184Sedward labelwin(w)
23113977Sedward register struct ww *w;
23213977Sedward {
233*14407Sedward 	int mode = w == selwin ? WWM_REV : 0;
23413977Sedward 
235*14407Sedward 	if (w->ww_id >= 0) {
236*14407Sedward 		char buf[2];
237*14407Sedward 
238*14407Sedward 		buf[0] = w->ww_id + '1';
239*14407Sedward 		buf[1] = 0;
240*14407Sedward 		(void) wwlabel(w, framewin, 1, buf, mode);
241*14407Sedward 	}
242*14407Sedward 	if (w->ww_label) {
243*14407Sedward 		int col;
244*14407Sedward 
245*14407Sedward 		if (w->ww_center) {
246*14407Sedward 			col = (w->ww_w.nc - strlen(w->ww_label)) / 2;
247*14407Sedward 			col = MAX(3, col);
248*14407Sedward 		} else
249*14407Sedward 			col = 3;
250*14407Sedward 		(void) wwlabel(w, framewin, col, w->ww_label, mode);
251*14407Sedward 	}
25213977Sedward }
253