xref: /csrg-svn/usr.bin/window/cmd.c (revision 34107)
118729Sedward /*
233514Sbostic  * Copyright (c) 1983 Regents of the University of California.
333514Sbostic  * All rights reserved.
433514Sbostic  *
533514Sbostic  * Redistribution and use in source and binary forms are permitted
633514Sbostic  * provided that this notice is preserved and that due credit is given
733514Sbostic  * to the University of California at Berkeley. The name of the University
833514Sbostic  * may not be used to endorse or promote products derived from this
933514Sbostic  * software without specific prior written permission. This software
1033514Sbostic  * is provided ``as is'' without express or implied warranty.
1118729Sedward  */
1218729Sedward 
1333514Sbostic #ifndef lint
14*34107Sedward static char sccsid[] = "@(#)cmd.c	3.37 (Berkeley) 04/25/88";
1533514Sbostic #endif /* not lint */
1633514Sbostic 
1713977Sedward #include "defs.h"
1816309Sedward #include "char.h"
1913977Sedward 
2013977Sedward docmd()
2113977Sedward {
2213977Sedward 	register char c;
2313977Sedward 	register struct ww *w;
2416280Sedward 	char out = 0;
2513977Sedward 
26*34107Sedward 	while (!out && !quit) {
27*34107Sedward 		if ((c = wwgetc()) < 0) {
28*34107Sedward 			if (terse)
29*34107Sedward 				wwsetcursor(0, 0);
30*34107Sedward 			else {
31*34107Sedward 				wwputs("Command: ", cmdwin);
32*34107Sedward 				wwcurtowin(cmdwin);
3313977Sedward 			}
34*34107Sedward 			do
35*34107Sedward 				wwiomux();
36*34107Sedward 			while ((c = wwgetc()) < 0);
37*34107Sedward 		}
38*34107Sedward 		if (!terse)
39*34107Sedward 			wwputc('\n', cmdwin);
40*34107Sedward 		switch (c) {
41*34107Sedward 		default:
42*34107Sedward 			if (c != escapec)
4314893Sedward 				break;
44*34107Sedward 		case 'h': case 'j': case 'k': case 'l':
45*34107Sedward 		case ctrl('y'):
46*34107Sedward 		case ctrl('e'):
47*34107Sedward 		case ctrl('u'):
48*34107Sedward 		case ctrl('d'):
49*34107Sedward 		case ctrl('b'):
50*34107Sedward 		case ctrl('f'):
51*34107Sedward 		case ctrl('s'):
52*34107Sedward 		case ctrl('q'):
53*34107Sedward 		case ctrl('['):
54*34107Sedward 			if (selwin == 0) {
55*34107Sedward 				error("No window.");
56*34107Sedward 				continue;
57*34107Sedward 			}
58*34107Sedward 		}
59*34107Sedward 		switch (c) {
60*34107Sedward 		case '1': case '2': case '3': case '4': case '5':
61*34107Sedward 		case '6': case '7': case '8': case '9':
62*34107Sedward 			if ((w = window[c - '1']) == 0) {
63*34107Sedward 				error("%c: No such window.", c);
6414893Sedward 				break;
65*34107Sedward 			}
66*34107Sedward 			setselwin(w);
67*34107Sedward 			if (checkproc(selwin) >= 0)
68*34107Sedward 				 out = 1;
69*34107Sedward 			break;
70*34107Sedward 		case '%':
71*34107Sedward 			if ((w = getwin()) != 0)
72*34107Sedward 				setselwin(w);
73*34107Sedward 			break;
74*34107Sedward 		case ctrl('^'):
75*34107Sedward 			if (lastselwin != 0) {
76*34107Sedward 				setselwin(lastselwin);
7714893Sedward 				if (checkproc(selwin) >= 0)
7816280Sedward 					out = 1;
79*34107Sedward 			} else
80*34107Sedward 				error("No previous window.");
81*34107Sedward 			break;
82*34107Sedward 		case 'c':
83*34107Sedward 			if ((w = getwin()) != 0)
84*34107Sedward 				closewin(w);
85*34107Sedward 			break;
86*34107Sedward 		case 'w':
87*34107Sedward 			c_window();
88*34107Sedward 			break;
89*34107Sedward 		case 'm':
90*34107Sedward 			if ((w = getwin()) != 0)
91*34107Sedward 				c_move(w);
92*34107Sedward 			break;
93*34107Sedward 		case 'M':
94*34107Sedward 			if ((w = getwin()) != 0)
95*34107Sedward 				movewin(w, w->ww_alt.t, w->ww_alt.l);
96*34107Sedward 			break;
97*34107Sedward 		case 's':
98*34107Sedward 			if ((w = getwin()) != 0)
99*34107Sedward 				c_size(w);
100*34107Sedward 			break;
101*34107Sedward 		case 'S':
102*34107Sedward 			if ((w = getwin()) != 0)
103*34107Sedward 				sizewin(w, w->ww_alt.nr, w->ww_alt.nc);
104*34107Sedward 			break;
105*34107Sedward 		case ':':
106*34107Sedward 			c_colon();
107*34107Sedward 			break;
108*34107Sedward 		case 'h':
109*34107Sedward 			(void) wwwrite(selwin, "\b", 1);
110*34107Sedward 			break;
111*34107Sedward 		case 'j':
112*34107Sedward 			(void) wwwrite(selwin, "\n", 1);
113*34107Sedward 			break;
114*34107Sedward 		case 'k':
115*34107Sedward 			(void) wwwrite(selwin, "\033A", 2);
116*34107Sedward 			break;
117*34107Sedward 		case 'l':
118*34107Sedward 			(void) wwwrite(selwin, "\033C", 2);
119*34107Sedward 			break;
120*34107Sedward 		case ctrl('e'):
121*34107Sedward 			wwscroll(selwin, 1);
122*34107Sedward 			break;
123*34107Sedward 		case ctrl('y'):
124*34107Sedward 			wwscroll(selwin, -1);
125*34107Sedward 			break;
126*34107Sedward 		case ctrl('d'):
127*34107Sedward 			wwscroll(selwin, selwin->ww_w.nr / 2);
128*34107Sedward 			break;
129*34107Sedward 		case ctrl('u'):
130*34107Sedward 			wwscroll(selwin, - selwin->ww_w.nr / 2);
131*34107Sedward 			break;
132*34107Sedward 		case ctrl('f'):
133*34107Sedward 			wwscroll(selwin, selwin->ww_w.nr);
134*34107Sedward 			break;
135*34107Sedward 		case ctrl('b'):
136*34107Sedward 			wwscroll(selwin, - selwin->ww_w.nr);
137*34107Sedward 			break;
138*34107Sedward 		case ctrl('s'):
139*34107Sedward 			stopwin(selwin);
140*34107Sedward 			break;
141*34107Sedward 		case ctrl('q'):
142*34107Sedward 			startwin(selwin);
143*34107Sedward 			break;
144*34107Sedward 		case ctrl('l'):
145*34107Sedward 			wwredraw();
146*34107Sedward 			break;
147*34107Sedward 		case '?':
148*34107Sedward 			c_help();
149*34107Sedward 			break;
150*34107Sedward 		case ctrl('['):
151*34107Sedward 			if (checkproc(selwin) >= 0)
152*34107Sedward 				out = 1;
153*34107Sedward 			break;
154*34107Sedward 		case ctrl('z'):
155*34107Sedward 			wwsuspend();
156*34107Sedward 			break;
157*34107Sedward 		case 'q':
158*34107Sedward 			c_quit();
159*34107Sedward 			break;
160*34107Sedward 		/* debugging stuff */
161*34107Sedward 		case '&':
162*34107Sedward 			if (debug) {
163*34107Sedward 				c_debug();
16414893Sedward 				break;
165*34107Sedward 			}
166*34107Sedward 		default:
167*34107Sedward 			if (c == escapec) {
168*34107Sedward 				if (checkproc(selwin) >= 0) {
169*34107Sedward 					(void) write(selwin->ww_pty,
170*34107Sedward 						&escapec, 1);
171*34107Sedward 					out = 1;
17214998Sedward 				}
173*34107Sedward 			} else {
174*34107Sedward 				if (!terse)
175*34107Sedward 					wwbell();
176*34107Sedward 				error("Type ? for help.");
17714177Sedward 			}
17814893Sedward 		}
17913977Sedward 	}
18016280Sedward 	if (!quit)
18116280Sedward 		setcmd(0);
18213977Sedward }
18313977Sedward 
18413977Sedward struct ww *
18513977Sedward getwin()
18613977Sedward {
18713977Sedward 	register int c;
18814184Sedward 	struct ww *w = 0;
18913977Sedward 
19014189Sedward 	if (!terse)
19116113Sedward 		wwputs("Which window? ", cmdwin);
19214987Sedward 	wwcurtowin(cmdwin);
19315871Sedward 	while ((c = wwgetc()) < 0)
19415871Sedward 		wwiomux();
19514407Sedward 	if (debug && c == 'c')
19614407Sedward 		w = cmdwin;
19714407Sedward 	else if (debug && c == 'f')
19814407Sedward 		w = framewin;
19914795Sedward 	else if (debug && c == 'b')
20014795Sedward 		w = boxwin;
20114407Sedward 	else if (c >= '1' && c < NWINDOW + '1')
20214407Sedward 		w = window[c - '1'];
20331140Sedward 	else if (c == '+')
20431140Sedward 		w = selwin;
20531140Sedward 	else if (c == '-')
20631140Sedward 		w = lastselwin;
20714407Sedward 	if (w == 0)
20816313Sedward 		wwbell();
20914189Sedward 	if (!terse)
21016312Sedward 		wwputc('\n', cmdwin);
21113977Sedward 	return w;
21213977Sedward }
21313977Sedward 
21414893Sedward checkproc(w)
21514893Sedward struct ww *w;
21614893Sedward {
21714893Sedward 	if (w->ww_state != WWS_HASPROC) {
21814893Sedward 		error("No process in window.");
21914893Sedward 		return -1;
22014893Sedward 	}
22114893Sedward 	return 0;
22214893Sedward }
22316280Sedward 
22416280Sedward setcmd(new)
22516280Sedward char new;
22616280Sedward {
22716280Sedward 	if (new && !incmd) {
22816280Sedward 		if (!terse)
22916280Sedward 			wwadd(cmdwin, &wwhead);
23016280Sedward 		if (selwin != 0)
23116280Sedward 			wwcursor(selwin, 1);
23216280Sedward 		wwcurwin = 0;
23316280Sedward 	} else if (!new && incmd) {
23416280Sedward 		if (!terse) {
23516280Sedward 			wwdelete(cmdwin);
23616280Sedward 			reframe();
23716280Sedward 		}
23816280Sedward 		if (selwin != 0)
23916280Sedward 			wwcursor(selwin, 0);
24016280Sedward 		wwcurwin = selwin;
24116280Sedward 	}
24216280Sedward 	incmd = new;
24316280Sedward }
24416280Sedward 
24516280Sedward setterse(new)
24616280Sedward char new;
24716280Sedward {
24816280Sedward 	if (incmd)
24916280Sedward 		if (new && !terse) {
25016280Sedward 			wwdelete(cmdwin);
25116280Sedward 			reframe();
25216280Sedward 		} else if (!new && terse)
25316280Sedward 			wwadd(cmdwin, &wwhead);
25416280Sedward 	terse = new;
25516280Sedward }
25616280Sedward 
25716280Sedward /*
25816280Sedward  * Set the current window.
25916280Sedward  */
26016280Sedward setselwin(w)
26116280Sedward struct ww *w;
26216280Sedward {
26316280Sedward 	if (selwin == w)
26416280Sedward 		return;
26516304Sedward 	if (selwin != 0)
26616304Sedward 		lastselwin = selwin;
26716304Sedward 	if ((selwin = w) != 0)
26816304Sedward 		front(selwin, 1);
26916280Sedward }
270