From 33c896c23d8043e28f35b9bcfd60cd9d1843f40d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E5=B0=8F=E7=99=BD?= <364772080@qq.com> Date: Mon, 12 May 2025 22:15:50 +0800 Subject: [PATCH] windows: Fix `ctrl-click` open hovered URL (#30574) Closes #30452 Release Notes: - N/A --- crates/gpui/src/platform/windows/events.rs | 14 ++++++++++---- crates/gpui/src/platform/windows/window.rs | 3 +++ 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/crates/gpui/src/platform/windows/events.rs b/crates/gpui/src/platform/windows/events.rs index 89b8f741c2..ca8df02784 100644 --- a/crates/gpui/src/platform/windows/events.rs +++ b/crates/gpui/src/platform/windows/events.rs @@ -385,10 +385,6 @@ fn handle_keydown_msg( return Some(1); }; let mut lock = state_ptr.state.borrow_mut(); - let Some(mut func) = lock.callbacks.input.take() else { - return Some(1); - }; - drop(lock); let event = match keystroke_or_modifier { KeystrokeOrModifier::Keystroke(keystroke) => PlatformInput::KeyDown(KeyDownEvent { @@ -396,9 +392,19 @@ fn handle_keydown_msg( is_held: lparam.0 & (0x1 << 30) > 0, }), KeystrokeOrModifier::Modifier(modifiers) => { + if let Some(prev_modifiers) = lock.last_reported_modifiers { + if prev_modifiers == modifiers { + return Some(0); + } + } + lock.last_reported_modifiers = Some(modifiers); PlatformInput::ModifiersChanged(ModifiersChangedEvent { modifiers }) } }; + let Some(mut func) = lock.callbacks.input.take() else { + return Some(1); + }; + drop(lock); let result = if func(event).default_prevented { Some(0) diff --git a/crates/gpui/src/platform/windows/window.rs b/crates/gpui/src/platform/windows/window.rs index b712bc56e9..313fcd715b 100644 --- a/crates/gpui/src/platform/windows/window.rs +++ b/crates/gpui/src/platform/windows/window.rs @@ -42,6 +42,7 @@ pub struct WindowsWindowState { pub callbacks: Callbacks, pub input_handler: Option, + pub last_reported_modifiers: Option, pub system_key_handled: bool, pub hovered: bool, @@ -100,6 +101,7 @@ impl WindowsWindowState { let renderer = windows_renderer::init(gpu_context, hwnd, transparent)?; let callbacks = Callbacks::default(); let input_handler = None; + let last_reported_modifiers = None; let system_key_handled = false; let hovered = false; let click_state = ClickState::new(); @@ -118,6 +120,7 @@ impl WindowsWindowState { min_size, callbacks, input_handler, + last_reported_modifiers, system_key_handled, hovered, renderer,