1use crate::{LockStateChecker, ModifierChecker};
12use fidl_fuchsia_ui_input3::{LockState, Modifiers};
13use lazy_static::lazy_static;
14
15lazy_static! {
16 pub(crate) static ref QWERTY_MAP: Vec<Option<KeyLevels>> = vec![
27 None,
29 None,
30 None,
31 None,
32 Some(('a', Some('A'), true).into()),
34 Some(('b', Some('B'), true).into()),
35 Some(('c', Some('C'), true).into()),
36 Some(('d', Some('D'), true).into()),
37 Some(('e', Some('E'), true).into()),
39 Some(('f', Some('F'), true).into()),
40 Some(('g', Some('G'), true).into()),
41 Some(('h', Some('H'), true).into()),
42 Some(('i', Some('I'), true).into()),
44 Some(('j', Some('J'), true).into()),
45 Some(('k', Some('K'), true).into()),
46 Some(('l', Some('L'), true).into()),
47 Some(('m', Some('M'), true).into()),
49 Some(('n', Some('N'), true).into()),
50 Some(('o', Some('O'), true).into()),
51 Some(('p', Some('P'), true).into()),
52 Some(('q', Some('Q'), true).into()),
54 Some(('r', Some('R'), true).into()),
55 Some(('s', Some('S'), true).into()),
56 Some(('t', Some('T'), true).into()),
57 Some(('u', Some('U'), true).into()),
59 Some(('v', Some('V'), true).into()),
60 Some(('w', Some('W'), true).into()),
61 Some(('x', Some('X'), true).into()),
62 Some(('y', Some('Y'), true).into()),
64 Some(('z', Some('Z'), true).into()),
65 Some(('1', Some('!')).into()),
66 Some(('2', Some('@')).into()),
67 Some(('3', Some('#')).into()),
69 Some(('4', Some('$')).into()),
70 Some(('5', Some('%')).into()),
71 Some(('6', Some('^')).into()),
72 Some(('7', Some('&')).into()),
74 Some(('8', Some('*')).into()),
75 Some(('9', Some('(')).into()),
76 Some(('0', Some(')')).into()),
77 None,
79 None,
80 None,
81 None,
82 Some((' ', Some(' ')).into()),
84 Some(('-', Some('_')).into()),
85 Some(('=', Some('+')).into()),
86 Some(('[', Some('{')).into()),
87 Some((']', Some('}')).into()),
89 Some(('\\', Some('|')).into()),
90 None,
91 Some((';', Some(':')).into()),
92 Some(('\'', Some('"')).into()),
94 Some(('`', Some('~')).into()),
95 Some((',', Some('<')).into()),
96 Some(('.', Some('>')).into()),
97 Some(('/', Some('?')).into()),
99 None,
100 None,
101 None,
102 None,
104 None,
105 None,
106 None,
107 None,
109 None,
110 None,
111 None,
112 None,
114 None,
115 None,
116 None,
117 None,
119 None,
120 None,
121 None,
122 None,
124 None,
125 None,
126 None,
127 None,
129 None,
130 None,
131 None,
132 Some(('/', None).into()),
134 Some(('*', None).into()),
135 Some(('-', None).into()),
136 Some(('+', None).into()),
137 None,
139 Some(('1', None).into()),
140 Some(('2', None).into()),
141 Some(('3', None).into()),
142 Some(('4', None).into()),
144 Some(('5', None).into()),
145 Some(('6', None).into()),
146 Some(('7', None).into()),
147 Some(('8', None).into()),
149 Some(('9', None).into()),
150 Some(('0', None).into()),
151 Some(('.', None).into()),
152 ];
153
154 pub(crate) static ref DVORAK_MAP: Vec<Option<KeyLevels>> = vec![
158 None,
160 None,
161 None,
162 None,
163 Some(('a', Some('A'), true).into()),
165 Some(('x', Some('X'), true).into()),
166 Some(('j', Some('J'), true).into()),
167 Some(('e', Some('E'), true).into()),
168 Some(('.', Some('>')).into()),
170 Some(('u', Some('U'), true).into()),
171 Some(('i', Some('I'), true).into()),
172 Some(('d', Some('D'), true).into()),
173 Some(('c', Some('C'), true).into()),
175 Some(('h', Some('H'), true).into()),
176 Some(('t', Some('T'), true).into()),
177 Some(('n', Some('N'), true).into()),
178 Some(('m', Some('M'), true).into()),
180 Some(('b', Some('B'), true).into()),
181 Some(('r', Some('R'), true).into()),
182 Some(('l', Some('L'), true).into()),
183 Some(('\'', Some('"')).into()),
185 Some(('p', Some('P'), true).into()),
186 Some(('o', Some('O'), true).into()),
187 Some(('y', Some('Y'), true).into()),
188 Some(('g', Some('G'), true).into()),
190 Some(('k', Some('K'), true).into()),
191 Some((',', Some('<')).into()),
192 Some(('q', Some('Q'), true).into()),
193 Some(('f', Some('F'), true).into()),
195 Some((';', Some(':')).into()),
196 Some(('1', Some('!')).into()),
197 Some(('2', Some('@')).into()),
198 Some(('3', Some('#')).into()),
200 Some(('4', Some('$')).into()),
201 Some(('5', Some('%')).into()),
202 Some(('6', Some('^')).into()),
203 Some(('7', Some('&')).into()),
205 Some(('8', Some('*')).into()),
206 Some(('9', Some('(')).into()),
207 Some(('0', Some(')')).into()),
208 None,
210 None,
211 None,
212 None,
213 Some((' ', Some(' ')).into()),
215 Some(('[', Some('{')).into()),
216 Some((']', Some('}')).into()),
217 Some(('/', Some('?')).into()),
218 Some(('=', Some('+')).into()),
220 Some(('\\', Some('|')).into()),
221 None,
222 Some(('s', Some('S'), true).into()),
223 Some(('-', Some('_')).into()),
225 Some(('`', Some('~')).into()),
226 Some(('w', Some('W'), true).into()),
227 Some(('v', Some('V'), true).into()),
228 Some(('z', Some('Z'), true).into()),
230 None,
231 None,
232 None,
233 None,
235 None,
236 None,
237 None,
238 None,
240 None,
241 None,
242 None,
243 None,
245 None,
246 None,
247 None,
248 None,
250 None,
251 None,
252 None,
253 None,
255 None,
256 None,
257 None,
258 None,
260 None,
261 None,
262 None,
263 Some(('/', None).into()),
265 Some(('*', None).into()),
266 Some(('-', None).into()),
267 Some(('+', None).into()),
268 None,
270 Some(('1', None).into()),
271 Some(('2', None).into()),
272 Some(('3', None).into()),
273 Some(('4', None).into()),
275 Some(('5', None).into()),
276 Some(('6', None).into()),
277 Some(('7', None).into()),
278 Some(('8', None).into()),
280 Some(('9', None).into()),
281 Some(('0', None).into()),
282 Some(('.', None).into()),
283 ];
284
285 pub(crate) static ref FR_AZERTY_MAP: Vec<Option<KeyLevels>> = vec![
288 None,
290 None,
291 None,
292 None,
293 Some(('q', Some('Q'), true).into()),
295 Some(('b', Some('B'), true).into()),
296 Some(('c', Some('C'), true).into()),
297 Some(('d', Some('D'), true).into()),
298 Some(('e', Some('E'), true).into()),
300 Some(('f', Some('F'), true).into()),
301 Some(('g', Some('G'), true).into()),
302 Some(('h', Some('H'), true).into()),
303 Some(('i', Some('I'), true).into()),
305 Some(('j', Some('J'), true).into()),
306 Some(('k', Some('K'), true).into()),
307 Some(('l', Some('L'), true).into()),
308 Some((',', Some('?')).into()),
310 Some(('n', Some('N'), true).into()),
311 Some(('o', Some('O'), true).into()),
312 Some(('p', Some('P'), true).into()),
313 Some(('a', Some('A'), true).into()),
315 Some(('r', Some('R'), true).into()),
316 Some(('s', Some('S'), true).into()),
317 Some(('t', Some('T'), true).into()),
318 Some(('u', Some('U'), true).into()),
320 Some(('v', Some('V'), true).into()),
321 Some(('z', Some('Z'), true).into()),
322 Some(('x', Some('X'), true).into()),
323 Some(('y', Some('Y'), true).into()),
325 Some(('w', Some('W'), true).into()),
326 Some(('&', Some('1')).into()),
327 Some(('é', Some('2')).into()),
328 Some(('"', Some('3')).into()),
330 Some(('\'', Some('4')).into()),
331 Some(('(', Some('5')).into()),
332 Some(('-', Some('6')).into()),
333 Some(('è', Some('7')).into()),
335 Some(('—', Some('8')).into()),
336 Some(('ç', Some('9')).into()),
337 Some(('à', Some('0')).into()),
338 None,
340 None,
341 None,
342 None,
343 Some((' ', Some(' ')).into()),
345 Some((')', Some('°')).into()),
346 Some(('=', Some('+')).into()),
347 Some(('\u{0302}', Some('\u{0308}')).into()), Some(('$', Some('£')).into()),
350 Some(('\\', Some('|')).into()), None,
352 Some(('m', Some('M'), true).into()),
353 Some(('\'', Some('"')).into()),
355 Some(('²', None).into()),
356 Some((';', Some('.')).into()),
357 Some((':', Some('/')).into()),
358 Some(('!', Some('§')).into()),
360 None,
361 None,
362 None,
363 None,
365 None,
366 None,
367 None,
368 None,
370 None,
371 None,
372 None,
373 None,
375 None,
376 None,
377 None,
378 None,
380 None,
381 None,
382 None,
383 None,
385 None,
386 None,
387 None,
388 None,
390 None,
391 None,
392 None,
393 Some(('/', None).into()),
395 Some(('*', None).into()),
396 Some(('-', None).into()),
397 Some(('+', None).into()),
398 None,
400 Some(('1', None).into()),
401 Some(('2', None).into()),
402 Some(('3', None).into()),
403 Some(('4', None).into()),
405 Some(('5', None).into()),
406 Some(('6', None).into()),
407 Some(('7', None).into()),
408 Some(('8', None).into()),
410 Some(('9', None).into()),
411 Some(('0', None).into()),
412 Some(('.', None).into()),
413 ];
414
415 pub(crate) static ref COLEMAK_MAP: Vec<Option<KeyLevels>> = vec![
419 None,
421 None,
422 None,
423 None,
424 Some(('a', Some('A'), true).into()),
426 Some(('b', Some('B'), true).into()),
427 Some(('c', Some('C'), true).into()),
428 Some(('s', Some('S'), true).into()),
429 Some(('f', Some('F'), true).into()),
431 Some(('t', Some('T'), true).into()),
432 Some(('d', Some('D'), true).into()),
433 Some(('h', Some('H'), true).into()),
434 Some(('u', Some('U'), true).into()),
436 Some(('n', Some('N'), true).into()),
437 Some(('e', Some('E'), true).into()),
438 Some(('i', Some('I'), true).into()),
439 Some(('m', Some('M'), true).into()),
441 Some(('k', Some('K'), true).into()),
442 Some(('y', Some('Y'), true).into()),
443 Some((';', Some(':')).into()),
444 Some(('q', Some('Q'), true).into()),
446 Some(('p', Some('P'), true).into()),
447 Some(('r', Some('R'), true).into()),
448 Some(('g', Some('G'), true).into()),
449 Some(('l', Some('L'), true).into()),
451 Some(('v', Some('V'), true).into()),
452 Some(('w', Some('W'), true).into()),
453 Some(('x', Some('X'), true).into()),
454 Some(('j', Some('J'), true).into()),
456 Some(('z', Some('Z'), true).into()),
457 Some(('1', Some('!')).into()),
458 Some(('2', Some('@')).into()),
459 Some(('3', Some('#')).into()),
461 Some(('4', Some('$')).into()),
462 Some(('5', Some('%')).into()),
463 Some(('6', Some('^')).into()),
464 Some(('7', Some('&')).into()),
466 Some(('8', Some('*')).into()),
467 Some(('9', Some('(')).into()),
468 Some(('0', Some(')')).into()),
469 None,
471 None,
472 None,
473 None,
474 Some((' ', Some(' ')).into()),
476 Some(('-', Some('_')).into()),
477 Some(('=', Some('+')).into()),
478 Some(('[', Some('{')).into()),
479 Some((']', Some('}')).into()),
481 Some(('\\', Some('|')).into()),
482 None,
483 Some(('o', Some('O'), true).into()),
484 Some(('\'', Some('"')).into()),
486 Some(('`', Some('~')).into()),
487 Some((',', Some('<')).into()),
488 Some(('.', Some('>')).into()),
489 Some(('/', Some('?')).into()),
491 None,
492 None,
493 None,
494 None,
496 None,
497 None,
498 None,
499 None,
501 None,
502 None,
503 None,
504 None,
506 None,
507 None,
508 None,
509 None,
511 None,
512 None,
513 None,
514 None,
516 None,
517 None,
518 None,
519 None,
521 None,
522 None,
523 None,
524 Some(('/', None).into()),
526 Some(('*', None).into()),
527 Some(('-', None).into()),
528 Some(('+', None).into()),
529 None,
531 Some(('1', None).into()),
532 Some(('2', None).into()),
533 Some(('3', None).into()),
534 Some(('4', None).into()),
536 Some(('5', None).into()),
537 Some(('6', None).into()),
538 Some(('7', None).into()),
539 Some(('8', None).into()),
541 Some(('9', None).into()),
542 Some(('0', None).into()),
543 Some(('.', None).into()),
544 ];
545}
546
547pub struct KeyLevels {
549 pub(crate) ch: char,
551 pub(crate) shift_ch: Option<char>,
553 is_letter: bool,
556}
557
558impl From<(char, Option<char>)> for KeyLevels {
559 fn from(s: (char, Option<char>)) -> Self {
560 KeyLevels { ch: s.0, shift_ch: s.1, is_letter: false }
561 }
562}
563
564impl From<(char, Option<char>, bool)> for KeyLevels {
565 fn from(s: (char, Option<char>, bool)) -> Self {
566 KeyLevels { ch: s.0, shift_ch: s.1, is_letter: s.2 }
567 }
568}
569
570impl KeyLevels {
571 pub fn get_key(&self, m: &impl ModifierChecker, l: &impl LockStateChecker) -> Option<char> {
572 if (l.test(LockState::CAPS_LOCK) && self.is_letter) || m.test(Modifiers::SHIFT) {
573 return self.shift_ch;
574 }
575 Some(self.ch)
576 }
577}