Skip to content

Commit

Permalink
fix: macOS modal focus (#24354)
Browse files Browse the repository at this point in the history
Co-authored-by: Shelley Vohr <[email protected]>
  • Loading branch information
trop[bot] and codebytere authored Jun 29, 2020
1 parent 348b2fb commit 67002fd
Show file tree
Hide file tree
Showing 6 changed files with 35 additions and 10 deletions.
20 changes: 10 additions & 10 deletions shell/browser/api/electron_api_browser_window.cc
Original file line number Diff line number Diff line change
Expand Up @@ -256,29 +256,29 @@ void BrowserWindow::OnWindowClosed() {

void BrowserWindow::OnWindowBlur() {
web_contents()->StoreFocus();
#if defined(OS_MACOSX)
auto* rwhv = web_contents()->GetRenderWidgetHostView();
if (rwhv)
rwhv->SetActive(false);
#endif

TopLevelWindow::OnWindowBlur();
}

void BrowserWindow::OnWindowFocus() {
web_contents()->RestoreFocus();
#if defined(OS_MACOSX)
auto* rwhv = web_contents()->GetRenderWidgetHostView();
if (rwhv)
rwhv->SetActive(true);
#else

#if !defined(OS_MACOSX)
if (!api_web_contents_->IsDevToolsOpened())
web_contents()->Focus();
#endif

TopLevelWindow::OnWindowFocus();
}

void BrowserWindow::OnWindowIsKeyChanged(bool is_key) {
#if defined(OS_MACOSX)
auto* rwhv = web_contents()->GetRenderWidgetHostView();
if (rwhv)
rwhv->SetActive(is_key);
#endif
}

void BrowserWindow::OnWindowResize() {
#if defined(OS_MACOSX)
if (!draggable_regions_.empty())
Expand Down
1 change: 1 addition & 0 deletions shell/browser/api/electron_api_browser_window.h
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,7 @@ class BrowserWindow : public TopLevelWindow,
// NativeWindowObserver:
void RequestPreferredWidth(int* width) override;
void OnCloseButtonClicked(bool* prevent_default) override;
void OnWindowIsKeyChanged(bool is_key) override;

// TopLevelWindow:
void OnWindowClosed() override;
Expand Down
5 changes: 5 additions & 0 deletions shell/browser/native_window.cc
Original file line number Diff line number Diff line change
Expand Up @@ -439,6 +439,11 @@ void NativeWindow::NotifyWindowFocus() {
observer.OnWindowFocus();
}

void NativeWindow::NotifyWindowIsKeyChanged(bool is_key) {
for (NativeWindowObserver& observer : observers_)
observer.OnWindowIsKeyChanged(is_key);
}

void NativeWindow::NotifyWindowShow() {
for (NativeWindowObserver& observer : observers_)
observer.OnWindowShow();
Expand Down
1 change: 1 addition & 0 deletions shell/browser/native_window.h
Original file line number Diff line number Diff line change
Expand Up @@ -259,6 +259,7 @@ class NativeWindow : public base::SupportsUserData,
void NotifyWindowBlur();
void NotifyWindowFocus();
void NotifyWindowShow();
void NotifyWindowIsKeyChanged(bool is_key);
void NotifyWindowHide();
void NotifyWindowMaximize();
void NotifyWindowUnmaximize();
Expand Down
3 changes: 3 additions & 0 deletions shell/browser/native_window_observer.h
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,9 @@ class NativeWindowObserver : public base::CheckedObserver {
// Called when window gains focus.
virtual void OnWindowFocus() {}

// Called when window gained or lost key window status.
virtual void OnWindowIsKeyChanged(bool is_key) {}

// Called when window is shown.
virtual void OnWindowShow() {}

Expand Down
15 changes: 15 additions & 0 deletions shell/browser/ui/cocoa/electron_ns_window_delegate.mm
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,21 @@ - (void)windowDidResignMain:(NSNotification*)notification {
shell_->NotifyWindowBlur();
}

- (void)windowDidBecomeKey:(NSNotification*)notification {
shell_->NotifyWindowIsKeyChanged(true);
}

- (void)windowDidResignKey:(NSNotification*)notification {
// If our app is still active and we're still the key window, ignore this
// message, since it just means that a menu extra (on the "system status bar")
// was activated; we'll get another |-windowDidResignKey| if we ever really
// lose key window status.
if ([NSApp isActive] && ([NSApp keyWindow] == [notification object]))
return;

shell_->NotifyWindowIsKeyChanged(false);
}

- (NSSize)windowWillResize:(NSWindow*)sender toSize:(NSSize)frameSize {
NSSize newSize = frameSize;
double aspectRatio = shell_->GetAspectRatio();
Expand Down

0 comments on commit 67002fd

Please sign in to comment.