From 713165e4064c5addb72693432272b895dc84b0ab Mon Sep 17 00:00:00 2001 From: "trop[bot]" <37223003+trop[bot]@users.noreply.github.com> Date: Mon, 28 Apr 2025 22:07:15 -0500 Subject: [PATCH] fix: fullscreen fillet / recovery is incorrect (#46847) * fix: fullscreen fillet / recovery is incorrect Signed-off-by: ZOY\zoy-l Co-authored-by: ZOY\zoy-l * fix: maintain frameless consistency on windows 11 Co-authored-by: ZOY\zoy-l * fix: maintain frameless consistency on windows 11 Co-authored-by: ZOY\zoy-l * chore: modify the comments Co-authored-by: ZOY\zoy-l --------- Co-authored-by: trop[bot] <37223003+trop[bot]@users.noreply.github.com> Co-authored-by: ZOY\zoy-l --- shell/browser/native_window_views.cc | 37 +++++++++++++++++++--------- shell/browser/native_window_views.h | 3 +++ 2 files changed, 28 insertions(+), 12 deletions(-) diff --git a/shell/browser/native_window_views.cc b/shell/browser/native_window_views.cc index 6a19a0768853..689e7f13df8e 100644 --- a/shell/browser/native_window_views.cc +++ b/shell/browser/native_window_views.cc @@ -374,14 +374,17 @@ NativeWindowViews::NativeWindowViews(const gin_helper::Dictionary& options, frame_style |= WS_MINIMIZEBOX; if (maximizable_) frame_style |= WS_MAXIMIZEBOX; - // We should not show a frame for transparent window. - if (!thick_frame_) - frame_style &= ~(WS_THICKFRAME | WS_CAPTION); - ::SetWindowLong(GetAcceleratedWidget(), GWL_STYLE, frame_style); - bool rounded_corner = true; - options.Get(options::kRoundedCorners, &rounded_corner); - SetRoundedCorners(rounded_corner); + // We should not show a frame for transparent window. + if (!thick_frame_) { + frame_style &= ~(WS_THICKFRAME | WS_CAPTION); + rounded_corner_ = false; + } else { + options.Get(options::kRoundedCorners, &rounded_corner_); + } + + ::SetWindowLong(GetAcceleratedWidget(), GWL_STYLE, frame_style); + SetRoundedCorners(rounded_corner_); } LONG ex_style = ::GetWindowLong(GetAcceleratedWidget(), GWL_EXSTYLE); @@ -646,10 +649,12 @@ void NativeWindowViews::SetEnabledInternal(bool enable) { void NativeWindowViews::Maximize() { #if BUILDFLAG(IS_WIN) if (IsTranslucent()) { - // If a window is translucent but not transparent on Windows, - // that means it must have a backgroundMaterial set. - if (!transparent()) + // Semi-transparent windows with backgroundMaterial not set to 'none', and + // not fully transparent, require manual handling of rounded corners when + // maximized. + if (rounded_corner_) SetRoundedCorners(false); + restore_bounds_ = GetBounds(); auto display = display::Screen::GetScreen()->GetDisplayNearestWindow( GetNativeWindow()); @@ -678,7 +683,8 @@ void NativeWindowViews::Unmaximize() { NotifyWindowUnmaximize(); if (transparent()) { UpdateThickFrame(); - } else { + } + if (rounded_corner_) { SetRoundedCorners(true); } return; @@ -724,7 +730,8 @@ void NativeWindowViews::Restore() { NotifyWindowRestore(); if (transparent()) { UpdateThickFrame(); - } else { + } + if (rounded_corner_) { SetRoundedCorners(true); } return; @@ -758,6 +765,12 @@ void NativeWindowViews::SetFullScreen(bool fullscreen) { NotifyWindowLeaveFullScreen(); } + // If round corners are enabled, + // they need to be set based on whether the window is fullscreen. + if (rounded_corner_) { + SetRoundedCorners(!fullscreen); + } + // For window without WS_THICKFRAME style, we can not call SetFullscreen(). // This path will be used for transparent windows as well. if (!thick_frame_) { diff --git a/shell/browser/native_window_views.h b/shell/browser/native_window_views.h index 2d23a020f115..620a5a346d3c 100644 --- a/shell/browser/native_window_views.h +++ b/shell/browser/native_window_views.h @@ -286,6 +286,9 @@ class NativeWindowViews : public NativeWindow, HWND legacy_window_ = nullptr; bool layered_ = false; + // This value is determined when the window is created. + bool rounded_corner_ = true; + // Set to true if the window is always on top and behind the task bar. bool behind_task_bar_ = false;