Fix multi-keystroke shortcuts better (#13612)

Release Notes:

- N/A
This commit is contained in:
Conrad Irwin 2024-06-27 16:39:05 -06:00 committed by GitHub
parent af5efcea1f
commit 1d193585b0
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -549,11 +549,17 @@ pub struct Window {
pub(crate) focus: Option<FocusId>, pub(crate) focus: Option<FocusId>,
focus_enabled: bool, focus_enabled: bool,
pending_input: Option<PendingInput>, pending_input: Option<PendingInput>,
pending_modifiers: Option<Modifiers>, pending_modifier: ModifierState,
pending_input_observers: SubscriberSet<(), AnyObserver>, pending_input_observers: SubscriberSet<(), AnyObserver>,
prompt: Option<RenderablePromptHandle>, prompt: Option<RenderablePromptHandle>,
} }
#[derive(Clone, Debug, Default)]
struct ModifierState {
modifiers: Modifiers,
saw_keystroke: bool,
}
#[derive(Clone, Copy, Debug, Eq, PartialEq)] #[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub(crate) enum DrawPhase { pub(crate) enum DrawPhase {
None, None,
@ -824,7 +830,7 @@ impl Window {
focus: None, focus: None,
focus_enabled: true, focus_enabled: true,
pending_input: None, pending_input: None,
pending_modifiers: None, pending_modifier: ModifierState::default(),
pending_input_observers: SubscriberSet::new(), pending_input_observers: SubscriberSet::new(),
prompt: None, prompt: None,
}) })
@ -3168,9 +3174,12 @@ impl<'a> WindowContext<'a> {
let mut keystroke: Option<Keystroke> = None; let mut keystroke: Option<Keystroke> = None;
if let Some(event) = event.downcast_ref::<ModifiersChangedEvent>() { if let Some(event) = event.downcast_ref::<ModifiersChangedEvent>() {
if let Some(previous) = self.window.pending_modifiers.take() { if event.modifiers.number_of_modifiers() == 0
&& self.window.pending_modifier.modifiers.number_of_modifiers() == 1
&& !self.window.pending_modifier.saw_keystroke
{
if event.modifiers.number_of_modifiers() == 0 { if event.modifiers.number_of_modifiers() == 0 {
let key = match previous { let key = match self.window.pending_modifier.modifiers {
modifiers if modifiers.shift => Some("shift"), modifiers if modifiers.shift => Some("shift"),
modifiers if modifiers.control => Some("control"), modifiers if modifiers.control => Some("control"),
modifiers if modifiers.alt => Some("alt"), modifiers if modifiers.alt => Some("alt"),
@ -3198,11 +3207,15 @@ impl<'a> WindowContext<'a> {
pending = pending_bindings; pending = pending_bindings;
} }
} }
} else if event.modifiers.number_of_modifiers() == 1 {
self.window.pending_modifiers = Some(event.modifiers);
} }
if self.window.pending_modifier.modifiers.number_of_modifiers() == 0
&& event.modifiers.number_of_modifiers() == 1
{
self.window.pending_modifier.saw_keystroke = false
}
self.window.pending_modifier.modifiers = event.modifiers
} else if let Some(key_down_event) = event.downcast_ref::<KeyDownEvent>() { } else if let Some(key_down_event) = event.downcast_ref::<KeyDownEvent>() {
self.window.pending_modifiers.take(); self.window.pending_modifier.saw_keystroke = true;
let KeymatchResult { let KeymatchResult {
bindings: key_down_bindings, bindings: key_down_bindings,
pending: key_down_pending, pending: key_down_pending,