diff --git a/crates/gpui/src/window.rs b/crates/gpui/src/window.rs index c7bb2cf406065e87f199a00c6608aa61e9753fe6..08c4a8753b616a80233450f37a7eb16dbb0fe5ae 100644 --- a/crates/gpui/src/window.rs +++ b/crates/gpui/src/window.rs @@ -549,11 +549,17 @@ pub struct Window { pub(crate) focus: Option, focus_enabled: bool, pending_input: Option, - pending_modifiers: Option, + pending_modifier: ModifierState, pending_input_observers: SubscriberSet<(), AnyObserver>, prompt: Option, } +#[derive(Clone, Debug, Default)] +struct ModifierState { + modifiers: Modifiers, + saw_keystroke: bool, +} + #[derive(Clone, Copy, Debug, Eq, PartialEq)] pub(crate) enum DrawPhase { None, @@ -824,7 +830,7 @@ impl Window { focus: None, focus_enabled: true, pending_input: None, - pending_modifiers: None, + pending_modifier: ModifierState::default(), pending_input_observers: SubscriberSet::new(), prompt: None, }) @@ -3168,9 +3174,12 @@ impl<'a> WindowContext<'a> { let mut keystroke: Option = None; if let Some(event) = event.downcast_ref::() { - 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 { - let key = match previous { + let key = match self.window.pending_modifier.modifiers { modifiers if modifiers.shift => Some("shift"), modifiers if modifiers.control => Some("control"), modifiers if modifiers.alt => Some("alt"), @@ -3198,11 +3207,15 @@ impl<'a> WindowContext<'a> { 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::() { - self.window.pending_modifiers.take(); + self.window.pending_modifier.saw_keystroke = true; let KeymatchResult { bindings: key_down_bindings, pending: key_down_pending,