From 78dc45823110bfb73712747cc6c64273c94316c2 Mon Sep 17 00:00:00 2001 From: Ezekiel Warren Date: Mon, 25 Mar 2024 11:14:51 -0700 Subject: [PATCH] windows: Mouse wheel coordinates fix (#9749) mouse scroll wasn't working unless the window was maximized or in the top left corner because the Windows wheel events give screen coordinates Release Notes: - N/A --- crates/gpui/src/platform/windows/window.rs | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/crates/gpui/src/platform/windows/window.rs b/crates/gpui/src/platform/windows/window.rs index a8c77b91f758075b7aa3df2ae0f21d0f69708ca8..a05f57565dfb4dce33e653de307b4ef6ab498ecf 100644 --- a/crates/gpui/src/platform/windows/window.rs +++ b/crates/gpui/src/platform/windows/window.rs @@ -641,11 +641,14 @@ impl WindowsWindowInner { if let Some(callback) = callbacks.input.as_mut() { let wheel_distance = (wparam.signed_hiword() as f32 / WHEEL_DELTA as f32) * self.platform_inner.settings.borrow().wheel_scroll_lines as f32; - let x = lparam.signed_loword() as f32; - let y = lparam.signed_hiword() as f32; + let mut cursor_point = POINT { + x: lparam.signed_loword().into(), + y: lparam.signed_hiword().into(), + }; + unsafe { ScreenToClient(self.hwnd, &mut cursor_point) }; let scale_factor = self.scale_factor.get(); let event = crate::ScrollWheelEvent { - position: logical_point(x, y, scale_factor), + position: logical_point(cursor_point.x as f32, cursor_point.y as f32, scale_factor), delta: ScrollDelta::Lines(Point { x: 0.0, y: wheel_distance, @@ -664,11 +667,14 @@ impl WindowsWindowInner { if let Some(callback) = callbacks.input.as_mut() { let wheel_distance = (wparam.signed_hiword() as f32 / WHEEL_DELTA as f32) * self.platform_inner.settings.borrow().wheel_scroll_chars as f32; - let x = lparam.signed_loword() as f32; - let y = lparam.signed_hiword() as f32; + let mut cursor_point = POINT { + x: lparam.signed_loword().into(), + y: lparam.signed_hiword().into(), + }; + unsafe { ScreenToClient(self.hwnd, &mut cursor_point) }; let scale_factor = self.scale_factor.get(); let event = crate::ScrollWheelEvent { - position: logical_point(x, y, scale_factor), + position: logical_point(cursor_point.x as f32, cursor_point.y as f32, scale_factor), delta: ScrollDelta::Lines(Point { x: wheel_distance, y: 0.0,