Skip to content

Commit

Permalink
fix: trigger activate event when app is activated via app switcher (e…
Browse files Browse the repository at this point in the history
…lectron#23771)

When application is activated thru macOS app switcher (cmd+tab) the
App's activate event is note emitted. The reason is that
`applicationShouldHandleReopen:hasVisibleWindows:` is sent only when app
is activated via Dock. Using `applicationDidBecomeActive:` is handling
all cases properly.

Co-authored-by: Lukas Weber <luweber@microsoft.com>
  • Loading branch information
trop[bot] and Lukas Weber committed May 27, 2020
1 parent 0962c1b commit 7709e60
Showing 1 changed file with 34 additions and 5 deletions.
39 changes: 34 additions & 5 deletions shell/browser/mac/electron_application_delegate.mm
Expand Up @@ -41,7 +41,10 @@ - (void)_coreAttributesFromRange:(NSRange)range
@end
#endif // BUILDFLAG(USE_ALLOCATOR_SHIM)

@implementation ElectronApplicationDelegate
@implementation ElectronApplicationDelegate {
@private
bool isFirstActivation_;
}

- (void)setApplicationDockMenu:(electron::ElectronMenuModel*)model {
menu_controller_.reset([[ElectronMenuController alloc] initWithModel:model
Expand Down Expand Up @@ -77,6 +80,8 @@ - (void)applicationDidFinishLaunching:(NSNotification*)notify {
@selector(_coreAttributesFromRange:whichAttributes:completionHandler:));
}
#endif

isFirstActivation_ = true;
}

- (NSMenu*)applicationDockMenu:(NSApplication*)sender {
Expand All @@ -91,11 +96,35 @@ - (BOOL)application:(NSApplication*)sender openFile:(NSString*)filename {
return electron::Browser::Get()->OpenFile(filename_str) ? YES : NO;
}

- (BOOL)applicationShouldHandleReopen:(NSApplication*)theApplication
hasVisibleWindows:(BOOL)flag {
- (void)applicationDidBecomeActive:(NSNotification*)notify {
// Originally `applicationShouldHandleReopen:hasVisibleWindows:` was used to
// emit Activate event. But the message is sent only when application is
// activated via Dock or Finder ignoring the App Switcher (cmd+tab).
//
// Using `applicationDidBecomeActive' is more reliable but to maintain
// compatibility with previous implementation we ignore activation
// immediately after the application launch, and compute the
// hasVisibleWindows on our own.
//
// Details in https://github.com/electron/electron/pull/23727.

if (isFirstActivation_) {
isFirstActivation_ = false;
return;
}

NSApplication* app = notify.object;
bool hasVisibleWindows = false;

for (NSWindow* win in app.windows) {
if (win.isVisible || win.miniaturized) {
hasVisibleWindows = true;
break;
}
}

electron::Browser* browser = electron::Browser::Get();
browser->Activate(static_cast<bool>(flag));
return flag;
browser->Activate(hasVisibleWindows);
}

- (BOOL)application:(NSApplication*)sender
Expand Down

0 comments on commit 7709e60

Please sign in to comment.