xref: /csrg-svn/usr.bin/window/cmd.c (revision 14189)
113977Sedward #ifndef lint
2*14189Sedward static	char *sccsid = "@(#)cmd.c	1.8 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 
1414177Sedward 	if (!terse)
1514177Sedward 		Wunhide(cmdwin->ww_win);
1614071Sedward 	if (selwin != 0)
1714071Sedward 		Woncursor(selwin->ww_win, 1);
18*14189Sedward top:
1913977Sedward 	while ((c = bgetc()) >= 0) {
20*14189Sedward 		if (!terse)
21*14189Sedward 			wwputs("\r\n", cmdwin);
2213977Sedward 		switch (c) {
2314177Sedward 		default:
2414177Sedward 			if (c == escapec)
2514177Sedward 				goto foo;
2614177Sedward 			break;
2714071Sedward 		case 'h': case 'j': case 'k': case 'l':
2814071Sedward 		case CTRL(u):
2914071Sedward 		case CTRL(d):
3014071Sedward 		case CTRL(b):
3114071Sedward 		case CTRL(f):
3213977Sedward 		case CTRL([):
3314177Sedward 		foo:
3413977Sedward 			if (selwin == 0) {
35*14189Sedward 				if (!terse)
36*14189Sedward 					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 '%':
5014184Sedward 			if ((w = getwin()) != 0)
5114184Sedward 				setselwin(w);
5213977Sedward 			break;
5313977Sedward 		case 'c':
5414184Sedward 			if ((w = getwin()) != 0)
5514184Sedward 				doclose(w);
5614071Sedward 			break;
5713977Sedward 		case 'C':
5814184Sedward 			doclose((struct ww *)0);
5914071Sedward 			break;
6013977Sedward 		case 'Z':
61*14189Sedward 			if (terse)
62*14189Sedward 				Ding();
63*14189Sedward 			else
64*14189Sedward 				wwputs("Command Z is now C.  ", cmdwin);
6513977Sedward 			break;
6613977Sedward 		case 'w':
6713977Sedward 			dowindow();
6813977Sedward 			break;
6914184Sedward 		case 'S':
7014184Sedward 			doshow();
7113994Sedward 			break;
72*14189Sedward 		case 'L':
73*14189Sedward 			dolist();
74*14189Sedward 			break;
75*14189Sedward 		/*
7614177Sedward 		case 'e':
7714177Sedward 			doescape();
7814177Sedward 			break;
7914184Sedward 		case 'L':
8014184Sedward 			dolabel();
8114184Sedward 			break;
8213977Sedward 		case 'r':
8313977Sedward 			selwin->ww_refresh = 0;
8413977Sedward 			break;
8513977Sedward 		case 'R':
8613977Sedward 			selwin->ww_refresh = 1;
8713977Sedward 			break;
88*14189Sedward 		*/
8914080Sedward 		case 's':
9014080Sedward 			dostat();
9114080Sedward 			break;
9213977Sedward 		case 't':
9313977Sedward 			dotime(RUSAGE_SELF);
9413977Sedward 			break;
9513977Sedward 		case 'T':
9613977Sedward 			dotime(RUSAGE_CHILDREN);
9713977Sedward 			break;
9814184Sedward 		case ':':
9914184Sedward 			docolon();
10014184Sedward 			break;
10114071Sedward 		case 'h':
10214071Sedward 			Wcurleft(selwin->ww_win, 1);
10314071Sedward 			break;
10414071Sedward 		case 'j':
10514071Sedward 			Wcurdown(selwin->ww_win, 1);
10614071Sedward 			break;
10714071Sedward 		case 'k':
10814071Sedward 			Wcurup(selwin->ww_win, 1);
10914071Sedward 			break;
11014071Sedward 		case 'l':
11114071Sedward 			Wcurright(selwin->ww_win, 1);
11214071Sedward 			break;
11314071Sedward 		case CTRL(d):
11414071Sedward 			doscroll(1);
11514071Sedward 			break;
11614071Sedward 		case CTRL(u):
11714071Sedward 			doscroll(-1);
11814071Sedward 			break;
11914071Sedward 		case CTRL(f):
12014071Sedward 			doscroll(2);
12114071Sedward 			break;
12214071Sedward 		case CTRL(b):
12314071Sedward 			doscroll(-2);
12414071Sedward 			break;
12513977Sedward 		case CTRL(l):
12613977Sedward 			ScreenGarbaged = 1;
12713977Sedward 			break;
12813977Sedward 		case '?':
12913977Sedward 			dohelp();
13013977Sedward 			break;
13113977Sedward 		case CTRL([):
13213977Sedward 			goto out;
13313977Sedward 		case CTRL(z):
13413977Sedward 			wwsuspend();
13513977Sedward 			break;
136*14189Sedward 		case 'q':
13714025Sedward 			doquit();
13814025Sedward 			if (quit)
13914025Sedward 				goto out;
14014025Sedward 			break;
141*14189Sedward 		case '.':
142*14189Sedward 			if (terse)
143*14189Sedward 				Ding();
144*14189Sedward 			else
145*14189Sedward 				wwputs("Use q to quit.  ", cmdwin);
146*14189Sedward 			break;
14713977Sedward 		default:
14814177Sedward 			if (c == escapec) {
14914177Sedward 				write(selwin->ww_pty, &escapec, 1);
15014177Sedward 				goto out;
15114177Sedward 			}
15213977Sedward 			Ding();
153*14189Sedward 			if (!terse)
154*14189Sedward 				wwprintf(cmdwin, "Type ? for help.  ");
15513977Sedward 			break;
15613977Sedward 		}
15713977Sedward 	}
158*14189Sedward 	if (terse)
159*14189Sedward 		wwsetcursor(0, 0);
160*14189Sedward 	else {
161*14189Sedward 		if (!terse)
162*14189Sedward 			wwputs("Command: ", cmdwin);
163*14189Sedward 		wwsetcursor(WCurRow(cmdwin->ww_win), WCurCol(cmdwin->ww_win));
164*14189Sedward 	}
16513994Sedward 	while (bpeekc() < 0)
16613977Sedward 		bread();
16713977Sedward 	goto top;
16813977Sedward out:
16913977Sedward 	if (!quit)
17014025Sedward 		wwsetcurwin(selwin);
17114071Sedward 	if (selwin != 0)
17214071Sedward 		Woncursor(selwin->ww_win, 0);
17314177Sedward 	if (!terse)
17414177Sedward 		Whide(cmdwin->ww_win);
17513977Sedward }
17613977Sedward 
17713977Sedward struct ww *
17813977Sedward getwin()
17913977Sedward {
18013977Sedward 	register int c;
18114184Sedward 	struct ww *w = 0;
18213977Sedward 
183*14189Sedward 	if (!terse)
184*14189Sedward 		wwputs("Which window? ", cmdwin);
18514184Sedward 	wwsetcursor(WCurRow(cmdwin->ww_win), WCurCol(cmdwin->ww_win));
18613994Sedward 	while ((c = bgetc()) < 0)
18713977Sedward 		bread();
18814184Sedward 	if (c < '1' || c > '9' || (w = wwfind(c - '0')) == 0)
18913977Sedward 		Ding();
190*14189Sedward 	if (!terse)
191*14189Sedward 		wwputs("\r\n", cmdwin);
19213977Sedward 	return w;
19313977Sedward }
19413977Sedward 
19513977Sedward setselwin(w)
19613977Sedward register struct ww *w;
19713977Sedward {
19814184Sedward 	struct ww *oldselwin = selwin;
19914184Sedward 
20014184Sedward 	if (w == oldselwin)
20114184Sedward 		return;
20214071Sedward 	if (selwin = w) {
20314184Sedward 		labelwin(w);
20413977Sedward 		/* bring it to the top just below cmdwin */
20514025Sedward 		wwsetcurwin(w);
20614025Sedward 		wwsetcurwin(cmdwin);
20714071Sedward 		Woncursor(w->ww_win, 1);
20813977Sedward 	}
20914184Sedward 	if (oldselwin) {
21014184Sedward 		labelwin(oldselwin);
21114184Sedward 		Woncursor(oldselwin->ww_win, 0);
21214184Sedward 	}
21313977Sedward }
21413977Sedward 
21514184Sedward labelwin(w)
21613977Sedward register struct ww *w;
21713977Sedward {
21813977Sedward 	char buf[2];
21914184Sedward 	int mode = w == selwin ? WINVERSE : 0;
22013977Sedward 
22113977Sedward 	buf[0] = w->ww_ident + '0';
22213977Sedward 	buf[1] = 0;
22314177Sedward 	wwlabel(w, 1, buf, mode);
22414177Sedward 	if (w->ww_label)
22514177Sedward 		wwlabel(w, 3, w->ww_label, mode);
22613977Sedward }
227