fix: enable system maximization for frameless windows except if transparent (#28207)

* fix: move widget maximization check

* fix linting error

* change workaround to only effect transparent windows

* disable menu maximize and restore for transparent windows

* disable double clicking title bar max/unmax for transparent windows

* add docs change and address review
This commit is contained in:
Michaela Laurencin 2021-04-05 16:53:59 -07:00 committed by GitHub
parent 82ea8ea68c
commit 19d7a6b761
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 43 additions and 17 deletions

View file

@ -83,8 +83,10 @@ win.show()
blur effect to the content below the window (i.e. other applications open on blur effect to the content below the window (i.e. other applications open on
the user's system). the user's system).
* The window will not be transparent when DevTools is opened. * The window will not be transparent when DevTools is opened.
* On Windows operating systems, transparent windows will not work when DWM is * On Windows operating systems,
* transparent windows will not work when DWM is
disabled. disabled.
* transparent windows can not be maximized using the Windows system menu or by double clicking the title bar. The reasoning behind this can be seen on [this pull request](https://github.com/electron/electron/pull/28207).
* On Linux, users have to put `--enable-transparent-visuals --disable-gpu` in * On Linux, users have to put `--enable-transparent-visuals --disable-gpu` in
the command line to disable GPU and allow ARGB to make transparent window, the command line to disable GPU and allow ARGB to make transparent window,
this is caused by an upstream bug that [alpha channel doesn't work on some this is caused by an upstream bug that [alpha channel doesn't work on some

View file

@ -530,7 +530,7 @@ void NativeWindowViews::Maximize() {
void NativeWindowViews::Unmaximize() { void NativeWindowViews::Unmaximize() {
#if defined(OS_WIN) #if defined(OS_WIN)
if (!(::GetWindowLong(GetAcceleratedWidget(), GWL_STYLE) & WS_THICKFRAME)) { if (transparent()) {
SetBounds(restore_bounds_, false); SetBounds(restore_bounds_, false);
return; return;
} }
@ -540,21 +540,22 @@ void NativeWindowViews::Unmaximize() {
} }
bool NativeWindowViews::IsMaximized() { bool NativeWindowViews::IsMaximized() {
// For window without WS_THICKFRAME style, we can not call IsMaximized(). if (widget()->IsMaximized()) {
// This path will be used for transparent windows as well. return true;
} else {
#if defined(OS_WIN) #if defined(OS_WIN)
if (!(::GetWindowLong(GetAcceleratedWidget(), GWL_STYLE) & WS_THICKFRAME)) { if (transparent()) {
// Compare the size of the window with the size of the display // Compare the size of the window with the size of the display
auto display = display::Screen::GetScreen()->GetDisplayNearestWindow( auto display = display::Screen::GetScreen()->GetDisplayNearestWindow(
GetNativeWindow()); GetNativeWindow());
// Maximized if the window is the same dimensions and placement as the // Maximized if the window is the same dimensions and placement as the
// display // display
return GetBounds() == display.work_area(); return GetBounds() == display.work_area();
} }
#endif #endif
return widget()->IsMaximized(); return false;
}
} }
void NativeWindowViews::Minimize() { void NativeWindowViews::Minimize() {

View file

@ -149,8 +149,8 @@ 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 window has WS_THICKFRAME style // Only use Maximize() when window is NOT transparent style
if (::GetWindowLong(GetAcceleratedWidget(), GWL_STYLE) & WS_THICKFRAME) { if (!transparent()) {
if (IsVisible()) if (IsVisible())
widget()->Maximize(); widget()->Maximize();
else else
@ -324,8 +324,31 @@ bool NativeWindowViews::PreHandleMSG(UINT message,
GET_Y_LPARAM(l_param), &prevent_default); GET_Y_LPARAM(l_param), &prevent_default);
return prevent_default; return prevent_default;
} }
default: case WM_SYSCOMMAND: {
// Mask is needed to account for double clicking title bar to maximize
WPARAM max_mask = 0xFFF0;
if (transparent() && ((w_param & max_mask) == SC_MAXIMIZE)) {
return true;
}
return false; return false;
}
case WM_INITMENU: {
// This is handling the scenario where the menu might get triggered by the
// user doing "alt + space" resulting in system maximization and restore
// being used on transparent windows when that does not work.
if (transparent()) {
HMENU menu = GetSystemMenu(GetAcceleratedWidget(), false);
EnableMenuItem(menu, SC_MAXIMIZE,
MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);
EnableMenuItem(menu, SC_RESTORE,
MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);
return true;
}
return false;
}
default: {
return false;
}
} }
} }