summaryrefslogtreecommitdiff
path: root/engine
diff options
context:
space:
mode:
authorRyan Lortie <desrt@desrt.ca>2013-10-27 11:09:39 -0700
committerRyan Lortie <desrt@desrt.ca>2013-10-28 10:24:20 -0700
commit863fa5c1ee630a2ba3988896a957b922faceee87 (patch)
treef4d61a9bfb88ccc909029f881917604400fa02e7 /engine
parentaf4cab4ae533d21e8a02b6041c43e928bc74f96e (diff)
downloaddconf-863fa5c1ee630a2ba3988896a957b922faceee87.tar.gz
GSettings: implement _read_user_value()
Implement g_settings_backend_read_user_value() in DConfSettingsBackend. This will help us support g_settings_get_user_value() properly. We add a new engine API to support this as well. It takes a read_through queue, even though we don't bother using that from DConfSettingsBackend. https://bugzilla.gnome.org/show_bug.cgi?id=668233
Diffstat (limited to 'engine')
-rw-r--r--engine/dconf-engine.c45
-rw-r--r--engine/dconf-engine.h5
2 files changed, 50 insertions, 0 deletions
diff --git a/engine/dconf-engine.c b/engine/dconf-engine.c
index 7beff95..b82d842 100644
--- a/engine/dconf-engine.c
+++ b/engine/dconf-engine.c
@@ -546,6 +546,51 @@ dconf_engine_read (DConfEngine *engine,
return value;
}
+GVariant *
+dconf_engine_read_user_value (DConfEngine *engine,
+ GQueue *read_through,
+ const gchar *key)
+{
+ gboolean found_key = FALSE;
+ GVariant *value = NULL;
+
+ /* This is a simplified version of the above. We get to ignore locks
+ * and system-level settings.
+ *
+ * NB: we may find "NULL", which is why we have a separate variable.
+ */
+
+ /* Ignore the queues if we don't have a writable database */
+ if (engine->n_sources == 0 || !engine->sources[0]->writable)
+ return NULL;
+
+ /* First check read-through */
+ if (read_through)
+ found_key = dconf_engine_find_key_in_queue (read_through, key, &value);
+
+ /* Next pending/in-flight */
+ if (!found_key)
+ {
+ dconf_engine_lock_queues (engine);
+
+ /* Check the pending queue first because those were submitted
+ * more recently.
+ */
+ found_key = dconf_engine_find_key_in_queue (&engine->pending, key, &value) ||
+ dconf_engine_find_key_in_queue (&engine->in_flight, key, &value);
+
+ dconf_engine_unlock_queues (engine);
+ }
+
+ /* Finally, check the user database */
+ if (!found_key && engine->sources[0]->values)
+ value = gvdb_table_get_value (engine->sources[0]->values, key);
+
+ dconf_engine_release_sources (engine);
+
+ return value;
+}
+
gchar **
dconf_engine_list (DConfEngine *engine,
const gchar *dir,
diff --git a/engine/dconf-engine.h b/engine/dconf-engine.h
index a52e971..a7677d3 100644
--- a/engine/dconf-engine.h
+++ b/engine/dconf-engine.h
@@ -125,6 +125,11 @@ GVariant * dconf_engine_read (DConfEn
const gchar *key);
G_GNUC_INTERNAL
+GVariant * dconf_engine_read_user_value (DConfEngine *engine,
+ GQueue *read_through,
+ const gchar *key);
+
+G_GNUC_INTERNAL
gchar ** dconf_engine_list (DConfEngine *engine,
const gchar *dir,
gint *length);