xref: /csrg-svn/usr.bin/window/cmd.c (revision 14071)
113977Sedward #ifndef lint
2*14071Sedward static	char *sccsid = "@(#)cmd.c	1.4 83/07/22";
313977Sedward #endif
413977Sedward 
513977Sedward #include "defs.h"
613977Sedward 
713977Sedward struct ww *getwin();
813977Sedward struct ww *openwin();
913977Sedward char *strtime();
1013977Sedward 
1113977Sedward docmd()
1213977Sedward {
1313977Sedward 	register char c;
1413977Sedward 	register struct ww *w;
1513977Sedward 	char buf;
1613977Sedward 
1713977Sedward top:
1813977Sedward 	Wunhide(cmdwin->ww_win);
19*14071Sedward 	if (selwin != 0)
20*14071Sedward 		Woncursor(selwin->ww_win, 1);
2113977Sedward 	while ((c = bgetc()) >= 0) {
2213977Sedward 		wwputs("\r\n", cmdwin);
2313977Sedward 		switch (c) {
2413977Sedward 		case 'r':
2513977Sedward 		case 'R':
26*14071Sedward 		case 'h': case 'j': case 'k': case 'l':
27*14071Sedward 		case CTRL(u):
28*14071Sedward 		case CTRL(d):
29*14071Sedward 		case CTRL(b):
30*14071Sedward 		case CTRL(f):
3113977Sedward 		case CTRL([):
3213977Sedward 		case ESCAPE:
3313977Sedward 			if (selwin == 0) {
3413977Sedward 				wwputs("No window.  ", cmdwin);
3513977Sedward 				continue;
3613977Sedward 			}
3713977Sedward 		}
3813977Sedward 		switch (c) {
3913977Sedward 		case '1': case '2': case '3': case '4': case '5':
4013977Sedward 		case '6': case '7': case '8': case '9':
4113977Sedward 			if ((w = wwfind(c - '0')) == 0) {
4213977Sedward 				Ding();
4313977Sedward 				break;
4413977Sedward 			}
4513977Sedward 			setselwin(w);
4613977Sedward 			goto out;
4713977Sedward 		case '%':
4813977Sedward 			if ((w = getwin()) == 0)
4913977Sedward 				break;
5013977Sedward 			setselwin(w);
5113977Sedward 			break;
5213977Sedward 		case 'c':
53*14071Sedward 			doclose(CLOSE_ONE, getwin());
54*14071Sedward 			break;
5513977Sedward 		case 'C':
56*14071Sedward 			doclose(CLOSE_DEAD, (struct ww *)0);
57*14071Sedward 			break;
5813977Sedward 		case 'Z':
59*14071Sedward 			doclose(CLOSE_ALL, (struct ww *)0);
6013977Sedward 			break;
6113977Sedward 		case 'w':
6213977Sedward 			dowindow();
6313977Sedward 			break;
6413994Sedward 		case 'Q':
6513994Sedward 			doquery();
6613994Sedward 			break;
6713977Sedward 		case 'r':
6813977Sedward 			selwin->ww_refresh = 0;
6913977Sedward 			break;
7013977Sedward 		case 'R':
7113977Sedward 			selwin->ww_refresh = 1;
7213977Sedward 			break;
7313977Sedward 		case 't':
7413977Sedward 			dotime(RUSAGE_SELF);
7513977Sedward 			break;
7613977Sedward 		case 'T':
7713977Sedward 			dotime(RUSAGE_CHILDREN);
7813977Sedward 			break;
79*14071Sedward 		case 'h':
80*14071Sedward 			Wcurleft(selwin->ww_win, 1);
81*14071Sedward 			break;
82*14071Sedward 		case 'j':
83*14071Sedward 			Wcurdown(selwin->ww_win, 1);
84*14071Sedward 			break;
85*14071Sedward 		case 'k':
86*14071Sedward 			Wcurup(selwin->ww_win, 1);
87*14071Sedward 			break;
88*14071Sedward 		case 'l':
89*14071Sedward 			Wcurright(selwin->ww_win, 1);
90*14071Sedward 			break;
91*14071Sedward 		case CTRL(d):
92*14071Sedward 			doscroll(1);
93*14071Sedward 			break;
94*14071Sedward 		case CTRL(u):
95*14071Sedward 			doscroll(-1);
96*14071Sedward 			break;
97*14071Sedward 		case CTRL(f):
98*14071Sedward 			doscroll(2);
99*14071Sedward 			break;
100*14071Sedward 		case CTRL(b):
101*14071Sedward 			doscroll(-2);
102*14071Sedward 			break;
10313977Sedward 		case CTRL(l):
10413977Sedward 			ScreenGarbaged = 1;
10513977Sedward 			break;
10613977Sedward 		case '?':
10713977Sedward 			dohelp();
10813977Sedward 			break;
10913977Sedward 		case ESCAPE:
11013977Sedward 			buf = ESCAPE;
11113977Sedward 			write(selwin->ww_pty, &buf, 1);
11213977Sedward 		case CTRL([):
11313977Sedward 			goto out;
11413977Sedward 		case CTRL(z):
11513977Sedward 			wwsuspend();
11613977Sedward 			break;
11713977Sedward 		case '.':
11814025Sedward 			doquit();
11914025Sedward 			if (quit)
12014025Sedward 				goto out;
12114025Sedward 			break;
12213977Sedward 		default:
12313977Sedward 			Ding();
12414025Sedward 			wwprintf(cmdwin, "Type ? for help.  ");
12513977Sedward 			break;
12613977Sedward 		}
12713977Sedward 	}
12813977Sedward 	wwputs("Command: ", cmdwin);
12913977Sedward 	wwsetcursor(WCurRow(cmdwin->ww_win), WCurCol(cmdwin->ww_win));
13013994Sedward 	while (bpeekc() < 0)
13113977Sedward 		bread();
13213977Sedward 	goto top;
13313977Sedward out:
13413977Sedward 	if (!quit)
13514025Sedward 		wwsetcurwin(selwin);
136*14071Sedward 	if (selwin != 0)
137*14071Sedward 		Woncursor(selwin->ww_win, 0);
13813977Sedward 	Whide(cmdwin->ww_win);
13913977Sedward }
14013977Sedward 
14113977Sedward struct ww *
14213977Sedward getwin()
14313977Sedward {
14413977Sedward 	register int c;
14513977Sedward 	struct ww *w;
14613977Sedward 
14713994Sedward 	while ((c = bgetc()) < 0)
14813977Sedward 		bread();
14913977Sedward 	if (c < '1' || c > '9') {
15013977Sedward 		Ding();
15113977Sedward 		return 0;
15213977Sedward 	}
15313977Sedward 	if ((w = wwfind(c - '0')) == 0)
15413977Sedward 		Ding();
15513977Sedward 	return w;
15613977Sedward }
15713977Sedward 
15813977Sedward setselwin(w)
15913977Sedward register struct ww *w;
16013977Sedward {
161*14071Sedward 	if (selwin) {
16213977Sedward 		labelwin(selwin, 0);
163*14071Sedward 		Woncursor(selwin->ww_win, 0);
164*14071Sedward 	}
165*14071Sedward 	if (selwin = w) {
16613977Sedward 		labelwin(w, WINVERSE);
16713977Sedward 		/* bring it to the top just below cmdwin */
16814025Sedward 		wwsetcurwin(w);
16914025Sedward 		wwsetcurwin(cmdwin);
170*14071Sedward 		Woncursor(w->ww_win, 1);
17113977Sedward 	}
17213977Sedward }
17313977Sedward 
17413977Sedward labelwin(w, mode)
17513977Sedward register struct ww *w;
17613977Sedward {
17713977Sedward 	char buf[2];
17813977Sedward 
17913977Sedward 	buf[0] = w->ww_ident + '0';
18013977Sedward 	buf[1] = 0;
18113977Sedward 	wwlabel(w, buf, mode);
18213977Sedward }
183