xref: /csrg-svn/usr.bin/window/cmd.c (revision 33514)
118729Sedward /*
2*33514Sbostic  * Copyright (c) 1983 Regents of the University of California.
3*33514Sbostic  * All rights reserved.
4*33514Sbostic  *
5*33514Sbostic  * Redistribution and use in source and binary forms are permitted
6*33514Sbostic  * provided that this notice is preserved and that due credit is given
7*33514Sbostic  * to the University of California at Berkeley. The name of the University
8*33514Sbostic  * may not be used to endorse or promote products derived from this
9*33514Sbostic  * software without specific prior written permission. This software
10*33514Sbostic  * is provided ``as is'' without express or implied warranty.
1118729Sedward  */
1218729Sedward 
13*33514Sbostic #ifndef lint
14*33514Sbostic static char sccsid[] = "@(#)cmd.c	3.36 (Berkeley) 02/21/88";
15*33514Sbostic #endif /* not lint */
16*33514Sbostic 
1713977Sedward #include "defs.h"
1816309Sedward #include "char.h"
1913977Sedward 
2013977Sedward docmd()
2113977Sedward {
2213977Sedward 	register char c;
2313977Sedward 	register struct ww *w;
2416280Sedward 	char out = 0;
2513977Sedward 
2614893Sedward 	for (;;) {
2715871Sedward 		while ((c = wwgetc()) >= 0) {
2814893Sedward 			if (!terse)
2916312Sedward 				wwputc('\n', cmdwin);
3014893Sedward 			switch (c) {
3114893Sedward 			default:
3231140Sedward 				if (c != escapec)
3331140Sedward 					break;
3414893Sedward 			case 'h': case 'j': case 'k': case 'l':
3533248Sbostic 			case ctrl('y'):
3633248Sbostic 			case ctrl('e'):
3733248Sbostic 			case ctrl('u'):
3833248Sbostic 			case ctrl('d'):
3933248Sbostic 			case ctrl('b'):
4033248Sbostic 			case ctrl('f'):
4133248Sbostic 			case ctrl('s'):
4233248Sbostic 			case ctrl('q'):
4333248Sbostic 			case ctrl('['):
4414893Sedward 				if (selwin == 0) {
4514893Sedward 					error("No window.");
4614893Sedward 					continue;
4714893Sedward 				}
4813977Sedward 			}
4914893Sedward 			switch (c) {
5014893Sedward 			case '1': case '2': case '3': case '4': case '5':
5114893Sedward 			case '6': case '7': case '8': case '9':
5214893Sedward 				if ((w = window[c - '1']) == 0) {
5315620Sedward 					error("%c: No such window.", c);
5414893Sedward 					break;
5514893Sedward 				}
5614184Sedward 				setselwin(w);
5714893Sedward 				if (checkproc(selwin) >= 0)
5816280Sedward 					 out = 1;
5914893Sedward 				break;
6014893Sedward 			case '%':
6114893Sedward 				if ((w = getwin()) != 0)
6214893Sedward 					setselwin(w);
6314893Sedward 				break;
6433248Sbostic 			case ctrl('^'):
6515620Sedward 				if (lastselwin != 0) {
6615620Sedward 					setselwin(lastselwin);
6715620Sedward 					if (checkproc(selwin) >= 0)
6816280Sedward 						out = 1;
6915620Sedward 				} else
7015620Sedward 					error("No previous window.");
7115620Sedward 				break;
7214893Sedward 			case 'c':
7314893Sedward 				if ((w = getwin()) != 0)
7431140Sedward 					closewin(w);
7514893Sedward 				break;
7614893Sedward 			case 'w':
7714893Sedward 				c_window();
7814893Sedward 				break;
7914893Sedward 			case 'm':
8014893Sedward 				if ((w = getwin()) != 0)
8114893Sedward 					c_move(w);
8214893Sedward 				break;
8314998Sedward 			case 'M':
8414998Sedward 				if ((w = getwin()) != 0)
8518204Sedward 					movewin(w, w->ww_alt.t, w->ww_alt.l);
8614998Sedward 				break;
8718204Sedward 			case 's':
8818204Sedward 				if ((w = getwin()) != 0)
8918204Sedward 					c_size(w);
9018204Sedward 				break;
9118204Sedward 			case 'S':
9218204Sedward 				if ((w = getwin()) != 0)
9318204Sedward 					sizewin(w, w->ww_alt.nr, w->ww_alt.nc);
9418204Sedward 				break;
9514893Sedward 			case ':':
9614893Sedward 				c_colon();
9714893Sedward 				break;
9814893Sedward 			case 'h':
9914893Sedward 				(void) wwwrite(selwin, "\b", 1);
10014893Sedward 				break;
10114893Sedward 			case 'j':
10214893Sedward 				(void) wwwrite(selwin, "\n", 1);
10314893Sedward 				break;
10414893Sedward 			case 'k':
10514893Sedward 				(void) wwwrite(selwin, "\033A", 2);
10614893Sedward 				break;
10714893Sedward 			case 'l':
10814893Sedward 				(void) wwwrite(selwin, "\033C", 2);
10914893Sedward 				break;
11033248Sbostic 			case ctrl('e'):
11114893Sedward 				wwscroll(selwin, 1);
11214893Sedward 				break;
11333248Sbostic 			case ctrl('y'):
11414893Sedward 				wwscroll(selwin, -1);
11514893Sedward 				break;
11633248Sbostic 			case ctrl('d'):
11714893Sedward 				wwscroll(selwin, selwin->ww_w.nr / 2);
11814893Sedward 				break;
11933248Sbostic 			case ctrl('u'):
12014893Sedward 				wwscroll(selwin, - selwin->ww_w.nr / 2);
12114893Sedward 				break;
12233248Sbostic 			case ctrl('f'):
12314893Sedward 				wwscroll(selwin, selwin->ww_w.nr);
12414893Sedward 				break;
12533248Sbostic 			case ctrl('b'):
12614893Sedward 				wwscroll(selwin, - selwin->ww_w.nr);
12714893Sedward 				break;
12833248Sbostic 			case ctrl('s'):
12918335Sedward 				stopwin(selwin);
13014893Sedward 				break;
13133248Sbostic 			case ctrl('q'):
13218335Sedward 				startwin(selwin);
13314893Sedward 				break;
13433248Sbostic 			case ctrl('l'):
13514893Sedward 				wwredraw();
13614893Sedward 				break;
13714893Sedward 			case '?':
13814893Sedward 				c_help();
13914893Sedward 				break;
14033248Sbostic 			case ctrl('['):
14114893Sedward 				if (checkproc(selwin) >= 0)
14216280Sedward 					out = 1;
14314893Sedward 				break;
14433248Sbostic 			case ctrl('z'):
14514893Sedward 				wwsuspend();
14614893Sedward 				break;
14714893Sedward 			case 'q':
14814893Sedward 				c_quit();
14914893Sedward 				break;
15014998Sedward 			/* debugging stuff */
15114998Sedward 			case '&':
15214998Sedward 				if (debug) {
15314998Sedward 					c_debug();
15414998Sedward 					break;
15514998Sedward 				}
15614893Sedward 			default:
15714893Sedward 				if (c == escapec) {
15814893Sedward 					if (checkproc(selwin) >= 0) {
15914893Sedward 						(void) write(selwin->ww_pty,
16014893Sedward 							&escapec, 1);
16116280Sedward 						out = 1;
16214893Sedward 					}
16314893Sedward 				} else {
16414893Sedward 					if (!terse)
16516313Sedward 						wwbell();
16614893Sedward 					error("Type ? for help.");
16714893Sedward 				}
16814177Sedward 			}
16914893Sedward 		}
17016280Sedward 		if (out || quit)
17113977Sedward 			break;
17214893Sedward 		if (terse)
17314893Sedward 			wwsetcursor(0, 0);
17414893Sedward 		else {
17516113Sedward 			wwputs("Command: ", cmdwin);
17614893Sedward 			wwcurtowin(cmdwin);
17713977Sedward 		}
17815871Sedward 		while (wwpeekc() < 0)
17915871Sedward 			wwiomux();
18013977Sedward 	}
18116280Sedward 	if (!quit)
18216280Sedward 		setcmd(0);
18313977Sedward }
18413977Sedward 
18513977Sedward struct ww *
18613977Sedward getwin()
18713977Sedward {
18813977Sedward 	register int c;
18914184Sedward 	struct ww *w = 0;
19013977Sedward 
19114189Sedward 	if (!terse)
19216113Sedward 		wwputs("Which window? ", cmdwin);
19314987Sedward 	wwcurtowin(cmdwin);
19415871Sedward 	while ((c = wwgetc()) < 0)
19515871Sedward 		wwiomux();
19614407Sedward 	if (debug && c == 'c')
19714407Sedward 		w = cmdwin;
19814407Sedward 	else if (debug && c == 'f')
19914407Sedward 		w = framewin;
20014795Sedward 	else if (debug && c == 'b')
20114795Sedward 		w = boxwin;
20214407Sedward 	else if (c >= '1' && c < NWINDOW + '1')
20314407Sedward 		w = window[c - '1'];
20431140Sedward 	else if (c == '+')
20531140Sedward 		w = selwin;
20631140Sedward 	else if (c == '-')
20731140Sedward 		w = lastselwin;
20814407Sedward 	if (w == 0)
20916313Sedward 		wwbell();
21014189Sedward 	if (!terse)
21116312Sedward 		wwputc('\n', cmdwin);
21213977Sedward 	return w;
21313977Sedward }
21413977Sedward 
21514893Sedward checkproc(w)
21614893Sedward struct ww *w;
21714893Sedward {
21814893Sedward 	if (w->ww_state != WWS_HASPROC) {
21914893Sedward 		error("No process in window.");
22014893Sedward 		return -1;
22114893Sedward 	}
22214893Sedward 	return 0;
22314893Sedward }
22416280Sedward 
22516280Sedward setcmd(new)
22616280Sedward char new;
22716280Sedward {
22816280Sedward 	if (new && !incmd) {
22916280Sedward 		if (!terse)
23016280Sedward 			wwadd(cmdwin, &wwhead);
23116280Sedward 		if (selwin != 0)
23216280Sedward 			wwcursor(selwin, 1);
23316280Sedward 		wwcurwin = 0;
23416280Sedward 	} else if (!new && incmd) {
23516280Sedward 		if (!terse) {
23616280Sedward 			wwdelete(cmdwin);
23716280Sedward 			reframe();
23816280Sedward 		}
23916280Sedward 		if (selwin != 0)
24016280Sedward 			wwcursor(selwin, 0);
24116280Sedward 		wwcurwin = selwin;
24216280Sedward 	}
24316280Sedward 	incmd = new;
24416280Sedward }
24516280Sedward 
24616280Sedward setterse(new)
24716280Sedward char new;
24816280Sedward {
24916280Sedward 	if (incmd)
25016280Sedward 		if (new && !terse) {
25116280Sedward 			wwdelete(cmdwin);
25216280Sedward 			reframe();
25316280Sedward 		} else if (!new && terse)
25416280Sedward 			wwadd(cmdwin, &wwhead);
25516280Sedward 	terse = new;
25616280Sedward }
25716280Sedward 
25816280Sedward /*
25916280Sedward  * Set the current window.
26016280Sedward  */
26116280Sedward setselwin(w)
26216280Sedward struct ww *w;
26316280Sedward {
26416280Sedward 	if (selwin == w)
26516280Sedward 		return;
26616304Sedward 	if (selwin != 0)
26716304Sedward 		lastselwin = selwin;
26816304Sedward 	if ((selwin = w) != 0)
26916304Sedward 		front(selwin, 1);
27016280Sedward }
271