xref: /csrg-svn/usr.bin/window/cmd.c (revision 14184)
113977Sedward #ifndef lint
2*14184Sedward static	char *sccsid = "@(#)cmd.c	1.7 83/07/28";
313977Sedward #endif
413977Sedward 
513977Sedward #include "defs.h"
613977Sedward 
713977Sedward struct ww *getwin();
813977Sedward 
913977Sedward docmd()
1013977Sedward {
1113977Sedward 	register char c;
1213977Sedward 	register struct ww *w;
1313977Sedward 
1413977Sedward top:
1514177Sedward 	if (!terse)
1614177Sedward 		Wunhide(cmdwin->ww_win);
1714071Sedward 	if (selwin != 0)
1814071Sedward 		Woncursor(selwin->ww_win, 1);
1913977Sedward 	while ((c = bgetc()) >= 0) {
2013977Sedward 		wwputs("\r\n", cmdwin);
2113977Sedward 		switch (c) {
2214177Sedward 		default:
2314177Sedward 			if (c == escapec)
2414177Sedward 				goto foo;
2514177Sedward 			break;
2613977Sedward 		case 'r':
2713977Sedward 		case 'R':
2814071Sedward 		case 'h': case 'j': case 'k': case 'l':
2914071Sedward 		case CTRL(u):
3014071Sedward 		case CTRL(d):
3114071Sedward 		case CTRL(b):
3214071Sedward 		case CTRL(f):
3313977Sedward 		case CTRL([):
3414177Sedward 		foo:
3513977Sedward 			if (selwin == 0) {
3613977Sedward 				wwputs("No window.  ", cmdwin);
3713977Sedward 				continue;
3813977Sedward 			}
3913977Sedward 		}
4013977Sedward 		switch (c) {
4113977Sedward 		case '1': case '2': case '3': case '4': case '5':
4213977Sedward 		case '6': case '7': case '8': case '9':
4313977Sedward 			if ((w = wwfind(c - '0')) == 0) {
4413977Sedward 				Ding();
4513977Sedward 				break;
4613977Sedward 			}
4713977Sedward 			setselwin(w);
4813977Sedward 			goto out;
4913977Sedward 		case '%':
50*14184Sedward 			if ((w = getwin()) != 0)
51*14184Sedward 				setselwin(w);
5213977Sedward 			break;
5313977Sedward 		case 'c':
54*14184Sedward 			if ((w = getwin()) != 0)
55*14184Sedward 				doclose(w);
5614071Sedward 			break;
5713977Sedward 		case 'C':
58*14184Sedward 			doclose((struct ww *)0);
5914071Sedward 			break;
6013977Sedward 		case 'Z':
61*14184Sedward 			wwputs("Command Z is now C.  ", cmdwin);
6213977Sedward 			break;
6313977Sedward 		case 'w':
6413977Sedward 			dowindow();
6513977Sedward 			break;
66*14184Sedward 		case 'S':
67*14184Sedward 			doshow();
6813994Sedward 			break;
6914177Sedward 		case 'e':
7014177Sedward 			doescape();
7114177Sedward 			break;
72*14184Sedward 		case 'L':
73*14184Sedward 			dolabel();
74*14184Sedward 			break;
7513977Sedward 		case 'r':
7613977Sedward 			selwin->ww_refresh = 0;
7713977Sedward 			break;
7813977Sedward 		case 'R':
7913977Sedward 			selwin->ww_refresh = 1;
8013977Sedward 			break;
8114080Sedward 		case 's':
8214080Sedward 			dostat();
8314080Sedward 			break;
8413977Sedward 		case 't':
8513977Sedward 			dotime(RUSAGE_SELF);
8613977Sedward 			break;
8713977Sedward 		case 'T':
8813977Sedward 			dotime(RUSAGE_CHILDREN);
8913977Sedward 			break;
90*14184Sedward 		case ':':
91*14184Sedward 			docolon();
92*14184Sedward 			break;
9314071Sedward 		case 'h':
9414071Sedward 			Wcurleft(selwin->ww_win, 1);
9514071Sedward 			break;
9614071Sedward 		case 'j':
9714071Sedward 			Wcurdown(selwin->ww_win, 1);
9814071Sedward 			break;
9914071Sedward 		case 'k':
10014071Sedward 			Wcurup(selwin->ww_win, 1);
10114071Sedward 			break;
10214071Sedward 		case 'l':
10314071Sedward 			Wcurright(selwin->ww_win, 1);
10414071Sedward 			break;
10514071Sedward 		case CTRL(d):
10614071Sedward 			doscroll(1);
10714071Sedward 			break;
10814071Sedward 		case CTRL(u):
10914071Sedward 			doscroll(-1);
11014071Sedward 			break;
11114071Sedward 		case CTRL(f):
11214071Sedward 			doscroll(2);
11314071Sedward 			break;
11414071Sedward 		case CTRL(b):
11514071Sedward 			doscroll(-2);
11614071Sedward 			break;
11713977Sedward 		case CTRL(l):
11813977Sedward 			ScreenGarbaged = 1;
11913977Sedward 			break;
12013977Sedward 		case '?':
12113977Sedward 			dohelp();
12213977Sedward 			break;
12313977Sedward 		case CTRL([):
12413977Sedward 			goto out;
12513977Sedward 		case CTRL(z):
12613977Sedward 			wwsuspend();
12713977Sedward 			break;
12813977Sedward 		case '.':
12914025Sedward 			doquit();
13014025Sedward 			if (quit)
13114025Sedward 				goto out;
13214025Sedward 			break;
13313977Sedward 		default:
13414177Sedward 			if (c == escapec) {
13514177Sedward 				write(selwin->ww_pty, &escapec, 1);
13614177Sedward 				goto out;
13714177Sedward 			}
13813977Sedward 			Ding();
13914025Sedward 			wwprintf(cmdwin, "Type ? for help.  ");
14013977Sedward 			break;
14113977Sedward 		}
14213977Sedward 	}
14313977Sedward 	wwputs("Command: ", cmdwin);
14413977Sedward 	wwsetcursor(WCurRow(cmdwin->ww_win), WCurCol(cmdwin->ww_win));
14513994Sedward 	while (bpeekc() < 0)
14613977Sedward 		bread();
14713977Sedward 	goto top;
14813977Sedward out:
14913977Sedward 	if (!quit)
15014025Sedward 		wwsetcurwin(selwin);
15114071Sedward 	if (selwin != 0)
15214071Sedward 		Woncursor(selwin->ww_win, 0);
15314177Sedward 	if (!terse)
15414177Sedward 		Whide(cmdwin->ww_win);
15513977Sedward }
15613977Sedward 
15713977Sedward struct ww *
15813977Sedward getwin()
15913977Sedward {
16013977Sedward 	register int c;
161*14184Sedward 	struct ww *w = 0;
16213977Sedward 
163*14184Sedward 	wwputs("Which window? ", cmdwin);
164*14184Sedward 	wwsetcursor(WCurRow(cmdwin->ww_win), WCurCol(cmdwin->ww_win));
16513994Sedward 	while ((c = bgetc()) < 0)
16613977Sedward 		bread();
167*14184Sedward 	if (c < '1' || c > '9' || (w = wwfind(c - '0')) == 0)
16813977Sedward 		Ding();
169*14184Sedward 	wwputs("\r\n", cmdwin);
17013977Sedward 	return w;
17113977Sedward }
17213977Sedward 
17313977Sedward setselwin(w)
17413977Sedward register struct ww *w;
17513977Sedward {
176*14184Sedward 	struct ww *oldselwin = selwin;
177*14184Sedward 
178*14184Sedward 	if (w == oldselwin)
179*14184Sedward 		return;
18014071Sedward 	if (selwin = w) {
181*14184Sedward 		labelwin(w);
18213977Sedward 		/* bring it to the top just below cmdwin */
18314025Sedward 		wwsetcurwin(w);
18414025Sedward 		wwsetcurwin(cmdwin);
18514071Sedward 		Woncursor(w->ww_win, 1);
18613977Sedward 	}
187*14184Sedward 	if (oldselwin) {
188*14184Sedward 		labelwin(oldselwin);
189*14184Sedward 		Woncursor(oldselwin->ww_win, 0);
190*14184Sedward 	}
19113977Sedward }
19213977Sedward 
193*14184Sedward labelwin(w)
19413977Sedward register struct ww *w;
19513977Sedward {
19613977Sedward 	char buf[2];
197*14184Sedward 	int mode = w == selwin ? WINVERSE : 0;
19813977Sedward 
19913977Sedward 	buf[0] = w->ww_ident + '0';
20013977Sedward 	buf[1] = 0;
20114177Sedward 	wwlabel(w, 1, buf, mode);
20214177Sedward 	if (w->ww_label)
20314177Sedward 		wwlabel(w, 3, w->ww_label, mode);
20413977Sedward }
205