fix: maximized window bounds when toggle setResizable (#40582)

Co-authored-by: trop[bot] <37223003+trop[bot]@users.noreply.github.com>
Co-authored-by: Tomasz Malinowski <tomasz@openfin.co>
pull/40594/head
trop[bot] 2023-11-22 10:58:47 +01:00 committed by GitHub
parent a3986f84db
commit 131c5e7986
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 94 additions and 4 deletions

View File

@ -679,11 +679,16 @@ void NativeWindowViews::Unmaximize() {
if (transparent()) {
SetBounds(restore_bounds_, false);
NotifyWindowUnmaximize();
UpdateThickFrame();
return;
}
#endif
widget()->Restore();
#if BUILDFLAG(IS_WIN)
UpdateThickFrame();
#endif
}
}
@ -716,6 +721,10 @@ void NativeWindowViews::Minimize() {
void NativeWindowViews::Restore() {
widget()->Restore();
#if BUILDFLAG(IS_WIN)
UpdateThickFrame();
#endif
}
bool NativeWindowViews::IsMinimized() {
@ -889,12 +898,13 @@ void NativeWindowViews::SetResizable(bool resizable) {
extensions::SizeConstraints(content_size, content_size));
}
}
#if BUILDFLAG(IS_WIN)
if (has_frame() && thick_frame_)
FlipWindowStyle(GetAcceleratedWidget(), resizable, WS_THICKFRAME);
#endif
resizable_ = resizable;
SetCanResize(resizable_);
#if BUILDFLAG(IS_WIN)
UpdateThickFrame();
#endif
}
bool NativeWindowViews::MoveAbove(const std::string& sourceId) {
@ -1637,6 +1647,22 @@ void NativeWindowViews::SetIcon(const gfx::ImageSkia& icon) {
}
#endif
#if BUILDFLAG(IS_WIN)
void NativeWindowViews::UpdateThickFrame() {
if (!thick_frame_)
return;
if (IsMaximized() && !transparent()) {
// For maximized window add thick frame always, otherwise it will be removed
// in HWNDMessageHandler::SizeConstraintsChanged() which will result in
// maximized window bounds change.
FlipWindowStyle(GetAcceleratedWidget(), true, WS_THICKFRAME);
} else if (has_frame()) {
FlipWindowStyle(GetAcceleratedWidget(), resizable_, WS_THICKFRAME);
}
}
#endif
void NativeWindowViews::OnWidgetActivationChanged(views::Widget* changed_widget,
bool active) {
if (changed_widget != widget())

View File

@ -190,6 +190,8 @@ class NativeWindowViews : public NativeWindow,
void set_overlay_symbol_color(SkColor color) {
overlay_symbol_color_ = color;
}
void UpdateThickFrame();
#endif
private:

View File

@ -30,6 +30,16 @@ void ElectronDesktopNativeWidgetAura::InitNativeWidget(
views::DesktopNativeWidgetAura::InitNativeWidget(std::move(params));
}
#if BUILDFLAG(IS_WIN)
void ElectronDesktopNativeWidgetAura::OnSizeConstraintsChanged() {
views::DesktopNativeWidgetAura::OnSizeConstraintsChanged();
// OnSizeConstraintsChanged can remove thick frame depending from
// resizable state, so add it if needed.
native_window_view_->UpdateThickFrame();
}
#endif
void ElectronDesktopNativeWidgetAura::Activate() {
// Activate can cause the focused window to be blurred so only
// call when the window being activated is visible. This prevents

View File

@ -27,6 +27,9 @@ class ElectronDesktopNativeWidgetAura : public views::DesktopNativeWidgetAura {
// views::DesktopNativeWidgetAura:
void InitNativeWidget(views::Widget::InitParams params) override;
#if BUILDFLAG(IS_WIN)
void OnSizeConstraintsChanged() override;
#endif
// internal::NativeWidgetPrivate:
void Activate() override;

View File

@ -5091,6 +5091,55 @@ describe('BrowserWindow module', () => {
w.setContentSize(10, 10);
expectBoundsEqual(w.getContentSize(), [10, 10]);
});
ifit(process.platform === 'win32')('do not change window with frame bounds when maximized', () => {
const w = new BrowserWindow({
show: true,
frame: true,
thickFrame: true
});
expect(w.isResizable()).to.be.true('resizable');
w.maximize();
expect(w.isMaximized()).to.be.true('maximized');
const bounds = w.getBounds();
w.setResizable(false);
expectBoundsEqual(w.getBounds(), bounds);
w.setResizable(true);
expectBoundsEqual(w.getBounds(), bounds);
});
ifit(process.platform === 'win32')('do not change window without frame bounds when maximized', () => {
const w = new BrowserWindow({
show: true,
frame: false,
thickFrame: true
});
expect(w.isResizable()).to.be.true('resizable');
w.maximize();
expect(w.isMaximized()).to.be.true('maximized');
const bounds = w.getBounds();
w.setResizable(false);
expectBoundsEqual(w.getBounds(), bounds);
w.setResizable(true);
expectBoundsEqual(w.getBounds(), bounds);
});
ifit(process.platform === 'win32')('do not change window transparent without frame bounds when maximized', () => {
const w = new BrowserWindow({
show: true,
frame: false,
thickFrame: true,
transparent: true
});
expect(w.isResizable()).to.be.true('resizable');
w.maximize();
expect(w.isMaximized()).to.be.true('maximized');
const bounds = w.getBounds();
w.setResizable(false);
expectBoundsEqual(w.getBounds(), bounds);
w.setResizable(true);
expectBoundsEqual(w.getBounds(), bounds);
});
});
describe('loading main frame state', () => {