core: button: latch modifier keys when another normal key is pressed

This commit is contained in:
Richard Acayan 2024-07-31 17:46:28 -04:00
parent 498caa149f
commit 22a93d2efe

View file

@ -430,6 +430,24 @@ impl<D: Display, K: Keyboard> Button<D, K> {
Self::draw(draw, &self.gfx, &self.layout, Some(key), &self.modifiers); Self::draw(draw, &self.gfx, &self.layout, Some(key), &self.modifiers);
} }
fn is_normal_key_pressed(&self) -> bool
{
for id in &self.timers {
if *id == PRESSES_MAX {
continue;
}
let press = self.presses[*id].as_ref().unwrap();
let key = self.layout.locate_key(press.x1, press.y1).unwrap();
if key.parts[press.part].modifier_id() == 0 {
return true;
}
}
false
}
/* /*
* Release the given modifier key. If the key being pressed is not a * Release the given modifier key. If the key being pressed is not a
* modifier key (i.e. modifier = 0), release all latched modifier keys. * modifier key (i.e. modifier = 0), release all latched modifier keys.
@ -443,6 +461,24 @@ impl<D: Display, K: Keyboard> Button<D, K> {
ModState::Pressed, ModState::Pressed,
ModState::Latched); ModState::Latched);
self.update_modifier(modifier,
ModState::HeldPressed,
ModState::Held);
self.update_modifier(modifier,
ModState::HeldLockedPressed,
ModState::HeldLocked);
if self.is_normal_key_pressed() {
self.update_modifier(modifier,
ModState::Held,
ModState::Latched);
self.update_modifier(modifier,
ModState::HeldLocked,
ModState::Locked);
}
let changed = self.update_modifier(modifier, let changed = self.update_modifier(modifier,
ModState::Held, ModState::Held,
ModState::Released); ModState::Released);
@ -456,20 +492,6 @@ 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,