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.
This commit is contained in:
Richard Acayan 2024-07-24 20:52:23 -04:00
parent 90a32cc50c
commit 53f4daedc0

View file

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