xref: /csrg-svn/usr.bin/window/cmd.c (revision 31140)
113977Sedward #ifndef lint
2*31140Sedward static char sccsid[] = "@(#)cmd.c	3.34 05/18/87";
313977Sedward #endif
413977Sedward 
518729Sedward /*
618729Sedward  * Copyright (c) 1983 Regents of the University of California,
718729Sedward  * All rights reserved.  Redistribution permitted subject to
818729Sedward  * the terms of the Berkeley Software License Agreement.
918729Sedward  */
1018729Sedward 
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:
26*31140Sedward 				if (c != escapec)
27*31140Sedward 					break;
2814893Sedward 			case 'h': case 'j': case 'k': case 'l':
2916309Sedward 			case ctrl(y):
3016309Sedward 			case ctrl(e):
3116309Sedward 			case ctrl(u):
3216309Sedward 			case ctrl(d):
3316309Sedward 			case ctrl(b):
3416309Sedward 			case ctrl(f):
3516309Sedward 			case ctrl(s):
3616309Sedward 			case ctrl(q):
3716309Sedward 			case ctrl([):
3814893Sedward 				if (selwin == 0) {
3914893Sedward 					error("No window.");
4014893Sedward 					continue;
4114893Sedward 				}
4213977Sedward 			}
4314893Sedward 			switch (c) {
4414893Sedward 			case '1': case '2': case '3': case '4': case '5':
4514893Sedward 			case '6': case '7': case '8': case '9':
4614893Sedward 				if ((w = window[c - '1']) == 0) {
4715620Sedward 					error("%c: No such window.", c);
4814893Sedward 					break;
4914893Sedward 				}
5014184Sedward 				setselwin(w);
5114893Sedward 				if (checkproc(selwin) >= 0)
5216280Sedward 					 out = 1;
5314893Sedward 				break;
5414893Sedward 			case '%':
5514893Sedward 				if ((w = getwin()) != 0)
5614893Sedward 					setselwin(w);
5714893Sedward 				break;
5816309Sedward 			case ctrl(^):
5915620Sedward 				if (lastselwin != 0) {
6015620Sedward 					setselwin(lastselwin);
6115620Sedward 					if (checkproc(selwin) >= 0)
6216280Sedward 						out = 1;
6315620Sedward 				} else
6415620Sedward 					error("No previous window.");
6515620Sedward 				break;
6614893Sedward 			case 'c':
6714893Sedward 				if ((w = getwin()) != 0)
68*31140Sedward 					closewin(w);
6914893Sedward 				break;
7014893Sedward 			case 'w':
7114893Sedward 				c_window();
7214893Sedward 				break;
7314893Sedward 			case 'm':
7414893Sedward 				if ((w = getwin()) != 0)
7514893Sedward 					c_move(w);
7614893Sedward 				break;
7714998Sedward 			case 'M':
7814998Sedward 				if ((w = getwin()) != 0)
7918204Sedward 					movewin(w, w->ww_alt.t, w->ww_alt.l);
8014998Sedward 				break;
8118204Sedward 			case 's':
8218204Sedward 				if ((w = getwin()) != 0)
8318204Sedward 					c_size(w);
8418204Sedward 				break;
8518204Sedward 			case 'S':
8618204Sedward 				if ((w = getwin()) != 0)
8718204Sedward 					sizewin(w, w->ww_alt.nr, w->ww_alt.nc);
8818204Sedward 				break;
8914893Sedward 			case ':':
9014893Sedward 				c_colon();
9114893Sedward 				break;
9214893Sedward 			case 'h':
9314893Sedward 				(void) wwwrite(selwin, "\b", 1);
9414893Sedward 				break;
9514893Sedward 			case 'j':
9614893Sedward 				(void) wwwrite(selwin, "\n", 1);
9714893Sedward 				break;
9814893Sedward 			case 'k':
9914893Sedward 				(void) wwwrite(selwin, "\033A", 2);
10014893Sedward 				break;
10114893Sedward 			case 'l':
10214893Sedward 				(void) wwwrite(selwin, "\033C", 2);
10314893Sedward 				break;
10416309Sedward 			case ctrl(e):
10514893Sedward 				wwscroll(selwin, 1);
10614893Sedward 				break;
10716309Sedward 			case ctrl(y):
10814893Sedward 				wwscroll(selwin, -1);
10914893Sedward 				break;
11016309Sedward 			case ctrl(d):
11114893Sedward 				wwscroll(selwin, selwin->ww_w.nr / 2);
11214893Sedward 				break;
11316309Sedward 			case ctrl(u):
11414893Sedward 				wwscroll(selwin, - selwin->ww_w.nr / 2);
11514893Sedward 				break;
11616309Sedward 			case ctrl(f):
11714893Sedward 				wwscroll(selwin, selwin->ww_w.nr);
11814893Sedward 				break;
11916309Sedward 			case ctrl(b):
12014893Sedward 				wwscroll(selwin, - selwin->ww_w.nr);
12114893Sedward 				break;
12216309Sedward 			case ctrl(s):
12318335Sedward 				stopwin(selwin);
12414893Sedward 				break;
12516309Sedward 			case ctrl(q):
12618335Sedward 				startwin(selwin);
12714893Sedward 				break;
12816309Sedward 			case ctrl(l):
12914893Sedward 				wwredraw();
13014893Sedward 				break;
13114893Sedward 			case '?':
13214893Sedward 				c_help();
13314893Sedward 				break;
13416309Sedward 			case ctrl([):
13514893Sedward 				if (checkproc(selwin) >= 0)
13616280Sedward 					out = 1;
13714893Sedward 				break;
13816309Sedward 			case ctrl(z):
13914893Sedward 				wwsuspend();
14014893Sedward 				break;
14114893Sedward 			case 'q':
14214893Sedward 				c_quit();
14314893Sedward 				break;
14414998Sedward 			/* debugging stuff */
14514998Sedward 			case '&':
14614998Sedward 				if (debug) {
14714998Sedward 					c_debug();
14814998Sedward 					break;
14914998Sedward 				}
15014893Sedward 			default:
15114893Sedward 				if (c == escapec) {
15214893Sedward 					if (checkproc(selwin) >= 0) {
15314893Sedward 						(void) write(selwin->ww_pty,
15414893Sedward 							&escapec, 1);
15516280Sedward 						out = 1;
15614893Sedward 					}
15714893Sedward 				} else {
15814893Sedward 					if (!terse)
15916313Sedward 						wwbell();
16014893Sedward 					error("Type ? for help.");
16114893Sedward 				}
16214177Sedward 			}
16314893Sedward 		}
16416280Sedward 		if (out || quit)
16513977Sedward 			break;
16614893Sedward 		if (terse)
16714893Sedward 			wwsetcursor(0, 0);
16814893Sedward 		else {
16916113Sedward 			wwputs("Command: ", cmdwin);
17014893Sedward 			wwcurtowin(cmdwin);
17113977Sedward 		}
17215871Sedward 		while (wwpeekc() < 0)
17315871Sedward 			wwiomux();
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'];
198*31140Sedward 	else if (c == '+')
199*31140Sedward 		w = selwin;
200*31140Sedward 	else if (c == '-')
201*31140Sedward 		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