From 3e9ea285debf59d33ac8738ee3e7cad18a12b37f Mon Sep 17 00:00:00 2001 From: brave-builds Date: Thu, 23 Nov 2023 00:16:47 +0000 Subject: [PATCH] Uplift of #21065 (squashed) to beta --- browser/themes/brave_dark_mode_utils.cc | 4 ++ browser/themes/brave_dark_mode_utils.h | 7 ++++ browser/themes/brave_dark_mode_utils_linux.cc | 22 +++++++++-- browser/ui/BUILD.gn | 8 ++++ .../ui/views/brave_dark_mode_manager_linux.cc | 38 +++++++++++++++++++ .../ui/views/brave_dark_mode_manager_linux.h | 25 ++++++++++++ ...me_browser_main_extra_parts_views_linux.cc | 14 +------ .../ui/views/dark_mode_manager_linux.h | 18 +++++++++ 8 files changed, 119 insertions(+), 17 deletions(-) create mode 100644 browser/ui/views/brave_dark_mode_manager_linux.cc create mode 100644 browser/ui/views/brave_dark_mode_manager_linux.h create mode 100644 chromium_src/chrome/browser/ui/views/dark_mode_manager_linux.h diff --git a/browser/themes/brave_dark_mode_utils.cc b/browser/themes/brave_dark_mode_utils.cc index c58e5df8ed34..11a43bc1d20a 100644 --- a/browser/themes/brave_dark_mode_utils.cc +++ b/browser/themes/brave_dark_mode_utils.cc @@ -99,7 +99,11 @@ bool SystemDarkModeEnabled() { if (g_is_test_) return g_system_dark_mode_enabled_in_test_; +#if BUILDFLAG(IS_LINUX) + return HasCachedSystemDarkModeType(); +#else return ui::NativeTheme::GetInstanceForNativeUi()->SystemDarkModeSupported(); +#endif } void SetUseSystemDarkModeEnabledForTest(bool enabled) { diff --git a/browser/themes/brave_dark_mode_utils.h b/browser/themes/brave_dark_mode_utils.h index 8e598f958ce2..d865bea353a2 100644 --- a/browser/themes/brave_dark_mode_utils.h +++ b/browser/themes/brave_dark_mode_utils.h @@ -57,6 +57,13 @@ void SetUseSystemDarkModeEnabledForTest(bool enabled); // By overriding, base ui components also use same brave theme type. void SetSystemDarkMode(BraveDarkModeType type); +#if BUILDFLAG(IS_LINUX) +// Cache system preference from DarkModeManagerLinux. +// This cached value is used whenever user chooses "Same as Linux" option. +void CacheSystemDarkModePrefs(bool prefer_dark_theme); +bool HasCachedSystemDarkModeType(); +#endif + } // namespace dark_mode #endif // BRAVE_BROWSER_THEMES_BRAVE_DARK_MODE_UTILS_H_ diff --git a/browser/themes/brave_dark_mode_utils_linux.cc b/browser/themes/brave_dark_mode_utils_linux.cc index dbc6ef9f3dba..ab4b53614597 100644 --- a/browser/themes/brave_dark_mode_utils_linux.cc +++ b/browser/themes/brave_dark_mode_utils_linux.cc @@ -5,17 +5,31 @@ #include "brave/browser/themes/brave_dark_mode_utils.h" -#include "base/notreached.h" #include "brave/browser/themes/brave_dark_mode_utils_internal.h" +#include "ui/native_theme/native_theme.h" namespace dark_mode { +namespace { +absl::optional g_system_dark_mode_prefs; +} // namespace + +void CacheSystemDarkModePrefs(bool prefer_dark_theme) { + g_system_dark_mode_prefs = prefer_dark_theme; +} + +bool HasCachedSystemDarkModeType() { + return g_system_dark_mode_prefs.has_value(); +} + void SetSystemDarkMode(BraveDarkModeType type) { if (type == BraveDarkModeType::BRAVE_DARK_MODE_TYPE_DEFAULT) { - // Linux doesn't support system dark theme so there is no chance to set - // default type. Default is used for 'Same as Windows/MacOS'. - NOTREACHED(); + if (g_system_dark_mode_prefs.has_value()) { + internal::SetSystemDarkModeForNonDefaultMode(*g_system_dark_mode_prefs); + } + return; } + internal::SetSystemDarkModeForNonDefaultMode( type == BraveDarkModeType::BRAVE_DARK_MODE_TYPE_DARK); } diff --git a/browser/ui/BUILD.gn b/browser/ui/BUILD.gn index 61e9c9a5d915..d71b5de45eaa 100644 --- a/browser/ui/BUILD.gn +++ b/browser/ui/BUILD.gn @@ -417,6 +417,14 @@ source_set("ui") { ] } + if (is_linux && use_dbus) { + sources += [ + "views/brave_dark_mode_manager_linux.cc", + "views/brave_dark_mode_manager_linux.h", + ] + deps += [ "//ui/linux:linux_ui_factory" ] + } + if (enable_sparkle) { sources += [ "views/update_recommended_message_box_mac.h", diff --git a/browser/ui/views/brave_dark_mode_manager_linux.cc b/browser/ui/views/brave_dark_mode_manager_linux.cc new file mode 100644 index 000000000000..b167c5adb716 --- /dev/null +++ b/browser/ui/views/brave_dark_mode_manager_linux.cc @@ -0,0 +1,38 @@ +/* Copyright (c) 2023 The Brave Authors. All rights reserved. + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this file, + * You can obtain one at https://mozilla.org/MPL/2.0/. */ + +#include "brave/browser/ui/views/brave_dark_mode_manager_linux.h" + +#include "brave/browser/themes/brave_dark_mode_utils.h" +#include "ui/linux/linux_ui_factory.h" + +namespace ui { + +BraveDarkModeManagerLinux::BraveDarkModeManagerLinux() + : DarkModeManagerLinux() { + // In base class' ctor, |prefer_dark_theme_| is set by calling + // SetColorScheme() when ui::GetDefaultLinuxUiTheme() + if (ui::GetDefaultLinuxUiTheme()) { + dark_mode::CacheSystemDarkModePrefs(prefer_dark_theme_); + } +} + +BraveDarkModeManagerLinux::~BraveDarkModeManagerLinux() = default; + +void BraveDarkModeManagerLinux::SetColorScheme(bool prefer_dark_theme, + bool from_toolkit_theme) { + dark_mode::CacheSystemDarkModePrefs(prefer_dark_theme); + if (dark_mode::GetBraveDarkModeType() == + dark_mode::BraveDarkModeType::BRAVE_DARK_MODE_TYPE_DEFAULT) { + DarkModeManagerLinux::SetColorScheme(prefer_dark_theme, from_toolkit_theme); + } else { + // Make |prefer_dark_theme_| stores latest system theme even brave theme( + // dark or light) is set. If not, system theme change could not be applied + // properly later. + prefer_dark_theme_ = prefer_dark_theme; + } +} + +} // namespace ui diff --git a/browser/ui/views/brave_dark_mode_manager_linux.h b/browser/ui/views/brave_dark_mode_manager_linux.h new file mode 100644 index 000000000000..fd4aa37a4e8d --- /dev/null +++ b/browser/ui/views/brave_dark_mode_manager_linux.h @@ -0,0 +1,25 @@ +/* Copyright (c) 2023 The Brave Authors. All rights reserved. + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this file, + * You can obtain one at https://mozilla.org/MPL/2.0/. */ + +#ifndef BRAVE_BROWSER_UI_VIEWS_BRAVE_DARK_MODE_MANAGER_LINUX_H_ +#define BRAVE_BROWSER_UI_VIEWS_BRAVE_DARK_MODE_MANAGER_LINUX_H_ + +#include "chrome/browser/ui/views/dark_mode_manager_linux.h" + +namespace ui { + +class BraveDarkModeManagerLinux : public DarkModeManagerLinux { + public: + BraveDarkModeManagerLinux(); + ~BraveDarkModeManagerLinux() override; + + private: + // DarkModeManagerLinux overrides: + void SetColorScheme(bool prefer_dark_theme, bool from_toolkit_theme) override; +}; + +} // namespace ui + +#endif // BRAVE_BROWSER_UI_VIEWS_BRAVE_DARK_MODE_MANAGER_LINUX_H_ diff --git a/chromium_src/chrome/browser/ui/views/chrome_browser_main_extra_parts_views_linux.cc b/chromium_src/chrome/browser/ui/views/chrome_browser_main_extra_parts_views_linux.cc index 6812095a99cc..6ca74f0f5673 100644 --- a/chromium_src/chrome/browser/ui/views/chrome_browser_main_extra_parts_views_linux.cc +++ b/chromium_src/chrome/browser/ui/views/chrome_browser_main_extra_parts_views_linux.cc @@ -6,23 +6,11 @@ #include "chrome/browser/ui/views/chrome_browser_main_extra_parts_views_linux.h" #if defined(USE_DBUS) +#include "brave/browser/ui/views/brave_dark_mode_manager_linux.h" #include "chrome/browser/ui/views/dark_mode_manager_linux.h" #endif #if defined(USE_DBUS) -namespace ui { - -class BraveDarkModeManagerLinux { - public: - BraveDarkModeManagerLinux() = default; - ~BraveDarkModeManagerLinux() = default; - BraveDarkModeManagerLinux(const BraveDarkModeManagerLinux&) = delete; - BraveDarkModeManagerLinux& operator=(const BraveDarkModeManagerLinux&) = - delete; -}; - -} // namespace ui - #define DarkModeManagerLinux BraveDarkModeManagerLinux #endif diff --git a/chromium_src/chrome/browser/ui/views/dark_mode_manager_linux.h b/chromium_src/chrome/browser/ui/views/dark_mode_manager_linux.h new file mode 100644 index 000000000000..22db55b0e6ab --- /dev/null +++ b/chromium_src/chrome/browser/ui/views/dark_mode_manager_linux.h @@ -0,0 +1,18 @@ +/* Copyright (c) 2023 The Brave Authors. All rights reserved. + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this file, + * You can obtain one at https://mozilla.org/MPL/2.0/. */ + +#ifndef BRAVE_CHROMIUM_SRC_CHROME_BROWSER_UI_VIEWS_DARK_MODE_MANAGER_LINUX_H_ +#define BRAVE_CHROMIUM_SRC_CHROME_BROWSER_UI_VIEWS_DARK_MODE_MANAGER_LINUX_H_ + +#define SetColorScheme \ + SetColorScheme_UnUsed() {} \ + friend class BraveDarkModeManagerLinux; \ + virtual void SetColorScheme + +#include "src/chrome/browser/ui/views/dark_mode_manager_linux.h" // IWYU pragma: export + +#undef SetColorScheme + +#endif // BRAVE_CHROMIUM_SRC_CHROME_BROWSER_UI_VIEWS_DARK_MODE_MANAGER_LINUX_H_