|
|
1.1 root 1: /* Copyright (c) 1979 Regents of the University of California */
2: #include "ex.h"
3: #include "ex_tty.h"
4:
5: /*
6: * Terminal type initialization routines,
7: * and calculation of flags at entry or after
8: * a shell escape which may change them.
9: */
10: short ospeed = -1;
11:
12: gettmode()
13: {
14:
15: if (gtty(1, &tty) < 0)
16: return;
17: if (ospeed != tty.sg_ospeed)
18: value(SLOWOPEN) = tty.sg_ospeed < B1200;
19: ospeed = tty.sg_ospeed;
20: normf = tty.sg_flags;
21: UPPERCASE = (tty.sg_flags & LCASE) != 0;
22: GT = (tty.sg_flags & XTABS) != XTABS && !XT;
23: NONL = (tty.sg_flags & CRMOD) == 0;
24: }
25:
26: char *xPC;
27: char **sstrs[] = {
28: &AL, &BC, &BT, &CD, &CE, &CL, &CM, &DC, &DL, &DM, &DO, &ED, &EI,
29: &F0, &F1, &F2, &F3, &F4, &F5, &F6, &F7, &F8, &F9,
30: &HO, &IC, &IM, &IP, &KD, &KE, &KH, &KL, &KR, &KS, &KU, &LL,
31: &ND, &xPC, &SE, &SF, &SO, &SR, &TA, &TE, &TI, &UP, &VB, &VS, &VE
32: };
33: bool *sflags[] = {
34: &AM, &BS, &DA, &DB, &EO, &HC, &HZ, &IN, &MI, &NC, &OS, &UL, &XN, &XT
35: };
36: char **fkeys[10] = {
37: &F0, &F1, &F2, &F3, &F4, &F5, &F6, &F7, &F8, &F9
38: };
39: setterm(type)
40: char *type;
41: {
42: char *cgoto();
43: register int unknown, i;
44: register int l;
45: char ltcbuf[TCBUFSIZE];
46:
47: if (type[0] == 0)
48: type = "xx";
49: unknown = 0;
50: putpad(TE);
51: if (tgetent(ltcbuf, type) != 1) {
52: unknown++;
53: CP(genbuf, "xx|dumb:");
54: }
55: i = LINES = tgetnum("li");
56: if (LINES <= 5)
57: LINES = 24;
58: if (LINES > 48)
59: LINES = 48;
60: l = LINES;
61: if (ospeed < B1200)
62: l /= 2;
63: else if (ospeed < B2400)
64: l = (l * 2) / 3;
65: aoftspace = tspace;
66: zap();
67: /*
68: * Initialize keypad arrow keys.
69: */
70: arrows[0].cap = KU; arrows[0].mapto = "k"; arrows[0].descr = "up";
71: arrows[1].cap = KD; arrows[1].mapto = "j"; arrows[1].descr = "down";
72: arrows[2].cap = KL; arrows[2].mapto = "h"; arrows[2].descr = "left";
73: arrows[3].cap = KR; arrows[3].mapto = "l"; arrows[3].descr = "right";
74: arrows[4].cap = KH; arrows[4].mapto = "H"; arrows[4].descr = "home";
75:
76: options[WINDOW].ovalue = options[WINDOW].odefault = l - 1;
77: if (defwind) options[WINDOW].ovalue = defwind;
78: options[SCROLL].ovalue = options[SCROLL].odefault = HC ? 11 : ((l-1) / 2);
79: COLUMNS = tgetnum("co");
80: if (COLUMNS <= 20)
81: COLUMNS = 1000;
82: if (cgoto()[0] == 'O') /* OOPS */
83: CA = 0, CM = 0;
84: else
85: CA = 1, costCM = strlen(tgoto(CM, 8, 10));
86: PC = xPC ? xPC[0] : 0;
87: aoftspace = tspace;
88: CP(ttytype, longname(genbuf, type));
89: if (i <= 0)
90: LINES = 2;
91: /* proper strings to change tty type */
92: #ifdef notdef
93: /* Taken out because we don't allow it. See ex_set.c for reasons. */
94: if (inopen)
95: putpad(VE);
96: #endif
97: termreset();
98: gettmode();
99: value(REDRAW) = AL && DL;
100: value(OPTIMIZE) = !CA && !GT;
101: if (unknown)
102: serror("%s: Unknown terminal type", type);
103: }
104:
105: zap()
106: {
107: register char *namp;
108: register bool **fp;
109: register char ***sp;
110:
111: namp = "ambsdadbeohchzinmincosulxnxt";
112: fp = sflags;
113: do {
114: *(*fp++) = tgetflag(namp);
115: namp += 2;
116: } while (*namp);
117: namp = "albcbtcdceclcmdcdldmdoedeik0k1k2k3k4k5k6k7k8k9hoicimipkdkekhklkrkskullndpcsesfsosrtatetiupvbvsve";
118: sp = sstrs;
119: do {
120: *(*sp++) = tgetstr(namp, &aoftspace);
121: namp += 2;
122: } while (*namp);
123: }
124:
125: char *
126: longname(bp, def)
127: register char *bp;
128: char *def;
129: {
130: register char *cp;
131:
132: while (*bp && *bp != ':' && *bp != '|')
133: bp++;
134: if (*bp == '|') {
135: bp++;
136: cp = bp;
137: while (*cp && *cp != ':' && *cp != '|')
138: cp++;
139: *cp = 0;
140: return (bp);
141: }
142: return (def);
143: }
144:
145: char *
146: fkey(i)
147: int i;
148: {
149: if (0 <= i && i <= 9)
150: return(*fkeys[i]);
151: else
152: return(NOSTR);
153: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.