xref: /csrg-svn/usr.bin/window/cmd.c (revision 16113)
113977Sedward #ifndef lint
2*16113Sedward static	char *sccsid = "@(#)cmd.c	3.21 84/03/03";
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 (;;) {
1715871Sedward 		while ((c = wwgetc()) >= 0) {
1814893Sedward 			if (!terse)
19*16113Sedward 				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) {
4515620Sedward 					error("%c: No such window.", c);
4614893Sedward 					break;
4714893Sedward 				}
4814184Sedward 				setselwin(w);
4914893Sedward 				if (checkproc(selwin) >= 0)
50*16113Sedward 					 wwcurwin = selwin;
5114893Sedward 				break;
5214893Sedward 			case '%':
5314893Sedward 				if ((w = getwin()) != 0)
5414893Sedward 					setselwin(w);
5514893Sedward 				break;
5615620Sedward 			case CTRL(^):
5715620Sedward 				if (lastselwin != 0) {
5815620Sedward 					setselwin(lastselwin);
5915620Sedward 					if (checkproc(selwin) >= 0)
60*16113Sedward 						wwcurwin = selwin;
6115620Sedward 				} else
6215620Sedward 					error("No previous window.");
6315620Sedward 				break;
6414893Sedward 			case 'c':
6514893Sedward 				if ((w = getwin()) != 0)
6614893Sedward 					c_close(w);
6714893Sedward 				break;
6814893Sedward 			case 'C':
6914893Sedward 				c_close((struct ww *)0);
7014893Sedward 				break;
7114893Sedward 			case 'w':
7214893Sedward 				c_window();
7314893Sedward 				break;
7414893Sedward 			case 'm':
7514893Sedward 				if ((w = getwin()) != 0)
7614893Sedward 					c_move(w);
7714893Sedward 				break;
7814998Sedward 			case 'M':
7914998Sedward 				if ((w = getwin()) != 0)
8014998Sedward 					movewin(w, w->ww_altpos.r,
8114998Sedward 						w->ww_altpos.c);
8214998Sedward 				break;
8314893Sedward 			case 'S':
8414893Sedward 				c_show();
8514893Sedward 				break;
8614893Sedward 			case 'L':
8714893Sedward 				c_list();
8814893Sedward 				break;
8915673Sedward 			case 'v':
9015673Sedward 				c_variable();
9115673Sedward 				break;
9214893Sedward 			case ':':
9314893Sedward 				c_colon();
9414893Sedward 				break;
9514893Sedward 			case 'h':
9614893Sedward 				(void) wwwrite(selwin, "\b", 1);
9714893Sedward 				break;
9814893Sedward 			case 'j':
9914893Sedward 				(void) wwwrite(selwin, "\n", 1);
10014893Sedward 				break;
10114893Sedward 			case 'k':
10214893Sedward 				(void) wwwrite(selwin, "\033A", 2);
10314893Sedward 				break;
10414893Sedward 			case 'l':
10514893Sedward 				(void) wwwrite(selwin, "\033C", 2);
10614893Sedward 				break;
10714893Sedward 			case CTRL(e):
10814893Sedward 				wwscroll(selwin, 1);
10914893Sedward 				break;
11014893Sedward 			case CTRL(y):
11114893Sedward 				wwscroll(selwin, -1);
11214893Sedward 				break;
11314893Sedward 			case CTRL(d):
11414893Sedward 				wwscroll(selwin, selwin->ww_w.nr / 2);
11514893Sedward 				break;
11614893Sedward 			case CTRL(u):
11714893Sedward 				wwscroll(selwin, - selwin->ww_w.nr / 2);
11814893Sedward 				break;
11914893Sedward 			case CTRL(f):
12014893Sedward 				wwscroll(selwin, selwin->ww_w.nr);
12114893Sedward 				break;
12214893Sedward 			case CTRL(b):
12314893Sedward 				wwscroll(selwin, - selwin->ww_w.nr);
12414893Sedward 				break;
12514893Sedward 			case CTRL(s):
12614893Sedward 				(void) write(selwin->ww_pty,
12714893Sedward 					&wwwintty.ww_tchars.t_stopc, 1);
12814893Sedward 				break;
12914893Sedward 			case CTRL(q):
13014893Sedward 				(void) write(selwin->ww_pty,
13114893Sedward 					&wwwintty.ww_tchars.t_startc, 1);
13214893Sedward 				break;
13314893Sedward 			case CTRL(l):
13414893Sedward 				wwredraw();
13514893Sedward 				break;
13614893Sedward 			case '?':
13714893Sedward 				c_help();
13814893Sedward 				break;
13914893Sedward 			case CTRL([):
14014893Sedward 				if (checkproc(selwin) >= 0)
141*16113Sedward 					wwcurwin = selwin;
14214893Sedward 				break;
14314893Sedward 			case CTRL(z):
14414893Sedward 				wwsuspend();
14514893Sedward 				break;
14614893Sedward 			case 'q':
14714893Sedward 				c_quit();
14814893Sedward 				break;
14914893Sedward 			/* undocumented commands */
15014893Sedward 			case 's':
15114893Sedward 				c_stat();
15214893Sedward 				break;
15315363Sedward #ifndef O_4_1A
15414893Sedward 			case 't':
15514893Sedward 				c_time(RUSAGE_SELF);
15614893Sedward 				break;
15714893Sedward 			case 'T':
15814893Sedward 				c_time(RUSAGE_CHILDREN);
15914893Sedward 				break;
16015363Sedward #endif
16114998Sedward 			/* debugging stuff */
16214998Sedward 			case '&':
16314998Sedward 				if (debug) {
16414998Sedward 					c_debug();
16514998Sedward 					break;
16614998Sedward 				}
16714893Sedward 			default:
16814893Sedward 				if (c == escapec) {
16914893Sedward 					if (checkproc(selwin) >= 0) {
17014893Sedward 						(void) write(selwin->ww_pty,
17114893Sedward 							&escapec, 1);
172*16113Sedward 						wwcurwin = selwin;
17314893Sedward 					}
17414893Sedward 				} else {
17514893Sedward 					if (!terse)
176*16113Sedward 						wwputc(CTRL(g), cmdwin);
17714893Sedward 					error("Type ? for help.");
17814893Sedward 				}
17914177Sedward 			}
18014893Sedward 		}
181*16113Sedward 		if (wwcurwin != 0 || quit)
18213977Sedward 			break;
18314893Sedward 		if (terse)
18414893Sedward 			wwsetcursor(0, 0);
18514893Sedward 		else {
186*16113Sedward 			wwputs("Command: ", cmdwin);
18714893Sedward 			wwcurtowin(cmdwin);
18813977Sedward 		}
18915871Sedward 		while (wwpeekc() < 0)
19015871Sedward 			wwiomux();
19113977Sedward 	}
19214407Sedward 	if (!quit) {
19314407Sedward 		if (!terse) {
19414407Sedward 			wwdelete(cmdwin);
19514407Sedward 			reframe();
19614407Sedward 		}
19714893Sedward 		wwcursor(selwin, 0);
19814407Sedward 	}
19913977Sedward }
20013977Sedward 
20113977Sedward struct ww *
20213977Sedward getwin()
20313977Sedward {
20413977Sedward 	register int c;
20514184Sedward 	struct ww *w = 0;
20613977Sedward 
20714189Sedward 	if (!terse)
208*16113Sedward 		wwputs("Which window? ", cmdwin);
20914987Sedward 	wwcurtowin(cmdwin);
21015871Sedward 	while ((c = wwgetc()) < 0)
21115871Sedward 		wwiomux();
21214407Sedward 	if (debug && c == 'c')
21314407Sedward 		w = cmdwin;
21414407Sedward 	else if (debug && c == 'f')
21514407Sedward 		w = framewin;
21614795Sedward 	else if (debug && c == 'b')
21714795Sedward 		w = boxwin;
21814407Sedward 	else if (c >= '1' && c < NWINDOW + '1')
21914407Sedward 		w = window[c - '1'];
22014407Sedward 	if (w == 0)
221*16113Sedward 		wwputc(CTRL(g), cmdwin);
22214189Sedward 	if (!terse)
223*16113Sedward 		wwputs("\r\n", cmdwin);
22413977Sedward 	return w;
22513977Sedward }
22613977Sedward 
22714893Sedward checkproc(w)
22814893Sedward struct ww *w;
22914893Sedward {
23014893Sedward 	if (w->ww_state != WWS_HASPROC) {
23114893Sedward 		error("No process in window.");
23214893Sedward 		return -1;
23314893Sedward 	}
23414893Sedward 	return 0;
23514893Sedward }
23614893Sedward 
23713977Sedward setselwin(w)
23814847Sedward struct ww *w;
23914847Sedward {
24015703Sedward 	if (selwin == w)
24115703Sedward 		return;
24215620Sedward 	lastselwin = selwin;
24315658Sedward 	front(selwin = w, 1);
24414847Sedward }
24514847Sedward 
24614896Sedward /*
24714998Sedward  * wwvisible() doesn't work for tinted windows.
24814896Sedward  * But anything to make it faster.
24914896Sedward  */
25015658Sedward front(w, doreframe)
25113977Sedward register struct ww *w;
25213977Sedward {
25315586Sedward 	if (!wwvisible(w) && w->ww_back != framewin) {
25415586Sedward 		wwdelete(w);
25515586Sedward 		wwadd(w, framewin);
25614847Sedward 		reframe();
25715658Sedward 	} else if (doreframe)
25815658Sedward 		reframe();
25913977Sedward }
26013977Sedward 
26114847Sedward reframe()
26214847Sedward {
26314847Sedward 	register struct ww *w;
26414847Sedward 
26514847Sedward 	wwunframe(framewin);
26614847Sedward 	for (w = wwhead.ww_back; w != &wwhead; w = w->ww_back)
26714847Sedward 		if (w->ww_hasframe) {
26814847Sedward 			wwframe(w, framewin);
26914847Sedward 			labelwin(w);
27014847Sedward 		}
27114847Sedward }
27214847Sedward 
27314184Sedward labelwin(w)
27413977Sedward register struct ww *w;
27513977Sedward {
27614407Sedward 	int mode = w == selwin ? WWM_REV : 0;
27713977Sedward 
27814407Sedward 	if (w->ww_id >= 0) {
27914407Sedward 		char buf[2];
28014407Sedward 
28114407Sedward 		buf[0] = w->ww_id + '1';
28214407Sedward 		buf[1] = 0;
28314854Sedward 		wwlabel(w, framewin, 1, buf, mode);
28414407Sedward 	}
28514407Sedward 	if (w->ww_label) {
28614407Sedward 		int col;
28714407Sedward 
28814407Sedward 		if (w->ww_center) {
28914407Sedward 			col = (w->ww_w.nc - strlen(w->ww_label)) / 2;
29014407Sedward 			col = MAX(3, col);
29114407Sedward 		} else
29214407Sedward 			col = 3;
29314854Sedward 		wwlabel(w, framewin, col, w->ww_label, mode);
29414407Sedward 	}
29513977Sedward }
296