xref: /csrg-svn/usr.bin/window/cmd.c (revision 13977)
1*13977Sedward #ifndef lint
2*13977Sedward static	char *sccsid = "@(#)cmd.c	1.1 83/07/18";
3*13977Sedward #endif
4*13977Sedward 
5*13977Sedward #include "defs.h"
6*13977Sedward 
7*13977Sedward struct ww *getwin();
8*13977Sedward struct ww *openwin();
9*13977Sedward char *strtime();
10*13977Sedward 
11*13977Sedward docmd()
12*13977Sedward {
13*13977Sedward 	register char c;
14*13977Sedward 	register struct ww *w;
15*13977Sedward 	char buf;
16*13977Sedward 
17*13977Sedward top:
18*13977Sedward 	Wunhide(cmdwin->ww_win);
19*13977Sedward 	while ((c = bgetc()) >= 0) {
20*13977Sedward 		wwputs("\r\n", cmdwin);
21*13977Sedward 		switch (c) {
22*13977Sedward 		case 'r':
23*13977Sedward 		case 'R':
24*13977Sedward 		case CTRL([):
25*13977Sedward 		case ESCAPE:
26*13977Sedward 			if (selwin == 0) {
27*13977Sedward 				wwputs("No window.  ", cmdwin);
28*13977Sedward 				continue;
29*13977Sedward 			}
30*13977Sedward 		}
31*13977Sedward 		switch (c) {
32*13977Sedward 		case '1': case '2': case '3': case '4': case '5':
33*13977Sedward 		case '6': case '7': case '8': case '9':
34*13977Sedward 			if ((w = wwfind(c - '0')) == 0) {
35*13977Sedward 				Ding();
36*13977Sedward 				break;
37*13977Sedward 			}
38*13977Sedward 			setselwin(w);
39*13977Sedward 			goto out;
40*13977Sedward 		case '%':
41*13977Sedward 			if ((w = getwin()) == 0)
42*13977Sedward 				break;
43*13977Sedward 			setselwin(w);
44*13977Sedward 			break;
45*13977Sedward 		case 'c':
46*13977Sedward 		case 'C':
47*13977Sedward 		case 'Z':
48*13977Sedward 			doclose(c);
49*13977Sedward 			break;
50*13977Sedward 		case 'w':
51*13977Sedward 			dowindow();
52*13977Sedward 			break;
53*13977Sedward 		case 'r':
54*13977Sedward 			selwin->ww_refresh = 0;
55*13977Sedward 			break;
56*13977Sedward 		case 'R':
57*13977Sedward 			selwin->ww_refresh = 1;
58*13977Sedward 			break;
59*13977Sedward 		case 't':
60*13977Sedward 			dotime(RUSAGE_SELF);
61*13977Sedward 			break;
62*13977Sedward 		case 'T':
63*13977Sedward 			dotime(RUSAGE_CHILDREN);
64*13977Sedward 			break;
65*13977Sedward 		case CTRL(l):
66*13977Sedward 			ScreenGarbaged = 1;
67*13977Sedward 			break;
68*13977Sedward 		case '?':
69*13977Sedward 			dohelp();
70*13977Sedward 			break;
71*13977Sedward 		case ESCAPE:
72*13977Sedward 			buf = ESCAPE;
73*13977Sedward 			write(selwin->ww_pty, &buf, 1);
74*13977Sedward 		case CTRL([):
75*13977Sedward 			goto out;
76*13977Sedward 		case CTRL(z):
77*13977Sedward 			wwsuspend();
78*13977Sedward 			break;
79*13977Sedward 		case '.':
80*13977Sedward 			quit++;
81*13977Sedward 			goto out;
82*13977Sedward 		default:
83*13977Sedward 			Ding();
84*13977Sedward 			wwputs("Type ? for help.  ", cmdwin);
85*13977Sedward 			break;
86*13977Sedward 		}
87*13977Sedward 	}
88*13977Sedward 	wwputs("Command: ", cmdwin);
89*13977Sedward 	wwsetcursor(WCurRow(cmdwin->ww_win), WCurCol(cmdwin->ww_win));
90*13977Sedward 	while (bpeekc() < 0) {
91*13977Sedward 		wwflush();
92*13977Sedward 		bread();
93*13977Sedward 	}
94*13977Sedward 	goto top;
95*13977Sedward out:
96*13977Sedward 	if (!quit)
97*13977Sedward 		wwsetcurrent(selwin);
98*13977Sedward 	Whide(cmdwin->ww_win);
99*13977Sedward }
100*13977Sedward 
101*13977Sedward struct ww *
102*13977Sedward getwin()
103*13977Sedward {
104*13977Sedward 	register int c;
105*13977Sedward 	struct ww *w;
106*13977Sedward 
107*13977Sedward 	while ((c = bgetc()) < 0) {
108*13977Sedward 		wwflush();
109*13977Sedward 		bread();
110*13977Sedward 	}
111*13977Sedward 	if (c < '1' || c > '9') {
112*13977Sedward 		Ding();
113*13977Sedward 		return 0;
114*13977Sedward 	}
115*13977Sedward 	if ((w = wwfind(c - '0')) == 0)
116*13977Sedward 		Ding();
117*13977Sedward 	return w;
118*13977Sedward }
119*13977Sedward 
120*13977Sedward setselwin(w)
121*13977Sedward register struct ww *w;
122*13977Sedward {
123*13977Sedward 	if (selwin)
124*13977Sedward 		labelwin(selwin, 0);
125*13977Sedward 	selwin = w;
126*13977Sedward 	if (w) {
127*13977Sedward 		labelwin(w, WINVERSE);
128*13977Sedward 		/* bring it to the top just below cmdwin */
129*13977Sedward 		wwsetcurrent(w);
130*13977Sedward 		wwsetcurrent(cmdwin);
131*13977Sedward 	}
132*13977Sedward }
133*13977Sedward 
134*13977Sedward labelwin(w, mode)
135*13977Sedward register struct ww *w;
136*13977Sedward {
137*13977Sedward 	char buf[2];
138*13977Sedward 
139*13977Sedward 	buf[0] = w->ww_ident + '0';
140*13977Sedward 	buf[1] = 0;
141*13977Sedward 	wwlabel(w, buf, mode);
142*13977Sedward }
143