xref: /csrg-svn/usr.bin/window/cmd.c (revision 14711)
113977Sedward #ifndef lint
2*14711Sedward static	char *sccsid = "@(#)cmd.c	3.3 83/08/18";
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)
1514407Sedward 		wwadd(cmdwin, &wwhead);
1614407Sedward 	/*
1714071Sedward 	if (selwin != 0)
1814071Sedward 		Woncursor(selwin->ww_win, 1);
1914407Sedward 	*/
2014189Sedward top:
2113977Sedward 	while ((c = bgetc()) >= 0) {
2214189Sedward 		if (!terse)
2314407Sedward 			(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':
30*14711Sedward 		case CTRL(y):
31*14711Sedward 		case CTRL(e):
3214071Sedward 		case CTRL(u):
3314071Sedward 		case CTRL(d):
3414071Sedward 		case CTRL(b):
3514071Sedward 		case CTRL(f):
3614694Sedward 		case CTRL(s):
3714694Sedward 		case CTRL(q):
3813977Sedward 		case CTRL([):
3914177Sedward 		foo:
4013977Sedward 			if (selwin == 0) {
4114407Sedward 				error("No window.");
4213977Sedward 				continue;
4313977Sedward 			}
4413977Sedward 		}
4513977Sedward 		switch (c) {
4613977Sedward 		case '1': case '2': case '3': case '4': case '5':
4713977Sedward 		case '6': case '7': case '8': case '9':
4814407Sedward 			if ((w = window[c - '1']) == 0) {
4914407Sedward 				wwbell();
5013977Sedward 				break;
5113977Sedward 			}
5213977Sedward 			setselwin(w);
5313977Sedward 			goto out;
5413977Sedward 		case '%':
5514184Sedward 			if ((w = getwin()) != 0)
5614184Sedward 				setselwin(w);
5713977Sedward 			break;
5813977Sedward 		case 'c':
5914184Sedward 			if ((w = getwin()) != 0)
6014407Sedward 				c_close(w);
6114071Sedward 			break;
6213977Sedward 		case 'C':
6314407Sedward 			c_close((struct ww *)0);
6414071Sedward 			break;
6513977Sedward 		case 'w':
6614407Sedward 			c_window();
6713977Sedward 			break;
6814184Sedward 		case 'S':
6914407Sedward 			c_show();
7013994Sedward 			break;
7114189Sedward 		case 'L':
7214407Sedward 			c_list();
7314189Sedward 			break;
7414407Sedward 		case 's':
7514407Sedward 			c_stat();
7614177Sedward 			break;
7714407Sedward 		case 'M':
7814407Sedward 			wwdumpsmap();
7914184Sedward 			break;
8014407Sedward 		case 'V':
8114407Sedward 			if ((w = getwin()) != 0)
8214407Sedward 				wwdumpnvis(w);
8313977Sedward 			break;
8414407Sedward 		case 'D':
8514407Sedward 			if ((w = getwin()) != 0)
8614407Sedward 				wwdumpcov(w);
8713977Sedward 			break;
8814407Sedward 		case 'W':
8914407Sedward 			if ((w = getwin()) != 0)
9014407Sedward 				wwdumpwin(w);
9114080Sedward 			break;
9213977Sedward 		case 't':
9314407Sedward 			c_time(RUSAGE_SELF);
9413977Sedward 			break;
9513977Sedward 		case 'T':
9614407Sedward 			c_time(RUSAGE_CHILDREN);
9713977Sedward 			break;
9814184Sedward 		case ':':
9914407Sedward 			c_colon();
10014184Sedward 			break;
10114071Sedward 		case 'h':
10214407Sedward 			(void) wwwrite(selwin, "\b", 1);
10314071Sedward 			break;
10414071Sedward 		case 'j':
10514407Sedward 			(void) wwwrite(selwin, "\n", 1);
10614071Sedward 			break;
10714071Sedward 		case 'k':
10814407Sedward 			(void) wwwrite(selwin, "\033A", 2);
10914071Sedward 			break;
11014071Sedward 		case 'l':
11114407Sedward 			(void) wwwrite(selwin, "\033C", 2);
11214071Sedward 			break;
113*14711Sedward 		case CTRL(e):
114*14711Sedward 			wwscroll(selwin, 1);
115*14711Sedward 			break;
116*14711Sedward 		case CTRL(y):
117*14711Sedward 			wwscroll(selwin, -1);
118*14711Sedward 			break;
11914071Sedward 		case CTRL(d):
120*14711Sedward 			wwscroll(selwin, selwin->ww_w.nr / 2);
12114071Sedward 			break;
12214071Sedward 		case CTRL(u):
123*14711Sedward 			wwscroll(selwin, - selwin->ww_w.nr / 2);
12414071Sedward 			break;
12514071Sedward 		case CTRL(f):
126*14711Sedward 			wwscroll(selwin, selwin->ww_w.nr);
12714071Sedward 			break;
12814071Sedward 		case CTRL(b):
129*14711Sedward 			wwscroll(selwin, - selwin->ww_w.nr);
13014071Sedward 			break;
13114694Sedward 		case CTRL(s):
13214694Sedward 			(void) write(selwin->ww_pty,
13314694Sedward 				&wwwintty.ww_tchars.t_stopc, 1);
13414694Sedward 			break;
13514694Sedward 		case CTRL(q):
13614694Sedward 			(void) write(selwin->ww_pty,
13714694Sedward 				&wwwintty.ww_tchars.t_startc, 1);
13814694Sedward 			break;
13913977Sedward 		case CTRL(l):
14014407Sedward 			wwredraw();
14113977Sedward 			break;
14213977Sedward 		case '?':
14314407Sedward 			c_help();
14413977Sedward 			break;
14513977Sedward 		case CTRL([):
14613977Sedward 			goto out;
14713977Sedward 		case CTRL(z):
14813977Sedward 			wwsuspend();
14913977Sedward 			break;
15014189Sedward 		case 'q':
15114407Sedward 			c_quit();
15214025Sedward 			if (quit)
15314025Sedward 				goto out;
15414025Sedward 			break;
15514189Sedward 		case '.':
15614407Sedward 			error("Use q to quit.");
15714189Sedward 			break;
15813977Sedward 		default:
15914177Sedward 			if (c == escapec) {
16014407Sedward 				(void) write(selwin->ww_pty, &escapec, 1);
16114177Sedward 				goto out;
16214177Sedward 			}
16314189Sedward 			if (!terse)
16414407Sedward 				wwbell();
16514407Sedward 			error("Type ? for help.");
16613977Sedward 			break;
16713977Sedward 		}
16813977Sedward 	}
16914189Sedward 	if (terse)
17014189Sedward 		wwsetcursor(0, 0);
17114189Sedward 	else {
17214189Sedward 		if (!terse)
17314407Sedward 			(void) wwputs("Command: ", cmdwin);
17414407Sedward 		wwsetcursor(wwcurrow(cmdwin), wwcurcol(cmdwin));
17514189Sedward 	}
17613994Sedward 	while (bpeekc() < 0)
17713977Sedward 		bread();
17813977Sedward 	goto top;
17913977Sedward out:
18014407Sedward 	if (!quit) {
18114407Sedward 		curwin = selwin;
18214407Sedward 		if (!terse) {
18314407Sedward 			wwdelete(cmdwin);
18414407Sedward 			reframe();
18514407Sedward 		}
18614407Sedward 	}
18714407Sedward 	/*
18814071Sedward 	if (selwin != 0)
18914071Sedward 		Woncursor(selwin->ww_win, 0);
19014407Sedward 	*/
19113977Sedward }
19213977Sedward 
19313977Sedward struct ww *
19413977Sedward getwin()
19513977Sedward {
19613977Sedward 	register int c;
19714184Sedward 	struct ww *w = 0;
19813977Sedward 
19914189Sedward 	if (!terse)
20014407Sedward 		(void) wwputs("Which window? ", cmdwin);
20114407Sedward 	wwsetcursor(wwcurrow(cmdwin), wwcurcol(cmdwin));
20213994Sedward 	while ((c = bgetc()) < 0)
20313977Sedward 		bread();
20414407Sedward 	if (debug && c == 'c')
20514407Sedward 		w = cmdwin;
20614407Sedward 	else if (debug && c == 'f')
20714407Sedward 		w = framewin;
20814407Sedward 	else if (c >= '1' && c < NWINDOW + '1')
20914407Sedward 		w = window[c - '1'];
21014407Sedward 	if (w == 0)
21114407Sedward 		wwbell();
21214189Sedward 	if (!terse)
21314407Sedward 		(void) wwputs("\r\n", cmdwin);
21413977Sedward 	return w;
21513977Sedward }
21613977Sedward 
21713977Sedward setselwin(w)
21813977Sedward register struct ww *w;
21913977Sedward {
22014407Sedward 	register struct ww *oldselwin = selwin;
22114184Sedward 
22214184Sedward 	if (w == oldselwin)
22314184Sedward 		return;
22414071Sedward 	if (selwin = w) {
22514407Sedward 		wwdelete(w);
22614407Sedward 		/*
22714407Sedward 		 * Stick it in front of the old selected window,
22814407Sedward 		 * or behind everbody else.
22914407Sedward 		 */
23014407Sedward 		wwadd(w, (oldselwin ? oldselwin : &wwhead)->ww_back);
23114407Sedward 		/*
23214071Sedward 		Woncursor(w->ww_win, 1);
23314407Sedward 		*/
23413977Sedward 	}
23514407Sedward 	/*
23614184Sedward 	if (oldselwin) {
23714184Sedward 		Woncursor(oldselwin->ww_win, 0);
23814184Sedward 	}
23914407Sedward 	*/
24014407Sedward 	reframe();
24113977Sedward }
24213977Sedward 
24314184Sedward labelwin(w)
24413977Sedward register struct ww *w;
24513977Sedward {
24614407Sedward 	int mode = w == selwin ? WWM_REV : 0;
24713977Sedward 
24814407Sedward 	if (w->ww_id >= 0) {
24914407Sedward 		char buf[2];
25014407Sedward 
25114407Sedward 		buf[0] = w->ww_id + '1';
25214407Sedward 		buf[1] = 0;
25314407Sedward 		(void) wwlabel(w, framewin, 1, buf, mode);
25414407Sedward 	}
25514407Sedward 	if (w->ww_label) {
25614407Sedward 		int col;
25714407Sedward 
25814407Sedward 		if (w->ww_center) {
25914407Sedward 			col = (w->ww_w.nc - strlen(w->ww_label)) / 2;
26014407Sedward 			col = MAX(3, col);
26114407Sedward 		} else
26214407Sedward 			col = 3;
26314407Sedward 		(void) wwlabel(w, framewin, col, w->ww_label, mode);
26414407Sedward 	}
26513977Sedward }
266