xref: /csrg-svn/usr.bin/window/cmd.c (revision 16309)
113977Sedward #ifndef lint
2*16309Sedward static	char *sccsid = "@(#)cmd.c	3.27 84/04/08";
313977Sedward #endif
413977Sedward 
513977Sedward #include "defs.h"
6*16309Sedward #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)
1716113Sedward 				wwputs("\r\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':
24*16309Sedward 			case ctrl(y):
25*16309Sedward 			case ctrl(e):
26*16309Sedward 			case ctrl(u):
27*16309Sedward 			case ctrl(d):
28*16309Sedward 			case ctrl(b):
29*16309Sedward 			case ctrl(f):
30*16309Sedward 			case ctrl(s):
31*16309Sedward 			case ctrl(q):
32*16309Sedward 			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;
54*16309Sedward 			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)
7514998Sedward 					movewin(w, w->ww_altpos.r,
7614998Sedward 						w->ww_altpos.c);
7714998Sedward 				break;
7814893Sedward 			case ':':
7914893Sedward 				c_colon();
8014893Sedward 				break;
8114893Sedward 			case 'h':
8214893Sedward 				(void) wwwrite(selwin, "\b", 1);
8314893Sedward 				break;
8414893Sedward 			case 'j':
8514893Sedward 				(void) wwwrite(selwin, "\n", 1);
8614893Sedward 				break;
8714893Sedward 			case 'k':
8814893Sedward 				(void) wwwrite(selwin, "\033A", 2);
8914893Sedward 				break;
9014893Sedward 			case 'l':
9114893Sedward 				(void) wwwrite(selwin, "\033C", 2);
9214893Sedward 				break;
93*16309Sedward 			case ctrl(e):
9414893Sedward 				wwscroll(selwin, 1);
9514893Sedward 				break;
96*16309Sedward 			case ctrl(y):
9714893Sedward 				wwscroll(selwin, -1);
9814893Sedward 				break;
99*16309Sedward 			case ctrl(d):
10014893Sedward 				wwscroll(selwin, selwin->ww_w.nr / 2);
10114893Sedward 				break;
102*16309Sedward 			case ctrl(u):
10314893Sedward 				wwscroll(selwin, - selwin->ww_w.nr / 2);
10414893Sedward 				break;
105*16309Sedward 			case ctrl(f):
10614893Sedward 				wwscroll(selwin, selwin->ww_w.nr);
10714893Sedward 				break;
108*16309Sedward 			case ctrl(b):
10914893Sedward 				wwscroll(selwin, - selwin->ww_w.nr);
11014893Sedward 				break;
111*16309Sedward 			case ctrl(s):
11214893Sedward 				(void) write(selwin->ww_pty,
11314893Sedward 					&wwwintty.ww_tchars.t_stopc, 1);
11414893Sedward 				break;
115*16309Sedward 			case ctrl(q):
11614893Sedward 				(void) write(selwin->ww_pty,
11714893Sedward 					&wwwintty.ww_tchars.t_startc, 1);
11814893Sedward 				break;
119*16309Sedward 			case ctrl(l):
12014893Sedward 				wwredraw();
12114893Sedward 				break;
12214893Sedward 			case '?':
12314893Sedward 				c_help();
12414893Sedward 				break;
125*16309Sedward 			case ctrl([):
12614893Sedward 				if (checkproc(selwin) >= 0)
12716280Sedward 					out = 1;
12814893Sedward 				break;
129*16309Sedward 			case ctrl(z):
13014893Sedward 				wwsuspend();
13114893Sedward 				break;
13214893Sedward 			case 'q':
13314893Sedward 				c_quit();
13414893Sedward 				break;
13514998Sedward 			/* debugging stuff */
13614998Sedward 			case '&':
13714998Sedward 				if (debug) {
13814998Sedward 					c_debug();
13914998Sedward 					break;
14014998Sedward 				}
14114893Sedward 			default:
14214893Sedward 				if (c == escapec) {
14314893Sedward 					if (checkproc(selwin) >= 0) {
14414893Sedward 						(void) write(selwin->ww_pty,
14514893Sedward 							&escapec, 1);
14616280Sedward 						out = 1;
14714893Sedward 					}
14814893Sedward 				} else {
14914893Sedward 					if (!terse)
150*16309Sedward 						wwputc(ctrl(g), cmdwin);
15114893Sedward 					error("Type ? for help.");
15214893Sedward 				}
15314177Sedward 			}
15414893Sedward 		}
15516280Sedward 		if (out || quit)
15613977Sedward 			break;
15714893Sedward 		if (terse)
15814893Sedward 			wwsetcursor(0, 0);
15914893Sedward 		else {
16016113Sedward 			wwputs("Command: ", cmdwin);
16114893Sedward 			wwcurtowin(cmdwin);
16213977Sedward 		}
16315871Sedward 		while (wwpeekc() < 0)
16415871Sedward 			wwiomux();
16513977Sedward 	}
16616280Sedward 	if (!quit)
16716280Sedward 		setcmd(0);
16813977Sedward }
16913977Sedward 
17013977Sedward struct ww *
17113977Sedward getwin()
17213977Sedward {
17313977Sedward 	register int c;
17414184Sedward 	struct ww *w = 0;
17513977Sedward 
17614189Sedward 	if (!terse)
17716113Sedward 		wwputs("Which window? ", cmdwin);
17814987Sedward 	wwcurtowin(cmdwin);
17915871Sedward 	while ((c = wwgetc()) < 0)
18015871Sedward 		wwiomux();
18114407Sedward 	if (debug && c == 'c')
18214407Sedward 		w = cmdwin;
18314407Sedward 	else if (debug && c == 'f')
18414407Sedward 		w = framewin;
18514795Sedward 	else if (debug && c == 'b')
18614795Sedward 		w = boxwin;
18714407Sedward 	else if (c >= '1' && c < NWINDOW + '1')
18814407Sedward 		w = window[c - '1'];
18914407Sedward 	if (w == 0)
190*16309Sedward 		wwputc(ctrl(g), cmdwin);
19114189Sedward 	if (!terse)
19216113Sedward 		wwputs("\r\n", cmdwin);
19313977Sedward 	return w;
19413977Sedward }
19513977Sedward 
19614893Sedward checkproc(w)
19714893Sedward struct ww *w;
19814893Sedward {
19914893Sedward 	if (w->ww_state != WWS_HASPROC) {
20014893Sedward 		error("No process in window.");
20114893Sedward 		return -1;
20214893Sedward 	}
20314893Sedward 	return 0;
20414893Sedward }
20516280Sedward 
20616280Sedward setcmd(new)
20716280Sedward char new;
20816280Sedward {
20916280Sedward 	if (new && !incmd) {
21016280Sedward 		if (!terse)
21116280Sedward 			wwadd(cmdwin, &wwhead);
21216280Sedward 		if (selwin != 0)
21316280Sedward 			wwcursor(selwin, 1);
21416280Sedward 		wwcurwin = 0;
21516280Sedward 	} else if (!new && incmd) {
21616280Sedward 		if (!terse) {
21716280Sedward 			wwdelete(cmdwin);
21816280Sedward 			reframe();
21916280Sedward 		}
22016280Sedward 		if (selwin != 0)
22116280Sedward 			wwcursor(selwin, 0);
22216280Sedward 		wwcurwin = selwin;
22316280Sedward 	}
22416280Sedward 	incmd = new;
22516280Sedward }
22616280Sedward 
22716280Sedward setterse(new)
22816280Sedward char new;
22916280Sedward {
23016280Sedward 	if (incmd)
23116280Sedward 		if (new && !terse) {
23216280Sedward 			wwdelete(cmdwin);
23316280Sedward 			reframe();
23416280Sedward 		} else if (!new && terse)
23516280Sedward 			wwadd(cmdwin, &wwhead);
23616280Sedward 	terse = new;
23716280Sedward }
23816280Sedward 
23916280Sedward /*
24016280Sedward  * Set the current window.
24116280Sedward  */
24216280Sedward setselwin(w)
24316280Sedward struct ww *w;
24416280Sedward {
24516280Sedward 	if (selwin == w)
24616280Sedward 		return;
24716304Sedward 	if (selwin != 0)
24816304Sedward 		lastselwin = selwin;
24916304Sedward 	if ((selwin = w) != 0)
25016304Sedward 		front(selwin, 1);
25116280Sedward }
252