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

Commit f0a12a1

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 0aac7f8 commit f0a12a1

File tree

4 files changed

+58
-9
lines changed

4 files changed

+58
-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
@@ -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

1820
struct _FlGnomeSettings {
@@ -46,17 +48,32 @@ static FlClockFormat fl_gnome_settings_get_clock_format(FlSettings* settings) {
4648
return clock_format;
4749
}
4850

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

5260
FlColorScheme color_scheme = FL_COLOR_SCHEME_LIGHT;
5361

5462
if (self->interface_settings != nullptr) {
55-
// check whether org.gnome.desktop.interface.gtk-theme ends with "-dark"
56-
g_autofree gchar* value =
57-
g_settings_get_string(self->interface_settings, kDesktopGtkThemeKey);
58-
if (g_str_has_suffix(value, kGtkThemeDarkSuffix)) {
59-
color_scheme = FL_COLOR_SCHEME_DARK;
63+
if (has_setting(self->interface_settings, kDesktopColorSchemeKey)) {
64+
// org.gnome.desktop.interface.color-scheme in GNOME 42 and later
65+
g_autofree gchar* value = g_settings_get_string(self->interface_settings,
66+
kDesktopColorSchemeKey);
67+
if (g_strcmp0(value, kColorSchemePreferDark) == 0) {
68+
color_scheme = FL_COLOR_SCHEME_DARK;
69+
}
70+
} else {
71+
// check whether org.gnome.desktop.interface.gtk-theme ends with "-dark"
72+
g_autofree gchar* value =
73+
g_settings_get_string(self->interface_settings, kDesktopGtkThemeKey);
74+
if (g_str_has_suffix(value, kGtkThemeDarkSuffix)) {
75+
color_scheme = FL_COLOR_SCHEME_DARK;
76+
}
6077
}
6178
}
6279
return color_scheme;
@@ -80,9 +97,11 @@ static void fl_gnome_settings_set_interface_settings(FlGnomeSettings* self,
8097
g_signal_connect_object(settings, "changed::clock-format",
8198
G_CALLBACK(fl_settings_emit_changed), self,
8299
G_CONNECT_SWAPPED);
83-
g_signal_connect_object(settings, "changed::gtk-theme",
84-
G_CALLBACK(fl_settings_emit_changed), self,
85-
G_CONNECT_SWAPPED);
100+
g_signal_connect_object(
101+
settings,
102+
has_setting(settings, kDesktopColorSchemeKey) ? "changed::color-scheme"
103+
: "changed::gtk-theme",
104+
G_CALLBACK(fl_settings_emit_changed), self, G_CONNECT_SWAPPED);
86105
g_signal_connect_object(settings, "changed::text-scaling-factor",
87106
G_CALLBACK(fl_settings_emit_changed), self,
88107
G_CONNECT_SWAPPED);

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)