xref: /csrg-svn/usr.bin/window/cmd.c (revision 14764)
113977Sedward #ifndef lint
2*14764Sedward static	char *sccsid = "@(#)cmd.c	3.4 83/08/19";
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);
1614071Sedward 	if (selwin != 0)
17*14764Sedward 		wwcursor(selwin, 1);
1814189Sedward top:
1913977Sedward 	while ((c = bgetc()) >= 0) {
2014189Sedward 		if (!terse)
2114407Sedward 			(void) wwputs("\r\n", cmdwin);
2213977Sedward 		switch (c) {
2314177Sedward 		default:
2414177Sedward 			if (c == escapec)
2514177Sedward 				goto foo;
2614177Sedward 			break;
2714071Sedward 		case 'h': case 'j': case 'k': case 'l':
2814711Sedward 		case CTRL(y):
2914711Sedward 		case CTRL(e):
3014071Sedward 		case CTRL(u):
3114071Sedward 		case CTRL(d):
3214071Sedward 		case CTRL(b):
3314071Sedward 		case CTRL(f):
3414694Sedward 		case CTRL(s):
3514694Sedward 		case CTRL(q):
3613977Sedward 		case CTRL([):
3714177Sedward 		foo:
3813977Sedward 			if (selwin == 0) {
3914407Sedward 				error("No window.");
4013977Sedward 				continue;
4113977Sedward 			}
4213977Sedward 		}
4313977Sedward 		switch (c) {
4413977Sedward 		case '1': case '2': case '3': case '4': case '5':
4513977Sedward 		case '6': case '7': case '8': case '9':
4614407Sedward 			if ((w = window[c - '1']) == 0) {
4714407Sedward 				wwbell();
4813977Sedward 				break;
4913977Sedward 			}
5013977Sedward 			setselwin(w);
5113977Sedward 			goto out;
5213977Sedward 		case '%':
5314184Sedward 			if ((w = getwin()) != 0)
5414184Sedward 				setselwin(w);
5513977Sedward 			break;
5613977Sedward 		case 'c':
5714184Sedward 			if ((w = getwin()) != 0)
5814407Sedward 				c_close(w);
5914071Sedward 			break;
6013977Sedward 		case 'C':
6114407Sedward 			c_close((struct ww *)0);
6214071Sedward 			break;
6313977Sedward 		case 'w':
6414407Sedward 			c_window();
6513977Sedward 			break;
6614184Sedward 		case 'S':
6714407Sedward 			c_show();
6813994Sedward 			break;
6914189Sedward 		case 'L':
7014407Sedward 			c_list();
7114189Sedward 			break;
7214407Sedward 		case 's':
7314407Sedward 			c_stat();
7414177Sedward 			break;
7514407Sedward 		case 'M':
7614407Sedward 			wwdumpsmap();
7714184Sedward 			break;
7814407Sedward 		case 'V':
7914407Sedward 			if ((w = getwin()) != 0)
8014407Sedward 				wwdumpnvis(w);
8113977Sedward 			break;
8214407Sedward 		case 'D':
8314407Sedward 			if ((w = getwin()) != 0)
8414407Sedward 				wwdumpcov(w);
8513977Sedward 			break;
8614407Sedward 		case 'W':
8714407Sedward 			if ((w = getwin()) != 0)
8814407Sedward 				wwdumpwin(w);
8914080Sedward 			break;
9013977Sedward 		case 't':
9114407Sedward 			c_time(RUSAGE_SELF);
9213977Sedward 			break;
9313977Sedward 		case 'T':
9414407Sedward 			c_time(RUSAGE_CHILDREN);
9513977Sedward 			break;
9614184Sedward 		case ':':
9714407Sedward 			c_colon();
9814184Sedward 			break;
9914071Sedward 		case 'h':
10014407Sedward 			(void) wwwrite(selwin, "\b", 1);
10114071Sedward 			break;
10214071Sedward 		case 'j':
10314407Sedward 			(void) wwwrite(selwin, "\n", 1);
10414071Sedward 			break;
10514071Sedward 		case 'k':
10614407Sedward 			(void) wwwrite(selwin, "\033A", 2);
10714071Sedward 			break;
10814071Sedward 		case 'l':
10914407Sedward 			(void) wwwrite(selwin, "\033C", 2);
11014071Sedward 			break;
11114711Sedward 		case CTRL(e):
11214711Sedward 			wwscroll(selwin, 1);
11314711Sedward 			break;
11414711Sedward 		case CTRL(y):
11514711Sedward 			wwscroll(selwin, -1);
11614711Sedward 			break;
11714071Sedward 		case CTRL(d):
11814711Sedward 			wwscroll(selwin, selwin->ww_w.nr / 2);
11914071Sedward 			break;
12014071Sedward 		case CTRL(u):
12114711Sedward 			wwscroll(selwin, - selwin->ww_w.nr / 2);
12214071Sedward 			break;
12314071Sedward 		case CTRL(f):
12414711Sedward 			wwscroll(selwin, selwin->ww_w.nr);
12514071Sedward 			break;
12614071Sedward 		case CTRL(b):
12714711Sedward 			wwscroll(selwin, - selwin->ww_w.nr);
12814071Sedward 			break;
12914694Sedward 		case CTRL(s):
13014694Sedward 			(void) write(selwin->ww_pty,
13114694Sedward 				&wwwintty.ww_tchars.t_stopc, 1);
13214694Sedward 			break;
13314694Sedward 		case CTRL(q):
13414694Sedward 			(void) write(selwin->ww_pty,
13514694Sedward 				&wwwintty.ww_tchars.t_startc, 1);
13614694Sedward 			break;
13713977Sedward 		case CTRL(l):
13814407Sedward 			wwredraw();
13913977Sedward 			break;
14013977Sedward 		case '?':
14114407Sedward 			c_help();
14213977Sedward 			break;
14313977Sedward 		case CTRL([):
14413977Sedward 			goto out;
14513977Sedward 		case CTRL(z):
14613977Sedward 			wwsuspend();
14713977Sedward 			break;
14814189Sedward 		case 'q':
14914407Sedward 			c_quit();
15014025Sedward 			if (quit)
15114025Sedward 				goto out;
15214025Sedward 			break;
15314189Sedward 		case '.':
15414407Sedward 			error("Use q to quit.");
15514189Sedward 			break;
15613977Sedward 		default:
15714177Sedward 			if (c == escapec) {
15814407Sedward 				(void) write(selwin->ww_pty, &escapec, 1);
15914177Sedward 				goto out;
16014177Sedward 			}
16114189Sedward 			if (!terse)
16214407Sedward 				wwbell();
16314407Sedward 			error("Type ? for help.");
16413977Sedward 			break;
16513977Sedward 		}
16613977Sedward 	}
16714189Sedward 	if (terse)
16814189Sedward 		wwsetcursor(0, 0);
16914189Sedward 	else {
17014189Sedward 		if (!terse)
17114407Sedward 			(void) wwputs("Command: ", cmdwin);
17214407Sedward 		wwsetcursor(wwcurrow(cmdwin), wwcurcol(cmdwin));
17314189Sedward 	}
17413994Sedward 	while (bpeekc() < 0)
17513977Sedward 		bread();
17613977Sedward 	goto top;
17713977Sedward out:
17814407Sedward 	if (!quit) {
17914407Sedward 		curwin = selwin;
18014407Sedward 		if (!terse) {
18114407Sedward 			wwdelete(cmdwin);
18214407Sedward 			reframe();
18314407Sedward 		}
18414407Sedward 	}
18514071Sedward 	if (selwin != 0)
186*14764Sedward 		wwcursor(selwin, 0);
18713977Sedward }
18813977Sedward 
18913977Sedward struct ww *
19013977Sedward getwin()
19113977Sedward {
19213977Sedward 	register int c;
19314184Sedward 	struct ww *w = 0;
19413977Sedward 
19514189Sedward 	if (!terse)
19614407Sedward 		(void) wwputs("Which window? ", cmdwin);
19714407Sedward 	wwsetcursor(wwcurrow(cmdwin), wwcurcol(cmdwin));
19813994Sedward 	while ((c = bgetc()) < 0)
19913977Sedward 		bread();
20014407Sedward 	if (debug && c == 'c')
20114407Sedward 		w = cmdwin;
20214407Sedward 	else if (debug && c == 'f')
20314407Sedward 		w = framewin;
20414407Sedward 	else if (c >= '1' && c < NWINDOW + '1')
20514407Sedward 		w = window[c - '1'];
20614407Sedward 	if (w == 0)
20714407Sedward 		wwbell();
20814189Sedward 	if (!terse)
20914407Sedward 		(void) wwputs("\r\n", cmdwin);
21013977Sedward 	return w;
21113977Sedward }
21213977Sedward 
21313977Sedward setselwin(w)
21413977Sedward register struct ww *w;
21513977Sedward {
21614407Sedward 	register struct ww *oldselwin = selwin;
21714184Sedward 
21814184Sedward 	if (w == oldselwin)
21914184Sedward 		return;
22014071Sedward 	if (selwin = w) {
22114407Sedward 		wwdelete(w);
22214407Sedward 		/*
22314407Sedward 		 * Stick it in front of the old selected window,
22414407Sedward 		 * or behind everbody else.
22514407Sedward 		 */
22614407Sedward 		wwadd(w, (oldselwin ? oldselwin : &wwhead)->ww_back);
22713977Sedward 	}
22814407Sedward 	reframe();
22913977Sedward }
23013977Sedward 
23114184Sedward labelwin(w)
23213977Sedward register struct ww *w;
23313977Sedward {
23414407Sedward 	int mode = w == selwin ? WWM_REV : 0;
23513977Sedward 
23614407Sedward 	if (w->ww_id >= 0) {
23714407Sedward 		char buf[2];
23814407Sedward 
23914407Sedward 		buf[0] = w->ww_id + '1';
24014407Sedward 		buf[1] = 0;
24114407Sedward 		(void) wwlabel(w, framewin, 1, buf, mode);
24214407Sedward 	}
24314407Sedward 	if (w->ww_label) {
24414407Sedward 		int col;
24514407Sedward 
24614407Sedward 		if (w->ww_center) {
24714407Sedward 			col = (w->ww_w.nc - strlen(w->ww_label)) / 2;
24814407Sedward 			col = MAX(3, col);
24914407Sedward 		} else
25014407Sedward 			col = 3;
25114407Sedward 		(void) wwlabel(w, framewin, col, w->ww_label, mode);
25214407Sedward 	}
25313977Sedward }
254