summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--client/dconf-client.c3
-rw-r--r--engine/dconf-engine.c11
-rw-r--r--gsettings/dconfsettingsbackend.c6
3 files changed, 17 insertions, 3 deletions
diff --git a/client/dconf-client.c b/client/dconf-client.c
index c7c2e9e..534132f 100644
--- a/client/dconf-client.c
+++ b/client/dconf-client.c
@@ -441,7 +441,8 @@ dconf_client_change_fast (DConfClient *client,
*
* If @tag is non-%NULL then it is set to the unique tag associated with
* this change. This is the same tag that will appear in the following
- * change signal.
+ * change signal. If @changeset makes no changes then @tag may be
+ * non-unique (eg: the empty string may be used for empty changesets).
*
* Returns: %TRUE on success, else %FALSE with @error set
**/
diff --git a/engine/dconf-engine.c b/engine/dconf-engine.c
index 45e1d66..446619e 100644
--- a/engine/dconf-engine.c
+++ b/engine/dconf-engine.c
@@ -1029,6 +1029,9 @@ dconf_engine_change_fast (DConfEngine *engine,
{
GList *node;
+ if (dconf_changeset_is_empty (changeset))
+ return TRUE;
+
if (!dconf_engine_changeset_changes_only_writable_keys (engine, changeset, error))
return FALSE;
@@ -1091,6 +1094,14 @@ dconf_engine_change_sync (DConfEngine *engine,
{
GVariant *reply;
+ if (dconf_changeset_is_empty (changeset))
+ {
+ if (tag)
+ *tag = g_strdup ("");
+
+ return TRUE;
+ }
+
if (!dconf_engine_changeset_changes_only_writable_keys (engine, changeset, error))
return FALSE;
diff --git a/gsettings/dconfsettingsbackend.c b/gsettings/dconfsettingsbackend.c
index c8273f9..53f701e 100644
--- a/gsettings/dconfsettingsbackend.c
+++ b/gsettings/dconfsettingsbackend.c
@@ -101,9 +101,11 @@ dconf_settings_backend_write_tree (GSettingsBackend *backend,
DConfChangeset *change;
gboolean success;
- change= dconf_changeset_new ();
- g_tree_foreach (tree, dconf_settings_backend_add_to_changeset, change);
+ if (g_tree_nnodes (tree) == 0)
+ return TRUE;
+ change = dconf_changeset_new ();
+ g_tree_foreach (tree, dconf_settings_backend_add_to_changeset, change);
success = dconf_engine_change_fast (dcsb->engine, change, origin_tag, NULL);
dconf_changeset_unref (change);