113925Sedward #ifndef lint 2*14287Sedward static char *sccsid = "@(#)wwinit.c 1.7 83/07/29"; 313925Sedward #endif 413925Sedward 513925Sedward #include "ww.h" 613925Sedward 713962Sedward struct ww_tty wwoldtty; 813962Sedward struct ww_tty wwnewtty = { 913962Sedward { 0, 0, -1, -1, 0 }, 1013962Sedward { -1, -1, -1, -1, -1, -1 }, 1113962Sedward { -1, -1, -1, -1, -1, -1 }, 1213962Sedward 0, 0, 0 1313962Sedward }; 1413994Sedward int _wwdtablesize; 1514135Sedward char _wwtermcap[1024]; 1614135Sedward char _wwkeys[512]; 1714135Sedward static char *kp = _wwkeys; 1814069Sedward int wwncol, wwnrow; 1913925Sedward 2013925Sedward wwinit() 2113925Sedward { 2213962Sedward static char done = 0; 2314135Sedward int kn; 2413962Sedward 2513962Sedward if (done) 2613962Sedward return 0; 2713962Sedward done++; 2813994Sedward _wwdtablesize = getdtablesize(); 2913962Sedward if (wwgettty(0, &wwoldtty) < 0) 3013962Sedward return -1; 3113962Sedward wwnewtty.ww_sgttyb.sg_flags = wwoldtty.ww_sgttyb.sg_flags; 3213962Sedward wwnewtty.ww_sgttyb.sg_ispeed = wwoldtty.ww_sgttyb.sg_ispeed; 3313962Sedward wwnewtty.ww_sgttyb.sg_ospeed = wwoldtty.ww_sgttyb.sg_ospeed; 3413962Sedward wwnewtty.ww_lmode = wwoldtty.ww_lmode; 3513962Sedward wwnewtty.ww_pgrp = wwoldtty.ww_pgrp; 3613962Sedward wwnewtty.ww_ldisc = wwoldtty.ww_ldisc; 3713962Sedward wwnewtty.ww_sgttyb.sg_flags |= CBREAK; 3813972Sedward wwnewtty.ww_sgttyb.sg_flags &= ~(ECHO|CRMOD); 3913962Sedward wwnewtty.ww_lmode |= LLITOUT; 4013962Sedward if (wwsettty(0, &wwnewtty) < 0) 4113962Sedward return -1; 4213972Sedward if (Winit(2, 1) != 0) 4313962Sedward return -1; 4413962Sedward WSetRealCursor = 1; 4514069Sedward Wscreensize(&wwnrow, &wwncol); 4614135Sedward 4714135Sedward if (tgetent(_wwtermcap, getenv("TERM")) != 1) 4814135Sedward return -1; 4914135Sedward addcap("kb"); 5014135Sedward addcap("ku"); 5114135Sedward addcap("kd"); 5214135Sedward addcap("kl"); 5314135Sedward addcap("kr"); 5414135Sedward addcap("kh"); 5514135Sedward if ((kn = tgetnum("kn")) >= 0) { 5614135Sedward char cap[5]; 5714135Sedward int i; 5814135Sedward 5914135Sedward sprintf(kp, "kn#%d:", kn); 6014135Sedward for (; *kp; kp++) 6114135Sedward ; 6214135Sedward for (i = 1; i <= kn; i++) { 6314135Sedward sprintf(cap, "k%d", i); 6414135Sedward addcap(cap); 6514135Sedward cap[0] = 'l'; 6614135Sedward addcap(cap); 6714135Sedward } 6814135Sedward } 6913962Sedward return 0; 7013925Sedward } 7114135Sedward 7214135Sedward addcap(cap) 7314135Sedward register char *cap; 7414135Sedward { 7514135Sedward static char tbuf[512]; 7614135Sedward static char *tp = tbuf; 77*14287Sedward register char *str, *p; 7814135Sedward char *tgetstr(); 7914135Sedward 8014135Sedward if ((str = tgetstr(cap, &tp)) != 0) { 8114135Sedward while (*kp++ = *cap++) 8214135Sedward ; 8314135Sedward kp[-1] = '='; 84*14287Sedward while (*str) { 85*14287Sedward for (p = unctrl(*str++); *kp++ = *p++;) 86*14287Sedward ; 87*14287Sedward kp--; 88*14287Sedward } 89*14287Sedward *kp++ = ':'; 9014135Sedward *kp = 0; 9114135Sedward } 9214135Sedward } 93