1 /*
2 Copyright (c) 2005-2013 uim Project https://github.com/uim/uim
3
4 All rights reserved.
5
6 Redistribution and use in source and binary forms, with or
7 without modification, are permitted provided that the
8 following conditions are met:
9
10 1. Redistributions of source code must retain the above
11 copyright notice, this list of conditions and the
12 following disclaimer.
13 2. Redistributions in binary form must reproduce the above
14 copyright notice, this list of conditions and the
15 following disclaimer in the documentation and/or other
16 materials provided with the distribution.
17 3. Neither the name of authors nor the names of its
18 contributors may be used to endorse or promote products
19 derived from this software without specific prior written
20 permission.
21
22 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
23 CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
24 INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
25 MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
26 DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
27 CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
28 SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
29 NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
30 LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
31 HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
32 CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
33 OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
34 SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
35 */
36
37 #include "key.h"
38
39 /*
40 convert abbreviated key description to generic Emacs-style key description
41 (for XEmacs)
42 */
43 void
convert_keyname_a2e(char * keyname,const char * name,size_t keyname_len)44 convert_keyname_a2e(char *keyname, const char *name, size_t keyname_len)
45 {
46 if (strcmp(name, "BS") == 0)
47 strlcpy(keyname, "backspace", keyname_len);
48 else if (strcmp(name, "TAB") == 0)
49 strlcpy(keyname, "tab", keyname_len);
50 else if (strcmp(name, "RET") == 0)
51 strlcpy(keyname, "return", keyname_len);
52 else if (strcmp(name, "ESC") == 0)
53 strlcpy(keyname, "escape", keyname_len);
54 else if (strcmp(name, "DEL") == 0)
55 strlcpy(keyname, "delete", keyname_len);
56 else if (strcmp(name, "DEL") == 0)
57 strlcpy(keyname, "delete", keyname_len);
58 else if (strcmp(name, "SPC") == 0)
59 strlcpy(keyname, "space", keyname_len);
60 else
61 strlcpy(keyname, name, keyname_len);
62 }
63
64
65 /*
66 convert generic Emacs-style key description to Uim-style key description
67 */
68 enum UKey
convert_keyname_e2u(const char * keyname)69 convert_keyname_e2u(const char *keyname)
70 {
71 if (strcmp("space", keyname) == 0)
72 return ' '; /* "space" has no Uim-style key description */
73 else if (strcmp("backspace", keyname) == 0)
74 return UKey_Backspace;
75 else if (strcmp("tab", keyname) == 0)
76 return UKey_Tab;
77 else if (strcmp("return", keyname) == 0)
78 return UKey_Return;
79 else if (strcmp("escape", keyname) == 0)
80 return UKey_Escape;
81 else if (strcmp("prior", keyname) == 0)
82 return UKey_Prior;
83 else if (strcmp("next", keyname) == 0)
84 return UKey_Next;
85 else if (strcmp("end", keyname) == 0)
86 return UKey_End;
87 else if (strcmp("home", keyname) == 0)
88 return UKey_Home;
89 else if (strcmp("left", keyname) == 0)
90 return UKey_Left;
91 else if (strcmp("up", keyname) == 0)
92 return UKey_Up;
93 else if (strcmp("right", keyname) == 0)
94 return UKey_Right;
95 else if (strcmp("down", keyname) == 0)
96 return UKey_Down;
97 else if (strcmp("insert", keyname) == 0)
98 return UKey_Insert;
99 else if (strcmp("delete", keyname) == 0)
100 return UKey_Delete;
101 else if (strcmp("kanji", keyname) == 0)
102 return UKey_Kanji;
103 else if (strcmp("muhenkan", keyname) == 0)
104 return UKey_Muhenkan;
105 else if (strcmp("henkan", keyname) == 0)
106 return UKey_Henkan_Mode;
107 else if (strcmp("romaji", keyname) == 0)
108 return UKey_Romaji;
109 else if (strcmp("hiragana", keyname) == 0)
110 return UKey_Hiragana;
111 else if (strcmp("katakana", keyname) == 0)
112 return UKey_Katakana;
113 else if (strcmp("hiragana-katakana", keyname) == 0)
114 return UKey_Hiragana_Katakana;
115 else if (strcmp("zenkaku", keyname) == 0)
116 return UKey_Zenkaku;
117 else if (strcmp("hankaku", keyname) == 0)
118 return UKey_Hankaku;
119 else if (strcmp("zenkaku-hankaku", keyname) == 0)
120 return UKey_Zenkaku_Hankaku;
121 else if (strcmp("touroku", keyname) == 0)
122 return UKey_Touroku;
123 else if (strcmp("massyo", keyname) == 0)
124 return UKey_Massyo;
125 else if (strcmp("kana-lock", keyname) == 0)
126 return UKey_Kana_Lock;
127 else if (strcmp("kana-shift", keyname) == 0)
128 return UKey_Kana_Shift;
129 else if (strcmp("eisu-shift", keyname) == 0)
130 return UKey_Eisu_Shift;
131 else if (strcmp("eisu-toggle", keyname) == 0)
132 return UKey_Eisu_toggle;
133 else if (strcmp("Caps_Lock", keyname) == 0
134 || strcmp("caps-lock", keyname) == 0)
135 return UKey_Caps_Lock;
136 else if (strcmp("Num_Lock", keyname) == 0
137 || strcmp("num-lock", keyname) == 0)
138 return UKey_Num_Lock;
139 else if (strcmp("Scroll_Lock", keyname) == 0
140 || strcmp("scroll-lock", keyname) == 0)
141 return UKey_Scroll_Lock;
142 else if (strcmp("yen", keyname) == 0)
143 return UKey_Yen;
144 else if (strcmp("Multi_key", keyname) == 0
145 || strcmp("multi-key", keyname) == 0)
146 return UKey_Multi_key;
147 else if (strcmp("Codeinput", keyname) == 0
148 || strcmp("codeinput", keyname) == 0)
149 return UKey_Codeinput;
150 else if (strcmp("SingleCandidate", keyname) == 0
151 || strcmp("singlecandidate", keyname) == 0)
152 return UKey_SingleCandidate;
153 else if (strcmp("MultipleCandidate", keyname) == 0
154 || strcmp("multiplecandidate", keyname) == 0)
155 return UKey_MultipleCandidate;
156 else if (strcmp("PreviousCandidate", keyname) == 0
157 || strcmp("previouscandidate", keyname) == 0)
158 return UKey_PreviousCandidate;
159 else if (strcmp("Mode_switch", keyname) == 0
160 || strcmp("mode-switch", keyname) == 0)
161 return UKey_Mode_switch;
162 else if (strncmp("f", keyname, strlen("f")) == 0) {
163 keyname += strlen("f");
164 if (strcmp("1", keyname) == 0)
165 return UKey_F1;
166 else if (strcmp("2", keyname) == 0)
167 return UKey_F2;
168 else if (strcmp("3", keyname) == 0)
169 return UKey_F3;
170 else if (strcmp("4", keyname) == 0)
171 return UKey_F4;
172 else if (strcmp("5", keyname) == 0)
173 return UKey_F5;
174 else if (strcmp("6", keyname) == 0)
175 return UKey_F6;
176 else if (strcmp("7", keyname) == 0)
177 return UKey_F7;
178 else if (strcmp("8", keyname) == 0)
179 return UKey_F8;
180 else if (strcmp("9", keyname) == 0)
181 return UKey_F9;
182 else if (strcmp("10", keyname) == 0)
183 return UKey_F10;
184 else if (strcmp("11", keyname) == 0)
185 return UKey_F11;
186 else if (strcmp("12", keyname) == 0)
187 return UKey_F12;
188 else if (strcmp("13", keyname) == 0)
189 return UKey_F13;
190 else if (strcmp("14", keyname) == 0)
191 return UKey_F14;
192 else if (strcmp("15", keyname) == 0)
193 return UKey_F15;
194 else if (strcmp("16", keyname) == 0)
195 return UKey_F16;
196 else if (strcmp("17", keyname) == 0)
197 return UKey_F17;
198 else if (strcmp("18", keyname) == 0)
199 return UKey_F18;
200 else if (strcmp("19", keyname) == 0)
201 return UKey_F19;
202 else if (strcmp("20", keyname) == 0)
203 return UKey_F20;
204 else if (strcmp("21", keyname) == 0)
205 return UKey_F21;
206 else if (strcmp("22", keyname) == 0)
207 return UKey_F22;
208 else if (strcmp("23", keyname) == 0)
209 return UKey_F23;
210 else if (strcmp("24", keyname) == 0)
211 return UKey_F24;
212 else if (strcmp("25", keyname) == 0)
213 return UKey_F25;
214 else if (strcmp("26", keyname) == 0)
215 return UKey_F26;
216 else if (strcmp("27", keyname) == 0)
217 return UKey_F27;
218 else if (strcmp("28", keyname) == 0)
219 return UKey_F28;
220 else if (strcmp("29", keyname) == 0)
221 return UKey_F29;
222 else if (strcmp("30", keyname) == 0)
223 return UKey_F30;
224 else if (strcmp("31", keyname) == 0)
225 return UKey_F31;
226 else if (strcmp("32", keyname) == 0)
227 return UKey_F32;
228 else if (strcmp("33", keyname) == 0)
229 return UKey_F33;
230 else if (strcmp("34", keyname) == 0)
231 return UKey_F34;
232 else if (strcmp("35", keyname) == 0)
233 return UKey_F35;
234 } else if (strcmp("Hangul", keyname) == 0)
235 return UKey_Hangul;
236 else if (strncmp("Hangul_", keyname, strlen("Hangul_")) == 0) {
237 keyname += strlen("Hangul_");
238 if (strcmp("Start", keyname) == 0)
239 return UKey_Hangul_Start;
240 else if (strcmp("End", keyname) == 0)
241 return UKey_Hangul_End;
242 else if (strcmp("Hanja", keyname) == 0)
243 return UKey_Hangul_Hanja;
244 else if (strcmp("Jamo", keyname) == 0)
245 return UKey_Hangul_Jamo;
246 else if (strcmp("Romaja", keyname) == 0)
247 return UKey_Hangul_Romaja;
248 else if (strcmp("Codeinput", keyname) == 0)
249 return UKey_Hangul_Codeinput;
250 else if (strcmp("Jeonja", keyname) == 0)
251 return UKey_Hangul_Jeonja;
252 else if (strcmp("Banja", keyname) == 0)
253 return UKey_Hangul_Banja;
254 else if (strcmp("PreHanja", keyname) == 0)
255 return UKey_Hangul_PreHanja;
256 else if (strcmp("PostHanja", keyname) == 0)
257 return UKey_Hangul_PostHanja;
258 else if (strcmp("SingleCandidate", keyname) == 0)
259 return UKey_Hangul_SingleCandidate;
260 else if (strcmp("MultipleCandidate", keyname) == 0)
261 return UKey_Hangul_MultipleCandidate;
262 else if (strcmp("PreviousCandidate", keyname) == 0)
263 return UKey_Hangul_PreviousCandidate;
264 else if (strcmp("Special", keyname) == 0)
265 return UKey_Hangul_Special;
266 } else if (strncmp("hangul-", keyname, strlen("hangul-")) == 0) {
267 keyname += strlen("hangul-");
268 if (strcmp("start", keyname) == 0)
269 return UKey_Hangul_Start;
270 else if (strcmp("end", keyname) == 0)
271 return UKey_Hangul_End;
272 else if (strcmp("hanja", keyname) == 0)
273 return UKey_Hangul_Hanja;
274 else if (strcmp("jamo", keyname) == 0)
275 return UKey_Hangul_Jamo;
276 else if (strcmp("romaja", keyname) == 0)
277 return UKey_Hangul_Romaja;
278 else if (strcmp("codeinput", keyname) == 0)
279 return UKey_Hangul_Codeinput;
280 else if (strcmp("jeonja", keyname) == 0)
281 return UKey_Hangul_Jeonja;
282 else if (strcmp("banja", keyname) == 0)
283 return UKey_Hangul_Banja;
284 else if (strcmp("prehanja", keyname) == 0)
285 return UKey_Hangul_PreHanja;
286 else if (strcmp("posthanja", keyname) == 0)
287 return UKey_Hangul_PostHanja;
288 else if (strcmp("singlecandidate", keyname) == 0)
289 return UKey_Hangul_SingleCandidate;
290 else if (strcmp("multiplecandidate", keyname) == 0)
291 return UKey_Hangul_MultipleCandidate;
292 else if (strcmp("previouscandidate", keyname) == 0)
293 return UKey_Hangul_PreviousCandidate;
294 else if (strcmp("special", keyname) == 0)
295 return UKey_Hangul_Special;
296 } else if (strncmp("dead-", keyname, strlen("dead-")) == 0) {
297 keyname += strlen("dead-");
298 if (strcmp("grave", keyname) == 0)
299 return UKey_Dead_Grave;
300 else if (strcmp("acute", keyname) == 0)
301 return UKey_Dead_Acute;
302 else if (strcmp("circumflex", keyname) == 0)
303 return UKey_Dead_Circumflex;
304 else if (strcmp("tilde", keyname) == 0)
305 return UKey_Dead_Tilde;
306 else if (strcmp("macron", keyname) == 0)
307 return UKey_Dead_Macron;
308 else if (strcmp("breve", keyname) == 0)
309 return UKey_Dead_Breve;
310 else if (strcmp("abovedot", keyname) == 0)
311 return UKey_Dead_Abovedot;
312 else if (strcmp("diaeresis", keyname) == 0)
313 return UKey_Dead_Diaeresis;
314 else if (strcmp("abovering", keyname) == 0)
315 return UKey_Dead_Abovering;
316 else if (strcmp("doubleacute", keyname) == 0)
317 return UKey_Dead_Doubleacute;
318 else if (strcmp("caron", keyname) == 0)
319 return UKey_Dead_Caron;
320 else if (strcmp("cedilla", keyname) == 0)
321 return UKey_Dead_Cedilla;
322 else if (strcmp("ogonek", keyname) == 0)
323 return UKey_Dead_Ogonek;
324 else if (strcmp("iota", keyname) == 0)
325 return UKey_Dead_Iota;
326 else if (strcmp("voicedsound", keyname) == 0)
327 return UKey_Dead_VoicedSound;
328 else if (strcmp("semivoicedsound", keyname) == 0)
329 return UKey_Dead_SemivoicedSound;
330 else if (strcmp("belowdot", keyname) == 0)
331 return UKey_Dead_Belowdot;
332 else if (strcmp("hook", keyname) == 0)
333 return UKey_Dead_Hook;
334 else if (strcmp("horn", keyname) == 0)
335 return UKey_Dead_Horn;
336 } else if (strncmp("kana_", keyname, strlen("kana_")) == 0) {
337 keyname += strlen("kana_");
338 if (strcmp("fullstop", keyname) == 0)
339 return UKey_Kana_Fullstop;
340 else if (strcmp("openingbracket", keyname) == 0)
341 return UKey_Kana_OpeningBracket;
342 else if (strcmp("closingbracket", keyname) == 0)
343 return UKey_Kana_ClosingBracket;
344 else if (strcmp("comma", keyname) == 0)
345 return UKey_Kana_Comma;
346 else if (strcmp("conjunctive", keyname) == 0)
347 return UKey_Kana_Conjunctive;
348 else if (strcmp("WO", keyname) == 0)
349 return UKey_Kana_WO;
350 else if (strcmp("a", keyname) == 0)
351 return UKey_Kana_a;
352 else if (strcmp("i", keyname) == 0)
353 return UKey_Kana_i;
354 else if (strcmp("u", keyname) == 0)
355 return UKey_Kana_u;
356 else if (strcmp("e", keyname) == 0)
357 return UKey_Kana_e;
358 else if (strcmp("o", keyname) == 0)
359 return UKey_Kana_o;
360 else if (strcmp("ya", keyname) == 0)
361 return UKey_Kana_ya;
362 else if (strcmp("yu", keyname) == 0)
363 return UKey_Kana_yu;
364 else if (strcmp("yo", keyname) == 0)
365 return UKey_Kana_yo;
366 else if (strcmp("tsu", keyname) == 0)
367 return UKey_Kana_tsu;
368 else if (strcmp("A", keyname) == 0)
369 return UKey_Kana_A;
370 else if (strcmp("I", keyname) == 0)
371 return UKey_Kana_I;
372 else if (strcmp("U", keyname) == 0)
373 return UKey_Kana_U;
374 else if (strcmp("E", keyname) == 0)
375 return UKey_Kana_E;
376 else if (strcmp("O", keyname) == 0)
377 return UKey_Kana_O;
378 else if (strcmp("KA", keyname) == 0)
379 return UKey_Kana_KA;
380 else if (strcmp("KI", keyname) == 0)
381 return UKey_Kana_KI;
382 else if (strcmp("KU", keyname) == 0)
383 return UKey_Kana_KU;
384 else if (strcmp("KE", keyname) == 0)
385 return UKey_Kana_KE;
386 else if (strcmp("KO", keyname) == 0)
387 return UKey_Kana_KO;
388 else if (strcmp("SA", keyname) == 0)
389 return UKey_Kana_SA;
390 else if (strcmp("SHI", keyname) == 0)
391 return UKey_Kana_SHI;
392 else if (strcmp("SU", keyname) == 0)
393 return UKey_Kana_SU;
394 else if (strcmp("SE", keyname) == 0)
395 return UKey_Kana_SE;
396 else if (strcmp("SO", keyname) == 0)
397 return UKey_Kana_SO;
398 else if (strcmp("TA", keyname) == 0)
399 return UKey_Kana_TA;
400 else if (strcmp("CHI", keyname) == 0)
401 return UKey_Kana_CHI;
402 else if (strcmp("TSU", keyname) == 0)
403 return UKey_Kana_TSU;
404 else if (strcmp("TE", keyname) == 0)
405 return UKey_Kana_TE;
406 else if (strcmp("TO", keyname) == 0)
407 return UKey_Kana_TO;
408 else if (strcmp("NA", keyname) == 0)
409 return UKey_Kana_NA;
410 else if (strcmp("NI", keyname) == 0)
411 return UKey_Kana_NI;
412 else if (strcmp("NU", keyname) == 0)
413 return UKey_Kana_NU;
414 else if (strcmp("NE", keyname) == 0)
415 return UKey_Kana_NE;
416 else if (strcmp("NO", keyname) == 0)
417 return UKey_Kana_NO;
418 else if (strcmp("HA", keyname) == 0)
419 return UKey_Kana_HA;
420 else if (strcmp("HI", keyname) == 0)
421 return UKey_Kana_HI;
422 else if (strcmp("FU", keyname) == 0)
423 return UKey_Kana_FU;
424 else if (strcmp("HE", keyname) == 0)
425 return UKey_Kana_HE;
426 else if (strcmp("HO", keyname) == 0)
427 return UKey_Kana_HO;
428 else if (strcmp("MA", keyname) == 0)
429 return UKey_Kana_MA;
430 else if (strcmp("MI", keyname) == 0)
431 return UKey_Kana_MI;
432 else if (strcmp("MU", keyname) == 0)
433 return UKey_Kana_MU;
434 else if (strcmp("ME", keyname) == 0)
435 return UKey_Kana_ME;
436 else if (strcmp("MO", keyname) == 0)
437 return UKey_Kana_MO;
438 else if (strcmp("YA", keyname) == 0)
439 return UKey_Kana_YA;
440 else if (strcmp("YU", keyname) == 0)
441 return UKey_Kana_YU;
442 else if (strcmp("YO", keyname) == 0)
443 return UKey_Kana_YO;
444 else if (strcmp("RA", keyname) == 0)
445 return UKey_Kana_RA;
446 else if (strcmp("RI", keyname) == 0)
447 return UKey_Kana_RI;
448 else if (strcmp("RU", keyname) == 0)
449 return UKey_Kana_RU;
450 else if (strcmp("RE", keyname) == 0)
451 return UKey_Kana_RE;
452 else if (strcmp("RO", keyname) == 0)
453 return UKey_Kana_RO;
454 else if (strcmp("WA", keyname) == 0)
455 return UKey_Kana_WA;
456 else if (strcmp("N", keyname) == 0)
457 return UKey_Kana_N;
458 } else if (strcmp("prolongedsound", keyname) == 0)
459 return UKey_Kana_ProlongedSound;
460 else if (strcmp("voicedsound", keyname) == 0)
461 return UKey_Kana_VoicedSound;
462 else if (strcmp("semivoicedsound", keyname) == 0)
463 return UKey_Kana_SemivoicedSound;
464 else
465 return UKey_Other;
466
467 return UKey_Other;
468 }
469