fix: add check in IsMaximized for non-WS_THICKFRAME windows (#26586)
* fix: add check in IsMaximized for non-WS_THICKFRAME windows * remove logs * change GetPosition for GetNativeWindow * change GetPosition for GetNativeWindow in IsMaximize * add top left corner check * add transparent maximization test * replace window and display comparison * rebase off master
This commit is contained in:
parent
acfbbe9869
commit
32d4c9ad85
3 changed files with 36 additions and 5 deletions
|
@ -530,6 +530,20 @@ void NativeWindowViews::Unmaximize() {
|
||||||
}
|
}
|
||||||
|
|
||||||
bool NativeWindowViews::IsMaximized() {
|
bool NativeWindowViews::IsMaximized() {
|
||||||
|
// For window without WS_THICKFRAME style, we can not call IsMaximized().
|
||||||
|
// This path will be used for transparent windows as well.
|
||||||
|
|
||||||
|
#if defined(OS_WIN)
|
||||||
|
if (!(::GetWindowLong(GetAcceleratedWidget(), GWL_STYLE) & WS_THICKFRAME)) {
|
||||||
|
// Compare the size of the window with the size of the display
|
||||||
|
auto display = display::Screen::GetScreen()->GetDisplayNearestWindow(
|
||||||
|
GetNativeWindow());
|
||||||
|
// Maximized if the window is the same dimensions and placement as the
|
||||||
|
// display
|
||||||
|
return GetBounds() == display.work_area();
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
return widget()->IsMaximized();
|
return widget()->IsMaximized();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -149,9 +149,7 @@ std::set<NativeWindowViews*> NativeWindowViews::forwarding_windows_;
|
||||||
HHOOK NativeWindowViews::mouse_hook_ = NULL;
|
HHOOK NativeWindowViews::mouse_hook_ = NULL;
|
||||||
|
|
||||||
void NativeWindowViews::Maximize() {
|
void NativeWindowViews::Maximize() {
|
||||||
// Only use Maximize() when:
|
// Only use Maximize() when window has WS_THICKFRAME style
|
||||||
// 1. window has WS_THICKFRAME style;
|
|
||||||
// 2. and window is not frameless when there is autohide taskbar.
|
|
||||||
if (::GetWindowLong(GetAcceleratedWidget(), GWL_STYLE) & WS_THICKFRAME) {
|
if (::GetWindowLong(GetAcceleratedWidget(), GWL_STYLE) & WS_THICKFRAME) {
|
||||||
if (IsVisible())
|
if (IsVisible())
|
||||||
widget()->Maximize();
|
widget()->Maximize();
|
||||||
|
@ -161,8 +159,8 @@ void NativeWindowViews::Maximize() {
|
||||||
return;
|
return;
|
||||||
} else {
|
} else {
|
||||||
restore_bounds_ = GetBounds();
|
restore_bounds_ = GetBounds();
|
||||||
auto display =
|
auto display = display::Screen::GetScreen()->GetDisplayNearestWindow(
|
||||||
display::Screen::GetScreen()->GetDisplayNearestPoint(GetPosition());
|
GetNativeWindow());
|
||||||
SetBounds(display.work_area(), false);
|
SetBounds(display.work_area(), false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1059,6 +1059,25 @@ describe('BrowserWindow module', () => {
|
||||||
await unmaximize;
|
await unmaximize;
|
||||||
expectBoundsEqual(w.getNormalBounds(), bounds);
|
expectBoundsEqual(w.getNormalBounds(), bounds);
|
||||||
});
|
});
|
||||||
|
it('can check transparent window maximization', async () => {
|
||||||
|
w.destroy();
|
||||||
|
w = new BrowserWindow({
|
||||||
|
show: false,
|
||||||
|
width: 300,
|
||||||
|
height: 300,
|
||||||
|
transparent: true
|
||||||
|
});
|
||||||
|
|
||||||
|
const maximize = emittedOnce(w, 'resize');
|
||||||
|
w.show();
|
||||||
|
w.maximize();
|
||||||
|
await maximize;
|
||||||
|
expect(w.isMaximized()).to.equal(true);
|
||||||
|
const unmaximize = emittedOnce(w, 'resize');
|
||||||
|
w.unmaximize();
|
||||||
|
await unmaximize;
|
||||||
|
expect(w.isMaximized()).to.equal(false);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
ifdescribe(process.platform !== 'linux')('Minimized state', () => {
|
ifdescribe(process.platform !== 'linux')('Minimized state', () => {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue