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

This commit is contained in:
Tomasz 2023-11-22 07:21:18 +01:00 коммит произвёл GitHub
Родитель 2029224a84
Коммит 3340bc1bf9
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: 4AEE18F83AFDEB23
5 изменённых файлов: 94 добавлений и 4 удалений

Просмотреть файл

@ -682,11 +682,16 @@ void NativeWindowViews::Unmaximize() {
if (transparent()) {
SetBounds(restore_bounds_, false);
NotifyWindowUnmaximize();
UpdateThickFrame();
return;
}
#endif
widget()->Restore();
#if BUILDFLAG(IS_WIN)
UpdateThickFrame();
#endif
}
}
@ -719,6 +724,10 @@ void NativeWindowViews::Minimize() {
void NativeWindowViews::Restore() {
widget()->Restore();
#if BUILDFLAG(IS_WIN)
UpdateThickFrame();
#endif
}
bool NativeWindowViews::IsMinimized() {
@ -892,12 +901,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) {
@ -1644,6 +1654,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())

Просмотреть файл

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

Просмотреть файл

@ -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

Просмотреть файл

@ -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;

Просмотреть файл

@ -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', () => {