xref: /csrg-svn/usr.bin/window/cmd.c (revision 14177)
113977Sedward #ifndef lint
2*14177Sedward static	char *sccsid = "@(#)cmd.c	1.6 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:
15*14177Sedward 	if (!terse)
16*14177Sedward 		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) {
22*14177Sedward 		default:
23*14177Sedward 			if (c == escapec)
24*14177Sedward 				goto foo;
25*14177Sedward 			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([):
34*14177Sedward 		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 '%':
5013977Sedward 			if ((w = getwin()) == 0)
5113977Sedward 				break;
5213977Sedward 			setselwin(w);
5313977Sedward 			break;
5413977Sedward 		case 'c':
5514071Sedward 			doclose(CLOSE_ONE, getwin());
5614071Sedward 			break;
5713977Sedward 		case 'C':
5814071Sedward 			doclose(CLOSE_DEAD, (struct ww *)0);
5914071Sedward 			break;
6013977Sedward 		case 'Z':
6114071Sedward 			doclose(CLOSE_ALL, (struct ww *)0);
6213977Sedward 			break;
6313977Sedward 		case 'w':
6413977Sedward 			dowindow();
6513977Sedward 			break;
6613994Sedward 		case 'Q':
6713994Sedward 			doquery();
6813994Sedward 			break;
69*14177Sedward 		case 'e':
70*14177Sedward 			doescape();
71*14177Sedward 			break;
7213977Sedward 		case 'r':
7313977Sedward 			selwin->ww_refresh = 0;
7413977Sedward 			break;
7513977Sedward 		case 'R':
7613977Sedward 			selwin->ww_refresh = 1;
7713977Sedward 			break;
7814080Sedward 		case 's':
7914080Sedward 			dostat();
8014080Sedward 			break;
8113977Sedward 		case 't':
8213977Sedward 			dotime(RUSAGE_SELF);
8313977Sedward 			break;
8413977Sedward 		case 'T':
8513977Sedward 			dotime(RUSAGE_CHILDREN);
8613977Sedward 			break;
8714071Sedward 		case 'h':
8814071Sedward 			Wcurleft(selwin->ww_win, 1);
8914071Sedward 			break;
9014071Sedward 		case 'j':
9114071Sedward 			Wcurdown(selwin->ww_win, 1);
9214071Sedward 			break;
9314071Sedward 		case 'k':
9414071Sedward 			Wcurup(selwin->ww_win, 1);
9514071Sedward 			break;
9614071Sedward 		case 'l':
9714071Sedward 			Wcurright(selwin->ww_win, 1);
9814071Sedward 			break;
9914071Sedward 		case CTRL(d):
10014071Sedward 			doscroll(1);
10114071Sedward 			break;
10214071Sedward 		case CTRL(u):
10314071Sedward 			doscroll(-1);
10414071Sedward 			break;
10514071Sedward 		case CTRL(f):
10614071Sedward 			doscroll(2);
10714071Sedward 			break;
10814071Sedward 		case CTRL(b):
10914071Sedward 			doscroll(-2);
11014071Sedward 			break;
11113977Sedward 		case CTRL(l):
11213977Sedward 			ScreenGarbaged = 1;
11313977Sedward 			break;
11413977Sedward 		case '?':
11513977Sedward 			dohelp();
11613977Sedward 			break;
11713977Sedward 		case CTRL([):
11813977Sedward 			goto out;
11913977Sedward 		case CTRL(z):
12013977Sedward 			wwsuspend();
12113977Sedward 			break;
12213977Sedward 		case '.':
12314025Sedward 			doquit();
12414025Sedward 			if (quit)
12514025Sedward 				goto out;
12614025Sedward 			break;
12713977Sedward 		default:
128*14177Sedward 			if (c == escapec) {
129*14177Sedward 				write(selwin->ww_pty, &escapec, 1);
130*14177Sedward 				goto out;
131*14177Sedward 			}
13213977Sedward 			Ding();
13314025Sedward 			wwprintf(cmdwin, "Type ? for help.  ");
13413977Sedward 			break;
13513977Sedward 		}
13613977Sedward 	}
13713977Sedward 	wwputs("Command: ", cmdwin);
13813977Sedward 	wwsetcursor(WCurRow(cmdwin->ww_win), WCurCol(cmdwin->ww_win));
13913994Sedward 	while (bpeekc() < 0)
14013977Sedward 		bread();
14113977Sedward 	goto top;
14213977Sedward out:
14313977Sedward 	if (!quit)
14414025Sedward 		wwsetcurwin(selwin);
14514071Sedward 	if (selwin != 0)
14614071Sedward 		Woncursor(selwin->ww_win, 0);
147*14177Sedward 	if (!terse)
148*14177Sedward 		Whide(cmdwin->ww_win);
14913977Sedward }
15013977Sedward 
15113977Sedward struct ww *
15213977Sedward getwin()
15313977Sedward {
15413977Sedward 	register int c;
15513977Sedward 	struct ww *w;
15613977Sedward 
15713994Sedward 	while ((c = bgetc()) < 0)
15813977Sedward 		bread();
15913977Sedward 	if (c < '1' || c > '9') {
16013977Sedward 		Ding();
16113977Sedward 		return 0;
16213977Sedward 	}
16313977Sedward 	if ((w = wwfind(c - '0')) == 0)
16413977Sedward 		Ding();
16513977Sedward 	return w;
16613977Sedward }
16713977Sedward 
16813977Sedward setselwin(w)
16913977Sedward register struct ww *w;
17013977Sedward {
17114071Sedward 	if (selwin) {
17213977Sedward 		labelwin(selwin, 0);
17314071Sedward 		Woncursor(selwin->ww_win, 0);
17414071Sedward 	}
17514071Sedward 	if (selwin = w) {
17613977Sedward 		labelwin(w, WINVERSE);
17713977Sedward 		/* bring it to the top just below cmdwin */
17814025Sedward 		wwsetcurwin(w);
17914025Sedward 		wwsetcurwin(cmdwin);
18014071Sedward 		Woncursor(w->ww_win, 1);
18113977Sedward 	}
18213977Sedward }
18313977Sedward 
18413977Sedward labelwin(w, mode)
18513977Sedward register struct ww *w;
18613977Sedward {
18713977Sedward 	char buf[2];
18813977Sedward 
18913977Sedward 	buf[0] = w->ww_ident + '0';
19013977Sedward 	buf[1] = 0;
191*14177Sedward 	wwlabel(w, 1, buf, mode);
192*14177Sedward 	/*
193*14177Sedward 	if (w->ww_label)
194*14177Sedward 		wwlabel(w, 3, w->ww_label, mode);
195*14177Sedward 	*/
19613977Sedward }
197