xref: /csrg-svn/usr.bin/window/cmd.c (revision 14080)
113977Sedward #ifndef lint
2*14080Sedward static	char *sccsid = "@(#)cmd.c	1.5 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);
1914071Sedward 	if (selwin != 0)
2014071Sedward 		Woncursor(selwin->ww_win, 1);
2113977Sedward 	while ((c = bgetc()) >= 0) {
2213977Sedward 		wwputs("\r\n", cmdwin);
2313977Sedward 		switch (c) {
2413977Sedward 		case 'r':
2513977Sedward 		case 'R':
2614071Sedward 		case 'h': case 'j': case 'k': case 'l':
2714071Sedward 		case CTRL(u):
2814071Sedward 		case CTRL(d):
2914071Sedward 		case CTRL(b):
3014071Sedward 		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':
5314071Sedward 			doclose(CLOSE_ONE, getwin());
5414071Sedward 			break;
5513977Sedward 		case 'C':
5614071Sedward 			doclose(CLOSE_DEAD, (struct ww *)0);
5714071Sedward 			break;
5813977Sedward 		case 'Z':
5914071Sedward 			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;
73*14080Sedward 		case 's':
74*14080Sedward 			dostat();
75*14080Sedward 			break;
7613977Sedward 		case 't':
7713977Sedward 			dotime(RUSAGE_SELF);
7813977Sedward 			break;
7913977Sedward 		case 'T':
8013977Sedward 			dotime(RUSAGE_CHILDREN);
8113977Sedward 			break;
8214071Sedward 		case 'h':
8314071Sedward 			Wcurleft(selwin->ww_win, 1);
8414071Sedward 			break;
8514071Sedward 		case 'j':
8614071Sedward 			Wcurdown(selwin->ww_win, 1);
8714071Sedward 			break;
8814071Sedward 		case 'k':
8914071Sedward 			Wcurup(selwin->ww_win, 1);
9014071Sedward 			break;
9114071Sedward 		case 'l':
9214071Sedward 			Wcurright(selwin->ww_win, 1);
9314071Sedward 			break;
9414071Sedward 		case CTRL(d):
9514071Sedward 			doscroll(1);
9614071Sedward 			break;
9714071Sedward 		case CTRL(u):
9814071Sedward 			doscroll(-1);
9914071Sedward 			break;
10014071Sedward 		case CTRL(f):
10114071Sedward 			doscroll(2);
10214071Sedward 			break;
10314071Sedward 		case CTRL(b):
10414071Sedward 			doscroll(-2);
10514071Sedward 			break;
10613977Sedward 		case CTRL(l):
10713977Sedward 			ScreenGarbaged = 1;
10813977Sedward 			break;
10913977Sedward 		case '?':
11013977Sedward 			dohelp();
11113977Sedward 			break;
11213977Sedward 		case ESCAPE:
11313977Sedward 			buf = ESCAPE;
11413977Sedward 			write(selwin->ww_pty, &buf, 1);
11513977Sedward 		case CTRL([):
11613977Sedward 			goto out;
11713977Sedward 		case CTRL(z):
11813977Sedward 			wwsuspend();
11913977Sedward 			break;
12013977Sedward 		case '.':
12114025Sedward 			doquit();
12214025Sedward 			if (quit)
12314025Sedward 				goto out;
12414025Sedward 			break;
12513977Sedward 		default:
12613977Sedward 			Ding();
12714025Sedward 			wwprintf(cmdwin, "Type ? for help.  ");
12813977Sedward 			break;
12913977Sedward 		}
13013977Sedward 	}
13113977Sedward 	wwputs("Command: ", cmdwin);
13213977Sedward 	wwsetcursor(WCurRow(cmdwin->ww_win), WCurCol(cmdwin->ww_win));
13313994Sedward 	while (bpeekc() < 0)
13413977Sedward 		bread();
13513977Sedward 	goto top;
13613977Sedward out:
13713977Sedward 	if (!quit)
13814025Sedward 		wwsetcurwin(selwin);
13914071Sedward 	if (selwin != 0)
14014071Sedward 		Woncursor(selwin->ww_win, 0);
14113977Sedward 	Whide(cmdwin->ww_win);
14213977Sedward }
14313977Sedward 
14413977Sedward struct ww *
14513977Sedward getwin()
14613977Sedward {
14713977Sedward 	register int c;
14813977Sedward 	struct ww *w;
14913977Sedward 
15013994Sedward 	while ((c = bgetc()) < 0)
15113977Sedward 		bread();
15213977Sedward 	if (c < '1' || c > '9') {
15313977Sedward 		Ding();
15413977Sedward 		return 0;
15513977Sedward 	}
15613977Sedward 	if ((w = wwfind(c - '0')) == 0)
15713977Sedward 		Ding();
15813977Sedward 	return w;
15913977Sedward }
16013977Sedward 
16113977Sedward setselwin(w)
16213977Sedward register struct ww *w;
16313977Sedward {
16414071Sedward 	if (selwin) {
16513977Sedward 		labelwin(selwin, 0);
16614071Sedward 		Woncursor(selwin->ww_win, 0);
16714071Sedward 	}
16814071Sedward 	if (selwin = w) {
16913977Sedward 		labelwin(w, WINVERSE);
17013977Sedward 		/* bring it to the top just below cmdwin */
17114025Sedward 		wwsetcurwin(w);
17214025Sedward 		wwsetcurwin(cmdwin);
17314071Sedward 		Woncursor(w->ww_win, 1);
17413977Sedward 	}
17513977Sedward }
17613977Sedward 
17713977Sedward labelwin(w, mode)
17813977Sedward register struct ww *w;
17913977Sedward {
18013977Sedward 	char buf[2];
18113977Sedward 
18213977Sedward 	buf[0] = w->ww_ident + '0';
18313977Sedward 	buf[1] = 0;
18413977Sedward 	wwlabel(w, buf, mode);
18513977Sedward }
186