|
1 // Copyright (c) 1996-2009 Nokia Corporation and/or its subsidiary(-ies). |
|
2 // All rights reserved. |
|
3 // This component and the accompanying materials are made available |
|
4 // under the terms of the License "Eclipse Public License v1.0" |
|
5 // which accompanies this distribution, and is available |
|
6 // at the URL "http://www.eclipse.org/legal/epl-v10.html". |
|
7 // |
|
8 // Initial Contributors: |
|
9 // Nokia Corporation - initial contribution. |
|
10 // |
|
11 // Contributors: |
|
12 // |
|
13 // Description: |
|
14 // omap3530/beagle_drivers/keytran/keymap.cpp |
|
15 // This file is part of the Beagle Base port |
|
16 // The keyboard lookup tables giving the function to be carried out |
|
17 // and the new state of the keyboard |
|
18 // |
|
19 |
|
20 |
|
21 #include <k32keys.h> |
|
22 |
|
23 #define ARRAY_LENGTH(array) (sizeof(array)/sizeof(array[0])) |
|
24 |
|
25 |
|
26 // |
|
27 // Scancode conversion tables |
|
28 // -------------------------- |
|
29 // The scancode conversion is arranged as a tree of tables which are used to |
|
30 // convert a scancode to a keycode, taking into account the modifier state |
|
31 // (shift, control, fn) |
|
32 // |
|
33 // How the tables work: |
|
34 // -------------------- |
|
35 // Firstly, there is a distinction between the "scancodes" used in scanning |
|
36 // the keyboard, and the "scancodes" used in this files. |
|
37 // |
|
38 // Typically the keyboard driver already contains a table to convert hardware |
|
39 // key location codes produced during keyboard scanning into EPOC "scancodes". |
|
40 // EPOC scancodes are defined for "standard" keys like shift, backspace, |
|
41 // escape, in the TStdScanCode enum (see E32KEYS.H), and should be ASCII codes |
|
42 // for normal characters. The keyboard driver should add these EPOC scancodes |
|
43 // to the event queue, not hardware-dependant key locations. |
|
44 // |
|
45 // For now on "scancode" refers to EPOC scancodes: |
|
46 // |
|
47 // The keyboard is divided into a number of "blocks" of contiguous scancodes |
|
48 // |
|
49 // Blocks map to keycodes in a keycode table, and several blocks can be |
|
50 // grouped and map to a single keycode table. Blocks map into the keycode |
|
51 // table in the order they are declared. For example, if two scancode blocks |
|
52 // with a range of 5 scancodes map to a single 10-entry keycode table, scancodes |
|
53 // which fall in the first block will map to the first 5 entries in the keycode |
|
54 // table, scancodes falling in the second block map the the next 5 entries in |
|
55 // the keycode table. |
|
56 // |
|
57 // In theory it is possible to have multiple [keycode,scancode blocks] groups |
|
58 // but there is little point doing this - grouping all the scancode blocks |
|
59 // with a single keycode table holding all possible keycode values is usually |
|
60 // sufficient (and simpler). However, there are some special cases where this |
|
61 // is useful - the most obvious example is handling of shift and caps lock. |
|
62 // The shift key implies everything that the caps-lock key does (upper case |
|
63 // letters) plus some shifted characters for other keys. This is done by |
|
64 // defining two tables - the first handles only caps-lock (upper case), the |
|
65 // second handles all other keys that are affected only by shift. If caps- |
|
66 // lock is active, only the caps-lock table is used. If shift is pressed both |
|
67 // the caps-lock and shift tables are scanned for the conversion. This allows |
|
68 // a base table to be extended with "extras", much like deriving a class from |
|
69 // base class and extending it. |
|
70 // |
|
71 // |
|
72 // There is one or more [keycode table, scancode blocks] group for each |
|
73 // modifier state - e.g. a lower-case table, upper-case, ctrl, ctrl-shift. |
|
74 // This is the root of the table. |
|
75 // |
|
76 // When converting a scancode the key translator first obtains the correct |
|
77 // conversion tables for the modifier state. It then traverses all the scancode |
|
78 // blocks looking for one which contains the scancode being converted. Once |
|
79 // a matching scancode range is located, the key translator maps this into |
|
80 // its position in the associated keycode table to obtain the converted keycode. |
|
81 // |
|
82 // The key tables below appear more complicated than they really are because of |
|
83 // the intermediate structures that hold pointers to other structures. The |
|
84 // important structures are: |
|
85 // SScanCodeBlock - contains a "start" and "end" for a scancode range |
|
86 // SConvSubTable - groups a number of scanode blocks with a keycode table |
|
87 // SConvTableNode - points to SConvSubTables for each modifier state |
|
88 // SConvTable - the root of the translation table - points to 1..n SConvTableNode |
|
89 // |
|
90 // The keycode tables are just an array of TUint16. |
|
91 // |
|
92 |
|
93 |
|
94 // |
|
95 // TO DO: (optional) |
|
96 // |
|
97 // Keys which are not affected by modifier state |
|
98 // |
|
99 |
|
100 // |
|
101 // This is a simple example of scancode to keycode mapping. The first block |
|
102 // in scanCodeBlock_unmodifiable is a range of several scancodes, so maps to |
|
103 // several entries in the keycode table convKeyCodes_unmodifiable. |
|
104 // EStdKeyLeftShift -> maps to -> EKeyLeftShift |
|
105 // EStdKeyRightShift -> maps to -> EKeyRightShift |
|
106 // ... |
|
107 // EStdKeyScrollLock -> maps to -> EKeyScrollLock |
|
108 // |
|
109 LOCAL_D const SScanCodeBlock scanCodeBlock_unmodifiable[]= |
|
110 { |
|
111 {EStdKeyLeftShift, EStdKeyScrollLock}, // range 1: left shift to scroll lock |
|
112 }; |
|
113 |
|
114 LOCAL_D const TUint16 convKeyCodes_unmodifiable[]= |
|
115 { |
|
116 EKeyLeftShift, |
|
117 EKeyRightShift, |
|
118 EKeyLeftAlt, |
|
119 EKeyRightAlt, |
|
120 EKeyLeftCtrl, |
|
121 EKeyRightCtrl, |
|
122 EKeyLeftFunc, |
|
123 EKeyRightFunc, |
|
124 EKeyCapsLock, |
|
125 EKeyNumLock, |
|
126 EKeyScrollLock |
|
127 }; |
|
128 |
|
129 |
|
130 |
|
131 // |
|
132 // TO DO: (optional) |
|
133 // |
|
134 // Base conversion table |
|
135 // this table traps all of the keyboard's scanCodes except those in |
|
136 // convKeyCodes_unmodifiable. It appears last in the top-level table and |
|
137 // is used to convert any scancode that is not converted by any of the |
|
138 // other tables |
|
139 // |
|
140 LOCAL_D const SScanCodeBlock scanCodeBlock_base[]= |
|
141 { |
|
142 {EStdKeyNull, EStdKeyDownArrow}, // scancode range 1 |
|
143 {'0', '9'}, // scancode range 2 |
|
144 {'A', 'Z'}, // scancode range 3 |
|
145 {EStdKeyF1, EStdKeyDictaphoneRecord}, // scancode range 4 |
|
146 }; |
|
147 |
|
148 LOCAL_D const TUint16 convKeyCodes_base[]= |
|
149 { |
|
150 EKeyNull, // scancode range 1 mapping starts here |
|
151 EKeyBackspace, |
|
152 EKeyTab, |
|
153 EKeyEnter, |
|
154 EKeyEscape, |
|
155 ' ', |
|
156 EKeyPrintScreen, |
|
157 EKeyPause, |
|
158 EKeyHome, |
|
159 EKeyEnd, |
|
160 EKeyPageUp, |
|
161 EKeyPageDown, |
|
162 EKeyInsert, |
|
163 EKeyDelete, |
|
164 EKeyLeftArrow, |
|
165 EKeyRightArrow, |
|
166 EKeyUpArrow, |
|
167 EKeyDownArrow, |
|
168 '0', // scancode range 2 mapping starts here |
|
169 '1', |
|
170 '2', |
|
171 '3', |
|
172 '4', |
|
173 '5', |
|
174 '6', |
|
175 '7', |
|
176 '8', |
|
177 '9', |
|
178 'a', // scancode range 3 mapping starts here |
|
179 'b', |
|
180 'c', |
|
181 'd', |
|
182 'e', |
|
183 'f', |
|
184 'g', |
|
185 'h', |
|
186 'i', |
|
187 'j', |
|
188 'k', |
|
189 'l', |
|
190 'm', |
|
191 'n', |
|
192 'o', |
|
193 'p', |
|
194 'q', |
|
195 'r', |
|
196 's', |
|
197 't', |
|
198 'u', |
|
199 'v', |
|
200 'w', |
|
201 'x', |
|
202 'y', |
|
203 'z', |
|
204 EKeyF1, // scancode range 4 mapping starts here |
|
205 EKeyF2, |
|
206 EKeyF3, |
|
207 EKeyF4, |
|
208 EKeyF5, |
|
209 EKeyF6, |
|
210 EKeyF7, |
|
211 EKeyF8, |
|
212 EKeyF9, |
|
213 EKeyF10, |
|
214 EKeyF11, |
|
215 EKeyF12, |
|
216 EKeyF13, |
|
217 EKeyF14, |
|
218 EKeyF15, |
|
219 EKeyF16, |
|
220 EKeyF17, |
|
221 EKeyF18, |
|
222 EKeyF19, |
|
223 EKeyF20, |
|
224 EKeyF21, |
|
225 EKeyF22, |
|
226 EKeyF23, |
|
227 EKeyF24, |
|
228 '`', |
|
229 ',', |
|
230 '.', |
|
231 '/', |
|
232 '\\', |
|
233 ';', |
|
234 '\'', |
|
235 '#', |
|
236 '[', |
|
237 ']', |
|
238 '-', |
|
239 '=', |
|
240 '/', |
|
241 '*', |
|
242 '-', |
|
243 '+', |
|
244 EKeyEnter, |
|
245 EKeyEnd, |
|
246 EKeyDownArrow, |
|
247 EKeyPageDown, |
|
248 EKeyLeftArrow, |
|
249 EKeyNull, // numeric keypad '5' |
|
250 EKeyRightArrow, |
|
251 EKeyHome, |
|
252 EKeyUpArrow, |
|
253 EKeyPageUp, |
|
254 EKeyInsert, |
|
255 EKeyDelete, |
|
256 EKeyMenu, |
|
257 EKeyBacklightOn, |
|
258 EKeyBacklightOff, |
|
259 EKeyBacklightToggle, |
|
260 EKeyIncContrast, |
|
261 EKeyDecContrast, |
|
262 EKeySliderDown, |
|
263 EKeySliderUp, |
|
264 EKeyDictaphonePlay, |
|
265 EKeyDictaphoneStop, |
|
266 EKeyDictaphoneRecord |
|
267 }; |
|
268 |
|
269 |
|
270 // |
|
271 // TO DO: (optional) |
|
272 // |
|
273 // caps-lock: this table traps those scanCodes which are affected by caps-lock |
|
274 // |
|
275 LOCAL_D const SScanCodeBlock scanCodeBlock_capsLock[]= |
|
276 { |
|
277 {'A', 'Z'} // only alpha keys are affected by caps-lock |
|
278 }; |
|
279 |
|
280 LOCAL_D const TUint16 convKeyCodes_capsLock[]= |
|
281 { |
|
282 'A', |
|
283 'B', |
|
284 'C', |
|
285 'D', |
|
286 'E', |
|
287 'F', |
|
288 'G', |
|
289 'H', |
|
290 'I', |
|
291 'J', |
|
292 'K', |
|
293 'L', |
|
294 'M', |
|
295 'N', |
|
296 'O', |
|
297 'P', |
|
298 'Q', |
|
299 'R', |
|
300 'S', |
|
301 'T', |
|
302 'U', |
|
303 'V', |
|
304 'W', |
|
305 'X', |
|
306 'Y', |
|
307 'Z' |
|
308 }; |
|
309 |
|
310 // |
|
311 // TO DO: (optional) |
|
312 // |
|
313 // shift: this table traps those scanCodes which are affected |
|
314 // by normal shift key EXCEPT for those scanCodes affected by caps-lock |
|
315 // |
|
316 |
|
317 LOCAL_D const SScanCodeBlock scanCodeBlock_shift[]= |
|
318 { |
|
319 {'0', '9'}, |
|
320 {EStdKeyXXX, EStdKeyEquals}, |
|
321 }; |
|
322 |
|
323 LOCAL_D const TUint16 convKeyCodes_shift[]= |
|
324 { |
|
325 ')', |
|
326 '!', |
|
327 '@',/*'"',*/ |
|
328 '#', /*ELatin1Pound,*/ |
|
329 '$', |
|
330 '%', |
|
331 '^', |
|
332 '&', |
|
333 '*', |
|
334 '(', |
|
335 '~', /*ELatin1LogicNot,*/ |
|
336 '<', |
|
337 '>', |
|
338 '?', |
|
339 '|', |
|
340 ':', |
|
341 '"', |
|
342 '|', /*'~',*/ |
|
343 '{', |
|
344 '}', |
|
345 '_', |
|
346 '+' |
|
347 }; |
|
348 |
|
349 // |
|
350 // TO DO: (optional) |
|
351 // |
|
352 // func: this table traps those scanCodes which are affected |
|
353 // by the func key but not shift |
|
354 // |
|
355 LOCAL_D const SScanCodeBlock scanCodeBlock_func[]= |
|
356 { |
|
357 {EStdKeyEscape, EStdKeyEscape}, |
|
358 {'M', 'M'}, |
|
359 {EStdKeyComma, EStdKeyComma}, |
|
360 {EStdKeyLeftArrow, EStdKeyDownArrow}, |
|
361 }; |
|
362 |
|
363 LOCAL_D const TUint16 convKeyCodes_func[]= |
|
364 { |
|
365 EKeyOff, |
|
366 EKeyDecContrast, |
|
367 EKeyIncContrast, |
|
368 EKeyHome, |
|
369 EKeyEnd, |
|
370 EKeyPageUp, |
|
371 EKeyPageDown, |
|
372 }; |
|
373 |
|
374 // |
|
375 // TO DO: (optional) |
|
376 // |
|
377 // func: this table traps those scanCodes which are affected |
|
378 // by func and shift - this is for func pressed, shift not pressed |
|
379 // |
|
380 //LOCAL_D const SScanCodeBlock scanCodeBlock_funcUnshifted[]= |
|
381 // { |
|
382 // {'E', 'E'}, |
|
383 // }; |
|
384 |
|
385 //LOCAL_D const TUint16 convKeyCodes_funcUnshifted[]= |
|
386 // { |
|
387 // ELatin1LcEacute, |
|
388 // }; |
|
389 |
|
390 // |
|
391 // TO DO: (optional) |
|
392 // |
|
393 // func: this table traps those scanCodes which are affected |
|
394 // by func and shift - this is for func and shift both pressed |
|
395 // |
|
396 //LOCAL_D const SScanCodeBlock scanCodeBlock_funcShifted[]= |
|
397 // { |
|
398 // {'E', 'E'}, |
|
399 // }; |
|
400 |
|
401 //LOCAL_D const TUint16 convKeyCodes_funcShifted[]= |
|
402 // { |
|
403 // ELatin1UcEacute, |
|
404 // }; |
|
405 |
|
406 // |
|
407 // TO DO: (optional) |
|
408 // |
|
409 // ctrl: this table traps those scanCodes which are affected by ctrl |
|
410 // |
|
411 LOCAL_D const SScanCodeBlock scanCodeBlock_ctrl[]= |
|
412 { |
|
413 // |
|
414 // NOTE: The space key gets handled elsewhere, otherwise it gets |
|
415 // thrown away as a NULL key |
|
416 // {EStdKeySpace, EStdKeySpace}, |
|
417 |
|
418 {'A', 'Z'}, |
|
419 {EStdKeyComma, EStdKeyComma}, |
|
420 }; |
|
421 |
|
422 LOCAL_D const TUint16 convKeyCodes_ctrl[]= |
|
423 { |
|
424 // 0, |
|
425 1, |
|
426 2, |
|
427 3, |
|
428 4, |
|
429 5, |
|
430 6, |
|
431 7, |
|
432 8, |
|
433 9, |
|
434 10, |
|
435 11, |
|
436 12, |
|
437 13, |
|
438 14, |
|
439 15, |
|
440 16, |
|
441 17, |
|
442 18, |
|
443 19, |
|
444 20, |
|
445 21, |
|
446 22, |
|
447 23, |
|
448 24, |
|
449 25, |
|
450 26, |
|
451 ',', |
|
452 }; |
|
453 |
|
454 |
|
455 |
|
456 // |
|
457 // TO DO: (optional) |
|
458 // |
|
459 // Each set of scancode+keycode tables must be grouped into a SConvSubTable. |
|
460 // The lines below define a number of SConvSubTables for each of the groups |
|
461 // above. |
|
462 // |
|
463 LOCAL_D const SConvSubTable |
|
464 convSubTable_unmodifiable= // table for unmodifiable keys |
|
465 { |
|
466 &convKeyCodes_unmodifiable[0], // the keycode table |
|
467 { |
|
468 ARRAY_LENGTH(scanCodeBlock_unmodifiable), // number of scancode blocks |
|
469 &scanCodeBlock_unmodifiable[0] // pointer to scancode blocks |
|
470 } |
|
471 }, |
|
472 convSubTable_base= // table for base keys |
|
473 { |
|
474 &convKeyCodes_base[0], // keycode table |
|
475 { |
|
476 ARRAY_LENGTH(scanCodeBlock_base), // number of scancode blocks |
|
477 &scanCodeBlock_base[0] // pointer to scancode blocks |
|
478 } |
|
479 }, |
|
480 convSubTable_capsLock= |
|
481 { |
|
482 &convKeyCodes_capsLock[0], |
|
483 { |
|
484 ARRAY_LENGTH(scanCodeBlock_capsLock), |
|
485 &scanCodeBlock_capsLock[0] |
|
486 } |
|
487 }, |
|
488 convSubTable_shift= |
|
489 { |
|
490 &convKeyCodes_shift[0], |
|
491 { |
|
492 ARRAY_LENGTH(scanCodeBlock_shift), |
|
493 &scanCodeBlock_shift[0] |
|
494 } |
|
495 }, |
|
496 convSubTable_func= |
|
497 { |
|
498 &convKeyCodes_func[0], |
|
499 { |
|
500 ARRAY_LENGTH(scanCodeBlock_func), |
|
501 &scanCodeBlock_func[0] |
|
502 } |
|
503 }, |
|
504 // convSubTable_funcUnshifted= |
|
505 // { |
|
506 // &convKeyCodes_funcUnshifted[0], |
|
507 // { |
|
508 // ARRAY_LENGTH(scanCodeBlock_funcUnshifted), |
|
509 // &scanCodeBlock_funcUnshifted[0] |
|
510 // } |
|
511 // }, |
|
512 // convSubTable_funcShifted= |
|
513 // { |
|
514 // &convKeyCodes_funcShifted[0], |
|
515 // { |
|
516 // ARRAY_LENGTH(scanCodeBlock_funcShifted), |
|
517 // &scanCodeBlock_funcShifted[0] |
|
518 // } |
|
519 // }, |
|
520 convSubTable_ctrl= |
|
521 { |
|
522 &convKeyCodes_ctrl[0], |
|
523 { |
|
524 ARRAY_LENGTH(scanCodeBlock_ctrl), |
|
525 &scanCodeBlock_ctrl[0] |
|
526 } |
|
527 }; |
|
528 |
|
529 // |
|
530 // TO DO: (optional) |
|
531 // |
|
532 // We need to declare arrays of SConvSubTable for each modifier state we |
|
533 // are going to handle. As mentioned above, it is possible to have several |
|
534 // [keycode table, scancode blocks] groups scanned for each keyboard state. |
|
535 // |
|
536 // Some modifier states use more than one conversion group. The simple example |
|
537 // is handling of caps-lock and shift. |
|
538 // |
|
539 // Caps-lock means all letters are upper-case |
|
540 // shift means all letters are upper case AND some other keys return control characters |
|
541 // |
|
542 // Obviously the shift key means everything cpas-lock means PLUS a bit more. So |
|
543 // we define two tables, the caps-lock table defines only the uppercase conversion, |
|
544 // and the shift table defines all OTHER shifted keys not already handled by |
|
545 // caps-lock. The caps-lock modifier state then only scans the caps-lock table, and |
|
546 // the shift state scans both tables. |
|
547 // |
|
548 LOCAL_D const SConvSubTable |
|
549 * const convSubTableArray_unmodifiable[]={&convSubTable_unmodifiable}, |
|
550 * const convSubTableArray_base[]={&convSubTable_base}, |
|
551 |
|
552 // |
|
553 // The caps-lock state scans only the caps-lock table, to handle |
|
554 // conversion to upper case |
|
555 // |
|
556 * const convSubTableArray_capsLock[]={&convSubTable_capsLock}, |
|
557 // |
|
558 // The shift table scans the caps-lock table to handle upper case, |
|
559 // and also the shift table which handles some keys that are not affected |
|
560 // by caps lock (such as 0-9). |
|
561 // |
|
562 * const convSubTableArray_shift[]={&convSubTable_capsLock, &convSubTable_shift}, |
|
563 // |
|
564 // Pressing shift with caps-lock active reverts to lower-case letters, |
|
565 // but other keys remain shifted. This time we only scan the shift table |
|
566 // so only the non-alpha keys will be shifted |
|
567 // |
|
568 * const convSubTableArray_capsLockShift[]={&convSubTable_shift}, |
|
569 |
|
570 // |
|
571 // Like the shift/caps-lock situation, the function key has two states, |
|
572 // shifted and unshifted. Also, some keys may be independant of whether |
|
573 // the shift key is pressed. So there are three tables defined. One declares |
|
574 // all keys that are independant of shift state, the other two tables handle |
|
575 // shifted and unshifted func. |
|
576 // |
|
577 // Unshifted func uses the independant set + funcUnshifted |
|
578 // |
|
579 // * const convSubTableArray_func[]={&convSubTable_func, &convSubTable_funcUnshifted}, |
|
580 * const convSubTableArray_func[]={&convSubTable_func}, |
|
581 // |
|
582 // Shifted func uses the independant set + funcShifted |
|
583 // |
|
584 // * const convSubTableArray_funcShift[]={&convSubTable_func,&convSubTable_funcShifted}, |
|
585 // |
|
586 // This keyboard table makes control independant of func and shift |
|
587 // |
|
588 * const convSubTableArray_ctrl[]={&convSubTable_ctrl}; |
|
589 |
|
590 // |
|
591 // TO DO: (optional) |
|
592 // |
|
593 // This is the top of the scancode conversion tree. It is a set of pointers |
|
594 // to the SConvSubTable arrays declared above. |
|
595 // |
|
596 // The order of these nodes is VITAL, as the scanCode/modifiers are |
|
597 // searched for a match in this order |
|
598 // |
|
599 // The modifier state is matched by using a mask and a compare value. This is |
|
600 // used as follows: |
|
601 // |
|
602 // match is true if ( (modifierState & mask) == compareValue |
|
603 // |
|
604 // For example, if the mask is (EModifierFunc|EModifierShift) and the |
|
605 // compare value is EModifierFunc, this will match ANY combination of |
|
606 // modifiers that has func pressed and shift not pressed |
|
607 // |
|
608 LOCAL_D const SConvTableNode convTableNodes[]= |
|
609 { |
|
610 { |
|
611 { |
|
612 0, // modifier mask = no modifiers |
|
613 0 // modifier compare = no modifiers |
|
614 }, |
|
615 ARRAY_LENGTH(convSubTableArray_unmodifiable), // number of SConvSubTables |
|
616 &convSubTableArray_unmodifiable[0] // pointer to SConvSubTable array |
|
617 }, |
|
618 { |
|
619 { |
|
620 EModifierCtrl, // modifier mask = check for ctrl |
|
621 EModifierCtrl // modifier compare = anything with ctrl pressed |
|
622 }, |
|
623 ARRAY_LENGTH(convSubTableArray_ctrl), |
|
624 &convSubTableArray_ctrl[0] |
|
625 }, |
|
626 { |
|
627 { |
|
628 // |
|
629 // Check for Func pressed |
|
630 // |
|
631 EModifierFunc, |
|
632 EModifierFunc |
|
633 }, |
|
634 ARRAY_LENGTH(convSubTableArray_func), |
|
635 &convSubTableArray_func[0] |
|
636 }, |
|
637 { |
|
638 { |
|
639 // |
|
640 // Check for caps-lock pressed, shift not pressed |
|
641 // |
|
642 EModifierCapsLock|EModifierShift, |
|
643 EModifierCapsLock |
|
644 }, |
|
645 ARRAY_LENGTH(convSubTableArray_capsLock), |
|
646 &convSubTableArray_capsLock[0] |
|
647 }, |
|
648 { |
|
649 { |
|
650 // |
|
651 // Check for caps-lock not pressed, shift pressed |
|
652 // |
|
653 EModifierShift|EModifierCapsLock, |
|
654 EModifierShift |
|
655 }, |
|
656 ARRAY_LENGTH(convSubTableArray_shift), |
|
657 &convSubTableArray_shift[0] |
|
658 }, |
|
659 { |
|
660 { |
|
661 // |
|
662 // Check for caps-lock pressed, shift pressed |
|
663 // |
|
664 EModifierCapsLock|EModifierShift, |
|
665 EModifierCapsLock|EModifierShift |
|
666 }, |
|
667 ARRAY_LENGTH(convSubTableArray_capsLockShift), |
|
668 &convSubTableArray_capsLockShift[0] |
|
669 }, |
|
670 { |
|
671 // |
|
672 // This is the base table. It must appear last so that it can |
|
673 // provide a default conversion for any scancodes that are not |
|
674 // handled by any of the tables above |
|
675 // |
|
676 { |
|
677 0, |
|
678 0 |
|
679 }, |
|
680 ARRAY_LENGTH(convSubTableArray_base), |
|
681 &convSubTableArray_base[0] |
|
682 } |
|
683 }; |
|
684 |
|
685 // |
|
686 // The top-level exported data structure of all the conversion tables |
|
687 // This just points to the SConvTableNodes above |
|
688 // |
|
689 LOCAL_D const SConvTable ConvTable= |
|
690 { |
|
691 ARRAY_LENGTH(convTableNodes), |
|
692 &convTableNodes[0] |
|
693 }; |
|
694 |
|
695 // The list of scan-codes on the numeric keypad |
|
696 LOCAL_D const SScanCodeBlock keypadScanCodeBlockArray[]= |
|
697 { |
|
698 {EStdKeyNumLock, EStdKeyNumLock}, |
|
699 {EStdKeyNkpForwardSlash, EStdKeyNkpFullStop} |
|
700 }; |
|
701 |
|
702 LOCAL_D const SScanCodeBlockList ConvTableKeypadScanCodes= |
|
703 { |
|
704 ARRAY_LENGTH(keypadScanCodeBlockArray), |
|
705 &keypadScanCodeBlockArray[0] |
|
706 }; |
|
707 |
|
708 // |
|
709 // TO DO: (optional) |
|
710 // |
|
711 // List of keycodes that do not autorepeat |
|
712 // |
|
713 // These are usually control keys like shift, ctrl, escape |
|
714 // |
|
715 LOCAL_D const TUint16 nonAutorepKeyCodeArray[]= |
|
716 { |
|
717 EKeyEscape, |
|
718 EKeyPrintScreen, |
|
719 EKeyPause, |
|
720 EKeyInsert, |
|
721 EKeyLeftShift, |
|
722 EKeyRightShift, |
|
723 EKeyLeftAlt, |
|
724 EKeyRightAlt, |
|
725 EKeyLeftCtrl, |
|
726 EKeyRightCtrl, |
|
727 EKeyLeftFunc, |
|
728 EKeyRightFunc, |
|
729 EKeyCapsLock, |
|
730 EKeyNumLock, |
|
731 EKeyScrollLock, |
|
732 EKeyMenu, |
|
733 EKeyDictaphonePlay, |
|
734 EKeyDictaphoneStop, |
|
735 EKeyDictaphoneRecord |
|
736 }; |
|
737 |
|
738 // |
|
739 // TO DO: (optional) |
|
740 // |
|
741 // Declare blocks of non-autorepeating keycodes |
|
742 // |
|
743 LOCAL_D const SKeyCodeList ConvTableNonAutorepKeyCodes= |
|
744 { |
|
745 ARRAY_LENGTH(nonAutorepKeyCodeArray), // number of keycode arrays |
|
746 &nonAutorepKeyCodeArray[0] // pointer to arrays |
|
747 }; |
|
748 |
|
749 |
|
750 |
|
751 |
|
752 |
|
753 |
|
754 ///////////////////////////////////////////////////////////////////// |
|
755 // Keyboard state tables |
|
756 // |
|
757 |
|
758 // What these tables do |
|
759 // -------------------- |
|
760 // |
|
761 // These tables control the way "special" keystrokes modify the behaviour |
|
762 // of the keyboard. There are two major uses for this: |
|
763 // |
|
764 // - handling modifier keys e.g. caps-lock, shift, alt, fn and defining |
|
765 // what modifier flags are affected by these keypresses |
|
766 // |
|
767 // - switching the keyboard into special states (see below) |
|
768 // |
|
769 // Keyboard states |
|
770 // --------------- |
|
771 // |
|
772 // Keyboard states are used to switch the keyboard into a special mode where it |
|
773 // can be used to enter unusual characters. There are two uses for this: |
|
774 // |
|
775 // - entering numeric codes, by pressing ctrl and typing the decimal code |
|
776 // - entering accented characters by pressing a key combination which |
|
777 // enters "accented mode" then pressing a key. There can be multiple |
|
778 // accented modes. |
|
779 // |
|
780 // You can see an example of accented modes on a Psion Series 5 by |
|
781 // pressing Fn+Z, followed by A - this will produce an a with an umlaut (ä) |
|
782 // |
|
783 // These tables are also used to select simpler states such as caps-lock |
|
784 // and num-lock. |
|
785 // |
|
786 // |
|
787 // The main data structure is a SFuncTableEntry. Each of these contains |
|
788 // three fields: |
|
789 // |
|
790 // 1. modifier match - this works the same way as the scancode conversion |
|
791 // tables above, there is a mask and a compare value |
|
792 // |
|
793 // 2. a keycode patters - this is used to match with the keycode or keycodes |
|
794 // that the state should respond to. This is a TKeyCodePattern structure |
|
795 // which defines what sort of match should be performed. |
|
796 // |
|
797 // 3. a function and state change structure, SFuncAndState. This defines the |
|
798 // state to change to, the function to perform, and a parameter for the |
|
799 // function if required. |
|
800 // |
|
801 // TKeyCodePattern structures have two fields. The first is a keycode value |
|
802 // and is only used for some match types. The second field select the type |
|
803 // of match to perform: |
|
804 // |
|
805 // EAnyKey - match any key |
|
806 // EAnyAlphaNumeric - match any alpha or numeric key |
|
807 // EAnyAlpha - match any alpha key |
|
808 // EAnyAlphaLowerCase - match any lower-case key |
|
809 // EAnyAlphaUpperCase - match any upper-case key |
|
810 // EAnyDecimalDigit - match any decimal digit |
|
811 // EAnyModifierKey - match any modifier key (e.g. alt, fn, ctrl) |
|
812 // EMatchKey - match if equal to keycode value in first field |
|
813 // EMatchLeftOrRight - match if equal to keycode value or (keycode value + 1) |
|
814 // EMatchKeyCaseInsens - like EMatchKey but perform case-insensitive comparison |
|
815 // |
|
816 // |
|
817 |
|
818 // the "array" parameter must be a true array and not a pointer |
|
819 #define ARRAY_LENGTH(array) (sizeof(array)/sizeof(array[0])) |
|
820 |
|
821 #define TABLE_ENTRY_ANOTHER_CTRL_DIGIT \ |
|
822 { \ |
|
823 { \ |
|
824 EModifierKeyUp|EModifierFunc, \ |
|
825 0 \ |
|
826 }, \ |
|
827 { \ |
|
828 EKeyNull, \ |
|
829 EAnyDigitGivenRadix \ |
|
830 }, \ |
|
831 { \ |
|
832 EStateCtrlDigits, \ |
|
833 EAddOnCtrlDigit, \ |
|
834 0 \ |
|
835 } \ |
|
836 } |
|
837 |
|
838 // |
|
839 // TO DO: (optional) |
|
840 // |
|
841 // This table is searched for a match if a match has not been |
|
842 // found in the current state's table |
|
843 // |
|
844 |
|
845 LOCAL_D const SFuncTableEntry defaultTable[]= |
|
846 { |
|
847 { |
|
848 // |
|
849 // prevent key up events generating keycodes |
|
850 // |
|
851 { |
|
852 EModifierKeyUp, // mask = key up |
|
853 EModifierKeyUp // match = key up - i.e. accept any key up event |
|
854 }, |
|
855 { |
|
856 EKeyNull, // dummy value, not used |
|
857 EAnyKey // accept any key |
|
858 }, |
|
859 { |
|
860 EStateUnchanged, // state will not change |
|
861 EDoNothing, // no action to perform |
|
862 0 |
|
863 } |
|
864 }, |
|
865 { |
|
866 // |
|
867 // prevent any modifier key (e.g. shift, ctrl) from changing state |
|
868 // |
|
869 { |
|
870 0, // match any modifier state |
|
871 0 |
|
872 }, |
|
873 { |
|
874 EKeyNull, // dummy value |
|
875 EAnyModifierKey // match any modifier key |
|
876 }, |
|
877 { |
|
878 EStateUnchanged, // don't change state |
|
879 EDoNothing, // nothing to do |
|
880 0 |
|
881 } |
|
882 }, |
|
883 { |
|
884 // |
|
885 // filter out any unprocessed codes |
|
886 // |
|
887 { |
|
888 0, // match any modifier state |
|
889 0 |
|
890 }, |
|
891 { |
|
892 EKeyNull, // dummy value |
|
893 EAnyKey // match any key |
|
894 }, |
|
895 { |
|
896 EStateNormal, // switch back to normal keyboard state |
|
897 EDoNothing, // nothing to do |
|
898 0 |
|
899 } |
|
900 } |
|
901 }; |
|
902 |
|
903 // |
|
904 // TO DO: (optional) |
|
905 // |
|
906 // This table controls which keys change which modifiers; |
|
907 // NOTE: the state field in this table is ignored |
|
908 // |
|
909 |
|
910 LOCAL_D const SFuncTableEntry modifierTable[]= |
|
911 { |
|
912 { |
|
913 { |
|
914 EModifierKeyUp, // check key-up modifier flag |
|
915 0 // make sure it's zero (i.e. ignore key-up events) |
|
916 }, |
|
917 { |
|
918 // |
|
919 // Here we want to match only the caps-lock key. We specify the |
|
920 // keycode we are looking for in the first field, and EMatchKey |
|
921 // in the second field |
|
922 // |
|
923 EKeyCapsLock, // we want to respond to caps-lock key |
|
924 EMatchKey // match caps-lock only |
|
925 }, |
|
926 { |
|
927 EStateUnchanged, // ignored |
|
928 EToggleModifier, // function = toggle modifier state |
|
929 EModifierCapsLock // this is the modifier to toggle |
|
930 } |
|
931 }, |
|
932 { |
|
933 { |
|
934 EModifierKeyUp, |
|
935 0 |
|
936 }, |
|
937 { |
|
938 EKeyNumLock, // this one matched num-lock |
|
939 EMatchKey // match only num-lock |
|
940 }, |
|
941 { |
|
942 EStateUnchanged, // ignored |
|
943 EToggleModifier, // function = toggle modifier state |
|
944 EModifierNumLock // this is the modifier to toggle |
|
945 } |
|
946 }, |
|
947 { |
|
948 { |
|
949 EModifierKeyUp, |
|
950 0 |
|
951 }, |
|
952 { |
|
953 EKeyScrollLock, // match scroll-lock key |
|
954 EMatchKey |
|
955 }, |
|
956 { |
|
957 EStateUnchanged, |
|
958 EToggleModifier, // function = toggle modifier |
|
959 EModifierScrollLock // modifier to toggle |
|
960 } |
|
961 }, |
|
962 { |
|
963 { |
|
964 EModifierKeyUp, |
|
965 0 |
|
966 }, |
|
967 { |
|
968 EKeyLeftAlt, // match left alt key |
|
969 EMatchKey |
|
970 }, |
|
971 { |
|
972 EStateUnchanged, // ignored |
|
973 ETurnOnModifier, // function = turn on a modifier |
|
974 EModifierAlt|EModifierLeftAlt // alt turns on this modifier combination |
|
975 } |
|
976 }, |
|
977 { |
|
978 { |
|
979 EModifierKeyUp, // goes with previous table, this handles the alt |
|
980 EModifierKeyUp // key being released |
|
981 }, |
|
982 { |
|
983 EKeyLeftAlt, // match left alt key again |
|
984 EMatchKey |
|
985 }, |
|
986 { |
|
987 EStateUnchanged, |
|
988 ETurnOffModifier, // function = turn off the modifier |
|
989 EModifierLeftAlt // modifier to turn off |
|
990 } |
|
991 }, |
|
992 { |
|
993 { |
|
994 EModifierKeyUp, // key down event (key-up flag == 0) |
|
995 0 |
|
996 }, |
|
997 { |
|
998 EKeyLeftFunc, // match left fn key |
|
999 EMatchKey |
|
1000 }, |
|
1001 { |
|
1002 EStateUnchanged, // ignored |
|
1003 ETurnOnModifier, // function = turn on modifier |
|
1004 EModifierFunc|EModifierLeftFunc // modifier combination to turn on |
|
1005 } |
|
1006 }, |
|
1007 { |
|
1008 { |
|
1009 EModifierKeyUp, // goes with above table, this matched the |
|
1010 EModifierKeyUp // left-fn key up event |
|
1011 }, |
|
1012 { |
|
1013 EKeyLeftFunc, // match left fn key |
|
1014 EMatchKey |
|
1015 }, |
|
1016 { |
|
1017 EStateUnchanged, // ignored |
|
1018 ETurnOffModifier, // function = turn off modifier |
|
1019 EModifierLeftFunc // modifier to turn off |
|
1020 } |
|
1021 }, |
|
1022 { |
|
1023 { |
|
1024 EModifierKeyUp, // key down event (key-up flag == 0) |
|
1025 0 |
|
1026 }, |
|
1027 { |
|
1028 EKeyLeftShift, // match left shift key |
|
1029 EMatchKey |
|
1030 }, |
|
1031 { |
|
1032 EStateUnchanged, // ignored |
|
1033 ETurnOnModifier, // function = turn on modifier |
|
1034 EModifierShift|EModifierLeftShift // modifier combination to turn on |
|
1035 } |
|
1036 }, |
|
1037 { |
|
1038 { |
|
1039 EModifierKeyUp, // goes with above table, matches left shift |
|
1040 EModifierKeyUp // key up event |
|
1041 }, |
|
1042 { |
|
1043 EKeyLeftShift, // match left shift key |
|
1044 EMatchKey |
|
1045 }, |
|
1046 { |
|
1047 EStateUnchanged, // ignored |
|
1048 ETurnOffModifier, // turn off modifier |
|
1049 EModifierLeftShift // modifier to turn off |
|
1050 } |
|
1051 }, |
|
1052 { |
|
1053 { |
|
1054 EModifierKeyUp, // key down event (key-up flag == 0) |
|
1055 0 |
|
1056 }, |
|
1057 { |
|
1058 EKeyLeftCtrl, // match left ctrl key |
|
1059 EMatchKey |
|
1060 }, |
|
1061 { |
|
1062 EStateUnchanged, // ignored |
|
1063 ETurnOnModifier, // function = turn on modifier |
|
1064 EModifierCtrl|EModifierLeftCtrl // modifier combination to turn on |
|
1065 } |
|
1066 }, |
|
1067 { |
|
1068 { |
|
1069 EModifierKeyUp, // goes with above table, matches left ctrl |
|
1070 EModifierKeyUp // key up event |
|
1071 }, |
|
1072 { |
|
1073 EKeyLeftCtrl, // match left ctrl key |
|
1074 EMatchKey |
|
1075 }, |
|
1076 { |
|
1077 EStateUnchanged, // ignored |
|
1078 ETurnOffModifier, // function = turn off modifier |
|
1079 EModifierLeftCtrl // modifier to turn off |
|
1080 } |
|
1081 }, |
|
1082 { |
|
1083 { |
|
1084 EModifierKeyUp, // key down event (key-up flag == 0) |
|
1085 0 |
|
1086 }, |
|
1087 { |
|
1088 EKeyRightAlt, // match right alt key |
|
1089 EMatchKey |
|
1090 }, |
|
1091 { |
|
1092 EStateUnchanged, // ignored |
|
1093 ETurnOnModifier, // function = turn on modifier |
|
1094 EModifierAlt|EModifierRightAlt // modifier combination to turn on |
|
1095 } |
|
1096 }, |
|
1097 { |
|
1098 { |
|
1099 EModifierKeyUp, // goes with above table, matches right alt |
|
1100 EModifierKeyUp // key up event |
|
1101 }, |
|
1102 { |
|
1103 EKeyRightAlt, // match right alt key |
|
1104 EMatchKey |
|
1105 }, |
|
1106 { |
|
1107 EStateUnchanged, // ignored |
|
1108 ETurnOffModifier, // function = turn off modifier |
|
1109 EModifierRightAlt // modifier to turn off |
|
1110 } |
|
1111 }, |
|
1112 { |
|
1113 { |
|
1114 EModifierKeyUp, // key down event (key-up flag == 0) |
|
1115 0 |
|
1116 }, |
|
1117 { |
|
1118 EKeyRightFunc, // match right fn key |
|
1119 EMatchKey |
|
1120 }, |
|
1121 { |
|
1122 EStateUnchanged, // ignored |
|
1123 ETurnOnModifier, // function = turn on modifier |
|
1124 EModifierFunc|EModifierRightFunc // modifier combination to turn on |
|
1125 } |
|
1126 }, |
|
1127 { |
|
1128 { |
|
1129 EModifierKeyUp, // goes with above table, matches right fn |
|
1130 EModifierKeyUp // key up event |
|
1131 }, |
|
1132 { |
|
1133 EKeyRightFunc, // match right fn key |
|
1134 EMatchKey |
|
1135 }, |
|
1136 { |
|
1137 EStateUnchanged, // ignored |
|
1138 ETurnOffModifier, // function = turn off modifier |
|
1139 EModifierRightFunc // modifier to turn off |
|
1140 } |
|
1141 }, |
|
1142 { |
|
1143 { |
|
1144 EModifierKeyUp, // key down event (key-up flag == 0) |
|
1145 0 |
|
1146 }, |
|
1147 { |
|
1148 EKeyRightShift, // match right shift key |
|
1149 EMatchKey |
|
1150 }, |
|
1151 { |
|
1152 EStateUnchanged, // ignored |
|
1153 ETurnOnModifier, // function = turn on modifier |
|
1154 EModifierShift|EModifierRightShift // modifier combinatoin to turn on |
|
1155 } |
|
1156 }, |
|
1157 { |
|
1158 { |
|
1159 EModifierKeyUp, // goes with above table, handles right shift |
|
1160 EModifierKeyUp // key up event |
|
1161 }, |
|
1162 { |
|
1163 EKeyRightShift, // match right shift key |
|
1164 EMatchKey |
|
1165 }, |
|
1166 { |
|
1167 EStateUnchanged, // ignored |
|
1168 ETurnOffModifier, // function = turn off modifier |
|
1169 EModifierRightShift // modifier to turn off |
|
1170 } |
|
1171 }, |
|
1172 { |
|
1173 { |
|
1174 EModifierKeyUp, // key down event (key-up flag == 0) |
|
1175 0 |
|
1176 }, |
|
1177 { |
|
1178 EKeyRightCtrl, // match right ctrl key |
|
1179 EMatchKey |
|
1180 }, |
|
1181 { |
|
1182 EStateUnchanged, // ignored |
|
1183 ETurnOnModifier, // function = turn on modifier |
|
1184 EModifierCtrl|EModifierRightCtrl // modifier combination to turn on |
|
1185 } |
|
1186 }, |
|
1187 { |
|
1188 { |
|
1189 EModifierKeyUp, // goes with above table, matched right ctrl |
|
1190 EModifierKeyUp // key up event |
|
1191 }, |
|
1192 { |
|
1193 EKeyRightCtrl, // match right ctrl key |
|
1194 EMatchKey |
|
1195 }, |
|
1196 { |
|
1197 EStateUnchanged, // ignored |
|
1198 ETurnOffModifier, // function = turn off modifier |
|
1199 EModifierRightCtrl // modifier to turn off |
|
1200 } |
|
1201 } |
|
1202 }; |
|
1203 |
|
1204 |
|
1205 // |
|
1206 // TO DO: (optional) |
|
1207 // |
|
1208 // Tables corresponding to keyboard states. |
|
1209 // |
|
1210 // There are 13 keyboard states. States 0 to 9 can be used to create alternative |
|
1211 // keyboard layouts for entering accented or unusual characters. Switching into |
|
1212 // these states is done by a keypress. Implementation of the states is optional |
|
1213 // depending on how many special state you want - you may implement 10 states, |
|
1214 // you might decide not to implement any. |
|
1215 // |
|
1216 // State 10 is the normal state. The table for state 10 defines which keypresses |
|
1217 // change to other states. |
|
1218 // |
|
1219 // States 11 and 12 are used when entering the numeric code of a character. State |
|
1220 // 11 is for entering a specific number of digits. State 12 is for accepting |
|
1221 // digits until Ctrl is released. |
|
1222 // |
|
1223 // |
|
1224 // As before, each SFuncTableEntry entry defines: |
|
1225 // - modifier conditions that must be matched |
|
1226 // - a keycode match pattern (typically an exact key match) |
|
1227 // - the function to perform and new state |
|
1228 // |
|
1229 // Switching into states 0..9,11,12 is done by entries in table10 |
|
1230 // |
|
1231 |
|
1232 //LOCAL_D const SFuncTableEntry table0[]= |
|
1233 // { |
|
1234 // TABLE_ENTRY_ANOTHER_CTRL_DIGIT |
|
1235 // }; |
|
1236 |
|
1237 LOCAL_D const SFuncTableEntry table1[]= |
|
1238 { |
|
1239 // |
|
1240 // Table for special keyboard state 1 |
|
1241 // This state is entered by pressing Fn+q (see table10) |
|
1242 // |
|
1243 // The table makes certain keys return accented characters |
|
1244 // |
|
1245 { |
|
1246 { |
|
1247 // |
|
1248 // Function must be release, and this must be a key down event |
|
1249 // |
|
1250 EModifierFunc|EModifierKeyUp, |
|
1251 0 |
|
1252 }, |
|
1253 { |
|
1254 // |
|
1255 // match an 'e' keypress, convert to an ae ligature (æ) |
|
1256 // |
|
1257 'e', |
|
1258 EMatchKeyCaseInsens |
|
1259 }, |
|
1260 { |
|
1261 EStateNormal, // switch back to state normal (table10) |
|
1262 EPassSpecialKeyThru, // turn keypress into a special character |
|
1263 ELatin1LcAe // this is the character to pass on |
|
1264 } |
|
1265 }, |
|
1266 { |
|
1267 { |
|
1268 EModifierFunc|EModifierKeyUp, |
|
1269 0 |
|
1270 }, |
|
1271 { |
|
1272 'c', |
|
1273 EMatchKeyCaseInsens |
|
1274 }, |
|
1275 { |
|
1276 EStateNormal, |
|
1277 EPassSpecialKeyThru, |
|
1278 ELatin1LcCcedilla |
|
1279 } |
|
1280 }, |
|
1281 { |
|
1282 { |
|
1283 EModifierFunc|EModifierKeyUp, |
|
1284 0 |
|
1285 }, |
|
1286 { |
|
1287 's', |
|
1288 EMatchKeyCaseInsens |
|
1289 }, |
|
1290 { |
|
1291 EStateNormal, |
|
1292 EPassSpecialKeyThru, |
|
1293 ELatin1EsTset |
|
1294 } |
|
1295 }, |
|
1296 { |
|
1297 { |
|
1298 EModifierFunc|EModifierKeyUp, |
|
1299 0 |
|
1300 }, |
|
1301 { |
|
1302 'o', |
|
1303 EMatchKeyCaseInsens |
|
1304 }, |
|
1305 { |
|
1306 EStateNormal, |
|
1307 EPassSpecialKeyThru, |
|
1308 ELatin1LcOslash |
|
1309 } |
|
1310 }, |
|
1311 { |
|
1312 { |
|
1313 EModifierFunc|EModifierKeyUp, |
|
1314 0 |
|
1315 }, |
|
1316 { |
|
1317 'd', |
|
1318 EMatchKeyCaseInsens |
|
1319 }, |
|
1320 { |
|
1321 EStateNormal, |
|
1322 EPassSpecialKeyThru, |
|
1323 ELatin1LcThorn |
|
1324 } |
|
1325 }, |
|
1326 { |
|
1327 { |
|
1328 EModifierFunc|EModifierKeyUp, |
|
1329 0 |
|
1330 }, |
|
1331 { |
|
1332 't', |
|
1333 EMatchKeyCaseInsens |
|
1334 }, |
|
1335 { |
|
1336 EStateNormal, |
|
1337 EPassSpecialKeyThru, |
|
1338 ELatin1LcSoftTh |
|
1339 } |
|
1340 }, |
|
1341 { |
|
1342 { |
|
1343 EModifierFunc|EModifierKeyUp, |
|
1344 0 |
|
1345 }, |
|
1346 { |
|
1347 'l', |
|
1348 EMatchKeyCaseInsens |
|
1349 }, |
|
1350 { |
|
1351 EStateNormal, |
|
1352 EPassSpecialKeyThru, |
|
1353 ELatin1LeftChevron |
|
1354 } |
|
1355 }, |
|
1356 { |
|
1357 { |
|
1358 EModifierFunc|EModifierKeyUp, |
|
1359 0 |
|
1360 }, |
|
1361 { |
|
1362 'r', |
|
1363 EMatchKeyCaseInsens |
|
1364 }, |
|
1365 { |
|
1366 EStateNormal, |
|
1367 EPassSpecialKeyThru, |
|
1368 ELatin1RightChevron |
|
1369 } |
|
1370 }, |
|
1371 { |
|
1372 { |
|
1373 EModifierFunc|EModifierKeyUp, |
|
1374 0 |
|
1375 }, |
|
1376 { |
|
1377 'x', |
|
1378 EMatchKeyCaseInsens |
|
1379 }, |
|
1380 { |
|
1381 EStateNormal, |
|
1382 EPassSpecialKeyThru, |
|
1383 ELatin1InvExclam |
|
1384 } |
|
1385 }, |
|
1386 { |
|
1387 { |
|
1388 EModifierFunc|EModifierKeyUp, |
|
1389 0 |
|
1390 }, |
|
1391 { |
|
1392 'q', |
|
1393 EMatchKeyCaseInsens |
|
1394 }, |
|
1395 { |
|
1396 EStateNormal, |
|
1397 EPassSpecialKeyThru, |
|
1398 ELatin1InvQuest |
|
1399 } |
|
1400 }, |
|
1401 { |
|
1402 { |
|
1403 EModifierFunc|EModifierKeyUp, |
|
1404 0 |
|
1405 }, |
|
1406 { |
|
1407 'a', |
|
1408 EMatchKeyCaseInsens |
|
1409 }, |
|
1410 { |
|
1411 EStateNormal, |
|
1412 EPassSpecialKeyThru, |
|
1413 ELatin1LcAo |
|
1414 } |
|
1415 }, |
|
1416 { |
|
1417 { |
|
1418 EModifierFunc|EModifierKeyUp, |
|
1419 0 |
|
1420 }, |
|
1421 { |
|
1422 'p', |
|
1423 EMatchKeyCaseInsens |
|
1424 }, |
|
1425 { |
|
1426 EStateNormal, |
|
1427 EPassSpecialKeyThru, |
|
1428 ELatin1Pound |
|
1429 } |
|
1430 }, |
|
1431 TABLE_ENTRY_ANOTHER_CTRL_DIGIT |
|
1432 }; |
|
1433 |
|
1434 LOCAL_D const SFuncTableEntry table2[]= |
|
1435 { |
|
1436 // |
|
1437 // Table for special keyboard state 2 |
|
1438 // This state is entered by pressing Fn+z (see table10) |
|
1439 // |
|
1440 // The table makes certain keys return accented characters |
|
1441 // See table1 for an explanation of the contents |
|
1442 // |
|
1443 { |
|
1444 { |
|
1445 EModifierFunc|EModifierKeyUp, |
|
1446 0 |
|
1447 }, |
|
1448 { |
|
1449 'a', |
|
1450 EMatchKeyCaseInsens |
|
1451 }, |
|
1452 { |
|
1453 EStateNormal, |
|
1454 EPassSpecialKeyThru, |
|
1455 ELatin1LcAumlaut |
|
1456 } |
|
1457 }, |
|
1458 { |
|
1459 { |
|
1460 EModifierFunc|EModifierKeyUp, |
|
1461 0 |
|
1462 }, |
|
1463 { |
|
1464 'e', |
|
1465 EMatchKeyCaseInsens |
|
1466 }, |
|
1467 { |
|
1468 EStateNormal, |
|
1469 EPassSpecialKeyThru, |
|
1470 ELatin1LcEumlaut |
|
1471 } |
|
1472 }, |
|
1473 { |
|
1474 { |
|
1475 EModifierFunc|EModifierKeyUp, |
|
1476 0 |
|
1477 }, |
|
1478 { |
|
1479 'i', |
|
1480 EMatchKeyCaseInsens |
|
1481 }, |
|
1482 { |
|
1483 EStateNormal, |
|
1484 EPassSpecialKeyThru, |
|
1485 ELatin1LcIumlaut |
|
1486 } |
|
1487 }, |
|
1488 { |
|
1489 { |
|
1490 EModifierFunc|EModifierKeyUp, |
|
1491 0 |
|
1492 }, |
|
1493 { |
|
1494 'o', |
|
1495 EMatchKeyCaseInsens |
|
1496 }, |
|
1497 { |
|
1498 EStateNormal, |
|
1499 EPassSpecialKeyThru, |
|
1500 ELatin1LcOumlaut |
|
1501 } |
|
1502 }, |
|
1503 { |
|
1504 { |
|
1505 EModifierFunc|EModifierKeyUp, |
|
1506 0 |
|
1507 }, |
|
1508 { |
|
1509 'u', |
|
1510 EMatchKeyCaseInsens |
|
1511 }, |
|
1512 { |
|
1513 EStateNormal, |
|
1514 EPassSpecialKeyThru, |
|
1515 ELatin1LcUumlaut |
|
1516 } |
|
1517 }, |
|
1518 { |
|
1519 { |
|
1520 EModifierFunc|EModifierKeyUp, |
|
1521 0 |
|
1522 }, |
|
1523 { |
|
1524 'y', |
|
1525 EMatchKeyCaseInsens |
|
1526 }, |
|
1527 { |
|
1528 EStateNormal, |
|
1529 EPassSpecialKeyThru, |
|
1530 ELatin1LcYumlaut |
|
1531 } |
|
1532 }, |
|
1533 { |
|
1534 { |
|
1535 EModifierFunc|EModifierKeyUp, |
|
1536 0 |
|
1537 }, |
|
1538 { |
|
1539 ' ', |
|
1540 EMatchKey |
|
1541 }, |
|
1542 { |
|
1543 EStateNormal, |
|
1544 EPassSpecialKeyThru, |
|
1545 ELatin1SpaceUmlaut |
|
1546 } |
|
1547 }, |
|
1548 TABLE_ENTRY_ANOTHER_CTRL_DIGIT |
|
1549 }; |
|
1550 |
|
1551 LOCAL_D const SFuncTableEntry table3[]= |
|
1552 { |
|
1553 // |
|
1554 // Table for special keyboard state 3 |
|
1555 // This state is entered by pressing Fn+x (see table10) |
|
1556 // |
|
1557 // The table makes certain keys return accented characters |
|
1558 // |
|
1559 { |
|
1560 { |
|
1561 EModifierFunc|EModifierKeyUp, |
|
1562 0 |
|
1563 }, |
|
1564 { |
|
1565 'a', |
|
1566 EMatchKeyCaseInsens |
|
1567 }, |
|
1568 { |
|
1569 EStateNormal, |
|
1570 EPassSpecialKeyThru, |
|
1571 ELatin1LcAgrave |
|
1572 } |
|
1573 }, |
|
1574 { |
|
1575 { |
|
1576 EModifierFunc|EModifierKeyUp, |
|
1577 0 |
|
1578 }, |
|
1579 { |
|
1580 'e', |
|
1581 EMatchKeyCaseInsens |
|
1582 }, |
|
1583 { |
|
1584 EStateNormal, |
|
1585 EPassSpecialKeyThru, |
|
1586 ELatin1LcEgrave |
|
1587 } |
|
1588 }, |
|
1589 { |
|
1590 { |
|
1591 EModifierFunc|EModifierKeyUp, |
|
1592 0 |
|
1593 }, |
|
1594 { |
|
1595 'i', |
|
1596 EMatchKeyCaseInsens |
|
1597 }, |
|
1598 { |
|
1599 EStateNormal, |
|
1600 EPassSpecialKeyThru, |
|
1601 ELatin1LcIgrave |
|
1602 } |
|
1603 }, |
|
1604 { |
|
1605 { |
|
1606 EModifierFunc|EModifierKeyUp, |
|
1607 0 |
|
1608 }, |
|
1609 { |
|
1610 'o', |
|
1611 EMatchKeyCaseInsens |
|
1612 }, |
|
1613 { |
|
1614 EStateNormal, |
|
1615 EPassSpecialKeyThru, |
|
1616 ELatin1LcOgrave |
|
1617 } |
|
1618 }, |
|
1619 { |
|
1620 { |
|
1621 EModifierFunc|EModifierKeyUp, |
|
1622 0 |
|
1623 }, |
|
1624 { |
|
1625 'u', |
|
1626 EMatchKeyCaseInsens |
|
1627 }, |
|
1628 { |
|
1629 EStateNormal, |
|
1630 EPassSpecialKeyThru, |
|
1631 ELatin1LcUgrave |
|
1632 } |
|
1633 }, |
|
1634 { |
|
1635 { |
|
1636 EModifierFunc|EModifierKeyUp, |
|
1637 0 |
|
1638 }, |
|
1639 { |
|
1640 ' ', |
|
1641 EMatchKey |
|
1642 }, |
|
1643 { |
|
1644 EStateNormal, |
|
1645 EPassSpecialKeyThru, |
|
1646 ELatin1SpaceGrave |
|
1647 } |
|
1648 }, |
|
1649 TABLE_ENTRY_ANOTHER_CTRL_DIGIT |
|
1650 }; |
|
1651 |
|
1652 LOCAL_D const SFuncTableEntry table4[]= |
|
1653 { |
|
1654 // |
|
1655 // Table for special keyboard state 4 |
|
1656 // This state is entered by pressing Fn+c (see table10) |
|
1657 // |
|
1658 // The table makes certain keys return accented characters |
|
1659 // |
|
1660 { |
|
1661 { |
|
1662 EModifierFunc|EModifierKeyUp, |
|
1663 0 |
|
1664 }, |
|
1665 { |
|
1666 'a', |
|
1667 EMatchKeyCaseInsens |
|
1668 }, |
|
1669 { |
|
1670 EStateNormal, |
|
1671 EPassSpecialKeyThru, |
|
1672 ELatin1LcAacute |
|
1673 } |
|
1674 }, |
|
1675 { |
|
1676 { |
|
1677 EModifierFunc|EModifierKeyUp, |
|
1678 0 |
|
1679 }, |
|
1680 { |
|
1681 'e', |
|
1682 EMatchKeyCaseInsens |
|
1683 }, |
|
1684 { |
|
1685 EStateNormal, |
|
1686 EPassSpecialKeyThru, |
|
1687 ELatin1LcEacute |
|
1688 } |
|
1689 }, |
|
1690 { |
|
1691 { |
|
1692 EModifierFunc|EModifierKeyUp, |
|
1693 0 |
|
1694 }, |
|
1695 { |
|
1696 'i', |
|
1697 EMatchKeyCaseInsens |
|
1698 }, |
|
1699 { |
|
1700 EStateNormal, |
|
1701 EPassSpecialKeyThru, |
|
1702 ELatin1LcIacute |
|
1703 } |
|
1704 }, |
|
1705 { |
|
1706 { |
|
1707 EModifierFunc|EModifierKeyUp, |
|
1708 0 |
|
1709 }, |
|
1710 { |
|
1711 'o', |
|
1712 EMatchKeyCaseInsens |
|
1713 }, |
|
1714 { |
|
1715 EStateNormal, |
|
1716 EPassSpecialKeyThru, |
|
1717 ELatin1LcOacute |
|
1718 } |
|
1719 }, |
|
1720 { |
|
1721 { |
|
1722 EModifierFunc|EModifierKeyUp, |
|
1723 0 |
|
1724 }, |
|
1725 { |
|
1726 'u', |
|
1727 EMatchKeyCaseInsens |
|
1728 }, |
|
1729 { |
|
1730 EStateNormal, |
|
1731 EPassSpecialKeyThru, |
|
1732 ELatin1LcUacute |
|
1733 } |
|
1734 }, |
|
1735 { |
|
1736 { |
|
1737 EModifierFunc|EModifierKeyUp, |
|
1738 0 |
|
1739 }, |
|
1740 { |
|
1741 'y', |
|
1742 EMatchKeyCaseInsens |
|
1743 }, |
|
1744 { |
|
1745 EStateNormal, |
|
1746 EPassSpecialKeyThru, |
|
1747 ELatin1LcYacute |
|
1748 } |
|
1749 }, |
|
1750 { |
|
1751 { |
|
1752 EModifierFunc|EModifierKeyUp, |
|
1753 0 |
|
1754 }, |
|
1755 { |
|
1756 ' ', |
|
1757 EMatchKey |
|
1758 }, |
|
1759 { |
|
1760 EStateNormal, |
|
1761 EPassSpecialKeyThru, |
|
1762 ELatin1LcSpaceAcute |
|
1763 } |
|
1764 }, |
|
1765 TABLE_ENTRY_ANOTHER_CTRL_DIGIT |
|
1766 }; |
|
1767 |
|
1768 LOCAL_D const SFuncTableEntry table5[]= |
|
1769 { |
|
1770 // |
|
1771 // Table for special keyboard state 5 |
|
1772 // This state is entered by pressing Fn+v (see table10) |
|
1773 // |
|
1774 // The table makes certain keys return accented characters |
|
1775 // |
|
1776 { |
|
1777 { |
|
1778 EModifierFunc|EModifierKeyUp, |
|
1779 0 |
|
1780 }, |
|
1781 { |
|
1782 'a', |
|
1783 EMatchKeyCaseInsens |
|
1784 }, |
|
1785 { |
|
1786 EStateNormal, |
|
1787 EPassSpecialKeyThru, |
|
1788 ELatin1LcAtilde |
|
1789 } |
|
1790 }, |
|
1791 { |
|
1792 { |
|
1793 EModifierFunc|EModifierKeyUp, |
|
1794 0 |
|
1795 }, |
|
1796 { |
|
1797 'n', |
|
1798 EMatchKeyCaseInsens |
|
1799 }, |
|
1800 { |
|
1801 EStateNormal, |
|
1802 EPassSpecialKeyThru, |
|
1803 ELatin1LcNtilde |
|
1804 } |
|
1805 }, |
|
1806 { |
|
1807 { |
|
1808 EModifierFunc|EModifierKeyUp, |
|
1809 0 |
|
1810 }, |
|
1811 { |
|
1812 'o', |
|
1813 EMatchKeyCaseInsens |
|
1814 }, |
|
1815 { |
|
1816 EStateNormal, |
|
1817 EPassSpecialKeyThru, |
|
1818 ELatin1LcOtilde |
|
1819 } |
|
1820 }, |
|
1821 { |
|
1822 { |
|
1823 EModifierFunc|EModifierKeyUp, |
|
1824 0 |
|
1825 }, |
|
1826 { |
|
1827 ' ', |
|
1828 EMatchKey |
|
1829 }, |
|
1830 { |
|
1831 EStateNormal, |
|
1832 EPassSpecialKeyThru, |
|
1833 ELatin1LcSpaceTilde |
|
1834 } |
|
1835 }, |
|
1836 TABLE_ENTRY_ANOTHER_CTRL_DIGIT |
|
1837 }; |
|
1838 |
|
1839 LOCAL_D const SFuncTableEntry table6[]= |
|
1840 { |
|
1841 // |
|
1842 // Table for special keyboard state 6 |
|
1843 // This state is entered by pressing Fn+b (see table6) |
|
1844 // |
|
1845 // The table makes certain keys return accented characters |
|
1846 // |
|
1847 { |
|
1848 { |
|
1849 EModifierFunc|EModifierKeyUp, |
|
1850 0 |
|
1851 }, |
|
1852 { |
|
1853 'a', |
|
1854 EMatchKeyCaseInsens |
|
1855 }, |
|
1856 { |
|
1857 EStateNormal, |
|
1858 EPassSpecialKeyThru, |
|
1859 ELatin1LcAcirc |
|
1860 } |
|
1861 }, |
|
1862 { |
|
1863 { |
|
1864 EModifierFunc|EModifierKeyUp, |
|
1865 0 |
|
1866 }, |
|
1867 { |
|
1868 'e', |
|
1869 EMatchKeyCaseInsens |
|
1870 }, |
|
1871 { |
|
1872 EStateNormal, |
|
1873 EPassSpecialKeyThru, |
|
1874 ELatin1LcEcirc |
|
1875 } |
|
1876 }, |
|
1877 { |
|
1878 { |
|
1879 EModifierFunc|EModifierKeyUp, |
|
1880 0 |
|
1881 }, |
|
1882 { |
|
1883 'i', |
|
1884 EMatchKeyCaseInsens |
|
1885 }, |
|
1886 { |
|
1887 EStateNormal, |
|
1888 EPassSpecialKeyThru, |
|
1889 ELatin1LcIcirc |
|
1890 } |
|
1891 }, |
|
1892 { |
|
1893 { |
|
1894 EModifierFunc|EModifierKeyUp, |
|
1895 0 |
|
1896 }, |
|
1897 { |
|
1898 'o', |
|
1899 EMatchKeyCaseInsens |
|
1900 }, |
|
1901 { |
|
1902 EStateNormal, |
|
1903 EPassSpecialKeyThru, |
|
1904 ELatin1LcOcirc |
|
1905 } |
|
1906 }, |
|
1907 { |
|
1908 { |
|
1909 EModifierFunc|EModifierKeyUp, |
|
1910 0 |
|
1911 }, |
|
1912 { |
|
1913 'u', |
|
1914 EMatchKeyCaseInsens |
|
1915 }, |
|
1916 { |
|
1917 EStateNormal, |
|
1918 EPassSpecialKeyThru, |
|
1919 ELatin1LcUcirc |
|
1920 } |
|
1921 }, |
|
1922 { |
|
1923 { |
|
1924 EModifierFunc|EModifierKeyUp, |
|
1925 0 |
|
1926 }, |
|
1927 { |
|
1928 ' ', |
|
1929 EMatchKey |
|
1930 }, |
|
1931 { |
|
1932 EStateNormal, |
|
1933 EPassSpecialKeyThru, |
|
1934 ELatin1LcSpaceCirc |
|
1935 } |
|
1936 }, |
|
1937 TABLE_ENTRY_ANOTHER_CTRL_DIGIT |
|
1938 }; |
|
1939 |
|
1940 // |
|
1941 // TO DO: (optional) |
|
1942 // |
|
1943 // State 7,8,9 aren't used in this example. |
|
1944 // You can implement them if you want more special states |
|
1945 // |
|
1946 |
|
1947 //LOCAL_D const SFuncTableEntry table7[]= |
|
1948 // { |
|
1949 // TABLE_ENTRY_ANOTHER_CTRL_DIGIT |
|
1950 // }; |
|
1951 |
|
1952 //LOCAL_D const SFuncTableEntry table8[]= |
|
1953 // { |
|
1954 // TABLE_ENTRY_ANOTHER_CTRL_DIGIT |
|
1955 // }; |
|
1956 |
|
1957 //LOCAL_D const SFuncTableEntry table9[]= |
|
1958 // { |
|
1959 // TABLE_ENTRY_ANOTHER_CTRL_DIGIT |
|
1960 // }; |
|
1961 |
|
1962 |
|
1963 LOCAL_D const SFuncTableEntry table10[]= |
|
1964 { |
|
1965 // |
|
1966 // TO DO: (optional) |
|
1967 // |
|
1968 // Table keyboard state 10 - the normal state |
|
1969 // |
|
1970 // This table controls which keys switch into the special states |
|
1971 // 0-9, 11 and 12. |
|
1972 // |
|
1973 |
|
1974 { |
|
1975 // |
|
1976 // Make sure key-up events are ignored by handling them first and |
|
1977 // doing nothing |
|
1978 // |
|
1979 { |
|
1980 EModifierKeyUp, |
|
1981 EModifierKeyUp |
|
1982 }, |
|
1983 { |
|
1984 EKeyNull, |
|
1985 EAnyKey |
|
1986 }, |
|
1987 { |
|
1988 EStateUnchanged, |
|
1989 EDoNothing, |
|
1990 0 |
|
1991 } |
|
1992 }, |
|
1993 { |
|
1994 // |
|
1995 // Check for ctrl-number presses |
|
1996 // This will enter state EStateCtrlDigits (state 12) which allows |
|
1997 // entry of a numeric keycode |
|
1998 // |
|
1999 { |
|
2000 EModifierCtrl|EModifierFunc|EModifierKeyUp, |
|
2001 EModifierCtrl |
|
2002 }, |
|
2003 { |
|
2004 EKeyNull, |
|
2005 EAnyDecimalDigit |
|
2006 }, |
|
2007 { |
|
2008 EStateDerivedFromDigitEntered, |
|
2009 EAddOnCtrlDigit, |
|
2010 0 |
|
2011 } |
|
2012 }, |
|
2013 { |
|
2014 // |
|
2015 // Any other key events that have not been trapped are just |
|
2016 // passed through unchanged |
|
2017 // |
|
2018 { |
|
2019 0, |
|
2020 0 |
|
2021 }, |
|
2022 { |
|
2023 EKeyNull, |
|
2024 EAnyKey |
|
2025 }, |
|
2026 { |
|
2027 EStateUnchanged, |
|
2028 EPassKeyThru, |
|
2029 0 |
|
2030 } |
|
2031 } |
|
2032 }; |
|
2033 |
|
2034 //LOCAL_D const SFuncTableEntry table11[]= |
|
2035 // { |
|
2036 // TABLE_ENTRY_ANOTHER_CTRL_DIGIT |
|
2037 // }; |
|
2038 |
|
2039 LOCAL_D const SFuncTableEntry table12[]= |
|
2040 { |
|
2041 // |
|
2042 // Table 12 handles entring digit codes. The keyboard will remain in this |
|
2043 // state until the Ctrl key is released |
|
2044 // |
|
2045 { |
|
2046 { |
|
2047 // |
|
2048 // Look for a key up event |
|
2049 // |
|
2050 EModifierKeyUp, |
|
2051 EModifierKeyUp |
|
2052 }, |
|
2053 { |
|
2054 // |
|
2055 // Match either left or right Ctrl key (i.e. this matches a Ctrl key release) |
|
2056 // |
|
2057 EKeyLeftCtrl, |
|
2058 EMatchLeftOrRight |
|
2059 }, |
|
2060 { |
|
2061 EStateNormal, // return to normal state (table10) |
|
2062 EPassCtrlDigitsThru, // and pass through the numeric code we have accumulated |
|
2063 0 |
|
2064 } |
|
2065 }, |
|
2066 TABLE_ENTRY_ANOTHER_CTRL_DIGIT |
|
2067 }; |
|
2068 |
|
2069 |
|
2070 // |
|
2071 // TO DO: (optional) |
|
2072 // |
|
2073 // Array of state control tables above. If a state is not used set the array |
|
2074 // size to zero and the pointer to NULL |
|
2075 // |
|
2076 // The tables must be declared here in order from table 0 to table 12 |
|
2077 // |
|
2078 LOCAL_D const SFuncTable genFuncTables[]= |
|
2079 { |
|
2080 { |
|
2081 // |
|
2082 // state 0 |
|
2083 // |
|
2084 0, // state 0 not used, size = 0 |
|
2085 NULL // state 0 not used, pointer = NULL |
|
2086 }, |
|
2087 { |
|
2088 // |
|
2089 // state 1 |
|
2090 // |
|
2091 ARRAY_LENGTH(table1), // size of table 1 |
|
2092 &table1[0] // pointer to table 1 |
|
2093 }, |
|
2094 { |
|
2095 // |
|
2096 // state 2 |
|
2097 // |
|
2098 ARRAY_LENGTH(table2), |
|
2099 &table2[0] |
|
2100 }, |
|
2101 { |
|
2102 // |
|
2103 // state 3 |
|
2104 // |
|
2105 ARRAY_LENGTH(table3), |
|
2106 &table3[0] |
|
2107 }, |
|
2108 { |
|
2109 // |
|
2110 // state 4 |
|
2111 // |
|
2112 ARRAY_LENGTH(table4), |
|
2113 &table4[0] |
|
2114 }, |
|
2115 { |
|
2116 // |
|
2117 // state 5 |
|
2118 // |
|
2119 ARRAY_LENGTH(table5), |
|
2120 &table5[0] |
|
2121 }, |
|
2122 { |
|
2123 // |
|
2124 // state 6 |
|
2125 // |
|
2126 ARRAY_LENGTH(table6), |
|
2127 &table6[0] |
|
2128 }, |
|
2129 { |
|
2130 // |
|
2131 // state 7 |
|
2132 // |
|
2133 0, |
|
2134 NULL |
|
2135 }, |
|
2136 { |
|
2137 // |
|
2138 // state 8 |
|
2139 // |
|
2140 0, |
|
2141 NULL |
|
2142 }, |
|
2143 { |
|
2144 // |
|
2145 // state 9 |
|
2146 // |
|
2147 0, |
|
2148 NULL |
|
2149 }, |
|
2150 { |
|
2151 // |
|
2152 // state 10 |
|
2153 // |
|
2154 ARRAY_LENGTH(table10), |
|
2155 &table10[0] |
|
2156 }, |
|
2157 { |
|
2158 // |
|
2159 // state 11 |
|
2160 // |
|
2161 0, |
|
2162 NULL |
|
2163 }, |
|
2164 { |
|
2165 // |
|
2166 // state 12 |
|
2167 // |
|
2168 ARRAY_LENGTH(table12), |
|
2169 &table12[0] |
|
2170 } |
|
2171 }; |
|
2172 |
|
2173 |
|
2174 // |
|
2175 // Root of the state modifier tables |
|
2176 // |
|
2177 LOCAL_D const SFuncTables FuncTables= |
|
2178 { |
|
2179 { |
|
2180 // |
|
2181 // The default processing table |
|
2182 // |
|
2183 ARRAY_LENGTH(defaultTable), |
|
2184 &defaultTable[0] |
|
2185 }, |
|
2186 { |
|
2187 // |
|
2188 // The modifier control table |
|
2189 // |
|
2190 ARRAY_LENGTH(modifierTable), |
|
2191 &modifierTable[0] |
|
2192 }, |
|
2193 // |
|
2194 // The state control tables |
|
2195 // |
|
2196 ARRAY_LENGTH(genFuncTables), |
|
2197 &genFuncTables[0] |
|
2198 }; |
|
2199 |
|
2200 |
|
2201 // |
|
2202 // The following exported functions give the key translator access to |
|
2203 // the control tables above |
|
2204 // |
|
2205 EXPORT_C void KeyDataSettings(TRadix &aRadix,TCtrlDigitsTermination &aCtrlDigitsTermination,TInt &aDefaultCtrlDigitsMaxCount, |
|
2206 TInt &aMaximumCtrlDigitsMaxCount) |
|
2207 { |
|
2208 aRadix=EDecimal; |
|
2209 aCtrlDigitsTermination=ETerminationByCtrlUp; |
|
2210 aDefaultCtrlDigitsMaxCount=3; |
|
2211 aMaximumCtrlDigitsMaxCount=10; |
|
2212 } |
|
2213 |
|
2214 EXPORT_C void KeyDataFuncTable(SFuncTables &aFuncTables) |
|
2215 { |
|
2216 aFuncTables=FuncTables; |
|
2217 } |
|
2218 |
|
2219 EXPORT_C void KeyDataConvTable(SConvTable &aConvTable, TUint &aConvTableFirstScanCode,TUint &aConvTableLastScanCode, |
|
2220 SScanCodeBlockList &aKeypadScanCode,SKeyCodeList &aNonAutorepKeyCodes) |
|
2221 { |
|
2222 aConvTable=ConvTable; |
|
2223 aConvTableFirstScanCode=scanCodeBlock_base[0].firstScanCode; |
|
2224 aConvTableLastScanCode=scanCodeBlock_base[ARRAY_LENGTH(scanCodeBlock_base)-1].lastScanCode; |
|
2225 aKeypadScanCode=ConvTableKeypadScanCodes; |
|
2226 aNonAutorepKeyCodes=ConvTableNonAutorepKeyCodes; |
|
2227 } |