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

Commit b69a6b3

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 74aa549 commit b69a6b3

File tree

4 files changed

+58
-10
lines changed

4 files changed

+58
-10
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 & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,11 @@
1010
static constexpr char kDesktopInterfaceSchema[] = "org.gnome.desktop.interface";
1111
static constexpr char kDesktopTextScalingFactorKey[] = "text-scaling-factor";
1212
static constexpr char kDesktopClockFormatKey[] = "clock-format";
13+
static constexpr char kDesktopColorSchemeKey[] = "color-scheme";
1314
static constexpr char kDesktopGtkThemeKey[] = "gtk-theme";
1415

1516
static constexpr char kClockFormat12Hour[] = "12h";
17+
static constexpr char kColorSchemePreferDark[] = "prefer-dark";
1618
static constexpr char kGtkThemeDarkSuffix[] = "-dark";
1719
static constexpr char kInterfaceSettings[] = "interface-settings";
1820

@@ -47,17 +49,32 @@ static FlClockFormat fl_gnome_settings_get_clock_format(FlSettings* settings) {
4749
return clock_format;
4850
}
4951

52+
static bool has_setting(GSettings* settings, const gchar* key) {
53+
g_autoptr(GSettingsSchema) schema = nullptr;
54+
g_object_get(settings, "settings-schema", &schema, nullptr);
55+
return g_settings_schema_has_key(schema, key);
56+
}
57+
5058
static FlColorScheme fl_gnome_settings_get_color_scheme(FlSettings* settings) {
5159
FlGnomeSettings* self = FL_GNOME_SETTINGS(settings);
5260

5361
FlColorScheme color_scheme = FL_COLOR_SCHEME_LIGHT;
5462

5563
if (self->interface_settings != nullptr) {
56-
// check whether org.gnome.desktop.interface.gtk-theme ends with "-dark"
57-
g_autofree gchar* value =
58-
g_settings_get_string(self->interface_settings, kDesktopGtkThemeKey);
59-
if (g_str_has_suffix(value, kGtkThemeDarkSuffix)) {
60-
color_scheme = FL_COLOR_SCHEME_DARK;
64+
if (has_setting(self->interface_settings, kDesktopColorSchemeKey)) {
65+
// org.gnome.desktop.interface.color-scheme in GNOME 42 and later
66+
g_autofree gchar* value = g_settings_get_string(self->interface_settings,
67+
kDesktopColorSchemeKey);
68+
if (g_strcmp0(value, kColorSchemePreferDark) == 0) {
69+
color_scheme = FL_COLOR_SCHEME_DARK;
70+
}
71+
} else {
72+
// check whether org.gnome.desktop.interface.gtk-theme ends with "-dark"
73+
g_autofree gchar* value =
74+
g_settings_get_string(self->interface_settings, kDesktopGtkThemeKey);
75+
if (g_str_has_suffix(value, kGtkThemeDarkSuffix)) {
76+
color_scheme = FL_COLOR_SCHEME_DARK;
77+
}
6178
}
6279
}
6380
return color_scheme;
@@ -82,13 +99,14 @@ static void fl_gnome_settings_set_interface_settings(FlGnomeSettings* self,
8299
g_signal_connect_object(settings, "changed::clock-format",
83100
G_CALLBACK(fl_settings_emit_changed), self,
84101
G_CONNECT_SWAPPED);
85-
g_signal_connect_object(settings, "changed::gtk-theme",
86-
G_CALLBACK(fl_settings_emit_changed), self,
87-
G_CONNECT_SWAPPED);
102+
g_signal_connect_object(
103+
settings,
104+
has_setting(settings, kDesktopColorSchemeKey) ? "changed::color-scheme"
105+
: "changed::gtk-theme",
106+
G_CALLBACK(fl_settings_emit_changed), self, G_CONNECT_SWAPPED);
88107
g_signal_connect_object(settings, "changed::text-scaling-factor",
89108
G_CALLBACK(fl_settings_emit_changed), self,
90109
G_CONNECT_SWAPPED);
91-
92110
self->interface_settings = G_SETTINGS(g_object_ref(settings));
93111
}
94112

shell/platform/linux/fl_gnome_settings_test.cc

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,33 @@ TEST_F(FlGnomeSettingsTest, ClockFormat) {
5252
EXPECT_EQ(fl_settings_get_clock_format(settings), FL_CLOCK_FORMAT_12H);
5353
}
5454

55+
TEST_F(FlGnomeSettingsTest, ColorScheme) {
56+
g_autoptr(GSettings) interface_settings =
57+
create_settings("ubuntu-22.04", "org.gnome.desktop.interface");
58+
g_settings_set_string(interface_settings, "color-scheme", "default");
59+
60+
g_autoptr(FlSettings) settings = FL_SETTINGS(
61+
g_object_new(fl_gnome_settings_get_type(), "interface_settings",
62+
interface_settings, nullptr));
63+
EXPECT_EQ(fl_settings_get_color_scheme(settings), FL_COLOR_SCHEME_LIGHT);
64+
65+
flutter::testing::MockSignalHandler settings_changed(settings, "changed");
66+
EXPECT_SIGNAL(settings_changed).Times(1);
67+
68+
g_settings_set_string(interface_settings, "color-scheme", "prefer-light");
69+
EXPECT_EQ(fl_settings_get_color_scheme(settings), FL_COLOR_SCHEME_LIGHT);
70+
71+
EXPECT_SIGNAL(settings_changed).Times(1);
72+
73+
g_settings_set_string(interface_settings, "color-scheme", "prefer-dark");
74+
EXPECT_EQ(fl_settings_get_color_scheme(settings), FL_COLOR_SCHEME_DARK);
75+
76+
EXPECT_SIGNAL(settings_changed).Times(0);
77+
78+
g_settings_set_string(interface_settings, "gtk-theme", "Yaru");
79+
EXPECT_EQ(fl_settings_get_color_scheme(settings), FL_COLOR_SCHEME_DARK);
80+
}
81+
5582
TEST_F(FlGnomeSettingsTest, GtkTheme) {
5683
g_autoptr(GSettings) interface_settings =
5784
create_settings("ubuntu-20.04", "org.gnome.desktop.interface");
35.5 KB
Binary file not shown.

0 commit comments

Comments
 (0)