xref: /csrg-svn/usr.bin/window/cmd.c (revision 42835)
118729Sedward /*
233514Sbostic  * Copyright (c) 1983 Regents of the University of California.
333514Sbostic  * All rights reserved.
433514Sbostic  *
5*42835Sbostic  * %sccs.include.redist.c%
618729Sedward  */
718729Sedward 
833514Sbostic #ifndef lint
9*42835Sbostic static char sccsid[] = "@(#)cmd.c	3.39 (Berkeley) 06/02/90";
1033514Sbostic #endif /* not lint */
1133514Sbostic 
1213977Sedward #include "defs.h"
1316309Sedward #include "char.h"
1413977Sedward 
1513977Sedward docmd()
1613977Sedward {
1713977Sedward 	register char c;
1813977Sedward 	register struct ww *w;
1916280Sedward 	char out = 0;
2013977Sedward 
2134107Sedward 	while (!out && !quit) {
2234107Sedward 		if ((c = wwgetc()) < 0) {
2334107Sedward 			if (terse)
2434107Sedward 				wwsetcursor(0, 0);
2534107Sedward 			else {
2634107Sedward 				wwputs("Command: ", cmdwin);
2734107Sedward 				wwcurtowin(cmdwin);
2813977Sedward 			}
2934107Sedward 			do
3034107Sedward 				wwiomux();
3134107Sedward 			while ((c = wwgetc()) < 0);
3234107Sedward 		}
3334107Sedward 		if (!terse)
3434107Sedward 			wwputc('\n', cmdwin);
3534107Sedward 		switch (c) {
3634107Sedward 		default:
3734107Sedward 			if (c != escapec)
3814893Sedward 				break;
3934107Sedward 		case 'h': case 'j': case 'k': case 'l':
4034107Sedward 		case ctrl('y'):
4134107Sedward 		case ctrl('e'):
4234107Sedward 		case ctrl('u'):
4334107Sedward 		case ctrl('d'):
4434107Sedward 		case ctrl('b'):
4534107Sedward 		case ctrl('f'):
4634107Sedward 		case ctrl('s'):
4734107Sedward 		case ctrl('q'):
4834107Sedward 		case ctrl('['):
4934107Sedward 			if (selwin == 0) {
5034107Sedward 				error("No window.");
5134107Sedward 				continue;
5234107Sedward 			}
5334107Sedward 		}
5434107Sedward 		switch (c) {
5534107Sedward 		case '1': case '2': case '3': case '4': case '5':
5634107Sedward 		case '6': case '7': case '8': case '9':
5734107Sedward 			if ((w = window[c - '1']) == 0) {
5834107Sedward 				error("%c: No such window.", c);
5914893Sedward 				break;
6034107Sedward 			}
6134107Sedward 			setselwin(w);
6234107Sedward 			if (checkproc(selwin) >= 0)
6334107Sedward 				 out = 1;
6434107Sedward 			break;
6534107Sedward 		case '%':
6634107Sedward 			if ((w = getwin()) != 0)
6734107Sedward 				setselwin(w);
6834107Sedward 			break;
6934107Sedward 		case ctrl('^'):
7034107Sedward 			if (lastselwin != 0) {
7134107Sedward 				setselwin(lastselwin);
7214893Sedward 				if (checkproc(selwin) >= 0)
7316280Sedward 					out = 1;
7434107Sedward 			} else
7534107Sedward 				error("No previous window.");
7634107Sedward 			break;
7734107Sedward 		case 'c':
7834107Sedward 			if ((w = getwin()) != 0)
7934107Sedward 				closewin(w);
8034107Sedward 			break;
8134107Sedward 		case 'w':
8234107Sedward 			c_window();
8334107Sedward 			break;
8434107Sedward 		case 'm':
8534107Sedward 			if ((w = getwin()) != 0)
8634107Sedward 				c_move(w);
8734107Sedward 			break;
8834107Sedward 		case 'M':
8934107Sedward 			if ((w = getwin()) != 0)
9034107Sedward 				movewin(w, w->ww_alt.t, w->ww_alt.l);
9134107Sedward 			break;
9234107Sedward 		case 's':
9334107Sedward 			if ((w = getwin()) != 0)
9434107Sedward 				c_size(w);
9534107Sedward 			break;
9634107Sedward 		case 'S':
9734107Sedward 			if ((w = getwin()) != 0)
9834107Sedward 				sizewin(w, w->ww_alt.nr, w->ww_alt.nc);
9934107Sedward 			break;
10034107Sedward 		case ':':
10134107Sedward 			c_colon();
10234107Sedward 			break;
10334107Sedward 		case 'h':
10434107Sedward 			(void) wwwrite(selwin, "\b", 1);
10534107Sedward 			break;
10634107Sedward 		case 'j':
10734107Sedward 			(void) wwwrite(selwin, "\n", 1);
10834107Sedward 			break;
10934107Sedward 		case 'k':
11034107Sedward 			(void) wwwrite(selwin, "\033A", 2);
11134107Sedward 			break;
11234107Sedward 		case 'l':
11334107Sedward 			(void) wwwrite(selwin, "\033C", 2);
11434107Sedward 			break;
11534107Sedward 		case ctrl('e'):
11634107Sedward 			wwscroll(selwin, 1);
11734107Sedward 			break;
11834107Sedward 		case ctrl('y'):
11934107Sedward 			wwscroll(selwin, -1);
12034107Sedward 			break;
12134107Sedward 		case ctrl('d'):
12234107Sedward 			wwscroll(selwin, selwin->ww_w.nr / 2);
12334107Sedward 			break;
12434107Sedward 		case ctrl('u'):
12534107Sedward 			wwscroll(selwin, - selwin->ww_w.nr / 2);
12634107Sedward 			break;
12734107Sedward 		case ctrl('f'):
12834107Sedward 			wwscroll(selwin, selwin->ww_w.nr);
12934107Sedward 			break;
13034107Sedward 		case ctrl('b'):
13134107Sedward 			wwscroll(selwin, - selwin->ww_w.nr);
13234107Sedward 			break;
13334107Sedward 		case ctrl('s'):
13434107Sedward 			stopwin(selwin);
13534107Sedward 			break;
13634107Sedward 		case ctrl('q'):
13734107Sedward 			startwin(selwin);
13834107Sedward 			break;
13934107Sedward 		case ctrl('l'):
14034107Sedward 			wwredraw();
14134107Sedward 			break;
14234107Sedward 		case '?':
14334107Sedward 			c_help();
14434107Sedward 			break;
14534107Sedward 		case ctrl('['):
14634107Sedward 			if (checkproc(selwin) >= 0)
14734107Sedward 				out = 1;
14834107Sedward 			break;
14934107Sedward 		case ctrl('z'):
15034107Sedward 			wwsuspend();
15134107Sedward 			break;
15234107Sedward 		case 'q':
15334107Sedward 			c_quit();
15434107Sedward 			break;
15534107Sedward 		/* debugging stuff */
15634107Sedward 		case '&':
15734107Sedward 			if (debug) {
15834107Sedward 				c_debug();
15914893Sedward 				break;
16034107Sedward 			}
16134107Sedward 		default:
16234107Sedward 			if (c == escapec) {
16334107Sedward 				if (checkproc(selwin) >= 0) {
16434107Sedward 					(void) write(selwin->ww_pty,
16534107Sedward 						&escapec, 1);
16634107Sedward 					out = 1;
16714998Sedward 				}
16834107Sedward 			} else {
16934107Sedward 				if (!terse)
17034107Sedward 					wwbell();
17134107Sedward 				error("Type ? for help.");
17214177Sedward 			}
17314893Sedward 		}
17413977Sedward 	}
17516280Sedward 	if (!quit)
17616280Sedward 		setcmd(0);
17713977Sedward }
17813977Sedward 
17913977Sedward struct ww *
18013977Sedward getwin()
18113977Sedward {
18213977Sedward 	register int c;
18314184Sedward 	struct ww *w = 0;
18413977Sedward 
18514189Sedward 	if (!terse)
18616113Sedward 		wwputs("Which window? ", cmdwin);
18714987Sedward 	wwcurtowin(cmdwin);
18815871Sedward 	while ((c = wwgetc()) < 0)
18915871Sedward 		wwiomux();
19014407Sedward 	if (debug && c == 'c')
19114407Sedward 		w = cmdwin;
19214407Sedward 	else if (debug && c == 'f')
19314407Sedward 		w = framewin;
19414795Sedward 	else if (debug && c == 'b')
19514795Sedward 		w = boxwin;
19614407Sedward 	else if (c >= '1' && c < NWINDOW + '1')
19714407Sedward 		w = window[c - '1'];
19831140Sedward 	else if (c == '+')
19931140Sedward 		w = selwin;
20031140Sedward 	else if (c == '-')
20131140Sedward 		w = lastselwin;
20214407Sedward 	if (w == 0)
20316313Sedward 		wwbell();
20414189Sedward 	if (!terse)
20516312Sedward 		wwputc('\n', cmdwin);
20613977Sedward 	return w;
20713977Sedward }
20813977Sedward 
20914893Sedward checkproc(w)
21014893Sedward struct ww *w;
21114893Sedward {
21214893Sedward 	if (w->ww_state != WWS_HASPROC) {
21314893Sedward 		error("No process in window.");
21414893Sedward 		return -1;
21514893Sedward 	}
21614893Sedward 	return 0;
21714893Sedward }
21816280Sedward 
21916280Sedward setcmd(new)
22016280Sedward char new;
22116280Sedward {
22216280Sedward 	if (new && !incmd) {
22316280Sedward 		if (!terse)
22416280Sedward 			wwadd(cmdwin, &wwhead);
22516280Sedward 		if (selwin != 0)
22616280Sedward 			wwcursor(selwin, 1);
22716280Sedward 		wwcurwin = 0;
22816280Sedward 	} else if (!new && incmd) {
22916280Sedward 		if (!terse) {
23016280Sedward 			wwdelete(cmdwin);
23116280Sedward 			reframe();
23216280Sedward 		}
23316280Sedward 		if (selwin != 0)
23416280Sedward 			wwcursor(selwin, 0);
23516280Sedward 		wwcurwin = selwin;
23616280Sedward 	}
23716280Sedward 	incmd = new;
23816280Sedward }
23916280Sedward 
24016280Sedward setterse(new)
24116280Sedward char new;
24216280Sedward {
24316280Sedward 	if (incmd)
24416280Sedward 		if (new && !terse) {
24516280Sedward 			wwdelete(cmdwin);
24616280Sedward 			reframe();
24716280Sedward 		} else if (!new && terse)
24816280Sedward 			wwadd(cmdwin, &wwhead);
24916280Sedward 	terse = new;
25016280Sedward }
25116280Sedward 
25216280Sedward /*
25316280Sedward  * Set the current window.
25416280Sedward  */
25516280Sedward setselwin(w)
25616280Sedward struct ww *w;
25716280Sedward {
25816280Sedward 	if (selwin == w)
25916280Sedward 		return;
26016304Sedward 	if (selwin != 0)
26116304Sedward 		lastselwin = selwin;
26216304Sedward 	if ((selwin = w) != 0)
26316304Sedward 		front(selwin, 1);
26416280Sedward }
265