From 1bc405e526a3479281f86f857eb6ccd69db6459a Mon Sep 17 00:00:00 2001 From: Mads Marquart Date: Tue, 24 Sep 2024 01:06:10 +0200 Subject: [PATCH] macOS: Fix move event sometimes being triggered on resize (#3914) --- src/changelog/unreleased.md | 1 + src/platform_impl/macos/window_delegate.rs | 13 ++++++------- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/changelog/unreleased.md b/src/changelog/unreleased.md index 4e9589855..c15aa3eba 100644 --- a/src/changelog/unreleased.md +++ b/src/changelog/unreleased.md @@ -47,5 +47,6 @@ changelog entry. ### Fixed +- On macOS, fix `WindowEvent::Moved` sometimes being triggered unnecessarily on resize. - On MacOS, package manifest definitions of `LSUIElement` will no longer be overridden with the default activation policy, unless explicitly provided during initialization. diff --git a/src/platform_impl/macos/window_delegate.rs b/src/platform_impl/macos/window_delegate.rs index 5424170e7..8aa8a269f 100644 --- a/src/platform_impl/macos/window_delegate.rs +++ b/src/platform_impl/macos/window_delegate.rs @@ -87,8 +87,8 @@ pub(crate) struct State { // During `windowDidResize`, we use this to only send Moved if the position changed. // - // This is expressed in native screen coordinates. - previous_position: Cell>, + // This is expressed in desktop coordinates, and flipped to match Winit's coordinate system. + previous_position: Cell, // Used to prevent redundant events. previous_scale_factor: Cell, @@ -714,7 +714,7 @@ impl WindowDelegate { let delegate = mtm.alloc().set_ivars(State { app_delegate: app_delegate.retain(), window: window.retain(), - previous_position: Cell::new(None), + previous_position: Cell::new(flip_window_screen_coordinates(window.frame())), previous_scale_factor: Cell::new(scale_factor), resize_increments: Cell::new(resize_increments), decorations: Cell::new(attrs.decorations), @@ -839,13 +839,12 @@ impl WindowDelegate { } fn emit_move_event(&self) { - let frame = self.window().frame(); - if self.ivars().previous_position.get() == Some(frame.origin) { + let position = flip_window_screen_coordinates(self.window().frame()); + if self.ivars().previous_position.get() == position { return; } - self.ivars().previous_position.set(Some(frame.origin)); + self.ivars().previous_position.set(position); - let position = flip_window_screen_coordinates(frame); let position = LogicalPosition::new(position.x, position.y).to_physical(self.scale_factor()); self.queue_event(WindowEvent::Moved(position));