11//! Layout management.
22
3- use crate :: action:: Action ;
3+ use crate :: action:: { Action , SequenceEvent } ;
44use crate :: key_code:: KeyCode ;
55use arraydeque:: ArrayDeque ;
66use heapless:: consts:: U64 ;
@@ -32,13 +32,18 @@ pub enum Event {
3232 Press ( u8 , u8 ) ,
3333 /// Release event with coordinates (i, j).
3434 Release ( u8 , u8 ) ,
35+ /// Press event with just a keycode (for sequences)
36+ SequencePress ( KeyCode ) ,
37+ /// Release event with just a keycode (for sequences)
38+ SequenceRelease ( KeyCode ) ,
3539}
3640impl Event {
3741 /// Returns the coordinates (i, j) of the event.
3842 pub fn coord ( self ) -> ( u8 , u8 ) {
3943 match self {
4044 Event :: Press ( i, j) => ( i, j) ,
4145 Event :: Release ( i, j) => ( i, j) ,
46+ _ => ( 0 , 0 ) , // Need a NaN version of this or something
4247 }
4348 }
4449
@@ -63,6 +68,13 @@ impl Event {
6368 let ( i, j) = f ( i, j) ;
6469 Event :: Release ( i, j)
6570 }
71+ // Not really sure what (if anything) this needs to be. Just returning as-is
72+ Event :: SequencePress ( k) => {
73+ Event :: SequencePress ( k)
74+ }
75+ Event :: SequenceRelease ( k) => {
76+ Event :: SequenceRelease ( k)
77+ }
6678 }
6779 }
6880}
@@ -71,11 +83,13 @@ impl Event {
7183enum State {
7284 NormalKey { keycode : KeyCode , coord : ( u8 , u8 ) } ,
7385 LayerModifier { value : usize , coord : ( u8 , u8 ) } ,
86+ SequenceKey { keycode : KeyCode } ,
7487}
7588impl State {
7689 fn keycode ( & self ) -> Option < KeyCode > {
7790 match self {
7891 NormalKey { keycode, .. } => Some ( * keycode) ,
92+ SequenceKey { keycode } => Some ( * keycode) ,
7993 _ => None ,
8094 }
8195 }
@@ -90,6 +104,12 @@ impl State {
90104 _ => Some ( * self ) ,
91105 }
92106 }
107+ fn seq_release ( & self , k : KeyCode ) -> Option < Self > {
108+ match * self {
109+ SequenceKey { keycode, .. } if keycode == k => None ,
110+ _ => Some ( * self ) ,
111+ }
112+ }
93113 fn get_layer ( & self ) -> Option < usize > {
94114 match self {
95115 LayerModifier { value, .. } => Some ( * value) ,
@@ -201,6 +221,16 @@ impl Layout {
201221 let action = self . press_as_action ( ( i, j) , self . current_layer ( ) ) ;
202222 self . do_action ( action, ( i, j) , stacked. since ) ;
203223 }
224+ SequenceRelease ( k) => {
225+ self . states = self
226+ . states
227+ . iter ( )
228+ . filter_map ( |s| s. seq_release ( k) )
229+ . collect ( )
230+ }
231+ SequencePress ( k) => {
232+ let _ = self . states . push ( SequenceKey { keycode : k } ) ;
233+ }
204234 }
205235 }
206236 /// A key event.
@@ -278,6 +308,36 @@ impl Layout {
278308 self . do_action ( action, coord, delay) ;
279309 }
280310 }
311+ Sequence { delay, actions } => {
312+ for key_event in actions {
313+ match * key_event {
314+ SequenceEvent :: Press ( keycode) => {
315+ self . stacked . push_back ( Event :: SequencePress ( keycode) . into ( ) ) ;
316+ }
317+ SequenceEvent :: Release ( keycode) => {
318+ self . stacked . push_back ( Event :: SequenceRelease ( keycode) . into ( ) ) ;
319+ }
320+ SequenceEvent :: Tap ( keycode) => {
321+ self . stacked . push_back ( Event :: SequencePress ( keycode) . into ( ) ) ;
322+ self . stacked . push_back ( Event :: SequenceRelease ( keycode) . into ( ) ) ;
323+ }
324+ SequenceEvent :: ReleaseAll ( ) => {
325+ // Can't figure out a good way to handle iterating over self.stacked
326+ // ...without running into borrow checker problems.
327+ // I basically don't know what I'm doing (yet) hehe
328+ // TODO:
329+ // for s in self.stacked.into_iter().collect() {
330+ // match s.event {
331+ // Event::SequencePress(keycode) => {
332+ // self.stacked.push_back(Event::SequenceRelease(keycode.clone()).into());
333+ // }
334+ // _ => { () }
335+ // }
336+ // }
337+ }
338+ }
339+ }
340+ }
281341 Layer ( value) => {
282342 let _ = self . states . push ( LayerModifier { value, coord } ) ;
283343 }
0 commit comments