[ghex/ghex-42] config: Fetch dark settings from portal if possible



commit cfd6ca84cb474bbfc0a0de18775d1c1daa5f85ec
Author: Logan Rathbone <poprocks gmail com>
Date:   Mon Jun 13 00:39:49 2022 -0400

    config: Fetch dark settings from portal if possible
    
    Backported from master: d192260e and d44bce9c

 src/configuration.c | 129 +++++++++++++++++++++++++++++++++++++++++++---------
 1 file changed, 108 insertions(+), 21 deletions(-)
---
diff --git a/src/configuration.c b/src/configuration.c
index ec52834..959853b 100644
--- a/src/configuration.c
+++ b/src/configuration.c
@@ -75,20 +75,21 @@ dark_mode_changed_cb (GSettings   *settings,
     def_dark_mode = g_settings_get_enum (settings, key);
 }
 
-void
-get_sys_default_is_dark (void)
+
+/* NOTE: for GTK 4.0 backwards compatibility, we manually define these
+ * here. If we wish to add an additional dependency on
+ * gsettings-desktop-schemas >= 42, this can be eliminated.
+ */
+enum system_color_scheme {
+       SYSTEM_DEFAULT,
+       SYSTEM_PREFER_DARK,
+       SYSTEM_PREFER_LIGHT,
+};
+
+static gboolean
+try_dark_from_gsettings (void)
 {
-       /* NOTE: for GTK 4.0 backwards compatibility, we manually define these
-        * here. If we wish to add an additional dependency on
-        * gsettings-desktop-schemas >= 42, this can be eliminated.
-        */
-       enum {
-               SYSTEM_DEFAULT,
-               SYSTEM_PREFER_DARK,
-               SYSTEM_PREFER_LIGHT,
-       } color_scheme;
-       GSettings *set;
-       GtkSettings *gtk_settings;
+       int color_scheme;
        GSettingsSchemaSource *source;
        GSettingsSchema *schema;
        char *schema_id = NULL;
@@ -99,33 +100,119 @@ get_sys_default_is_dark (void)
        if (schema && g_settings_schema_has_key (schema, "color-scheme"))
        {
                schema_id = "org.freedesktop.appearance";
-               g_settings_schema_unref (schema);
        }
        else
        {
+               g_clear_pointer (&schema, g_settings_schema_unref);
                schema = g_settings_schema_source_lookup (source, "org.gnome.desktop.interface", TRUE);
                if (schema && g_settings_schema_has_key (schema, "color-scheme"))
                {
                        schema_id = "org.gnome.desktop.interface";
-                       g_settings_schema_unref (schema);
                }
+               g_clear_pointer (&schema, g_settings_schema_unref);
        }
 
        if (schema_id)
        {
-               set = g_settings_new (schema_id);
+               GSettings *set = g_settings_new (schema_id);
                color_scheme = g_settings_get_enum (set, "color-scheme");
                if (color_scheme == SYSTEM_PREFER_DARK)
                        sys_default_is_dark = TRUE;
                g_object_unref (set);
+
+               return TRUE;
        }
-       else
+       return FALSE;
+}
+
+static gboolean
+try_dark_from_portal (void)
+{
+       int color_scheme;
+       char *color_scheme_str = NULL;
+       GDBusProxy *settings_portal = NULL;
+       GVariant *gvar = NULL, *gvar2 = NULL;
+       gboolean retval = FALSE;
+
+       settings_portal = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SESSION,
+                       G_DBUS_PROXY_FLAGS_NONE,
+                       NULL,
+                       "org.freedesktop.portal.Desktop",
+                       "/org/freedesktop/portal/desktop",
+                       "org.freedesktop.portal.Settings",
+                       NULL,
+                       NULL);
+
+       if (! settings_portal)
+               goto out;
+
+       gvar = g_dbus_proxy_call_sync (settings_portal,
+                       "Read",
+                       g_variant_new ("(ss)", "org.freedesktop.appearance", "color-scheme"),
+                       G_DBUS_CALL_FLAGS_NONE,
+                       G_MAXINT,
+                       NULL,
+                       NULL);
+
+       if (gvar)
+       {
+               g_variant_get (gvar, "(v)", &gvar2);
+               g_variant_get (g_variant_get_variant (gvar2), "u", &color_scheme);
+               retval = TRUE;
+               goto out;
+       }
+
+       gvar = g_dbus_proxy_call_sync (settings_portal,
+                       "Read",
+                       g_variant_new ("(ss)", "org.gnome.desktop.interface", "color-scheme"),
+                       G_DBUS_CALL_FLAGS_NONE,
+                       G_MAXINT,
+                       NULL,
+                       NULL);
+
+       if (! gvar)
+               goto out;
+
+       g_variant_get (gvar, "(v)", &gvar2);
+       g_variant_get (g_variant_get_variant (gvar2), "s", &color_scheme_str);
+
+       if (color_scheme_str)
        {
-               gtk_settings = gtk_settings_get_default ();
-               g_object_get (gtk_settings,
-                               "gtk-application-prefer-dark-theme", &sys_default_is_dark,
-                               NULL);
+               retval = TRUE;
+               if (g_strcmp0 (color_scheme_str, "prefer-dark") == 0)
+                       color_scheme = SYSTEM_PREFER_DARK;
        }
+
+out:
+       if (color_scheme == SYSTEM_PREFER_DARK)
+               sys_default_is_dark = TRUE;
+
+       g_clear_object (&settings_portal);
+       g_clear_pointer (&gvar, g_variant_unref);
+       g_clear_pointer (&gvar2, g_variant_unref);
+
+       return retval;
+}
+
+void
+get_sys_default_is_dark (void)
+{
+       GtkSettings *gtk_settings;
+       gboolean got_dark_pref;
+
+       got_dark_pref = try_dark_from_portal ();
+       if (got_dark_pref)
+               return;
+
+       got_dark_pref = try_dark_from_gsettings ();
+       if (got_dark_pref)
+               return;
+
+       /* If all else fails, try to fetch from GtkSettings. */
+       gtk_settings = gtk_settings_get_default ();
+       g_object_get (gtk_settings,
+                       "gtk-application-prefer-dark-theme", &sys_default_is_dark,
+                       NULL);
 }
 
 static void


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]