xref: /csrg-svn/usr.bin/window/wwinit.c (revision 14407)
113925Sedward #ifndef lint
2*14407Sedward static	char *sccsid = "@(#)wwinit.c	2.1.1.1 83/08/09";
313925Sedward #endif
413925Sedward 
513925Sedward #include "ww.h"
613925Sedward 
7*14407Sedward static char *kp = wwkeys;
813925Sedward 
913925Sedward wwinit()
1013925Sedward {
11*14407Sedward 	register i, j;
1214135Sedward 	int kn;
1313962Sedward 
14*14407Sedward 	wwdtablesize = getdtablesize();
1513962Sedward 	if (wwgettty(0, &wwoldtty) < 0)
1613962Sedward 		return -1;
1714295Sedward 	wwwintty = wwoldtty;
1814295Sedward 	wwwintty.ww_sgttyb.sg_flags &= ~XTABS;
1913962Sedward 	wwnewtty.ww_sgttyb.sg_flags = wwoldtty.ww_sgttyb.sg_flags;
2013962Sedward 	wwnewtty.ww_sgttyb.sg_ispeed = wwoldtty.ww_sgttyb.sg_ispeed;
2113962Sedward 	wwnewtty.ww_sgttyb.sg_ospeed = wwoldtty.ww_sgttyb.sg_ospeed;
2213962Sedward 	wwnewtty.ww_lmode = wwoldtty.ww_lmode;
2313962Sedward 	wwnewtty.ww_pgrp = wwoldtty.ww_pgrp;
2413962Sedward 	wwnewtty.ww_ldisc = wwoldtty.ww_ldisc;
2513962Sedward 	wwnewtty.ww_sgttyb.sg_flags |= CBREAK;
2613972Sedward 	wwnewtty.ww_sgttyb.sg_flags &= ~(ECHO|CRMOD);
2713962Sedward 	wwnewtty.ww_lmode |= LLITOUT;
2813962Sedward 	if (wwsettty(0, &wwnewtty) < 0)
29*14407Sedward 		goto bad;
3014135Sedward 
31*14407Sedward 	if ((wwterm = getenv("TERM")) == 0)
32*14407Sedward 		goto bad;
33*14407Sedward 	if (tgetent(wwtermcap, wwterm) != 1)
34*14407Sedward 		goto bad;
35*14407Sedward 	wwbaud = wwbaudmap[wwoldtty.ww_sgttyb.sg_ospeed];
36*14407Sedward 
37*14407Sedward 	if (ttinit() < 0)
38*14407Sedward 		goto bad;
39*14407Sedward 	wwnrow = tt.tt_nrow;
40*14407Sedward 	wwncol = tt.tt_ncol;
41*14407Sedward 	(*tt.tt_reset)();
42*14407Sedward 	(*tt.tt_clreos)();
43*14407Sedward 
44*14407Sedward 	if ((wwsmap = wwalloc(wwnrow, wwncol, sizeof (char))) == 0)
45*14407Sedward 		goto bad;
46*14407Sedward 	for (i = 0; i < wwnrow; i++)
47*14407Sedward 		for (j = 0; j < wwncol; j++)
48*14407Sedward 			wwsmap[i][j] = WWX_NOBODY;
49*14407Sedward 	wwos = (union ww_char **)
50*14407Sedward 		wwalloc(wwnrow, wwncol, sizeof (union ww_char));
51*14407Sedward 	if (wwos == 0)
52*14407Sedward 		goto bad;
53*14407Sedward 	for (i = 0; i < wwnrow; i++)
54*14407Sedward 		for (j = 0; j < wwncol; j++)
55*14407Sedward 			wwos[i][j].c_w = ' ';
56*14407Sedward 	wwns = (union ww_char **)
57*14407Sedward 		wwalloc(wwnrow, wwncol, sizeof (union ww_char));
58*14407Sedward 	if (wwns == 0)
59*14407Sedward 		goto bad;
60*14407Sedward 	for (i = 0; i < wwnrow; i++)
61*14407Sedward 		for (j = 0; j < wwncol; j++)
62*14407Sedward 			wwns[i][j].c_w = ' ';
63*14407Sedward 
64*14407Sedward 	wwindex[WWX_NOBODY] = &wwnobody;
65*14407Sedward 	wwnobody.ww_order = NWW;
66*14407Sedward 
6714135Sedward 	addcap("kb");
6814135Sedward 	addcap("ku");
6914135Sedward 	addcap("kd");
7014135Sedward 	addcap("kl");
7114135Sedward 	addcap("kr");
7214135Sedward 	addcap("kh");
7314135Sedward 	if ((kn = tgetnum("kn")) >= 0) {
7414135Sedward 		char cap[5];
7514135Sedward 		int i;
7614135Sedward 
77*14407Sedward 		(void) sprintf(kp, "kn#%d:", kn);
7814135Sedward 		for (; *kp; kp++)
7914135Sedward 			;
8014135Sedward 		for (i = 1; i <= kn; i++) {
81*14407Sedward 			(void) sprintf(cap, "k%d", i);
8214135Sedward 			addcap(cap);
8314135Sedward 			cap[0] = 'l';
8414135Sedward 			addcap(cap);
8514135Sedward 		}
8614135Sedward 	}
8713962Sedward 	return 0;
88*14407Sedward bad:
89*14407Sedward 	(void) wwsettty(0, &wwoldtty);
90*14407Sedward 	return -1;
9113925Sedward }
9214135Sedward 
93*14407Sedward static
9414135Sedward addcap(cap)
9514135Sedward register char *cap;
9614135Sedward {
97*14407Sedward 	char tbuf[512];
98*14407Sedward 	char *tp = tbuf;
9914287Sedward 	register char *str, *p;
10014135Sedward 
10114135Sedward 	if ((str = tgetstr(cap, &tp)) != 0) {
10214135Sedward 		while (*kp++ = *cap++)
10314135Sedward 			;
10414135Sedward 		kp[-1] = '=';
10514287Sedward 		while (*str) {
10614287Sedward 			for (p = unctrl(*str++); *kp++ = *p++;)
10714287Sedward 				;
10814287Sedward 			kp--;
10914287Sedward 		}
11014287Sedward 		*kp++ = ':';
11114135Sedward 		*kp = 0;
11214135Sedward 	}
11314135Sedward }
114