Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: maximized window bounds when toggle setResizable #40582

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
34 changes: 30 additions & 4 deletions shell/browser/native_window_views.cc
Expand Up @@ -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
}
}

Expand Down Expand Up @@ -716,6 +721,10 @@ void NativeWindowViews::Minimize() {

void NativeWindowViews::Restore() {
widget()->Restore();

#if BUILDFLAG(IS_WIN)
UpdateThickFrame();
#endif
}

bool NativeWindowViews::IsMinimized() {
Expand Down Expand Up @@ -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) {
Expand Down Expand Up @@ -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())
Expand Down
2 changes: 2 additions & 0 deletions shell/browser/native_window_views.h
Expand Up @@ -190,6 +190,8 @@ class NativeWindowViews : public NativeWindow,
void set_overlay_symbol_color(SkColor color) {
overlay_symbol_color_ = color;
}

void UpdateThickFrame();
#endif

private:
Expand Down
10 changes: 10 additions & 0 deletions shell/browser/ui/win/electron_desktop_native_widget_aura.cc
Expand Up @@ -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
Expand Down
3 changes: 3 additions & 0 deletions shell/browser/ui/win/electron_desktop_native_widget_aura.h
Expand Up @@ -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;
Expand Down
49 changes: 49 additions & 0 deletions spec/api-browser-window-spec.ts
Expand Up @@ -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', () => {
Expand Down