+ GDelayedSettingsBackend *delayed = G_DELAYED_SETTINGS_BACKEND (target);
+ gboolean last_one = FALSE;
+ gsize n_keys;
+
+ g_mutex_lock (&delayed->priv->lock);
+
+ n_keys = g_tree_nnodes (delayed->priv->delayed);
+
+ if (n_keys > 0)
+ {
+ CheckPrefixState state = { path, g_new (const gchar *, n_keys) };
+ gsize i;
+
+ /* collect a list of possibly-affected keys (ie: matching the path) */
+ g_tree_foreach (delayed->priv->delayed, check_prefix, &state);
+
+ /* drop the keys that have been affected.
+ *
+ * don't drop 'reset' keys (see above) */
+ for (i = 0; i < state.index; i++)
+ if (g_tree_lookup (delayed->priv->delayed, state.keys[i]) != NULL &&
+ !g_settings_backend_get_writable (delayed->priv->backend,
+ state.keys[i]))
+ g_tree_remove (delayed->priv->delayed, state.keys[i]);
+
+ g_free (state.keys);
+
+ last_one = g_tree_nnodes (delayed->priv->delayed) == 0;
+ }
+
+ g_mutex_unlock (&delayed->priv->lock);
+
+ if (last_one)
+ g_delayed_settings_backend_notify_unapplied (delayed);