diff --git a/shell/browser/api/electron_api_web_contents.cc b/shell/browser/api/electron_api_web_contents.cc index 0b7e37bd8c5c..e93d2050bab3 100644 --- a/shell/browser/api/electron_api_web_contents.cc +++ b/shell/browser/api/electron_api_web_contents.cc @@ -2014,13 +2014,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 8f84cf759a87..9a9b19e9ffa0 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 aac6c2f07a43..aaa6900253ce 100644 --- a/shell/browser/native_window_views.cc +++ b/shell/browser/native_window_views.cc @@ -423,8 +423,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. @@ -1153,6 +1151,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. @@ -1737,6 +1740,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 4a3a0d827e45..bdaab7ce8104 100644 --- a/shell/browser/native_window_views.h +++ b/shell/browser/native_window_views.h @@ -100,6 +100,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 {} @@ -209,7 +210,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 cefd84e65811..6bc728ee7297 100644 --- a/shell/browser/native_window_views_win.cc +++ b/shell/browser/native_window_views_win.cc @@ -497,7 +497,7 @@ bool NativeWindowViews::PreHandleMSG(UINT message, return false; } case WM_DWMCOLORIZATIONCOLORCHANGED: { - UpdateWindowAccentColor(); + UpdateWindowAccentColor(IsActive()); return false; } case WM_SETTINGCHANGE: { @@ -505,7 +505,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; } @@ -568,7 +568,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; @@ -587,7 +587,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.