Skip to main content

smart_keymap_core/key/
layered.rs

1use core::fmt::Debug;
2use core::marker::Copy;
3use core::ops::Index;
4
5use serde::Deserialize;
6
7use crate::input;
8use crate::key;
9use crate::key::KeyboardModifiers;
10use crate::slice::Slice;
11
12/// The type used for layer index.
13pub type LayerIndex = u32;
14
15/// The type used for set of active layers in ModifierKey.
16/// (Layer bit indices `0..=[MAX_BITSET_LAYER]`.)
17pub type LayerBitset = u32;
18
19/// The maximum layer bit index representable in a [LayerBitset].
20///
21/// For `LayerBitset = u32`, this is 31 (bits 0..=31, i.e. 32 layers).
22pub const MAX_BITSET_LAYER: usize = 8 * core::mem::size_of::<LayerBitset>() - 1;
23
24/// The bitset with all representable modifier layers in the mask.
25///
26/// Includes bit [MAX_BITSET_LAYER] (e.g. bit 31 for `u32`).
27pub const BITSET_MASK_ALL: LayerBitset = LayerBitset::MAX;
28
29/// Struct for modifying layers with a bitset.
30#[repr(C)]
31#[derive(Debug, Deserialize, Clone, Copy, Eq, PartialEq)]
32pub struct ModifierBitset {
33    /// The set of layers modified.
34    pub layers: LayerBitset,
35    /// The mask for which layers are affected by the modification.
36    #[serde(default = "default_modifier_bitset_mask")]
37    pub mask: LayerBitset,
38}
39
40fn default_modifier_bitset_mask() -> LayerBitset {
41    BITSET_MASK_ALL
42}
43
44/// Reference for a keyboard key.
45#[derive(Deserialize, Debug, Clone, Copy, PartialEq)]
46pub enum Ref {
47    /// Ref to a layer modifier key.
48    Modifier(u8),
49    /// Ref to a layered key.
50    Layered(u8),
51}
52
53/// Modifier layer key affects what layers are active.
54#[derive(Debug, Deserialize, Clone, Copy, PartialEq)]
55pub enum ModifierKey {
56    /// Activates the given layer when held.
57    Hold(LayerIndex, KeyboardModifiers),
58    /// Toggles whether the given layer is active when pressed.
59    Toggle(LayerIndex),
60    /// Sticky layer modifier, similar to sticky modifier key.
61    ///
62    /// Acts the same as `Hold` variant if interrupted.
63    /// If tapped, then the layer is activated for the next key tap.
64    Sticky(LayerIndex),
65    /// Sets the set of active layers to the given layers when the key is pressed.
66    SetActiveLayers(ModifierBitset),
67    /// Sets the default layer.
68    Default(LayerIndex),
69}
70
71impl ModifierKey {
72    /// Create a new [ModifierKey] that activates the given layer when held.
73    pub const fn hold(layer: LayerIndex) -> Self {
74        ModifierKey::Hold(layer, key::KeyboardModifiers::NONE)
75    }
76
77    /// Adds keyboard modifiers to a Hold modifier key.
78    pub const fn with_keyboard_modifiers(self, mods: key::KeyboardModifiers) -> Self {
79        match self {
80            ModifierKey::Hold(layer, _) => ModifierKey::Hold(layer, mods),
81            other => other,
82        }
83    }
84
85    /// Create a new [ModifierKey] that activates the layer when held, or makes it sticky when tapped.
86    pub const fn sticky(layer: LayerIndex) -> Self {
87        ModifierKey::Sticky(layer)
88    }
89
90    /// Create a new [ModifierKey] that toggles the given layer.
91    pub const fn toggle(layer: LayerIndex) -> Self {
92        ModifierKey::Toggle(layer)
93    }
94
95    /// Create a new [ModifierKey] that sets the active layers to the given slice of layers when pressed.
96    ///
97    /// Each LayerIndex in the slice must be at most [MAX_BITSET_LAYER].
98    pub const fn set_active_layers(layers: &[LayerIndex]) -> Self {
99        let mut bitset = 0;
100
101        let mut idx = 0;
102        while idx < layers.len() {
103            let layer = layers[idx] as usize;
104            if layer <= MAX_BITSET_LAYER {
105                bitset |= 1 << layer;
106            } else {
107                panic!("LayerIndex must be at most MAX_BITSET_LAYER");
108            }
109            idx += 1;
110        }
111
112        let mask = BITSET_MASK_ALL;
113        ModifierKey::SetActiveLayers(ModifierBitset {
114            layers: bitset,
115            mask,
116        })
117    }
118
119    /// Create a new [ModifierKey] that sets the active layers bitset.
120    pub const fn set_active_layers_from_bitset(bitset: LayerBitset) -> Self {
121        let mask = BITSET_MASK_ALL;
122        ModifierKey::SetActiveLayers(ModifierBitset {
123            layers: bitset,
124            mask,
125        })
126    }
127
128    /// Create a new [ModifierKey] that sets the active layers bitset.
129    pub const fn set_active_layers_from_bitset_with_mask(
130        layers: LayerBitset,
131        mask: LayerBitset,
132    ) -> Self {
133        ModifierKey::SetActiveLayers(ModifierBitset { layers, mask })
134    }
135
136    /// Create a new [ModifierKey] that sets the default layer.
137    pub const fn default(layer: LayerIndex) -> Self {
138        ModifierKey::Default(layer)
139    }
140
141    /// Create a new [input::PressedKey] and [key::ScheduledEvent] for the given keymap index.
142    ///
143    /// Pressing a [ModifierKey::Hold] emits a [LayerEvent::Activated] event.
144    pub fn new_pressed_key(&self) -> (ModifierKeyState, Option<LayerEvent>) {
145        match self {
146            ModifierKey::Hold(layer, _) => {
147                (ModifierKeyState::new(), Some(LayerEvent::Activated(*layer)))
148            }
149            ModifierKey::Toggle(layer) => {
150                (ModifierKeyState::new(), Some(LayerEvent::Toggled(*layer)))
151            }
152            ModifierKey::Sticky(layer) => (
153                ModifierKeyState::sticky(),
154                Some(LayerEvent::StickyActivated(*layer)),
155            ),
156            ModifierKey::SetActiveLayers(modifier_bitset) => (
157                ModifierKeyState::new(),
158                Some(LayerEvent::Set(*modifier_bitset)),
159            ),
160            ModifierKey::Default(layer) => (
161                ModifierKeyState::new(),
162                Some(LayerEvent::SetDefault(*layer)),
163            ),
164        }
165    }
166}
167
168impl From<LayerEvent> for () {
169    fn from(_: LayerEvent) -> Self {}
170}
171
172/// Style of activating a layer.
173#[derive(Debug, Clone, Copy, PartialEq)]
174pub enum ActivationStyle {
175    /// Regular layer activation.
176    Regular,
177    /// Sticky layer activation.
178    ///
179    /// Sticky layer activation is similar to sticky key modifiers.
180    /// The sticky layer activation is implemented using the sticky layer modifier key.
181    Sticky,
182}
183
184/// State of an individual layer: active or inactive.
185#[derive(Debug, Clone, Copy, PartialEq)]
186pub enum Activity {
187    /// The layer is active.
188    Active(ActivationStyle),
189    /// The layer is inactive.
190    Inactive,
191}
192
193impl Activity {
194    /// Returns true if the layer is active.
195    pub fn is_active(&self) -> bool {
196        matches!(self, Activity::Active(_))
197    }
198}
199
200/// Tracks state of active layers.
201pub trait LayerState: Copy + Debug {
202    /// Activate the given layer.
203    fn activate(&mut self, layer: LayerIndex, style: ActivationStyle);
204    /// Deactivate the given layer.
205    fn deactivate(&mut self, layer: LayerIndex);
206    /// Get the active layers, from highest active layer to lowest.
207    fn active_layers(&self) -> impl Iterator<Item = LayerIndex>;
208}
209
210impl<const L: usize> LayerState for [Activity; L] {
211    fn activate(&mut self, layer_index: LayerIndex, style: ActivationStyle) {
212        let layer_index: usize = layer_index as usize;
213        debug_assert!(
214            layer_index <= L,
215            "layer must be less than array length of {}",
216            L
217        );
218        self[layer_index - 1] = Activity::Active(style);
219    }
220
221    fn deactivate(&mut self, layer_index: LayerIndex) {
222        let layer_index: usize = layer_index as usize;
223        debug_assert!(
224            layer_index <= L,
225            "layer must be less than array length of {}",
226            L
227        );
228        self[layer_index - 1] = Activity::Inactive;
229    }
230
231    fn active_layers(&self) -> impl Iterator<Item = LayerIndex> {
232        self.iter().enumerate().rev().filter_map(|(i, activity)| {
233            if activity.is_active() {
234                Some(i as LayerIndex + 1)
235            } else {
236                None
237            }
238        })
239    }
240}
241
242struct ActiveLayersDebugHelper<'a, const LAYER_COUNT: usize> {
243    active_layers: &'a [Activity; LAYER_COUNT],
244}
245
246impl<const LAYER_COUNT: usize> core::fmt::Debug for ActiveLayersDebugHelper<'_, LAYER_COUNT> {
247    fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
248        // Reverse-find the last Active layer to avoid printing large arrays.
249        let last_active_pos = self
250            .active_layers
251            .iter()
252            .rposition(|&pc| pc.is_active())
253            .map_or(0, |pos| pos + 1);
254        if last_active_pos < LAYER_COUNT {
255            f.debug_list()
256                .entries(&self.active_layers[..last_active_pos])
257                .finish_non_exhaustive()
258        } else {
259            f.debug_list().entries(&self.active_layers[..]).finish()
260        }
261    }
262}
263
264/// Conditional layer rule: activate [Self::then_layer] while every layer in
265/// [Self::if_layers] is active.
266///
267/// Layer indices are 1-based (same as [ModifierKey]). Bit `i` of
268/// [Self::if_layers] corresponds to layer `i` (same layout as [ModifierBitset]).
269#[repr(C)]
270#[derive(Debug, Deserialize, Clone, Copy, Eq, PartialEq)]
271pub struct ConditionalLayer {
272    /// Layer activated while the condition holds.
273    pub then_layer: LayerIndex,
274    /// Bitset of layers that must all be active.
275    pub if_layers: LayerBitset,
276}
277
278impl ConditionalLayer {
279    /// Constructs a rule from a then-layer and an if-layers bitset.
280    pub const fn new(then_layer: LayerIndex, if_layers: LayerBitset) -> Self {
281        Self {
282            then_layer,
283            if_layers,
284        }
285    }
286
287    /// Constructs a rule from a then-layer and if-layer indices.
288    pub const fn from_if_layers(then_layer: LayerIndex, if_layers: &[LayerIndex]) -> Self {
289        let mut bitset: LayerBitset = 0;
290        let mut i = 0;
291        while i < if_layers.len() {
292            let layer = if_layers[i] as usize;
293            if layer <= MAX_BITSET_LAYER {
294                bitset |= 1 << layer;
295            }
296            i += 1;
297        }
298        Self {
299            then_layer,
300            if_layers: bitset,
301        }
302    }
303}
304
305/// Configuration for layered keys / sticky layers / conditional layers.
306#[derive(Deserialize, Debug, Clone, Copy, PartialEq)]
307pub struct Config<const CONDITIONAL_LAYER_COUNT: usize = 0> {
308    /// Timeout (ms) after which an unused sticky layer deactivates.
309    ///
310    /// When [None], sticky layers stay active until another key is used.
311    ///
312    /// The timeout starts when a sticky layer modifier is *released*
313    /// without interruption (sticky committed). If another key is pressed
314    /// while sticky is active, the timeout is cancelled / ignored.
315    #[serde(default)]
316    pub sticky_timeout: Option<u16>,
317
318    /// Rules that activate a then-layer when all of their if-layers are active.
319    #[serde(default)]
320    pub conditional_layers: Slice<ConditionalLayer, CONDITIONAL_LAYER_COUNT>,
321}
322
323/// Default layered config (no sticky timeout, no conditional layers).
324pub const DEFAULT_CONFIG: Config = Config {
325    sticky_timeout: None,
326    conditional_layers: Slice::from_slice(&[]),
327};
328
329impl<const CONDITIONAL_LAYER_COUNT: usize> Config<CONDITIONAL_LAYER_COUNT> {
330    /// Constructs a new default [Config].
331    pub const fn new() -> Self {
332        Self {
333            sticky_timeout: None,
334            conditional_layers: Slice::from_slice(&[]),
335        }
336    }
337}
338
339impl<const CONDITIONAL_LAYER_COUNT: usize> Default for Config<CONDITIONAL_LAYER_COUNT> {
340    fn default() -> Self {
341        Self::new()
342    }
343}
344
345/// [crate::key::Context] for [LayeredKey] that tracks active layers.
346#[derive(Clone, Copy)]
347pub struct Context<const LAYER_COUNT: usize, const CONDITIONAL_LAYER_COUNT: usize = 0> {
348    config: Config<CONDITIONAL_LAYER_COUNT>,
349    default_layer: Option<LayerIndex>,
350    active_layers: [Activity; LAYER_COUNT],
351    // Keymap index which was pressed while a layer was sticky.
352    pressed_keymap_index: Option<u16>,
353    // Invalidates pending sticky-timeout events when advanced.
354    sticky_timeout_id: u8,
355}
356
357impl<const LAYER_COUNT: usize, const CONDITIONAL_LAYER_COUNT: usize> Debug
358    for Context<LAYER_COUNT, CONDITIONAL_LAYER_COUNT>
359{
360    fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
361        f.debug_struct("Context")
362            .field("config", &self.config)
363            .field("default_layer", &self.default_layer)
364            .field(
365                "active_layers",
366                &ActiveLayersDebugHelper {
367                    active_layers: &self.active_layers,
368                },
369            )
370            .field("pressed_keymap_index", &self.pressed_keymap_index)
371            .field("sticky_timeout_id", &self.sticky_timeout_id)
372            .finish()
373    }
374}
375
376impl<const LAYER_COUNT: usize, const CONDITIONAL_LAYER_COUNT: usize>
377    Context<LAYER_COUNT, CONDITIONAL_LAYER_COUNT>
378{
379    /// Create a new [Context].
380    pub const fn new() -> Self {
381        Self::from_config(Config::new())
382    }
383
384    /// Constructs a context from the given config.
385    pub const fn from_config(config: Config<CONDITIONAL_LAYER_COUNT>) -> Self {
386        Context {
387            config,
388            default_layer: None,
389            active_layers: [Activity::Inactive; LAYER_COUNT],
390            pressed_keymap_index: None,
391            sticky_timeout_id: 0,
392        }
393    }
394
395    /// Re-construct from context's [Config], clearing active layers and sticky state.
396    pub fn reset(&mut self) {
397        *self = Self::from_config(self.config);
398    }
399
400    fn invalidate_sticky_timeouts(&mut self) {
401        self.sticky_timeout_id = self.sticky_timeout_id.wrapping_add(1);
402    }
403
404    fn deactivate_sticky_layer(&mut self, layer: LayerIndex) {
405        self.active_layers.deactivate(layer);
406        self.pressed_keymap_index = None;
407        self.invalidate_sticky_timeouts();
408        self.apply_conditional_layers();
409    }
410
411    /// Bitset of currently active layers (bit `i` = layer `i`).
412    fn active_layers_bitset(&self) -> LayerBitset {
413        let max_layer = 1 + LAYER_COUNT.min(MAX_BITSET_LAYER);
414        (1..max_layer).fold(0, |bits, li| {
415            if self.active_layers[li - 1].is_active() {
416                bits | (1 << li)
417            } else {
418                bits
419            }
420        })
421    }
422
423    /// One pass over conditional rules; returns whether any then-layer changed.
424    fn apply_conditional_layers_once(&mut self) -> bool {
425        // Copy rules so we can mutate active_layers while iterating.
426        let rules = self.config.conditional_layers;
427        let active = self.active_layers_bitset();
428        rules.as_slice().iter().fold(false, |changed, rule| {
429            let should = (active & rule.if_layers) == rule.if_layers;
430            let is_active = (active & (1 << rule.then_layer)) != 0;
431            if should == is_active {
432                changed
433            } else if should {
434                self.active_layers
435                    .activate(rule.then_layer, ActivationStyle::Regular);
436                true
437            } else {
438                self.active_layers.deactivate(rule.then_layer);
439                true
440            }
441        })
442    }
443
444    /// Evaluate conditional layer rules until stable, or up to one pass per rule.
445    ///
446    /// Nested rules (a then-layer used as an if-layer of another rule) settle
447    /// without depending on rule definition order. The pass limit bounds the
448    /// work for a pure dependency chain and prevents non-termination if rules
449    /// disagree about the same then-layer.
450    fn apply_conditional_layers(&mut self) {
451        for _ in 0..CONDITIONAL_LAYER_COUNT {
452            if !self.apply_conditional_layers_once() {
453                break;
454            }
455        }
456    }
457}
458
459impl<const LAYER_COUNT: usize, const CONDITIONAL_LAYER_COUNT: usize> Default
460    for Context<LAYER_COUNT, CONDITIONAL_LAYER_COUNT>
461{
462    fn default() -> Self {
463        Self::new()
464    }
465}
466
467impl<const LAYER_COUNT: usize, const CONDITIONAL_LAYER_COUNT: usize>
468    Context<LAYER_COUNT, CONDITIONAL_LAYER_COUNT>
469{
470    /// Get the active layers.
471    pub fn layer_state(&self) -> &[Activity; LAYER_COUNT] {
472        &self.active_layers
473    }
474
475    fn sticky_layer(&self) -> Option<LayerIndex> {
476        self.active_layers
477            .iter()
478            .position(|&a| a == Activity::Active(ActivationStyle::Sticky))
479            .map(|i| i as LayerIndex + 1)
480    }
481
482    /// Updates the context with the [LayerEvent].
483    ///
484    /// Returns scheduled events (e.g. sticky timeout).
485    fn handle_layer_event(&mut self, event: LayerEvent) -> key::KeyEvents<LayerEvent> {
486        match event {
487            LayerEvent::Activated(layer) => {
488                self.active_layers.activate(layer, ActivationStyle::Regular);
489                // Sticky cancelled / converted to hold — drop any sticky timeout.
490                self.invalidate_sticky_timeouts();
491                self.apply_conditional_layers();
492                key::KeyEvents::no_events()
493            }
494            LayerEvent::Deactivated(layer) => {
495                self.active_layers.deactivate(layer);
496                self.invalidate_sticky_timeouts();
497                self.apply_conditional_layers();
498                key::KeyEvents::no_events()
499            }
500            LayerEvent::StickyActivated(layer) => {
501                self.active_layers.activate(layer, ActivationStyle::Sticky);
502                self.pressed_keymap_index = None;
503                // Previous sticky wait is superseded while this sticky key is held.
504                self.invalidate_sticky_timeouts();
505                self.apply_conditional_layers();
506                key::KeyEvents::no_events()
507            }
508            LayerEvent::StickyReleased => {
509                // Sticky key released without interruption: layer stays sticky.
510                // Arm optional timeout for "no next key pressed".
511                if self.sticky_layer().is_none() {
512                    key::KeyEvents::no_events()
513                } else {
514                    self.invalidate_sticky_timeouts();
515                    let timeout_id = self.sticky_timeout_id;
516                    match self.config.sticky_timeout {
517                        Some(timeout) => {
518                            key::KeyEvents::scheduled_event(key::ScheduledEvent::after(
519                                timeout,
520                                key::Event::key_event(0, LayerEvent::StickyTimeout(timeout_id)),
521                            ))
522                        }
523                        None => key::KeyEvents::no_events(),
524                    }
525                }
526            }
527            LayerEvent::StickyTimeout(timeout_id) => {
528                if timeout_id == self.sticky_timeout_id && self.pressed_keymap_index.is_none() {
529                    if let Some(layer) = self.sticky_layer() {
530                        // deactivate_sticky_layer applies conditionals.
531                        self.deactivate_sticky_layer(layer);
532                    }
533                }
534                key::KeyEvents::no_events()
535            }
536            LayerEvent::Toggled(layer) => {
537                if self.active_layers[layer as usize - 1].is_active() {
538                    self.active_layers.deactivate(layer);
539                } else {
540                    self.active_layers.activate(layer, ActivationStyle::Regular);
541                }
542                self.apply_conditional_layers();
543                key::KeyEvents::no_events()
544            }
545            LayerEvent::Set(ModifierBitset { layers, mask }) => {
546                let max_layer = 1 + LAYER_COUNT.min(MAX_BITSET_LAYER);
547
548                // layer 0 is always active.
549                for li in 1..max_layer {
550                    if (mask & (1 << li)) != 0 {
551                        if (layers & (1 << li)) != 0 {
552                            self.active_layers
553                                .activate(li as LayerIndex, ActivationStyle::Regular);
554                        } else {
555                            self.active_layers.deactivate(li as LayerIndex);
556                        }
557                    }
558                }
559                self.apply_conditional_layers();
560                key::KeyEvents::no_events()
561            }
562            LayerEvent::SetDefault(0) => {
563                self.default_layer = None;
564                key::KeyEvents::no_events()
565            }
566            LayerEvent::SetDefault(layer) => {
567                self.default_layer = Some(layer);
568                key::KeyEvents::no_events()
569            }
570        }
571    }
572
573    /// Updates the context with the [key::Event].
574    fn handle_event(&mut self, event: key::Event<LayerEvent>) -> key::KeyEvents<LayerEvent> {
575        match event {
576            key::Event::Input(input::Event::Press { keymap_index, .. }) => {
577                if let Some(sticky_layer_index) = self.sticky_layer() {
578                    if self.pressed_keymap_index.is_some() {
579                        // The sticky layer modifier has already been used;
580                        // the sticky layer should be deactivated for subsequent presses.
581                        self.deactivate_sticky_layer(sticky_layer_index);
582                    } else {
583                        // Next key is using the sticky layer; cancel timeout.
584                        self.invalidate_sticky_timeouts();
585                        self.pressed_keymap_index = Some(keymap_index);
586                    }
587                }
588                key::KeyEvents::no_events()
589            }
590            key::Event::Input(input::Event::Release { keymap_index, .. }) => {
591                if let Some(sticky_layer_index) = self.sticky_layer() {
592                    if self.pressed_keymap_index == Some(keymap_index) {
593                        self.deactivate_sticky_layer(sticky_layer_index);
594                    }
595                }
596                key::KeyEvents::no_events()
597            }
598            key::Event::Key { key_event, .. } => self.handle_layer_event(key_event),
599            _ => key::KeyEvents::no_events(),
600        }
601    }
602}
603
604impl<const LAYER_COUNT: usize, const CONDITIONAL_LAYER_COUNT: usize> key::Context
605    for Context<LAYER_COUNT, CONDITIONAL_LAYER_COUNT>
606{
607    type Event = LayerEvent;
608
609    fn handle_event(&mut self, event: key::Event<Self::Event>) -> key::KeyEvents<Self::Event> {
610        self.handle_event(event)
611    }
612
613    fn reset(&mut self) {
614        Context::reset(self);
615    }
616}
617
618/// Errors when constructing Layers.
619#[derive(Debug, Clone, Copy, PartialEq)]
620pub enum LayersError {
621    /// Trying to construct more layers than the Layers can store.
622    Overflow,
623}
624
625impl core::fmt::Display for LayersError {
626    // This trait requires `fmt` with this exact signature.
627    fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result {
628        write!(f, "LayersError::Overflow")
629    }
630}
631
632/// Trait for layers of [LayeredKey].
633pub trait Layers<R>: Copy + Debug {
634    /// Get the highest active key, if any, for the given [LayerState].
635    fn highest_active_key<LS: LayerState>(
636        &self,
637        layer_state: &LS,
638        default_layer: Option<LayerIndex>,
639    ) -> Option<(LayerIndex, R)>;
640    /// Constructs layers; return Err if the iterable has more keys than Layers can store.
641    fn from_iterable<I: IntoIterator<Item = Option<R>>>(keys: I) -> Result<Self, LayersError>;
642}
643
644impl<R: Copy + Debug, const L: usize> Layers<R> for [Option<R>; L] {
645    fn highest_active_key<LS: LayerState>(
646        &self,
647        layer_state: &LS,
648        default_layer: Option<LayerIndex>,
649    ) -> Option<(LayerIndex, R)> {
650        for layer_index in layer_state.active_layers() {
651            if self[layer_index as usize - 1].is_some() {
652                return self[layer_index as usize - 1].map(|k| (layer_index, k));
653            }
654        }
655
656        match default_layer {
657            Some(layer_index) if self[layer_index as usize - 1].is_some() => {
658                self[layer_index as usize - 1].map(|k| (layer_index, k))
659            }
660            _ => None,
661        }
662    }
663
664    fn from_iterable<I: IntoIterator<Item = Option<R>>>(keys: I) -> Result<Self, LayersError> {
665        let mut layered: [Option<R>; L] = [None; L];
666        for (i, maybe_key) in keys.into_iter().enumerate() {
667            if i < L {
668                layered[i] = maybe_key;
669            } else {
670                return Err(LayersError::Overflow);
671            }
672        }
673        Ok(layered)
674    }
675}
676
677/// Constructs an array of keys for the given array.
678pub const fn layered_keys<K: Copy, const L: usize, const LAYER_COUNT: usize>(
679    keys: [Option<K>; L],
680) -> [Option<K>; LAYER_COUNT] {
681    let mut layered: [Option<K>; LAYER_COUNT] = [None; LAYER_COUNT];
682
683    if L > LAYER_COUNT {
684        panic!("Too many layers for layered_keys");
685    }
686
687    let mut i = 0;
688
689    while i < L {
690        layered[i] = keys[i];
691        i += 1;
692    }
693
694    layered
695}
696
697/// A key whose behavior depends on which layer is active.
698#[derive(Debug, Deserialize, Clone, Copy, PartialEq)]
699pub struct LayeredKey<R: Copy + Debug + PartialEq, const LAYER_COUNT: usize> {
700    /// The base key, used when no layers are active.
701    pub base: R,
702    /// The layered keys, used when the corresponding layer is active.
703    #[serde(deserialize_with = "deserialize_layered")]
704    #[serde(bound(deserialize = "R: Deserialize<'de>"))]
705    pub layered: [Option<R>; LAYER_COUNT],
706}
707
708/// Deserialize a [Layers].
709fn deserialize_layered<'de, R, L: Layers<R>, D>(deserializer: D) -> Result<L, D::Error>
710where
711    R: Deserialize<'de>,
712    D: serde::Deserializer<'de>,
713{
714    let keys_vec: heapless::Vec<Option<R>, 64> = Deserialize::deserialize(deserializer)?;
715
716    L::from_iterable(keys_vec).map_err(serde::de::Error::custom)
717}
718
719impl<R: Copy + Debug + PartialEq, const LAYER_COUNT: usize> LayeredKey<R, LAYER_COUNT> {
720    /// Constructs a new [LayeredKey].
721    pub const fn new<const L: usize>(base: R, layered: [Option<R>; L]) -> Self {
722        let layered = layered_keys(layered);
723        Self { base, layered }
724    }
725}
726
727impl<R: Copy + Debug + PartialEq, const LAYER_COUNT: usize> LayeredKey<R, LAYER_COUNT> {
728    /// Presses the key, using the highest active key, if any.
729    fn new_pressed_key<const CONDITIONAL_LAYER_COUNT: usize>(
730        &self,
731        context: &Context<LAYER_COUNT, CONDITIONAL_LAYER_COUNT>,
732    ) -> key::NewPressedKey<R> {
733        let (_layer, passthrough_ref) = self
734            .layered
735            .highest_active_key(context.layer_state(), context.default_layer)
736            .unwrap_or((0, self.base));
737
738        key::NewPressedKey::key(passthrough_ref)
739    }
740}
741
742/// Events from [ModifierKey] which affect [Context].
743#[derive(Debug, Clone, Copy, Eq, PartialEq)]
744pub enum LayerEvent {
745    /// Activates the given layer.
746    Activated(LayerIndex),
747    /// Deactivates the given layer.
748    Deactivated(LayerIndex),
749    /// Toggles the given layer.
750    Toggled(LayerIndex),
751    /// Activates the given layer as sticky (on sticky-mod press).
752    StickyActivated(LayerIndex),
753    /// Sticky layer modifier released without interruption (sticky committed).
754    StickyReleased,
755    /// Sticky layer timed out while unused.
756    ///
757    /// The payload is a generation id used to ignore stale timeouts.
758    StickyTimeout(u8),
759    /// Sets the active layers to the given set of layers.
760    Set(ModifierBitset),
761    /// Changes the default layer.
762    SetDefault(LayerIndex),
763}
764
765/// Struct for layer system pending key state. (No pending state).
766#[derive(Debug, Clone, Copy, PartialEq)]
767pub struct PendingKeyState;
768
769/// Whether the pressed Sticky modifier key is "sticky" or "regular".
770#[derive(Debug, Clone, Copy, Eq, PartialEq)]
771pub enum Behavior {
772    /// Key state is "sticky". (Will activate sticky modifier when released).
773    Sticky,
774    /// Key state is "regular". (No sticky modifiers activated when released).
775    Regular,
776}
777
778/// [crate::key::KeyState] of [ModifierKey].
779#[derive(Debug, Clone, Copy, PartialEq)]
780pub struct ModifierKeyState {
781    behavior: Behavior,
782}
783
784impl Default for ModifierKeyState {
785    fn default() -> Self {
786        Self::new()
787    }
788}
789
790impl ModifierKeyState {
791    /// Constructs a regular ModifierKeyState
792    pub fn new() -> Self {
793        Self {
794            behavior: Behavior::Regular,
795        }
796    }
797
798    /// Constructs a sticky ModifierKeyState
799    pub fn sticky() -> Self {
800        Self {
801            behavior: Behavior::Sticky,
802        }
803    }
804
805    /// Handle the given event for the given key.
806    pub fn handle_event(
807        &mut self,
808        keymap_index: u16,
809        event: key::Event<LayerEvent>,
810        key: &ModifierKey,
811    ) -> Option<LayerEvent> {
812        match key {
813            ModifierKey::Hold(layer, _) => match event {
814                key::Event::Input(input::Event::Release { keymap_index: ki }) => {
815                    if keymap_index == ki {
816                        Some(LayerEvent::Deactivated(*layer))
817                    } else {
818                        None
819                    }
820                }
821                _ => None,
822            },
823            ModifierKey::Toggle(_) => None,
824            ModifierKey::Sticky(layer) => match event {
825                key::Event::Input(input::Event::Press { keymap_index: _ }) => {
826                    if self.behavior == Behavior::Sticky {
827                        // Another key pressed while sticky modifier is held; make self regular
828                        self.behavior = Behavior::Regular;
829                        // Change the layer state to *regular*
830                        Some(LayerEvent::Activated(*layer))
831                    } else {
832                        None
833                    }
834                }
835                key::Event::Input(input::Event::Release { keymap_index: ki })
836                    if keymap_index == ki =>
837                {
838                    match self.behavior {
839                        Behavior::Regular => Some(LayerEvent::Deactivated(*layer)),
840                        // Sticky key tapped (released without interruption):
841                        // layer stays sticky; arm optional timeout via context.
842                        Behavior::Sticky => Some(LayerEvent::StickyReleased),
843                    }
844                }
845                _ => None,
846            },
847            ModifierKey::SetActiveLayers(_modifier_bitset) => None,
848            ModifierKey::Default(layer) => match event {
849                key::Event::Input(input::Event::Release { keymap_index: ki }) => {
850                    if keymap_index == ki {
851                        Some(LayerEvent::SetDefault(*layer))
852                    } else {
853                        None
854                    }
855                }
856                _ => None,
857            },
858        }
859    }
860}
861
862/// The [key::System] implementation for layer system keys.
863///
864/// `CONDITIONAL_LAYER_COUNT` is carried so the system's context
865/// matches the layered [Config] / [Context] used by the keymap
866/// (rules live on context, not system).
867#[derive(Debug, Clone, Copy, PartialEq)]
868pub struct System<
869    R: Copy + Debug + PartialEq,
870    ModifierKeys: Index<usize, Output = ModifierKey>,
871    LayeredKeys: Index<usize, Output = LayeredKey<R, LAYER_COUNT>>,
872    const LAYER_COUNT: usize,
873    const CONDITIONAL_LAYER_COUNT: usize = 0,
874> {
875    modifier_keys: ModifierKeys,
876    layered_keys: LayeredKeys,
877}
878
879impl<
880        R: Copy + Debug + PartialEq,
881        ModifierKeys: Index<usize, Output = ModifierKey>,
882        LayeredKeys: Index<usize, Output = LayeredKey<R, LAYER_COUNT>>,
883        const LAYER_COUNT: usize,
884        const CONDITIONAL_LAYER_COUNT: usize,
885    > System<R, ModifierKeys, LayeredKeys, LAYER_COUNT, CONDITIONAL_LAYER_COUNT>
886{
887    /// Constructs a new [System] with the given key data.
888    pub const fn new(modifier_keys: ModifierKeys, layered_keys: LayeredKeys) -> Self {
889        Self {
890            modifier_keys,
891            layered_keys,
892        }
893    }
894}
895
896impl<
897        R: Copy + Debug + PartialEq,
898        ModifierKeys: Debug + Index<usize, Output = ModifierKey>,
899        LayeredKeys: Debug + Index<usize, Output = LayeredKey<R, LAYER_COUNT>>,
900        const LAYER_COUNT: usize,
901        const CONDITIONAL_LAYER_COUNT: usize,
902    > key::System<R>
903    for System<R, ModifierKeys, LayeredKeys, LAYER_COUNT, CONDITIONAL_LAYER_COUNT>
904{
905    type Ref = Ref;
906    type Context = Context<LAYER_COUNT, CONDITIONAL_LAYER_COUNT>;
907    type Event = LayerEvent;
908    type PendingKeyState = PendingKeyState;
909    type KeyState = ModifierKeyState;
910
911    fn new_pressed_key(
912        &self,
913        keymap_index: u16,
914        context: &Self::Context,
915        key_ref: Ref,
916    ) -> (
917        key::PressedKeyResult<R, Self::PendingKeyState, Self::KeyState>,
918        key::KeyEvents<Self::Event>,
919    ) {
920        match key_ref {
921            Ref::Modifier(mod_key_index) => {
922                let key = self.modifier_keys[mod_key_index as usize];
923                let (m_ks, maybe_lmod_ev) = key.new_pressed_key();
924                let pks = key::PressedKeyResult::Resolved(m_ks);
925                let pke = match maybe_lmod_ev {
926                    Some(lmod_ev) => {
927                        key::KeyEvents::event(key::Event::key_event(keymap_index, lmod_ev))
928                    }
929                    None => key::KeyEvents::no_events(),
930                };
931                (pks, pke)
932            }
933            Ref::Layered(i) => {
934                let key = &self.layered_keys[i as usize];
935                let npk = key.new_pressed_key(context);
936                (
937                    key::PressedKeyResult::NewPressedKey(npk),
938                    key::KeyEvents::no_events(),
939                )
940            }
941        }
942    }
943
944    fn update_pending_state(
945        &self,
946        _pending_state: &mut Self::PendingKeyState,
947        _keymap_index: u16,
948        _context: &Self::Context,
949        _key_ref: Ref,
950        _event: key::Event<Self::Event>,
951    ) -> (Option<key::NewPressedKey<R>>, key::KeyEvents<Self::Event>) {
952        panic!()
953    }
954
955    fn update_state(
956        &self,
957        key_state: &mut Self::KeyState,
958        key_ref: &Self::Ref,
959        _context: &Self::Context,
960        keymap_index: u16,
961        event: key::Event<Self::Event>,
962    ) -> key::KeyEvents<Self::Event> {
963        match key_ref {
964            Ref::Modifier(mod_key_index) => {
965                let mod_key = &self.modifier_keys[*mod_key_index as usize];
966                let maybe_ev = key_state.handle_event(keymap_index, event, mod_key);
967                maybe_ev.map_or(key::KeyEvents::no_events(), |ev| {
968                    key::KeyEvents::event(key::Event::key_event(keymap_index, ev))
969                })
970            }
971            _ => key::KeyEvents::no_events(),
972        }
973    }
974
975    fn key_output(
976        &self,
977        key_ref: &Self::Ref,
978        _key_state: &Self::KeyState,
979    ) -> Option<key::KeyOutput> {
980        if let Ref::Modifier(mod_key_index) = key_ref {
981            let key = self.modifier_keys[*mod_key_index as usize];
982            match key {
983                ModifierKey::Hold(_, mods) if mods != key::KeyboardModifiers::NONE => {
984                    Some(key::KeyOutput::from_key_modifiers(mods))
985                }
986                _ => None,
987            }
988        } else {
989            None
990        }
991    }
992}
993
994#[cfg(test)]
995#[allow(clippy::unwrap_used, clippy::expect_used)]
996mod tests {
997    use super::*;
998
999    use crate::key::keyboard;
1000
1001    use crate::key::System as _;
1002
1003    const LAYER_COUNT: usize = 8;
1004
1005    type Context = super::Context<LAYER_COUNT>;
1006
1007    #[test]
1008    fn test_sizeof_ref() {
1009        assert_eq!(2, core::mem::size_of::<Ref>());
1010    }
1011
1012    #[test]
1013    fn test_sizeof_modifier_bitset() {
1014        assert_eq!(8, core::mem::size_of::<ModifierBitset>());
1015    }
1016
1017    #[test]
1018    fn test_sizeof_event() {
1019        // Firmware RAM budget on 32-bit targets: LayerEvent::Set is a ModifierBitset.
1020        assert_eq!(12, core::mem::size_of::<LayerEvent>());
1021    }
1022
1023    #[test]
1024    fn deserialize_set_active_layers_record_json() {
1025        let key: ModifierKey =
1026            serde_json::from_str(r#"{"SetActiveLayers": {"layers": 5, "mask": 3}}"#).unwrap();
1027        assert_eq!(
1028            ModifierKey::SetActiveLayers(ModifierBitset { layers: 5, mask: 3 }),
1029            key,
1030        );
1031
1032        let key: ModifierKey =
1033            serde_json::from_str(r#"{"SetActiveLayers": {"layers": 5}}"#).unwrap();
1034        assert_eq!(
1035            ModifierKey::SetActiveLayers(ModifierBitset {
1036                layers: 5,
1037                mask: BITSET_MASK_ALL,
1038            }),
1039            key,
1040        );
1041    }
1042
1043    #[test]
1044    fn test_pressing_hold_modifier_key_emits_event_activate_layer() {
1045        let layer = 1;
1046        let key = ModifierKey::hold(layer);
1047
1048        let (_pressed_key, layer_event) = key.new_pressed_key();
1049
1050        assert_eq!(Some(LayerEvent::Activated(layer)), layer_event);
1051    }
1052
1053    #[test]
1054    fn test_releasing_hold_modifier_key_emits_event_deactivate_layer() {
1055        // Assemble: press a Hold layer modifier key
1056        let layer = 1;
1057        let key = ModifierKey::hold(layer);
1058        let keymap_index = 9; // arbitrary
1059        let (mut pressed_key_state, _) = key.new_pressed_key();
1060
1061        // Act: the modifier key handles "release key" input event
1062        let actual_events = pressed_key_state
1063            .handle_event(
1064                keymap_index,
1065                key::Event::Input(input::Event::Release { keymap_index }),
1066                &key,
1067            )
1068            .into_iter()
1069            .next();
1070
1071        // Assert: the pressed key should have emitted a layer deactivation event
1072        let first_ev = actual_events.into_iter().next();
1073        if let Some(actual_layer_event) = first_ev {
1074            let expected_layer_event = LayerEvent::Deactivated(layer);
1075            assert_eq!(expected_layer_event, actual_layer_event);
1076        } else {
1077            panic!("Expected Some LayerDeactivated event");
1078        }
1079    }
1080
1081    #[test]
1082    fn test_releasing_different_hold_modifier_key_does_not_emit_event() {
1083        // Assemble: press a Hold layer modifier key
1084        let layer = 1;
1085        let key = ModifierKey::hold(layer);
1086        let keymap_index = 9; // arbitrary
1087        let (mut pressed_key_state, _) = key.new_pressed_key();
1088
1089        // Act: the modifier key handles "release key" input event for a different key
1090        let different_keymap_index = keymap_index + 1;
1091        let different_key_released_ev = key::Event::Input(input::Event::Release {
1092            keymap_index: different_keymap_index,
1093        });
1094        let actual_events = pressed_key_state
1095            .handle_event(keymap_index, different_key_released_ev, &key)
1096            .into_iter()
1097            .next();
1098
1099        // Assert: the pressed key should not emit an event
1100        if actual_events.is_some() {
1101            panic!("Expected no event emitted");
1102        }
1103    }
1104
1105    #[test]
1106    fn test_context_handling_event_adjusts_active_layers() {
1107        let mut context = Context::default();
1108
1109        context.handle_layer_event(LayerEvent::Activated(2));
1110
1111        let actual_active_layers = &context.active_layers[0..3];
1112        assert_eq!(
1113            &[
1114                Activity::Inactive,
1115                Activity::Active(ActivationStyle::Regular),
1116                Activity::Inactive
1117            ],
1118            actual_active_layers
1119        );
1120    }
1121
1122    /// Classic tri-layer: layer 3 active iff layers 1 and 2 are both active.
1123    fn tri_layer_context() -> super::Context<LAYER_COUNT, 1> {
1124        super::Context::from_config(Config {
1125            sticky_timeout: None,
1126            conditional_layers: Slice::from_slice(&[ConditionalLayer::from_if_layers(3, &[1, 2])]),
1127        })
1128    }
1129
1130    #[test]
1131    fn test_conditional_layer_partial_if_layers_does_not_activate_then() {
1132        // Assemble
1133        let mut context = tri_layer_context();
1134
1135        // Act
1136        context.handle_layer_event(LayerEvent::Activated(1));
1137
1138        // Assert
1139        assert_eq!(Activity::Inactive, context.active_layers[2]);
1140    }
1141
1142    #[test]
1143    fn test_conditional_layer_activates_when_all_if_layers_active() {
1144        // Assemble
1145        let mut context = tri_layer_context();
1146        context.handle_layer_event(LayerEvent::Activated(1));
1147
1148        // Act
1149        context.handle_layer_event(LayerEvent::Activated(2));
1150
1151        // Assert
1152        assert_eq!(
1153            Activity::Active(ActivationStyle::Regular),
1154            context.active_layers[2]
1155        );
1156    }
1157
1158    #[test]
1159    fn test_conditional_layer_deactivates_when_if_layer_releases() {
1160        // Assemble
1161        let mut context = tri_layer_context();
1162        context.handle_layer_event(LayerEvent::Activated(1));
1163        context.handle_layer_event(LayerEvent::Activated(2));
1164
1165        // Act
1166        context.handle_layer_event(LayerEvent::Deactivated(1));
1167
1168        // Assert
1169        assert_eq!(Activity::Inactive, context.active_layers[2]);
1170    }
1171
1172    #[test]
1173    fn test_conditional_layer_nested_fixed_point() {
1174        // Assemble: C ← A ∧ B; E ← C ∧ D  (layers 1,2 → 3; 3,4 → 5)
1175        let mut context = super::Context::<LAYER_COUNT, 2>::from_config(Config {
1176            sticky_timeout: None,
1177            conditional_layers: Slice::from_slice(&[
1178                ConditionalLayer::from_if_layers(3, &[1, 2]),
1179                ConditionalLayer::from_if_layers(5, &[3, 4]),
1180            ]),
1181        });
1182        context.handle_layer_event(LayerEvent::Activated(1));
1183        context.handle_layer_event(LayerEvent::Activated(2));
1184
1185        // Act: activate D; fixed-point should turn on C (already) and E
1186        context.handle_layer_event(LayerEvent::Activated(4));
1187
1188        // Assert
1189        assert_eq!(
1190            [
1191                Activity::Active(ActivationStyle::Regular), // 3
1192                Activity::Active(ActivationStyle::Regular), // 4
1193                Activity::Active(ActivationStyle::Regular), // 5
1194            ],
1195            context.active_layers[2..5]
1196        );
1197    }
1198
1199    #[test]
1200    fn test_conditional_layer_sticky_if_layer_counts_as_active() {
1201        // Assemble
1202        let mut context = tri_layer_context();
1203        context.handle_layer_event(LayerEvent::StickyActivated(1));
1204
1205        // Act
1206        context.handle_layer_event(LayerEvent::Activated(2));
1207
1208        // Assert
1209        assert_eq!(
1210            Activity::Active(ActivationStyle::Regular),
1211            context.active_layers[2]
1212        );
1213    }
1214
1215    #[test]
1216    fn test_conditional_layer_set_active_layers_reevaluates() {
1217        // Assemble
1218        let mut context = tri_layer_context();
1219        context.handle_layer_event(LayerEvent::Activated(1));
1220        context.handle_layer_event(LayerEvent::Activated(2));
1221
1222        // Act: clear layer 1 via Set (mask only layer 1)
1223        context.handle_layer_event(LayerEvent::Set(ModifierBitset {
1224            layers: 0,
1225            mask: 1 << 1,
1226        }));
1227
1228        // Assert
1229        assert_eq!(Activity::Inactive, context.active_layers[2]);
1230    }
1231
1232    #[test]
1233    fn test_pressing_layered_key_acts_as_base_key_when_no_layers_active() {
1234        // Assemble
1235        let context = Context::default();
1236        let expected_ref = keyboard::Ref::KeyCode(0x04);
1237        let layered_key = LayeredKey::new(
1238            expected_ref,
1239            [
1240                Some(keyboard::Ref::KeyCode(0x05)),
1241                Some(keyboard::Ref::KeyCode(0x06)),
1242                Some(keyboard::Ref::KeyCode(0x07)),
1243            ],
1244        );
1245        let system = System::new([], [layered_key]);
1246
1247        // Act: without activating a layer, press the layered key
1248        let keymap_index = 9; // arbitrary
1249        let key_ref = Ref::Layered(0);
1250        let (pkr, _pke) = system.new_pressed_key(keymap_index, &context, key_ref);
1251
1252        // Assert
1253        let expected_pkr =
1254            key::PressedKeyResult::NewPressedKey(key::NewPressedKey::Key(expected_ref));
1255        assert_eq!(expected_pkr, pkr,);
1256    }
1257
1258    // Terminology:
1259    //   "defined layer" = LayeredKey.layered[] is Some for that layer;
1260    //   "active layer" = Context.active_layers[] = true for that layer.
1261
1262    #[test]
1263    fn test_pressing_layered_key_falls_through_undefined_active_layers() {
1264        // Assemble: layered key (with no layered definitions)
1265        let mut context = Context::default();
1266        let expected_ref = keyboard::Ref::KeyCode(0x04);
1267        let layered_key = LayeredKey::new(expected_ref, [None, None, None]);
1268        let system = System::new([], [layered_key]);
1269
1270        // Act: activate all layers, press layered key
1271        context.handle_layer_event(LayerEvent::Activated(1));
1272        context.handle_layer_event(LayerEvent::Activated(2));
1273        context.handle_layer_event(LayerEvent::Activated(3));
1274        let keymap_index = 9; // arbitrary
1275        let key_ref = Ref::Layered(0);
1276        let (pkr, _pke) = system.new_pressed_key(keymap_index, &context, key_ref);
1277
1278        // Assert
1279        let expected_pkr =
1280            key::PressedKeyResult::NewPressedKey(key::NewPressedKey::Key(expected_ref));
1281        assert_eq!(expected_pkr, pkr,);
1282    }
1283
1284    #[test]
1285    fn test_pressing_layered_key_acts_as_highest_defined_active_layer() {
1286        // Assemble: layered key (with no layered definitions)
1287        let mut context = Context::default();
1288        let expected_ref = keyboard::Ref::KeyCode(0x09);
1289        let layered_key = LayeredKey::new(
1290            keyboard::Ref::KeyCode(0x04),
1291            [
1292                Some(keyboard::Ref::KeyCode(0x05)),
1293                Some(keyboard::Ref::KeyCode(0x06)),
1294                Some(expected_ref),
1295            ],
1296        );
1297        let system = System::new([], [layered_key]);
1298
1299        // Act: activate all layers, press layered key
1300        context.handle_layer_event(LayerEvent::Activated(1));
1301        context.handle_layer_event(LayerEvent::Activated(2));
1302        context.handle_layer_event(LayerEvent::Activated(3));
1303        let keymap_index = 9; // arbitrary
1304        let key_ref = Ref::Layered(0);
1305        let (pkr, _pke) = system.new_pressed_key(keymap_index, &context, key_ref);
1306
1307        // Assert
1308        let expected_pkr =
1309            key::PressedKeyResult::NewPressedKey(key::NewPressedKey::Key(expected_ref));
1310        assert_eq!(expected_pkr, pkr,);
1311    }
1312
1313    #[test]
1314    fn test_pressing_layered_key_with_some_transparency_acts_as_highest_defined_active_layer() {
1315        // Assemble: layered key (with no layered definitions)
1316        let mut context = Context::default();
1317        let expected_ref = keyboard::Ref::KeyCode(0x09);
1318        let layered_key = LayeredKey::new(
1319            keyboard::Ref::KeyCode(0x04),
1320            [Some(expected_ref), Some(keyboard::Ref::KeyCode(0x06)), None],
1321        );
1322        let system = System::new([], [layered_key]);
1323
1324        // Act: activate all layers, press layered key
1325        context.handle_layer_event(LayerEvent::Activated(1));
1326        context.handle_layer_event(LayerEvent::Activated(3));
1327        let keymap_index = 9; // arbitrary
1328        let key_ref = Ref::Layered(0);
1329        let (pkr, _pke) = system.new_pressed_key(keymap_index, &context, key_ref);
1330
1331        // Assert
1332        let expected_pkr =
1333            key::PressedKeyResult::NewPressedKey(key::NewPressedKey::Key(expected_ref));
1334        assert_eq!(expected_pkr, pkr,);
1335    }
1336
1337    #[test]
1338    fn test_layer_state_array_active_layers() {
1339        let mut layer_state: [Activity; 5] = [Activity::Inactive; 5];
1340        layer_state.activate(1, ActivationStyle::Regular);
1341        layer_state.activate(2, ActivationStyle::Regular);
1342        layer_state.activate(4, ActivationStyle::Regular);
1343        let actual_active_layers: Vec<LayerIndex> = layer_state.active_layers().collect();
1344        let expected_active_layers: Vec<LayerIndex> = vec![4, 2, 1];
1345
1346        assert_eq!(expected_active_layers, actual_active_layers);
1347    }
1348
1349    #[test]
1350    fn test_pressing_toggle_modifier_key_emits_event_layer_toggled() {
1351        // Assemble
1352        let layer = 1;
1353        let key = ModifierKey::Toggle(layer);
1354
1355        // Act
1356        let (_pressed_key, layer_event) = key.new_pressed_key();
1357
1358        // Assert
1359        assert_eq!(Some(LayerEvent::Toggled(layer)), layer_event);
1360    }
1361}