xref: /csrg-svn/usr.bin/window/cmd.c (revision 14998)
113977Sedward #ifndef lint
2*14998Sedward static	char *sccsid = "@(#)cmd.c	3.13 83/09/15";
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);
1614893Sedward 	for (;;) {
1714893Sedward 		while ((c = bgetc()) >= 0) {
1814893Sedward 			if (!terse)
1914893Sedward 				(void) wwputs("\r\n", cmdwin);
2014893Sedward 			switch (c) {
2114893Sedward 			default:
2214893Sedward 				if (c == escapec)
2314893Sedward 					goto foo;
2413977Sedward 				break;
2514893Sedward 			case 'h': case 'j': case 'k': case 'l':
2614893Sedward 			case CTRL(y):
2714893Sedward 			case CTRL(e):
2814893Sedward 			case CTRL(u):
2914893Sedward 			case CTRL(d):
3014893Sedward 			case CTRL(b):
3114893Sedward 			case CTRL(f):
3214893Sedward 			case CTRL(s):
3314893Sedward 			case CTRL(q):
3414893Sedward 			case CTRL([):
3514893Sedward 			foo:
3614893Sedward 				if (selwin == 0) {
3714893Sedward 					error("No window.");
3814893Sedward 					continue;
3914893Sedward 				}
4013977Sedward 			}
4114893Sedward 			switch (c) {
4214893Sedward 			case '1': case '2': case '3': case '4': case '5':
4314893Sedward 			case '6': case '7': case '8': case '9':
4414893Sedward 				if ((w = window[c - '1']) == 0) {
4514893Sedward 					wwbell();
4614893Sedward 					break;
4714893Sedward 				}
4814184Sedward 				setselwin(w);
4914893Sedward 				if (checkproc(selwin) >= 0)
5014893Sedward 					incmd = 0;
5114893Sedward 				break;
5214893Sedward 			case '%':
5314893Sedward 				if ((w = getwin()) != 0)
5414893Sedward 					setselwin(w);
5514893Sedward 				break;
5614893Sedward 			case 'c':
5714893Sedward 				if ((w = getwin()) != 0)
5814893Sedward 					c_close(w);
5914893Sedward 				break;
6014893Sedward 			case 'C':
6114893Sedward 				c_close((struct ww *)0);
6214893Sedward 				break;
6314893Sedward 			case 'w':
6414893Sedward 				c_window();
6514893Sedward 				break;
6614893Sedward 			case 'm':
6714893Sedward 				if ((w = getwin()) != 0)
6814893Sedward 					c_move(w);
6914893Sedward 				break;
70*14998Sedward 			case 'M':
71*14998Sedward 				if ((w = getwin()) != 0)
72*14998Sedward 					movewin(w, w->ww_altpos.r,
73*14998Sedward 						w->ww_altpos.c);
74*14998Sedward 				break;
7514893Sedward 			case 'S':
7614893Sedward 				c_show();
7714893Sedward 				break;
7814893Sedward 			case 'L':
7914893Sedward 				c_list();
8014893Sedward 				break;
8114893Sedward 			case ':':
8214893Sedward 				c_colon();
8314893Sedward 				break;
8414893Sedward 			case 'h':
8514893Sedward 				(void) wwwrite(selwin, "\b", 1);
8614893Sedward 				break;
8714893Sedward 			case 'j':
8814893Sedward 				(void) wwwrite(selwin, "\n", 1);
8914893Sedward 				break;
9014893Sedward 			case 'k':
9114893Sedward 				(void) wwwrite(selwin, "\033A", 2);
9214893Sedward 				break;
9314893Sedward 			case 'l':
9414893Sedward 				(void) wwwrite(selwin, "\033C", 2);
9514893Sedward 				break;
9614893Sedward 			case CTRL(e):
9714893Sedward 				wwscroll(selwin, 1);
9814893Sedward 				break;
9914893Sedward 			case CTRL(y):
10014893Sedward 				wwscroll(selwin, -1);
10114893Sedward 				break;
10214893Sedward 			case CTRL(d):
10314893Sedward 				wwscroll(selwin, selwin->ww_w.nr / 2);
10414893Sedward 				break;
10514893Sedward 			case CTRL(u):
10614893Sedward 				wwscroll(selwin, - selwin->ww_w.nr / 2);
10714893Sedward 				break;
10814893Sedward 			case CTRL(f):
10914893Sedward 				wwscroll(selwin, selwin->ww_w.nr);
11014893Sedward 				break;
11114893Sedward 			case CTRL(b):
11214893Sedward 				wwscroll(selwin, - selwin->ww_w.nr);
11314893Sedward 				break;
11414893Sedward 			case CTRL(s):
11514893Sedward 				(void) write(selwin->ww_pty,
11614893Sedward 					&wwwintty.ww_tchars.t_stopc, 1);
11714893Sedward 				break;
11814893Sedward 			case CTRL(q):
11914893Sedward 				(void) write(selwin->ww_pty,
12014893Sedward 					&wwwintty.ww_tchars.t_startc, 1);
12114893Sedward 				break;
12214893Sedward 			case CTRL(l):
12314893Sedward 				wwredraw();
12414893Sedward 				break;
12514893Sedward 			case '?':
12614893Sedward 				c_help();
12714893Sedward 				break;
12814893Sedward 			case CTRL([):
12914893Sedward 				if (checkproc(selwin) >= 0)
13014893Sedward 					incmd = 0;
13114893Sedward 				break;
13214893Sedward 			case CTRL(z):
13314893Sedward 				wwsuspend();
13414893Sedward 				break;
13514893Sedward 			case 'q':
13614893Sedward 				c_quit();
13714893Sedward 				break;
13814893Sedward 			/* undocumented commands */
13914893Sedward 			case 's':
14014893Sedward 				c_stat();
14114893Sedward 				break;
14214893Sedward 			case 't':
14314893Sedward 				c_time(RUSAGE_SELF);
14414893Sedward 				break;
14514893Sedward 			case 'T':
14614893Sedward 				c_time(RUSAGE_CHILDREN);
14714893Sedward 				break;
148*14998Sedward 			/* debugging stuff */
149*14998Sedward 			case '&':
150*14998Sedward 				if (debug) {
151*14998Sedward 					c_debug();
152*14998Sedward 					break;
153*14998Sedward 				}
15414893Sedward 			default:
15514893Sedward 				if (c == escapec) {
15614893Sedward 					if (checkproc(selwin) >= 0) {
15714893Sedward 						(void) write(selwin->ww_pty,
15814893Sedward 							&escapec, 1);
15914893Sedward 						incmd = 0;
16014893Sedward 					}
16114893Sedward 				} else {
16214893Sedward 					if (!terse)
16314893Sedward 						wwbell();
16414893Sedward 					error("Type ? for help.");
16514893Sedward 				}
16614177Sedward 			}
16714893Sedward 		}
16814893Sedward 		if (!incmd || quit)
16913977Sedward 			break;
17014893Sedward 		if (terse)
17114893Sedward 			wwsetcursor(0, 0);
17214893Sedward 		else {
17314893Sedward 			(void) wwputs("Command: ", cmdwin);
17414893Sedward 			wwcurtowin(cmdwin);
17513977Sedward 		}
17614893Sedward 		while (bpeekc() < 0)
17714893Sedward 			bread();
17813977Sedward 	}
17914407Sedward 	if (!quit) {
18014407Sedward 		if (!terse) {
18114407Sedward 			wwdelete(cmdwin);
18214407Sedward 			reframe();
18314407Sedward 		}
18414893Sedward 		wwcursor(selwin, 0);
18514407Sedward 	}
18613977Sedward }
18713977Sedward 
18813977Sedward struct ww *
18913977Sedward getwin()
19013977Sedward {
19113977Sedward 	register int c;
19214184Sedward 	struct ww *w = 0;
19313977Sedward 
19414189Sedward 	if (!terse)
19514407Sedward 		(void) wwputs("Which window? ", cmdwin);
19614987Sedward 	wwcurtowin(cmdwin);
19713994Sedward 	while ((c = bgetc()) < 0)
19813977Sedward 		bread();
19914407Sedward 	if (debug && c == 'c')
20014407Sedward 		w = cmdwin;
20114407Sedward 	else if (debug && c == 'f')
20214407Sedward 		w = framewin;
20314795Sedward 	else if (debug && c == 'b')
20414795Sedward 		w = boxwin;
20514407Sedward 	else if (c >= '1' && c < NWINDOW + '1')
20614407Sedward 		w = window[c - '1'];
20714407Sedward 	if (w == 0)
20814407Sedward 		wwbell();
20914189Sedward 	if (!terse)
21014407Sedward 		(void) wwputs("\r\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 }
22314893Sedward 
22413977Sedward setselwin(w)
22514847Sedward struct ww *w;
22614847Sedward {
22714847Sedward 	if ((selwin = w) != 0)
22814847Sedward 		front(w);
22914847Sedward }
23014847Sedward 
23114896Sedward /*
23214896Sedward  * This is all heuristic.
233*14998Sedward  * wwvisible() doesn't work for tinted windows.
234*14998Sedward  * and wwmoveup() doesn't work for transparent windows
235*14998Sedward  * (completely or partially).
23614896Sedward  * But anything to make it faster.
23714896Sedward  */
23814847Sedward front(w)
23913977Sedward register struct ww *w;
24013977Sedward {
24114847Sedward 	char moved = 0;
24214184Sedward 
24314896Sedward 	if (wwvisible(w))
24414847Sedward 		moved = 1;
24514896Sedward 	else
24614896Sedward 		while (w->ww_back != framewin) {
24714896Sedward 			wwmoveup(w);
24814896Sedward 			moved = 1;
24914896Sedward 		}
25014847Sedward 	if (moved)
25114847Sedward 		reframe();
25213977Sedward }
25313977Sedward 
25414847Sedward reframe()
25514847Sedward {
25614847Sedward 	register struct ww *w;
25714847Sedward 
25814847Sedward 	wwunframe(framewin);
25914847Sedward 	for (w = wwhead.ww_back; w != &wwhead; w = w->ww_back)
26014847Sedward 		if (w->ww_hasframe) {
26114847Sedward 			wwframe(w, framewin);
26214847Sedward 			labelwin(w);
26314847Sedward 		}
26414847Sedward }
26514847Sedward 
26614184Sedward labelwin(w)
26713977Sedward register struct ww *w;
26813977Sedward {
26914407Sedward 	int mode = w == selwin ? WWM_REV : 0;
27013977Sedward 
27114407Sedward 	if (w->ww_id >= 0) {
27214407Sedward 		char buf[2];
27314407Sedward 
27414407Sedward 		buf[0] = w->ww_id + '1';
27514407Sedward 		buf[1] = 0;
27614854Sedward 		wwlabel(w, framewin, 1, buf, mode);
27714407Sedward 	}
27814407Sedward 	if (w->ww_label) {
27914407Sedward 		int col;
28014407Sedward 
28114407Sedward 		if (w->ww_center) {
28214407Sedward 			col = (w->ww_w.nc - strlen(w->ww_label)) / 2;
28314407Sedward 			col = MAX(3, col);
28414407Sedward 		} else
28514407Sedward 			col = 3;
28614854Sedward 		wwlabel(w, framewin, col, w->ww_label, mode);
28714407Sedward 	}
28813977Sedward }
289