diff options
author | Ryan Lortie <desrt@desrt.ca> | 2013-02-04 12:37:49 +0100 |
---|---|---|
committer | Ryan Lortie <desrt@desrt.ca> | 2013-02-11 13:36:09 -0500 |
commit | 4c516a76f55d75ecfa1b985adb1905cac945f3fe (patch) | |
tree | 19d0d22ce73ee8d5c19f2c39135b537ab17f2266 | |
parent | 9d0b53f86371a459615e9872a5b835b917a568ae (diff) | |
download | dconf-4c516a76f55d75ecfa1b985adb1905cac945f3fe.tar.gz |
engine, gsettings: prevent empty changesets
We should not send empty changesets to the service so just ignore them
when we get them.
This now means that an empty 'dconf load' will not send any D-Bus
messages (and will not cause D-Bus activation).
-rw-r--r-- | client/dconf-client.c | 3 | ||||
-rw-r--r-- | engine/dconf-engine.c | 11 | ||||
-rw-r--r-- | gsettings/dconfsettingsbackend.c | 6 |
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); |