From 53f4daedc07091a218f06ef0b2c788c35f357699 Mon Sep 17 00:00:00 2001 From: Richard Acayan Date: Wed, 24 Jul 2024 20:52:23 -0400 Subject: [PATCH] core: button: add HeldPressed and HeldLockedPressed modifier state The Held state is for modifier that should be off when the corresponding key is released. If the user presses the modifier key and a normal key, it would be in this state. The modifier would continue to be active when the user moves to a different key part (a cancel, e.g. from Fn to Alt) afterwards. To fix this, add the HeldPressed and HeldLockedPressed states that reset to the Released state when cancelled. --- src/core/button.rs | 37 ++++++++++++++++++++++++++++++++++--- 1 file changed, 34 insertions(+), 3 deletions(-) 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,