From 862f1a6df6ad6713eff2926b0f0fa429ad148285 Mon Sep 17 00:00:00 2001 From: Shelley Vohr Date: Tue, 22 Mar 2022 07:07:09 +0100 Subject: [PATCH] fix: pend bounds change when moving BrowserWindows * fix: ensure bounds changes apply when moving windows * chore: remove unused queue include --- shell/browser/native_window_views.cc | 7 +++++++ shell/browser/native_window_views.h | 2 ++ shell/browser/native_window_views_win.cc | 9 +++++++++ 3 files changed, 18 insertions(+) diff --git a/shell/browser/native_window_views.cc b/shell/browser/native_window_views.cc index 0117b7b1d558f..669f8beda45f7 100644 --- a/shell/browser/native_window_views.cc +++ b/shell/browser/native_window_views.cc @@ -687,6 +687,13 @@ bool NativeWindowViews::IsFullscreen() const { } void NativeWindowViews::SetBounds(const gfx::Rect& bounds, bool animate) { +#if defined(OS_WIN) + if (is_moving_ || is_resizing_) { + pending_bounds_change_ = bounds; + return; + } +#endif + #if defined(OS_WIN) || defined(OS_LINUX) // On Linux and Windows the minimum and maximum size should be updated with // window size when window is not resizable. diff --git a/shell/browser/native_window_views.h b/shell/browser/native_window_views.h index 9ee58cc60ac1a..97b260ac71684 100644 --- a/shell/browser/native_window_views.h +++ b/shell/browser/native_window_views.h @@ -303,6 +303,8 @@ class NativeWindowViews : public NativeWindow, // Whether the window is currently being moved. bool is_moving_ = false; + absl::optional pending_bounds_change_; + // The color to use as the theme and symbol colors respectively for Window // Controls Overlay if enabled on Windows. SkColor overlay_button_color_; diff --git a/shell/browser/native_window_views_win.cc b/shell/browser/native_window_views_win.cc index d792da40fa709..f1af57ccc3d4a 100644 --- a/shell/browser/native_window_views_win.cc +++ b/shell/browser/native_window_views_win.cc @@ -312,6 +312,15 @@ bool NativeWindowViews::PreHandleMSG(UINT message, NotifyWindowMoved(); is_moving_ = false; } + + // If the user dragged or moved the window during one or more + // calls to window.setBounds(), we want to apply the most recent + // one once they are done with the move or resize operation. + if (pending_bounds_change_.has_value()) { + SetBounds(pending_bounds_change_.value(), false /* animate */); + pending_bounds_change_.reset(); + } + return false; } case WM_MOVING: {