Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.

Commit 0bf514b

Browse files
committed
[Linux] fix theme updates on GNOME 42
Prefer `org.gnome.desktop.interface.color-scheme` for determining the UI color scheme. The new setting is available in GNOME 42 and later. https://blogs.gnome.org/alexm/2021/10/04/dark-style-preference/ Fixes: flutter/flutter#101438
1 parent b4e17bb commit 0bf514b

File tree

4 files changed

+56
-9
lines changed

4 files changed

+56
-9
lines changed

shell/platform/linux/BUILD.gn

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -180,7 +180,10 @@ test_fixtures("flutter_linux_fixtures") {
180180
copy("flutter_linux_gschemas") {
181181
testonly = true
182182

183-
sources = [ "testing/gschemas/ubuntu-20.04.compiled" ]
183+
sources = [
184+
"testing/gschemas/ubuntu-20.04.compiled",
185+
"testing/gschemas/ubuntu-22.04.compiled",
186+
]
184187
outputs = [ "$target_gen_dir/assets/{{source_name_part}}/gschemas.compiled" ]
185188
}
186189

shell/platform/linux/fl_gnome_settings.cc

Lines changed: 27 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,11 @@
99
static constexpr char kDesktopInterfaceSchema[] = "org.gnome.desktop.interface";
1010
static constexpr char kDesktopTextScalingFactorKey[] = "text-scaling-factor";
1111
static constexpr char kDesktopClockFormatKey[] = "clock-format";
12+
static constexpr char kDesktopColorSchemeKey[] = "color-scheme";
1213
static constexpr char kDesktopGtkThemeKey[] = "gtk-theme";
1314

1415
static constexpr char kClockFormat12Hour[] = "12h";
16+
static constexpr char kColorSchemePreferDark[] = "prefer-dark";
1517
static constexpr char kGtkThemeDarkSuffix[] = "-dark";
1618

1719
G_DECLARE_FINAL_TYPE(FlGnomeSettings,
@@ -52,17 +54,32 @@ static FlClockFormat fl_gnome_settings_get_clock_format(FlSettings* settings) {
5254
return clock_format;
5355
}
5456

57+
static bool has_color_scheme(GSettings* settings) {
58+
g_autoptr(GSettingsSchema) schema = nullptr;
59+
g_object_get(settings, "settings-schema", &schema, nullptr);
60+
return g_settings_schema_has_key(schema, kDesktopColorSchemeKey);
61+
}
62+
5563
static FlColorScheme fl_gnome_settings_get_color_scheme(FlSettings* settings) {
5664
FlGnomeSettings* self = FL_GNOME_SETTINGS(settings);
5765

5866
FlColorScheme color_scheme = FL_COLOR_SCHEME_LIGHT;
5967

6068
if (self->interface_settings != nullptr) {
61-
// check whether org.gnome.desktop.interface.gtk-theme ends with "-dark"
62-
g_autofree gchar* value =
63-
g_settings_get_string(self->interface_settings, kDesktopGtkThemeKey);
64-
if (g_str_has_suffix(value, kGtkThemeDarkSuffix)) {
65-
color_scheme = FL_COLOR_SCHEME_DARK;
69+
if (has_color_scheme(self->interface_settings)) {
70+
// org.gnome.desktop.interface.color-scheme in GNOME 42 and later
71+
g_autofree gchar* value = g_settings_get_string(self->interface_settings,
72+
kDesktopColorSchemeKey);
73+
if (g_strcmp0(value, kColorSchemePreferDark) == 0) {
74+
color_scheme = FL_COLOR_SCHEME_DARK;
75+
}
76+
} else {
77+
// check whether org.gnome.desktop.interface.gtk-theme ends with "-dark"
78+
g_autofree gchar* value =
79+
g_settings_get_string(self->interface_settings, kDesktopGtkThemeKey);
80+
if (g_str_has_suffix(value, kGtkThemeDarkSuffix)) {
81+
color_scheme = FL_COLOR_SCHEME_DARK;
82+
}
6683
}
6784
}
6885
return color_scheme;
@@ -127,9 +144,11 @@ FlSettings* fl_gnome_settings_new(GSettings* interface_settings) {
127144
g_signal_connect_object(self->interface_settings, "changed::clock-format",
128145
G_CALLBACK(fl_settings_emit_changed), self,
129146
G_CONNECT_SWAPPED);
130-
g_signal_connect_object(self->interface_settings, "changed::gtk-theme",
131-
G_CALLBACK(fl_settings_emit_changed), self,
132-
G_CONNECT_SWAPPED);
147+
g_signal_connect_object(
148+
self->interface_settings,
149+
has_color_scheme(self->interface_settings) ? "changed::color-scheme"
150+
: "changed::gtk-theme",
151+
G_CALLBACK(fl_settings_emit_changed), self, G_CONNECT_SWAPPED);
133152
g_signal_connect_object(
134153
self->interface_settings, "changed::text-scaling-factor",
135154
G_CALLBACK(fl_settings_emit_changed), self, G_CONNECT_SWAPPED);

shell/platform/linux/fl_gnome_settings_test.cc

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,31 @@ TEST_F(FlGnomeSettingsTest, ClockFormat) {
5050
EXPECT_EQ(fl_settings_get_clock_format(settings), FL_CLOCK_FORMAT_12H);
5151
}
5252

53+
TEST_F(FlGnomeSettingsTest, ColorScheme) {
54+
g_autoptr(GSettings) interface_settings =
55+
create_interface_settings("ubuntu-22.04");
56+
g_settings_set_string(interface_settings, "color-scheme", "default");
57+
58+
g_autoptr(FlSettings) settings = fl_gnome_settings_new(interface_settings);
59+
EXPECT_EQ(fl_settings_get_color_scheme(settings), FL_COLOR_SCHEME_LIGHT);
60+
61+
flutter::testing::MockSignalHandler settings_changed(settings, "changed");
62+
EXPECT_SIGNAL(settings_changed).Times(1);
63+
64+
g_settings_set_string(interface_settings, "color-scheme", "prefer-light");
65+
EXPECT_EQ(fl_settings_get_color_scheme(settings), FL_COLOR_SCHEME_LIGHT);
66+
67+
EXPECT_SIGNAL(settings_changed).Times(1);
68+
69+
g_settings_set_string(interface_settings, "color-scheme", "prefer-dark");
70+
EXPECT_EQ(fl_settings_get_color_scheme(settings), FL_COLOR_SCHEME_DARK);
71+
72+
EXPECT_SIGNAL(settings_changed).Times(0);
73+
74+
g_settings_set_string(interface_settings, "gtk-theme", "Yaru");
75+
EXPECT_EQ(fl_settings_get_color_scheme(settings), FL_COLOR_SCHEME_DARK);
76+
}
77+
5378
TEST_F(FlGnomeSettingsTest, GtkTheme) {
5479
g_autoptr(GSettings) interface_settings =
5580
create_interface_settings("ubuntu-20.04");
35.5 KB
Binary file not shown.

0 commit comments

Comments
 (0)