xref: /csrg-svn/usr.bin/window/cmd.c (revision 14893)
113977Sedward #ifndef lint
2*14893Sedward static	char *sccsid = "@(#)cmd.c	3.10 83/09/01";
313977Sedward #endif
413977Sedward 
513977Sedward #include "defs.h"
613977Sedward 
713977Sedward docmd()
813977Sedward {
913977Sedward 	register char c;
1013977Sedward 	register struct ww *w;
1113977Sedward 
1214177Sedward 	if (!terse)
1314407Sedward 		wwadd(cmdwin, &wwhead);
1414071Sedward 	if (selwin != 0)
1514764Sedward 		wwcursor(selwin, 1);
16*14893Sedward 	for (;;) {
17*14893Sedward 		while ((c = bgetc()) >= 0) {
18*14893Sedward 			if (!terse)
19*14893Sedward 				(void) wwputs("\r\n", cmdwin);
20*14893Sedward 			switch (c) {
21*14893Sedward 			default:
22*14893Sedward 				if (c == escapec)
23*14893Sedward 					goto foo;
2413977Sedward 				break;
25*14893Sedward 			case 'h': case 'j': case 'k': case 'l':
26*14893Sedward 			case CTRL(y):
27*14893Sedward 			case CTRL(e):
28*14893Sedward 			case CTRL(u):
29*14893Sedward 			case CTRL(d):
30*14893Sedward 			case CTRL(b):
31*14893Sedward 			case CTRL(f):
32*14893Sedward 			case CTRL(s):
33*14893Sedward 			case CTRL(q):
34*14893Sedward 			case CTRL([):
35*14893Sedward 			foo:
36*14893Sedward 				if (selwin == 0) {
37*14893Sedward 					error("No window.");
38*14893Sedward 					continue;
39*14893Sedward 				}
4013977Sedward 			}
41*14893Sedward 			switch (c) {
42*14893Sedward 			case '1': case '2': case '3': case '4': case '5':
43*14893Sedward 			case '6': case '7': case '8': case '9':
44*14893Sedward 				if ((w = window[c - '1']) == 0) {
45*14893Sedward 					wwbell();
46*14893Sedward 					break;
47*14893Sedward 				}
4814184Sedward 				setselwin(w);
49*14893Sedward 				if (checkproc(selwin) >= 0)
50*14893Sedward 					incmd = 0;
51*14893Sedward 				break;
52*14893Sedward 			case '%':
53*14893Sedward 				if ((w = getwin()) != 0)
54*14893Sedward 					setselwin(w);
55*14893Sedward 				break;
56*14893Sedward 			case 'c':
57*14893Sedward 				if ((w = getwin()) != 0)
58*14893Sedward 					c_close(w);
59*14893Sedward 				break;
60*14893Sedward 			case 'C':
61*14893Sedward 				c_close((struct ww *)0);
62*14893Sedward 				break;
63*14893Sedward 			case 'w':
64*14893Sedward 				c_window();
65*14893Sedward 				break;
66*14893Sedward 			case 'm':
67*14893Sedward 				if ((w = getwin()) != 0)
68*14893Sedward 					c_move(w);
69*14893Sedward 				break;
70*14893Sedward 			case 'S':
71*14893Sedward 				c_show();
72*14893Sedward 				break;
73*14893Sedward 			case 'L':
74*14893Sedward 				c_list();
75*14893Sedward 				break;
76*14893Sedward 			case ':':
77*14893Sedward 				c_colon();
78*14893Sedward 				break;
79*14893Sedward 			case 'h':
80*14893Sedward 				(void) wwwrite(selwin, "\b", 1);
81*14893Sedward 				break;
82*14893Sedward 			case 'j':
83*14893Sedward 				(void) wwwrite(selwin, "\n", 1);
84*14893Sedward 				break;
85*14893Sedward 			case 'k':
86*14893Sedward 				(void) wwwrite(selwin, "\033A", 2);
87*14893Sedward 				break;
88*14893Sedward 			case 'l':
89*14893Sedward 				(void) wwwrite(selwin, "\033C", 2);
90*14893Sedward 				break;
91*14893Sedward 			case CTRL(e):
92*14893Sedward 				wwscroll(selwin, 1);
93*14893Sedward 				break;
94*14893Sedward 			case CTRL(y):
95*14893Sedward 				wwscroll(selwin, -1);
96*14893Sedward 				break;
97*14893Sedward 			case CTRL(d):
98*14893Sedward 				wwscroll(selwin, selwin->ww_w.nr / 2);
99*14893Sedward 				break;
100*14893Sedward 			case CTRL(u):
101*14893Sedward 				wwscroll(selwin, - selwin->ww_w.nr / 2);
102*14893Sedward 				break;
103*14893Sedward 			case CTRL(f):
104*14893Sedward 				wwscroll(selwin, selwin->ww_w.nr);
105*14893Sedward 				break;
106*14893Sedward 			case CTRL(b):
107*14893Sedward 				wwscroll(selwin, - selwin->ww_w.nr);
108*14893Sedward 				break;
109*14893Sedward 			case CTRL(s):
110*14893Sedward 				(void) write(selwin->ww_pty,
111*14893Sedward 					&wwwintty.ww_tchars.t_stopc, 1);
112*14893Sedward 				break;
113*14893Sedward 			case CTRL(q):
114*14893Sedward 				(void) write(selwin->ww_pty,
115*14893Sedward 					&wwwintty.ww_tchars.t_startc, 1);
116*14893Sedward 				break;
117*14893Sedward 			case CTRL(l):
118*14893Sedward 				wwredraw();
119*14893Sedward 				break;
120*14893Sedward 			case '?':
121*14893Sedward 				c_help();
122*14893Sedward 				break;
123*14893Sedward 			case CTRL([):
124*14893Sedward 				if (checkproc(selwin) >= 0)
125*14893Sedward 					incmd = 0;
126*14893Sedward 				break;
127*14893Sedward 			case CTRL(z):
128*14893Sedward 				wwsuspend();
129*14893Sedward 				break;
130*14893Sedward 			case 'q':
131*14893Sedward 				c_quit();
132*14893Sedward 				break;
133*14893Sedward 			/* undocumented commands */
134*14893Sedward 			case 's':
135*14893Sedward 				c_stat();
136*14893Sedward 				break;
137*14893Sedward 			case 't':
138*14893Sedward 				c_time(RUSAGE_SELF);
139*14893Sedward 				break;
140*14893Sedward 			case 'T':
141*14893Sedward 				c_time(RUSAGE_CHILDREN);
142*14893Sedward 				break;
143*14893Sedward 			/* debugging commands */
144*14893Sedward 			case 'M':
145*14893Sedward 				if (!debug)
146*14893Sedward 					goto badcmd;
147*14893Sedward 				wwdumpsmap();
148*14893Sedward 				break;
149*14893Sedward 			case 'V':
150*14893Sedward 				if (!debug)
151*14893Sedward 					goto badcmd;
152*14893Sedward 				if ((w = getwin()) != 0)
153*14893Sedward 					wwdumpnvis(w);
154*14893Sedward 				break;
155*14893Sedward 			case 'D':
156*14893Sedward 				if (!debug)
157*14893Sedward 					goto badcmd;
158*14893Sedward 				if ((w = getwin()) != 0)
159*14893Sedward 					wwdumpcov(w);
160*14893Sedward 				break;
161*14893Sedward 			case 'W':
162*14893Sedward 				if (!debug)
163*14893Sedward 					goto badcmd;
164*14893Sedward 				if ((w = getwin()) != 0)
165*14893Sedward 					wwdumpwin(w);
166*14893Sedward 				break;
167*14893Sedward 			default:
168*14893Sedward 			badcmd:
169*14893Sedward 				if (c == escapec) {
170*14893Sedward 					if (checkproc(selwin) >= 0) {
171*14893Sedward 						(void) write(selwin->ww_pty,
172*14893Sedward 							&escapec, 1);
173*14893Sedward 						incmd = 0;
174*14893Sedward 					}
175*14893Sedward 				} else {
176*14893Sedward 					if (!terse)
177*14893Sedward 						wwbell();
178*14893Sedward 					error("Type ? for help.");
179*14893Sedward 				}
18014177Sedward 			}
181*14893Sedward 		}
182*14893Sedward 		if (!incmd || quit)
18313977Sedward 			break;
184*14893Sedward 		if (terse)
185*14893Sedward 			wwsetcursor(0, 0);
186*14893Sedward 		else {
187*14893Sedward 			(void) wwputs("Command: ", cmdwin);
188*14893Sedward 			wwcurtowin(cmdwin);
18913977Sedward 		}
190*14893Sedward 		while (bpeekc() < 0)
191*14893Sedward 			bread();
19213977Sedward 	}
19314407Sedward 	if (!quit) {
19414407Sedward 		if (!terse) {
19514407Sedward 			wwdelete(cmdwin);
19614407Sedward 			reframe();
19714407Sedward 		}
198*14893Sedward 		wwcursor(selwin, 0);
19914407Sedward 	}
20013977Sedward }
20113977Sedward 
20213977Sedward struct ww *
20313977Sedward getwin()
20413977Sedward {
20513977Sedward 	register int c;
20614184Sedward 	struct ww *w = 0;
20713977Sedward 
20814189Sedward 	if (!terse)
20914407Sedward 		(void) wwputs("Which window? ", cmdwin);
21014407Sedward 	wwsetcursor(wwcurrow(cmdwin), wwcurcol(cmdwin));
21113994Sedward 	while ((c = bgetc()) < 0)
21213977Sedward 		bread();
21314407Sedward 	if (debug && c == 'c')
21414407Sedward 		w = cmdwin;
21514407Sedward 	else if (debug && c == 'f')
21614407Sedward 		w = framewin;
21714795Sedward 	else if (debug && c == 'b')
21814795Sedward 		w = boxwin;
21914407Sedward 	else if (c >= '1' && c < NWINDOW + '1')
22014407Sedward 		w = window[c - '1'];
22114407Sedward 	if (w == 0)
22214407Sedward 		wwbell();
22314189Sedward 	if (!terse)
22414407Sedward 		(void) wwputs("\r\n", cmdwin);
22513977Sedward 	return w;
22613977Sedward }
22713977Sedward 
228*14893Sedward checkproc(w)
229*14893Sedward struct ww *w;
230*14893Sedward {
231*14893Sedward 	if (w->ww_state != WWS_HASPROC) {
232*14893Sedward 		error("No process in window.");
233*14893Sedward 		return -1;
234*14893Sedward 	}
235*14893Sedward 	return 0;
236*14893Sedward }
237*14893Sedward 
23813977Sedward setselwin(w)
23914847Sedward struct ww *w;
24014847Sedward {
24114847Sedward 	if ((selwin = w) != 0)
24214847Sedward 		front(w);
24314847Sedward }
24414847Sedward 
24514847Sedward front(w)
24613977Sedward register struct ww *w;
24713977Sedward {
24814847Sedward 	char moved = 0;
24914184Sedward 
25014847Sedward 	while (w->ww_back != framewin) {
25114847Sedward 		wwmoveup(w);
25214847Sedward 		moved = 1;
25313977Sedward 	}
25414847Sedward 	if (moved)
25514847Sedward 		reframe();
25613977Sedward }
25713977Sedward 
25814847Sedward reframe()
25914847Sedward {
26014847Sedward 	register struct ww *w;
26114847Sedward 
26214847Sedward 	wwunframe(framewin);
26314847Sedward 	for (w = wwhead.ww_back; w != &wwhead; w = w->ww_back)
26414847Sedward 		if (w->ww_hasframe) {
26514847Sedward 			wwframe(w, framewin);
26614847Sedward 			labelwin(w);
26714847Sedward 		}
26814847Sedward }
26914847Sedward 
27014184Sedward labelwin(w)
27113977Sedward register struct ww *w;
27213977Sedward {
27314407Sedward 	int mode = w == selwin ? WWM_REV : 0;
27413977Sedward 
27514407Sedward 	if (w->ww_id >= 0) {
27614407Sedward 		char buf[2];
27714407Sedward 
27814407Sedward 		buf[0] = w->ww_id + '1';
27914407Sedward 		buf[1] = 0;
28014854Sedward 		wwlabel(w, framewin, 1, buf, mode);
28114407Sedward 	}
28214407Sedward 	if (w->ww_label) {
28314407Sedward 		int col;
28414407Sedward 
28514407Sedward 		if (w->ww_center) {
28614407Sedward 			col = (w->ww_w.nc - strlen(w->ww_label)) / 2;
28714407Sedward 			col = MAX(3, col);
28814407Sedward 		} else
28914407Sedward 			col = 3;
29014854Sedward 		wwlabel(w, framewin, col, w->ww_label, mode);
29114407Sedward 	}
29213977Sedward }
293