Skip to content

Commit

Permalink
fix: macOS maximize button shouldn't be disabled just because the win…
Browse files Browse the repository at this point in the history
…dow is non-fullscreenable (#40897)

* fix: macOS maximize button shouldn't be disabled just because the window is non-fullscreenable

Co-authored-by: Tamás Zahola <tzahola@gmail.com>

* add test

Co-authored-by: Tamás Zahola <tzahola@gmail.com>

* fix test by enabling maximize button if `resizable && (maximizable || fullscreenable)` instead of `(resizable && maximizable) && fullscreenable`

Co-authored-by: Tamás Zahola <tzahola@gmail.com>

---------

Co-authored-by: trop[bot] <37223003+trop[bot]@users.noreply.github.com>
Co-authored-by: Tamás Zahola <tzahola@gmail.com>
  • Loading branch information
trop[bot] and tzahola committed Jan 8, 2024
1 parent f0c0256 commit 0778cc7
Show file tree
Hide file tree
Showing 3 changed files with 24 additions and 3 deletions.
2 changes: 2 additions & 0 deletions shell/browser/native_window_mac.h
Expand Up @@ -238,6 +238,8 @@ class NativeWindowMac : public NativeWindow,
void InternalSetParentWindow(NativeWindow* parent, bool attach);
void SetForwardMouseMessages(bool forward);

void UpdateZoomButton();

ElectronNSWindow* window_; // Weak ref, managed by widget_.

ElectronNSWindowDelegate* __strong window_delegate_;
Expand Down
12 changes: 9 additions & 3 deletions shell/browser/native_window_mac.mm
Expand Up @@ -887,8 +887,7 @@ void ReorderChildWindowAbove(NSWindow* child_window, NSWindow* other_window) {
// the maximize button and ensure fullscreenability matches user setting.
SetCanResize(resizable);
SetFullScreenable(was_fullscreenable);
[[window_ standardWindowButton:NSWindowZoomButton]
setEnabled:resizable ? was_fullscreenable : false];
UpdateZoomButton();
}

bool NativeWindowMac::IsResizable() const {
Expand Down Expand Up @@ -916,19 +915,26 @@ void ReorderChildWindowAbove(NSWindow* child_window, NSWindow* other_window) {

void NativeWindowMac::SetMaximizable(bool maximizable) {
maximizable_ = maximizable;
[[window_ standardWindowButton:NSWindowZoomButton] setEnabled:maximizable];
UpdateZoomButton();
}

bool NativeWindowMac::IsMaximizable() const {
return [[window_ standardWindowButton:NSWindowZoomButton] isEnabled];
}

void NativeWindowMac::UpdateZoomButton() {
[[window_ standardWindowButton:NSWindowZoomButton]
setEnabled:IsResizable() && (CanMaximize() || IsFullScreenable())];
}

void NativeWindowMac::SetFullScreenable(bool fullscreenable) {
SetCollectionBehavior(fullscreenable,
NSWindowCollectionBehaviorFullScreenPrimary);
// On EL Capitan this flag is required to hide fullscreen button.
SetCollectionBehavior(!fullscreenable,
NSWindowCollectionBehaviorFullScreenAuxiliary);

UpdateZoomButton();
}

bool NativeWindowMac::IsFullScreenable() const {
Expand Down
13 changes: 13 additions & 0 deletions spec/api-browser-window-spec.ts
Expand Up @@ -5611,6 +5611,19 @@ describe('BrowserWindow module', () => {
expect(w2.isFullScreenable()).to.be.false('isFullScreenable');
expect(w3.isFullScreenable()).to.be.false('isFullScreenable');
});

it('does not disable maximize button if window is resizable', () => {
const w = new BrowserWindow({
resizable: true,
fullscreenable: false
});

expect(w.isMaximizable()).to.be.true('isMaximizable');

w.setResizable(false);

expect(w.isMaximizable()).to.be.false('isMaximizable');
});
});

ifdescribe(process.platform === 'darwin')('isHiddenInMissionControl state', () => {
Expand Down

0 comments on commit 0778cc7

Please sign in to comment.