xref: /csrg-svn/usr.bin/window/cmd.c (revision 14795)
113977Sedward #ifndef lint
2*14795Sedward static	char *sccsid = "@(#)cmd.c	3.5 83/08/22";
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)
1714764Sedward 		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;
7214184Sedward 		case ':':
7314407Sedward 			c_colon();
7414184Sedward 			break;
7514071Sedward 		case 'h':
7614407Sedward 			(void) wwwrite(selwin, "\b", 1);
7714071Sedward 			break;
7814071Sedward 		case 'j':
7914407Sedward 			(void) wwwrite(selwin, "\n", 1);
8014071Sedward 			break;
8114071Sedward 		case 'k':
8214407Sedward 			(void) wwwrite(selwin, "\033A", 2);
8314071Sedward 			break;
8414071Sedward 		case 'l':
8514407Sedward 			(void) wwwrite(selwin, "\033C", 2);
8614071Sedward 			break;
8714711Sedward 		case CTRL(e):
8814711Sedward 			wwscroll(selwin, 1);
8914711Sedward 			break;
9014711Sedward 		case CTRL(y):
9114711Sedward 			wwscroll(selwin, -1);
9214711Sedward 			break;
9314071Sedward 		case CTRL(d):
9414711Sedward 			wwscroll(selwin, selwin->ww_w.nr / 2);
9514071Sedward 			break;
9614071Sedward 		case CTRL(u):
9714711Sedward 			wwscroll(selwin, - selwin->ww_w.nr / 2);
9814071Sedward 			break;
9914071Sedward 		case CTRL(f):
10014711Sedward 			wwscroll(selwin, selwin->ww_w.nr);
10114071Sedward 			break;
10214071Sedward 		case CTRL(b):
10314711Sedward 			wwscroll(selwin, - selwin->ww_w.nr);
10414071Sedward 			break;
10514694Sedward 		case CTRL(s):
10614694Sedward 			(void) write(selwin->ww_pty,
10714694Sedward 				&wwwintty.ww_tchars.t_stopc, 1);
10814694Sedward 			break;
10914694Sedward 		case CTRL(q):
11014694Sedward 			(void) write(selwin->ww_pty,
11114694Sedward 				&wwwintty.ww_tchars.t_startc, 1);
11214694Sedward 			break;
11313977Sedward 		case CTRL(l):
11414407Sedward 			wwredraw();
11513977Sedward 			break;
11613977Sedward 		case '?':
11714407Sedward 			c_help();
11813977Sedward 			break;
11913977Sedward 		case CTRL([):
12013977Sedward 			goto out;
12113977Sedward 		case CTRL(z):
12213977Sedward 			wwsuspend();
12313977Sedward 			break;
12414189Sedward 		case 'q':
12514407Sedward 			c_quit();
12614025Sedward 			if (quit)
12714025Sedward 				goto out;
12814025Sedward 			break;
129*14795Sedward 		/* undocumented commands */
130*14795Sedward 		case 's':
131*14795Sedward 			c_stat();
13214189Sedward 			break;
133*14795Sedward 		case 't':
134*14795Sedward 			c_time(RUSAGE_SELF);
135*14795Sedward 			break;
136*14795Sedward 		case 'T':
137*14795Sedward 			c_time(RUSAGE_CHILDREN);
138*14795Sedward 			break;
139*14795Sedward 		/* debugging commands */
140*14795Sedward 		case 'M':
141*14795Sedward 			if (!debug)
142*14795Sedward 				goto badcmd;
143*14795Sedward 			wwdumpsmap();
144*14795Sedward 			break;
145*14795Sedward 		case 'V':
146*14795Sedward 			if (!debug)
147*14795Sedward 				goto badcmd;
148*14795Sedward 			if ((w = getwin()) != 0)
149*14795Sedward 				wwdumpnvis(w);
150*14795Sedward 			break;
151*14795Sedward 		case 'D':
152*14795Sedward 			if (!debug)
153*14795Sedward 				goto badcmd;
154*14795Sedward 			if ((w = getwin()) != 0)
155*14795Sedward 				wwdumpcov(w);
156*14795Sedward 			break;
157*14795Sedward 		case 'W':
158*14795Sedward 			if (!debug)
159*14795Sedward 				goto badcmd;
160*14795Sedward 			if ((w = getwin()) != 0)
161*14795Sedward 				wwdumpwin(w);
162*14795Sedward 			break;
16313977Sedward 		default:
164*14795Sedward 		badcmd:
16514177Sedward 			if (c == escapec) {
16614407Sedward 				(void) write(selwin->ww_pty, &escapec, 1);
16714177Sedward 				goto out;
16814177Sedward 			}
16914189Sedward 			if (!terse)
17014407Sedward 				wwbell();
17114407Sedward 			error("Type ? for help.");
17213977Sedward 			break;
17313977Sedward 		}
17413977Sedward 	}
17514189Sedward 	if (terse)
17614189Sedward 		wwsetcursor(0, 0);
17714189Sedward 	else {
17814189Sedward 		if (!terse)
17914407Sedward 			(void) wwputs("Command: ", cmdwin);
18014407Sedward 		wwsetcursor(wwcurrow(cmdwin), wwcurcol(cmdwin));
18114189Sedward 	}
18213994Sedward 	while (bpeekc() < 0)
18313977Sedward 		bread();
18413977Sedward 	goto top;
18513977Sedward out:
18614407Sedward 	if (!quit) {
18714407Sedward 		curwin = selwin;
18814407Sedward 		if (!terse) {
18914407Sedward 			wwdelete(cmdwin);
19014407Sedward 			reframe();
19114407Sedward 		}
19214407Sedward 	}
19314071Sedward 	if (selwin != 0)
19414764Sedward 		wwcursor(selwin, 0);
19513977Sedward }
19613977Sedward 
19713977Sedward struct ww *
19813977Sedward getwin()
19913977Sedward {
20013977Sedward 	register int c;
20114184Sedward 	struct ww *w = 0;
20213977Sedward 
20314189Sedward 	if (!terse)
20414407Sedward 		(void) wwputs("Which window? ", cmdwin);
20514407Sedward 	wwsetcursor(wwcurrow(cmdwin), wwcurcol(cmdwin));
20613994Sedward 	while ((c = bgetc()) < 0)
20713977Sedward 		bread();
20814407Sedward 	if (debug && c == 'c')
20914407Sedward 		w = cmdwin;
21014407Sedward 	else if (debug && c == 'f')
21114407Sedward 		w = framewin;
212*14795Sedward 	else if (debug && c == 'b')
213*14795Sedward 		w = boxwin;
21414407Sedward 	else if (c >= '1' && c < NWINDOW + '1')
21514407Sedward 		w = window[c - '1'];
21614407Sedward 	if (w == 0)
21714407Sedward 		wwbell();
21814189Sedward 	if (!terse)
21914407Sedward 		(void) wwputs("\r\n", cmdwin);
22013977Sedward 	return w;
22113977Sedward }
22213977Sedward 
22313977Sedward setselwin(w)
22413977Sedward register struct ww *w;
22513977Sedward {
22614407Sedward 	register struct ww *oldselwin = selwin;
22714184Sedward 
22814184Sedward 	if (w == oldselwin)
22914184Sedward 		return;
23014071Sedward 	if (selwin = w) {
23114407Sedward 		wwdelete(w);
23214407Sedward 		/*
23314407Sedward 		 * Stick it in front of the old selected window,
23414407Sedward 		 * or behind everbody else.
23514407Sedward 		 */
23614407Sedward 		wwadd(w, (oldselwin ? oldselwin : &wwhead)->ww_back);
23713977Sedward 	}
23814407Sedward 	reframe();
23913977Sedward }
24013977Sedward 
24114184Sedward labelwin(w)
24213977Sedward register struct ww *w;
24313977Sedward {
24414407Sedward 	int mode = w == selwin ? WWM_REV : 0;
24513977Sedward 
24614407Sedward 	if (w->ww_id >= 0) {
24714407Sedward 		char buf[2];
24814407Sedward 
24914407Sedward 		buf[0] = w->ww_id + '1';
25014407Sedward 		buf[1] = 0;
25114407Sedward 		(void) wwlabel(w, framewin, 1, buf, mode);
25214407Sedward 	}
25314407Sedward 	if (w->ww_label) {
25414407Sedward 		int col;
25514407Sedward 
25614407Sedward 		if (w->ww_center) {
25714407Sedward 			col = (w->ww_w.nc - strlen(w->ww_label)) / 2;
25814407Sedward 			col = MAX(3, col);
25914407Sedward 		} else
26014407Sedward 			col = 3;
26114407Sedward 		(void) wwlabel(w, framewin, col, w->ww_label, mode);
26214407Sedward 	}
26313977Sedward }
264