1use anyhow::{Result, format_err};
6use fidl_fuchsia_input::Key;
7use fidl_fuchsia_ui_input3::{KeyEventType, KeyMeaning, LockState, Modifiers, NonPrintableKey};
8use log::{debug, error};
9use std::collections::{self, HashMap};
10use std::sync::LazyLock;
11
12mod defs;
13
14pub mod config;
15pub mod inverse_keymap;
16pub mod usages;
17
18pub static US_QWERTY: LazyLock<Keymap<'static>> = LazyLock::new(|| Keymap::new(&defs::QWERTY_MAP));
20
21pub fn apply(
23 key: Key,
24 modifier_state: &impl ModifierChecker,
25 lock_state: &impl LockStateChecker,
26) -> Option<KeyMeaning> {
27 US_QWERTY.apply(key, modifier_state, lock_state)
28}
29
30pub fn get_key_meaning(
42 key: &Option<Key>,
43 key_meaning: &Option<KeyMeaning>,
44 lock_state: &Option<LockState>,
45 modifiers: &Option<Modifiers>,
46) -> KeyMeaning {
47 key_meaning.unwrap_or_else(|| {
48 let lock_state =
53 LockStateKeys::new().with(lock_state.unwrap_or(LockState::from_bits_allow_unknown(0)));
54 let modifiers =
55 ModifierState::new().with(modifiers.unwrap_or(Modifiers::from_bits_allow_unknown(0)));
56 let key = key.unwrap_or(Key::Unknown);
57 US_QWERTY
58 .apply(key, &modifiers, &lock_state)
59 .unwrap_or(KeyMeaning::NonPrintableKey(NonPrintableKey::Unidentified))
60 })
61}
62
63pub(crate) const EMPTY_CODEPOINT: u32 = 0;
66
67pub struct Keymap<'a> {
69 map: &'a [Option<defs::KeyLevels>],
70}
71
72impl AsRef<[Option<defs::KeyLevels>]> for Keymap<'_> {
73 fn as_ref(&self) -> &[Option<defs::KeyLevels>] {
74 self.map
75 }
76}
77
78impl<'a> Keymap<'a> {
79 fn new(map: &'a [Option<defs::KeyLevels>]) -> Self {
81 Keymap { map }
82 }
83
84 fn try_into_nonprintable(&self, key: Key) -> Option<KeyMeaning> {
95 match key {
96 Key::Enter => Some(NonPrintableKey::Enter),
97 Key::Tab => Some(NonPrintableKey::Tab),
98 Key::Backspace => Some(NonPrintableKey::Backspace),
99 Key::Escape => Some(NonPrintableKey::Escape),
100 Key::Up => Some(NonPrintableKey::Up),
101 Key::Down => Some(NonPrintableKey::Down),
102 Key::Left => Some(NonPrintableKey::Left),
103 Key::Right => Some(NonPrintableKey::Right),
104 Key::End => Some(NonPrintableKey::End),
105 Key::Home => Some(NonPrintableKey::Home),
106 Key::PageUp => Some(NonPrintableKey::PageUp),
107 Key::PageDown => Some(NonPrintableKey::PageDown),
108 Key::RightAlt => Some(NonPrintableKey::Alt),
109 Key::LeftAlt => Some(NonPrintableKey::Alt),
110 Key::RightCtrl => Some(NonPrintableKey::Control),
111 Key::LeftCtrl => Some(NonPrintableKey::Control),
112 Key::CapsLock => Some(NonPrintableKey::CapsLock),
113 Key::LeftShift => Some(NonPrintableKey::Shift),
114 Key::RightShift => Some(NonPrintableKey::Shift),
115 Key::LeftMeta => Some(NonPrintableKey::Meta),
116 Key::RightMeta => Some(NonPrintableKey::Meta),
117 Key::NumLock => Some(NonPrintableKey::NumLock),
118 Key::ScrollLock => Some(NonPrintableKey::ScrollLock),
119 Key::F1 => Some(NonPrintableKey::F1),
120 Key::F2 => Some(NonPrintableKey::F2),
121 Key::F3 => Some(NonPrintableKey::F3),
122 Key::F4 => Some(NonPrintableKey::F4),
123 Key::F5 => Some(NonPrintableKey::F5),
124 Key::F6 => Some(NonPrintableKey::F6),
125 Key::F7 => Some(NonPrintableKey::F7),
126 Key::F8 => Some(NonPrintableKey::F8),
127 Key::F9 => Some(NonPrintableKey::F9),
128 Key::F10 => Some(NonPrintableKey::F10),
129 Key::F11 => Some(NonPrintableKey::F11),
130 Key::F12 => Some(NonPrintableKey::F12),
131
132 Key::AcBack => Some(NonPrintableKey::BrowserBack),
134 Key::AcRefresh => Some(NonPrintableKey::BrowserRefresh),
135 Key::AcFullScreenView => Some(NonPrintableKey::ZoomToggle),
136 Key::AcSelectTaskApplication => Some(NonPrintableKey::Select),
137 Key::BrightnessDown => Some(NonPrintableKey::BrightnessDown),
138 Key::BrightnessUp => Some(NonPrintableKey::BrightnessUp),
139 Key::PlayPause => Some(NonPrintableKey::MediaPlayPause),
140 Key::Mute => Some(NonPrintableKey::AudioVolumeMute),
141 Key::VolumeDown => Some(NonPrintableKey::AudioVolumeDown),
142 Key::VolumeUp => Some(NonPrintableKey::AudioVolumeUp),
143 _ => None,
144 }
145 .map(|k| KeyMeaning::NonPrintableKey(k))
146 }
147
148 pub fn apply(
150 &self,
151 key: Key,
152 modifier_state: &impl ModifierChecker,
153 lock_state: &impl LockStateChecker,
154 ) -> Option<KeyMeaning> {
155 let hid_usage = usages::input3_key_to_hid_usage(key);
156
157 self.hid_usage_to_code_point(hid_usage, modifier_state, lock_state)
160 .ok()
161 .and_then(|v| if v == EMPTY_CODEPOINT { None } else { Some(v) })
162 .map(KeyMeaning::Codepoint)
163 .or_else(|| self.try_into_nonprintable(key))
164 .or_else(|| {
165 debug!(
166 key:?,
167 hid_usage:?,
168 modifiers:? = modifier_state,
169 lock_state:?;
170 "keymaps::Keymap::apply: no KeyMeaning"
171 );
172 None
173 })
174 }
175
176 pub fn hid_usage_to_code_point(
180 &self,
181 hid_usage: u32,
182 modifier_state: &impl ModifierChecker,
183 lock_state: &impl LockStateChecker,
184 ) -> Result<u32> {
185 if (hid_usage as usize) < self.map.len() {
186 if let Some(ref map_entry) = self.map[hid_usage as usize] {
187 map_entry
188 .get_key(modifier_state, lock_state)
189 .map(|c| c as u32)
190 .ok_or_else(|| format_err!("Invalid USB HID code: {:?}", hid_usage))
191 } else {
192 Ok(EMPTY_CODEPOINT) }
194 } else {
195 Ok(EMPTY_CODEPOINT) }
197 }
198
199 pub fn hid_usage_to_code_point_for_mods(
200 &self,
201 hid_usage: u32,
202 shift: bool,
203 caps_lock: bool,
204 ) -> Option<u32> {
205 let modifier_state = ModifierState::new()
206 .with_if(Modifiers::LEFT_SHIFT, shift)
207 .with_if(Modifiers::RIGHT_SHIFT, shift);
208 let lock_state = LockStateKeys::new().with_if(LockState::CAPS_LOCK, caps_lock);
209 let code_point = self.hid_usage_to_code_point(hid_usage, &modifier_state, &lock_state);
210 match code_point {
211 Ok(EMPTY_CODEPOINT) => None,
212 Ok(c) => Some(c),
213 Err(_) => None,
214 }
215 }
216}
217
218pub trait ModifierChecker: std::fmt::Debug {
220 fn test(&self, value: Modifiers) -> bool;
221}
222
223#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
228pub struct ModifierState {
229 state: Modifiers,
231}
232
233impl Default for ModifierState {
234 fn default() -> Self {
235 Self { state: Modifiers::empty() }
236 }
237}
238
239impl ModifierChecker for ModifierState {
240 fn test(&self, value: Modifiers) -> bool {
242 self.state.contains(value)
243 }
244}
245
246impl ModifierState {
247 pub fn new() -> Self {
250 Default::default()
251 }
252
253 pub fn with(self, value: Modifiers) -> Self {
258 let mut state = self.state;
259 state.insert(value);
260
261 match value {
263 Modifiers::LEFT_SHIFT | Modifiers::RIGHT_SHIFT => {
264 state.insert(Modifiers::SHIFT);
265 }
266 Modifiers::LEFT_ALT | Modifiers::RIGHT_ALT => {
267 state.insert(Modifiers::ALT);
268 }
269 Modifiers::LEFT_META | Modifiers::RIGHT_META => {
270 state.insert(Modifiers::META);
271 }
272 Modifiers::LEFT_CTRL | Modifiers::RIGHT_CTRL => {
273 state.insert(Modifiers::CTRL);
274 }
275 _ => {}
276 }
277 Self { state }
278 }
279
280 pub fn get_state(&self) -> Modifiers {
282 self.state.clone()
283 }
284
285 pub fn with_if(self, value: Modifiers, set: bool) -> Self {
290 match set {
291 false => self,
292 true => self.with(value),
293 }
294 }
295
296 pub fn update(&mut self, event: KeyEventType, key: Key) {
298 match event {
299 KeyEventType::Pressed | KeyEventType::Sync => match key {
302 Key::CapsLock => self.state.insert(Modifiers::CAPS_LOCK),
303 Key::NumLock => self.state.insert(Modifiers::NUM_LOCK),
304 Key::ScrollLock => self.state.insert(Modifiers::SCROLL_LOCK),
305 Key::LeftShift => {
312 self.state.insert(Modifiers::LEFT_SHIFT | Modifiers::SHIFT);
313 }
314 Key::RightShift => {
315 self.state.insert(Modifiers::RIGHT_SHIFT | Modifiers::SHIFT);
316 }
317 Key::LeftAlt => {
318 self.state.insert(Modifiers::LEFT_ALT | Modifiers::ALT);
319 }
320 Key::RightAlt => {
321 self.state.insert(Modifiers::RIGHT_ALT | Modifiers::ALT);
322 }
323 Key::LeftMeta => {
324 self.state.insert(Modifiers::LEFT_META | Modifiers::META);
325 }
326 Key::RightMeta => {
327 self.state.insert(Modifiers::RIGHT_META | Modifiers::META);
328 }
329 Key::LeftCtrl => {
330 self.state.insert(Modifiers::LEFT_CTRL | Modifiers::CTRL);
331 }
332 Key::RightCtrl => {
333 self.state.insert(Modifiers::RIGHT_CTRL | Modifiers::CTRL);
334 }
335 _ => {}
336 },
337 KeyEventType::Released | KeyEventType::Cancel => match key {
340 Key::CapsLock => {
341 self.state.remove(Modifiers::CAPS_LOCK);
342 }
343 Key::NumLock => self.state.remove(Modifiers::NUM_LOCK),
344 Key::ScrollLock => self.state.remove(Modifiers::SCROLL_LOCK),
345
346 Key::LeftShift => {
347 self.state.remove(Modifiers::LEFT_SHIFT);
348 if !self.state.contains(Modifiers::RIGHT_SHIFT) {
349 self.state.remove(Modifiers::SHIFT);
350 }
351 }
352 Key::RightShift => {
353 self.state.remove(Modifiers::RIGHT_SHIFT);
354 if !self.test(Modifiers::LEFT_SHIFT) {
355 self.state.remove(Modifiers::SHIFT);
356 }
357 }
358 Key::LeftAlt => {
359 self.state.remove(Modifiers::LEFT_ALT);
360 if !self.state.contains(Modifiers::RIGHT_ALT) {
361 self.state.remove(Modifiers::ALT);
362 }
363 }
364 Key::RightAlt => {
365 self.state.remove(Modifiers::RIGHT_ALT);
366 if !self.test(Modifiers::LEFT_ALT) {
367 self.state.remove(Modifiers::ALT);
368 }
369 }
370 Key::LeftMeta => {
371 self.state.remove(Modifiers::LEFT_META);
372 if !self.state.contains(Modifiers::RIGHT_META) {
373 self.state.remove(Modifiers::META);
374 }
375 }
376 Key::RightMeta => {
377 self.state.remove(Modifiers::RIGHT_META);
378 if !self.test(Modifiers::LEFT_META) {
379 self.state.remove(Modifiers::META);
380 }
381 }
382 Key::LeftCtrl => {
383 self.state.remove(Modifiers::LEFT_CTRL);
384 if !self.state.contains(Modifiers::RIGHT_CTRL) {
385 self.state.remove(Modifiers::CTRL);
386 }
387 }
388 Key::RightCtrl => {
389 self.state.remove(Modifiers::RIGHT_CTRL);
390 if !self.test(Modifiers::LEFT_CTRL) {
391 self.state.remove(Modifiers::CTRL);
392 }
393 }
394 _ => {}
395 },
396 }
397 }
398
399 pub fn update_with_key_meaning(&mut self, event: KeyEventType, key_meaning: KeyMeaning) {
401 match event {
402 KeyEventType::Pressed | KeyEventType::Sync => match key_meaning {
403 KeyMeaning::NonPrintableKey(NonPrintableKey::AltGraph) => {
404 self.state.insert(Modifiers::ALT_GRAPH)
405 }
406 _ => {}
407 },
408 KeyEventType::Released | KeyEventType::Cancel => match key_meaning {
409 KeyMeaning::NonPrintableKey(NonPrintableKey::AltGraph) => {
410 self.state.remove(Modifiers::ALT_GRAPH)
411 }
412 _ => {}
413 },
414 }
415 }
416}
417
418#[derive(Debug, Hash)]
420enum State {
421 LockPressed,
423 LockPressedAndReleased,
425 LockPressedSecondTime,
427}
428
429pub trait LockStateChecker: std::fmt::Debug {
431 fn test(&self, value: LockState) -> bool;
432}
433
434#[derive(Debug)]
449pub struct LockStateKeys {
450 state: HashMap<LockState, State>,
451}
452
453impl Default for LockStateKeys {
454 fn default() -> Self {
455 LockStateKeys { state: HashMap::new() }
456 }
457}
458
459impl LockStateChecker for LockStateKeys {
460 fn test(&self, value: LockState) -> bool {
462 self.state.contains_key(&value)
463 }
464}
465
466impl LockStateKeys {
467 pub fn new() -> Self {
470 Default::default()
471 }
472
473 pub fn with(self, value: LockState) -> Self {
477 let mut state = self.state;
478 state.insert(value, State::LockPressedAndReleased);
479 Self { state }
480 }
481
482 pub fn with_if(self, value: LockState, set: bool) -> Self {
487 match set {
488 false => self,
489 true => self.with(value),
490 }
491 }
492
493 pub fn update(&mut self, event: KeyEventType, key: Key) {
495 let lock_key = match key {
496 Key::CapsLock => LockState::CAPS_LOCK,
497 Key::NumLock => LockState::NUM_LOCK,
498 Key::ScrollLock => LockState::SCROLL_LOCK,
499 _ => LockState::from_bits_allow_unknown(0),
503 };
504 if lock_key == LockState::from_bits_allow_unknown(0) {
505 return;
506 }
507 let lock_state = self.state.get(&lock_key);
508 match (event, lock_state) {
509 (KeyEventType::Pressed, None) => {
510 self.state.insert(lock_key, State::LockPressed);
511 }
512 (KeyEventType::Pressed, Some(State::LockPressedAndReleased)) => {
513 self.state.insert(lock_key, State::LockPressedSecondTime);
514 }
515 (KeyEventType::Released, Some(State::LockPressed)) => {
516 self.state.insert(lock_key, State::LockPressedAndReleased);
517 }
518 (KeyEventType::Released, Some(State::LockPressedSecondTime)) => {
519 self.state.remove(&lock_key);
520 }
521
522 (KeyEventType::Pressed, Some(State::LockPressed))
524 | (KeyEventType::Pressed, Some(State::LockPressedSecondTime))
525 | (KeyEventType::Released, None)
526 | (KeyEventType::Released, Some(State::LockPressedAndReleased)) => {
527 error!(event:?, key:?, state:? = self.state; "unexpected state transition");
528 }
529
530 (_, __) => {}
532 }
533 }
534
535 pub fn get_state(&self) -> LockState {
537 self.state
538 .keys()
539 .map(|k| k.clone())
540 .fold(LockState::from_bits_allow_unknown(0), |acc, k| acc | k)
541 }
542}
543
544#[derive(Debug, Clone, Default)]
554pub struct KeyState {
555 ordinal_to_key: collections::BTreeMap<u64, Key>,
560 key_to_ordinal: collections::HashMap<Key, u64>,
564 next_ordinal: u64,
569}
570
571impl KeyState {
572 pub fn new() -> Self {
574 KeyState {
575 next_ordinal: 0,
576 key_to_ordinal: collections::HashMap::new(),
577 ordinal_to_key: collections::BTreeMap::new(),
578 }
579 }
580
581 pub fn update(&mut self, event: KeyEventType, key: Key) {
583 match event {
584 KeyEventType::Pressed | KeyEventType::Sync => {
585 if let None = self.key_to_ordinal.insert(key, self.next_ordinal) {
586 self.ordinal_to_key.insert(self.next_ordinal, key);
589 self.next_ordinal = self.next_ordinal + 1;
590 }
591 }
592 KeyEventType::Released | KeyEventType::Cancel => {
593 if let Some(ordinal) = self.key_to_ordinal.remove(&key) {
594 self.ordinal_to_key.remove_entry(&ordinal);
595 }
596 if self.key_to_ordinal.is_empty() {
598 assert!(self.ordinal_to_key.is_empty());
599 self.next_ordinal = 0;
600 }
601 }
602 }
603 }
604
605 pub fn is_pressed(&self, key: &Key) -> bool {
607 self.key_to_ordinal.contains_key(key)
608 }
609
610 pub fn pressed_any(&self, keys: &[Key]) -> bool {
612 keys.iter().any(|k| self.is_pressed(k))
613 }
614
615 pub fn pressed_all(&self, keys: &[Key]) -> bool {
617 keys.iter().all(|k| self.is_pressed(k))
618 }
619
620 pub fn get_set(&self) -> collections::BTreeSet<Key> {
622 let mut ret = collections::BTreeSet::new();
623 let _k = self.key_to_ordinal.keys().for_each(|k| {
624 ret.insert(*k);
625 });
626 ret
627 }
628
629 pub fn get_ordered_keys(&self) -> Vec<Key> {
632 self.ordinal_to_key.iter().map(|(_, key)| *key).collect()
634 }
635
636 pub fn clear(&mut self) {
638 self.next_ordinal = 0;
639 self.ordinal_to_key.clear();
640 self.key_to_ordinal.clear();
641 }
642}
643
644#[cfg(test)]
645mod tests {
646 use super::*;
647 use test_case::test_case;
648
649 const HID_USAGE_KEY_A: u32 = 0x04;
650 const HID_USAGE_KEY_1: u32 = 0x1e;
651
652 #[test]
654 fn caps_lock_effect() -> Result<()> {
655 assert_eq!(
656 '1' as u32,
657 US_QWERTY.hid_usage_to_code_point(
658 HID_USAGE_KEY_1,
659 &ModifierState::new(),
660 &LockStateKeys::new().with(LockState::CAPS_LOCK),
661 )?
662 );
663 assert_eq!(
664 '!' as u32,
665 US_QWERTY.hid_usage_to_code_point(
666 HID_USAGE_KEY_1,
667 &ModifierState::new().with(Modifiers::LEFT_SHIFT),
668 &LockStateKeys::new(),
669 )?
670 );
671 Ok(())
672 }
673
674 #[test]
675 fn spotcheck_us_qwerty_keymap() -> Result<()> {
676 assert_eq!(
677 'a' as u32,
678 US_QWERTY.hid_usage_to_code_point(
679 HID_USAGE_KEY_A,
680 &ModifierState::new(),
681 &LockStateKeys::new(),
682 )?
683 );
684 assert_eq!(
685 'a' as u32,
686 US_QWERTY.hid_usage_to_code_point(
687 HID_USAGE_KEY_A,
688 &ModifierState::new().with(Modifiers::CAPS_LOCK),
689 &LockStateKeys::new(),
690 )?
691 );
692 assert_eq!(
693 'A' as u32,
694 US_QWERTY.hid_usage_to_code_point(
695 HID_USAGE_KEY_A,
696 &ModifierState::new(),
697 &LockStateKeys::new().with(LockState::CAPS_LOCK),
698 )?
699 );
700 assert_eq!(
701 'A' as u32,
702 US_QWERTY.hid_usage_to_code_point(
703 HID_USAGE_KEY_A,
704 &ModifierState::new().with(Modifiers::RIGHT_SHIFT),
705 &LockStateKeys::new(),
706 )?
707 );
708 assert_eq!(
709 'A' as u32,
710 US_QWERTY.hid_usage_to_code_point(
711 HID_USAGE_KEY_A,
712 &ModifierState::new().with(Modifiers::LEFT_SHIFT),
713 &LockStateKeys::new(),
714 )?
715 );
716 Ok(())
717 }
718
719 #[test_case(Key::CapsLock, Modifiers::CAPS_LOCK; "CapsLock")]
722 #[test_case(Key::NumLock, Modifiers::NUM_LOCK; "NumLock")]
723 #[test_case(Key::ScrollLock, Modifiers::SCROLL_LOCK; "ScrollLock")]
724 #[test_case(Key::RightShift, Modifiers::RIGHT_SHIFT|Modifiers::SHIFT; "RightShift")]
729 #[test_case(Key::LeftShift, Modifiers::LEFT_SHIFT|Modifiers::SHIFT; "LeftShift")]
730 #[test_case(Key::RightAlt, Modifiers::RIGHT_ALT|Modifiers::ALT; "RightAlt")]
731 #[test_case(Key::LeftAlt, Modifiers::LEFT_ALT|Modifiers::ALT; "LeftAlt")]
732 #[test_case(Key::RightMeta, Modifiers::RIGHT_META|Modifiers::META; "RightMeta")]
733 #[test_case(Key::LeftMeta, Modifiers::LEFT_META|Modifiers::META; "LeftMeta")]
734 #[test_case(Key::RightCtrl, Modifiers::RIGHT_CTRL|Modifiers::CTRL; "RightCtrl")]
735 #[test_case(Key::LeftCtrl, Modifiers::LEFT_CTRL|Modifiers::CTRL; "LeftCtrl")]
736 fn test_caps_lock_modifier(key: Key, modifier: Modifiers) {
737 let mut modifier_state: ModifierState = Default::default();
738 assert!(!modifier_state.test(modifier));
739
740 modifier_state.update(KeyEventType::Pressed, key);
741 assert!(modifier_state.test(modifier));
742
743 modifier_state.update(KeyEventType::Released, key);
744 assert!(!modifier_state.test(modifier));
745
746 modifier_state.update(KeyEventType::Pressed, key);
747 assert!(modifier_state.test(modifier));
748
749 modifier_state.update(KeyEventType::Released, key);
750 assert!(!modifier_state.test(modifier));
751 }
752
753 #[test_case(Key::LeftShift, Key::RightShift, Modifiers::SHIFT; "Shift/LR")]
765 #[test_case(Key::RightShift, Key::LeftShift, Modifiers::SHIFT; "Shift/RL")]
766 #[test_case(Key::LeftAlt, Key::RightAlt, Modifiers::ALT; "Alt/LR")]
767 #[test_case(Key::RightAlt, Key::LeftAlt, Modifiers::ALT; "Alt/RL")]
768 #[test_case(Key::LeftMeta, Key::RightMeta, Modifiers::META; "Meta/LR")]
769 #[test_case(Key::RightMeta, Key::LeftMeta, Modifiers::META; "Meta/RL")]
770 #[test_case(Key::RightCtrl, Key::LeftCtrl, Modifiers::CTRL; "Ctrl/RL")]
771 #[test_case(Key::LeftCtrl, Key::RightCtrl, Modifiers::CTRL; "Ctrl/LR")]
772 fn test_sided_keys(key_a: Key, key_b: Key, modifier: Modifiers) {
773 let mut modifier_state = ModifierState::new();
774 assert!(
775 !modifier_state.test(modifier),
776 "state: {:?}, key_a: {:?}, key_b: {:?}",
777 &modifier_state,
778 &key_a,
779 &key_b
780 );
781
782 modifier_state.update(KeyEventType::Pressed, key_a);
783 assert!(
784 modifier_state.test(modifier),
785 "state: {:?}, key_a: {:?}, key_b: {:?}",
786 &modifier_state,
787 &key_a,
788 &key_b
789 );
790
791 modifier_state.update(KeyEventType::Pressed, key_b);
792 assert!(
793 modifier_state.test(modifier),
794 "state: {:?}, key_a: {:?}, key_b: {:?}",
795 &modifier_state,
796 &key_a,
797 &key_b
798 );
799
800 modifier_state.update(KeyEventType::Released, key_a);
801 assert!(
802 modifier_state.test(modifier),
803 "state: {:?}, key_a: {:?}, key_b: {:?}",
804 &modifier_state,
805 &key_a,
806 &key_b
807 );
808
809 modifier_state.update(KeyEventType::Released, key_b);
810 assert!(
811 !modifier_state.test(modifier),
812 "state: {:?}, key_a: {:?}, key_b: {:?}",
813 &modifier_state,
814 &key_a,
815 &key_b
816 );
817 }
818
819 #[test_case(Key::CapsLock, LockState::CAPS_LOCK; "CapsLock")]
824 #[test_case(Key::NumLock, LockState::NUM_LOCK; "NumLock")]
825 #[test_case(Key::ScrollLock, LockState::SCROLL_LOCK; "ScrollLock")]
826 fn test_lock_state(key: Key, lock_state: LockState) {
827 let mut state: LockStateKeys = Default::default();
828 assert!(!state.test(lock_state));
829 assert_eq!(state.get_state(), LockState::from_bits_allow_unknown(0));
830
831 state.update(KeyEventType::Pressed, key);
832 assert!(state.test(lock_state), "{:?}", state.get_state());
833 assert_eq!(state.get_state(), lock_state);
834
835 state.update(KeyEventType::Released, key);
836 assert!(state.test(lock_state), "{:?}", state.get_state());
837 assert_eq!(state.get_state(), lock_state);
838
839 state.update(KeyEventType::Pressed, key);
840 assert!(state.test(lock_state), "{:?}", state.get_state());
841 assert_eq!(state.get_state(), lock_state);
842
843 state.update(KeyEventType::Released, key);
844 assert!(!state.test(lock_state), "{:?}", state.get_state());
845 assert_eq!(state.get_state(), LockState::from_bits_allow_unknown(0));
846 }
847
848 #[test]
849 fn test_modifier_tracker() {
850 let mut modifier_state: ModifierState = Default::default();
851 assert!(!modifier_state.test(Modifiers::SHIFT));
852
853 modifier_state.update(KeyEventType::Pressed, Key::LeftShift);
854 assert!(modifier_state.test(Modifiers::SHIFT));
855 modifier_state.update(KeyEventType::Released, Key::LeftShift);
856 assert!(!modifier_state.test(Modifiers::SHIFT));
857
858 modifier_state.update(KeyEventType::Pressed, Key::RightShift);
859 assert!(modifier_state.test(Modifiers::SHIFT));
860 modifier_state.update(KeyEventType::Released, Key::RightShift);
861 assert!(!modifier_state.test(Modifiers::SHIFT));
862
863 modifier_state.update(KeyEventType::Pressed, Key::CapsLock);
864 assert!(!modifier_state.test(Modifiers::SHIFT));
865 assert!(modifier_state.test(Modifiers::CAPS_LOCK));
866 modifier_state.update(KeyEventType::Released, Key::CapsLock);
867 assert!(!modifier_state.test(Modifiers::SHIFT));
868 assert!(!modifier_state.test(Modifiers::CAPS_LOCK));
869 modifier_state.update(KeyEventType::Pressed, Key::CapsLock);
870 assert!(!modifier_state.test(Modifiers::SHIFT));
871 assert!(modifier_state.test(Modifiers::CAPS_LOCK));
872 modifier_state.update(KeyEventType::Released, Key::CapsLock);
873 assert!(!modifier_state.test(Modifiers::SHIFT));
874 assert!(!modifier_state.test(Modifiers::CAPS_LOCK));
875 }
876
877 #[test]
878 fn test_key_meaning_modifier_tracker() {
879 let mut modifier_state: ModifierState = Default::default();
880 assert!(!modifier_state.test(Modifiers::ALT_GRAPH));
881
882 modifier_state.update_with_key_meaning(
883 KeyEventType::Pressed,
884 KeyMeaning::NonPrintableKey(NonPrintableKey::AltGraph),
885 );
886 assert!(modifier_state.test(Modifiers::ALT_GRAPH));
887 modifier_state.update_with_key_meaning(
888 KeyEventType::Released,
889 KeyMeaning::NonPrintableKey(NonPrintableKey::AltGraph),
890 );
891 assert!(!modifier_state.test(Modifiers::ALT_GRAPH));
892 }
893
894 #[test]
899 fn test_interleaved_caps_lock_and_shift() {
900 let mut modifier_state: ModifierState = Default::default();
901 assert!(!modifier_state.test(Modifiers::SHIFT));
902
903 modifier_state.update(KeyEventType::Pressed, Key::CapsLock);
904 assert!(!modifier_state.test(Modifiers::SHIFT));
905 assert!(modifier_state.test(Modifiers::CAPS_LOCK));
906
907 modifier_state.update(KeyEventType::Pressed, Key::LeftShift);
908 assert!(modifier_state.test(Modifiers::SHIFT));
909 assert!(modifier_state.test(Modifiers::CAPS_LOCK));
910
911 modifier_state.update(KeyEventType::Released, Key::CapsLock);
912 assert!(modifier_state.test(Modifiers::SHIFT));
913 assert!(!modifier_state.test(Modifiers::CAPS_LOCK));
914
915 modifier_state.update(KeyEventType::Released, Key::LeftShift);
916 assert!(!modifier_state.test(Modifiers::SHIFT));
918 assert!(!modifier_state.test(Modifiers::CAPS_LOCK));
919
920 modifier_state.update(KeyEventType::Pressed, Key::CapsLock);
922 assert!(!modifier_state.test(Modifiers::SHIFT));
923 assert!(modifier_state.test(Modifiers::CAPS_LOCK));
924
925 modifier_state.update(KeyEventType::Released, Key::CapsLock);
926 assert!(!modifier_state.test(Modifiers::SHIFT));
927 assert!(!modifier_state.test(Modifiers::CAPS_LOCK));
928 }
929
930 #[test]
931 fn key_state_tracker() {
932 let mut t = KeyState::new();
933 assert_eq!(false, t.is_pressed(&Key::Space));
934 t.update(KeyEventType::Pressed, Key::Space);
935 assert_eq!(true, t.is_pressed(&Key::Space));
936
937 t.update(KeyEventType::Released, Key::Space);
938
939 assert_eq!(false, t.is_pressed(&Key::Space));
940
941 t.update(KeyEventType::Sync, Key::Space);
942 assert_eq!(true, t.is_pressed(&Key::Space));
943
944 t.update(KeyEventType::Cancel, Key::Space);
945 assert_eq!(false, t.is_pressed(&Key::Space));
946 }
947
948 #[test]
949 fn key_state_tracker_any_and_all() {
950 let mut t = KeyState::new();
951
952 assert_eq!(false, t.pressed_any(&vec![]));
953 assert_eq!(true, t.pressed_all(&vec![]));
954
955 t.update(KeyEventType::Pressed, Key::Space);
956 t.update(KeyEventType::Pressed, Key::Tab);
957
958 assert_eq!(true, t.pressed_any(&vec![Key::LeftShift, Key::Space,]));
959 assert_eq!(false, t.pressed_any(&vec![Key::RightShift, Key::LeftShift]));
960 assert_eq!(true, t.pressed_all(&vec![Key::Space,]));
961 assert_eq!(true, t.pressed_all(&vec![Key::Space, Key::Tab,]));
962
963 let keys = t.get_set();
964 assert_eq!(true, t.pressed_all(&vec![Key::Space, Key::Tab,]));
965
966 let mut expected = collections::BTreeSet::new();
967 expected.insert(Key::Space);
968 expected.insert(Key::Tab);
969 assert_eq!(keys, expected, "want: {:?} was: {:?}", &expected, &keys);
970 }
971
972 #[test_case(
973 &US_QWERTY,
974 Key::A,
975 ModifierState::new(),
976 LockStateKeys::new(),
977 Some(KeyMeaning::Codepoint(97));
978 "test basic mapping")
979 ]
980 #[test_case(
981 &US_QWERTY,
982 Key::A,
983 ModifierState::new().with(Modifiers::LEFT_SHIFT),
984 LockStateKeys::new(),
985 Some(KeyMeaning::Codepoint(65));
986 "test basic mapping - capital letter")
987 ]
988 #[test_case(
989 &US_QWERTY,
990 Key::RightAlt,
991 ModifierState::new(),
992 LockStateKeys::new(),
993 Some(KeyMeaning::NonPrintableKey(NonPrintableKey::Alt));
994 "test US QWERTY right Alt mapping")
995 ]
996 #[test_case(
997 &US_QWERTY,
998 Key::AcFullScreenView,
999 ModifierState::new(),
1000 LockStateKeys::new(),
1001 Some(KeyMeaning::NonPrintableKey(NonPrintableKey::ZoomToggle));
1002 "Spot check multimedia keys")
1003 ]
1004 #[test_case(
1005 &US_QWERTY,
1006 Key::Tab,
1007 ModifierState::new(),
1008 LockStateKeys::new(),
1009 Some(KeyMeaning::NonPrintableKey(NonPrintableKey::Tab));
1010 "Tab")
1011 ]
1012 #[test_case(
1013 &US_QWERTY,
1014 Key::Enter,
1015 ModifierState::new(),
1016 LockStateKeys::new(),
1017 Some(KeyMeaning::NonPrintableKey(NonPrintableKey::Enter));
1018 "Enter")
1019 ]
1020 #[test_case(
1021 &US_QWERTY,
1022 Key::Backspace,
1023 ModifierState::new(),
1024 LockStateKeys::new(),
1025 Some(KeyMeaning::NonPrintableKey(NonPrintableKey::Backspace));
1026 "Backspace")
1027 ]
1028 fn test_keymap_apply(
1029 keymap: &Keymap<'_>,
1030 key: Key,
1031 modifier_state: ModifierState,
1032 lock_state: LockStateKeys,
1033 expected: Option<KeyMeaning>,
1034 ) {
1035 let actual = keymap.apply(key, &modifier_state, &lock_state);
1036 assert_eq!(expected, actual, "expected: {:?}, actual: {:?}", expected, actual);
1037 }
1038
1039 #[test_case(
1040 Key::AcBack,
1041 KeyMeaning::NonPrintableKey(NonPrintableKey::BrowserBack);
1042 "BrowserBack"
1043 )
1044 ]
1045 #[test_case(
1046 Key::AcRefresh,
1047 KeyMeaning::NonPrintableKey(NonPrintableKey::BrowserRefresh);
1048 "BrowserRefresh"
1049 )
1050 ]
1051 #[test_case(
1052 Key::AcFullScreenView,
1053 KeyMeaning::NonPrintableKey(NonPrintableKey::ZoomToggle);
1054 "ZoomToggle"
1055 )
1056 ]
1057 #[test_case(
1058 Key::AcSelectTaskApplication,
1059 KeyMeaning::NonPrintableKey(NonPrintableKey::Select);
1060 "Select"
1061 )
1062 ]
1063 #[test_case(
1064 Key::BrightnessDown,
1065 KeyMeaning::NonPrintableKey(NonPrintableKey::BrightnessDown);
1066 "BrightnessDown"
1067 )
1068 ]
1069 #[test_case(
1070 Key::BrightnessUp,
1071 KeyMeaning::NonPrintableKey(NonPrintableKey::BrightnessUp);
1072 "BrightnessUp"
1073 )
1074 ]
1075 #[test_case(
1076 Key::PlayPause,
1077 KeyMeaning::NonPrintableKey(NonPrintableKey::MediaPlayPause);
1078 "MediaPlayPause"
1079 )
1080 ]
1081 #[test_case(
1082 Key::Mute,
1083 KeyMeaning::NonPrintableKey(NonPrintableKey::AudioVolumeMute);
1084 "AudioVolumeMute"
1085 )
1086 ]
1087 #[test_case(
1088 Key::VolumeUp,
1089 KeyMeaning::NonPrintableKey(NonPrintableKey::AudioVolumeUp);
1090 "AudioVolumeUp"
1091 )
1092 ]
1093 #[test_case(
1094 Key::VolumeDown,
1095 KeyMeaning::NonPrintableKey(NonPrintableKey::AudioVolumeDown);
1096 "AudioVolumeDown"
1097 )
1098 ]
1099 #[test_case(
1100 Key::Escape,
1101 KeyMeaning::NonPrintableKey(NonPrintableKey::Escape);
1102 "Escape"
1103 )
1104 ]
1105 #[test_case(
1106 Key::Enter,
1107 KeyMeaning::NonPrintableKey(NonPrintableKey::Enter);
1108 "Enter"
1109 )
1110 ]
1111 #[test_case(
1112 Key::Tab,
1113 KeyMeaning::NonPrintableKey(NonPrintableKey::Tab);
1114 "Tab"
1115 )
1116 ]
1117 #[test_case(
1118 Key::Backspace,
1119 KeyMeaning::NonPrintableKey(NonPrintableKey::Backspace);
1120 "Backspace"
1121 )
1122 ]
1123 fn spot_check_key_meanings(key: Key, expected: KeyMeaning) {
1124 let actual = US_QWERTY.apply(key, &ModifierState::new(), &LockStateKeys::new());
1125 assert_eq!(Some(expected), actual);
1126 }
1127
1128 #[test]
1140 fn key_ordering() {
1141 let mut t = KeyState::new();
1142
1143 t.update(KeyEventType::Pressed, Key::C);
1144 t.update(KeyEventType::Pressed, Key::A);
1145 t.update(KeyEventType::Pressed, Key::B);
1146 t.update(KeyEventType::Pressed, Key::D);
1147 t.update(KeyEventType::Pressed, Key::A);
1149
1150 t.update(KeyEventType::Released, Key::B);
1151
1152 assert_eq!(vec![Key::C, Key::A, Key::D], t.get_ordered_keys());
1153
1154 t.clear();
1155 let expected: Vec<Key> = vec![];
1156 assert_eq!(expected, t.get_ordered_keys());
1157 }
1158
1159 #[test]
1160 fn key_ordering_with_reset() {
1161 let mut t = KeyState::new();
1162
1163 t.update(KeyEventType::Pressed, Key::A);
1164 t.update(KeyEventType::Pressed, Key::B);
1165 t.update(KeyEventType::Released, Key::B);
1166 t.update(KeyEventType::Released, Key::A);
1167
1168 let expected: Vec<Key> = vec![];
1169 assert_eq!(expected, t.get_ordered_keys());
1170
1171 t.update(KeyEventType::Pressed, Key::C);
1172
1173 assert_eq!(vec![Key::C], t.get_ordered_keys());
1174
1175 t.update(KeyEventType::Pressed, Key::A);
1176
1177 assert_eq!(vec![Key::C, Key::A], t.get_ordered_keys());
1178 }
1179
1180 #[test]
1181 fn key_ordering_misuse() {
1182 let mut t = KeyState::new();
1183
1184 t.update(KeyEventType::Released, Key::B);
1185 t.update(KeyEventType::Pressed, Key::A);
1186 t.update(KeyEventType::Released, Key::A);
1187
1188 let expected: Vec<Key> = vec![];
1189 assert_eq!(expected, t.get_ordered_keys());
1190
1191 t.update(KeyEventType::Pressed, Key::C);
1192
1193 assert_eq!(vec![Key::C], t.get_ordered_keys());
1194
1195 t.update(KeyEventType::Pressed, Key::A);
1196
1197 assert_eq!(vec![Key::C, Key::A], t.get_ordered_keys());
1198
1199 t.update(KeyEventType::Pressed, Key::A);
1200 t.update(KeyEventType::Pressed, Key::B);
1201 t.update(KeyEventType::Pressed, Key::C);
1202
1203 assert_eq!(vec![Key::C, Key::A, Key::B], t.get_ordered_keys());
1204 }
1205}