summaryrefslogtreecommitdiff
path: root/gsettings-backend
diff options
context:
space:
mode:
authorAli Abdallah <ali@xfce.org>2018-07-14 00:30:58 +0200
committerAli Abdallah <ali@xfce.org>2018-07-14 00:30:58 +0200
commit6923a97ed7354cc5f0536d2e6f8c09d8c3add2f8 (patch)
tree842afdba1e61f59d638786c15da18c95257c9a68 /gsettings-backend
parentff8de61d236039fa2619f1ec8997965db338bbc9 (diff)
downloadxfconf-6923a97ed7354cc5f0536d2e6f8c09d8c3add2f8.tar.gz
Implement write_tree GSettings interface method.
Diffstat (limited to 'gsettings-backend')
-rw-r--r--gsettings-backend/xfconf-gsettings-backend.c57
1 files changed, 50 insertions, 7 deletions
diff --git a/gsettings-backend/xfconf-gsettings-backend.c b/gsettings-backend/xfconf-gsettings-backend.c
index 1218c79..ff7d664 100644
--- a/gsettings-backend/xfconf-gsettings-backend.c
+++ b/gsettings-backend/xfconf-gsettings-backend.c
@@ -37,6 +37,8 @@ struct _XfconfGsettingsBackend
GHashTable *changed_prop;
GHashTable *subscribed_prop;
+
+ gint nhandled_tree_node;
};
G_DEFINE_TYPE (XfconfGsettingsBackend, xfconf_gsettings_backend, G_TYPE_SETTINGS_BACKEND);
@@ -142,10 +144,11 @@ xfconf_gsettings_backend_get_writable (GSettingsBackend *backend,
}
static gboolean
-xfconf_gsettings_backend_write (GSettingsBackend *backend,
- const gchar *key,
- GVariant *variant,
- gpointer origin_tag)
+xfconf_gsettings_backend_write_full (GSettingsBackend *backend,
+ const gchar *key,
+ GVariant *variant,
+ gboolean add_sig_changed,
+ gpointer origin_tag)
{
XfconfGsettingsBackend *self;
GValue *value;
@@ -156,10 +159,11 @@ xfconf_gsettings_backend_write (GSettingsBackend *backend,
value = xfconf_gvariant_to_gvalue (variant);
if (value) {
- g_hash_table_replace (self->changed_prop, g_strdup(key), origin_tag);
+ if (add_sig_changed)
+ g_hash_table_replace (self->changed_prop, g_strdup(key), origin_tag);
ret_val = xfconf_channel_set_property (self->channel, key, value);
- if (ret_val == FALSE)
+ if (ret_val == FALSE && add_sig_changed)
g_hash_table_remove (self->changed_prop, key);
g_value_unset (value);
@@ -169,11 +173,48 @@ xfconf_gsettings_backend_write (GSettingsBackend *backend,
}
static gboolean
+xfconf_gsettings_backend_write (GSettingsBackend *backend,
+ const gchar *key,
+ GVariant *variant,
+ gpointer origin_tag)
+{
+ return xfconf_gsettings_backend_write_full (backend, key, variant, TRUE, origin_tag);
+}
+
+static gboolean
+xfconf_gsettings_backend_tree_traverse (const gchar *key,
+ GVariant *variant,
+ XfconfGsettingsBackend *self)
+{
+
+ if (!xfconf_gsettings_backend_write_full ((GSettingsBackend*)self, key, variant, FALSE, NULL))
+ return TRUE;
+
+ self->nhandled_tree_node++;
+
+ return FALSE;
+}
+
+static gboolean
xfconf_gsettings_backend_write_tree (GSettingsBackend *backend,
GTree *tree,
gpointer origin_tag)
{
- return TRUE;
+ XfconfGsettingsBackend *self;
+
+ self = XFCONF_GSETTINGS_BACKEND(backend);
+
+ self->nhandled_tree_node = 0;
+
+ g_tree_foreach (tree, (GTraverseFunc) xfconf_gsettings_backend_tree_traverse, self);
+
+ /* If we manage to handle all Tree nodes, send the changed signal */
+ if (self->nhandled_tree_node == g_tree_nnodes (tree)) {
+ g_settings_backend_changed_tree (backend, tree, origin_tag);
+ return TRUE;
+ }
+
+ return FALSE;
}
static void
@@ -227,6 +268,8 @@ xfconf_gsettings_backend_init (XfconfGsettingsBackend *self)
{
const gchar *prg_name;
+ self->nhandled_tree_node = 0;
+
prg_name = g_get_prgname();
self->channel = xfconf_channel_new (prg_name);