[glib/wip/nacho/registry-writable: 1/3] registrybackend: handle readability of the keys
- From: Ignacio Casal Quinteiro <icq src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [glib/wip/nacho/registry-writable: 1/3] registrybackend: handle readability of the keys
- Date: Thu, 4 Feb 2016 09:43:57 +0000 (UTC)
commit 653084c685e63bdf1d3baba725ab711fabf32f43
Author: Ignacio Casal Quinteiro <icq gnome org>
Date: Tue Feb 2 13:12:22 2016 +0100
registrybackend: handle readability of the keys
If a key is removed or it cannot be read anymore we should
notify the backend about it so it fallbacks to the default
value.
gio/gregistrysettingsbackend.c | 46 +++++++++++++++++++++++++++++++++++++++-
1 files changed, 45 insertions(+), 1 deletions(-)
---
diff --git a/gio/gregistrysettingsbackend.c b/gio/gregistrysettingsbackend.c
index 2b57a83..b9d838e 100644
--- a/gio/gregistrysettingsbackend.c
+++ b/gio/gregistrysettingsbackend.c
@@ -1223,6 +1223,41 @@ typedef struct
GPtrArray *items; /* each item is a subkey below prefix that has changed. */
} RegistryEvent;
+typedef struct
+{
+ RegistryEvent *event;
+ gchar *current_key_name;
+} DeletedItemData;
+
+static void
+mark_item_keys_as_changed (GNode *node,
+ gpointer data)
+{
+ RegistryCacheItem *item = node->data;
+ DeletedItemData *item_data = data;
+
+ if (item_data->current_key_name == NULL)
+ item_data->current_key_name = g_strdup (item->name);
+ else
+ {
+ gchar *name;
+
+ name = g_build_path ("/", item_data->current_key_name, item->name, NULL);
+ g_free (item_data->current_key_name);
+ item_data->current_key_name = name;
+ }
+
+ /* Iterate until we find an item that is a value */
+ if (item->value.type == REG_NONE)
+ g_node_children_foreach (node, G_TRAVERSE_ALL,
+ mark_item_keys_as_changed, data);
+ else
+ {
+ g_ptr_array_add (item_data->event->items, item_data->current_key_name);
+ g_slice_free (DeletedItemData, item_data);
+ }
+}
+
static void
registry_cache_remove_deleted (GNode *node,
gpointer data)
@@ -1231,7 +1266,16 @@ registry_cache_remove_deleted (GNode *node,
RegistryEvent *event = data;
if (!item->readable)
- registry_cache_destroy_tree (node, event->self->watch);
+ {
+ DeletedItemData *item_data;
+
+ item_data = g_slice_new (DeletedItemData);
+ item_data->event = event;
+ item_data->current_key_name = NULL;
+
+ mark_item_keys_as_changed (node, item_data);
+ registry_cache_destroy_tree (node, event->self->watch);
+ }
}
/* Update cache from registry, and optionally report on the changes.
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]