diff --git a/shell/browser/api/electron_api_web_contents.cc b/shell/browser/api/electron_api_web_contents.cc index be1a45b8e9..9045ffcd23 100644 --- a/shell/browser/api/electron_api_web_contents.cc +++ b/shell/browser/api/electron_api_web_contents.cc @@ -2015,13 +2015,8 @@ void WebContents::ReadyToCommitNavigation( // Don't focus content in an inactive window. if (!owner_window()) return; -#if BUILDFLAG(IS_MAC) if (!owner_window()->IsActive()) return; -#else - if (!owner_window()->widget()->IsActive()) - return; -#endif // Don't focus content after subframe navigations. if (!navigation_handle->IsInMainFrame()) return; diff --git a/shell/browser/native_window.h b/shell/browser/native_window.h index a995997415..0a496a42a0 100644 --- a/shell/browser/native_window.h +++ b/shell/browser/native_window.h @@ -157,10 +157,10 @@ class NativeWindow : public base::SupportsUserData, virtual void Invalidate() = 0; virtual void SetTitle(const std::string& title) = 0; virtual std::string GetTitle() const = 0; + [[nodiscard]] virtual bool IsActive() const = 0; #if BUILDFLAG(IS_MAC) virtual std::string GetAlwaysOnTopLevel() const = 0; virtual void SetActive(bool is_key) = 0; - virtual bool IsActive() const = 0; virtual void RemoveChildFromParentWindow() = 0; virtual void RemoveChildWindow(NativeWindow* child) = 0; virtual void AttachChildren() = 0; diff --git a/shell/browser/native_window_views.cc b/shell/browser/native_window_views.cc index 37a184e7be..df936234cd 100644 --- a/shell/browser/native_window_views.cc +++ b/shell/browser/native_window_views.cc @@ -424,8 +424,6 @@ NativeWindowViews::NativeWindowViews(const gin_helper::Dictionary& options, last_window_state_ = ui::mojom::WindowShowState::kFullscreen; else last_window_state_ = ui::mojom::WindowShowState::kNormal; - - UpdateWindowAccentColor(); #endif // Listen to mouse events. @@ -1139,6 +1137,11 @@ std::string NativeWindowViews::GetTitle() const { return title_; } +bool NativeWindowViews::IsActive() const { + views::Widget* const widget = this->widget(); + return widget && widget->IsActive(); +} + void NativeWindowViews::FlashFrame(bool flash) { #if BUILDFLAG(IS_WIN) // The Chromium's implementation has a bug stopping flash. @@ -1704,6 +1707,12 @@ void NativeWindowViews::OnWidgetActivationChanged(views::Widget* changed_widget, NativeWindow::NotifyWindowBlur(); } +#if BUILDFLAG(IS_WIN) + // Update accent color based on activation state when no explicit color is + // set. + UpdateWindowAccentColor(active); +#endif + // Hide menu bar when window is blurred. if (!active && IsMenuBarAutoHide() && IsMenuBarVisible()) SetMenuBarVisibility(false); diff --git a/shell/browser/native_window_views.h b/shell/browser/native_window_views.h index 0788214b43..95a0eb95ec 100644 --- a/shell/browser/native_window_views.h +++ b/shell/browser/native_window_views.h @@ -101,6 +101,7 @@ class NativeWindowViews : public NativeWindow, void Invalidate() override; void SetTitle(const std::string& title) override; std::string GetTitle() const override; + [[nodiscard]] bool IsActive() const override; void FlashFrame(bool flash) override; void SetSkipTaskbar(bool skip) override; void SetExcludedFromShownWindowsMenu(bool excluded) override {} @@ -210,7 +211,7 @@ class NativeWindowViews : public NativeWindow, void ResetWindowControls(); void SetRoundedCorners(bool rounded); void SetForwardMouseMessages(bool forward); - void UpdateWindowAccentColor(); + void UpdateWindowAccentColor(bool active); static LRESULT CALLBACK SubclassProc(HWND hwnd, UINT msg, WPARAM w_param, diff --git a/shell/browser/native_window_views_win.cc b/shell/browser/native_window_views_win.cc index 21fbdcfed8..7baa349bd9 100644 --- a/shell/browser/native_window_views_win.cc +++ b/shell/browser/native_window_views_win.cc @@ -499,7 +499,7 @@ bool NativeWindowViews::PreHandleMSG(UINT message, return false; } case WM_DWMCOLORIZATIONCOLORCHANGED: { - UpdateWindowAccentColor(); + UpdateWindowAccentColor(IsActive()); return false; } case WM_SETTINGCHANGE: { @@ -507,7 +507,7 @@ bool NativeWindowViews::PreHandleMSG(UINT message, const wchar_t* setting_name = reinterpret_cast(l_param); std::wstring setting_str(setting_name); if (setting_str == L"ImmersiveColorSet") - UpdateWindowAccentColor(); + UpdateWindowAccentColor(IsActive()); } return false; } @@ -570,7 +570,7 @@ void NativeWindowViews::HandleSizeEvent(WPARAM w_param, LPARAM l_param) { } } -void NativeWindowViews::UpdateWindowAccentColor() { +void NativeWindowViews::UpdateWindowAccentColor(bool active) { if (base::win::GetVersion() < base::win::Version::WIN11) return; @@ -589,7 +589,7 @@ void NativeWindowViews::UpdateWindowAccentColor() { should_apply_accent = std::get(accent_color_); } else if (std::holds_alternative(accent_color_)) { // If no explicit color was set, default to the system accent color. - should_apply_accent = IsAccentColorOnTitleBarsEnabled(); + should_apply_accent = IsAccentColorOnTitleBarsEnabled() && active; } // Use system accent color as fallback if no explicit color was set.