xref: /csrg-svn/usr.bin/window/cmd.c (revision 62457)
118729Sedward /*
2*62457Sbostic  * Copyright (c) 1983, 1993
3*62457Sbostic  *	The Regents of the University of California.  All rights reserved.
433514Sbostic  *
542954Sbostic  * This code is derived from software contributed to Berkeley by
642954Sbostic  * Edward Wang at The University of California, Berkeley.
742954Sbostic  *
842835Sbostic  * %sccs.include.redist.c%
918729Sedward  */
1018729Sedward 
1133514Sbostic #ifndef lint
12*62457Sbostic static char sccsid[] = "@(#)cmd.c	8.1 (Berkeley) 06/06/93";
1333514Sbostic #endif /* not lint */
1433514Sbostic 
1513977Sedward #include "defs.h"
1616309Sedward #include "char.h"
1713977Sedward 
docmd()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':
4355911Sedward 		case 'y': case 'p':
4434107Sedward 		case ctrl('y'):
4534107Sedward 		case ctrl('e'):
4634107Sedward 		case ctrl('u'):
4734107Sedward 		case ctrl('d'):
4834107Sedward 		case ctrl('b'):
4934107Sedward 		case ctrl('f'):
5034107Sedward 		case ctrl('s'):
5134107Sedward 		case ctrl('q'):
5234107Sedward 		case ctrl('['):
5334107Sedward 			if (selwin == 0) {
5434107Sedward 				error("No window.");
5534107Sedward 				continue;
5634107Sedward 			}
5734107Sedward 		}
5834107Sedward 		switch (c) {
5934107Sedward 		case '1': case '2': case '3': case '4': case '5':
6034107Sedward 		case '6': case '7': case '8': case '9':
6134107Sedward 			if ((w = window[c - '1']) == 0) {
6234107Sedward 				error("%c: No such window.", c);
6314893Sedward 				break;
6434107Sedward 			}
6534107Sedward 			setselwin(w);
6634107Sedward 			if (checkproc(selwin) >= 0)
6734107Sedward 				 out = 1;
6834107Sedward 			break;
6934107Sedward 		case '%':
7034107Sedward 			if ((w = getwin()) != 0)
7134107Sedward 				setselwin(w);
7234107Sedward 			break;
7334107Sedward 		case ctrl('^'):
7434107Sedward 			if (lastselwin != 0) {
7534107Sedward 				setselwin(lastselwin);
7614893Sedward 				if (checkproc(selwin) >= 0)
7716280Sedward 					out = 1;
7834107Sedward 			} else
7934107Sedward 				error("No previous window.");
8034107Sedward 			break;
8134107Sedward 		case 'c':
8234107Sedward 			if ((w = getwin()) != 0)
8334107Sedward 				closewin(w);
8434107Sedward 			break;
8534107Sedward 		case 'w':
8634107Sedward 			c_window();
8734107Sedward 			break;
8834107Sedward 		case 'm':
8934107Sedward 			if ((w = getwin()) != 0)
9034107Sedward 				c_move(w);
9134107Sedward 			break;
9234107Sedward 		case 'M':
9334107Sedward 			if ((w = getwin()) != 0)
9434107Sedward 				movewin(w, w->ww_alt.t, w->ww_alt.l);
9534107Sedward 			break;
9634107Sedward 		case 's':
9734107Sedward 			if ((w = getwin()) != 0)
9834107Sedward 				c_size(w);
9934107Sedward 			break;
10034107Sedward 		case 'S':
10134107Sedward 			if ((w = getwin()) != 0)
10234107Sedward 				sizewin(w, w->ww_alt.nr, w->ww_alt.nc);
10334107Sedward 			break;
10455911Sedward 		case 'y':
10555911Sedward 			c_yank();
10655911Sedward 			break;
10755911Sedward 		case 'p':
10855911Sedward 			c_put();
10955911Sedward 			break;
11034107Sedward 		case ':':
11134107Sedward 			c_colon();
11234107Sedward 			break;
11334107Sedward 		case 'h':
11434107Sedward 			(void) wwwrite(selwin, "\b", 1);
11534107Sedward 			break;
11634107Sedward 		case 'j':
11734107Sedward 			(void) wwwrite(selwin, "\n", 1);
11834107Sedward 			break;
11934107Sedward 		case 'k':
12034107Sedward 			(void) wwwrite(selwin, "\033A", 2);
12134107Sedward 			break;
12234107Sedward 		case 'l':
12334107Sedward 			(void) wwwrite(selwin, "\033C", 2);
12434107Sedward 			break;
12534107Sedward 		case ctrl('e'):
12634107Sedward 			wwscroll(selwin, 1);
12734107Sedward 			break;
12834107Sedward 		case ctrl('y'):
12934107Sedward 			wwscroll(selwin, -1);
13034107Sedward 			break;
13134107Sedward 		case ctrl('d'):
13234107Sedward 			wwscroll(selwin, selwin->ww_w.nr / 2);
13334107Sedward 			break;
13434107Sedward 		case ctrl('u'):
13534107Sedward 			wwscroll(selwin, - selwin->ww_w.nr / 2);
13634107Sedward 			break;
13734107Sedward 		case ctrl('f'):
13834107Sedward 			wwscroll(selwin, selwin->ww_w.nr);
13934107Sedward 			break;
14034107Sedward 		case ctrl('b'):
14134107Sedward 			wwscroll(selwin, - selwin->ww_w.nr);
14234107Sedward 			break;
14334107Sedward 		case ctrl('s'):
14434107Sedward 			stopwin(selwin);
14534107Sedward 			break;
14634107Sedward 		case ctrl('q'):
14734107Sedward 			startwin(selwin);
14834107Sedward 			break;
14934107Sedward 		case ctrl('l'):
15034107Sedward 			wwredraw();
15134107Sedward 			break;
15234107Sedward 		case '?':
15334107Sedward 			c_help();
15434107Sedward 			break;
15534107Sedward 		case ctrl('['):
15634107Sedward 			if (checkproc(selwin) >= 0)
15734107Sedward 				out = 1;
15834107Sedward 			break;
15934107Sedward 		case ctrl('z'):
16034107Sedward 			wwsuspend();
16134107Sedward 			break;
16234107Sedward 		case 'q':
16334107Sedward 			c_quit();
16434107Sedward 			break;
16534107Sedward 		/* debugging stuff */
16634107Sedward 		case '&':
16734107Sedward 			if (debug) {
16834107Sedward 				c_debug();
16914893Sedward 				break;
17034107Sedward 			}
17134107Sedward 		default:
17234107Sedward 			if (c == escapec) {
17334107Sedward 				if (checkproc(selwin) >= 0) {
17434107Sedward 					(void) write(selwin->ww_pty,
17534107Sedward 						&escapec, 1);
17634107Sedward 					out = 1;
17714998Sedward 				}
17834107Sedward 			} else {
17934107Sedward 				if (!terse)
18034107Sedward 					wwbell();
18134107Sedward 				error("Type ? for help.");
18214177Sedward 			}
18314893Sedward 		}
18413977Sedward 	}
18516280Sedward 	if (!quit)
18616280Sedward 		setcmd(0);
18713977Sedward }
18813977Sedward 
18913977Sedward struct ww *
getwin()19013977Sedward getwin()
19113977Sedward {
19213977Sedward 	register int c;
19314184Sedward 	struct ww *w = 0;
19413977Sedward 
19514189Sedward 	if (!terse)
19616113Sedward 		wwputs("Which window? ", cmdwin);
19714987Sedward 	wwcurtowin(cmdwin);
19815871Sedward 	while ((c = wwgetc()) < 0)
19915871Sedward 		wwiomux();
20014407Sedward 	if (debug && c == 'c')
20114407Sedward 		w = cmdwin;
20214407Sedward 	else if (debug && c == 'f')
20314407Sedward 		w = framewin;
20414795Sedward 	else if (debug && c == 'b')
20514795Sedward 		w = boxwin;
20614407Sedward 	else if (c >= '1' && c < NWINDOW + '1')
20714407Sedward 		w = window[c - '1'];
20831140Sedward 	else if (c == '+')
20931140Sedward 		w = selwin;
21031140Sedward 	else if (c == '-')
21131140Sedward 		w = lastselwin;
21214407Sedward 	if (w == 0)
21316313Sedward 		wwbell();
21414189Sedward 	if (!terse)
21516312Sedward 		wwputc('\n', cmdwin);
21613977Sedward 	return w;
21713977Sedward }
21813977Sedward 
21914893Sedward checkproc(w)
22014893Sedward struct ww *w;
22114893Sedward {
22214893Sedward 	if (w->ww_state != WWS_HASPROC) {
22314893Sedward 		error("No process in window.");
22414893Sedward 		return -1;
22514893Sedward 	}
22614893Sedward 	return 0;
22714893Sedward }
22816280Sedward 
setcmd(new)22916280Sedward setcmd(new)
23016280Sedward char new;
23116280Sedward {
23216280Sedward 	if (new && !incmd) {
23316280Sedward 		if (!terse)
23416280Sedward 			wwadd(cmdwin, &wwhead);
23516280Sedward 		if (selwin != 0)
23616280Sedward 			wwcursor(selwin, 1);
23716280Sedward 		wwcurwin = 0;
23816280Sedward 	} else if (!new && incmd) {
23916280Sedward 		if (!terse) {
24016280Sedward 			wwdelete(cmdwin);
24116280Sedward 			reframe();
24216280Sedward 		}
24316280Sedward 		if (selwin != 0)
24416280Sedward 			wwcursor(selwin, 0);
24516280Sedward 		wwcurwin = selwin;
24616280Sedward 	}
24716280Sedward 	incmd = new;
24816280Sedward }
24916280Sedward 
setterse(new)25016280Sedward setterse(new)
25116280Sedward char new;
25216280Sedward {
25316280Sedward 	if (incmd)
25416280Sedward 		if (new && !terse) {
25516280Sedward 			wwdelete(cmdwin);
25616280Sedward 			reframe();
25716280Sedward 		} else if (!new && terse)
25816280Sedward 			wwadd(cmdwin, &wwhead);
25916280Sedward 	terse = new;
26016280Sedward }
26116280Sedward 
26216280Sedward /*
26316280Sedward  * Set the current window.
26416280Sedward  */
26516280Sedward setselwin(w)
26616280Sedward struct ww *w;
26716280Sedward {
26816280Sedward 	if (selwin == w)
26916280Sedward 		return;
27016304Sedward 	if (selwin != 0)
27116304Sedward 		lastselwin = selwin;
27216304Sedward 	if ((selwin = w) != 0)
27316304Sedward 		front(selwin, 1);
27416280Sedward }
275