@@ -23,6 +23,9 @@ pub struct Layout {
23
23
states : Vec < State , U64 > ,
24
24
waiting : Option < WaitingState > ,
25
25
stacked : ArrayDeque < [ Stacked ; 16 ] , arraydeque:: behavior:: Wrapping > ,
26
+ sequenced : ArrayDeque < [ SequenceEvent ; 32 ] , arraydeque:: behavior:: Wrapping > ,
27
+ // Riskable NOTE: Wish we didn't have to preallocate sequenced like this.
28
+ // I want to be able to have my keyboard type long sentences/quotes!
26
29
}
27
30
28
31
/// An event on the key matrix.
@@ -32,18 +35,13 @@ pub enum Event {
32
35
Press ( u8 , u8 ) ,
33
36
/// Release event with coordinates (i, j).
34
37
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 ) ,
39
38
}
40
39
impl Event {
41
40
/// Returns the coordinates (i, j) of the event.
42
41
pub fn coord ( self ) -> ( u8 , u8 ) {
43
42
match self {
44
43
Event :: Press ( i, j) => ( i, j) ,
45
44
Event :: Release ( i, j) => ( i, j) ,
46
- _ => ( 0 , 0 ) , // Need a NaN version of this or something
47
45
}
48
46
}
49
47
@@ -68,28 +66,38 @@ impl Event {
68
66
let ( i, j) = f ( i, j) ;
69
67
Event :: Release ( i, j)
70
68
}
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
- }
78
69
}
79
70
}
80
71
}
81
72
73
+ /// The various states used internally by Keyberon
82
74
#[ derive( Debug , Clone , Copy , Eq , PartialEq ) ]
83
75
enum State {
84
- NormalKey { keycode : KeyCode , coord : ( u8 , u8 ) } ,
85
- LayerModifier { value : usize , coord : ( u8 , u8 ) } ,
86
- SequenceKey { keycode : KeyCode } ,
76
+ /// Normal keys
77
+ NormalKey {
78
+ /// Keycode
79
+ keycode : KeyCode ,
80
+ /// Coordinates in the matrix
81
+ coord : ( u8 , u8 ) ,
82
+ } ,
83
+ /// Layer modifier keys
84
+ LayerModifier {
85
+ /// Value
86
+ value : usize ,
87
+ /// Coordinates of this layer modifier key in the matrix
88
+ coord : ( u8 , u8 ) ,
89
+ } ,
90
+ /// Fake key event for sequences
91
+ FakeKey {
92
+ /// The key to everything!
93
+ keycode : KeyCode ,
94
+ } ,
87
95
}
88
96
impl State {
89
97
fn keycode ( & self ) -> Option < KeyCode > {
90
98
match self {
91
99
NormalKey { keycode, .. } => Some ( * keycode) ,
92
- SequenceKey { keycode } => Some ( * keycode) ,
100
+ FakeKey { keycode } => Some ( * keycode) ,
93
101
_ => None ,
94
102
}
95
103
}
@@ -104,9 +112,9 @@ impl State {
104
112
_ => Some ( * self ) ,
105
113
}
106
114
}
107
- fn seq_release ( & self , k : KeyCode ) -> Option < Self > {
115
+ fn seq_release ( & self , kc : KeyCode ) -> Option < Self > {
108
116
match * self {
109
- SequenceKey { keycode, .. } if keycode == k => None ,
117
+ FakeKey { keycode, .. } if keycode == kc => None ,
110
118
_ => Some ( * self ) ,
111
119
}
112
120
}
@@ -163,6 +171,7 @@ impl Layout {
163
171
states : Vec :: new ( ) ,
164
172
waiting : None ,
165
173
stacked : ArrayDeque :: new ( ) ,
174
+ sequenced : ArrayDeque :: new ( ) ,
166
175
}
167
176
}
168
177
/// Iterates on the key codes of the current state.
@@ -205,6 +214,32 @@ impl Layout {
205
214
}
206
215
}
207
216
}
217
+ // Process sequences
218
+ if let Some ( event) = self . sequenced . pop_front ( ) {
219
+ match event {
220
+ SequenceEvent :: Press ( keycode) => {
221
+ // Start tracking this fake key Press() event
222
+ let _ = self . states . push ( FakeKey { keycode : keycode } ) ;
223
+ }
224
+ SequenceEvent :: Release ( keycode) => {
225
+ // Clear out the Press() matching this Release's keycode
226
+ self . states = self
227
+ . states
228
+ . iter ( )
229
+ . filter_map ( |s| s. seq_release ( keycode) )
230
+ . collect ( )
231
+ }
232
+ SequenceEvent :: Delay { since, ticks } => {
233
+ if since < ticks {
234
+ // Increment and put it back
235
+ self . sequenced . push_front ( SequenceEvent :: Delay {
236
+ since : since. saturating_add ( 1 ) ,
237
+ ticks : ticks,
238
+ } ) ;
239
+ }
240
+ }
241
+ }
242
+ }
208
243
self . keycodes ( )
209
244
}
210
245
fn unstack ( & mut self , stacked : Stacked ) {
@@ -221,16 +256,6 @@ impl Layout {
221
256
let action = self . press_as_action ( ( i, j) , self . current_layer ( ) ) ;
222
257
self . do_action ( action, ( i, j) , stacked. since ) ;
223
258
}
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
- }
234
259
}
235
260
}
236
261
/// A key event.
@@ -308,32 +333,21 @@ impl Layout {
308
333
self . do_action ( action, coord, delay) ;
309
334
}
310
335
}
311
- Sequence { delay, actions } => {
312
- for key_event in actions {
336
+ Sequence { events } => {
337
+ // Copy the contents of the sequence events into the sequenced ArrayDeque
338
+ for key_event in events {
313
339
match * key_event {
314
340
SequenceEvent :: Press ( keycode) => {
315
- self . stacked . push_back ( Event :: SequencePress ( keycode) . into ( ) ) ;
341
+ self . sequenced . push_back ( SequenceEvent :: Press ( keycode) ) ;
316
342
}
317
343
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 ( ) ) ;
344
+ self . sequenced . push_back ( SequenceEvent :: Release ( keycode) ) ;
323
345
}
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
- // }
346
+ SequenceEvent :: Delay { since, ticks } => {
347
+ self . sequenced . push_back ( SequenceEvent :: Delay {
348
+ since : since,
349
+ ticks : ticks,
350
+ } ) ;
337
351
}
338
352
}
339
353
}
0 commit comments