2023-08-29 20:20:37 +02:00
|
|
|
diff --git base/win/dark_mode_support.cc base/win/dark_mode_support.cc
|
2024-03-19 22:11:42 +01:00
|
|
|
index 73d6ad5e9bb36..6c450e79c0f94 100644
|
2023-08-29 20:20:37 +02:00
|
|
|
--- base/win/dark_mode_support.cc
|
|
|
|
+++ base/win/dark_mode_support.cc
|
2023-12-06 21:16:15 +01:00
|
|
|
@@ -7,6 +7,7 @@
|
2023-08-29 20:20:37 +02:00
|
|
|
#include <windows.h>
|
|
|
|
|
2023-12-06 21:16:15 +01:00
|
|
|
#include "base/check.h"
|
2023-08-29 20:20:37 +02:00
|
|
|
+#include "base/command_line.h"
|
|
|
|
#include "base/native_library.h"
|
2024-03-19 22:11:42 +01:00
|
|
|
#include "base/win/win_util.h"
|
2023-08-29 20:20:37 +02:00
|
|
|
#include "base/win/windows_version.h"
|
2024-03-19 22:11:42 +01:00
|
|
|
@@ -89,11 +90,20 @@ const DarkModeSupport& GetDarkModeSupport() {
|
2023-08-29 20:20:37 +02:00
|
|
|
return dark_mode_support;
|
|
|
|
}
|
|
|
|
|
|
|
|
+bool IsForcedLightMode() {
|
|
|
|
+ static bool kIsForcedLightMode =
|
|
|
|
+ base::CommandLine::ForCurrentProcess()->HasSwitch(
|
|
|
|
+ "force-light-mode");
|
|
|
|
+ return kIsForcedLightMode;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
} // namespace
|
|
|
|
|
|
|
|
namespace base::win {
|
|
|
|
|
|
|
|
bool IsDarkModeAvailable() {
|
|
|
|
+ if (IsForcedLightMode())
|
|
|
|
+ return false;
|
|
|
|
auto& dark_mode_support = GetDarkModeSupport();
|
|
|
|
return (dark_mode_support.allow_dark_mode_for_app ||
|
|
|
|
dark_mode_support.set_preferred_app_mode) &&
|
2024-03-29 17:48:33 +01:00
|
|
|
diff --git chrome/browser/ui/views/chrome_browser_main_extra_parts_views_linux.cc chrome/browser/ui/views/chrome_browser_main_extra_parts_views_linux.cc
|
|
|
|
index 23d0611fdb2b5..81fd1055e926e 100644
|
|
|
|
--- chrome/browser/ui/views/chrome_browser_main_extra_parts_views_linux.cc
|
|
|
|
+++ chrome/browser/ui/views/chrome_browser_main_extra_parts_views_linux.cc
|
|
|
|
@@ -61,7 +61,10 @@ void ChromeBrowserMainExtraPartsViewsLinux::ToolkitInitialized() {
|
|
|
|
linux_ui_theme->GetNativeTheme()->system_theme());
|
|
|
|
}
|
|
|
|
#if defined(USE_DBUS)
|
|
|
|
- dark_mode_manager_ = std::make_unique<ui::DarkModeManagerLinux>();
|
|
|
|
+ if (!ui::NativeTheme::IsForcedDarkMode() &&
|
|
|
|
+ !ui::NativeTheme::IsForcedLightMode()) {
|
|
|
|
+ dark_mode_manager_ = std::make_unique<ui::DarkModeManagerLinux>();
|
|
|
|
+ }
|
|
|
|
#endif
|
2023-08-29 20:20:37 +02:00
|
|
|
}
|
2023-09-15 21:51:43 +02:00
|
|
|
|
2024-03-29 17:48:33 +01:00
|
|
|
diff --git ui/gtk/native_theme_gtk.cc ui/gtk/native_theme_gtk.cc
|
|
|
|
index d69b17b004120..5175ea3a785a3 100644
|
|
|
|
--- ui/gtk/native_theme_gtk.cc
|
|
|
|
+++ ui/gtk/native_theme_gtk.cc
|
|
|
|
@@ -164,9 +164,11 @@ void NativeThemeGtk::OnThemeChanged(GtkSettings* settings,
|
|
|
|
// have a light variant and aren't affected by the setting. Because of this,
|
|
|
|
// experimentally check if the theme is dark by checking if the window
|
|
|
|
// background color is dark.
|
|
|
|
- const SkColor window_bg_color = GetBgColor("");
|
|
|
|
- set_use_dark_colors(IsForcedDarkMode() ||
|
|
|
|
- color_utils::IsDark(window_bg_color));
|
|
|
|
+ if (!IsForcedLightMode()) {
|
|
|
|
+ const SkColor window_bg_color = GetBgColor("");
|
|
|
|
+ set_use_dark_colors(IsForcedDarkMode() ||
|
|
|
|
+ color_utils::IsDark(window_bg_color));
|
|
|
|
+ }
|
|
|
|
set_preferred_color_scheme(CalculatePreferredColorScheme());
|
|
|
|
|
|
|
|
// GTK doesn't have a native high contrast setting. Rather, it's implied by
|
|
|
|
diff --git ui/native_theme/native_theme.cc ui/native_theme/native_theme.cc
|
2024-04-23 22:06:00 +02:00
|
|
|
index f62df6eb7d12b..68f78b5e8bce0 100644
|
2024-03-29 17:48:33 +01:00
|
|
|
--- ui/native_theme/native_theme.cc
|
|
|
|
+++ ui/native_theme/native_theme.cc
|
|
|
|
@@ -143,6 +143,7 @@ void NativeTheme::NotifyOnNativeThemeUpdated() {
|
|
|
|
color_provider_manager.ResetColorProviderCache();
|
|
|
|
for (NativeThemeObserver& observer : native_theme_observers_)
|
|
|
|
observer.OnNativeThemeUpdated(this);
|
|
|
|
+ color_provider_manager.AfterNativeThemeUpdated();
|
|
|
|
|
|
|
|
RecordNumColorProvidersInitializedDuringOnNativeThemeUpdated(
|
|
|
|
color_provider_manager.num_providers_initialized() -
|
|
|
|
@@ -276,6 +277,13 @@ bool NativeTheme::IsForcedDarkMode() {
|
|
|
|
return kIsForcedDarkMode;
|
|
|
|
}
|
|
|
|
|
|
|
|
+bool NativeTheme::IsForcedLightMode() {
|
2023-08-29 20:20:37 +02:00
|
|
|
+ static bool kIsForcedLightMode =
|
|
|
|
+ base::CommandLine::ForCurrentProcess()->HasSwitch(
|
|
|
|
+ "force-light-mode");
|
|
|
|
+ return kIsForcedLightMode;
|
|
|
|
+}
|
|
|
|
+
|
2024-03-29 17:48:33 +01:00
|
|
|
bool NativeTheme::IsForcedHighContrast() {
|
|
|
|
static bool kIsForcedHighContrast =
|
|
|
|
base::CommandLine::ForCurrentProcess()->HasSwitch(
|
|
|
|
diff --git ui/native_theme/native_theme.h ui/native_theme/native_theme.h
|
2024-05-23 03:52:35 +02:00
|
|
|
index fc32dfb0de44f..44ca8103247b1 100644
|
2024-03-29 17:48:33 +01:00
|
|
|
--- ui/native_theme/native_theme.h
|
|
|
|
+++ ui/native_theme/native_theme.h
|
2024-05-23 03:52:35 +02:00
|
|
|
@@ -587,6 +587,9 @@ class NATIVE_THEME_EXPORT NativeTheme {
|
2024-03-29 17:48:33 +01:00
|
|
|
// Whether dark mode is forced via command-line flag.
|
|
|
|
static bool IsForcedDarkMode();
|
2023-08-29 20:20:37 +02:00
|
|
|
|
2024-03-29 17:48:33 +01:00
|
|
|
+ // Whether light mode is forced via command-line flag.
|
|
|
|
+ static bool IsForcedLightMode();
|
|
|
|
+
|
|
|
|
protected:
|
|
|
|
explicit NativeTheme(
|
|
|
|
bool should_only_use_dark_colors,
|
|
|
|
diff --git ui/native_theme/native_theme_mac.mm ui/native_theme/native_theme_mac.mm
|
2024-04-23 22:06:00 +02:00
|
|
|
index 9ca3120cfe3ac..c29c17330a7e5 100644
|
2024-03-29 17:48:33 +01:00
|
|
|
--- ui/native_theme/native_theme_mac.mm
|
|
|
|
+++ ui/native_theme/native_theme_mac.mm
|
2024-04-23 22:06:00 +02:00
|
|
|
@@ -586,11 +586,15 @@ void NativeThemeMac::PaintSelectedMenuItem(
|
2023-08-29 20:20:37 +02:00
|
|
|
|
|
|
|
void NativeThemeMac::InitializeDarkModeStateAndObserver() {
|
|
|
|
__block auto theme = this;
|
|
|
|
- set_use_dark_colors(IsDarkMode());
|
|
|
|
+ if (!IsForcedLightMode()) {
|
|
|
|
+ set_use_dark_colors(IsForcedDarkMode() || IsDarkMode());
|
|
|
|
+ }
|
|
|
|
set_preferred_color_scheme(CalculatePreferredColorScheme());
|
|
|
|
appearance_observer_ =
|
|
|
|
[[NativeThemeEffectiveAppearanceObserver alloc] initWithHandler:^{
|
|
|
|
- theme->set_use_dark_colors(IsDarkMode());
|
|
|
|
+ if (!IsForcedLightMode()) {
|
|
|
|
+ theme->set_use_dark_colors(IsForcedDarkMode() || IsDarkMode());
|
|
|
|
+ }
|
|
|
|
theme->set_preferred_color_scheme(CalculatePreferredColorScheme());
|
|
|
|
theme->NotifyOnNativeThemeUpdated();
|
|
|
|
}];
|
|
|
|
diff --git ui/native_theme/native_theme_win.cc ui/native_theme/native_theme_win.cc
|
2024-05-23 03:52:35 +02:00
|
|
|
index 547872076d126..14d0e817f3243 100644
|
2023-08-29 20:20:37 +02:00
|
|
|
--- ui/native_theme/native_theme_win.cc
|
|
|
|
+++ ui/native_theme/native_theme_win.cc
|
2024-04-23 22:06:00 +02:00
|
|
|
@@ -673,14 +673,17 @@ bool NativeThemeWin::ShouldUseDarkColors() const {
|
2023-08-29 21:23:06 +02:00
|
|
|
// Windows high contrast modes are entirely different themes,
|
|
|
|
// so let them take priority over dark mode.
|
|
|
|
// ...unless --force-dark-mode was specified in which case caveat emptor.
|
|
|
|
- if (InForcedColorsMode() && !IsForcedDarkMode())
|
|
|
|
+ if (supports_windows_dark_mode_ && IsForcedDarkMode()) {
|
|
|
|
+ return true;
|
|
|
|
+ }
|
|
|
|
+ if (InForcedColorsMode())
|
|
|
|
return false;
|
|
|
|
return NativeTheme::ShouldUseDarkColors();
|
|
|
|
}
|
2023-08-29 20:20:37 +02:00
|
|
|
|
|
|
|
NativeTheme::PreferredColorScheme
|
|
|
|
NativeThemeWin::CalculatePreferredColorScheme() const {
|
|
|
|
- if (!InForcedColorsMode())
|
|
|
|
+ if (!InForcedColorsMode() || !supports_windows_dark_mode_)
|
|
|
|
return NativeTheme::CalculatePreferredColorScheme();
|
|
|
|
|
|
|
|
// According to the spec, the preferred color scheme for web content is 'dark'
|
2024-04-23 22:06:00 +02:00
|
|
|
@@ -1671,8 +1674,9 @@ void NativeThemeWin::RegisterColorFilteringRegkeyObserver() {
|
2023-08-29 21:23:06 +02:00
|
|
|
}
|
2023-08-29 20:20:37 +02:00
|
|
|
|
|
|
|
void NativeThemeWin::UpdateDarkModeStatus() {
|
2023-08-29 21:23:06 +02:00
|
|
|
- bool dark_mode_enabled = false;
|
2023-08-29 20:20:37 +02:00
|
|
|
- if (hkcu_themes_regkey_.Valid()) {
|
2023-08-29 21:23:06 +02:00
|
|
|
+ bool dark_mode_enabled = ShouldUseDarkColors();
|
|
|
|
+ if (supports_windows_dark_mode_ && !IsForcedDarkMode() &&
|
|
|
|
+ hkcu_themes_regkey_.Valid()) {
|
2023-08-29 20:20:37 +02:00
|
|
|
DWORD apps_use_light_theme = 1;
|
|
|
|
hkcu_themes_regkey_.ReadValueDW(L"AppsUseLightTheme",
|
|
|
|
&apps_use_light_theme);
|