xref: /csrg-svn/usr.bin/window/main.c (revision 13994)
113920Sedward #ifndef lint
2*13994Sedward static	char *sccsid = "@(#)main.c	1.4 83/07/19";
313920Sedward #endif
413920Sedward 
513969Sedward #include "defs.h"
613920Sedward 
713920Sedward main()
813920Sedward {
913920Sedward 	register n;
1013920Sedward 	register char *p;
1113920Sedward 	int wwchild();
1213920Sedward 	int imask;
1313920Sedward 
1413969Sedward 	gettimeofday(&starttime, &timezone);
1513962Sedward 	if (wwinit() < 0) {
1613962Sedward 		fflush(stdout);
1713962Sedward 		fprintf("Can't do windows on this terminal.\n");
1813962Sedward 		exit(1);
1913962Sedward 	}
2013969Sedward 	if ((cmdwin = wwopen(1, 0, 1, WCols, 0, 0)) == 0) {
2113962Sedward 		fflush(stdout);
2213969Sedward 		fprintf(stderr, "Can't open command window.\r\n");
2313962Sedward 		goto bad;
2413962Sedward 	}
2513969Sedward 	wwsetcurrent(cmdwin);
2613969Sedward 	for (n = 0; n < WCols; n++)
2713969Sedward 		Waputc(0, WINVERSE|WBUF, cmdwin->ww_win);
2813969Sedward 	wwflush();
2913920Sedward 	(void) signal(SIGCHLD, wwchild);
3013969Sedward 	while (!quit) {
3113969Sedward 		if (curwin == cmdwin) {
3213969Sedward 			docmd();
3313962Sedward 			continue;
3413969Sedward 		}
35*13994Sedward 		/*
36*13994Sedward 		 * Loop until we get some keyboard input.
37*13994Sedward 		 */
3813969Sedward 		while (ibufc == 0) {
3913969Sedward 			wwsetcursor(WCurRow(curwin->ww_win),
4013969Sedward 				WCurCol(curwin->ww_win));
4113969Sedward 			wwflush();
42*13994Sedward 			imask = 1 << 0;
43*13994Sedward 			while (wwforce(&imask) < 0)
44*13994Sedward 				;
45*13994Sedward 			if ((imask & 1 << 0) == 0)
4613962Sedward 				continue;
47*13994Sedward 			/* NOTE: ibufc == 0 */
48*13994Sedward 			ibufp = ibuf;
49*13994Sedward 			if ((ibufc = read(0, ibuf, sizeof ibuf)) < 0)
50*13994Sedward 				ibufc = 0;
51*13994Sedward 		}
52*13994Sedward 		/*
53*13994Sedward 		 * Weird loop.  Copy the buffer to the pty stopping
54*13994Sedward 		 * on the escape character in a hopefully efficient
55*13994Sedward 		 * way.
56*13994Sedward 		 * Probably a good thing to make ibufc == 1 a special
57*13994Sedward 		 * case.
58*13994Sedward 		 */
59*13994Sedward 		for (p = ibufp, n = ibufc;;) {
60*13994Sedward 			if (--n < 0) {
61*13994Sedward 				write(curwin->ww_pty, ibufp, ibufc);
6213969Sedward 				ibufp = ibuf;
63*13994Sedward 				ibufc = 0;
64*13994Sedward 				break;
65*13994Sedward 			} else if (*p++ == ESCAPE) {
66*13994Sedward 				if ((n = p - ibufp) > 1)
67*13994Sedward 					write(curwin->ww_pty, ibufp, n - 1);
68*13994Sedward 				ibufp = p;
69*13994Sedward 				ibufc -= n;
70*13994Sedward 				wwsetcurrent(cmdwin);
71*13994Sedward 				break;
72*13994Sedward 			}
7313920Sedward 		}
7413920Sedward 	}
7513920Sedward bad:
7613920Sedward 	wwend();
7713920Sedward 	return 0;
7813920Sedward }
79