1#![doc = include_str!("doc_de_layered.md")]
2
3use core::fmt::Debug;
4use core::marker::Copy;
5
6use serde::Deserialize;
7
8use crate::input;
9use crate::key;
10
11pub use crate::init::LAYER_COUNT;
12
13pub type LayerIndex = usize;
15
16pub type LayerBitset = u32;
19
20pub const MAX_BITSET_LAYER: usize = 8 * core::mem::size_of::<LayerBitset>() - 1;
22
23#[derive(Debug, Deserialize, Clone, Copy, PartialEq)]
25pub enum ModifierKey {
26 Hold(LayerIndex),
28 SetActiveLayers(LayerBitset),
30 Default(LayerIndex),
32}
33
34impl ModifierKey {
35 pub const fn hold(layer: LayerIndex) -> Self {
37 ModifierKey::Hold(layer)
38 }
39
40 pub const fn set_active_layers(layers: &[LayerIndex]) -> Self {
44 let mut bitset = 0;
45
46 let mut idx = 0;
47 while idx < layers.len() {
48 let layer = layers[idx];
49 if layer < MAX_BITSET_LAYER {
50 bitset |= 1 << layer;
51 } else {
52 panic!("LayerIndex must be less than MAX_BITSET_LAYER");
53 }
54 idx += 1;
55 }
56
57 ModifierKey::SetActiveLayers(bitset)
58 }
59
60 pub const fn set_active_layers_from_bitset(bitset: LayerBitset) -> Self {
62 ModifierKey::SetActiveLayers(bitset)
63 }
64
65 pub const fn default(layer: LayerIndex) -> Self {
67 ModifierKey::Default(layer)
68 }
69
70 pub fn new_pressed_key(&self) -> (ModifierKeyState, LayerEvent) {
74 match self {
75 ModifierKey::Hold(layer) => {
76 let pks = ModifierKeyState(*self);
77 let event = LayerEvent::LayerActivated(*layer);
78 (pks, event)
79 }
80 ModifierKey::SetActiveLayers(layer_set) => {
81 let pks = ModifierKeyState(*self);
82 let event = LayerEvent::LayersSet(*layer_set);
83 (pks, event)
84 }
85 ModifierKey::Default(layer) => {
86 let pks = ModifierKeyState(*self);
87 let event = LayerEvent::DefaultLayerSet(*layer);
88 (pks, event)
89 }
90 }
91 }
92}
93
94impl key::Key for ModifierKey {
95 type Context = crate::init::Context;
96 type Event = crate::init::Event;
97 type PendingKeyState = crate::init::PendingKeyState;
98 type KeyState = crate::init::KeyState;
99
100 fn new_pressed_key(
101 &self,
102 _context: &Self::Context,
103 key_path: key::KeyPath,
104 ) -> (
105 key::PressedKeyResult<Self::PendingKeyState, Self::KeyState>,
106 key::KeyEvents<Self::Event>,
107 ) {
108 let keymap_index: u16 = key_path.keymap_index();
109 let (m_ks, lmod_ev) = self.new_pressed_key();
110 let pks = key::PressedKeyResult::Resolved(m_ks.into());
111 let pke = key::KeyEvents::event(key::Event::key_event(keymap_index, lmod_ev)).into_events();
112 (pks, pke)
113 }
114
115 fn handle_event(
116 &self,
117 _pending_state: &mut Self::PendingKeyState,
118 _context: &Self::Context,
119 _key_path: key::KeyPath,
120 _event: key::Event<Self::Event>,
121 ) -> (Option<key::NewPressedKey>, key::KeyEvents<Self::Event>) {
122 panic!()
123 }
124
125 fn lookup(
126 &self,
127 _path: &[u16],
128 ) -> &dyn key::Key<
129 Context = Self::Context,
130 Event = Self::Event,
131 PendingKeyState = Self::PendingKeyState,
132 KeyState = Self::KeyState,
133 > {
134 self
135 }
136}
137
138impl From<LayerEvent> for () {
139 fn from(_: LayerEvent) -> Self {}
140}
141
142pub trait LayerState: Copy + Debug {
144 fn activate(&mut self, layer: LayerIndex);
146 fn deactivate(&mut self, layer: LayerIndex);
148 fn active_layers(&self) -> impl Iterator<Item = LayerIndex>;
150}
151
152impl<const L: usize> LayerState for [bool; L] {
153 fn activate(&mut self, layer_index: LayerIndex) {
154 debug_assert!(
155 layer_index < L,
156 "layer must be less than array length of {}",
157 L
158 );
159 self[layer_index - 1] = true;
160 }
161
162 fn deactivate(&mut self, layer_index: LayerIndex) {
163 debug_assert!(
164 layer_index < L,
165 "layer must be less than array length of {}",
166 L
167 );
168 self[layer_index - 1] = false;
169 }
170
171 fn active_layers(&self) -> impl Iterator<Item = LayerIndex> {
172 self.iter()
173 .enumerate()
174 .rev()
175 .filter_map(|(i, &active)| if active { Some(i + 1) } else { None })
176 }
177}
178
179#[derive(Debug, Clone, Copy)]
181pub struct Context {
182 default_layer: Option<LayerIndex>,
183 active_layers: [bool; LAYER_COUNT],
184}
185
186pub const DEFAULT_CONTEXT: Context = Context {
188 default_layer: None,
189 active_layers: [false; LAYER_COUNT],
190};
191
192impl Context {
193 pub const fn new() -> Self {
195 DEFAULT_CONTEXT
196 }
197}
198
199impl Default for Context {
200 fn default() -> Self {
201 DEFAULT_CONTEXT
202 }
203}
204
205impl Context {
206 pub fn activate_layer(&mut self, layer: LayerIndex) {
208 self.active_layers.activate(layer);
209 }
210
211 pub fn layer_state(&self) -> &[bool; LAYER_COUNT] {
213 &self.active_layers
214 }
215
216 pub fn handle_event(&mut self, event: LayerEvent) {
218 match event {
219 LayerEvent::LayerActivated(layer) => {
220 self.active_layers.activate(layer);
221 }
222 LayerEvent::LayerDeactivated(layer) => {
223 self.active_layers.deactivate(layer);
224 }
225 LayerEvent::LayersSet(layer_set) => {
226 let max_layer = LAYER_COUNT.min(MAX_BITSET_LAYER + 1);
227
228 for li in 1..max_layer {
230 if (layer_set & (1 << li)) != 0 {
231 self.active_layers.activate(li);
232 } else {
233 self.active_layers.deactivate(li);
234 }
235 }
236 }
237 LayerEvent::DefaultLayerSet(0) => self.default_layer = None,
238 LayerEvent::DefaultLayerSet(layer) => self.default_layer = Some(layer),
239 }
240 }
241}
242
243#[derive(Debug, Clone, Copy, PartialEq)]
245pub enum LayersError {
246 Overflow,
248}
249
250impl core::fmt::Display for LayersError {
251 fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result {
253 write!(f, "LayersError::Overflow")
254 }
255}
256
257pub trait Layers<K: key::Key>: Copy + Debug {
259 fn highest_active_key<LS: LayerState>(
261 &self,
262 layer_state: &LS,
263 default_layer: Option<LayerIndex>,
264 ) -> Option<(LayerIndex, &K)>;
265 fn from_iterable<I: IntoIterator<Item = Option<K>>>(keys: I) -> Result<Self, LayersError>;
267}
268
269impl<K: key::Key + Copy, const L: usize> Layers<K> for [Option<K>; L] {
270 fn highest_active_key<LS: LayerState>(
271 &self,
272 layer_state: &LS,
273 default_layer: Option<LayerIndex>,
274 ) -> Option<(LayerIndex, &K)> {
275 for layer_index in layer_state.active_layers() {
276 if self[layer_index - 1].is_some() {
277 return self[layer_index - 1].as_ref().map(|k| (layer_index, k));
278 }
279 }
280
281 match default_layer {
282 Some(layer_index) if self[layer_index - 1].is_some() => {
283 self[layer_index - 1].as_ref().map(|k| (layer_index, k))
284 }
285 _ => None,
286 }
287 }
288
289 fn from_iterable<I: IntoIterator<Item = Option<K>>>(keys: I) -> Result<Self, LayersError> {
290 let mut layered: [Option<K>; L] = [None; L];
291 for (i, maybe_key) in keys.into_iter().enumerate() {
292 if i < L {
293 layered[i] = maybe_key;
294 } else {
295 return Err(LayersError::Overflow);
296 }
297 }
298 Ok(layered)
299 }
300}
301
302pub const fn layered_keys<K: Copy, const L: usize>(
304 keys: [Option<K>; L],
305) -> [Option<K>; LAYER_COUNT] {
306 let mut layered: [Option<K>; LAYER_COUNT] = [None; LAYER_COUNT];
307
308 if L > LAYER_COUNT {
309 panic!("Too many layers for layered_keys");
310 }
311
312 let mut i = 0;
313
314 while i < L {
315 layered[i] = keys[i];
316 i += 1;
317 }
318
319 layered
320}
321
322#[derive(Debug, Deserialize, Clone, Copy, PartialEq)]
324pub struct LayeredKey<K: key::Key + Copy + PartialEq> {
325 pub base: K,
327 #[serde(deserialize_with = "deserialize_layered")]
329 #[serde(bound(deserialize = "K: Deserialize<'de>"))]
330 pub layered: [Option<K>; LAYER_COUNT],
331}
332
333fn deserialize_layered<'de, K, L: Layers<K>, D>(deserializer: D) -> Result<L, D::Error>
335where
336 K: key::Key + Deserialize<'de>,
337 D: serde::Deserializer<'de>,
338{
339 let keys_vec: heapless::Vec<Option<K>, 64> = Deserialize::deserialize(deserializer)?;
340
341 L::from_iterable(keys_vec).map_err(serde::de::Error::custom)
342}
343
344impl<K: key::Key + Copy + PartialEq> LayeredKey<K> {
345 pub const fn new<const L: usize>(base: K, layered: [Option<K>; L]) -> Self {
347 let layered = layered_keys(layered);
348 Self { base, layered }
349 }
350}
351
352impl<K: key::Key + Copy + PartialEq> LayeredKey<K>
353where
354 for<'c> &'c K::Context: Into<&'c Context>,
355{
356 fn new_pressed_key(
358 &self,
359 context: &K::Context,
360 key_path: key::KeyPath,
361 ) -> (
362 key::PressedKeyResult<K::PendingKeyState, K::KeyState>,
363 key::KeyEvents<K::Event>,
364 ) {
365 let layer_context: &Context = context.into();
366 let (layer, passthrough_key) = self
367 .layered
368 .highest_active_key(layer_context.layer_state(), layer_context.default_layer)
369 .unwrap_or((0, &self.base));
370
371 let (pkr, pke) = passthrough_key.new_pressed_key(context, key_path);
373 (pkr.append_path_item(layer as u16), pke)
374 }
375}
376
377impl<
378 K: key::Key<
379 Context = crate::init::Context,
380 Event = crate::init::Event,
381 PendingKeyState = crate::init::PendingKeyState,
382 KeyState = crate::init::KeyState,
383 > + Copy
384 + PartialEq,
385 > key::Key for LayeredKey<K>
386{
387 type Context = crate::init::Context;
388 type Event = crate::init::Event;
389 type PendingKeyState = crate::init::PendingKeyState;
390 type KeyState = crate::init::KeyState;
391
392 fn new_pressed_key(
393 &self,
394 context: &Self::Context,
395 key_path: key::KeyPath,
396 ) -> (
397 key::PressedKeyResult<Self::PendingKeyState, Self::KeyState>,
398 key::KeyEvents<Self::Event>,
399 ) {
400 self.new_pressed_key(context, key_path)
401 }
402
403 fn handle_event(
404 &self,
405 _pending_state: &mut Self::PendingKeyState,
406 _context: &Self::Context,
407 _key_path: key::KeyPath,
408 _event: key::Event<Self::Event>,
409 ) -> (Option<key::NewPressedKey>, key::KeyEvents<Self::Event>) {
410 panic!()
411 }
412
413 fn lookup(
414 &self,
415 path: &[u16],
416 ) -> &dyn key::Key<
417 Context = Self::Context,
418 Event = Self::Event,
419 PendingKeyState = Self::PendingKeyState,
420 KeyState = Self::KeyState,
421 > {
422 match path {
423 [] => self,
424 [0, path @ ..] => self.base.lookup(path),
425 [layer_index, path @ ..] => self.layered[(layer_index - 1) as usize]
426 .as_ref()
427 .unwrap()
428 .lookup(path),
429 }
430 }
431}
432
433#[derive(Debug, Clone, Copy, Eq, PartialEq)]
435pub enum LayerEvent {
436 LayerActivated(LayerIndex),
438 LayerDeactivated(LayerIndex),
440 LayersSet(LayerBitset),
442 DefaultLayerSet(LayerIndex),
444}
445
446#[derive(Debug, Clone, Copy, PartialEq)]
448pub struct ModifierKeyState(ModifierKey);
449
450impl ModifierKeyState {
451 pub fn handle_event(
453 &mut self,
454 keymap_index: u16,
455 event: key::Event<LayerEvent>,
456 ) -> Option<LayerEvent> {
457 let ModifierKeyState(key) = self;
458 match key {
459 ModifierKey::Hold(layer) => match event {
460 key::Event::Input(input::Event::Release { keymap_index: ki }) => {
461 if keymap_index == ki {
462 Some(LayerEvent::LayerDeactivated(*layer))
463 } else {
464 None
465 }
466 }
467 _ => None,
468 },
469 ModifierKey::SetActiveLayers(_layer_set) => None,
470 ModifierKey::Default(layer) => match event {
471 key::Event::Input(input::Event::Release { keymap_index: ki }) => {
472 if keymap_index == ki {
473 Some(LayerEvent::DefaultLayerSet(*layer))
474 } else {
475 None
476 }
477 }
478 _ => None,
479 },
480 }
481 }
482}
483
484#[cfg(test)]
485mod tests {
486 use super::*;
487
488 use key::keyboard;
489
490 use key::KeyOutput;
491
492 use key::composite::KeyState;
493
494 #[test]
495 fn test_pressing_hold_modifier_key_emits_event_activate_layer() {
496 let layer = 1;
497 let key = ModifierKey::Hold(layer);
498
499 let (_pressed_key, layer_event) = key.new_pressed_key();
500
501 assert_eq!(LayerEvent::LayerActivated(layer), layer_event);
502 }
503
504 #[test]
505 fn test_releasing_hold_modifier_key_emits_event_deactivate_layer() {
506 let layer = 1;
508 let key = ModifierKey::Hold(layer);
509 let keymap_index = 9; let (mut pressed_key_state, _) = key.new_pressed_key();
511
512 let actual_events = pressed_key_state
514 .handle_event(
515 keymap_index,
516 key::Event::Input(input::Event::Release { keymap_index }),
517 )
518 .into_iter()
519 .next();
520
521 let first_ev = actual_events.into_iter().next();
523 if let Some(actual_layer_event) = first_ev {
524 let expected_layer_event = LayerEvent::LayerDeactivated(layer);
525 assert_eq!(expected_layer_event, actual_layer_event);
526 } else {
527 panic!("Expected Some LayerDeactivated event");
528 }
529 }
530
531 #[test]
532 fn test_releasing_different_hold_modifier_key_does_not_emit_event() {
533 let layer = 1;
535 let key = ModifierKey::Hold(layer);
536 let keymap_index = 9; let (mut pressed_key_state, _) = key.new_pressed_key();
538
539 let different_keymap_index = keymap_index + 1;
541 let different_key_released_ev = key::Event::Input(input::Event::Release {
542 keymap_index: different_keymap_index,
543 });
544 let actual_events = pressed_key_state
545 .handle_event(keymap_index, different_key_released_ev)
546 .into_iter()
547 .next();
548
549 if actual_events.is_some() {
551 panic!("Expected no event emitted");
552 }
553 }
554
555 #[test]
556 fn test_context_handling_event_adjusts_active_layers() {
557 let mut context: Context = Context::default();
558
559 context.handle_event(LayerEvent::LayerActivated(2));
560
561 let actual_active_layers = &context.active_layers[0..3];
562 assert_eq!(&[false, true, false], actual_active_layers);
563 }
564
565 #[test]
566 fn test_pressing_layered_key_acts_as_base_key_when_no_layers_active() {
567 let context = key::composite::Context::default();
569 let expected_key = keyboard::Key::new(0x04);
570 let layered_key = LayeredKey::new(
571 expected_key,
572 [
573 Some(keyboard::Key::new(0x05)),
574 Some(keyboard::Key::new(0x06)),
575 Some(keyboard::Key::new(0x07)),
576 ],
577 );
578
579 let keymap_index = 9; let key_path = key::key_path(keymap_index);
582 let (actual_key_state, _actual_event) = layered_key.new_pressed_key(&context, key_path);
583
584 let expected_key_state: KeyState = KeyState::Keyboard(expected_key.new_pressed_key());
586 assert_eq!(expected_key_state, actual_key_state.unwrap_resolved(),);
587 }
588
589 #[test]
590 fn test_pressing_layered_key_when_no_layers_active_has_key_code() {
591 use key::KeyState as _;
592
593 let context = key::composite::Context::default();
595 let expected_key = keyboard::Key::new(0x04);
596 let layered_key = LayeredKey::new(
597 expected_key,
598 [
599 Some(keyboard::Key::new(0x05)),
600 Some(keyboard::Key::new(0x06)),
601 Some(keyboard::Key::new(0x07)),
602 ],
603 );
604
605 let keymap_index = 9; let key_path = key::key_path(keymap_index);
608 let (actual_pressed_key, _event) = layered_key.new_pressed_key(&context, key_path);
609
610 let actual_key_output = actual_pressed_key.unwrap_resolved().key_output();
611
612 let expected_pressed_key_state = expected_key.new_pressed_key();
614 let expected_key_output = Some(expected_pressed_key_state.key_output());
615 assert_eq!(expected_key_output, actual_key_output);
616 assert_eq!(Some(KeyOutput::from_key_code(0x04)), actual_key_output,);
617 }
618
619 #[test]
624 fn test_pressing_layered_key_falls_through_undefined_active_layers() {
625 use key::Context as _;
626
627 let mut context = key::composite::Context::default();
629 let expected_key = keyboard::Key::new(0x04);
630 let layered_key = LayeredKey::new(expected_key, [None, None, None]);
631
632 context.handle_event(key::Event::key_event(
634 0,
635 LayerEvent::LayerActivated(1).into(),
636 ));
637 context.handle_event(key::Event::key_event(
638 0,
639 LayerEvent::LayerActivated(2).into(),
640 ));
641 context.handle_event(key::Event::key_event(
642 0,
643 LayerEvent::LayerActivated(3).into(),
644 ));
645 let keymap_index = 9; let key_path = key::key_path(keymap_index);
647 let (actual_pressed_key, _actual_event) = layered_key.new_pressed_key(&context, key_path);
648
649 let expected_pressed_key = KeyState::Keyboard(expected_key.new_pressed_key());
651 assert_eq!(expected_pressed_key, actual_pressed_key.unwrap_resolved(),);
652 }
653
654 #[test]
655 fn test_pressing_layered_key_acts_as_highest_defined_active_layer() {
656 use key::Context as _;
657
658 let mut context = key::composite::Context::default();
660 let expected_key = keyboard::Key::new(0x09);
661 let layered_key = LayeredKey::new(
662 keyboard::Key::new(0x04),
663 [
664 Some(keyboard::Key::new(0x05)),
665 Some(keyboard::Key::new(0x06)),
666 Some(expected_key),
667 ],
668 );
669
670 context.handle_event(key::Event::key_event(
672 0,
673 LayerEvent::LayerActivated(1).into(),
674 ));
675 context.handle_event(key::Event::key_event(
676 0,
677 LayerEvent::LayerActivated(2).into(),
678 ));
679 context.handle_event(key::Event::key_event(
680 0,
681 LayerEvent::LayerActivated(3).into(),
682 ));
683 let keymap_index = 9; let key_path = key::key_path(keymap_index);
685 let (actual_pressed_key, _actual_event) = layered_key.new_pressed_key(&context, key_path);
686
687 let expected_pressed_key = KeyState::Keyboard(expected_key.new_pressed_key());
689 assert_eq!(expected_pressed_key, actual_pressed_key.unwrap_resolved(),);
690 }
691
692 #[test]
693 fn test_pressing_layered_key_with_some_transparency_acts_as_highest_defined_active_layer() {
694 use key::Context as _;
695
696 let mut context = key::composite::Context::default();
698 let expected_key = keyboard::Key::new(0x09);
699 let layered_key = LayeredKey::new(
700 keyboard::Key::new(0x04),
701 [Some(expected_key), Some(keyboard::Key::new(0x06)), None],
702 );
703
704 context.handle_event(key::Event::key_event(
706 0,
707 LayerEvent::LayerActivated(1).into(),
708 ));
709 context.handle_event(key::Event::key_event(
710 0,
711 LayerEvent::LayerActivated(3).into(),
712 ));
713 let keymap_index = 9; let key_path = key::key_path(keymap_index);
715 let (actual_pressed_key, _actual_event) = layered_key.new_pressed_key(&context, key_path);
716
717 let expected_pressed_key = KeyState::Keyboard(expected_key.new_pressed_key());
719 assert_eq!(expected_pressed_key, actual_pressed_key.unwrap_resolved(),);
720 }
721
722 #[test]
723 fn test_deserialize_json_option_keyboard() {
724 let actual: Option<key::keyboard::Key> =
725 serde_json::from_str(r#"{"key_code": 4}"#).unwrap();
726 let expected: Option<key::keyboard::Key> = Some(keyboard::Key::new(0x04));
727 assert_eq!(expected, actual);
728 }
729
730 #[test]
731 fn test_deserialize_json_vec1_option_keyboard() {
732 let actual: heapless::Vec<Option<key::keyboard::Key>, 1> =
733 serde_json::from_str(r#"[{"key_code": 4}]"#).unwrap();
734 let mut expected: heapless::Vec<Option<key::keyboard::Key>, 1> = heapless::Vec::new();
735 expected.push(Some(keyboard::Key::new(0x04))).unwrap();
736 assert_eq!(expected, actual);
737 }
738
739 #[test]
740 fn test_deserialize_json_array1_option_keyboard() {
741 let actual: [Option<key::keyboard::Key>; 1] =
742 serde_json::from_str(r#"[{"key_code": 4}]"#).unwrap();
743 let expected: [Option<key::keyboard::Key>; 1] = [Some(keyboard::Key::new(0x04))];
744 assert_eq!(expected, actual);
745 }
746
747 #[test]
748 fn test_deserialize_json_layered_key_keyboard_0layer() {
749 let actual_key: LayeredKey<key::keyboard::Key> =
750 serde_json::from_str(r#"{"base": {"key_code": 4}, "layered": []}"#).unwrap();
751 let expected_key: LayeredKey<key::keyboard::Key> =
752 LayeredKey::new(key::keyboard::Key::new(0x04), []);
753 assert_eq!(expected_key, actual_key);
754 }
755
756 #[test]
757 fn test_layer_state_array_active_layers() {
758 let mut layer_state: [bool; 5] = [false; 5];
759 layer_state.activate(1);
760 layer_state.activate(2);
761 layer_state.activate(4);
762 let actual_active_layers: Vec<LayerIndex> = layer_state.active_layers().collect();
763 let expected_active_layers: Vec<LayerIndex> = vec![4, 2, 1];
764
765 assert_eq!(expected_active_layers, actual_active_layers);
766 }
767}