xref: /csrg-svn/usr.bin/window/cmd.c (revision 18335)
113977Sedward #ifndef lint
2*18335Sedward static char sccsid[] = "@(#)cmd.c	3.32 03/13/85";
313977Sedward #endif
413977Sedward 
513977Sedward #include "defs.h"
616309Sedward #include "char.h"
713977Sedward 
813977Sedward docmd()
913977Sedward {
1013977Sedward 	register char c;
1113977Sedward 	register struct ww *w;
1216280Sedward 	char out = 0;
1313977Sedward 
1414893Sedward 	for (;;) {
1515871Sedward 		while ((c = wwgetc()) >= 0) {
1614893Sedward 			if (!terse)
1716312Sedward 				wwputc('\n', cmdwin);
1814893Sedward 			switch (c) {
1914893Sedward 			default:
2014893Sedward 				if (c == escapec)
2114893Sedward 					goto foo;
2213977Sedward 				break;
2314893Sedward 			case 'h': case 'j': case 'k': case 'l':
2416309Sedward 			case ctrl(y):
2516309Sedward 			case ctrl(e):
2616309Sedward 			case ctrl(u):
2716309Sedward 			case ctrl(d):
2816309Sedward 			case ctrl(b):
2916309Sedward 			case ctrl(f):
3016309Sedward 			case ctrl(s):
3116309Sedward 			case ctrl(q):
3216309Sedward 			case ctrl([):
3314893Sedward 			foo:
3414893Sedward 				if (selwin == 0) {
3514893Sedward 					error("No window.");
3614893Sedward 					continue;
3714893Sedward 				}
3813977Sedward 			}
3914893Sedward 			switch (c) {
4014893Sedward 			case '1': case '2': case '3': case '4': case '5':
4114893Sedward 			case '6': case '7': case '8': case '9':
4214893Sedward 				if ((w = window[c - '1']) == 0) {
4315620Sedward 					error("%c: No such window.", c);
4414893Sedward 					break;
4514893Sedward 				}
4614184Sedward 				setselwin(w);
4714893Sedward 				if (checkproc(selwin) >= 0)
4816280Sedward 					 out = 1;
4914893Sedward 				break;
5014893Sedward 			case '%':
5114893Sedward 				if ((w = getwin()) != 0)
5214893Sedward 					setselwin(w);
5314893Sedward 				break;
5416309Sedward 			case ctrl(^):
5515620Sedward 				if (lastselwin != 0) {
5615620Sedward 					setselwin(lastselwin);
5715620Sedward 					if (checkproc(selwin) >= 0)
5816280Sedward 						out = 1;
5915620Sedward 				} else
6015620Sedward 					error("No previous window.");
6115620Sedward 				break;
6214893Sedward 			case 'c':
6314893Sedward 				if ((w = getwin()) != 0)
6414893Sedward 					c_close(w);
6514893Sedward 				break;
6614893Sedward 			case 'w':
6714893Sedward 				c_window();
6814893Sedward 				break;
6914893Sedward 			case 'm':
7014893Sedward 				if ((w = getwin()) != 0)
7114893Sedward 					c_move(w);
7214893Sedward 				break;
7314998Sedward 			case 'M':
7414998Sedward 				if ((w = getwin()) != 0)
7518204Sedward 					movewin(w, w->ww_alt.t, w->ww_alt.l);
7614998Sedward 				break;
7718204Sedward 			case 's':
7818204Sedward 				if ((w = getwin()) != 0)
7918204Sedward 					c_size(w);
8018204Sedward 				break;
8118204Sedward 			case 'S':
8218204Sedward 				if ((w = getwin()) != 0)
8318204Sedward 					sizewin(w, w->ww_alt.nr, w->ww_alt.nc);
8418204Sedward 				break;
8514893Sedward 			case ':':
8614893Sedward 				c_colon();
8714893Sedward 				break;
8814893Sedward 			case 'h':
8914893Sedward 				(void) wwwrite(selwin, "\b", 1);
9014893Sedward 				break;
9114893Sedward 			case 'j':
9214893Sedward 				(void) wwwrite(selwin, "\n", 1);
9314893Sedward 				break;
9414893Sedward 			case 'k':
9514893Sedward 				(void) wwwrite(selwin, "\033A", 2);
9614893Sedward 				break;
9714893Sedward 			case 'l':
9814893Sedward 				(void) wwwrite(selwin, "\033C", 2);
9914893Sedward 				break;
10016309Sedward 			case ctrl(e):
10114893Sedward 				wwscroll(selwin, 1);
10214893Sedward 				break;
10316309Sedward 			case ctrl(y):
10414893Sedward 				wwscroll(selwin, -1);
10514893Sedward 				break;
10616309Sedward 			case ctrl(d):
10714893Sedward 				wwscroll(selwin, selwin->ww_w.nr / 2);
10814893Sedward 				break;
10916309Sedward 			case ctrl(u):
11014893Sedward 				wwscroll(selwin, - selwin->ww_w.nr / 2);
11114893Sedward 				break;
11216309Sedward 			case ctrl(f):
11314893Sedward 				wwscroll(selwin, selwin->ww_w.nr);
11414893Sedward 				break;
11516309Sedward 			case ctrl(b):
11614893Sedward 				wwscroll(selwin, - selwin->ww_w.nr);
11714893Sedward 				break;
11816309Sedward 			case ctrl(s):
119*18335Sedward 				stopwin(selwin);
12014893Sedward 				break;
12116309Sedward 			case ctrl(q):
122*18335Sedward 				startwin(selwin);
12314893Sedward 				break;
12416309Sedward 			case ctrl(l):
12514893Sedward 				wwredraw();
12614893Sedward 				break;
12714893Sedward 			case '?':
12814893Sedward 				c_help();
12914893Sedward 				break;
13016309Sedward 			case ctrl([):
13114893Sedward 				if (checkproc(selwin) >= 0)
13216280Sedward 					out = 1;
13314893Sedward 				break;
13416309Sedward 			case ctrl(z):
13514893Sedward 				wwsuspend();
13614893Sedward 				break;
13714893Sedward 			case 'q':
13814893Sedward 				c_quit();
13914893Sedward 				break;
14014998Sedward 			/* debugging stuff */
14114998Sedward 			case '&':
14214998Sedward 				if (debug) {
14314998Sedward 					c_debug();
14414998Sedward 					break;
14514998Sedward 				}
14614893Sedward 			default:
14714893Sedward 				if (c == escapec) {
14814893Sedward 					if (checkproc(selwin) >= 0) {
14914893Sedward 						(void) write(selwin->ww_pty,
15014893Sedward 							&escapec, 1);
15116280Sedward 						out = 1;
15214893Sedward 					}
15314893Sedward 				} else {
15414893Sedward 					if (!terse)
15516313Sedward 						wwbell();
15614893Sedward 					error("Type ? for help.");
15714893Sedward 				}
15814177Sedward 			}
15914893Sedward 		}
16016280Sedward 		if (out || quit)
16113977Sedward 			break;
16214893Sedward 		if (terse)
16314893Sedward 			wwsetcursor(0, 0);
16414893Sedward 		else {
16516113Sedward 			wwputs("Command: ", cmdwin);
16614893Sedward 			wwcurtowin(cmdwin);
16713977Sedward 		}
16815871Sedward 		while (wwpeekc() < 0)
16915871Sedward 			wwiomux();
17013977Sedward 	}
17116280Sedward 	if (!quit)
17216280Sedward 		setcmd(0);
17313977Sedward }
17413977Sedward 
17513977Sedward struct ww *
17613977Sedward getwin()
17713977Sedward {
17813977Sedward 	register int c;
17914184Sedward 	struct ww *w = 0;
18013977Sedward 
18114189Sedward 	if (!terse)
18216113Sedward 		wwputs("Which window? ", cmdwin);
18314987Sedward 	wwcurtowin(cmdwin);
18415871Sedward 	while ((c = wwgetc()) < 0)
18515871Sedward 		wwiomux();
18614407Sedward 	if (debug && c == 'c')
18714407Sedward 		w = cmdwin;
18814407Sedward 	else if (debug && c == 'f')
18914407Sedward 		w = framewin;
19014795Sedward 	else if (debug && c == 'b')
19114795Sedward 		w = boxwin;
19214407Sedward 	else if (c >= '1' && c < NWINDOW + '1')
19314407Sedward 		w = window[c - '1'];
19414407Sedward 	if (w == 0)
19516313Sedward 		wwbell();
19614189Sedward 	if (!terse)
19716312Sedward 		wwputc('\n', cmdwin);
19813977Sedward 	return w;
19913977Sedward }
20013977Sedward 
20114893Sedward checkproc(w)
20214893Sedward struct ww *w;
20314893Sedward {
20414893Sedward 	if (w->ww_state != WWS_HASPROC) {
20514893Sedward 		error("No process in window.");
20614893Sedward 		return -1;
20714893Sedward 	}
20814893Sedward 	return 0;
20914893Sedward }
21016280Sedward 
21116280Sedward setcmd(new)
21216280Sedward char new;
21316280Sedward {
21416280Sedward 	if (new && !incmd) {
21516280Sedward 		if (!terse)
21616280Sedward 			wwadd(cmdwin, &wwhead);
21716280Sedward 		if (selwin != 0)
21816280Sedward 			wwcursor(selwin, 1);
21916280Sedward 		wwcurwin = 0;
22016280Sedward 	} else if (!new && incmd) {
22116280Sedward 		if (!terse) {
22216280Sedward 			wwdelete(cmdwin);
22316280Sedward 			reframe();
22416280Sedward 		}
22516280Sedward 		if (selwin != 0)
22616280Sedward 			wwcursor(selwin, 0);
22716280Sedward 		wwcurwin = selwin;
22816280Sedward 	}
22916280Sedward 	incmd = new;
23016280Sedward }
23116280Sedward 
23216280Sedward setterse(new)
23316280Sedward char new;
23416280Sedward {
23516280Sedward 	if (incmd)
23616280Sedward 		if (new && !terse) {
23716280Sedward 			wwdelete(cmdwin);
23816280Sedward 			reframe();
23916280Sedward 		} else if (!new && terse)
24016280Sedward 			wwadd(cmdwin, &wwhead);
24116280Sedward 	terse = new;
24216280Sedward }
24316280Sedward 
24416280Sedward /*
24516280Sedward  * Set the current window.
24616280Sedward  */
24716280Sedward setselwin(w)
24816280Sedward struct ww *w;
24916280Sedward {
25016280Sedward 	if (selwin == w)
25116280Sedward 		return;
25216304Sedward 	if (selwin != 0)
25316304Sedward 		lastselwin = selwin;
25416304Sedward 	if ((selwin = w) != 0)
25516304Sedward 		front(selwin, 1);
25616280Sedward }
257