keymap.h revision 1.1 1 1.1 blymn /* $NetBSD: keymap.h,v 1.1 2007/01/21 11:38:59 blymn Exp $ */
2 1.1 blymn
3 1.1 blymn /*
4 1.1 blymn * Copyright (c) 2005 The NetBSD Foundation Inc.
5 1.1 blymn * All rights reserved.
6 1.1 blymn *
7 1.1 blymn * This code is derived from code donated to the NetBSD Foundation
8 1.1 blymn * by Ruibiao Qiu <ruibiao (at) arl.wustl.edu,ruibiao (at) gmail.com>.
9 1.1 blymn *
10 1.1 blymn *
11 1.1 blymn * Redistribution and use in source and binary forms, with or without
12 1.1 blymn * modification, are permitted provided that the following conditions
13 1.1 blymn * are met:
14 1.1 blymn * 1. Redistributions of source code must retain the above copyright
15 1.1 blymn * notice, this list of conditions and the following disclaimer.
16 1.1 blymn * 2. Redistributions in binary form must reproduce the above copyright
17 1.1 blymn * notice, this list of conditions and the following disclaimer in the
18 1.1 blymn * documentation and/or other materials provided with the distribution.
19 1.1 blymn * 3. Neither the name of the NetBSD Foundation nor the names of its
20 1.1 blymn * contributors may be used to endorse or promote products derived
21 1.1 blymn * from this software without specific prior written permission.
22 1.1 blymn *
23 1.1 blymn * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND
24 1.1 blymn * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
25 1.1 blymn * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
26 1.1 blymn * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
27 1.1 blymn * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
28 1.1 blymn * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
29 1.1 blymn * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
30 1.1 blymn * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
31 1.1 blymn * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
32 1.1 blymn * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
33 1.1 blymn * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
34 1.1 blymn * SUCH DAMAGE.
35 1.1 blymn */
36 1.1 blymn
37 1.1 blymn #ifndef _KEYMAP_H_
38 1.1 blymn #define _KEYMAP_H_
39 1.1 blymn
40 1.1 blymn #include <sys/cdefs.h>
41 1.1 blymn #ifndef lint
42 1.1 blymn __RCSID("$NetBSD: keymap.h,v 1.1 2007/01/21 11:38:59 blymn Exp $");
43 1.1 blymn #endif /* not lint */
44 1.1 blymn
45 1.1 blymn /* keymap related stuff */
46 1.1 blymn /*
47 1.1 blymn * moved here by Ruibiao Qiu
48 1.1 blymn * because it is needed by both getch() and get_wch()
49 1.1 blymn *
50 1.1 blymn * Keyboard input handler. Do this by snarfing
51 1.1 blymn * all the info we can out of the termcap entry for TERM and putting it
52 1.1 blymn * into a set of keymaps. A keymap is an array the size of all the possible
53 1.1 blymn * single characters we can get, the contents of the array is a structure
54 1.1 blymn * that contains the type of entry this character is (i.e. part/end of a
55 1.1 blymn * multi-char sequence or a plain char) and either a pointer which will point
56 1.1 blymn * to another keymap (in the case of a multi-char sequence) OR the data value
57 1.1 blymn * that this key should return.
58 1.1 blymn *
59 1.1 blymn */
60 1.1 blymn
61 1.1 blymn /* private data structures for holding the key definitions */
62 1.1 blymn typedef struct key_entry key_entry_t;
63 1.1 blymn
64 1.1 blymn struct key_entry {
65 1.1 blymn short type; /* type of key this is */
66 1.1 blymn bool enable; /* true if the key is active */
67 1.1 blymn union {
68 1.1 blymn keymap_t *next; /* next keymap is key is multi-key sequence */
69 1.1 blymn wchar_t symbol; /* key symbol if key is a leaf entry */
70 1.1 blymn } value;
71 1.1 blymn };
72 1.1 blymn /* Types of key structures we can have */
73 1.1 blymn #define KEYMAP_MULTI 1 /* part of a multi char sequence */
74 1.1 blymn #define KEYMAP_LEAF 2 /* key has a symbol associated with it, either
75 1.1 blymn * it is the end of a multi-char sequence or a
76 1.1 blymn * single char key that generates a symbol */
77 1.1 blymn
78 1.1 blymn /* allocate this many key_entry structs at once to speed start up must
79 1.1 blymn * be a power of 2.
80 1.1 blymn */
81 1.1 blymn #define KEYMAP_ALLOC_CHUNK 4
82 1.1 blymn
83 1.1 blymn /* The max number of different chars we can receive */
84 1.1 blymn #define MAX_CHAR 256
85 1.1 blymn
86 1.1 blymn /*
87 1.1 blymn * Unused mapping flag.
88 1.1 blymn */
89 1.1 blymn #define MAPPING_UNUSED (0 - MAX_CHAR) /* never been used */
90 1.1 blymn
91 1.1 blymn struct keymap {
92 1.1 blymn int count; /* count of number of key structs allocated */
93 1.1 blymn short mapping[MAX_CHAR]; /* mapping of key to allocated structs */
94 1.1 blymn key_entry_t **key; /* dynamic array of keys */
95 1.1 blymn };
96 1.1 blymn
97 1.1 blymn #define INC_POINTER(ptr) do { \
98 1.1 blymn (ptr)++; \
99 1.1 blymn (ptr) %= INBUF_SZ; \
100 1.1 blymn } while(/*CONSTCOND*/0)
101 1.1 blymn
102 1.1 blymn static short state; /* state of the inkey function */
103 1.1 blymn
104 1.1 blymn #define INKEY_NORM 0 /* no key backlog to process */
105 1.1 blymn #define INKEY_ASSEMBLING 1 /* assembling a multi-key sequence */
106 1.1 blymn #define INKEY_BACKOUT 2 /* recovering from an unrecognised key */
107 1.1 blymn #define INKEY_TIMEOUT 3 /* multi-key sequence timeout */
108 1.1 blymn #ifdef HAVE_WCHAR
109 1.1 blymn #define INKEY_WCASSEMBLING 4 /* assembling a wide char sequence */
110 1.1 blymn #endif /* HAVE_WCHAR */
111 1.1 blymn
112 1.1 blymn /* The termcap data we are interested in and the symbols they map to */
113 1.1 blymn struct tcdata {
114 1.1 blymn const char *name; /* name of termcap entry */
115 1.1 blymn wchar_t symbol; /* the symbol associated with it */
116 1.1 blymn };
117 1.1 blymn
118 1.1 blymn static const struct tcdata tc[] = {
119 1.1 blymn {"!1", KEY_SSAVE},
120 1.1 blymn {"!2", KEY_SSUSPEND},
121 1.1 blymn {"!3", KEY_SUNDO},
122 1.1 blymn {"#1", KEY_SHELP},
123 1.1 blymn {"#2", KEY_SHOME},
124 1.1 blymn {"#3", KEY_SIC},
125 1.1 blymn {"#4", KEY_SLEFT},
126 1.1 blymn {"%0", KEY_REDO},
127 1.1 blymn {"%1", KEY_HELP},
128 1.1 blymn {"%2", KEY_MARK},
129 1.1 blymn {"%3", KEY_MESSAGE},
130 1.1 blymn {"%4", KEY_MOVE},
131 1.1 blymn {"%5", KEY_NEXT},
132 1.1 blymn {"%6", KEY_OPEN},
133 1.1 blymn {"%7", KEY_OPTIONS},
134 1.1 blymn {"%8", KEY_PREVIOUS},
135 1.1 blymn {"%9", KEY_PRINT},
136 1.1 blymn {"%a", KEY_SMESSAGE},
137 1.1 blymn {"%b", KEY_SMOVE},
138 1.1 blymn {"%c", KEY_SNEXT},
139 1.1 blymn {"%d", KEY_SOPTIONS},
140 1.1 blymn {"%e", KEY_SPREVIOUS},
141 1.1 blymn {"%f", KEY_SPRINT},
142 1.1 blymn {"%g", KEY_SREDO},
143 1.1 blymn {"%h", KEY_SREPLACE},
144 1.1 blymn {"%i", KEY_SRIGHT},
145 1.1 blymn {"%j", KEY_SRSUME},
146 1.1 blymn {"&0", KEY_SCANCEL},
147 1.1 blymn {"&1", KEY_REFERENCE},
148 1.1 blymn {"&2", KEY_REFRESH},
149 1.1 blymn {"&3", KEY_REPLACE},
150 1.1 blymn {"&4", KEY_RESTART},
151 1.1 blymn {"&5", KEY_RESUME},
152 1.1 blymn {"&6", KEY_SAVE},
153 1.1 blymn {"&7", KEY_SUSPEND},
154 1.1 blymn {"&8", KEY_UNDO},
155 1.1 blymn {"&9", KEY_SBEG},
156 1.1 blymn {"*0", KEY_SFIND},
157 1.1 blymn {"*1", KEY_SCOMMAND},
158 1.1 blymn {"*2", KEY_SCOPY},
159 1.1 blymn {"*3", KEY_SCREATE},
160 1.1 blymn {"*4", KEY_SDC},
161 1.1 blymn {"*5", KEY_SDL},
162 1.1 blymn {"*6", KEY_SELECT},
163 1.1 blymn {"*7", KEY_SEND},
164 1.1 blymn {"*8", KEY_SEOL},
165 1.1 blymn {"*9", KEY_SEXIT},
166 1.1 blymn {"@0", KEY_FIND},
167 1.1 blymn {"@1", KEY_BEG},
168 1.1 blymn {"@2", KEY_CANCEL},
169 1.1 blymn {"@3", KEY_CLOSE},
170 1.1 blymn {"@4", KEY_COMMAND},
171 1.1 blymn {"@5", KEY_COPY},
172 1.1 blymn {"@6", KEY_CREATE},
173 1.1 blymn {"@7", KEY_END},
174 1.1 blymn {"@8", KEY_ENTER},
175 1.1 blymn {"@9", KEY_EXIT},
176 1.1 blymn {"F1", KEY_F(11)},
177 1.1 blymn {"F2", KEY_F(12)},
178 1.1 blymn {"F3", KEY_F(13)},
179 1.1 blymn {"F4", KEY_F(14)},
180 1.1 blymn {"F5", KEY_F(15)},
181 1.1 blymn {"F6", KEY_F(16)},
182 1.1 blymn {"F7", KEY_F(17)},
183 1.1 blymn {"F8", KEY_F(18)},
184 1.1 blymn {"F9", KEY_F(19)},
185 1.1 blymn {"FA", KEY_F(20)},
186 1.1 blymn {"FB", KEY_F(21)},
187 1.1 blymn {"FC", KEY_F(22)},
188 1.1 blymn {"FD", KEY_F(23)},
189 1.1 blymn {"FE", KEY_F(24)},
190 1.1 blymn {"FF", KEY_F(25)},
191 1.1 blymn {"FG", KEY_F(26)},
192 1.1 blymn {"FH", KEY_F(27)},
193 1.1 blymn {"FI", KEY_F(28)},
194 1.1 blymn {"FJ", KEY_F(29)},
195 1.1 blymn {"FK", KEY_F(30)},
196 1.1 blymn {"FL", KEY_F(31)},
197 1.1 blymn {"FM", KEY_F(32)},
198 1.1 blymn {"FN", KEY_F(33)},
199 1.1 blymn {"FO", KEY_F(34)},
200 1.1 blymn {"FP", KEY_F(35)},
201 1.1 blymn {"FQ", KEY_F(36)},
202 1.1 blymn {"FR", KEY_F(37)},
203 1.1 blymn {"FS", KEY_F(38)},
204 1.1 blymn {"FT", KEY_F(39)},
205 1.1 blymn {"FU", KEY_F(40)},
206 1.1 blymn {"FV", KEY_F(41)},
207 1.1 blymn {"FW", KEY_F(42)},
208 1.1 blymn {"FX", KEY_F(43)},
209 1.1 blymn {"FY", KEY_F(44)},
210 1.1 blymn {"FZ", KEY_F(45)},
211 1.1 blymn {"Fa", KEY_F(46)},
212 1.1 blymn {"Fb", KEY_F(47)},
213 1.1 blymn {"Fc", KEY_F(48)},
214 1.1 blymn {"Fd", KEY_F(49)},
215 1.1 blymn {"Fe", KEY_F(50)},
216 1.1 blymn {"Ff", KEY_F(51)},
217 1.1 blymn {"Fg", KEY_F(52)},
218 1.1 blymn {"Fh", KEY_F(53)},
219 1.1 blymn {"Fi", KEY_F(54)},
220 1.1 blymn {"Fj", KEY_F(55)},
221 1.1 blymn {"Fk", KEY_F(56)},
222 1.1 blymn {"Fl", KEY_F(57)},
223 1.1 blymn {"Fm", KEY_F(58)},
224 1.1 blymn {"Fn", KEY_F(59)},
225 1.1 blymn {"Fo", KEY_F(60)},
226 1.1 blymn {"Fp", KEY_F(61)},
227 1.1 blymn {"Fq", KEY_F(62)},
228 1.1 blymn {"Fr", KEY_F(63)},
229 1.1 blymn {"K1", KEY_A1},
230 1.1 blymn {"K2", KEY_B2},
231 1.1 blymn {"K3", KEY_A3},
232 1.1 blymn {"K4", KEY_C1},
233 1.1 blymn {"K5", KEY_C3},
234 1.1 blymn {"Km", KEY_MOUSE},
235 1.1 blymn {"k0", KEY_F0},
236 1.1 blymn {"k1", KEY_F(1)},
237 1.1 blymn {"k2", KEY_F(2)},
238 1.1 blymn {"k3", KEY_F(3)},
239 1.1 blymn {"k4", KEY_F(4)},
240 1.1 blymn {"k5", KEY_F(5)},
241 1.1 blymn {"k6", KEY_F(6)},
242 1.1 blymn {"k7", KEY_F(7)},
243 1.1 blymn {"k8", KEY_F(8)},
244 1.1 blymn {"k9", KEY_F(9)},
245 1.1 blymn {"k;", KEY_F(10)},
246 1.1 blymn {"kA", KEY_IL},
247 1.1 blymn {"ka", KEY_CATAB},
248 1.1 blymn {"kB", KEY_BTAB},
249 1.1 blymn {"kb", KEY_BACKSPACE},
250 1.1 blymn {"kC", KEY_CLEAR},
251 1.1 blymn {"kD", KEY_DC},
252 1.1 blymn {"kd", KEY_DOWN},
253 1.1 blymn {"kE", KEY_EOL},
254 1.1 blymn {"kF", KEY_SF},
255 1.1 blymn {"kH", KEY_LL},
256 1.1 blymn {"kh", KEY_HOME},
257 1.1 blymn {"kI", KEY_IC},
258 1.1 blymn {"kL", KEY_DL},
259 1.1 blymn {"kl", KEY_LEFT},
260 1.1 blymn {"kM", KEY_EIC},
261 1.1 blymn {"kN", KEY_NPAGE},
262 1.1 blymn {"kP", KEY_PPAGE},
263 1.1 blymn {"kR", KEY_SR},
264 1.1 blymn {"kr", KEY_RIGHT},
265 1.1 blymn {"kS", KEY_EOS},
266 1.1 blymn {"kT", KEY_STAB},
267 1.1 blymn {"kt", KEY_CTAB},
268 1.1 blymn {"ku", KEY_UP}
269 1.1 blymn };
270 1.1 blymn /* Number of TC entries .... */
271 1.1 blymn static const int num_tcs = (sizeof(tc) / sizeof(struct tcdata));
272 1.1 blymn #endif /* _KEYMAP_H_ */
273