diff --git a/src/core/button.rs b/src/core/button.rs index 0e0c4cb..d0f2b43 100644 --- a/src/core/button.rs +++ b/src/core/button.rs @@ -29,7 +29,8 @@ use std::time::Instant; * modifier would apply to any other key press until it is released, pressed and * released again. * Finally, it could be held down while another key is being pressed, going - * Pressed -> Held (or Locked -> HeldLocked) to apply until it is released. + * Pressed -> HeldPressed (or Locked -> HeldLockedPressed) to apply until it is + * released. * * When latched, it could go Latched -> Released when any key * (including itself) is released. @@ -44,10 +45,12 @@ use std::time::Instant; pub enum ModState { Released, Pressed, + HeldPressed, Latched, Held, Locked, HeldLocked, + HeldLockedPressed, } #[derive(PartialEq)] @@ -245,10 +248,10 @@ impl Button { for modifier in 1..=MODIFIERS_MAX { self.update_modifier(modifier, ModState::Pressed, - ModState::Held); + ModState::HeldPressed); self.update_modifier(modifier, ModState::Locked, - ModState::HeldLocked); + ModState::HeldLockedPressed); } } @@ -359,6 +362,20 @@ impl Button { draw = draw + DrawOperation::Labels; } + let changed = self.update_modifier(modifier, + ModState::HeldPressed, + ModState::Released); + if changed && Layout::is_label_modifier(modifier) { + draw = draw + DrawOperation::Labels; + } + + let changed = self.update_modifier(modifier, + ModState::HeldLockedPressed, + ModState::Released); + if changed && Layout::is_label_modifier(modifier) { + draw = draw + DrawOperation::Labels; + } + self.update_modifier(modifier, ModState::Held, ModState::Latched); @@ -440,6 +457,20 @@ impl Button { if changed && Layout::is_label_modifier(modifier) { draw = draw + DrawOperation::Labels; } + + let changed = self.update_modifier(modifier, + ModState::HeldPressed, + ModState::Released); + if changed && Layout::is_label_modifier(modifier) { + draw = draw + DrawOperation::Labels; + } + + let changed = self.update_modifier(modifier, + ModState::HeldLockedPressed, + ModState::Released); + if changed && Layout::is_label_modifier(modifier) { + draw = draw + DrawOperation::Labels; + } } else { for modifier in 1..=MODIFIERS_MAX { let changed = self.update_modifier(modifier,