1010static constexpr char kDesktopInterfaceSchema [] = " org.gnome.desktop.interface" ;
1111static constexpr char kDesktopTextScalingFactorKey [] = " text-scaling-factor" ;
1212static constexpr char kDesktopClockFormatKey [] = " clock-format" ;
13+ static constexpr char kDesktopColorSchemeKey [] = " color-scheme" ;
1314static constexpr char kDesktopGtkThemeKey [] = " gtk-theme" ;
1415
1516static constexpr char kClockFormat12Hour [] = " 12h" ;
17+ static constexpr char kColorSchemePreferDark [] = " prefer-dark" ;
1618static constexpr char kGtkThemeDarkSuffix [] = " -dark" ;
1719static 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+
5058static 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
0 commit comments