xref: /csrg-svn/usr.bin/window/cmd.c (revision 42954)
118729Sedward /*
233514Sbostic  * Copyright (c) 1983 Regents of the University of California.
333514Sbostic  * All rights reserved.
433514Sbostic  *
5*42954Sbostic  * This code is derived from software contributed to Berkeley by
6*42954Sbostic  * Edward Wang at The University of California, Berkeley.
7*42954Sbostic  *
842835Sbostic  * %sccs.include.redist.c%
918729Sedward  */
1018729Sedward 
1133514Sbostic #ifndef lint
12*42954Sbostic static char sccsid[] = "@(#)cmd.c	3.40 (Berkeley) 06/06/90";
1333514Sbostic #endif /* not lint */
1433514Sbostic 
1513977Sedward #include "defs.h"
1616309Sedward #include "char.h"
1713977Sedward 
1813977Sedward docmd()
1913977Sedward {
2013977Sedward 	register char c;
2113977Sedward 	register struct ww *w;
2216280Sedward 	char out = 0;
2313977Sedward 
2434107Sedward 	while (!out && !quit) {
2534107Sedward 		if ((c = wwgetc()) < 0) {
2634107Sedward 			if (terse)
2734107Sedward 				wwsetcursor(0, 0);
2834107Sedward 			else {
2934107Sedward 				wwputs("Command: ", cmdwin);
3034107Sedward 				wwcurtowin(cmdwin);
3113977Sedward 			}
3234107Sedward 			do
3334107Sedward 				wwiomux();
3434107Sedward 			while ((c = wwgetc()) < 0);
3534107Sedward 		}
3634107Sedward 		if (!terse)
3734107Sedward 			wwputc('\n', cmdwin);
3834107Sedward 		switch (c) {
3934107Sedward 		default:
4034107Sedward 			if (c != escapec)
4114893Sedward 				break;
4234107Sedward 		case 'h': case 'j': case 'k': case 'l':
4334107Sedward 		case ctrl('y'):
4434107Sedward 		case ctrl('e'):
4534107Sedward 		case ctrl('u'):
4634107Sedward 		case ctrl('d'):
4734107Sedward 		case ctrl('b'):
4834107Sedward 		case ctrl('f'):
4934107Sedward 		case ctrl('s'):
5034107Sedward 		case ctrl('q'):
5134107Sedward 		case ctrl('['):
5234107Sedward 			if (selwin == 0) {
5334107Sedward 				error("No window.");
5434107Sedward 				continue;
5534107Sedward 			}
5634107Sedward 		}
5734107Sedward 		switch (c) {
5834107Sedward 		case '1': case '2': case '3': case '4': case '5':
5934107Sedward 		case '6': case '7': case '8': case '9':
6034107Sedward 			if ((w = window[c - '1']) == 0) {
6134107Sedward 				error("%c: No such window.", c);
6214893Sedward 				break;
6334107Sedward 			}
6434107Sedward 			setselwin(w);
6534107Sedward 			if (checkproc(selwin) >= 0)
6634107Sedward 				 out = 1;
6734107Sedward 			break;
6834107Sedward 		case '%':
6934107Sedward 			if ((w = getwin()) != 0)
7034107Sedward 				setselwin(w);
7134107Sedward 			break;
7234107Sedward 		case ctrl('^'):
7334107Sedward 			if (lastselwin != 0) {
7434107Sedward 				setselwin(lastselwin);
7514893Sedward 				if (checkproc(selwin) >= 0)
7616280Sedward 					out = 1;
7734107Sedward 			} else
7834107Sedward 				error("No previous window.");
7934107Sedward 			break;
8034107Sedward 		case 'c':
8134107Sedward 			if ((w = getwin()) != 0)
8234107Sedward 				closewin(w);
8334107Sedward 			break;
8434107Sedward 		case 'w':
8534107Sedward 			c_window();
8634107Sedward 			break;
8734107Sedward 		case 'm':
8834107Sedward 			if ((w = getwin()) != 0)
8934107Sedward 				c_move(w);
9034107Sedward 			break;
9134107Sedward 		case 'M':
9234107Sedward 			if ((w = getwin()) != 0)
9334107Sedward 				movewin(w, w->ww_alt.t, w->ww_alt.l);
9434107Sedward 			break;
9534107Sedward 		case 's':
9634107Sedward 			if ((w = getwin()) != 0)
9734107Sedward 				c_size(w);
9834107Sedward 			break;
9934107Sedward 		case 'S':
10034107Sedward 			if ((w = getwin()) != 0)
10134107Sedward 				sizewin(w, w->ww_alt.nr, w->ww_alt.nc);
10234107Sedward 			break;
10334107Sedward 		case ':':
10434107Sedward 			c_colon();
10534107Sedward 			break;
10634107Sedward 		case 'h':
10734107Sedward 			(void) wwwrite(selwin, "\b", 1);
10834107Sedward 			break;
10934107Sedward 		case 'j':
11034107Sedward 			(void) wwwrite(selwin, "\n", 1);
11134107Sedward 			break;
11234107Sedward 		case 'k':
11334107Sedward 			(void) wwwrite(selwin, "\033A", 2);
11434107Sedward 			break;
11534107Sedward 		case 'l':
11634107Sedward 			(void) wwwrite(selwin, "\033C", 2);
11734107Sedward 			break;
11834107Sedward 		case ctrl('e'):
11934107Sedward 			wwscroll(selwin, 1);
12034107Sedward 			break;
12134107Sedward 		case ctrl('y'):
12234107Sedward 			wwscroll(selwin, -1);
12334107Sedward 			break;
12434107Sedward 		case ctrl('d'):
12534107Sedward 			wwscroll(selwin, selwin->ww_w.nr / 2);
12634107Sedward 			break;
12734107Sedward 		case ctrl('u'):
12834107Sedward 			wwscroll(selwin, - selwin->ww_w.nr / 2);
12934107Sedward 			break;
13034107Sedward 		case ctrl('f'):
13134107Sedward 			wwscroll(selwin, selwin->ww_w.nr);
13234107Sedward 			break;
13334107Sedward 		case ctrl('b'):
13434107Sedward 			wwscroll(selwin, - selwin->ww_w.nr);
13534107Sedward 			break;
13634107Sedward 		case ctrl('s'):
13734107Sedward 			stopwin(selwin);
13834107Sedward 			break;
13934107Sedward 		case ctrl('q'):
14034107Sedward 			startwin(selwin);
14134107Sedward 			break;
14234107Sedward 		case ctrl('l'):
14334107Sedward 			wwredraw();
14434107Sedward 			break;
14534107Sedward 		case '?':
14634107Sedward 			c_help();
14734107Sedward 			break;
14834107Sedward 		case ctrl('['):
14934107Sedward 			if (checkproc(selwin) >= 0)
15034107Sedward 				out = 1;
15134107Sedward 			break;
15234107Sedward 		case ctrl('z'):
15334107Sedward 			wwsuspend();
15434107Sedward 			break;
15534107Sedward 		case 'q':
15634107Sedward 			c_quit();
15734107Sedward 			break;
15834107Sedward 		/* debugging stuff */
15934107Sedward 		case '&':
16034107Sedward 			if (debug) {
16134107Sedward 				c_debug();
16214893Sedward 				break;
16334107Sedward 			}
16434107Sedward 		default:
16534107Sedward 			if (c == escapec) {
16634107Sedward 				if (checkproc(selwin) >= 0) {
16734107Sedward 					(void) write(selwin->ww_pty,
16834107Sedward 						&escapec, 1);
16934107Sedward 					out = 1;
17014998Sedward 				}
17134107Sedward 			} else {
17234107Sedward 				if (!terse)
17334107Sedward 					wwbell();
17434107Sedward 				error("Type ? for help.");
17514177Sedward 			}
17614893Sedward 		}
17713977Sedward 	}
17816280Sedward 	if (!quit)
17916280Sedward 		setcmd(0);
18013977Sedward }
18113977Sedward 
18213977Sedward struct ww *
18313977Sedward getwin()
18413977Sedward {
18513977Sedward 	register int c;
18614184Sedward 	struct ww *w = 0;
18713977Sedward 
18814189Sedward 	if (!terse)
18916113Sedward 		wwputs("Which window? ", cmdwin);
19014987Sedward 	wwcurtowin(cmdwin);
19115871Sedward 	while ((c = wwgetc()) < 0)
19215871Sedward 		wwiomux();
19314407Sedward 	if (debug && c == 'c')
19414407Sedward 		w = cmdwin;
19514407Sedward 	else if (debug && c == 'f')
19614407Sedward 		w = framewin;
19714795Sedward 	else if (debug && c == 'b')
19814795Sedward 		w = boxwin;
19914407Sedward 	else if (c >= '1' && c < NWINDOW + '1')
20014407Sedward 		w = window[c - '1'];
20131140Sedward 	else if (c == '+')
20231140Sedward 		w = selwin;
20331140Sedward 	else if (c == '-')
20431140Sedward 		w = lastselwin;
20514407Sedward 	if (w == 0)
20616313Sedward 		wwbell();
20714189Sedward 	if (!terse)
20816312Sedward 		wwputc('\n', cmdwin);
20913977Sedward 	return w;
21013977Sedward }
21113977Sedward 
21214893Sedward checkproc(w)
21314893Sedward struct ww *w;
21414893Sedward {
21514893Sedward 	if (w->ww_state != WWS_HASPROC) {
21614893Sedward 		error("No process in window.");
21714893Sedward 		return -1;
21814893Sedward 	}
21914893Sedward 	return 0;
22014893Sedward }
22116280Sedward 
22216280Sedward setcmd(new)
22316280Sedward char new;
22416280Sedward {
22516280Sedward 	if (new && !incmd) {
22616280Sedward 		if (!terse)
22716280Sedward 			wwadd(cmdwin, &wwhead);
22816280Sedward 		if (selwin != 0)
22916280Sedward 			wwcursor(selwin, 1);
23016280Sedward 		wwcurwin = 0;
23116280Sedward 	} else if (!new && incmd) {
23216280Sedward 		if (!terse) {
23316280Sedward 			wwdelete(cmdwin);
23416280Sedward 			reframe();
23516280Sedward 		}
23616280Sedward 		if (selwin != 0)
23716280Sedward 			wwcursor(selwin, 0);
23816280Sedward 		wwcurwin = selwin;
23916280Sedward 	}
24016280Sedward 	incmd = new;
24116280Sedward }
24216280Sedward 
24316280Sedward setterse(new)
24416280Sedward char new;
24516280Sedward {
24616280Sedward 	if (incmd)
24716280Sedward 		if (new && !terse) {
24816280Sedward 			wwdelete(cmdwin);
24916280Sedward 			reframe();
25016280Sedward 		} else if (!new && terse)
25116280Sedward 			wwadd(cmdwin, &wwhead);
25216280Sedward 	terse = new;
25316280Sedward }
25416280Sedward 
25516280Sedward /*
25616280Sedward  * Set the current window.
25716280Sedward  */
25816280Sedward setselwin(w)
25916280Sedward struct ww *w;
26016280Sedward {
26116280Sedward 	if (selwin == w)
26216280Sedward 		return;
26316304Sedward 	if (selwin != 0)
26416304Sedward 		lastselwin = selwin;
26516304Sedward 	if ((selwin = w) != 0)
26616304Sedward 		front(selwin, 1);
26716280Sedward }
268