Skip to content

Commit fbb1044

Browse files
committed
Added system default theme mode on linux
fix brave/brave-browser#14685
1 parent 979aca0 commit fbb1044

8 files changed

+119
-17
lines changed

browser/themes/brave_dark_mode_utils.cc

+4
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,11 @@ bool SystemDarkModeEnabled() {
9999
if (g_is_test_)
100100
return g_system_dark_mode_enabled_in_test_;
101101

102+
#if BUILDFLAG(IS_LINUX)
103+
return HasCachedSystemDarkModeType();
104+
#else
102105
return ui::NativeTheme::GetInstanceForNativeUi()->SystemDarkModeSupported();
106+
#endif
103107
}
104108

105109
void SetUseSystemDarkModeEnabledForTest(bool enabled) {

browser/themes/brave_dark_mode_utils.h

+7
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,13 @@ void SetUseSystemDarkModeEnabledForTest(bool enabled);
5757
// By overriding, base ui components also use same brave theme type.
5858
void SetSystemDarkMode(BraveDarkModeType type);
5959

60+
#if BUILDFLAG(IS_LINUX)
61+
// Cache system preference from DarkModeManagerLinux.
62+
// This cached value is used whenever user chooses "Same as Linux" option.
63+
void CacheSystemDarkModePrefs(bool prefer_dark_theme);
64+
bool HasCachedSystemDarkModeType();
65+
#endif
66+
6067
} // namespace dark_mode
6168

6269
#endif // BRAVE_BROWSER_THEMES_BRAVE_DARK_MODE_UTILS_H_

browser/themes/brave_dark_mode_utils_linux.cc

+18-4
Original file line numberDiff line numberDiff line change
@@ -5,17 +5,31 @@
55

66
#include "brave/browser/themes/brave_dark_mode_utils.h"
77

8-
#include "base/notreached.h"
98
#include "brave/browser/themes/brave_dark_mode_utils_internal.h"
9+
#include "ui/native_theme/native_theme.h"
1010

1111
namespace dark_mode {
1212

13+
namespace {
14+
absl::optional<bool> g_system_dark_mode_prefs;
15+
} // namespace
16+
17+
void CacheSystemDarkModePrefs(bool prefer_dark_theme) {
18+
g_system_dark_mode_prefs = prefer_dark_theme;
19+
}
20+
21+
bool HasCachedSystemDarkModeType() {
22+
return g_system_dark_mode_prefs.has_value();
23+
}
24+
1325
void SetSystemDarkMode(BraveDarkModeType type) {
1426
if (type == BraveDarkModeType::BRAVE_DARK_MODE_TYPE_DEFAULT) {
15-
// Linux doesn't support system dark theme so there is no chance to set
16-
// default type. Default is used for 'Same as Windows/MacOS'.
17-
NOTREACHED();
27+
if (g_system_dark_mode_prefs.has_value()) {
28+
internal::SetSystemDarkModeForNonDefaultMode(*g_system_dark_mode_prefs);
29+
}
30+
return;
1831
}
32+
1933
internal::SetSystemDarkModeForNonDefaultMode(
2034
type == BraveDarkModeType::BRAVE_DARK_MODE_TYPE_DARK);
2135
}

browser/ui/BUILD.gn

+8
Original file line numberDiff line numberDiff line change
@@ -418,6 +418,14 @@ source_set("ui") {
418418
]
419419
}
420420

421+
if (is_linux && use_dbus) {
422+
sources += [
423+
"views/brave_dark_mode_manager_linux.cc",
424+
"views/brave_dark_mode_manager_linux.h",
425+
]
426+
deps += [ "//ui/linux:linux_ui_factory" ]
427+
}
428+
421429
if (enable_sparkle) {
422430
sources += [
423431
"views/update_recommended_message_box_mac.h",
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
/* Copyright (c) 2023 The Brave Authors. All rights reserved.
2+
* This Source Code Form is subject to the terms of the Mozilla Public
3+
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
4+
* You can obtain one at https://mozilla.org/MPL/2.0/. */
5+
6+
#include "brave/browser/ui/views/brave_dark_mode_manager_linux.h"
7+
8+
#include "brave/browser/themes/brave_dark_mode_utils.h"
9+
#include "ui/linux/linux_ui_factory.h"
10+
11+
namespace ui {
12+
13+
BraveDarkModeManagerLinux::BraveDarkModeManagerLinux()
14+
: DarkModeManagerLinux() {
15+
// In base class' ctor, |prefer_dark_theme_| is set by calling
16+
// SetColorScheme() when ui::GetDefaultLinuxUiTheme()
17+
if (ui::GetDefaultLinuxUiTheme()) {
18+
dark_mode::CacheSystemDarkModePrefs(prefer_dark_theme_);
19+
}
20+
}
21+
22+
BraveDarkModeManagerLinux::~BraveDarkModeManagerLinux() = default;
23+
24+
void BraveDarkModeManagerLinux::SetColorScheme(bool prefer_dark_theme,
25+
bool from_toolkit_theme) {
26+
dark_mode::CacheSystemDarkModePrefs(prefer_dark_theme);
27+
if (dark_mode::GetBraveDarkModeType() ==
28+
dark_mode::BraveDarkModeType::BRAVE_DARK_MODE_TYPE_DEFAULT) {
29+
DarkModeManagerLinux::SetColorScheme(prefer_dark_theme, from_toolkit_theme);
30+
} else {
31+
// Make |prefer_dark_theme_| stores latest system theme even brave theme(
32+
// dark or light) is set. If not, system theme change could not be applied
33+
// properly later.
34+
prefer_dark_theme_ = prefer_dark_theme;
35+
}
36+
}
37+
38+
} // namespace ui
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
/* Copyright (c) 2023 The Brave Authors. All rights reserved.
2+
* This Source Code Form is subject to the terms of the Mozilla Public
3+
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
4+
* You can obtain one at https://mozilla.org/MPL/2.0/. */
5+
6+
#ifndef BRAVE_BROWSER_UI_VIEWS_BRAVE_DARK_MODE_MANAGER_LINUX_H_
7+
#define BRAVE_BROWSER_UI_VIEWS_BRAVE_DARK_MODE_MANAGER_LINUX_H_
8+
9+
#include "chrome/browser/ui/views/dark_mode_manager_linux.h"
10+
11+
namespace ui {
12+
13+
class BraveDarkModeManagerLinux : public DarkModeManagerLinux {
14+
public:
15+
BraveDarkModeManagerLinux();
16+
~BraveDarkModeManagerLinux() override;
17+
18+
private:
19+
// DarkModeManagerLinux overrides:
20+
void SetColorScheme(bool prefer_dark_theme, bool from_toolkit_theme) override;
21+
};
22+
23+
} // namespace ui
24+
25+
#endif // BRAVE_BROWSER_UI_VIEWS_BRAVE_DARK_MODE_MANAGER_LINUX_H_

chromium_src/chrome/browser/ui/views/chrome_browser_main_extra_parts_views_linux.cc

+1-13
Original file line numberDiff line numberDiff line change
@@ -6,23 +6,11 @@
66
#include "chrome/browser/ui/views/chrome_browser_main_extra_parts_views_linux.h"
77

88
#if defined(USE_DBUS)
9+
#include "brave/browser/ui/views/brave_dark_mode_manager_linux.h"
910
#include "chrome/browser/ui/views/dark_mode_manager_linux.h"
1011
#endif
1112

1213
#if defined(USE_DBUS)
13-
namespace ui {
14-
15-
class BraveDarkModeManagerLinux {
16-
public:
17-
BraveDarkModeManagerLinux() = default;
18-
~BraveDarkModeManagerLinux() = default;
19-
BraveDarkModeManagerLinux(const BraveDarkModeManagerLinux&) = delete;
20-
BraveDarkModeManagerLinux& operator=(const BraveDarkModeManagerLinux&) =
21-
delete;
22-
};
23-
24-
} // namespace ui
25-
2614
#define DarkModeManagerLinux BraveDarkModeManagerLinux
2715
#endif
2816

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
/* Copyright (c) 2023 The Brave Authors. All rights reserved.
2+
* This Source Code Form is subject to the terms of the Mozilla Public
3+
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
4+
* You can obtain one at https://mozilla.org/MPL/2.0/. */
5+
6+
#ifndef BRAVE_CHROMIUM_SRC_CHROME_BROWSER_UI_VIEWS_DARK_MODE_MANAGER_LINUX_H_
7+
#define BRAVE_CHROMIUM_SRC_CHROME_BROWSER_UI_VIEWS_DARK_MODE_MANAGER_LINUX_H_
8+
9+
#define SetColorScheme \
10+
SetColorScheme_UnUsed() {} \
11+
friend class BraveDarkModeManagerLinux; \
12+
virtual void SetColorScheme
13+
14+
#include "src/chrome/browser/ui/views/dark_mode_manager_linux.h" // IWYU pragma: export
15+
16+
#undef SetColorScheme
17+
18+
#endif // BRAVE_CHROMIUM_SRC_CHROME_BROWSER_UI_VIEWS_DARK_MODE_MANAGER_LINUX_H_

0 commit comments

Comments
 (0)