From 38c3d8df2970821f582d7adc6c3ecd400ef265df Mon Sep 17 00:00:00 2001 From: Shelley Vohr Date: Wed, 26 Jul 2023 10:10:34 +0200 Subject: [PATCH] fix: traffic lights not working when child windows are restored via parent window (#39225) --- .../ui/cocoa/electron_ns_window_delegate.h | 4 ++++ .../ui/cocoa/electron_ns_window_delegate.mm | 20 +++++++++++++++++-- 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/shell/browser/ui/cocoa/electron_ns_window_delegate.h b/shell/browser/ui/cocoa/electron_ns_window_delegate.h index d6f49e05b7..97e7dddf3e 100644 --- a/shell/browser/ui/cocoa/electron_ns_window_delegate.h +++ b/shell/browser/ui/cocoa/electron_ns_window_delegate.h @@ -23,6 +23,10 @@ class NativeWindowMac; int level_; bool is_resizable_; + // Whether the window is currently minimized. Used to work + // around a macOS bug with child window minimization. + bool is_minimized_; + // Only valid during a live resize. // Used to keep track of whether a resize is happening horizontally or // vertically, even if physically the user is resizing in both directions. diff --git a/shell/browser/ui/cocoa/electron_ns_window_delegate.mm b/shell/browser/ui/cocoa/electron_ns_window_delegate.mm index cf33af224e..b5b914b0fa 100644 --- a/shell/browser/ui/cocoa/electron_ns_window_delegate.mm +++ b/shell/browser/ui/cocoa/electron_ns_window_delegate.mm @@ -55,10 +55,22 @@ using FullScreenTransitionState = // check occlusion binary flag if (window.occlusionState & NSWindowOcclusionStateVisible) { - // The app is visible + // There's a macOS bug where if a child window is minimized, and then both + // windows are restored via activation of the parent window, the child + // window is not properly deminiaturized. This causes traffic light bugs + // like the close and miniaturize buttons having no effect. We need to call + // deminiaturize on the child window to fix this. Unfortunately, this also + // hits ANOTHER bug where even after calling deminiaturize, + // windowDidDeminiaturize is not posted on the child window if it was + // incidentally restored by the parent, so we need to manually reset + // is_minimized_ here. + if (shell_->parent() && is_minimized_) { + shell_->Restore(); + is_minimized_ = false; + } + shell_->NotifyWindowShow(); } else { - // The app is not visible shell_->NotifyWindowHide(); } } @@ -248,11 +260,15 @@ using FullScreenTransitionState = - (void)windowDidMiniaturize:(NSNotification*)notification { [super windowDidMiniaturize:notification]; + is_minimized_ = true; + shell_->NotifyWindowMinimize(); } - (void)windowDidDeminiaturize:(NSNotification*)notification { [super windowDidDeminiaturize:notification]; + is_minimized_ = false; + shell_->AttachChildren(); shell_->SetWindowLevel(level_); shell_->NotifyWindowRestore();