xref: /csrg-svn/usr.bin/window/cmd.c (revision 14694)
113977Sedward #ifndef lint
2*14694Sedward static	char *sccsid = "@(#)cmd.c	3.2 83/08/17";
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':
3014071Sedward 		case CTRL(u):
3114071Sedward 		case CTRL(d):
3214071Sedward 		case CTRL(b):
3314071Sedward 		case CTRL(f):
34*14694Sedward 		case CTRL(s):
35*14694Sedward 		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;
11114407Sedward 		/*
11214071Sedward 		case CTRL(d):
11314407Sedward 			c_scroll(1);
11414071Sedward 			break;
11514071Sedward 		case CTRL(u):
11614407Sedward 			c_scroll(-1);
11714071Sedward 			break;
11814071Sedward 		case CTRL(f):
11914407Sedward 			c_scroll(2);
12014071Sedward 			break;
12114071Sedward 		case CTRL(b):
12214407Sedward 			c_scroll(-2);
12314071Sedward 			break;
12414407Sedward 		*/
125*14694Sedward 		case CTRL(s):
126*14694Sedward 			(void) write(selwin->ww_pty,
127*14694Sedward 				&wwwintty.ww_tchars.t_stopc, 1);
128*14694Sedward 			break;
129*14694Sedward 		case CTRL(q):
130*14694Sedward 			(void) write(selwin->ww_pty,
131*14694Sedward 				&wwwintty.ww_tchars.t_startc, 1);
132*14694Sedward 			break;
13313977Sedward 		case CTRL(l):
13414407Sedward 			wwredraw();
13513977Sedward 			break;
13613977Sedward 		case '?':
13714407Sedward 			c_help();
13813977Sedward 			break;
13913977Sedward 		case CTRL([):
14013977Sedward 			goto out;
14113977Sedward 		case CTRL(z):
14213977Sedward 			wwsuspend();
14313977Sedward 			break;
14414189Sedward 		case 'q':
14514407Sedward 			c_quit();
14614025Sedward 			if (quit)
14714025Sedward 				goto out;
14814025Sedward 			break;
14914189Sedward 		case '.':
15014407Sedward 			error("Use q to quit.");
15114189Sedward 			break;
15213977Sedward 		default:
15314177Sedward 			if (c == escapec) {
15414407Sedward 				(void) write(selwin->ww_pty, &escapec, 1);
15514177Sedward 				goto out;
15614177Sedward 			}
15714189Sedward 			if (!terse)
15814407Sedward 				wwbell();
15914407Sedward 			error("Type ? for help.");
16013977Sedward 			break;
16113977Sedward 		}
16213977Sedward 	}
16314189Sedward 	if (terse)
16414189Sedward 		wwsetcursor(0, 0);
16514189Sedward 	else {
16614189Sedward 		if (!terse)
16714407Sedward 			(void) wwputs("Command: ", cmdwin);
16814407Sedward 		wwsetcursor(wwcurrow(cmdwin), wwcurcol(cmdwin));
16914189Sedward 	}
17013994Sedward 	while (bpeekc() < 0)
17113977Sedward 		bread();
17213977Sedward 	goto top;
17313977Sedward out:
17414407Sedward 	if (!quit) {
17514407Sedward 		curwin = selwin;
17614407Sedward 		if (!terse) {
17714407Sedward 			wwdelete(cmdwin);
17814407Sedward 			reframe();
17914407Sedward 		}
18014407Sedward 	}
18114407Sedward 	/*
18214071Sedward 	if (selwin != 0)
18314071Sedward 		Woncursor(selwin->ww_win, 0);
18414407Sedward 	*/
18513977Sedward }
18613977Sedward 
18713977Sedward struct ww *
18813977Sedward getwin()
18913977Sedward {
19013977Sedward 	register int c;
19114184Sedward 	struct ww *w = 0;
19213977Sedward 
19314189Sedward 	if (!terse)
19414407Sedward 		(void) wwputs("Which window? ", cmdwin);
19514407Sedward 	wwsetcursor(wwcurrow(cmdwin), wwcurcol(cmdwin));
19613994Sedward 	while ((c = bgetc()) < 0)
19713977Sedward 		bread();
19814407Sedward 	if (debug && c == 'c')
19914407Sedward 		w = cmdwin;
20014407Sedward 	else if (debug && c == 'f')
20114407Sedward 		w = framewin;
20214407Sedward 	else if (c >= '1' && c < NWINDOW + '1')
20314407Sedward 		w = window[c - '1'];
20414407Sedward 	if (w == 0)
20514407Sedward 		wwbell();
20614189Sedward 	if (!terse)
20714407Sedward 		(void) wwputs("\r\n", cmdwin);
20813977Sedward 	return w;
20913977Sedward }
21013977Sedward 
21113977Sedward setselwin(w)
21213977Sedward register struct ww *w;
21313977Sedward {
21414407Sedward 	register struct ww *oldselwin = selwin;
21514184Sedward 
21614184Sedward 	if (w == oldselwin)
21714184Sedward 		return;
21814071Sedward 	if (selwin = w) {
21914407Sedward 		wwdelete(w);
22014407Sedward 		/*
22114407Sedward 		 * Stick it in front of the old selected window,
22214407Sedward 		 * or behind everbody else.
22314407Sedward 		 */
22414407Sedward 		wwadd(w, (oldselwin ? oldselwin : &wwhead)->ww_back);
22514407Sedward 		/*
22614071Sedward 		Woncursor(w->ww_win, 1);
22714407Sedward 		*/
22813977Sedward 	}
22914407Sedward 	/*
23014184Sedward 	if (oldselwin) {
23114184Sedward 		Woncursor(oldselwin->ww_win, 0);
23214184Sedward 	}
23314407Sedward 	*/
23414407Sedward 	reframe();
23513977Sedward }
23613977Sedward 
23714184Sedward labelwin(w)
23813977Sedward register struct ww *w;
23913977Sedward {
24014407Sedward 	int mode = w == selwin ? WWM_REV : 0;
24113977Sedward 
24214407Sedward 	if (w->ww_id >= 0) {
24314407Sedward 		char buf[2];
24414407Sedward 
24514407Sedward 		buf[0] = w->ww_id + '1';
24614407Sedward 		buf[1] = 0;
24714407Sedward 		(void) wwlabel(w, framewin, 1, buf, mode);
24814407Sedward 	}
24914407Sedward 	if (w->ww_label) {
25014407Sedward 		int col;
25114407Sedward 
25214407Sedward 		if (w->ww_center) {
25314407Sedward 			col = (w->ww_w.nc - strlen(w->ww_label)) / 2;
25414407Sedward 			col = MAX(3, col);
25514407Sedward 		} else
25614407Sedward 			col = 3;
25714407Sedward 		(void) wwlabel(w, framewin, col, w->ww_label, mode);
25814407Sedward 	}
25913977Sedward }
260