Blame SOURCES/backport-per-desktop-overrides.patch

d1ed09
From 5634fd61f17d28dfc05cd47cfbd2bd2f21e6d2b1 Mon Sep 17 00:00:00 2001
d1ed09
From: Allison Lortie <desrt@desrt.ca>
d1ed09
Date: Wed, 2 Aug 2017 11:06:03 +0100
d1ed09
Subject: [PATCH 1/4] gsettings: cleanup default value lookup
d1ed09
d1ed09
There are a couple of different ways (and soon one more) to access the
d1ed09
default value of a key. Clean up the various places that access this to
d1ed09
avoid duplication.
d1ed09
d1ed09
https://bugzilla.gnome.org/show_bug.cgi?id=746592
d1ed09
---
d1ed09
 gio/gsettings.c | 20 ++++----------------
d1ed09
 1 file changed, 4 insertions(+), 16 deletions(-)
d1ed09
d1ed09
diff --git a/gio/gsettings.c b/gio/gsettings.c
d1ed09
index 10d394d69..5e5816d57 100644
d1ed09
--- a/gio/gsettings.c
d1ed09
+++ b/gio/gsettings.c
d1ed09
@@ -1204,10 +1204,7 @@ g_settings_get_value (GSettings   *settings,
d1ed09
   value = g_settings_read_from_backend (settings, &skey, FALSE, FALSE);
d1ed09
 
d1ed09
   if (value == NULL)
d1ed09
-    value = g_settings_schema_key_get_translated_default (&skey);
d1ed09
-
d1ed09
-  if (value == NULL)
d1ed09
-    value = g_variant_ref (skey.default_value);
d1ed09
+    value = g_settings_schema_key_get_default_value (&skey);
d1ed09
 
d1ed09
   g_settings_schema_key_clear (&skey);
d1ed09
 
d1ed09
@@ -1304,10 +1301,7 @@ g_settings_get_default_value (GSettings   *settings,
d1ed09
   value = g_settings_read_from_backend (settings, &skey, FALSE, TRUE);
d1ed09
 
d1ed09
   if (value == NULL)
d1ed09
-    value = g_settings_schema_key_get_translated_default (&skey);
d1ed09
-
d1ed09
-  if (value == NULL)
d1ed09
-    value = g_variant_ref (skey.default_value);
d1ed09
+    value = g_settings_schema_key_get_default_value (&skey);
d1ed09
 
d1ed09
   g_settings_schema_key_clear (&skey);
d1ed09
 
d1ed09
@@ -1360,10 +1354,7 @@ g_settings_get_enum (GSettings   *settings,
d1ed09
   value = g_settings_read_from_backend (settings, &skey, FALSE, FALSE);
d1ed09
 
d1ed09
   if (value == NULL)
d1ed09
-    value = g_settings_schema_key_get_translated_default (&skey);
d1ed09
-
d1ed09
-  if (value == NULL)
d1ed09
-    value = g_variant_ref (skey.default_value);
d1ed09
+    value = g_settings_schema_key_get_default_value (&skey);
d1ed09
 
d1ed09
   result = g_settings_schema_key_to_enum (&skey, value);
d1ed09
   g_settings_schema_key_clear (&skey);
d1ed09
@@ -1473,10 +1464,7 @@ g_settings_get_flags (GSettings   *settings,
d1ed09
   value = g_settings_read_from_backend (settings, &skey, FALSE, FALSE);
d1ed09
 
d1ed09
   if (value == NULL)
d1ed09
-    value = g_settings_schema_key_get_translated_default (&skey);
d1ed09
-
d1ed09
-  if (value == NULL)
d1ed09
-    value = g_variant_ref (skey.default_value);
d1ed09
+    value = g_settings_schema_key_get_default_value (&skey);
d1ed09
 
d1ed09
   result = g_settings_schema_key_to_flags (&skey, value);
d1ed09
   g_settings_schema_key_clear (&skey);
d1ed09
-- 
d1ed09
2.21.0
d1ed09
d1ed09
d1ed09
From 89c6e8f4a0bcda4b58dbaea713e62be01cfc2087 Mon Sep 17 00:00:00 2001
d1ed09
From: Allison Lortie <desrt@desrt.ca>
d1ed09
Date: Wed, 2 Aug 2017 11:08:17 +0100
d1ed09
Subject: [PATCH 2/4] gsettingsschema: Allow per-desktop overrides
d1ed09
MIME-Version: 1.0
d1ed09
Content-Type: text/plain; charset=UTF-8
d1ed09
Content-Transfer-Encoding: 8bit
d1ed09
d1ed09
Recognise a new 'd' option in schema keys which gives a dictionary of
d1ed09
per-desktop default values. This dictionary is searched for the items
d1ed09
found in XDG_CURRENT_DESKTOP, in the order. If nothing matches (or if
d1ed09
the option is missing) then the default value is used as before.
d1ed09
d1ed09
This feature was requested by Alberts Muktupāvels and this patch is
d1ed09
based on an approach devised by them.
d1ed09
d1ed09
https://bugzilla.gnome.org/show_bug.cgi?id=746592
d1ed09
---
d1ed09
 gio/gsettings.c                | 21 +++++++++++++++++
d1ed09
 gio/gsettingsschema-internal.h |  2 ++
d1ed09
 gio/gsettingsschema.c          | 41 ++++++++++++++++++++++++++++++++++
d1ed09
 3 files changed, 64 insertions(+)
d1ed09
d1ed09
diff --git a/gio/gsettings.c b/gio/gsettings.c
d1ed09
index 5e5816d57..f1130c095 100644
d1ed09
--- a/gio/gsettings.c
d1ed09
+++ b/gio/gsettings.c
d1ed09
@@ -1739,6 +1739,13 @@ g_settings_get_mapped (GSettings           *settings,
d1ed09
       if (okay) goto okay;
d1ed09
     }
d1ed09
 
d1ed09
+  if ((value = g_settings_schema_key_get_per_desktop_default (&skey)))
d1ed09
+    {
d1ed09
+      okay = mapping (value, &result, user_data);
d1ed09
+      g_variant_unref (value);
d1ed09
+      if (okay) goto okay;
d1ed09
+    }
d1ed09
+
d1ed09
   if (mapping (skey.default_value, &result, user_data))
d1ed09
     goto okay;
d1ed09
 
d1ed09
@@ -2647,6 +2654,20 @@ g_settings_binding_key_changed (GSettings   *settings,
d1ed09
         }
d1ed09
     }
d1ed09
 
d1ed09
+  if (variant == NULL)
d1ed09
+    {
d1ed09
+      variant = g_settings_schema_key_get_per_desktop_default (&binding->key);
d1ed09
+      if (variant &&
d1ed09
+          !binding->get_mapping (&value, variant, binding->user_data))
d1ed09
+        {
d1ed09
+          g_error ("Per-desktop default value for key '%s' in schema '%s' "
d1ed09
+                   "was rejected by the binding mapping function.",
d1ed09
+                   binding->key.name, g_settings_schema_get_id (binding->key.schema));
d1ed09
+          g_variant_unref (variant);
d1ed09
+          variant = NULL;
d1ed09
+        }
d1ed09
+    }
d1ed09
+
d1ed09
   if (variant == NULL)
d1ed09
     {
d1ed09
       variant = g_variant_ref (binding->key.default_value);
d1ed09
diff --git a/gio/gsettingsschema-internal.h b/gio/gsettingsschema-internal.h
d1ed09
index f54de3b34..5f996b4bc 100644
d1ed09
--- a/gio/gsettingsschema-internal.h
d1ed09
+++ b/gio/gsettingsschema-internal.h
d1ed09
@@ -37,6 +37,7 @@ struct _GSettingsSchemaKey
d1ed09
   const GVariantType *type;
d1ed09
   GVariant *minimum, *maximum;
d1ed09
   GVariant *default_value;
d1ed09
+  GVariant *desktop_overrides;
d1ed09
 
d1ed09
   gint ref_count;
d1ed09
 };
d1ed09
@@ -58,6 +59,7 @@ gboolean                g_settings_schema_key_type_check                (GSettin
d1ed09
 GVariant *              g_settings_schema_key_range_fixup               (GSettingsSchemaKey *key,
d1ed09
                                                                          GVariant           *value);
d1ed09
 GVariant *              g_settings_schema_key_get_translated_default    (GSettingsSchemaKey *key);
d1ed09
+GVariant *              g_settings_schema_key_get_per_desktop_default   (GSettingsSchemaKey *key);
d1ed09
 
d1ed09
 gint                    g_settings_schema_key_to_enum                   (GSettingsSchemaKey *key,
d1ed09
                                                                          GVariant           *value);
d1ed09
diff --git a/gio/gsettingsschema.c b/gio/gsettingsschema.c
d1ed09
index f1274a369..17b7e3b01 100644
d1ed09
--- a/gio/gsettingsschema.c
d1ed09
+++ b/gio/gsettingsschema.c
d1ed09
@@ -27,6 +27,7 @@
d1ed09
 #include <glibintl.h>
d1ed09
 #include <locale.h>
d1ed09
 #include <string.h>
d1ed09
+#include <stdlib.h>
d1ed09
 
d1ed09
 /**
d1ed09
  * SECTION:gsettingsschema
d1ed09
@@ -1283,6 +1284,11 @@ g_settings_schema_key_init (GSettingsSchemaKey *key,
d1ed09
           endian_fixup (&key->maximum);
d1ed09
           break;
d1ed09
 
d1ed09
+        case 'd':
d1ed09
+          g_variant_get (data, "@a{sv}", &key->desktop_overrides);
d1ed09
+          endian_fixup (&key->desktop_overrides);
d1ed09
+          break;
d1ed09
+
d1ed09
         default:
d1ed09
           g_warning ("unknown schema extension '%c'", code);
d1ed09
           break;
d1ed09
@@ -1303,6 +1309,9 @@ g_settings_schema_key_clear (GSettingsSchemaKey *key)
d1ed09
   if (key->maximum)
d1ed09
     g_variant_unref (key->maximum);
d1ed09
 
d1ed09
+  if (key->desktop_overrides)
d1ed09
+    g_variant_unref (key->desktop_overrides);
d1ed09
+
d1ed09
   g_variant_unref (key->default_value);
d1ed09
 
d1ed09
   g_settings_schema_unref (key->schema);
d1ed09
@@ -1410,6 +1419,35 @@ g_settings_schema_key_get_translated_default (GSettingsSchemaKey *key)
d1ed09
   return value;
d1ed09
 }
d1ed09
 
d1ed09
+GVariant *
d1ed09
+g_settings_schema_key_get_per_desktop_default (GSettingsSchemaKey *key)
d1ed09
+{
d1ed09
+  static const gchar * const *current_desktops;
d1ed09
+  GVariant *value = NULL;
d1ed09
+  gint i;
d1ed09
+
d1ed09
+  if (!key->desktop_overrides)
d1ed09
+    return NULL;
d1ed09
+
d1ed09
+  if (g_once_init_enter (&current_desktops))
d1ed09
+    {
d1ed09
+      const gchar *xdg_current_desktop = g_getenv ("XDG_CURRENT_DESKTOP");
d1ed09
+      gchar **tmp;
d1ed09
+
d1ed09
+      if (xdg_current_desktop != NULL && xdg_current_desktop[0] != '\0')
d1ed09
+        tmp = g_strsplit (xdg_current_desktop, G_SEARCHPATH_SEPARATOR_S, -1);
d1ed09
+      else
d1ed09
+        tmp = g_new0 (gchar *, 0 + 1);
d1ed09
+
d1ed09
+      g_once_init_leave (&current_desktops, (const gchar **) tmp);
d1ed09
+    }
d1ed09
+
d1ed09
+  for (i = 0; value == NULL && current_desktops[i] != NULL; i++)
d1ed09
+    value = g_variant_lookup_value (key->desktop_overrides, current_desktops[i], NULL);
d1ed09
+
d1ed09
+  return value;
d1ed09
+}
d1ed09
+
d1ed09
 gint
d1ed09
 g_settings_schema_key_to_enum (GSettingsSchemaKey *key,
d1ed09
                                GVariant           *value)
d1ed09
@@ -1698,6 +1736,9 @@ g_settings_schema_key_get_default_value (GSettingsSchemaKey *key)
d1ed09
 
d1ed09
   value = g_settings_schema_key_get_translated_default (key);
d1ed09
 
d1ed09
+  if (!value)
d1ed09
+    value = g_settings_schema_key_get_per_desktop_default (key);
d1ed09
+
d1ed09
   if (!value)
d1ed09
     value = g_variant_ref (key->default_value);
d1ed09
 
d1ed09
-- 
d1ed09
2.21.0
d1ed09
d1ed09
d1ed09
From 3710e830de015829c086c69181a8703645d577ec Mon Sep 17 00:00:00 2001
d1ed09
From: Allison Lortie <desrt@desrt.ca>
d1ed09
Date: Wed, 2 Aug 2017 11:10:18 +0100
d1ed09
Subject: [PATCH 3/4] glib-compile-schemas: Handle per-desktop overrides
d1ed09
d1ed09
Add a new syntax to override files: if the group name has a ':' in it,
d1ed09
it indicates that we want to override the default values of keys for
d1ed09
only one desktop. For example:
d1ed09
d1ed09
[org.gnome.desktop.interface:Unity]
d1ed09
font-name='Ubuntu 12'
d1ed09
d1ed09
Will override the settings, only if "Unity" is found in
d1ed09
XDG_CURRENT_DESKTOP. Multiple per-desktop overrides can be specified
d1ed09
for a given key: the one which comes first in XDG_CURRENT_DESKTOP will
d1ed09
be used.
d1ed09
d1ed09
https://bugzilla.gnome.org/show_bug.cgi?id=746592
d1ed09
---
d1ed09
 gio/glib-compile-schemas.c | 83 ++++++++++++++++++++++++++++++++++----
d1ed09
 1 file changed, 75 insertions(+), 8 deletions(-)
d1ed09
d1ed09
diff --git a/gio/glib-compile-schemas.c b/gio/glib-compile-schemas.c
d1ed09
index 2dc8c7171..59fb68ee7 100644
d1ed09
--- a/gio/glib-compile-schemas.c
d1ed09
+++ b/gio/glib-compile-schemas.c
d1ed09
@@ -179,6 +179,8 @@ typedef struct
d1ed09
   GString      *unparsed_default_value;
d1ed09
   GVariant     *default_value;
d1ed09
 
d1ed09
+  GVariantDict *desktop_overrides;
d1ed09
+
d1ed09
   GString      *strinfo;
d1ed09
   gboolean      is_enum;
d1ed09
   gboolean      is_flags;
d1ed09
@@ -731,6 +733,11 @@ key_state_serialise (KeyState *state)
d1ed09
             g_variant_builder_add (&builder, "(y(**))", 'r',
d1ed09
                                    state->minimum, state->maximum);
d1ed09
 
d1ed09
+          /* per-desktop overrides */
d1ed09
+          if (state->desktop_overrides)
d1ed09
+            g_variant_builder_add (&builder, "(y@a{sv})", 'd',
d1ed09
+                                   g_variant_dict_end (state->desktop_overrides));
d1ed09
+
d1ed09
           state->serialised = g_variant_builder_end (&builder);
d1ed09
         }
d1ed09
 
d1ed09
@@ -768,6 +775,9 @@ key_state_free (gpointer data)
d1ed09
   if (state->serialised)
d1ed09
     g_variant_unref (state->serialised);
d1ed09
 
d1ed09
+  if (state->desktop_overrides)
d1ed09
+    g_variant_dict_unref (state->desktop_overrides);
d1ed09
+
d1ed09
   g_slice_free (KeyState, state);
d1ed09
 }
d1ed09
 
d1ed09
@@ -1878,6 +1888,8 @@ set_overrides (GHashTable  *schema_table,
d1ed09
       gchar **groups;
d1ed09
       gint i;
d1ed09
 
d1ed09
+      g_debug ("Processing override file '%s'", filename);
d1ed09
+
d1ed09
       key_file = g_key_file_new ();
d1ed09
       if (!g_key_file_load_from_file (key_file, filename, 0, &error))
d1ed09
         {
d1ed09
@@ -1900,18 +1912,31 @@ set_overrides (GHashTable  *schema_table,
d1ed09
       for (i = 0; groups[i]; i++)
d1ed09
         {
d1ed09
           const gchar *group = groups[i];
d1ed09
+          const gchar *schema_name;
d1ed09
+          const gchar *desktop_id;
d1ed09
           SchemaState *schema;
d1ed09
+          gchar **pieces;
d1ed09
           gchar **keys;
d1ed09
           gint j;
d1ed09
 
d1ed09
-          schema = g_hash_table_lookup (schema_table, group);
d1ed09
+          pieces = g_strsplit (group, ":", 2);
d1ed09
+          schema_name = pieces[0];
d1ed09
+          desktop_id = pieces[1];
d1ed09
+
d1ed09
+          g_debug ("Processing group '%s' (schema '%s', %s)",
d1ed09
+                   group, schema_name, desktop_id ? desktop_id : "all desktops");
d1ed09
+
d1ed09
+          schema = g_hash_table_lookup (schema_table, schema_name);
d1ed09
 
d1ed09
           if (schema == NULL)
d1ed09
-            /* Having the schema not be installed is expected to be a
d1ed09
-             * common case.  Don't even emit an error message about
d1ed09
-             * that.
d1ed09
-             */
d1ed09
-            continue;
d1ed09
+            {
d1ed09
+              /* Having the schema not be installed is expected to be a
d1ed09
+               * common case.  Don't even emit an error message about
d1ed09
+               * that.
d1ed09
+               */
d1ed09
+              g_strfreev (pieces);
d1ed09
+              continue;
d1ed09
+            }
d1ed09
 
d1ed09
           keys = g_key_file_get_keys (key_file, group, NULL, NULL);
d1ed09
           g_assert (keys != NULL);
d1ed09
@@ -1939,6 +1964,32 @@ set_overrides (GHashTable  *schema_table,
d1ed09
 
d1ed09
                   fprintf (stderr, _(" and --strict was specified; exiting.\n"));
d1ed09
                   g_key_file_free (key_file);
d1ed09
+                  g_strfreev (pieces);
d1ed09
+                  g_strfreev (groups);
d1ed09
+                  g_strfreev (keys);
d1ed09
+
d1ed09
+                  return FALSE;
d1ed09
+                }
d1ed09
+
d1ed09
+              if (desktop_id != NULL && state->l10n)
d1ed09
+                {
d1ed09
+                  /* Let's avoid the n*m case of per-desktop localised
d1ed09
+                   * default values, and just forbid it.
d1ed09
+                   */
d1ed09
+                  fprintf (stderr,
d1ed09
+                           _("cannot provide per-desktop overrides for localised "
d1ed09
+                             "key '%s' in schema '%s' (override file '%s')"),
d1ed09
+                           key, group, filename);
d1ed09
+
d1ed09
+                  if (!strict)
d1ed09
+                    {
d1ed09
+                      fprintf (stderr, _("; ignoring override for this key.\n"));
d1ed09
+                      continue;
d1ed09
+                    }
d1ed09
+
d1ed09
+                  fprintf (stderr, _(" and --strict was specified; exiting.\n"));
d1ed09
+                  g_key_file_free (key_file);
d1ed09
+                  g_strfreev (pieces);
d1ed09
                   g_strfreev (groups);
d1ed09
                   g_strfreev (keys);
d1ed09
 
d1ed09
@@ -1969,6 +2020,7 @@ set_overrides (GHashTable  *schema_table,
d1ed09
 
d1ed09
                   fprintf (stderr, _("--strict was specified; exiting.\n"));
d1ed09
                   g_key_file_free (key_file);
d1ed09
+                  g_strfreev (pieces);
d1ed09
                   g_strfreev (groups);
d1ed09
                   g_strfreev (keys);
d1ed09
 
d1ed09
@@ -1997,6 +2049,7 @@ set_overrides (GHashTable  *schema_table,
d1ed09
 
d1ed09
                       fprintf (stderr, _(" and --strict was specified; exiting.\n"));
d1ed09
                       g_key_file_free (key_file);
d1ed09
+                      g_strfreev (pieces);
d1ed09
                       g_strfreev (groups);
d1ed09
                       g_strfreev (keys);
d1ed09
 
d1ed09
@@ -2025,6 +2078,7 @@ set_overrides (GHashTable  *schema_table,
d1ed09
 
d1ed09
                       fprintf (stderr, _(" and --strict was specified; exiting.\n"));
d1ed09
                       g_key_file_free (key_file);
d1ed09
+                      g_strfreev (pieces);
d1ed09
                       g_strfreev (groups);
d1ed09
                       g_strfreev (keys);
d1ed09
 
d1ed09
@@ -2032,11 +2086,24 @@ set_overrides (GHashTable  *schema_table,
d1ed09
                     }
d1ed09
                 }
d1ed09
 
d1ed09
-              g_variant_unref (state->default_value);
d1ed09
-              state->default_value = value;
d1ed09
+              if (desktop_id != NULL)
d1ed09
+                {
d1ed09
+                  if (state->desktop_overrides == NULL)
d1ed09
+                    state->desktop_overrides = g_variant_dict_new (NULL);
d1ed09
+
d1ed09
+                  g_variant_dict_insert_value (state->desktop_overrides, desktop_id, value);
d1ed09
+                  g_variant_unref (value);
d1ed09
+                }
d1ed09
+              else
d1ed09
+                {
d1ed09
+                  g_variant_unref (state->default_value);
d1ed09
+                  state->default_value = value;
d1ed09
+                }
d1ed09
+
d1ed09
               g_free (string);
d1ed09
             }
d1ed09
 
d1ed09
+          g_strfreev (pieces);
d1ed09
           g_strfreev (keys);
d1ed09
         }
d1ed09
 
d1ed09
-- 
d1ed09
2.21.0
d1ed09
d1ed09
d1ed09
From 2ca9218fb46f32fa02bed43c6e60243c8c5d656f Mon Sep 17 00:00:00 2001
d1ed09
From: =?UTF-8?q?Alberts=20Muktup=C4=81vels?= <alberts.muktupavels@gmail.com>
d1ed09
Date: Tue, 19 Jun 2018 23:39:24 +0300
d1ed09
Subject: [PATCH 4/4] Add a test for per-desktop overrides
d1ed09
d1ed09
---
d1ed09
 gio/glib-compile-schemas.c                   |   1 +
d1ed09
 gio/tests/Makefile.am                        |   2 +
d1ed09
 gio/tests/gsettings.c                        | 106 ++++++++++++++++++-
d1ed09
 gio/tests/org.gtk.test.gschema.override.orig |   2 +
d1ed09
 gio/tests/org.gtk.test.gschema.xml.orig      |   6 ++
d1ed09
 5 files changed, 116 insertions(+), 1 deletion(-)
d1ed09
 create mode 100644 gio/tests/org.gtk.test.gschema.override.orig
d1ed09
d1ed09
diff --git a/gio/glib-compile-schemas.c b/gio/glib-compile-schemas.c
d1ed09
index 59fb68ee7..00dd64146 100644
d1ed09
--- a/gio/glib-compile-schemas.c
d1ed09
+++ b/gio/glib-compile-schemas.c
d1ed09
@@ -2139,6 +2139,7 @@ main (int argc, char **argv)
d1ed09
 
d1ed09
     /* These options are only for use in the gschema-compile tests */
d1ed09
     { "schema-file", 0, G_OPTION_FLAG_HIDDEN, G_OPTION_ARG_FILENAME_ARRAY, &schema_files, NULL, NULL },
d1ed09
+    { "override-file", 0, G_OPTION_FLAG_HIDDEN, G_OPTION_ARG_FILENAME_ARRAY, &override_files, NULL, NULL },
d1ed09
     { NULL }
d1ed09
   };
d1ed09
 
d1ed09
diff --git a/gio/tests/Makefile.am b/gio/tests/Makefile.am
d1ed09
index 49a19bf4a..b41317ad9 100644
d1ed09
--- a/gio/tests/Makefile.am
d1ed09
+++ b/gio/tests/Makefile.am
d1ed09
@@ -367,12 +367,14 @@ test.mo: de.po
d1ed09
 EXTRA_DIST += de.po
d1ed09
 dist_uninstalled_test_data += \
d1ed09
 	org.gtk.test.gschema.xml.orig		\
d1ed09
+	org.gtk.test.gschema.override.orig	\
d1ed09
 	org.gtk.schemasourcecheck.gschema.xml	\
d1ed09
 	testenum.h				\
d1ed09
 	enums.xml.template
d1ed09
 # Generated while running the testcase itself...
d1ed09
 CLEANFILES += \
d1ed09
 	org.gtk.test.gschema.xml	\
d1ed09
+	org.gtk.test.gschema.override	\
d1ed09
 	org.gtk.test.enums.xml		\
d1ed09
 	gsettings.store			\
d1ed09
 	gschemas.compiled		\
d1ed09
diff --git a/gio/tests/gsettings.c b/gio/tests/gsettings.c
d1ed09
index 2be4122fe..acdeead4c 100644
d1ed09
--- a/gio/tests/gsettings.c
d1ed09
+++ b/gio/tests/gsettings.c
d1ed09
@@ -2192,6 +2192,7 @@ G_GNUC_END_IGNORE_DEPRECATIONS
d1ed09
                             "org.gtk.test.range.direct",
d1ed09
                             "org.gtk.test.mapped",
d1ed09
                             "org.gtk.test.descriptions",
d1ed09
+                            "org.gtk.test.per-desktop",
d1ed09
                             NULL));
d1ed09
 }
d1ed09
 
d1ed09
@@ -2583,6 +2584,100 @@ test_default_value (void)
d1ed09
   g_object_unref (settings);
d1ed09
 }
d1ed09
 
d1ed09
+static gboolean
d1ed09
+string_map_func (GVariant *value,
d1ed09
+                 gpointer *result,
d1ed09
+                 gpointer  user_data)
d1ed09
+{
d1ed09
+  const gchar *str;
d1ed09
+
d1ed09
+  str = g_variant_get_string (value, NULL);
d1ed09
+  *result = g_variant_new_string (str);
d1ed09
+
d1ed09
+  return TRUE;
d1ed09
+}
d1ed09
+
d1ed09
+/* Test that per-desktop values from org.gtk.test.gschema.override
d1ed09
+ * does not change default value if current desktop is not listed in
d1ed09
+ * $XDG_CURRENT_DESKTOP.
d1ed09
+ */
d1ed09
+static void
d1ed09
+test_per_desktop (void)
d1ed09
+{
d1ed09
+  GSettings *settings;
d1ed09
+  TestObject *obj;
d1ed09
+  gpointer p;
d1ed09
+  gchar *str;
d1ed09
+
d1ed09
+  settings = g_settings_new ("org.gtk.test.per-desktop");
d1ed09
+  obj = test_object_new ();
d1ed09
+
d1ed09
+  if (!g_test_subprocess ())
d1ed09
+    {
d1ed09
+      g_test_trap_subprocess ("/gsettings/per-desktop/subprocess", 0, 0);
d1ed09
+      g_test_trap_assert_passed ();
d1ed09
+    }
d1ed09
+
d1ed09
+  str = g_settings_get_string (settings, "desktop");
d1ed09
+  g_assert_cmpstr (str, ==, "GNOME");
d1ed09
+  g_free (str);
d1ed09
+
d1ed09
+  p = g_settings_get_mapped (settings, "desktop", string_map_func, NULL);
d1ed09
+
d1ed09
+  str = g_variant_dup_string (p, NULL);
d1ed09
+  g_assert_cmpstr (str, ==, "GNOME");
d1ed09
+  g_free (str);
d1ed09
+
d1ed09
+  g_variant_unref (p);
d1ed09
+
d1ed09
+  g_settings_bind (settings, "desktop", obj, "string", G_SETTINGS_BIND_DEFAULT);
d1ed09
+
d1ed09
+  g_object_get (obj, "string", &str, NULL);
d1ed09
+  g_assert_cmpstr (str, ==, "GNOME");
d1ed09
+  g_free (str);
d1ed09
+
d1ed09
+  g_object_unref (settings);
d1ed09
+  g_object_unref (obj);
d1ed09
+}
d1ed09
+
d1ed09
+/* Test that per-desktop values from org.gtk.test.gschema.override
d1ed09
+ * are successfully loaded based on the value of $XDG_CURRENT_DESKTOP.
d1ed09
+ */
d1ed09
+static void
d1ed09
+test_per_desktop_subprocess (void)
d1ed09
+{
d1ed09
+  GSettings *settings;
d1ed09
+  TestObject *obj;
d1ed09
+  gpointer p;
d1ed09
+  gchar *str;
d1ed09
+
d1ed09
+  g_setenv ("XDG_CURRENT_DESKTOP", "GNOME-Classic:GNOME", TRUE);
d1ed09
+
d1ed09
+  settings = g_settings_new ("org.gtk.test.per-desktop");
d1ed09
+  obj = test_object_new ();
d1ed09
+
d1ed09
+  str = g_settings_get_string (settings, "desktop");
d1ed09
+  g_assert_cmpstr (str, ==, "GNOME Classic");
d1ed09
+  g_free (str);
d1ed09
+
d1ed09
+  p = g_settings_get_mapped (settings, "desktop", string_map_func, NULL);
d1ed09
+
d1ed09
+  str = g_variant_dup_string (p, NULL);
d1ed09
+  g_assert_cmpstr (str, ==, "GNOME Classic");
d1ed09
+  g_free (str);
d1ed09
+
d1ed09
+  g_variant_unref (p);
d1ed09
+
d1ed09
+  g_settings_bind (settings, "desktop", obj, "string", G_SETTINGS_BIND_DEFAULT);
d1ed09
+
d1ed09
+  g_object_get (obj, "string", &str, NULL);
d1ed09
+  g_assert_cmpstr (str, ==, "GNOME Classic");
d1ed09
+  g_free (str);
d1ed09
+
d1ed09
+  g_object_unref (settings);
d1ed09
+  g_object_unref (obj);
d1ed09
+}
d1ed09
+
d1ed09
 static void
d1ed09
 test_extended_schema (void)
d1ed09
 {
d1ed09
@@ -2603,6 +2698,7 @@ int
d1ed09
 main (int argc, char *argv[])
d1ed09
 {
d1ed09
   gchar *schema_text;
d1ed09
+  gchar *override_text;
d1ed09
   gchar *enums;
d1ed09
   gint result;
d1ed09
 
d1ed09
@@ -2625,6 +2721,7 @@ main (int argc, char *argv[])
d1ed09
       g_setenv ("XDG_DATA_DIRS", ".", TRUE);
d1ed09
       g_setenv ("XDG_DATA_HOME", ".", TRUE);
d1ed09
       g_setenv ("GSETTINGS_SCHEMA_DIR", ".", TRUE);
d1ed09
+      g_setenv ("XDG_CURRENT_DESKTOP", "", TRUE);
d1ed09
 
d1ed09
       if (!backend_set)
d1ed09
         g_setenv ("GSETTINGS_BACKEND", "memory", TRUE);
d1ed09
@@ -2647,6 +2744,10 @@ main (int argc, char *argv[])
d1ed09
       g_assert (g_file_set_contents ("org.gtk.test.gschema.xml", schema_text, -1, NULL));
d1ed09
       g_free (schema_text);
d1ed09
 
d1ed09
+      g_assert (g_file_get_contents (SRCDIR "/org.gtk.test.gschema.override.orig", &override_text, NULL, NULL));
d1ed09
+      g_assert (g_file_set_contents ("org.gtk.test.gschema.override", override_text, -1, NULL));
d1ed09
+      g_free (override_text);
d1ed09
+
d1ed09
 /* Meson build defines this, autotools build does not */
d1ed09
 #ifndef GLIB_COMPILE_SCHEMAS
d1ed09
 #define GLIB_COMPILE_SCHEMAS "../glib-compile-schemas"
d1ed09
@@ -2655,7 +2756,8 @@ main (int argc, char *argv[])
d1ed09
       g_remove ("gschemas.compiled");
d1ed09
       g_assert (g_spawn_command_line_sync (GLIB_COMPILE_SCHEMAS " --targetdir=. "
d1ed09
                                            "--schema-file=org.gtk.test.enums.xml "
d1ed09
-                                           "--schema-file=org.gtk.test.gschema.xml",
d1ed09
+                                           "--schema-file=org.gtk.test.gschema.xml "
d1ed09
+                                           "--override-file=org.gtk.test.gschema.override",
d1ed09
                                            NULL, NULL, &result, NULL));
d1ed09
       g_assert (result == 0);
d1ed09
 
d1ed09
@@ -2736,6 +2838,8 @@ main (int argc, char *argv[])
d1ed09
   g_test_add_func ("/gsettings/read-descriptions", test_read_descriptions);
d1ed09
   g_test_add_func ("/gsettings/test-extended-schema", test_extended_schema);
d1ed09
   g_test_add_func ("/gsettings/default-value", test_default_value);
d1ed09
+  g_test_add_func ("/gsettings/per-desktop", test_per_desktop);
d1ed09
+  g_test_add_func ("/gsettings/per-desktop/subprocess", test_per_desktop_subprocess);
d1ed09
 
d1ed09
   result = g_test_run ();
d1ed09
 
d1ed09
diff --git a/gio/tests/org.gtk.test.gschema.override.orig b/gio/tests/org.gtk.test.gschema.override.orig
d1ed09
new file mode 100644
d1ed09
index 000000000..6694baace
d1ed09
--- /dev/null
d1ed09
+++ b/gio/tests/org.gtk.test.gschema.override.orig
d1ed09
@@ -0,0 +1,2 @@
d1ed09
+[org.gtk.test.per-desktop:GNOME-Classic]
d1ed09
+desktop = "GNOME Classic"
d1ed09
diff --git a/gio/tests/org.gtk.test.gschema.xml.orig b/gio/tests/org.gtk.test.gschema.xml.orig
d1ed09
index c07558335..fbcdce683 100644
d1ed09
--- a/gio/tests/org.gtk.test.gschema.xml.orig
d1ed09
+++ b/gio/tests/org.gtk.test.gschema.xml.orig
d1ed09
@@ -209,4 +209,10 @@
d1ed09
     </key>
d1ed09
   </schema>
d1ed09
 
d1ed09
+  <schema id="org.gtk.test.per-desktop" path="/tests/per-desktop/">
d1ed09
+    <key name="desktop" type="s">
d1ed09
+      <default>"GNOME"</default>
d1ed09
+    </key>
d1ed09
+  </schema>
d1ed09
+
d1ed09
 </schemalist>
d1ed09
-- 
d1ed09
2.21.0
d1ed09