[ghex] config: Try to fetch dark settings from portal
- From: Logan Rathbone <larathbone src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [ghex] config: Try to fetch dark settings from portal
- Date: Mon, 13 Jun 2022 04:40:06 +0000 (UTC)
commit d192260e6d69fa73f8fb842b4c3ac0e3e1032597
Author: Logan Rathbone <poprocks gmail com>
Date: Mon Jun 13 00:39:49 2022 -0400
config: Try to fetch dark settings from portal
"It might work. Maybe." --jwz
src/configuration.c | 111 +++++++++++++++++++++++++++++++++++++++++-----------
1 file changed, 88 insertions(+), 23 deletions(-)
---
diff --git a/src/configuration.c b/src/configuration.c
index ec52834..d0b169a 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,97 @@ 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
- {
- gtk_settings = gtk_settings_get_default ();
- g_object_get (gtk_settings,
- "gtk-application-prefer-dark-theme", &sys_default_is_dark,
- NULL);
- }
+ return FALSE;
+}
+
+static gboolean
+try_dark_from_portal (void)
+{
+ int color_scheme;
+ GDBusProxy *settings_portal;
+ GVariant *gvar;
+
+ 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)
+ return FALSE;
+
+ 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)
+ 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)
+ return FALSE;
+
+ color_scheme = g_variant_get_uint32 (gvar);
+ if (color_scheme == SYSTEM_PREFER_DARK)
+ sys_default_is_dark = TRUE;
+ g_variant_unref (gvar);
+
+ return TRUE;
+}
+
+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]