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

Commit 42fac30

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 07da923 commit 42fac30

File tree

2 files changed

+51
-8
lines changed

2 files changed

+51
-8
lines changed

shell/platform/linux/fl_gnome_settings.cc

Lines changed: 26 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
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";
@@ -53,17 +54,32 @@ static FlClockFormat fl_gnome_settings_get_clock_format(FlSettings* settings) {
5354
return clock_format;
5455
}
5556

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+
5663
static FlColorScheme fl_gnome_settings_get_color_scheme(FlSettings* settings) {
5764
FlGnomeSettings* self = FL_GNOME_SETTINGS(settings);
5865

5966
FlColorScheme color_scheme = FL_COLOR_SCHEME_LIGHT;
6067

6168
if (self->interface_settings != nullptr) {
62-
// check whether org.gnome.desktop.interface.gtk-theme ends with "-dark"
63-
g_autofree gchar* value =
64-
g_settings_get_string(self->interface_settings, kDesktopGtkThemeKey);
65-
if (g_str_has_suffix(value, kGtkThemeDarkSuffix)) {
66-
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+
}
6783
}
6884
}
6985
return color_scheme;
@@ -128,9 +144,11 @@ FlSettings* fl_gnome_settings_new(GSettings* interface_settings) {
128144
g_signal_connect_object(self->interface_settings, "changed::clock-format",
129145
G_CALLBACK(fl_settings_emit_changed), self,
130146
G_CONNECT_SWAPPED);
131-
g_signal_connect_object(self->interface_settings, "changed::gtk-theme",
132-
G_CALLBACK(fl_settings_emit_changed), self,
133-
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);
134152
g_signal_connect_object(
135153
self->interface_settings, "changed::text-scaling-factor",
136154
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");

0 commit comments

Comments
 (0)