xref: /csrg-svn/usr.bin/window/cmd.c (revision 14854)
113977Sedward #ifndef lint
2*14854Sedward static	char *sccsid = "@(#)cmd.c	3.8 83/08/26";
313977Sedward #endif
413977Sedward 
513977Sedward #include "defs.h"
613977Sedward 
713977Sedward docmd()
813977Sedward {
913977Sedward 	register char c;
1013977Sedward 	register struct ww *w;
1113977Sedward 
1214177Sedward 	if (!terse)
1314407Sedward 		wwadd(cmdwin, &wwhead);
1414071Sedward 	if (selwin != 0)
1514764Sedward 		wwcursor(selwin, 1);
1614189Sedward top:
1713977Sedward 	while ((c = bgetc()) >= 0) {
1814189Sedward 		if (!terse)
1914407Sedward 			(void) wwputs("\r\n", cmdwin);
2013977Sedward 		switch (c) {
2114177Sedward 		default:
2214177Sedward 			if (c == escapec)
2314177Sedward 				goto foo;
2414177Sedward 			break;
2514071Sedward 		case 'h': case 'j': case 'k': case 'l':
2614711Sedward 		case CTRL(y):
2714711Sedward 		case CTRL(e):
2814071Sedward 		case CTRL(u):
2914071Sedward 		case CTRL(d):
3014071Sedward 		case CTRL(b):
3114071Sedward 		case CTRL(f):
3214694Sedward 		case CTRL(s):
3314694Sedward 		case CTRL(q):
3413977Sedward 		case CTRL([):
3514177Sedward 		foo:
3613977Sedward 			if (selwin == 0) {
3714407Sedward 				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':
4414407Sedward 			if ((w = window[c - '1']) == 0) {
4514407Sedward 				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)
5614407Sedward 				c_close(w);
5714071Sedward 			break;
5813977Sedward 		case 'C':
5914407Sedward 			c_close((struct ww *)0);
6014071Sedward 			break;
6113977Sedward 		case 'w':
6214407Sedward 			c_window();
6313977Sedward 			break;
6414184Sedward 		case 'S':
6514407Sedward 			c_show();
6613994Sedward 			break;
6714189Sedward 		case 'L':
6814407Sedward 			c_list();
6914189Sedward 			break;
7014184Sedward 		case ':':
7114407Sedward 			c_colon();
7214184Sedward 			break;
7314071Sedward 		case 'h':
7414407Sedward 			(void) wwwrite(selwin, "\b", 1);
7514071Sedward 			break;
7614071Sedward 		case 'j':
7714407Sedward 			(void) wwwrite(selwin, "\n", 1);
7814071Sedward 			break;
7914071Sedward 		case 'k':
8014407Sedward 			(void) wwwrite(selwin, "\033A", 2);
8114071Sedward 			break;
8214071Sedward 		case 'l':
8314407Sedward 			(void) wwwrite(selwin, "\033C", 2);
8414071Sedward 			break;
8514711Sedward 		case CTRL(e):
8614711Sedward 			wwscroll(selwin, 1);
8714711Sedward 			break;
8814711Sedward 		case CTRL(y):
8914711Sedward 			wwscroll(selwin, -1);
9014711Sedward 			break;
9114071Sedward 		case CTRL(d):
9214711Sedward 			wwscroll(selwin, selwin->ww_w.nr / 2);
9314071Sedward 			break;
9414071Sedward 		case CTRL(u):
9514711Sedward 			wwscroll(selwin, - selwin->ww_w.nr / 2);
9614071Sedward 			break;
9714071Sedward 		case CTRL(f):
9814711Sedward 			wwscroll(selwin, selwin->ww_w.nr);
9914071Sedward 			break;
10014071Sedward 		case CTRL(b):
10114711Sedward 			wwscroll(selwin, - selwin->ww_w.nr);
10214071Sedward 			break;
10314694Sedward 		case CTRL(s):
10414694Sedward 			(void) write(selwin->ww_pty,
10514694Sedward 				&wwwintty.ww_tchars.t_stopc, 1);
10614694Sedward 			break;
10714694Sedward 		case CTRL(q):
10814694Sedward 			(void) write(selwin->ww_pty,
10914694Sedward 				&wwwintty.ww_tchars.t_startc, 1);
11014694Sedward 			break;
11113977Sedward 		case CTRL(l):
11214407Sedward 			wwredraw();
11313977Sedward 			break;
11413977Sedward 		case '?':
11514407Sedward 			c_help();
11613977Sedward 			break;
11713977Sedward 		case CTRL([):
11813977Sedward 			goto out;
11913977Sedward 		case CTRL(z):
12013977Sedward 			wwsuspend();
12113977Sedward 			break;
12214189Sedward 		case 'q':
12314407Sedward 			c_quit();
12414025Sedward 			if (quit)
12514025Sedward 				goto out;
12614025Sedward 			break;
12714795Sedward 		/* undocumented commands */
12814795Sedward 		case 's':
12914795Sedward 			c_stat();
13014189Sedward 			break;
13114795Sedward 		case 't':
13214795Sedward 			c_time(RUSAGE_SELF);
13314795Sedward 			break;
13414795Sedward 		case 'T':
13514795Sedward 			c_time(RUSAGE_CHILDREN);
13614795Sedward 			break;
13714795Sedward 		/* debugging commands */
13814795Sedward 		case 'M':
13914795Sedward 			if (!debug)
14014795Sedward 				goto badcmd;
14114795Sedward 			wwdumpsmap();
14214795Sedward 			break;
14314795Sedward 		case 'V':
14414795Sedward 			if (!debug)
14514795Sedward 				goto badcmd;
14614795Sedward 			if ((w = getwin()) != 0)
14714795Sedward 				wwdumpnvis(w);
14814795Sedward 			break;
14914795Sedward 		case 'D':
15014795Sedward 			if (!debug)
15114795Sedward 				goto badcmd;
15214795Sedward 			if ((w = getwin()) != 0)
15314795Sedward 				wwdumpcov(w);
15414795Sedward 			break;
15514795Sedward 		case 'W':
15614795Sedward 			if (!debug)
15714795Sedward 				goto badcmd;
15814795Sedward 			if ((w = getwin()) != 0)
15914795Sedward 				wwdumpwin(w);
16014795Sedward 			break;
16113977Sedward 		default:
16214795Sedward 		badcmd:
16314177Sedward 			if (c == escapec) {
16414407Sedward 				(void) write(selwin->ww_pty, &escapec, 1);
16514177Sedward 				goto out;
16614177Sedward 			}
16714189Sedward 			if (!terse)
16814407Sedward 				wwbell();
16914407Sedward 			error("Type ? for help.");
17013977Sedward 			break;
17113977Sedward 		}
17213977Sedward 	}
17314189Sedward 	if (terse)
17414189Sedward 		wwsetcursor(0, 0);
17514189Sedward 	else {
17614189Sedward 		if (!terse)
17714407Sedward 			(void) wwputs("Command: ", cmdwin);
17814407Sedward 		wwsetcursor(wwcurrow(cmdwin), wwcurcol(cmdwin));
17914189Sedward 	}
18013994Sedward 	while (bpeekc() < 0)
18113977Sedward 		bread();
18213977Sedward 	goto top;
18313977Sedward out:
18414407Sedward 	if (!quit) {
18514407Sedward 		curwin = selwin;
18614407Sedward 		if (!terse) {
18714407Sedward 			wwdelete(cmdwin);
18814407Sedward 			reframe();
18914407Sedward 		}
19014407Sedward 	}
19114071Sedward 	if (selwin != 0)
19214764Sedward 		wwcursor(selwin, 0);
19313977Sedward }
19413977Sedward 
19513977Sedward struct ww *
19613977Sedward getwin()
19713977Sedward {
19813977Sedward 	register int c;
19914184Sedward 	struct ww *w = 0;
20013977Sedward 
20114189Sedward 	if (!terse)
20214407Sedward 		(void) wwputs("Which window? ", cmdwin);
20314407Sedward 	wwsetcursor(wwcurrow(cmdwin), wwcurcol(cmdwin));
20413994Sedward 	while ((c = bgetc()) < 0)
20513977Sedward 		bread();
20614407Sedward 	if (debug && c == 'c')
20714407Sedward 		w = cmdwin;
20814407Sedward 	else if (debug && c == 'f')
20914407Sedward 		w = framewin;
21014795Sedward 	else if (debug && c == 'b')
21114795Sedward 		w = boxwin;
21214407Sedward 	else if (c >= '1' && c < NWINDOW + '1')
21314407Sedward 		w = window[c - '1'];
21414407Sedward 	if (w == 0)
21514407Sedward 		wwbell();
21614189Sedward 	if (!terse)
21714407Sedward 		(void) wwputs("\r\n", cmdwin);
21813977Sedward 	return w;
21913977Sedward }
22013977Sedward 
22113977Sedward setselwin(w)
22214847Sedward struct ww *w;
22314847Sedward {
22414847Sedward 	if ((selwin = w) != 0)
22514847Sedward 		front(w);
22614847Sedward }
22714847Sedward 
22814847Sedward front(w)
22913977Sedward register struct ww *w;
23013977Sedward {
23114847Sedward 	char moved = 0;
23214184Sedward 
23314847Sedward 	while (w->ww_back != framewin) {
23414847Sedward 		wwmoveup(w);
23514847Sedward 		moved = 1;
23613977Sedward 	}
23714847Sedward 	if (moved)
23814847Sedward 		reframe();
23913977Sedward }
24013977Sedward 
24114847Sedward reframe()
24214847Sedward {
24314847Sedward 	register struct ww *w;
24414847Sedward 
24514847Sedward 	wwunframe(framewin);
24614847Sedward 	for (w = wwhead.ww_back; w != &wwhead; w = w->ww_back)
24714847Sedward 		if (w->ww_hasframe) {
24814847Sedward 			wwframe(w, framewin);
24914847Sedward 			labelwin(w);
25014847Sedward 		}
25114847Sedward }
25214847Sedward 
25314184Sedward labelwin(w)
25413977Sedward register struct ww *w;
25513977Sedward {
25614407Sedward 	int mode = w == selwin ? WWM_REV : 0;
25713977Sedward 
25814407Sedward 	if (w->ww_id >= 0) {
25914407Sedward 		char buf[2];
26014407Sedward 
26114407Sedward 		buf[0] = w->ww_id + '1';
26214407Sedward 		buf[1] = 0;
263*14854Sedward 		wwlabel(w, framewin, 1, buf, mode);
26414407Sedward 	}
26514407Sedward 	if (w->ww_label) {
26614407Sedward 		int col;
26714407Sedward 
26814407Sedward 		if (w->ww_center) {
26914407Sedward 			col = (w->ww_w.nc - strlen(w->ww_label)) / 2;
27014407Sedward 			col = MAX(3, col);
27114407Sedward 		} else
27214407Sedward 			col = 3;
273*14854Sedward 		wwlabel(w, framewin, col, w->ww_label, mode);
27414407Sedward 	}
27513977Sedward }
276