Skip to main content

keymaps/
lib.rs

1// Copyright 2019 The Fuchsia Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5use 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
18/// A US QWERTY keymap.
19pub static US_QWERTY: LazyLock<Keymap<'static>> = LazyLock::new(|| Keymap::new(&defs::QWERTY_MAP));
20
21/// Applies the US QWERTY keymap to the given key.
22pub 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
30/// Extracts key meaning in accordance with the Fuchsia key event API specification.
31///
32/// Key meaning is returned verbatim if defined; otherwise, the US QWERTY keymap is
33/// applied to the supplied `key` and the currently active modifiers and lock state.
34///
35/// These usually come from a `fidl.fuchsia.ui.input3/KeyEvent`, so you can simply
36/// pass its components in if you have one. But, a valid `KeyEvent` is not required,
37/// and the caller can fill each of the parameters at will.
38///
39/// If neither the key nor the key meaning are defined, an "unidentified"
40/// nonprintable key meaning is returned.
41pub 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        // Specification note: If key meaning is unset, then the key meaning
49        // must be recovered from the hardware key by applying the US_QWERTY
50        // keymap to the hardware key value, using the currently applicable
51        // modifier and lock state.
52        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
63/// A codepoint returned by [hid_usage_to_code_point] for HID usages that do
64/// not have an associated code point, e.g. Alt.
65pub(crate) const EMPTY_CODEPOINT: u32 = 0;
66
67/// A Us Qwerty keymap
68pub 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    /// Creates a new keymap.
80    fn new(map: &'a [Option<defs::KeyLevels>]) -> Self {
81        Keymap { map }
82    }
83
84    /// Attaches a fixed [KeyMeaning] to the given [Key] if one exists.
85    ///
86    /// These are mostly the default key meanings of keys on a US QWERTY keyboard.
87    /// As such, we must try the key to key meaning mapping coming from the keymap first,
88    /// to allow the keymap the option to move these keys around when this is desired.
89    ///
90    /// We do not really expect these to happen frequently in standardized keymaps,
91    /// but custom keymaps might do this (e.g. mapping Esc to CapsLock), and in
92    /// general we should avoid putting arbitrary constraints on key maps if such
93    /// are not necessary.
94    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            // Multimedia keys, UI keys, browser keys etc.
133            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    /// Applies the keymap to the given key.
149    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        // Try to apply the keymap first. Failing that, try fixed nonprintable
158        // keys.
159        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    /// Converts a HID usage for a key to a Unicode code point where such a code point exists, based on
177    /// a US QWERTY keyboard layout.  Returns EMPTY_CODEPOINT if a code point does not exist (e.g. Alt),
178    /// and an error in case the mapping somehow fails.
179    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) // No code point provided by a keymap, e.g. Enter.
193            }
194        } else {
195            Ok(EMPTY_CODEPOINT) // No code point available, e.g. Shift, Alt, etc.
196        }
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
218/// A trait for something that can be tested for modifier presence.
219pub trait ModifierChecker: std::fmt::Debug {
220    fn test(&self, value: Modifiers) -> bool;
221}
222
223/// Tracks the current state of "significant" modifier keys.
224///
225/// Currently, a modifier key is "significant" if it affects the mapping of a
226/// Fuchsia key to a key meaning.
227#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
228pub struct ModifierState {
229    /// The internal modifier state.
230    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    /// Test if the modifier state contains the modifiers from `value`.
241    fn test(&self, value: Modifiers) -> bool {
242        self.state.contains(value)
243    }
244}
245
246impl ModifierState {
247    /// Creates a new [ModifierState] initializes with the default state (no
248    /// modifiers are actuated).
249    pub fn new() -> Self {
250        Default::default()
251    }
252
253    /// Unconditionally adds the given modifier into the modifier state as
254    /// actuated.
255    ///
256    /// Returns `Self` for chaining.
257    pub fn with(self, value: Modifiers) -> Self {
258        let mut state = self.state;
259        state.insert(value);
260
261        // For "sided" modifiers, maintain the "side-less" bit invariant too.
262        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    /// Retrieves the modifier state.
281    pub fn get_state(&self) -> Modifiers {
282        self.state.clone()
283    }
284
285    /// Adds `modifier` into the modifier state as actuated, if `set` is true.
286    /// Otherwise makes no changes to [ModifierState].
287    ///
288    /// Returns `Self` for chaining.
289    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    /// Update the modifier tracker state with this event.
297    pub fn update(&mut self, event: KeyEventType, key: Key) {
298        match event {
299            // PRESSED event is a regular key press.
300            // SYNC event is an update to key presses after a focus regain.
301            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                // These modifiers are not defined in Key.
306                // Key::Function
307                // Key::Symbol
308
309                // For "sided" modifiers, we must also maintain the "side-less"
310                // bit. Here, and everywhere below.
311                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            // PRESSED event is a regular key release.
338            // CANCEL event is an update to key presses after a focus loss.
339            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    /// Update the modifier tracker with this event.
400    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// The state of each lock key.
419#[derive(Debug, Hash)]
420enum State {
421    // Lock was pressed.  (aka S1, see below)
422    LockPressed,
423    // Lock was pressed and released. (aka S2)
424    LockPressedAndReleased,
425    // Lock was pressed for the second time in a row.  (aka S3)
426    LockPressedSecondTime,
427}
428
429/// A lock state checker.
430pub trait LockStateChecker: std::fmt::Debug {
431    fn test(&self, value: LockState) -> bool;
432}
433
434/// The lock state of the lock keys.
435///
436/// Consult the state diagram below for the intended state transition.  The
437/// state encoding is given in [State].
438///
439/// ```ignore
440/// Key    """""""\_________/"""""""""""\_________/""""
441/// State  -------<    S1  ><     S2   ><    S3   >----
442/// ```
443///
444/// Any other state is not explicitly accounted for: the state of "the lock is
445/// not active" is encoded by not having a record of the key state.  This
446/// allows us to implement the state machine for an arbitrary number of lock
447/// keys.
448#[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    /// Returns true if the lock state value is set.
461    fn test(&self, value: LockState) -> bool {
462        self.state.contains_key(&value)
463    }
464}
465
466impl LockStateKeys {
467    /// Creates a new [LockStateKeys] initializes with the default state (no
468    /// modifiers are actuated).
469    pub fn new() -> Self {
470        Default::default()
471    }
472
473    /// Unconditionally adds the given lock state as actuated.
474    ///
475    /// Returns `Self` for chaining.
476    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    /// Adds `value` into the modifier state as actuated, if `set` is true.
483    /// Otherwise makes no changes to [LockStateKeys].
484    ///
485    /// Returns `Self` for chaining.
486    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    /// Update the modifier tracker state with this event.
494    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            // FUNCTION_LOCK
500            // SYMBOL_LOCK
501            // etc.
502            _ => 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            // These should not happen.
523            (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            // SYNC and CANCEL don't change the lock state.
531            (_, __) => {}
532        }
533    }
534
535    /// Gets the recorded lock state.
536    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/// Tracks the current state of all the keyboard keys.
545///
546/// This is repetitive code, so perhaps better handle it here.  You can feed
547/// the keyboard events into its [KeyState::update] method.
548///
549/// [KeyState] keeps track of the ordering the keys were pressed, and you can
550/// call [KeyState::get_ordered_keys] to get a sequence of currently pressed
551/// keys, in the order they were pressed.  This is useful for emitting keyboard
552/// events that must happen in a very particular ordering.
553#[derive(Debug, Clone, Default)]
554pub struct KeyState {
555    // Using BTreeSet for deterministic key iteration ordering.
556    /// A collection that predictably iterates over all the keys in the order
557    /// they were pressed.
558    // Must iterate through key-value pairs in the order of increasing keys.
559    ordinal_to_key: collections::BTreeMap<u64, Key>,
560    /// Backwards map for quickly finding the ordinal of a specific key.
561    // A bidirectional map could work here, but we don't use one yet on Fuchsia,
562    // avoiding a new dependency with two maps.
563    key_to_ordinal: collections::HashMap<Key, u64>,
564    /// The next new pressed key will get this ordinal.
565    // The ordinal increments with each unique key, but is reset back to zero
566    // when no keys are pressed.  This should be enough to not overflow in any
567    // realistic scenarios.
568    next_ordinal: u64,
569}
570
571impl KeyState {
572    /// Creates a new [KeyState]
573    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    /// Updates the key tracking state with the given key event pair.
582    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                    // Only if the inserted key was not in the set of pressed
587                    // keys.
588                    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 no keys remain in the pressed set, reset the ordinal.
597                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    /// Returns true if `key` is noted as pressed.
606    pub fn is_pressed(&self, key: &Key) -> bool {
607        self.key_to_ordinal.contains_key(key)
608    }
609
610    /// Returns `true` if at least one key from `keys` is pressed.
611    pub fn pressed_any(&self, keys: &[Key]) -> bool {
612        keys.iter().any(|k| self.is_pressed(k))
613    }
614
615    /// Returns `true` if all keys from `keys` are pressed.
616    pub fn pressed_all(&self, keys: &[Key]) -> bool {
617        keys.iter().all(|k| self.is_pressed(k))
618    }
619
620    /// Gets all the keys from the set.
621    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    /// Gets the list of all currently pressed keys, in the order they were
630    /// pressed.
631    pub fn get_ordered_keys(&self) -> Vec<Key> {
632        // Iteration MUST produce keys in a strictly increasing sequence.
633        self.ordinal_to_key.iter().map(|(_, key)| *key).collect()
634    }
635
636    /// Clears the state of [Self], and expunges any stored key presses.
637    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    // The effects of Shift and CapsLock on keys are different for non-letters.
653    #[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    // CapsLock ______/""""""""\_______/"""""""""\_______
720    // Modifier ______/""""""""\_______/"""""""""\______
721    #[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    // Key::Function
725    // Key::Symbol
726    // Key::AltGraph
727    // Test "sided" modifiers.
728    #[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    // Interleaved use of sided modifiers sets and resets the "non-sided"
754    // modifier bit correctly.
755    //
756    // KeyA      """""\____________/""""""""""""""""
757    //                :
758    // KeyB      """""""""""\_____________/"""""""""
759    //                :                   :
760    // Modifier  """""\___________________/"""""""""
761    //
762    // KeyA is the first of the two sided keys, and KeyB is the second of the
763    // two sided keys.
764    #[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    // Check that the lock state is set and reset properly.
820    //
821    // Key       ______/""""""""\_______/"""""""""\_______
822    // LockState ______/""""""""""""""""""""""""""\______
823    #[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    // CapsLock            ________/""""""""""\_______/"""""\_____
895    // LeftShift           ____________/"""""""""""\______________
896    // is_shift_active     ____________/"""""""""""\______________
897    // is_caps_lock_active ________/""""""""""\_______/"""""\_____
898    #[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        // Caps Lock is still active...
917        assert!(!modifier_state.test(Modifiers::SHIFT));
918        assert!(!modifier_state.test(Modifiers::CAPS_LOCK));
919
920        // Press and release Caps Lock again.
921        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 that the keys are ordered in the sequence they were pressed.
1129    //
1130    // A ____/"""""""""""""""
1131    // B _______/"""""""\____
1132    // C __/"""""""""""""""""
1133    // D __________/"""""""""
1134    //
1135    // KeyState::get_ordered_keys() => [C, A, D]
1136    //
1137    // since out of the keys that are still pressed, C, A and D were actuated
1138    // in that order.
1139    #[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        // Repeated
1148        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}