fix: fullscreen fillet / recovery is incorrect (#46641)

* fix: fullscreen fillet / recovery is incorrect

Signed-off-by: ZOY\zoy-l <zoy-l@outlook.com>

* fix: maintain frameless consistency on windows 11

* fix: maintain frameless consistency on windows 11

* chore: modify the comments

---------

Signed-off-by: ZOY\zoy-l <zoy-l@outlook.com>
This commit is contained in:
zoy 2025-04-29 04:54:08 +08:00 committed by GitHub
parent 3f3c297c7a
commit 4641bc9619
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 28 additions and 12 deletions

View file

@ -375,14 +375,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);
@ -648,10 +651,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());
@ -680,7 +685,8 @@ void NativeWindowViews::Unmaximize() {
NotifyWindowUnmaximize();
if (transparent()) {
UpdateThickFrame();
} else {
}
if (rounded_corner_) {
SetRoundedCorners(true);
}
return;
@ -726,7 +732,8 @@ void NativeWindowViews::Restore() {
NotifyWindowRestore();
if (transparent()) {
UpdateThickFrame();
} else {
}
if (rounded_corner_) {
SetRoundedCorners(true);
}
return;
@ -760,6 +767,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_) {

View file

@ -287,6 +287,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;