xref: /csrg-svn/usr.bin/window/cmd.c (revision 18204)
113977Sedward #ifndef lint
2*18204Sedward static char sccsid[] = "@(#)cmd.c	3.31 03/01/85";
313977Sedward #endif
413977Sedward 
513977Sedward #include "defs.h"
616309Sedward #include "char.h"
713977Sedward 
813977Sedward docmd()
913977Sedward {
1013977Sedward 	register char c;
1113977Sedward 	register struct ww *w;
1216280Sedward 	char out = 0;
1313977Sedward 
1414893Sedward 	for (;;) {
1515871Sedward 		while ((c = wwgetc()) >= 0) {
1614893Sedward 			if (!terse)
1716312Sedward 				wwputc('\n', cmdwin);
1814893Sedward 			switch (c) {
1914893Sedward 			default:
2014893Sedward 				if (c == escapec)
2114893Sedward 					goto foo;
2213977Sedward 				break;
2314893Sedward 			case 'h': case 'j': case 'k': case 'l':
2416309Sedward 			case ctrl(y):
2516309Sedward 			case ctrl(e):
2616309Sedward 			case ctrl(u):
2716309Sedward 			case ctrl(d):
2816309Sedward 			case ctrl(b):
2916309Sedward 			case ctrl(f):
3016309Sedward 			case ctrl(s):
3116309Sedward 			case ctrl(q):
3216309Sedward 			case ctrl([):
3314893Sedward 			foo:
3414893Sedward 				if (selwin == 0) {
3514893Sedward 					error("No window.");
3614893Sedward 					continue;
3714893Sedward 				}
3813977Sedward 			}
3914893Sedward 			switch (c) {
4014893Sedward 			case '1': case '2': case '3': case '4': case '5':
4114893Sedward 			case '6': case '7': case '8': case '9':
4214893Sedward 				if ((w = window[c - '1']) == 0) {
4315620Sedward 					error("%c: No such window.", c);
4414893Sedward 					break;
4514893Sedward 				}
4614184Sedward 				setselwin(w);
4714893Sedward 				if (checkproc(selwin) >= 0)
4816280Sedward 					 out = 1;
4914893Sedward 				break;
5014893Sedward 			case '%':
5114893Sedward 				if ((w = getwin()) != 0)
5214893Sedward 					setselwin(w);
5314893Sedward 				break;
5416309Sedward 			case ctrl(^):
5515620Sedward 				if (lastselwin != 0) {
5615620Sedward 					setselwin(lastselwin);
5715620Sedward 					if (checkproc(selwin) >= 0)
5816280Sedward 						out = 1;
5915620Sedward 				} else
6015620Sedward 					error("No previous window.");
6115620Sedward 				break;
6214893Sedward 			case 'c':
6314893Sedward 				if ((w = getwin()) != 0)
6414893Sedward 					c_close(w);
6514893Sedward 				break;
6614893Sedward 			case 'w':
6714893Sedward 				c_window();
6814893Sedward 				break;
6914893Sedward 			case 'm':
7014893Sedward 				if ((w = getwin()) != 0)
7114893Sedward 					c_move(w);
7214893Sedward 				break;
7314998Sedward 			case 'M':
7414998Sedward 				if ((w = getwin()) != 0)
75*18204Sedward 					movewin(w, w->ww_alt.t, w->ww_alt.l);
7614998Sedward 				break;
77*18204Sedward 			case 's':
78*18204Sedward 				if ((w = getwin()) != 0)
79*18204Sedward 					c_size(w);
80*18204Sedward 				break;
81*18204Sedward 			case 'S':
82*18204Sedward 				if ((w = getwin()) != 0)
83*18204Sedward 					sizewin(w, w->ww_alt.nr, w->ww_alt.nc);
84*18204Sedward 				break;
8514893Sedward 			case ':':
8614893Sedward 				c_colon();
8714893Sedward 				break;
8814893Sedward 			case 'h':
8914893Sedward 				(void) wwwrite(selwin, "\b", 1);
9014893Sedward 				break;
9114893Sedward 			case 'j':
9214893Sedward 				(void) wwwrite(selwin, "\n", 1);
9314893Sedward 				break;
9414893Sedward 			case 'k':
9514893Sedward 				(void) wwwrite(selwin, "\033A", 2);
9614893Sedward 				break;
9714893Sedward 			case 'l':
9814893Sedward 				(void) wwwrite(selwin, "\033C", 2);
9914893Sedward 				break;
10016309Sedward 			case ctrl(e):
10114893Sedward 				wwscroll(selwin, 1);
10214893Sedward 				break;
10316309Sedward 			case ctrl(y):
10414893Sedward 				wwscroll(selwin, -1);
10514893Sedward 				break;
10616309Sedward 			case ctrl(d):
10714893Sedward 				wwscroll(selwin, selwin->ww_w.nr / 2);
10814893Sedward 				break;
10916309Sedward 			case ctrl(u):
11014893Sedward 				wwscroll(selwin, - selwin->ww_w.nr / 2);
11114893Sedward 				break;
11216309Sedward 			case ctrl(f):
11314893Sedward 				wwscroll(selwin, selwin->ww_w.nr);
11414893Sedward 				break;
11516309Sedward 			case ctrl(b):
11614893Sedward 				wwscroll(selwin, - selwin->ww_w.nr);
11714893Sedward 				break;
11816309Sedward 			case ctrl(s):
119*18204Sedward 				if (selwin->ww_pty < 0)
120*18204Sedward 					break;
121*18204Sedward 				if (selwin->ww_ispty) {
122*18204Sedward 					(void) ioctl(selwin->ww_pty, TIOCSTOP,
123*18204Sedward 						(char *)0);
124*18204Sedward 					selwin->ww_stopped = 1;
125*18204Sedward 				} else
126*18204Sedward 					(void) write(selwin->ww_pty,
127*18204Sedward 						&wwwintty.ww_tchars.t_stopc, 1);
12814893Sedward 				break;
12916309Sedward 			case ctrl(q):
130*18204Sedward 				if (selwin->ww_pty < 0)
131*18204Sedward 					break;
132*18204Sedward 				if (selwin->ww_ispty) {
133*18204Sedward 					(void) ioctl(selwin->ww_pty, TIOCSTART,
134*18204Sedward 						(char *)0);
135*18204Sedward 					selwin->ww_stopped = 0;
136*18204Sedward 				} else
137*18204Sedward 					(void) write(selwin->ww_pty,
138*18204Sedward 						&wwwintty.ww_tchars.t_startc,
139*18204Sedward 						1);
14014893Sedward 				break;
14116309Sedward 			case ctrl(l):
14214893Sedward 				wwredraw();
14314893Sedward 				break;
14414893Sedward 			case '?':
14514893Sedward 				c_help();
14614893Sedward 				break;
14716309Sedward 			case ctrl([):
14814893Sedward 				if (checkproc(selwin) >= 0)
14916280Sedward 					out = 1;
15014893Sedward 				break;
15116309Sedward 			case ctrl(z):
15214893Sedward 				wwsuspend();
15314893Sedward 				break;
15414893Sedward 			case 'q':
15514893Sedward 				c_quit();
15614893Sedward 				break;
15714998Sedward 			/* debugging stuff */
15814998Sedward 			case '&':
15914998Sedward 				if (debug) {
16014998Sedward 					c_debug();
16114998Sedward 					break;
16214998Sedward 				}
16314893Sedward 			default:
16414893Sedward 				if (c == escapec) {
16514893Sedward 					if (checkproc(selwin) >= 0) {
16614893Sedward 						(void) write(selwin->ww_pty,
16714893Sedward 							&escapec, 1);
16816280Sedward 						out = 1;
16914893Sedward 					}
17014893Sedward 				} else {
17114893Sedward 					if (!terse)
17216313Sedward 						wwbell();
17314893Sedward 					error("Type ? for help.");
17414893Sedward 				}
17514177Sedward 			}
17614893Sedward 		}
17716280Sedward 		if (out || quit)
17813977Sedward 			break;
17914893Sedward 		if (terse)
18014893Sedward 			wwsetcursor(0, 0);
18114893Sedward 		else {
18216113Sedward 			wwputs("Command: ", cmdwin);
18314893Sedward 			wwcurtowin(cmdwin);
18413977Sedward 		}
18515871Sedward 		while (wwpeekc() < 0)
18615871Sedward 			wwiomux();
18713977Sedward 	}
18816280Sedward 	if (!quit)
18916280Sedward 		setcmd(0);
19013977Sedward }
19113977Sedward 
19213977Sedward struct ww *
19313977Sedward getwin()
19413977Sedward {
19513977Sedward 	register int c;
19614184Sedward 	struct ww *w = 0;
19713977Sedward 
19814189Sedward 	if (!terse)
19916113Sedward 		wwputs("Which window? ", cmdwin);
20014987Sedward 	wwcurtowin(cmdwin);
20115871Sedward 	while ((c = wwgetc()) < 0)
20215871Sedward 		wwiomux();
20314407Sedward 	if (debug && c == 'c')
20414407Sedward 		w = cmdwin;
20514407Sedward 	else if (debug && c == 'f')
20614407Sedward 		w = framewin;
20714795Sedward 	else if (debug && c == 'b')
20814795Sedward 		w = boxwin;
20914407Sedward 	else if (c >= '1' && c < NWINDOW + '1')
21014407Sedward 		w = window[c - '1'];
21114407Sedward 	if (w == 0)
21216313Sedward 		wwbell();
21314189Sedward 	if (!terse)
21416312Sedward 		wwputc('\n', cmdwin);
21513977Sedward 	return w;
21613977Sedward }
21713977Sedward 
21814893Sedward checkproc(w)
21914893Sedward struct ww *w;
22014893Sedward {
22114893Sedward 	if (w->ww_state != WWS_HASPROC) {
22214893Sedward 		error("No process in window.");
22314893Sedward 		return -1;
22414893Sedward 	}
22514893Sedward 	return 0;
22614893Sedward }
22716280Sedward 
22816280Sedward setcmd(new)
22916280Sedward char new;
23016280Sedward {
23116280Sedward 	if (new && !incmd) {
23216280Sedward 		if (!terse)
23316280Sedward 			wwadd(cmdwin, &wwhead);
23416280Sedward 		if (selwin != 0)
23516280Sedward 			wwcursor(selwin, 1);
23616280Sedward 		wwcurwin = 0;
23716280Sedward 	} else if (!new && incmd) {
23816280Sedward 		if (!terse) {
23916280Sedward 			wwdelete(cmdwin);
24016280Sedward 			reframe();
24116280Sedward 		}
24216280Sedward 		if (selwin != 0)
24316280Sedward 			wwcursor(selwin, 0);
24416280Sedward 		wwcurwin = selwin;
24516280Sedward 	}
24616280Sedward 	incmd = new;
24716280Sedward }
24816280Sedward 
24916280Sedward setterse(new)
25016280Sedward char new;
25116280Sedward {
25216280Sedward 	if (incmd)
25316280Sedward 		if (new && !terse) {
25416280Sedward 			wwdelete(cmdwin);
25516280Sedward 			reframe();
25616280Sedward 		} else if (!new && terse)
25716280Sedward 			wwadd(cmdwin, &wwhead);
25816280Sedward 	terse = new;
25916280Sedward }
26016280Sedward 
26116280Sedward /*
26216280Sedward  * Set the current window.
26316280Sedward  */
26416280Sedward setselwin(w)
26516280Sedward struct ww *w;
26616280Sedward {
26716280Sedward 	if (selwin == w)
26816280Sedward 		return;
26916304Sedward 	if (selwin != 0)
27016304Sedward 		lastselwin = selwin;
27116304Sedward 	if ((selwin = w) != 0)
27216304Sedward 		front(selwin, 1);
27316280Sedward }
274