xref: /csrg-svn/usr.bin/window/cmd.c (revision 18729)
113977Sedward #ifndef lint
2*18729Sedward static char sccsid[] = "@(#)cmd.c	3.33 04/24/85";
313977Sedward #endif
413977Sedward 
5*18729Sedward /*
6*18729Sedward  * Copyright (c) 1983 Regents of the University of California,
7*18729Sedward  * All rights reserved.  Redistribution permitted subject to
8*18729Sedward  * the terms of the Berkeley Software License Agreement.
9*18729Sedward  */
10*18729Sedward 
1113977Sedward #include "defs.h"
1216309Sedward #include "char.h"
1313977Sedward 
1413977Sedward docmd()
1513977Sedward {
1613977Sedward 	register char c;
1713977Sedward 	register struct ww *w;
1816280Sedward 	char out = 0;
1913977Sedward 
2014893Sedward 	for (;;) {
2115871Sedward 		while ((c = wwgetc()) >= 0) {
2214893Sedward 			if (!terse)
2316312Sedward 				wwputc('\n', cmdwin);
2414893Sedward 			switch (c) {
2514893Sedward 			default:
2614893Sedward 				if (c == escapec)
2714893Sedward 					goto foo;
2813977Sedward 				break;
2914893Sedward 			case 'h': case 'j': case 'k': case 'l':
3016309Sedward 			case ctrl(y):
3116309Sedward 			case ctrl(e):
3216309Sedward 			case ctrl(u):
3316309Sedward 			case ctrl(d):
3416309Sedward 			case ctrl(b):
3516309Sedward 			case ctrl(f):
3616309Sedward 			case ctrl(s):
3716309Sedward 			case ctrl(q):
3816309Sedward 			case ctrl([):
3914893Sedward 			foo:
4014893Sedward 				if (selwin == 0) {
4114893Sedward 					error("No window.");
4214893Sedward 					continue;
4314893Sedward 				}
4413977Sedward 			}
4514893Sedward 			switch (c) {
4614893Sedward 			case '1': case '2': case '3': case '4': case '5':
4714893Sedward 			case '6': case '7': case '8': case '9':
4814893Sedward 				if ((w = window[c - '1']) == 0) {
4915620Sedward 					error("%c: No such window.", c);
5014893Sedward 					break;
5114893Sedward 				}
5214184Sedward 				setselwin(w);
5314893Sedward 				if (checkproc(selwin) >= 0)
5416280Sedward 					 out = 1;
5514893Sedward 				break;
5614893Sedward 			case '%':
5714893Sedward 				if ((w = getwin()) != 0)
5814893Sedward 					setselwin(w);
5914893Sedward 				break;
6016309Sedward 			case ctrl(^):
6115620Sedward 				if (lastselwin != 0) {
6215620Sedward 					setselwin(lastselwin);
6315620Sedward 					if (checkproc(selwin) >= 0)
6416280Sedward 						out = 1;
6515620Sedward 				} else
6615620Sedward 					error("No previous window.");
6715620Sedward 				break;
6814893Sedward 			case 'c':
6914893Sedward 				if ((w = getwin()) != 0)
7014893Sedward 					c_close(w);
7114893Sedward 				break;
7214893Sedward 			case 'w':
7314893Sedward 				c_window();
7414893Sedward 				break;
7514893Sedward 			case 'm':
7614893Sedward 				if ((w = getwin()) != 0)
7714893Sedward 					c_move(w);
7814893Sedward 				break;
7914998Sedward 			case 'M':
8014998Sedward 				if ((w = getwin()) != 0)
8118204Sedward 					movewin(w, w->ww_alt.t, w->ww_alt.l);
8214998Sedward 				break;
8318204Sedward 			case 's':
8418204Sedward 				if ((w = getwin()) != 0)
8518204Sedward 					c_size(w);
8618204Sedward 				break;
8718204Sedward 			case 'S':
8818204Sedward 				if ((w = getwin()) != 0)
8918204Sedward 					sizewin(w, w->ww_alt.nr, w->ww_alt.nc);
9018204Sedward 				break;
9114893Sedward 			case ':':
9214893Sedward 				c_colon();
9314893Sedward 				break;
9414893Sedward 			case 'h':
9514893Sedward 				(void) wwwrite(selwin, "\b", 1);
9614893Sedward 				break;
9714893Sedward 			case 'j':
9814893Sedward 				(void) wwwrite(selwin, "\n", 1);
9914893Sedward 				break;
10014893Sedward 			case 'k':
10114893Sedward 				(void) wwwrite(selwin, "\033A", 2);
10214893Sedward 				break;
10314893Sedward 			case 'l':
10414893Sedward 				(void) wwwrite(selwin, "\033C", 2);
10514893Sedward 				break;
10616309Sedward 			case ctrl(e):
10714893Sedward 				wwscroll(selwin, 1);
10814893Sedward 				break;
10916309Sedward 			case ctrl(y):
11014893Sedward 				wwscroll(selwin, -1);
11114893Sedward 				break;
11216309Sedward 			case ctrl(d):
11314893Sedward 				wwscroll(selwin, selwin->ww_w.nr / 2);
11414893Sedward 				break;
11516309Sedward 			case ctrl(u):
11614893Sedward 				wwscroll(selwin, - selwin->ww_w.nr / 2);
11714893Sedward 				break;
11816309Sedward 			case ctrl(f):
11914893Sedward 				wwscroll(selwin, selwin->ww_w.nr);
12014893Sedward 				break;
12116309Sedward 			case ctrl(b):
12214893Sedward 				wwscroll(selwin, - selwin->ww_w.nr);
12314893Sedward 				break;
12416309Sedward 			case ctrl(s):
12518335Sedward 				stopwin(selwin);
12614893Sedward 				break;
12716309Sedward 			case ctrl(q):
12818335Sedward 				startwin(selwin);
12914893Sedward 				break;
13016309Sedward 			case ctrl(l):
13114893Sedward 				wwredraw();
13214893Sedward 				break;
13314893Sedward 			case '?':
13414893Sedward 				c_help();
13514893Sedward 				break;
13616309Sedward 			case ctrl([):
13714893Sedward 				if (checkproc(selwin) >= 0)
13816280Sedward 					out = 1;
13914893Sedward 				break;
14016309Sedward 			case ctrl(z):
14114893Sedward 				wwsuspend();
14214893Sedward 				break;
14314893Sedward 			case 'q':
14414893Sedward 				c_quit();
14514893Sedward 				break;
14614998Sedward 			/* debugging stuff */
14714998Sedward 			case '&':
14814998Sedward 				if (debug) {
14914998Sedward 					c_debug();
15014998Sedward 					break;
15114998Sedward 				}
15214893Sedward 			default:
15314893Sedward 				if (c == escapec) {
15414893Sedward 					if (checkproc(selwin) >= 0) {
15514893Sedward 						(void) write(selwin->ww_pty,
15614893Sedward 							&escapec, 1);
15716280Sedward 						out = 1;
15814893Sedward 					}
15914893Sedward 				} else {
16014893Sedward 					if (!terse)
16116313Sedward 						wwbell();
16214893Sedward 					error("Type ? for help.");
16314893Sedward 				}
16414177Sedward 			}
16514893Sedward 		}
16616280Sedward 		if (out || quit)
16713977Sedward 			break;
16814893Sedward 		if (terse)
16914893Sedward 			wwsetcursor(0, 0);
17014893Sedward 		else {
17116113Sedward 			wwputs("Command: ", cmdwin);
17214893Sedward 			wwcurtowin(cmdwin);
17313977Sedward 		}
17415871Sedward 		while (wwpeekc() < 0)
17515871Sedward 			wwiomux();
17613977Sedward 	}
17716280Sedward 	if (!quit)
17816280Sedward 		setcmd(0);
17913977Sedward }
18013977Sedward 
18113977Sedward struct ww *
18213977Sedward getwin()
18313977Sedward {
18413977Sedward 	register int c;
18514184Sedward 	struct ww *w = 0;
18613977Sedward 
18714189Sedward 	if (!terse)
18816113Sedward 		wwputs("Which window? ", cmdwin);
18914987Sedward 	wwcurtowin(cmdwin);
19015871Sedward 	while ((c = wwgetc()) < 0)
19115871Sedward 		wwiomux();
19214407Sedward 	if (debug && c == 'c')
19314407Sedward 		w = cmdwin;
19414407Sedward 	else if (debug && c == 'f')
19514407Sedward 		w = framewin;
19614795Sedward 	else if (debug && c == 'b')
19714795Sedward 		w = boxwin;
19814407Sedward 	else if (c >= '1' && c < NWINDOW + '1')
19914407Sedward 		w = window[c - '1'];
20014407Sedward 	if (w == 0)
20116313Sedward 		wwbell();
20214189Sedward 	if (!terse)
20316312Sedward 		wwputc('\n', cmdwin);
20413977Sedward 	return w;
20513977Sedward }
20613977Sedward 
20714893Sedward checkproc(w)
20814893Sedward struct ww *w;
20914893Sedward {
21014893Sedward 	if (w->ww_state != WWS_HASPROC) {
21114893Sedward 		error("No process in window.");
21214893Sedward 		return -1;
21314893Sedward 	}
21414893Sedward 	return 0;
21514893Sedward }
21616280Sedward 
21716280Sedward setcmd(new)
21816280Sedward char new;
21916280Sedward {
22016280Sedward 	if (new && !incmd) {
22116280Sedward 		if (!terse)
22216280Sedward 			wwadd(cmdwin, &wwhead);
22316280Sedward 		if (selwin != 0)
22416280Sedward 			wwcursor(selwin, 1);
22516280Sedward 		wwcurwin = 0;
22616280Sedward 	} else if (!new && incmd) {
22716280Sedward 		if (!terse) {
22816280Sedward 			wwdelete(cmdwin);
22916280Sedward 			reframe();
23016280Sedward 		}
23116280Sedward 		if (selwin != 0)
23216280Sedward 			wwcursor(selwin, 0);
23316280Sedward 		wwcurwin = selwin;
23416280Sedward 	}
23516280Sedward 	incmd = new;
23616280Sedward }
23716280Sedward 
23816280Sedward setterse(new)
23916280Sedward char new;
24016280Sedward {
24116280Sedward 	if (incmd)
24216280Sedward 		if (new && !terse) {
24316280Sedward 			wwdelete(cmdwin);
24416280Sedward 			reframe();
24516280Sedward 		} else if (!new && terse)
24616280Sedward 			wwadd(cmdwin, &wwhead);
24716280Sedward 	terse = new;
24816280Sedward }
24916280Sedward 
25016280Sedward /*
25116280Sedward  * Set the current window.
25216280Sedward  */
25316280Sedward setselwin(w)
25416280Sedward struct ww *w;
25516280Sedward {
25616280Sedward 	if (selwin == w)
25716280Sedward 		return;
25816304Sedward 	if (selwin != 0)
25916304Sedward 		lastselwin = selwin;
26016304Sedward 	if ((selwin = w) != 0)
26116304Sedward 		front(selwin, 1);
26216280Sedward }
263