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
12pub type LayerIndex = u32;
14
15pub type LayerBitset = u32;
18
19pub const MAX_BITSET_LAYER: usize = 8 * core::mem::size_of::<LayerBitset>() - 1;
23
24pub const BITSET_MASK_ALL: LayerBitset = LayerBitset::MAX;
28
29#[repr(C)]
31#[derive(Debug, Deserialize, Clone, Copy, Eq, PartialEq)]
32pub struct ModifierBitset {
33 pub layers: LayerBitset,
35 #[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#[derive(Deserialize, Debug, Clone, Copy, PartialEq)]
46pub enum Ref {
47 Modifier(u8),
49 Layered(u8),
51}
52
53#[derive(Debug, Deserialize, Clone, Copy, PartialEq)]
55pub enum ModifierKey {
56 Hold(LayerIndex, KeyboardModifiers),
58 Toggle(LayerIndex),
60 Sticky(LayerIndex),
65 SetActiveLayers(ModifierBitset),
67 Default(LayerIndex),
69}
70
71impl ModifierKey {
72 pub const fn hold(layer: LayerIndex) -> Self {
74 ModifierKey::Hold(layer, key::KeyboardModifiers::NONE)
75 }
76
77 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 pub const fn sticky(layer: LayerIndex) -> Self {
87 ModifierKey::Sticky(layer)
88 }
89
90 pub const fn toggle(layer: LayerIndex) -> Self {
92 ModifierKey::Toggle(layer)
93 }
94
95 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 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 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 pub const fn default(layer: LayerIndex) -> Self {
138 ModifierKey::Default(layer)
139 }
140
141 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#[derive(Debug, Clone, Copy, PartialEq)]
174pub enum ActivationStyle {
175 Regular,
177 Sticky,
182}
183
184#[derive(Debug, Clone, Copy, PartialEq)]
186pub enum Activity {
187 Active(ActivationStyle),
189 Inactive,
191}
192
193impl Activity {
194 pub fn is_active(&self) -> bool {
196 matches!(self, Activity::Active(_))
197 }
198}
199
200pub trait LayerState: Copy + Debug {
202 fn activate(&mut self, layer: LayerIndex, style: ActivationStyle);
204 fn deactivate(&mut self, layer: LayerIndex);
206 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 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#[repr(C)]
270#[derive(Debug, Deserialize, Clone, Copy, Eq, PartialEq)]
271pub struct ConditionalLayer {
272 pub then_layer: LayerIndex,
274 pub if_layers: LayerBitset,
276}
277
278impl ConditionalLayer {
279 pub const fn new(then_layer: LayerIndex, if_layers: LayerBitset) -> Self {
281 Self {
282 then_layer,
283 if_layers,
284 }
285 }
286
287 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#[derive(Deserialize, Debug, Clone, Copy, PartialEq)]
307pub struct Config<const CONDITIONAL_LAYER_COUNT: usize = 0> {
308 #[serde(default)]
316 pub sticky_timeout: Option<u16>,
317
318 #[serde(default)]
320 pub conditional_layers: Slice<ConditionalLayer, CONDITIONAL_LAYER_COUNT>,
321}
322
323pub 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 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#[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 pressed_keymap_index: Option<u16>,
353 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 pub const fn new() -> Self {
381 Self::from_config(Config::new())
382 }
383
384 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 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 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 fn apply_conditional_layers_once(&mut self) -> bool {
425 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 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 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 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 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 self.invalidate_sticky_timeouts();
505 self.apply_conditional_layers();
506 key::KeyEvents::no_events()
507 }
508 LayerEvent::StickyReleased => {
509 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 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 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 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 self.deactivate_sticky_layer(sticky_layer_index);
582 } else {
583 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#[derive(Debug, Clone, Copy, PartialEq)]
620pub enum LayersError {
621 Overflow,
623}
624
625impl core::fmt::Display for LayersError {
626 fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result {
628 write!(f, "LayersError::Overflow")
629 }
630}
631
632pub trait Layers<R>: Copy + Debug {
634 fn highest_active_key<LS: LayerState>(
636 &self,
637 layer_state: &LS,
638 default_layer: Option<LayerIndex>,
639 ) -> Option<(LayerIndex, R)>;
640 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
677pub 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#[derive(Debug, Deserialize, Clone, Copy, PartialEq)]
699pub struct LayeredKey<R: Copy + Debug + PartialEq, const LAYER_COUNT: usize> {
700 pub base: R,
702 #[serde(deserialize_with = "deserialize_layered")]
704 #[serde(bound(deserialize = "R: Deserialize<'de>"))]
705 pub layered: [Option<R>; LAYER_COUNT],
706}
707
708fn 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 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 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#[derive(Debug, Clone, Copy, Eq, PartialEq)]
744pub enum LayerEvent {
745 Activated(LayerIndex),
747 Deactivated(LayerIndex),
749 Toggled(LayerIndex),
751 StickyActivated(LayerIndex),
753 StickyReleased,
755 StickyTimeout(u8),
759 Set(ModifierBitset),
761 SetDefault(LayerIndex),
763}
764
765#[derive(Debug, Clone, Copy, PartialEq)]
767pub struct PendingKeyState;
768
769#[derive(Debug, Clone, Copy, Eq, PartialEq)]
771pub enum Behavior {
772 Sticky,
774 Regular,
776}
777
778#[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 pub fn new() -> Self {
793 Self {
794 behavior: Behavior::Regular,
795 }
796 }
797
798 pub fn sticky() -> Self {
800 Self {
801 behavior: Behavior::Sticky,
802 }
803 }
804
805 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 self.behavior = Behavior::Regular;
829 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 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#[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 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 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 let layer = 1;
1057 let key = ModifierKey::hold(layer);
1058 let keymap_index = 9; let (mut pressed_key_state, _) = key.new_pressed_key();
1060
1061 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 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 let layer = 1;
1085 let key = ModifierKey::hold(layer);
1086 let keymap_index = 9; let (mut pressed_key_state, _) = key.new_pressed_key();
1088
1089 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 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 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 let mut context = tri_layer_context();
1134
1135 context.handle_layer_event(LayerEvent::Activated(1));
1137
1138 assert_eq!(Activity::Inactive, context.active_layers[2]);
1140 }
1141
1142 #[test]
1143 fn test_conditional_layer_activates_when_all_if_layers_active() {
1144 let mut context = tri_layer_context();
1146 context.handle_layer_event(LayerEvent::Activated(1));
1147
1148 context.handle_layer_event(LayerEvent::Activated(2));
1150
1151 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 let mut context = tri_layer_context();
1162 context.handle_layer_event(LayerEvent::Activated(1));
1163 context.handle_layer_event(LayerEvent::Activated(2));
1164
1165 context.handle_layer_event(LayerEvent::Deactivated(1));
1167
1168 assert_eq!(Activity::Inactive, context.active_layers[2]);
1170 }
1171
1172 #[test]
1173 fn test_conditional_layer_nested_fixed_point() {
1174 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 context.handle_layer_event(LayerEvent::Activated(4));
1187
1188 assert_eq!(
1190 [
1191 Activity::Active(ActivationStyle::Regular), Activity::Active(ActivationStyle::Regular), Activity::Active(ActivationStyle::Regular), ],
1195 context.active_layers[2..5]
1196 );
1197 }
1198
1199 #[test]
1200 fn test_conditional_layer_sticky_if_layer_counts_as_active() {
1201 let mut context = tri_layer_context();
1203 context.handle_layer_event(LayerEvent::StickyActivated(1));
1204
1205 context.handle_layer_event(LayerEvent::Activated(2));
1207
1208 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 let mut context = tri_layer_context();
1219 context.handle_layer_event(LayerEvent::Activated(1));
1220 context.handle_layer_event(LayerEvent::Activated(2));
1221
1222 context.handle_layer_event(LayerEvent::Set(ModifierBitset {
1224 layers: 0,
1225 mask: 1 << 1,
1226 }));
1227
1228 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 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 let keymap_index = 9; let key_ref = Ref::Layered(0);
1250 let (pkr, _pke) = system.new_pressed_key(keymap_index, &context, key_ref);
1251
1252 let expected_pkr =
1254 key::PressedKeyResult::NewPressedKey(key::NewPressedKey::Key(expected_ref));
1255 assert_eq!(expected_pkr, pkr,);
1256 }
1257
1258 #[test]
1263 fn test_pressing_layered_key_falls_through_undefined_active_layers() {
1264 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 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; let key_ref = Ref::Layered(0);
1276 let (pkr, _pke) = system.new_pressed_key(keymap_index, &context, key_ref);
1277
1278 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 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 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; let key_ref = Ref::Layered(0);
1305 let (pkr, _pke) = system.new_pressed_key(keymap_index, &context, key_ref);
1306
1307 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 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 context.handle_layer_event(LayerEvent::Activated(1));
1326 context.handle_layer_event(LayerEvent::Activated(3));
1327 let keymap_index = 9; let key_ref = Ref::Layered(0);
1329 let (pkr, _pke) = system.new_pressed_key(keymap_index, &context, key_ref);
1330
1331 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 let layer = 1;
1353 let key = ModifierKey::Toggle(layer);
1354
1355 let (_pressed_key, layer_event) = key.new_pressed_key();
1357
1358 assert_eq!(Some(LayerEvent::Toggled(layer)), layer_event);
1360 }
1361}