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:
parent
90a32cc50c
commit
53f4daedc0
1 changed files with 34 additions and 3 deletions
|
|
@ -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,
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue