xref: /csrg-svn/usr.bin/window/cmd.c (revision 16304)
113977Sedward #ifndef lint
2*16304Sedward static	char *sccsid = "@(#)cmd.c	3.26 84/04/07";
313977Sedward #endif
413977Sedward 
513977Sedward #include "defs.h"
613977Sedward 
713977Sedward docmd()
813977Sedward {
913977Sedward 	register char c;
1013977Sedward 	register struct ww *w;
1116280Sedward 	char out = 0;
1213977Sedward 
1314893Sedward 	for (;;) {
1415871Sedward 		while ((c = wwgetc()) >= 0) {
1514893Sedward 			if (!terse)
1616113Sedward 				wwputs("\r\n", cmdwin);
1714893Sedward 			switch (c) {
1814893Sedward 			default:
1914893Sedward 				if (c == escapec)
2014893Sedward 					goto foo;
2113977Sedward 				break;
2214893Sedward 			case 'h': case 'j': case 'k': case 'l':
2314893Sedward 			case CTRL(y):
2414893Sedward 			case CTRL(e):
2514893Sedward 			case CTRL(u):
2614893Sedward 			case CTRL(d):
2714893Sedward 			case CTRL(b):
2814893Sedward 			case CTRL(f):
2914893Sedward 			case CTRL(s):
3014893Sedward 			case CTRL(q):
3114893Sedward 			case CTRL([):
3214893Sedward 			foo:
3314893Sedward 				if (selwin == 0) {
3414893Sedward 					error("No window.");
3514893Sedward 					continue;
3614893Sedward 				}
3713977Sedward 			}
3814893Sedward 			switch (c) {
3914893Sedward 			case '1': case '2': case '3': case '4': case '5':
4014893Sedward 			case '6': case '7': case '8': case '9':
4114893Sedward 				if ((w = window[c - '1']) == 0) {
4215620Sedward 					error("%c: No such window.", c);
4314893Sedward 					break;
4414893Sedward 				}
4514184Sedward 				setselwin(w);
4614893Sedward 				if (checkproc(selwin) >= 0)
4716280Sedward 					 out = 1;
4814893Sedward 				break;
4914893Sedward 			case '%':
5014893Sedward 				if ((w = getwin()) != 0)
5114893Sedward 					setselwin(w);
5214893Sedward 				break;
5315620Sedward 			case CTRL(^):
5415620Sedward 				if (lastselwin != 0) {
5515620Sedward 					setselwin(lastselwin);
5615620Sedward 					if (checkproc(selwin) >= 0)
5716280Sedward 						out = 1;
5815620Sedward 				} else
5915620Sedward 					error("No previous window.");
6015620Sedward 				break;
6114893Sedward 			case 'c':
6214893Sedward 				if ((w = getwin()) != 0)
6314893Sedward 					c_close(w);
6414893Sedward 				break;
6514893Sedward 			case 'w':
6614893Sedward 				c_window();
6714893Sedward 				break;
6814893Sedward 			case 'm':
6914893Sedward 				if ((w = getwin()) != 0)
7014893Sedward 					c_move(w);
7114893Sedward 				break;
7214998Sedward 			case 'M':
7314998Sedward 				if ((w = getwin()) != 0)
7414998Sedward 					movewin(w, w->ww_altpos.r,
7514998Sedward 						w->ww_altpos.c);
7614998Sedward 				break;
7714893Sedward 			case ':':
7814893Sedward 				c_colon();
7914893Sedward 				break;
8014893Sedward 			case 'h':
8114893Sedward 				(void) wwwrite(selwin, "\b", 1);
8214893Sedward 				break;
8314893Sedward 			case 'j':
8414893Sedward 				(void) wwwrite(selwin, "\n", 1);
8514893Sedward 				break;
8614893Sedward 			case 'k':
8714893Sedward 				(void) wwwrite(selwin, "\033A", 2);
8814893Sedward 				break;
8914893Sedward 			case 'l':
9014893Sedward 				(void) wwwrite(selwin, "\033C", 2);
9114893Sedward 				break;
9214893Sedward 			case CTRL(e):
9314893Sedward 				wwscroll(selwin, 1);
9414893Sedward 				break;
9514893Sedward 			case CTRL(y):
9614893Sedward 				wwscroll(selwin, -1);
9714893Sedward 				break;
9814893Sedward 			case CTRL(d):
9914893Sedward 				wwscroll(selwin, selwin->ww_w.nr / 2);
10014893Sedward 				break;
10114893Sedward 			case CTRL(u):
10214893Sedward 				wwscroll(selwin, - selwin->ww_w.nr / 2);
10314893Sedward 				break;
10414893Sedward 			case CTRL(f):
10514893Sedward 				wwscroll(selwin, selwin->ww_w.nr);
10614893Sedward 				break;
10714893Sedward 			case CTRL(b):
10814893Sedward 				wwscroll(selwin, - selwin->ww_w.nr);
10914893Sedward 				break;
11014893Sedward 			case CTRL(s):
11114893Sedward 				(void) write(selwin->ww_pty,
11214893Sedward 					&wwwintty.ww_tchars.t_stopc, 1);
11314893Sedward 				break;
11414893Sedward 			case CTRL(q):
11514893Sedward 				(void) write(selwin->ww_pty,
11614893Sedward 					&wwwintty.ww_tchars.t_startc, 1);
11714893Sedward 				break;
11814893Sedward 			case CTRL(l):
11914893Sedward 				wwredraw();
12014893Sedward 				break;
12114893Sedward 			case '?':
12214893Sedward 				c_help();
12314893Sedward 				break;
12414893Sedward 			case CTRL([):
12514893Sedward 				if (checkproc(selwin) >= 0)
12616280Sedward 					out = 1;
12714893Sedward 				break;
12814893Sedward 			case CTRL(z):
12914893Sedward 				wwsuspend();
13014893Sedward 				break;
13114893Sedward 			case 'q':
13214893Sedward 				c_quit();
13314893Sedward 				break;
13414998Sedward 			/* debugging stuff */
13514998Sedward 			case '&':
13614998Sedward 				if (debug) {
13714998Sedward 					c_debug();
13814998Sedward 					break;
13914998Sedward 				}
14014893Sedward 			default:
14114893Sedward 				if (c == escapec) {
14214893Sedward 					if (checkproc(selwin) >= 0) {
14314893Sedward 						(void) write(selwin->ww_pty,
14414893Sedward 							&escapec, 1);
14516280Sedward 						out = 1;
14614893Sedward 					}
14714893Sedward 				} else {
14814893Sedward 					if (!terse)
14916113Sedward 						wwputc(CTRL(g), cmdwin);
15014893Sedward 					error("Type ? for help.");
15114893Sedward 				}
15214177Sedward 			}
15314893Sedward 		}
15416280Sedward 		if (out || quit)
15513977Sedward 			break;
15614893Sedward 		if (terse)
15714893Sedward 			wwsetcursor(0, 0);
15814893Sedward 		else {
15916113Sedward 			wwputs("Command: ", cmdwin);
16014893Sedward 			wwcurtowin(cmdwin);
16113977Sedward 		}
16215871Sedward 		while (wwpeekc() < 0)
16315871Sedward 			wwiomux();
16413977Sedward 	}
16516280Sedward 	if (!quit)
16616280Sedward 		setcmd(0);
16713977Sedward }
16813977Sedward 
16913977Sedward struct ww *
17013977Sedward getwin()
17113977Sedward {
17213977Sedward 	register int c;
17314184Sedward 	struct ww *w = 0;
17413977Sedward 
17514189Sedward 	if (!terse)
17616113Sedward 		wwputs("Which window? ", cmdwin);
17714987Sedward 	wwcurtowin(cmdwin);
17815871Sedward 	while ((c = wwgetc()) < 0)
17915871Sedward 		wwiomux();
18014407Sedward 	if (debug && c == 'c')
18114407Sedward 		w = cmdwin;
18214407Sedward 	else if (debug && c == 'f')
18314407Sedward 		w = framewin;
18414795Sedward 	else if (debug && c == 'b')
18514795Sedward 		w = boxwin;
18614407Sedward 	else if (c >= '1' && c < NWINDOW + '1')
18714407Sedward 		w = window[c - '1'];
18814407Sedward 	if (w == 0)
18916113Sedward 		wwputc(CTRL(g), cmdwin);
19014189Sedward 	if (!terse)
19116113Sedward 		wwputs("\r\n", cmdwin);
19213977Sedward 	return w;
19313977Sedward }
19413977Sedward 
19514893Sedward checkproc(w)
19614893Sedward struct ww *w;
19714893Sedward {
19814893Sedward 	if (w->ww_state != WWS_HASPROC) {
19914893Sedward 		error("No process in window.");
20014893Sedward 		return -1;
20114893Sedward 	}
20214893Sedward 	return 0;
20314893Sedward }
20416280Sedward 
20516280Sedward setcmd(new)
20616280Sedward char new;
20716280Sedward {
20816280Sedward 	if (new && !incmd) {
20916280Sedward 		if (!terse)
21016280Sedward 			wwadd(cmdwin, &wwhead);
21116280Sedward 		if (selwin != 0)
21216280Sedward 			wwcursor(selwin, 1);
21316280Sedward 		wwcurwin = 0;
21416280Sedward 	} else if (!new && incmd) {
21516280Sedward 		if (!terse) {
21616280Sedward 			wwdelete(cmdwin);
21716280Sedward 			reframe();
21816280Sedward 		}
21916280Sedward 		if (selwin != 0)
22016280Sedward 			wwcursor(selwin, 0);
22116280Sedward 		wwcurwin = selwin;
22216280Sedward 	}
22316280Sedward 	incmd = new;
22416280Sedward }
22516280Sedward 
22616280Sedward setterse(new)
22716280Sedward char new;
22816280Sedward {
22916280Sedward 	if (incmd)
23016280Sedward 		if (new && !terse) {
23116280Sedward 			wwdelete(cmdwin);
23216280Sedward 			reframe();
23316280Sedward 		} else if (!new && terse)
23416280Sedward 			wwadd(cmdwin, &wwhead);
23516280Sedward 	terse = new;
23616280Sedward }
23716280Sedward 
23816280Sedward /*
23916280Sedward  * Set the current window.
24016280Sedward  */
24116280Sedward setselwin(w)
24216280Sedward struct ww *w;
24316280Sedward {
24416280Sedward 	if (selwin == w)
24516280Sedward 		return;
246*16304Sedward 	if (selwin != 0)
247*16304Sedward 		lastselwin = selwin;
248*16304Sedward 	if ((selwin = w) != 0)
249*16304Sedward 		front(selwin, 1);
25016280Sedward }
251