1use crate::{LockStateChecker, ModifierChecker};
12use fidl_fuchsia_ui_input3::{LockState, Modifiers};
13use std::sync::LazyLock;
14
15pub(crate) static QWERTY_MAP: LazyLock<Vec<Option<KeyLevels>>> = LazyLock::new(|| {
26 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
155pub(crate) static DVORAK_MAP: LazyLock<Vec<Option<KeyLevels>>> = LazyLock::new(|| {
159 vec![
160 None,
162 None,
163 None,
164 None,
165 Some(('a', Some('A'), true).into()),
167 Some(('x', Some('X'), true).into()),
168 Some(('j', Some('J'), true).into()),
169 Some(('e', Some('E'), true).into()),
170 Some(('.', Some('>')).into()),
172 Some(('u', Some('U'), true).into()),
173 Some(('i', Some('I'), true).into()),
174 Some(('d', Some('D'), true).into()),
175 Some(('c', Some('C'), true).into()),
177 Some(('h', Some('H'), true).into()),
178 Some(('t', Some('T'), true).into()),
179 Some(('n', Some('N'), true).into()),
180 Some(('m', Some('M'), true).into()),
182 Some(('b', Some('B'), true).into()),
183 Some(('r', Some('R'), true).into()),
184 Some(('l', Some('L'), true).into()),
185 Some(('\'', Some('"')).into()),
187 Some(('p', Some('P'), true).into()),
188 Some(('o', Some('O'), true).into()),
189 Some(('y', Some('Y'), true).into()),
190 Some(('g', Some('G'), true).into()),
192 Some(('k', Some('K'), true).into()),
193 Some((',', Some('<')).into()),
194 Some(('q', Some('Q'), true).into()),
195 Some(('f', Some('F'), true).into()),
197 Some((';', Some(':')).into()),
198 Some(('1', Some('!')).into()),
199 Some(('2', Some('@')).into()),
200 Some(('3', Some('#')).into()),
202 Some(('4', Some('$')).into()),
203 Some(('5', Some('%')).into()),
204 Some(('6', Some('^')).into()),
205 Some(('7', Some('&')).into()),
207 Some(('8', Some('*')).into()),
208 Some(('9', Some('(')).into()),
209 Some(('0', Some(')')).into()),
210 None,
212 None,
213 None,
214 None,
215 Some((' ', Some(' ')).into()),
217 Some(('[', Some('{')).into()),
218 Some((']', Some('}')).into()),
219 Some(('/', Some('?')).into()),
220 Some(('=', Some('+')).into()),
222 Some(('\\', Some('|')).into()),
223 None,
224 Some(('s', Some('S'), true).into()),
225 Some(('-', Some('_')).into()),
227 Some(('`', Some('~')).into()),
228 Some(('w', Some('W'), true).into()),
229 Some(('v', Some('V'), true).into()),
230 Some(('z', Some('Z'), true).into()),
232 None,
233 None,
234 None,
235 None,
237 None,
238 None,
239 None,
240 None,
242 None,
243 None,
244 None,
245 None,
247 None,
248 None,
249 None,
250 None,
252 None,
253 None,
254 None,
255 None,
257 None,
258 None,
259 None,
260 None,
262 None,
263 None,
264 None,
265 Some(('/', None).into()),
267 Some(('*', None).into()),
268 Some(('-', None).into()),
269 Some(('+', None).into()),
270 None,
272 Some(('1', None).into()),
273 Some(('2', None).into()),
274 Some(('3', None).into()),
275 Some(('4', None).into()),
277 Some(('5', None).into()),
278 Some(('6', None).into()),
279 Some(('7', None).into()),
280 Some(('8', None).into()),
282 Some(('9', None).into()),
283 Some(('0', None).into()),
284 Some(('.', None).into()),
285 ]
286});
287
288pub(crate) static FR_AZERTY_MAP: LazyLock<Vec<Option<KeyLevels>>> = LazyLock::new(|| {
291 vec![
292 None,
294 None,
295 None,
296 None,
297 Some(('q', Some('Q'), true).into()),
299 Some(('b', Some('B'), true).into()),
300 Some(('c', Some('C'), true).into()),
301 Some(('d', Some('D'), true).into()),
302 Some(('e', Some('E'), true).into()),
304 Some(('f', Some('F'), true).into()),
305 Some(('g', Some('G'), true).into()),
306 Some(('h', Some('H'), true).into()),
307 Some(('i', Some('I'), true).into()),
309 Some(('j', Some('J'), true).into()),
310 Some(('k', Some('K'), true).into()),
311 Some(('l', Some('L'), true).into()),
312 Some((',', Some('?')).into()),
314 Some(('n', Some('N'), true).into()),
315 Some(('o', Some('O'), true).into()),
316 Some(('p', Some('P'), true).into()),
317 Some(('a', Some('A'), true).into()),
319 Some(('r', Some('R'), true).into()),
320 Some(('s', Some('S'), true).into()),
321 Some(('t', Some('T'), true).into()),
322 Some(('u', Some('U'), true).into()),
324 Some(('v', Some('V'), true).into()),
325 Some(('z', Some('Z'), true).into()),
326 Some(('x', Some('X'), true).into()),
327 Some(('y', Some('Y'), true).into()),
329 Some(('w', Some('W'), true).into()),
330 Some(('&', Some('1')).into()),
331 Some(('é', Some('2')).into()),
332 Some(('"', Some('3')).into()),
334 Some(('\'', Some('4')).into()),
335 Some(('(', Some('5')).into()),
336 Some(('-', Some('6')).into()),
337 Some(('è', Some('7')).into()),
339 Some(('—', Some('8')).into()),
340 Some(('ç', Some('9')).into()),
341 Some(('à', Some('0')).into()),
342 None,
344 None,
345 None,
346 None,
347 Some((' ', Some(' ')).into()),
349 Some((')', Some('°')).into()),
350 Some(('=', Some('+')).into()),
351 Some(('\u{0302}', Some('\u{0308}')).into()), Some(('$', Some('£')).into()),
354 Some(('\\', Some('|')).into()), None,
356 Some(('m', Some('M'), true).into()),
357 Some(('\'', Some('"')).into()),
359 Some(('²', None).into()),
360 Some((';', Some('.')).into()),
361 Some((':', Some('/')).into()),
362 Some(('!', Some('§')).into()),
364 None,
365 None,
366 None,
367 None,
369 None,
370 None,
371 None,
372 None,
374 None,
375 None,
376 None,
377 None,
379 None,
380 None,
381 None,
382 None,
384 None,
385 None,
386 None,
387 None,
389 None,
390 None,
391 None,
392 None,
394 None,
395 None,
396 None,
397 Some(('/', None).into()),
399 Some(('*', None).into()),
400 Some(('-', None).into()),
401 Some(('+', None).into()),
402 None,
404 Some(('1', None).into()),
405 Some(('2', None).into()),
406 Some(('3', None).into()),
407 Some(('4', None).into()),
409 Some(('5', None).into()),
410 Some(('6', None).into()),
411 Some(('7', None).into()),
412 Some(('8', None).into()),
414 Some(('9', None).into()),
415 Some(('0', None).into()),
416 Some(('.', None).into()),
417 ]
418});
419
420pub(crate) static COLEMAK_MAP: LazyLock<Vec<Option<KeyLevels>>> = LazyLock::new(|| {
424 vec![
425 None,
427 None,
428 None,
429 None,
430 Some(('a', Some('A'), true).into()),
432 Some(('b', Some('B'), true).into()),
433 Some(('c', Some('C'), true).into()),
434 Some(('s', Some('S'), true).into()),
435 Some(('f', Some('F'), true).into()),
437 Some(('t', Some('T'), true).into()),
438 Some(('d', Some('D'), true).into()),
439 Some(('h', Some('H'), true).into()),
440 Some(('u', Some('U'), true).into()),
442 Some(('n', Some('N'), true).into()),
443 Some(('e', Some('E'), true).into()),
444 Some(('i', Some('I'), true).into()),
445 Some(('m', Some('M'), true).into()),
447 Some(('k', Some('K'), true).into()),
448 Some(('y', Some('Y'), true).into()),
449 Some((';', Some(':')).into()),
450 Some(('q', Some('Q'), true).into()),
452 Some(('p', Some('P'), true).into()),
453 Some(('r', Some('R'), true).into()),
454 Some(('g', Some('G'), true).into()),
455 Some(('l', Some('L'), true).into()),
457 Some(('v', Some('V'), true).into()),
458 Some(('w', Some('W'), true).into()),
459 Some(('x', Some('X'), true).into()),
460 Some(('j', Some('J'), true).into()),
462 Some(('z', Some('Z'), true).into()),
463 Some(('1', Some('!')).into()),
464 Some(('2', Some('@')).into()),
465 Some(('3', Some('#')).into()),
467 Some(('4', Some('$')).into()),
468 Some(('5', Some('%')).into()),
469 Some(('6', Some('^')).into()),
470 Some(('7', Some('&')).into()),
472 Some(('8', Some('*')).into()),
473 Some(('9', Some('(')).into()),
474 Some(('0', Some(')')).into()),
475 None,
477 None,
478 None,
479 None,
480 Some((' ', Some(' ')).into()),
482 Some(('-', Some('_')).into()),
483 Some(('=', Some('+')).into()),
484 Some(('[', Some('{')).into()),
485 Some((']', Some('}')).into()),
487 Some(('\\', Some('|')).into()),
488 None,
489 Some(('o', Some('O'), true).into()),
490 Some(('\'', Some('"')).into()),
492 Some(('`', Some('~')).into()),
493 Some((',', Some('<')).into()),
494 Some(('.', Some('>')).into()),
495 Some(('/', Some('?')).into()),
497 None,
498 None,
499 None,
500 None,
502 None,
503 None,
504 None,
505 None,
507 None,
508 None,
509 None,
510 None,
512 None,
513 None,
514 None,
515 None,
517 None,
518 None,
519 None,
520 None,
522 None,
523 None,
524 None,
525 None,
527 None,
528 None,
529 None,
530 Some(('/', None).into()),
532 Some(('*', None).into()),
533 Some(('-', None).into()),
534 Some(('+', None).into()),
535 None,
537 Some(('1', None).into()),
538 Some(('2', None).into()),
539 Some(('3', None).into()),
540 Some(('4', None).into()),
542 Some(('5', None).into()),
543 Some(('6', None).into()),
544 Some(('7', None).into()),
545 Some(('8', None).into()),
547 Some(('9', None).into()),
548 Some(('0', None).into()),
549 Some(('.', None).into()),
550 ]
551});
552
553pub struct KeyLevels {
555 pub(crate) ch: char,
557 pub(crate) shift_ch: Option<char>,
559 is_letter: bool,
562}
563
564impl From<(char, Option<char>)> for KeyLevels {
565 fn from(s: (char, Option<char>)) -> Self {
566 KeyLevels { ch: s.0, shift_ch: s.1, is_letter: false }
567 }
568}
569
570impl From<(char, Option<char>, bool)> for KeyLevels {
571 fn from(s: (char, Option<char>, bool)) -> Self {
572 KeyLevels { ch: s.0, shift_ch: s.1, is_letter: s.2 }
573 }
574}
575
576impl KeyLevels {
577 pub fn get_key(&self, m: &impl ModifierChecker, l: &impl LockStateChecker) -> Option<char> {
578 if (l.test(LockState::CAPS_LOCK) && self.is_letter) || m.test(Modifiers::SHIFT) {
579 return self.shift_ch;
580 }
581 Some(self.ch)
582 }
583}