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
16#[derive(Debug, Deserialize, Clone, Copy, PartialEq)]
18pub enum ModifierKey {
19 Hold(LayerIndex),
21 Default(LayerIndex),
23}
24
25impl ModifierKey {
26 pub const fn hold(layer: LayerIndex) -> Self {
28 ModifierKey::Hold(layer)
29 }
30
31 pub const fn default(layer: LayerIndex) -> Self {
33 ModifierKey::Default(layer)
34 }
35
36 pub fn new_pressed_key(&self) -> (ModifierKeyState, LayerEvent) {
40 match self {
41 ModifierKey::Hold(layer) => {
42 let pks = ModifierKeyState(*self);
43 let event = LayerEvent::LayerActivated(*layer);
44 (pks, event)
45 }
46 ModifierKey::Default(layer) => {
47 let pks = ModifierKeyState(*self);
48 let event = LayerEvent::DefaultLayerSet(*layer);
49 (pks, event)
50 }
51 }
52 }
53}
54
55impl key::Key for ModifierKey {
56 type Context = crate::init::Context;
57 type Event = crate::init::Event;
58 type PendingKeyState = crate::init::PendingKeyState;
59 type KeyState = crate::init::KeyState;
60
61 fn new_pressed_key(
62 &self,
63 _context: &Self::Context,
64 key_path: key::KeyPath,
65 ) -> (
66 key::PressedKeyResult<Self::PendingKeyState, Self::KeyState>,
67 key::KeyEvents<Self::Event>,
68 ) {
69 let keymap_index: u16 = key_path[0];
70 let (m_ks, lmod_ev) = self.new_pressed_key();
71 let pks = key::PressedKeyResult::Resolved(m_ks.into());
72 let pke = key::KeyEvents::event(key::Event::key_event(keymap_index, lmod_ev)).into_events();
73 (pks, pke)
74 }
75
76 fn handle_event(
77 &self,
78 _pending_state: &mut Self::PendingKeyState,
79 _context: &Self::Context,
80 _key_path: key::KeyPath,
81 _event: key::Event<Self::Event>,
82 ) -> (
83 Option<key::PressedKeyResult<Self::PendingKeyState, Self::KeyState>>,
84 key::KeyEvents<Self::Event>,
85 ) {
86 panic!()
87 }
88
89 fn lookup(
90 &self,
91 _path: &[u16],
92 ) -> &dyn key::Key<
93 Context = Self::Context,
94 Event = Self::Event,
95 PendingKeyState = Self::PendingKeyState,
96 KeyState = Self::KeyState,
97 > {
98 self
99 }
100}
101
102impl From<LayerEvent> for () {
103 fn from(_: LayerEvent) -> Self {}
104}
105
106pub trait LayerState: Copy + Debug {
108 fn activate(&mut self, layer: LayerIndex);
110 fn deactivate(&mut self, layer: LayerIndex);
112 fn active_layers(&self) -> impl Iterator<Item = LayerIndex>;
114}
115
116impl<const L: usize> LayerState for [bool; L] {
117 fn activate(&mut self, layer_index: LayerIndex) {
118 debug_assert!(
119 layer_index < L,
120 "layer must be less than array length of {}",
121 L
122 );
123 self[layer_index - 1] = true;
124 }
125
126 fn deactivate(&mut self, layer_index: LayerIndex) {
127 debug_assert!(
128 layer_index < L,
129 "layer must be less than array length of {}",
130 L
131 );
132 self[layer_index - 1] = false;
133 }
134
135 fn active_layers(&self) -> impl Iterator<Item = LayerIndex> {
136 self.iter()
137 .enumerate()
138 .rev()
139 .filter_map(|(i, &active)| if active { Some(i + 1) } else { None })
140 }
141}
142
143#[derive(Debug, Clone, Copy)]
145pub struct Context {
146 default_layer: Option<LayerIndex>,
147 active_layers: [bool; LAYER_COUNT],
148}
149
150pub const DEFAULT_CONTEXT: Context = Context {
152 default_layer: None,
153 active_layers: [false; LAYER_COUNT],
154};
155
156impl Context {
157 pub const fn new() -> Self {
159 DEFAULT_CONTEXT
160 }
161}
162
163impl Default for Context {
164 fn default() -> Self {
165 DEFAULT_CONTEXT
166 }
167}
168
169impl Context {
170 pub fn activate_layer(&mut self, layer: LayerIndex) {
172 self.active_layers.activate(layer);
173 }
174
175 pub fn layer_state(&self) -> &[bool; LAYER_COUNT] {
177 &self.active_layers
178 }
179
180 pub fn handle_event(&mut self, event: LayerEvent) {
182 match event {
183 LayerEvent::LayerActivated(layer) => {
184 self.active_layers.activate(layer);
185 }
186 LayerEvent::LayerDeactivated(layer) => {
187 self.active_layers.deactivate(layer);
188 }
189 LayerEvent::DefaultLayerSet(0) => self.default_layer = None,
190 LayerEvent::DefaultLayerSet(layer) => self.default_layer = Some(layer),
191 }
192 }
193}
194
195#[derive(Debug, Clone, Copy, PartialEq)]
197pub enum LayersError {
198 Overflow,
200}
201
202impl core::fmt::Display for LayersError {
203 fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result {
205 write!(f, "LayersError::Overflow")
206 }
207}
208
209pub trait Layers<K: key::Key>: Copy + Debug {
211 fn highest_active_key<LS: LayerState>(
213 &self,
214 layer_state: &LS,
215 default_layer: Option<LayerIndex>,
216 ) -> Option<(LayerIndex, &K)>;
217 fn from_iterable<I: IntoIterator<Item = Option<K>>>(keys: I) -> Result<Self, LayersError>;
219}
220
221impl<K: key::Key + Copy, const L: usize> Layers<K> for [Option<K>; L] {
222 fn highest_active_key<LS: LayerState>(
223 &self,
224 layer_state: &LS,
225 default_layer: Option<LayerIndex>,
226 ) -> Option<(LayerIndex, &K)> {
227 for layer_index in layer_state.active_layers() {
228 if self[layer_index - 1].is_some() {
229 return self[layer_index - 1].as_ref().map(|k| (layer_index, k));
230 }
231 }
232
233 match default_layer {
234 Some(layer_index) if self[layer_index - 1].is_some() => {
235 self[layer_index - 1].as_ref().map(|k| (layer_index, k))
236 }
237 _ => None,
238 }
239 }
240
241 fn from_iterable<I: IntoIterator<Item = Option<K>>>(keys: I) -> Result<Self, LayersError> {
242 let mut layered: [Option<K>; L] = [None; L];
243 for (i, maybe_key) in keys.into_iter().enumerate() {
244 if i < L {
245 layered[i] = maybe_key;
246 } else {
247 return Err(LayersError::Overflow);
248 }
249 }
250 Ok(layered)
251 }
252}
253
254pub const fn layered_keys<K: Copy, const L: usize>(
256 keys: [Option<K>; L],
257) -> [Option<K>; LAYER_COUNT] {
258 let mut layered: [Option<K>; LAYER_COUNT] = [None; LAYER_COUNT];
259
260 if L > LAYER_COUNT {
261 panic!("Too many layers for layered_keys");
262 }
263
264 let mut i = 0;
265
266 while i < L {
267 layered[i] = keys[i];
268 i += 1;
269 }
270
271 layered
272}
273
274#[derive(Debug, Deserialize, Clone, Copy, PartialEq)]
276pub struct LayeredKey<K: key::Key + Copy + PartialEq> {
277 pub base: K,
279 #[serde(deserialize_with = "deserialize_layered")]
281 #[serde(bound(deserialize = "K: Deserialize<'de>"))]
282 pub layered: [Option<K>; LAYER_COUNT],
283}
284
285fn deserialize_layered<'de, K, L: Layers<K>, D>(deserializer: D) -> Result<L, D::Error>
287where
288 K: key::Key + Deserialize<'de>,
289 D: serde::Deserializer<'de>,
290{
291 let keys_vec: heapless::Vec<Option<K>, 64> = Deserialize::deserialize(deserializer)?;
292
293 L::from_iterable(keys_vec).map_err(serde::de::Error::custom)
294}
295
296impl<K: key::Key + Copy + PartialEq> LayeredKey<K> {
297 pub const fn new<const L: usize>(base: K, layered: [Option<K>; L]) -> Self {
299 let layered = layered_keys(layered);
300 Self { base, layered }
301 }
302}
303
304impl<K: key::Key + Copy + PartialEq> LayeredKey<K>
305where
306 for<'c> &'c K::Context: Into<&'c Context>,
307{
308 fn new_pressed_key(
310 &self,
311 context: &K::Context,
312 key_path: key::KeyPath,
313 ) -> (
314 key::PressedKeyResult<K::PendingKeyState, K::KeyState>,
315 key::KeyEvents<K::Event>,
316 ) {
317 let layer_context: &Context = context.into();
318 let (layer, passthrough_key) = self
319 .layered
320 .highest_active_key(layer_context.layer_state(), layer_context.default_layer)
321 .unwrap_or((0, &self.base));
322
323 let (pkr, pke) = passthrough_key.new_pressed_key(context, key_path);
325 (pkr.add_path_item(layer as u16), pke)
326 }
327}
328
329impl<
330 K: key::Key<
331 Context = crate::init::Context,
332 Event = crate::init::Event,
333 PendingKeyState = crate::init::PendingKeyState,
334 KeyState = crate::init::KeyState,
335 > + Copy
336 + PartialEq,
337 > key::Key for LayeredKey<K>
338{
339 type Context = crate::init::Context;
340 type Event = crate::init::Event;
341 type PendingKeyState = crate::init::PendingKeyState;
342 type KeyState = crate::init::KeyState;
343
344 fn new_pressed_key(
345 &self,
346 context: &Self::Context,
347 key_path: key::KeyPath,
348 ) -> (
349 key::PressedKeyResult<Self::PendingKeyState, Self::KeyState>,
350 key::KeyEvents<Self::Event>,
351 ) {
352 self.new_pressed_key(context, key_path)
353 }
354
355 fn handle_event(
356 &self,
357 _pending_state: &mut Self::PendingKeyState,
358 _context: &Self::Context,
359 _key_path: key::KeyPath,
360 _event: key::Event<Self::Event>,
361 ) -> (
362 Option<key::PressedKeyResult<Self::PendingKeyState, Self::KeyState>>,
363 key::KeyEvents<Self::Event>,
364 ) {
365 panic!()
366 }
367
368 fn lookup(
369 &self,
370 path: &[u16],
371 ) -> &dyn key::Key<
372 Context = Self::Context,
373 Event = Self::Event,
374 PendingKeyState = Self::PendingKeyState,
375 KeyState = Self::KeyState,
376 > {
377 match path {
378 [] => panic!(),
379 [0, path @ ..] => self.base.lookup(path),
380 [layer_index, path @ ..] => self.layered[(layer_index - 1) as usize]
381 .as_ref()
382 .unwrap()
383 .lookup(path),
384 }
385 }
386}
387
388#[derive(Debug, Clone, Copy, Eq, PartialEq)]
390pub enum LayerEvent {
391 LayerActivated(LayerIndex),
393 LayerDeactivated(LayerIndex),
395 DefaultLayerSet(LayerIndex),
397}
398
399#[derive(Debug, Clone, Copy, PartialEq)]
401pub struct ModifierKeyState(ModifierKey);
402
403impl ModifierKeyState {
404 pub fn handle_event(
406 &mut self,
407 keymap_index: u16,
408 event: key::Event<LayerEvent>,
409 ) -> Option<LayerEvent> {
410 let ModifierKeyState(key) = self;
411 match key {
412 ModifierKey::Hold(layer) => match event {
413 key::Event::Input(input::Event::Release { keymap_index: ki }) => {
414 if keymap_index == ki {
415 Some(LayerEvent::LayerDeactivated(*layer))
416 } else {
417 None
418 }
419 }
420 _ => None,
421 },
422 ModifierKey::Default(layer) => match event {
423 key::Event::Input(input::Event::Release { keymap_index: ki }) => {
424 if keymap_index == ki {
425 Some(LayerEvent::DefaultLayerSet(*layer))
426 } else {
427 None
428 }
429 }
430 _ => None,
431 },
432 }
433 }
434}
435
436#[cfg(test)]
437mod tests {
438 use super::*;
439
440 use key::keyboard;
441
442 use key::KeyOutput;
443
444 use key::composite::KeyState;
445
446 #[test]
447 fn test_pressing_hold_modifier_key_emits_event_activate_layer() {
448 let layer = 1;
449 let key = ModifierKey::Hold(layer);
450
451 let (_pressed_key, layer_event) = key.new_pressed_key();
452
453 assert_eq!(LayerEvent::LayerActivated(layer), layer_event);
454 }
455
456 #[test]
457 fn test_releasing_hold_modifier_key_emits_event_deactivate_layer() {
458 let layer = 1;
460 let key = ModifierKey::Hold(layer);
461 let keymap_index = 9; let (mut pressed_key_state, _) = key.new_pressed_key();
463
464 let actual_events = pressed_key_state
466 .handle_event(
467 keymap_index,
468 key::Event::Input(input::Event::Release { keymap_index }),
469 )
470 .into_iter()
471 .next();
472
473 let first_ev = actual_events.into_iter().next();
475 if let Some(actual_layer_event) = first_ev {
476 let expected_layer_event = LayerEvent::LayerDeactivated(layer);
477 assert_eq!(expected_layer_event, actual_layer_event);
478 } else {
479 panic!("Expected Some LayerDeactivated event");
480 }
481 }
482
483 #[test]
484 fn test_releasing_different_hold_modifier_key_does_not_emit_event() {
485 let layer = 1;
487 let key = ModifierKey::Hold(layer);
488 let keymap_index = 9; let (mut pressed_key_state, _) = key.new_pressed_key();
490
491 let different_keymap_index = keymap_index + 1;
493 let different_key_released_ev = key::Event::Input(input::Event::Release {
494 keymap_index: different_keymap_index,
495 });
496 let actual_events = pressed_key_state
497 .handle_event(keymap_index, different_key_released_ev)
498 .into_iter()
499 .next();
500
501 if actual_events.is_some() {
503 panic!("Expected no event emitted");
504 }
505 }
506
507 #[test]
508 fn test_context_handling_event_adjusts_active_layers() {
509 let mut context: Context = Context::default();
510
511 context.handle_event(LayerEvent::LayerActivated(2));
512
513 let actual_active_layers = &context.active_layers[0..3];
514 assert_eq!(&[false, true, false], actual_active_layers);
515 }
516
517 #[test]
518 fn test_pressing_layered_key_acts_as_base_key_when_no_layers_active() {
519 let context = key::composite::Context::default();
521 let expected_key = keyboard::Key::new(0x04);
522 let layered_key = LayeredKey::new(
523 expected_key,
524 [
525 Some(keyboard::Key::new(0x05)),
526 Some(keyboard::Key::new(0x06)),
527 Some(keyboard::Key::new(0x07)),
528 ],
529 );
530
531 let keymap_index = 9; let key_path = key::key_path(keymap_index);
534 let (actual_key_state, _actual_event) = layered_key.new_pressed_key(&context, key_path);
535
536 let expected_key_state: KeyState = KeyState::Keyboard(expected_key.new_pressed_key());
538 assert_eq!(expected_key_state, actual_key_state.unwrap_resolved(),);
539 }
540
541 #[test]
542 fn test_pressing_layered_key_when_no_layers_active_has_key_code() {
543 use key::KeyState as _;
544
545 let context = key::composite::Context::default();
547 let expected_key = keyboard::Key::new(0x04);
548 let layered_key = LayeredKey::new(
549 expected_key,
550 [
551 Some(keyboard::Key::new(0x05)),
552 Some(keyboard::Key::new(0x06)),
553 Some(keyboard::Key::new(0x07)),
554 ],
555 );
556
557 let keymap_index = 9; let key_path = key::key_path(keymap_index);
560 let (actual_pressed_key, _event) = layered_key.new_pressed_key(&context, key_path);
561
562 let actual_key_output = actual_pressed_key.unwrap_resolved().key_output();
563
564 let expected_pressed_key_state = expected_key.new_pressed_key();
566 let expected_key_output = Some(expected_pressed_key_state.key_output());
567 assert_eq!(expected_key_output, actual_key_output);
568 assert_eq!(Some(KeyOutput::from_key_code(0x04)), actual_key_output,);
569 }
570
571 #[test]
576 fn test_pressing_layered_key_falls_through_undefined_active_layers() {
577 use key::Context as _;
578
579 let mut context = key::composite::Context::default();
581 let expected_key = keyboard::Key::new(0x04);
582 let layered_key = LayeredKey::new(expected_key, [None, None, None]);
583
584 context.handle_event(key::Event::key_event(
586 0,
587 LayerEvent::LayerActivated(1).into(),
588 ));
589 context.handle_event(key::Event::key_event(
590 0,
591 LayerEvent::LayerActivated(2).into(),
592 ));
593 context.handle_event(key::Event::key_event(
594 0,
595 LayerEvent::LayerActivated(3).into(),
596 ));
597 let keymap_index = 9; let key_path = key::key_path(keymap_index);
599 let (actual_pressed_key, _actual_event) = layered_key.new_pressed_key(&context, key_path);
600
601 let expected_pressed_key = KeyState::Keyboard(expected_key.new_pressed_key());
603 assert_eq!(expected_pressed_key, actual_pressed_key.unwrap_resolved(),);
604 }
605
606 #[test]
607 fn test_pressing_layered_key_acts_as_highest_defined_active_layer() {
608 use key::Context as _;
609
610 let mut context = key::composite::Context::default();
612 let expected_key = keyboard::Key::new(0x09);
613 let layered_key = LayeredKey::new(
614 keyboard::Key::new(0x04),
615 [
616 Some(keyboard::Key::new(0x05)),
617 Some(keyboard::Key::new(0x06)),
618 Some(expected_key),
619 ],
620 );
621
622 context.handle_event(key::Event::key_event(
624 0,
625 LayerEvent::LayerActivated(1).into(),
626 ));
627 context.handle_event(key::Event::key_event(
628 0,
629 LayerEvent::LayerActivated(2).into(),
630 ));
631 context.handle_event(key::Event::key_event(
632 0,
633 LayerEvent::LayerActivated(3).into(),
634 ));
635 let keymap_index = 9; let key_path = key::key_path(keymap_index);
637 let (actual_pressed_key, _actual_event) = layered_key.new_pressed_key(&context, key_path);
638
639 let expected_pressed_key = KeyState::Keyboard(expected_key.new_pressed_key());
641 assert_eq!(expected_pressed_key, actual_pressed_key.unwrap_resolved(),);
642 }
643
644 #[test]
645 fn test_pressing_layered_key_with_some_transparency_acts_as_highest_defined_active_layer() {
646 use key::Context as _;
647
648 let mut context = key::composite::Context::default();
650 let expected_key = keyboard::Key::new(0x09);
651 let layered_key = LayeredKey::new(
652 keyboard::Key::new(0x04),
653 [Some(expected_key), Some(keyboard::Key::new(0x06)), None],
654 );
655
656 context.handle_event(key::Event::key_event(
658 0,
659 LayerEvent::LayerActivated(1).into(),
660 ));
661 context.handle_event(key::Event::key_event(
662 0,
663 LayerEvent::LayerActivated(3).into(),
664 ));
665 let keymap_index = 9; let key_path = key::key_path(keymap_index);
667 let (actual_pressed_key, _actual_event) = layered_key.new_pressed_key(&context, key_path);
668
669 let expected_pressed_key = KeyState::Keyboard(expected_key.new_pressed_key());
671 assert_eq!(expected_pressed_key, actual_pressed_key.unwrap_resolved(),);
672 }
673
674 #[test]
675 fn test_deserialize_json_option_keyboard() {
676 let actual: Option<key::keyboard::Key> =
677 serde_json::from_str(r#"{"key_code": 4}"#).unwrap();
678 let expected: Option<key::keyboard::Key> = Some(keyboard::Key::new(0x04));
679 assert_eq!(expected, actual);
680 }
681
682 #[test]
683 fn test_deserialize_json_vec1_option_keyboard() {
684 let actual: heapless::Vec<Option<key::keyboard::Key>, 1> =
685 serde_json::from_str(r#"[{"key_code": 4}]"#).unwrap();
686 let mut expected: heapless::Vec<Option<key::keyboard::Key>, 1> = heapless::Vec::new();
687 expected.push(Some(keyboard::Key::new(0x04))).unwrap();
688 assert_eq!(expected, actual);
689 }
690
691 #[test]
692 fn test_deserialize_json_array1_option_keyboard() {
693 let actual: [Option<key::keyboard::Key>; 1] =
694 serde_json::from_str(r#"[{"key_code": 4}]"#).unwrap();
695 let expected: [Option<key::keyboard::Key>; 1] = [Some(keyboard::Key::new(0x04))];
696 assert_eq!(expected, actual);
697 }
698
699 #[test]
700 fn test_deserialize_json_layered_key_keyboard_0layer() {
701 let actual_key: LayeredKey<key::keyboard::Key> =
702 serde_json::from_str(r#"{"base": {"key_code": 4}, "layered": []}"#).unwrap();
703 let expected_key: LayeredKey<key::keyboard::Key> =
704 LayeredKey::new(key::keyboard::Key::new(0x04), []);
705 assert_eq!(expected_key, actual_key);
706 }
707
708 #[test]
709 fn test_layer_state_array_active_layers() {
710 let mut layer_state: [bool; 5] = [false; 5];
711 layer_state.activate(1);
712 layer_state.activate(2);
713 layer_state.activate(4);
714 let actual_active_layers: Vec<LayerIndex> = layer_state.active_layers().collect();
715 let expected_active_layers: Vec<LayerIndex> = vec![4, 2, 1];
716
717 assert_eq!(expected_active_layers, actual_active_layers);
718 }
719}